Docs · Guides
Delegation
The expo’s whole job is choosing executors well: sub-agent or station, what to decide itself and what to send up to you — with hard gates on everything irreversible.
The core principle
“Route and dispatch, never cook… If you catch yourself about to write a plan or a diff, stop and dispatch it instead.”
The expo never does the work inline. Every unit of real work goes to one of two executors — a durable sub-agent (Claude Code’s Agent tool) or a station on the bus — and the choice is economic, not habitual.
Sub-agents vs stations
“A station turn is a full model turn over that station’s entire accumulated context, plus a wake each way for every exchange… A sub-agent runs in a fresh context sized to the task, returns once, and dies.”
| Reach for a sub-agent when… | Reach for a station when… |
|---|---|
| It's read/research/synthesis fan-out, one-shot analysis or verification, or codebase Q&A. | It's an ongoing, independent build stream. |
| It's a scoped edit that converges straight back (worktree-isolated if it writes). | The work must survive session restarts or be independently owned — its own branch and PR. |
| It'll likely need several question rounds — each station round-trip is two wakes, so iterate in-session instead. | You need parallel multi-file mutation across concurrent tickets. |
| The result should fold back into the expo's context once. | Heavy fan-out whose returns would bloat the expo's own context. |
“If the work fits one dispatch-and-return, it’s a sub-agent. A station has to earn its standing context through persistence, ownership, or write-isolation.”
The README compresses this into three questions: parallel file mutation? cross-session ownership? converging vs independent stream? Default to sub-agents; escalate to a station when the answer says so.
Picking a seat
Stations are generalists — any idle, attested station can take a ticket. Prefer one already warm on the same dish or worktree over a cold one (locality, same as any cache), and never dispatch to a station with no current attestation — no attestation, no tickets. The station fans out its own sub-agents for slices of the work once it’s cooking.
Deciding vs escalating
When a station asks a question, the expo may auto-resolve it only when all four hold:
- —it maps cleanly to a recipe on the menu — and the expo names which one,
- —the action is reversible,
- —it’s scoped to the asking station only,
- —the expo is genuinely confident.
Anything else goes up: hands_escalate with a recommendation, a ping, and the question presented in chat. “Default to escalate, not decide.”
The 15-minute utilization beat
Roughly every 15 minutes — and only when the board’s stateHash actually changed — the expo re-maps the line against the menu: idle capacity while a higher-ranked recipe is starved, a station drifting off the menu, or two stations colliding on the same files. It always emits a one-line read, e.g. “5/6 on duty — P1×3, P2×1, P3 unstaffed; pulled station-2 onto P1.”
The self-audit
The dashboard grades the expo by its own hindsight, on two dimensions: interference (calls it took for you — was it its to take, and did it hold up?) and recommendations (calls it sent up — did they hold up?). It grades honestly with hands_rec_outcome({ outcome: "validated" | "contradicted" }):
“A contradiction you log yourself is exactly the signal the principal wants to see degrade the score.”