The board
Four stages, six custom fields, four policies:spec (position 0), build (position 1), review (position 2), done (position 3)
Fields:
Validate the board before the session starts:
Operation 1 — Create work
Create a task in Spec and another directly in Build:This task entered Build without passing
gate-build. Guards fire on transitions, not on creation. A task can be created directly in any group.Operation 2 — Move without meeting the gate
Check first, then attempt the move:- The
on_failure_messagefrom the policy is the error message — write it as an instruction to the agent. - A blocked write changes nothing, including the task’s version.
- The block is recorded as a
move_blockedevent in the task’s history.
Operation 3 — Satisfy the gate and move in one write
The gate evaluates the task as it would look after the move. Set the required field and changegroup_id in a single update_task call:
Operation 4 — Stale version
If another write has occurred since your last read, you will receiveversion_mismatch:
Operation 5 — Second gate
Moving from Build to Review requirestests_passing = true (gate-review). Attempting the move without it fails with the same pattern as Operation 2. Set tests_passing: true and move in one call — the task lands in Review at version: 3.
Operation 6 — The human gate
gate-done requires both reviewer (not empty) and shipped_approved = true. The shipped_approved field is human_only.
The error code is
forbidden, not transition_blocked. The entire write is rejected — including the legitimate reviewer field — before anything is applied. Split the call: set only reviewer first, then wait for human approval.reviewer separately, the agent calls list_pending_approvals to surface what needs human attention:
Operation 7 — The human decides
The approval is stamped
human:diegoferreyra, not the agent name. It bumps the version to 5 — the agent’s cached version 4 is now stale and must be re-read before the next write.Operation 8 — Revoking an approval
The field is deleted, not set to
false. Both an exists check and an eq true check will re-block correctly if the task is moved back through the gate.What the history remembers
Event 10, verbatim:
move_blocked events show the rails engaged three times, and the single human: actor shows exactly where a person entered the loop.
What this board does and doesn’t give you
What you get
An agent that cannot quietly skip a stage. Reminders delivered at the moment they apply. A durable record of every attempt including refused ones. One step that genuinely waits on a person.
What you don't get
Verified tests — self-attested. Immutable rails — policies are data, and an agent could
archive_policy, but that act is git-visible and event-logged.Policies and Gates
Full reference for
transition_guard and agent_responsibility — operators, compounds, and what guards guarantee.Validate Your Gates
Run
substrate validate and test your policies before relying on them in a live workflow.