Docs

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.

KeyTypeMeaning
wait_msintegerThe 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.

KeyTypeMeaning
participant_sign_per_secintegerPARTICIPANT_SIGN_PER_SEC in force.
participant_sign_burstintegerPARTICIPANT_SIGN_BURST in force.
participant_gossip_per_secintegerPARTICIPANT_GOSSIP_PER_SEC in force.
gossip_burstintegerGOSSIP_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.

KeyTypeMeaning
exemptarray of stringThe paths the secret scan skips, in gitignore syntax.
never_syncarray of stringThe 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.

KeyTypeMeaning
subtreesarray of stringThe directory prefixes the subtree attribute may name.
ws_namesarray of stringThe 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.

KeyTypeMeaning
namestringThe action's name.
onOnWhat runs it; change by default.
afterAfterThe channels a gated action's frontier must already be held by; the trigger channel, or the change set for a manual action, by default.
pathsarray of stringThe paths it covers, in gitignore syntax.
usesarray of stringThe further paths it reads, in gitignore syntax; empty by default.
runarray of stringIts one step's argument list, when steps is not given.
stepsarray of StepEntryIts steps, when run is not given.
envtable of stringThe variables every step runs with, each value a template.
toolchainarray of stringThe toolchains it needs, values of the toolchain vocabulary.
writesarray of stringThe derived paths it generates, in gitignore syntax; empty by default.
secretsarray of stringThe credential variable names a gated action's run receives; empty by default.
quorumintegerThe attestations or outcomes it needs, when above its floor.
timeout_secsintegerIts wall clock and CPU limit, when below its class bound.

actions.on values

An [[actions]] entry's on: "change", "manual", or { channel = "<name>" }.

FormMeaning
"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.

FormMeaning
stringOne channel.
array of stringA 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.

KeyTypeMeaning
idstringIts id.
ifstringIts if.
envtable of stringIts environment.
working_directorystringIts working directory, relative to /work.
continue_on_errorbooleanWhether its failure leaves the run passing.
timeout_secsintegerIts own limit, in seconds.
runarray of stringAn argument list.
scriptstringA script's text.
shellstringThe script's shell.
nodestringA node program's directory.
mainstringThe node program, in node.
prestringThe node program run first, in node.
poststringThe node program run last, in node.
withtable of stringThe 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.

KeyTypeMeaning
quiet_msintegerThe 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.

KeyTypeMeaning
branchestable of stringThe git branch each channel moves, by channel name.
importarray of stringThe <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.

KeyTypeMeaning
donestringThe 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.

KeyTypeMeaning
skiparray of stringAction names left out.
inputstable of InputsEntryNarrowed inputs, by action name.
varstable of stringThe vars context.
repositorystringgithub.repository.

[workflows.inputs.<name>]

One [workflows] inputs."<name>" entry: gitignore-syntax patterns.

KeyTypeMeaning
pathsarray of stringThe paths the action covers.
usesarray of stringThe paths it reads besides.