lvcs.toml
The lvcs.toml sections the daemon reads. Every section is a table whose missing keys keep their defaults, so an absent file or section is the protocol defaults. lvcs.toml is a protected path (DEFAULT_PROTECTED), so a change to it is not materialized until approved, and no participant changes the [limits] every signer is metered by alone.
[coord]
lvcs.toml [coord].
wait_ms is the wait window, WAIT_WINDOW_MS by default; the daemon's loader caps it at WAIT_WINDOW_MAX_MS, so 0 to that bound is accepted, and the shell sends it to the coord actor as CoordinationEvents::Configure.
| Key | Type | Meaning |
|---|---|---|
wait_ms | integer | The wait window, in milliseconds. |
[limits]
The limits in force.
They are the limit constants in docs/generated/vocabulary.md by default (Limits::DEFAULT), each replaced by its key in protected lvcs.toml [limits] (the daemon's LvcsToml; a missing key keeps its default), so a participant can't change them by editing the file. The field names are the [limits] keys (the constants' names in lower case). They are the defaults for every signer, the owner included: the shell gives each take its Rate from them (Limits::sign_rate, Limits::gossip_rate), each per-second rate and the signing burst replaced by the signer's grant terms where they name one, and the gossip actor sizes its memory and tolerance by gossip_burst. A change quota is never a limit: a grant's terms carry it.
| Key | Type | Meaning |
|---|---|---|
participant_sign_per_sec | integer | PARTICIPANT_SIGN_PER_SEC in force. |
participant_sign_burst | integer | PARTICIPANT_SIGN_BURST in force. |
participant_gossip_per_sec | integer | PARTICIPANT_GOSSIP_PER_SEC in force. |
gossip_burst | integer | GOSSIP_BURST in force. |
[secrets]
lvcs.toml [secrets], part of the daemon's LvcsToml: exempt lists paths the scan skips (tests/fixtures/**), and never_sync paths never read into documents beyond DEFAULT_NEVER_SYNC and .gitignore, both gitignore syntax relative to the tree's root. A missing key is empty.
| Key | Type | Meaning |
|---|---|---|
exempt | array of string | The paths the secret scan skips, in gitignore syntax. |
never_sync | array of string | The paths never read into documents, in gitignore syntax. |
[telemetry]
lvcs.toml [telemetry]: subtrees, the directory prefixes the subtree attribute may name (at most SUBTREE_CAP), and ws_names, the workspace names the ws_name attribute may name (at most WS_NAME_CAP); entries past a cap are ignored, so both attributes stay bounded whatever the file says.
| Key | Type | Meaning |
|---|---|---|
subtrees | array of string | The directory prefixes the subtree attribute may name. |
ws_names | array of string | The workspace names the ws_name attribute may name. |
[[actions]]
One [[actions]] entry of lvcs.toml as written.
name is [a-z0-9._-]+, unique in the file, and names the channel the action moves. An action whose on is not change is gated: it takes only frontiers every one of its after channels already holds. on is its trigger: change (the default: it runs on every merge into main and when main goes quiet, and moves its channel at each frontier it passes with quorum); { channel = "<name>" } (a gated action: it runs when that channel, any action's or a [channels] combination, moves to a new frontier, against that frontier); or manual (a gated action that runs only on a run request of its own channel, lvcs run). after is one channel or a list of them, each an action's channel or a combination: for a channel trigger, that channel (the default) or ones upstream of it along after links and combination members; for a manual action, the change set (every change action's channel but the generator's, the default, written out). A trigger or after naming no known channel, and triggers, after links, and combination members that form a cycle, are refused. paths and uses are gitignore-syntax patterns (a check's were); paths may be left out only by the generator. run is the argument list of the action's one step (no shell); steps lists its steps instead, and exactly one of the two is given. env sets variables for every step, each value a template (${{ secrets.<NAME> }} in a gated action naming one of its secrets). toolchain names values of the bounded toolchain vocabulary the action needs, and a node step adds node. writes names the derived files a change action generates: at most one action has it, and with no paths its inputs are every synced file that isn't derived. secrets names the credential variables a run copies from its runner's environment, never their values; only a gated action has them, since any merged code runs in a change action's sandbox (secret_in_change, refused at parse and at approve). quorum raises the attestations or outcomes the action needs above QUORUM_DEFAULT, and a gated action's above QUORUM_PROTECTED. timeout_secs can only lower the class bound (CHECK_TIMEOUT_SECS for a change action, GATED_TIMEOUT_SECS for a gated action). Any other key is refused at parse, and so is a list map refuses.
| Key | Type | Meaning |
|---|---|---|
name | string | The action's name. |
on | On | What runs it; change by default. |
after | After | The channels a gated action's frontier must already be held by; the trigger channel, or the change set for a manual action, by default. |
paths | array of string | The paths it covers, in gitignore syntax. |
uses | array of string | The further paths it reads, in gitignore syntax; empty by default. |
run | array of string | Its one step's argument list, when steps is not given. |
steps | array of StepEntry | Its steps, when run is not given. |
env | table of string | The variables every step runs with, each value a template. |
toolchain | array of string | The toolchains it needs, values of the toolchain vocabulary. |
writes | array of string | The derived paths it generates, in gitignore syntax; empty by default. |
secrets | array of string | The credential variable names a gated action's run receives; empty by default. |
quorum | integer | The attestations or outcomes it needs, when above its floor. |
timeout_secs | integer | Its wall clock and CPU limit, when below its class bound. |
actions.on values
An [[actions]] entry's on: "change", "manual", or { channel = "<name>" }.
| Form | Meaning |
|---|---|
"change" | It runs on every merge into main and when main goes quiet. |
{ channel = string } | It runs when the named channel moves to a new frontier. |
"manual" | It runs on a run request of its own channel. |
actions.after values
An [[actions]] entry's after as written: one channel name, or a list of them. after = "tests" and after = ["tests"] map to one value.
| Form | Meaning |
|---|---|
string | One channel. |
array of string | A list of channels. |
[[actions.steps]]
One [[actions.steps]] entry: exactly one of run (an argument list, no shell), script (text run by shell: bash, sh, python, or a custom command line holding {0}; bash -e {0}, or sh -e {0} without bash, when unset), and node (a directory of the action's inputs holding main, and optionally pre and post, each run with node, its inputs given by with).
id names it for ${{ steps.<id>.outputs.<name> }}; if is success() (the default), always(), failure(), cancelled(), or a step output; env is set after the action's and earlier steps' GITHUB_ENV; working_directory is relative to /work; continue_on_error lets it fail without failing the run; and timeout_secs can only lower what is left of the action's limit. script, env, and with values are templates. Any other key is refused at parse.
| Key | Type | Meaning |
|---|---|---|
id | string | Its id. |
if | string | Its if. |
env | table of string | Its environment. |
working_directory | string | Its working directory, relative to /work. |
continue_on_error | boolean | Whether its failure leaves the run passing. |
timeout_secs | integer | Its own limit, in seconds. |
run | array of string | An argument list. |
script | string | A script's text. |
shell | string | The script's shell. |
node | string | A node program's directory. |
main | string | The node program, in node. |
pre | string | The node program run first, in node. |
post | string | The node program run last, in node. |
with | table of string | The node program's inputs. |
[channels]
[channels]: each combination's members, mapped with entries.
Type: table of array of string.
[runner]
[runner]: how long main's visible frontier must be unchanged before a runner serving change channels prepares a job for it.
quiet_ms can only raise QUIET_MS, up to QUIET_MAX_MS: a smaller value counts as QUIET_MS and a larger one as QUIET_MAX_MS. It defaults to QUIET_MS. Any other key is refused at parse.
| Key | Type | Meaning |
|---|---|---|
quiet_ms | integer | The quiet period asked for, in milliseconds. |
[git]
lvcs.toml [git], read only from main's lvcs.toml at its approved heads: branches maps a channel name, a change action's or a [channels] combination's, to the git ref it moves, a branch under refs/heads/. Empty by default, so no branch moves. import names <remote>/<branch> refs LVCS only reads, never moves, with no channel: the owner's daemon fetches each into refs/remotes/<remote>/<branch> and imports its new heads, as a mapped branch's. Empty by default.
| Key | Type | Meaning |
|---|---|---|
branches | table of string | The git branch each channel moves, by channel name. |
import | array of string | The <remote>/<branch> refs only read, never moved. |
[issues]
lvcs.toml [issues]: done, the channel or [channels] combination whose value fixes an issue when it holds all its linked work; with none, every change action's channel.
| Key | Type | Meaning |
|---|---|---|
done | string | The channel or combination issues close on. |
[workflows]
lvcs.toml's [workflows]: skip, the action names (<file stem>/<job id>, every cell of the job, or one cell's full name) left out deliberately; inputs, an action's narrowed inputs by name (**, every synced file, when unset); vars, the vars context; and repository, owner/name for github.repository. Any other key is refused at parse.
| Key | Type | Meaning |
|---|---|---|
skip | array of string | Action names left out. |
inputs | table of InputsEntry | Narrowed inputs, by action name. |
vars | table of string | The vars context. |
repository | string | github.repository. |
[workflows.inputs.<name>]
One [workflows] inputs."<name>" entry: gitignore-syntax patterns.
| Key | Type | Meaning |
|---|---|---|
paths | array of string | The paths the action covers. |
uses | array of string | The paths it reads besides. |