Relay reason vocabulary
Status: data-only spec. No gate consumes these tokens yet, and this file is not
the exclusive dos.toml reason table. A future floor must opt in deliberately,
with its own maintenance witness, before any relay refuses or drains on these
tokens.
The vocabulary is closed so relay legs never explain their state with prose.
Every row follows the dos check-reason shape: a token, a category, a summary,
and a fix that tells the next leg or operator what action is valid.
Shape
{
"token": "RELAY_*",
"category": "advisory|TRUE_DRAIN|STALE_CLAIM|OPERATOR_GATE",
"summary": "one-line condition that fired",
"fix": "operator or successor-leg recovery action"
}
Categories are intentionally small:
| Category | Meaning |
|---|---|
advisory |
A threshold or precondition was observed, but the current leg may continue to a safe point. |
TRUE_DRAIN |
The relay ended or rotated cleanly against a durable witness. |
STALE_CLAIM |
A transcript or baton claim is not corroborated by durable state. |
OPERATOR_GATE |
Automatic continuation is unsafe; a human or stronger witness must intervene. |
Tokens
| Token | Category | Summary | Fix |
|---|---|---|---|
RELAY_ARMED |
advisory | The soft relay threshold was crossed; rotate at the next verified safe point. | Finish the current atomic action, externalize load-bearing state, and rotate when the safe-point predicate passes. |
RELAY_ROTATED |
TRUE_DRAIN | The leg wrote a baton and tombstone at a safe boundary, then handed control to the next leg. | Start the successor leg from the baton and re-verify its cursor before trusting any progress field. |
RELAY_GOAL_DONE |
TRUE_DRAIN | done_when was satisfied against the durable store, so the relay ended normally. |
Close the relay; do not launch another leg unless the durable done witness is later invalidated. |
RELAY_NOT_EXTERNALIZED |
STALE_CLAIM | Rotation was refused because load-bearing state still lived only in the transcript. | Commit, file, or ledger the missing state, then rerun the externalize check; park if it cannot be made durable. |
RELAY_PARKED_UNSAFE |
OPERATOR_GATE | The hard ceiling arrived before any verified safe point, so the leg parked instead of overrunning context. | Resume with an operator or stronger witness, recover only durable state, and write a clean baton before relaunching automation. |
RELAY_BATON_STALE |
STALE_CLAIM | Successor verification found the baton cursor no longer matches git, ledger, or the configured durable store. | Discard the stale baton fields, re-derive the cursor from ground truth, and write a fresh baton before continuing. |
RELAY_NO_PROGRESS |
OPERATOR_GATE | The relay made no verified progress for the configured number of consecutive legs. | Stop automatic rotation, inspect the blocker and hysteresis settings, then relaunch only after a new progress witness or narrowed objective exists. |
RELAY_IDLE_PARKED |
TRUE_DRAIN | A watch-goal relay verified — against durable witnesses — that its invariant holds with zero admitted pending work, so it parked idle instead of spinning fresh windows. It is a benign terminal-for-now, not a no-progress alarm. | Hold the park; do not count it toward RELAY_NO_PROGRESS. Re-arm the relay on the next witnessed external event (a git ref change, a CI verdict flip); an unverifiable idle read falls back to the no-progress path instead. |
Non-goals
- This file does not add
dos.tomlreasons. - This file does not authorize any new refusal path.
- This file does not make transcript summaries trustworthy; relay successors still re-derive from durable witnesses.