07 · Agentic workflow
How the fleet was run, and how the ship was steered
One human, one orchestrating Claude session that lived for the whole project, and 147 subagents working in 96 git worktrees. The human never opened an editor. The human held the only console, the only SD card, and the only pair of eyes that could be trusted.
The topology
One long-lived session was the orchestrator. It held the project memory, wrote the briefs, merged the branches, and talked to the user. Work was fanned out to background agents, each given a worktree, a branch named for its lever, a brief file committed into docs/research/, and a progress file it had to write before it was allowed to finish. Agents never talked to the user; the orchestrator relayed. Agents never touched mainline; the orchestrator merged after an emulator smoke test and, for anything risky, after a hardware verdict.
user ──(prompt, screenshots, SD card)──▶ orchestrator session
│ briefs, merges, memory, reports
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
worktree A (lever) worktree B (lever) deep-research workflow
branch feat/3ds-a branch feat/3ds-b 5 search agents → fetch → verify → synth
killswitch + receipt killswitch + receipt
progress.md + commits progress.md + commits
└───────── merge into feat/3ds-hwtestN ─────────┘
│
.3dsx + .cia + TEST-PLAN.txt ──▶ SD card ──▶ New 3DS ──▶ log.txt backThe rules the fleet lived by
These accreted from failures (see Difficulties) and were copied into every brief as a "common rules" block:
| Rule | Born from |
|---|---|
| Patch as pure delta. Upstream submodules stay pristine; every change is a patch generated against the full current stack; the README lists the order; a clean-stack round-trip must pass. | Double-carried hunks in the rival-detail patch, twice. |
| Killswitch for everything. Every lever has an ini key defaulting on, and later a row in the bottom-screen DBG tab, so hardware can A/B without a rebuild. | The first hardware rounds could only compare builds. |
Receipt for everything. A lever must print a log line proving it engaged ([rt] mode=ahead, [c3d] anchor=…, texcacheMainMut=0). | A silent audio agent whose run was attributed to the wrong binary. |
| Commit early, progress file first. Agents die on token limits and API overloads; a dead agent with zero commits costs a day. | Traffic, sky3b, P2 and the first bridge-cache agent. |
One emulator, one lock. /tmp/azahar.lock, touched every 30 s while held; wait in turn; never kill another run. | Agents killing each other's Azahar and deleting SD artifacts. |
| Combined-lever screenshot before staging. A race frame with every lever on, captured through the window id, inspected by eye. | The HUD-destroying interaction between trifast and the atlas. |
| Merge ini keys, never overwrite. The user's SD ini holds their 3D and display choices. | A round that shipped with stereo silently off. |
| Never re-apply the patch list onto a patched tree. Reset both submodules first. | A corrupted decomp tree in the final week. |
How the ship was steered
The user's messages are short, frequent, and almost entirely about direction, evidence and verdicts. Reading all 223 of them in order, the pattern is a captain, not a programmer: set the goal, demand parallelism, bring the physical evidence, say yes or no, and protect the budget.
Setting the goal and refusing the safe path
Demanding parallelism
Being the oracle
The agents could not see the console. The user ran the SD-card loop dozens of times ("SD in", "SD returned", "SD card is back in" appear 36 times) and reported what a human sees: shapes, colours, hitches, feel. Those reports were the only ground truth for the visual bugs and for every fps number on the Road to 60 page.
Pushing back on the machine
Guarding the budget and the record
Working through the night
Twice (08-20 and 08-21) the user went to sleep with the instruction to keep working. Each night session ran a fleet against a frozen mainline, wrote a morning-status document, and left a candidate branch to promote after the user's eyeball. The 08-20 candidate was promoted with "sure, promote it. i dont see any large regressions. probably better"; the 08-21 night produced the S7 interpreter memo and the async frame-mirror copy that took the menus from 15 to 20 fps in the emulator.
What the orchestrator did that an agent could not
- Held the memory. A single project memory file (591 lines by the end) was rewritten at every milestone with state, gotchas, and the next step, and three RESUME documents were committed at every credit pause. Every context compaction and every new session restarted from it.
- Wrote the briefs. Each lever got a brief with the hypothesis, the file locations, the measurement protocol, the killswitch name, the receipt format and the report format. The briefs are in the repository.
- Finished what agents dropped. The texture-cache crash fix, the viewport fix and the stereo anchor were completed by the orchestrator after the assigned agents died on API overloads.
- Ran the hardware loop. Build, package (.3dsx + .cia + test plan), copy to SD, eject, read the log back, compute the fps distribution, decide merge or revert.
Where the workflow was pioneering
Multi-agent coding is usually demonstrated on web apps with a test suite. This project ran it against a target the agents could not observe, with a human-in-the-loop measurement cycle measured in SD-card round trips, on a codebase made of three repositories (decomp, runtime, port) with a patch stack instead of a fork. The devices that made that work (receipts, killswitches, briefs with measurement protocols, the emulator lock, the morning-status documents, the hardware test plans) are the transferable result. They are what let 147 agents contribute to one binary without a single regression reaching the user's console unflagged.