Twenty-Six Agents Died in Three Waves: Probe Before You Fan Out
Three dispatch failure modes — a dead model route, a schema-valid parameter the route rejects, and agents that stall while reporting running — and the cheap probe that catches all three before you commit the fleet.
View companion repoTwenty-six agents died in front of me today, in three waves, for three different reasons. The dispatch layer reported most of them as "running" right up until the harness killed them. The fix that finally worked was not a bigger fan-out or a better prompt. It was one cheap probe agent and a rule file that named which model routes actually exist.
This is a post about the layer underneath agent orchestration. The series has covered what teams of agents can do when they work: file ownership that prevents merge collisions, governance that survives inheritance, model routing that cuts cost 82%. All of it assumes the dispatch mechanism works — that when you spawn fourteen agents, fourteen agents run. Today that assumption failed three separate times, and each failure mode was invisible until I went looking for the corpse.
TL;DR
- Wave 1 died on routing: specialist agent shorthands silently resolved to a provider with no credentials.
404 model_not_found, instant death.- Wave 2 died on a parameter: a schema-legal
effort: "lo"was forwarded verbatim to a route that only acceptslow|medium|high.400, instant death.- Wave 3 died quietly: agents made five real tool calls, then stopped mid-turn until the harness killed them for not yielding. Status: "running" the whole time.
- One 33-second probe agent would have caught all three. Twenty-six agents learned it the hard way.
Wave 1: the shorthand that routes to nowhere
The orchestration layer offers specialist agent types — scout, researcher, executor — each a shorthand for a preconfigured role. I dispatched fourteen of them for a codebase discovery wave. Every one failed inside a second.
The cause was not the prompt or the payload. Each shorthand carries a hardcoded model route, and those routes pointed at a provider with no active credentials in this environment. A user rule file had this written down: only routes matching the session's own working pattern resolve; specialist shorthands do not. I had read the rule. I dispatched anyway, because the shorthand is the documented, ergonomic path — and the failure mode for ignoring the rule is silent.
That is the first lesson, and it generalizes past this harness: a dispatch API that cannot verify its own routing will fail as if the agent were at fault. Nothing in the spawn call says "this agent type maps to a model you cannot reach." The spawn returns success. The agent dies in under a second. Your orchestration log says the wave is in flight.
Wave 2: schema-valid, route-fatal
Chastened, I redispatched with the default worker, which inherits the session's verified route. To keep costs sane I set the effort parameter the task schema advertises: lo, med, hi.
Two agents came back with this:
{"type":"error","error":{"type":"invalid_request_error",
"message":"output_config.effort: Input should be 'low', 'medium', 'high', 'xhigh' or 'max'"}}
The schema accepts lo. The route rejects lo. Somewhere between the tool definition and the provider, the value passes through unmapped, and the layer that validates it last is the one that kills the agent. The rest of the wave ran — briefly — then hit wave 3's failure.
Lesson two: schema acceptance is not a contract. A parameter can validate at the tool layer, deserialize cleanly, and still be fatal at the route. If a setting matters, verify it against the upstream's accepted values, not the local schema's. Better: don't pass optional knobs you haven't watched succeed once.
Wave 3: the walking dead
The third wave had the right route and no bad parameters. Fourteen agents spawned. The job list showed all fourteen running. They made real tool calls — directory listings, manifest reads — and then, one by one, they stopped. Not errored. Stopped. The model returned a turn with no tool call and no terminal yield, a reminder fired, the turn produced nothing again, and after three reminders the harness killed the session for not yielding.
From the orchestrator's seat this is the worst failure mode of the three, because it has no error. The transcript shows a healthy start. The status says running. The only observable difference between a working agent and a dead one is time. Twenty-six agents across the three waves; the third wave cost the most wall-clock because each corpse looked alive for a minute and a half.
Lesson three: running is a claim, not evidence. Any agent pool needs a liveness signal stronger than process status — a heartbeat of forward progress, and a probe that tests the path before you commit the fleet.
The probe
After three waves I changed tactics. One agent. A three-step assignment: read two manifests, count dependencies, write a file, yield PROBE-OK.
It finished in 32.7 seconds, file on disk, structured result returned. That single data point separated "the dispatch layer is broken" from "the dispatch layer is broken for the configurations I tried." The probe cost nothing, and it converted an unbounded debugging session into a bounded configuration question. Default route: works. File writes: work. Yields: work. Now fan out.
The subsequent team — five agents, a charter with file-ownership globs, a shared task list, hub messaging for coordination — completed all five workstreams with per-agent evidence. Same harness, same model route, same hour. The difference was entirely in the dispatch discipline: verified route, no unverified parameters, one probe before the fleet.
The pattern that survived
The durable artifact from today is not the code the team shipped. It is a rule file and a lesson record, both written before the next wave was allowed to launch:
- Inherit, don't shorthand. An agent whose model route you cannot verify is an agent that does not exist. The default worker inherits the session's proven route; that is the only free lunch.
- Probe one before fourteen. A 33-second probe has better expected value than any amount of prompt engineering on a wave that will die on infrastructure.
- Schema-valid means nothing downstream. Optional parameters are guilty until watched succeeding once.
- Dead agents look running. Budget your fan-out accounting for silent stalls, and make the kill condition observable.
The series' recurring claim is that governance must be structural — hooks, not prose; exit codes, not intentions. Today was the same lesson one layer down. Orchestration reliability cannot be a convention the orchestrator remembers to follow. It has to be a probe that runs first and a rule that names the routes, because the agent doing the dispatching will otherwise learn about dead providers the way I did: fourteen at a time.
What a probe cannot prove
Honesty requires the boundary. A probe proves the path works once, at one load level, for one assignment shape. It says nothing about whether five concurrent agents will hold up, whether the route rate-limits at fifteen, or whether tomorrow's provider rotation invalidates today's rule file. Today's five-of-five success is a sample, not a guarantee. The probe-first discipline does not eliminate dispatch failure; it moves the failure earlier, to a point where it costs 33 seconds instead of three waves.
That is the whole claim. Send one agent first. Watch it come back. Then send the rest.
Continue the series
- 43SeriesThe Agent Cannot Edit Its Own Answer Key: Structural Guardrails Against Reward HackingAn agent scored against ground-truth files has three shortcuts to a fake PASS: edit the answer key, tune a constant until green, or assert "verified" without running anything. I closed each one in the harness, where the model cannot rationalize past it.
- 45SeriesThe Silent No-Op: When Your CMS Writes to a File the Renderer Never ReadsI edited a post, saved it, watched the deploy finish, and the page did not change. Nothing errored. Nothing warned me. The write succeeded and the read path ignored it, and that silence is the whole bug.
- 42SeriesThe Refutation Swarm: 842 Subagents That Default to Disbelieving Each OtherOne FileAuditAgent per source file, one RefutationAgent per claimed defect, and a standing order to disbelieve. Only 43 of 239 candidate defects survived the adversarial gate.
- 46SeriesObservability You Can See But Not Keep: A Live Stream Is Not a RecordA dashboard that renders a run in real time convinces you observability is solved. The real test is whether you can answer a question about a run that finished yesterday — and on my agent platform, the honest answer was zero rows.