The product
What the fleet answers to.
One instrument. Each section below is the real mechanism, drawn from the product.
The problem
Two records, one commit.
Git records that a change happened. It cannot record which agent made it, which review cleared it, what it cost, or which rule it was judged against, because none of that is in the commit. The right-hand record is not a nicer log of the same events. It is a different set of facts, captured while the work happened rather than reconstructed afterwards.
The fleet
Worktrees are table stakes.
The pool is installed and built before work arrives. A claim is atomic, dispatch takes seconds, and spend lands on the run that spent it, held branches included.
The console
Every session, live.
- runvitest session-surface11:42
- readsrc/hooks/use-turn-paint.ts11:43
- editdebounce paint until the turn settles11:45
- runvitest session-surface: 42 passed11:47
The console sees every session on the machine as it runs. Type into one to steer it mid-turn; an idle session parks and resumes where it stopped.
- One console, machine-wide.
- session discovery across every project root, live and past
- Steer without killing the run.
- the composer lands your message inside the running turn
- Idle parks, never vanishes.
- durable runner record keeps parked sessions visible and resumable
The board
The board derives itself.
- Spend attribution joins runs to work itemsyouperf2h
- Search finds keys as well as sessionsagent/pool-2ux5h
- Token gate rejects undeclared utilitiesagent/pool-1gate4m
- Session paint races on a settling turnagent/pool-4test3d
- Flaky session-surface testsagent/pool-2pr 11811m
A tracker goes stale because keeping it current is a second job somebody has to remember. Here it is not a second job. Opening the item, binding the branch, stamping the PR and closing on merge are steps the agent already takes to do the work, and the board is the projection of those steps. Nothing is reported, so nothing can be reported late.
- A commit cannot land untracked.
- pre-commit refuses a commit with no active work item
- A new branch is born tracked.
- post-checkout opens the item from the branch itself
- Stages only move forward.
- the spine refuses a backward advance
The gate
One dial, three breakers.
The dial is the part you set. The breakers are the part you cannot unset, and they are why turning the dial up is a decision rather than a gamble: at full autonomy the fleet still cannot widen its own limits, clear its own review, or run unattended forever.
Gated: the fleet proposes, you ratify. The default, and where anything unrecognised fails safe.
Full: changes that clear every green gate ship without you. The breakers underneath still hold.
Rules stay above the fleet.
A diff touching the rules, the autonomy policy included, is held for a human in every mode.
Reviews resolve honestly.
Resolution requires an independent verifier that did not write the fix, refute-by-default.
Runaways stop themselves.
A bounded run of unreviewed auto-merges halts the loop and surfaces on the board.
The review
Refute by default.
Every finding meets a verifier that did not write the fix and starts from no. A resolved thread carries the evidence that closed it, whichever way it closed.
- The fixer never clears its own fix.
- resolution requires an independent verifier
- A dismissal carries its proof.
- justify-and-resolve records the refutation on the thread
- Reviewers are pluggable.
- provider adapters behind one review contract
The trail
Append only, actor named.
- work.advanceagent/pool-114:22:07token-gate identified -> in_progress
- review.findingreviewer14:48:31token-gate severity medium
- review.verifyverifier14:52:10independent, did not author the fix
- gate.holdbreaker/0115:03:55autonomy-policy governance path
- canon.ratifyyou15:19:02never widen a scale to fit a call site
Two properties do the work here, and both are structural rather than promised. Every event names the actor that caused it, so “who decided this” is a field and not an investigation. And the store only ever appends: there is no update path and no delete path, so the record of a decision cannot be tidied up afterwards by the thing being judged.
The canon
Teach it once.
Finished sessions are distilled into rules the whole fleet is judged against. Contradictions are arbitrated, the loser is held for you, and the winner keeps its receipt.
- ingest
- extract
- reconcile
- curate
- gate
- render
- Contradictions do not both survive.
- conflict detection with source-rank arbitration
- A lesson learned twice stays one rule.
- bounded-similarity dedup with a judge confirm pass
- A contested rule waits for you.
- the gate holds duplicate and conflict losers
Local first
One call crosses the line.
Local-first is easy to claim and hard to verify, so here is the verifiable version: there is no API SDK anywhere in the codebase. The model call goes out through the Claude Code CLI you are already logged into, under your own Anthropic agreement. We do not hold a key, run a relay, or operate a cloud for this product, which means there is no configuration in which your code reaches us.
One window
One window.
Sessions, worktrees, runs, spend, the board, the gate and the canon, one instrument. Every list searchable from ctrl-k.