Columns
| Column | Meaning |
|---|---|
Backlog | Raw ideas, not yet scoped |
Planned | EM has authored acceptance criteria + role |
InProgress | Scope and budget allocated; worker running |
InReview | Artifact exists; awaiting independent review |
Blocked | Timeout, budget, scope error, or reviewer block |
Done | Tests/evals pass and independent review passed |
Done and Blocked are terminal.
WIP limits
Work-in-progress is capped per column to keep parallelism bounded:| Column | WIP cap |
|---|---|
InProgress | 3 |
InReview | 2 |
| others | unlimited |
Transition gates
Each transition must clear a set of predicate gates before a card advances:| Transition | Gate |
|---|---|
Backlog -> Planned | scope contained in ceiling |
Planned -> InProgress | budget available + scope contained |
InProgress -> InReview | budget + scope + confidence meets the risk-tier threshold |
InReview -> Done | scope clean + Reviewer-A passes + Reviewer-B passes + tests pass (or eval meets threshold for AI work) |
Any -> Blocked | timeout, budget, retry ceiling, or reviewer block |
low: 0.60, med: 0.80, high: 0.95 and can be overridden per team.
Agents cannot self-approve
A move toDone requires an injected independent reviewer. Without one, the board refuses the transition with a gate error whose failing clause is no-reviewer:
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.