09 · 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. In the first phase (2026-08-11 to 09-03), 147 subagents worked in 96 git worktrees. A second phase (09-07 to 10-19) ran the same discipline at a larger scale, for longer, with a wider toolset — covered in its own section below. Throughout, the human never opened an editor, and held the only console, the only SD card, and the only pair of eyes that could be trusted.

223
messages typed by the user in the first phase (08-11 to 09-03)
147
background subagent transcripts, first phase (the Agent tool only; the 1,103 workflow agents are counted separately, see Cost)
96
separate git worktrees, each on its own branch, first phase
98
feat/3ds-* branches, first phase
10
deep-research workflow runs, first phase
15
active days between 08-11 and 09-03

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.

The humanSets goals, plays the builds,judges what he sees, says yesor no to every merge. Neveropens an editor.Orchestrator sessionOne long-lived Claude Code session:project memory, briefs, merges, the onlyvoice the human hears. RESUME notes atevery credit pause.Review toolsAdversarial review passesafter merge windows (findingsranked, confirmed orsuspected); frame, hash andscreenshot diff tools; a localreview page for thepost-mortem's own notes.goals,verdicts,photosauditthemergesHardware laneOne combined test build perconsole (auto A/B, auto logs).In: SD card trip, or 3dslinkpush to the netloader (TCP17491), or in-game reload (TCP17492). Out: live log to aserver on the Mac, log.txt onSD.THE FLEETSubagentsOne worktreeand one branchper lever, acommitted briefand a progressfile.Killswitch +receipt linefor everychange. 147 inthe first phasealone.WorkflowsScriptedfan-outs: deepresearch(search agents→ fetch →verify →synthesise),parallelcensuses andreviews.Emulator farmAzahar (one Qt instance, onelock) plus RetroArch Azaharinstances, each with a privateSD, behind a three-slotmachine-wide pool. Tick-exactinput replays with per-framestate hashes.briefs ↓ commits,progress ↑merge, build← logssmoke,parity,shotsNew 3DS + Old 3DSThe only ground truth forframe rate, feel and visualbugs. Old 3DS mostly by SDcard.Rendezvous server (AWS)v1.1.0 online play: UDP 27200room codes, hole punching,relay fallback. EC2 t4g.nano,run by agents throughTerraform and an ops script.build in ↓ log out ↑online race: endpoints, punch, relay fallback (UDP 27200)consoles then race in lockstep, ~130 bytes per tick per peercarries the SD card,presses Y on the netloader
The humanSets goals, plays the builds, judgeswhat he sees, says yes or no to everymerge. Never opens an editor.Orchestrator sessionOne long-lived Claude Code session:project memory, briefs, merges, theonly voice the human hears. RESUMEnotes at every credit pause.goals and verdicts ↓ reports ↑SubagentsOne worktree and one branch perlever, a committed brief and aprogress file. Killswitch + receiptline for every change. 147 in thefirst phase alone.briefs ↓ commits ↑Emulator farmAzahar (one Qt instance, onelock) plus RetroArch Azaharinstances, each with a privateSD, behind a three-slotmachine-wide pool. Tick-exactinput replays with per-framestate hashes.smoke, replay parity, shotsWorkflowsScripted fan-outs: deep research(search agents → fetch → verify →synthesise), parallel censuses andreviews.fan-out scriptsReview toolsAdversarial review passes aftermerge windows (findings ranked,confirmed or suspected); frame, hashand screenshot diff tools; a localreview page for the post-mortem'sown notes.audit after mergesHardware laneOne combined test build per console(auto A/B, auto logs). In: SD cardtrip, or 3dslink push to thenetloader (TCP 17491), or in-gamereload (TCP 17492). Out: live log toa server on the Mac, log.txt on SD.merge → one build per consoleNew 3DS + Old 3DSThe only ground truth for framerate, feel and visual bugs. Old3DS mostly by SD card.SD / netloader in, log outRendezvous server (AWS)v1.1.0 online play: UDP 27200room codes, hole punching,relay fallback. EC2 t4g.nano,run by agents through Terraformand an ops script.online races only
How it actually ran. One human, one orchestrator, a fleet that never talked to the human. The hardware lane changed over time: SD card only through the first phase and the start of the second, then netloader push, in-game reload and a live log server, and from 10-21 one combined test build per console instead of one card per feature. The emulator farm went from one locked Azahar to a slot pool of parallel instances. The rendezvous server (dashed) exists only for v1.1.0 online play.

The rules the fleet lived by

These accreted from failures (see Difficulties) and were copied into every brief as a "common rules" block:

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

Steering from outside the code

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

08-11 03:44lets create a plan for team of agents to work. can we segment plan so we can have multiple work trees and multiple contributing agents ?
08-14 05:05only list options that work towards this running acceptably in 3D at 60fps
08-21 22:49played a bunch, running well. no hitches. music still plays. rest of issues are what's left. would love to see the framerate at a crispy 60. then... maybe 3D?
08-28 04:27moonshot! lets go for it

Demanding parallelism

08-14 01:10i didnt see any hard crashes right now, so lets see about the visual fixes. any work that can be done in parallel ?
09-02 21:59lets do /deep-research on whats left, come up with plan, and execute subagents for all parallel work

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.

08-14 13:21yep definitely looks like the game but its still quite buggy. some of the elements jitter/shimmer, textures change. opening tunnel doesnt have a roof, might have to do with backface culling?
08-21 15:54wow it runs amazing ! like you were suggesting, maybe even better than the emu. sound doesn't work btw. sound has never worked on the emu either.
08-28 04:22minimal appears to be a 8 to 9 fps gain ! sometimes a little more. def worth it.
09-03 16:32next thing to consider: 3D works great for 3D elements, but UI elements are a little less consistent. one thing thats really jarring is the 1P/2P/3P markers during a race. they sit on the most foreground in 3D but the ships are somewhere in the distance

Pushing back on the machine

08-21 00:23nothing new to report here. all the same issues. anything we can do ? instanity is doing the same things and expecting different results. /deep-research different methods of fixing these issues.
08-21 20:40uh dude no, i heard the tone sound before even. and i heard the music fine earlier. its not azahar.
08-15 16:33also mark that it was done with opus and not fable so it should be reconsidered if this is the best approach

Guarding the budget and the record

08-14 14:06we ran out of fable credits until next week, lets capture all the inflight tasks and store state so we can pick up the work later.
08-28 13:17lets try pushing the last lever. lets also write up the README for release. lets make sure we clearly declare this was just for educational purposes, not affiliated with nintendo, doesnt provide ROM or assets
09-03 13:20also, is there any way you could create a webpage with some histograms of the performance + documentation on how the changes all affected performance?

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

The second phase: longer, wider, with an adversary

The first phase was a 24-day sprint to a single target. The second (09-07 to 10-19, 43 calendar days) built a different renderer, a second console tier and a second game mode on top of a build that already worked, which changed the shape of the work more than its length: many more parallel workstreams, each still in its own worktree with its own brief and progress file, left behind 199 internal progress notes by the end, far more than the first phase's smaller written record. The rules in the table above (patch as pure delta, killswitch for everything, receipt for everything, commit early) held and were leaned on harder, because more of the work now ran unattended for longer between human checks.

Three things were added to the loop that the first phase did not have:

What stayed the same: one orchestrating session, one human approving every merge into the branch that builds toward release, and no agent ever touching the only SD card or the only console directly.

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 Frontier page names the devices that made that work transferable. What this page adds: the second phase runs the same argument at a larger scale — the same devices and discipline, held across more than twice the calendar time, more console configurations, and a ground-up renderer rewrite.