Skip to main content
Orchestration is represented as a board, not a hidden prompt loop. Every card is backed by a session-tree node, and it advances only through gated transitions. Render it read-only from persisted nodes:
voss board                 # most recently modified run
voss board <root_id>       # a specific run
voss board --cwd .

Columns

Backlog -> Planned -> InProgress -> InReview -> Done
                              \-> Blocked
ColumnMeaning
BacklogRaw ideas, not yet scoped
PlannedEM has authored acceptance criteria + role
InProgressScope and budget allocated; worker running
InReviewArtifact exists; awaiting independent review
BlockedTimeout, budget, scope error, or reviewer block
DoneTests/evals pass and independent review passed
Done and Blocked are terminal.

WIP limits

Work-in-progress is capped per column to keep parallelism bounded:
ColumnWIP cap
InProgress3
InReview2
othersunlimited
Exceeding a cap raises a board WIP error and the move is refused.

Transition gates

Each transition must clear a set of predicate gates before a card advances:
TransitionGate
Backlog -> Plannedscope contained in ceiling
Planned -> InProgressbudget available + scope contained
InProgress -> InReviewbudget + scope + confidence meets the risk-tier threshold
InReview -> Donescope clean + Reviewer-A passes + Reviewer-B passes + tests pass (or eval meets threshold for AI work)
Any -> Blockedtimeout, budget, retry ceiling, or reviewer block
Confidence thresholds default to low: 0.60, med: 0.80, high: 0.95 and can be overridden per team.

Agents cannot self-approve

A move to Done requires an injected independent reviewer. Without one, the board refuses the transition with a gate error whose failing clause is no-reviewer:
BoardGateError: Done requires an independent reviewer  (no-reviewer)
A card forced terminal by deadline, budget, or retry ceiling moves to Blocked with the reason recorded — so every blocked card carries a why.
The board is rendered deterministically from persisted session-tree nodes, so a run replays without reading the chat transcript. See the session tree.