hands

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.”

Hard gates