Multi-Agent vs Single-Agent: When You Actually Need More Than One
- Most systems marketed as multi-agent are one agent with a bad tool layer. A second agent adds a serialisation boundary, and every handoff can only lose information, never create it.
- Multi-agent is not automatically more expensive. On a modelled 30-turn task it is cheaper than one agent, because splitting contexts breaks the quadratic history term. It becomes more expensive the moment the subtasks are coupled.
- The costs nobody prices: duplicated static context per agent, a coordination agent that is 20-24% of the bill and does no work, a debugging surface that is now a distributed system, and a fixed floor of roughly 12 cents per extra agent before it does anything.
This is the only structural property that reliably pays. Independent branches let each agent keep a short history, which is what breaks the quadratic re-send cost. Modelled crossover: about 13 turns of total work.
Different permission scopes are a real boundary. A read-only research agent that physically cannot call the refund tool is a stronger control than a prompt that asks it not to. Failure mode without it: one prompt injection reaches every credential you own.
Compaction, tool subsetting and moving payloads to a store recover more context than a handoff does, and none of them lose information. Fifty tool schemas alone are 7,500 tokens a turn.
Debate topologies burn tokens producing consensus, not answers. Cognition's public guidance is blunt: parallel actions make conflicting implicit decisions, and a single-threaded context is usually good enough.
The honest default. A tool that returns a bounded, well-shaped result outperforms a subagent that returns a 3,000-token prose report the orchestrator then has to re-read at $2 per million tokens.
What is the difference between a single-agent and a multi-agent system?
One context window versus several, connected by a serialisation boundary. A single agent keeps every observation in one running history. A multi-agent system splits that history across processes, and the only thing that crosses between them is text somebody wrote to summarise state. That boundary is the entire design decision. Everything else is topology.
Splitting contexts buys two things: each agent keeps a shorter history, and each can carry a different tool set, permission scope and model. It costs one thing: information. Tran and Kiela's 2026 Stanford paper on multi-hop reasoning under equal thinking-token budgets grounds this in the Data Processing Inequality: every inter-agent handoff can only lose information, never create it. Empirically, single-agent systems match or beat multi-agent ones once reasoning tokens are held constant, and reported multi-agent gains are often confounded by the extra test-time compute.
The word that causes most of the confusion is agent. A subagent invoked as a tool, with fixed input and output schemas, that returns once and holds no state, is not a second agent. It is a tool that happens to be implemented with a model call. That pattern is fine, and it is what most successful production systems run. Cognition's public write-up describes the same shape: one main loop carries state, and subagents are stateless workers with narrow scope. If your second agent has a conversation, that is a multi-agent system. If it answers a question and dies, it is a tool.
I build both. AccioMatrix, the AI assessment and interview platform I architected and built solo for 20+ enterprise clients, runs an event-driven backbone orchestrating multiple LLMs, agents and MCP tooling. The genuinely multi-agent parts are where the subtasks are independent and the permission scopes differ. The rest is one loop with a good tool layer. For the loop itself, see how the agent loop actually works in production; the layer it sits inside is layer four of the full AI product architecture reference.
| Property | Single agent | Multi-agent | Which is better | Cost of getting it wrong |
|---|---|---|---|---|
| Context | One history, grows every turn | One history per agent, each shorter | Multi, if branches are independent | Quadratic re-send: a 60-turn single-agent run is $7.12 on the model below |
| Information fidelity | Nothing is lost — every observation is present | Every handoff is a lossy summary | Single, always | A misbriefed branch does the wrong work: one wasted branch is $0.27 |
| Tool scope | One catalogue, all tools visible every turn | Per-agent catalogue | Multi | 50 schemas at ~150 tokens each is 7,500 tokens a turn, ~$0.30 over 20 turns |
| Permissions | One credential set, one blast radius | Per-agent credentials | Multi | One injected tool description reaches every credential the run holds |
| Debugging | One ordered transcript | N transcripts plus the messages between them | Single, by a wide margin | Mean time to diagnose roughly doubles per added agent in my experience |
| Failure isolation | One failure ends the run | One branch fails, others survive | Multi | Without isolation, step 18 of 20 failing discards 17 paid steps |
| Model choice | One model for everything | Cheap model for extraction, frontier for synthesis | Multi | All-frontier routing is 2.5x the cost of class-based routing on the model in the routing post |
| Coordination | None | A lead agent that produces no output of its own | Single | Lead agent is 22-24% of total spend on the model below |
When do you actually need more than one agent?
When at least four of five conditions hold: parallelisable independent subtasks, genuinely different tool or permission scopes, separate context budgets, independent failure isolation, and different models per role. Fewer than four and you are buying coordination overhead with no structural return. This is the whole test, and it takes ten minutes to run.
Run it honestly and most systems score one or two. The most common single yes is parallelism, and usually the wrong kind. Subtasks that could run in parallel but constantly need each other's intermediate results are not independent, they are concurrent. Concurrency without independence is the worst configuration in this design space: you pay the handoff cost, you pay the coordination cost, and you get none of the context-splitting benefit because every branch carries the shared state anyway.
The two conditions that carry the most weight are structural, not economic. Different permission scopes is a real architectural boundary: a research agent holding only read credentials cannot issue a refund even if a tool description tries to talk it into one, whereas a single agent holding every credential is one successful prompt injection away from doing so. Separate context budgets is real when a branch legitimately needs to read 200,000 tokens to produce a 2,000-token conclusion. That is where a subagent as a context firewall is the right instrument, and Anthropic's own Research architecture is built on it: a lead agent spins up three to five subagents that each hold their own window.
The conditions that carry the least weight are the ones people lead with. Different models per role is real, but it is a routing decision, not an agent decision. You can call three models from one loop; that is how routing and caching actually price a request. Failure isolation is real, but a journal with per-step status gives you most of it inside one agent. Score both as half-points if you are being strict.
- 1. Are the subtasks genuinely independent: can they run in any order, and does none of them read another's intermediate results?The only condition that changes the cost curve. Independence lets each branch keep a short history, which breaks the quadratic re-send term. Fails as: a branch produces a plausible answer built on a stale assumption from another branch. Cost of the wasted branch on the model below: $0.27.
- 2. Do the roles need genuinely different tool or permission scopes, not just different prompts?A read-only researcher that physically cannot call issue_refund is a control; a prompt asking it not to is a suggestion. Fails as: one injected tool description reaches every credential the run holds. Cost: unbounded, and externally visible.
- 3. Does at least one branch need its own context budget, reading far more than it returns?This is the context-firewall case: 200K tokens in, 2K tokens out. Anthropic's Research architecture is built on it. Fails as: context overflow mid-run, discarding every paid step. Cost of a 20-turn run lost at step 18: about $0.95.
- 4. Do you need one branch to fail without killing the others, and is a partial result actually useful?Half a point. A run/step journal with per-step status gives you most of this inside a single agent, and partial results are only valuable if your product can present them. Fails as: a compensating action never runs because nobody owns the half-finished state.
- 5. Do the roles genuinely need different models, a cheap extractor and a frontier synthesiser?Half a point, because this is a routing decision, not an agent decision. One loop can call three models. Modelled saving from class-based routing: about 60% versus routing everything to the frontier tier.
“A year ago, I would tell people to not build multi-agents and to focus on context engineering fundamentals. Today, many sexy ideas are still impractical, but we have found some setups that actually work.”— Walden Yan of Cognition, whose earlier post Do Not Build Multi-Agents set the default position this article starts from
Why do most multi-agent systems perform worse than one good agent?
Because a handoff is a lossy compression step, and you have inserted several into the middle of a reasoning chain. Tran and Kiela's Stanford paper states this formally through the Data Processing Inequality: under a fixed reasoning-token budget and perfect context utilisation, a single agent is strictly more information-efficient. Empirically, single agents match or beat multi-agent systems on multi-hop reasoning once you control for thinking tokens.
The practical version is more mundane and more damaging. A subagent gets a briefing written by another model, a summary of a summary. It cannot ask a clarifying question without a round trip that costs the lead a full turn. It makes decisions the other branches cannot see. Cognition's second published principle names this: every action implicitly makes a decision, and parallel actions produce conflicting implicit decisions. Two branches independently picking a different date format, customer identifier or scope assumption each produce internally coherent work that does not compose.
The synthesis step is where this turns invisible rather than merely wrong. A lead handed three branch reports produces a fluent, confident, well-structured document whether or not those reports contradict each other. It has no signal that two facts are incompatible, so it picks one, or worse, blends them. The failure mode is a 200 OK with a coherent answer built on an assumption no branch verified, and you catch it with a trajectory eval, not an error rate, because nothing errored.
Then there is the recursion hazard, the one that produces the invoice nobody can explain. If a subagent can spawn subagents, cost multiplies rather than adds. On the model below, one branch is about $0.27; a branch that spawns three of its own is about $1.06; two levels of that is roughly $4. Without a run-scoped global budget shared across every agent in the tree (a global one, not per-agent), there is no mechanical bound at all, and the detection signal is next month's bill.
- 1Briefinglossy · $0.27 per wasted branch
The lead compresses shared state into a prose brief. Everything not in the brief is invisible to the branch, including the constraint the user stated in turn two and the lead judged unimportant. Fails as: correct-looking work against the wrong constraint.
- 2Executionno shared decision log
The branch makes implicit decisions the other branches cannot see: identifier format, date convention, scope boundary. Each is internally coherent. Fails as: three internally consistent reports that do not compose.
- 3Reportingsecond lossy step
The branch compresses its whole trajectory into a report. The lead now has a summary of a summary and no access to the raw observations. Fails as: the lead cannot tell a confident guess from a verified fact.
- 4Synthesissilent · detected only by eval
The lead merges reports that may contradict. It will produce something fluent either way. Fails as: HTTP 200 with a confident answer built on a contradiction. Detection requires a trajectory eval, not an error-rate alert.
What does multi-agent actually cost?
Less than one agent when the branches are truly independent, more when they are not, and the crossover is sharp enough to compute. On the model below, a three-way split pays back at about 13 turns of total work if the branches never need each other, and not until about 35 turns if they do. This is the opposite of the usual claim, and worth working through, because the usual claim rests on a comparison that does not hold.
Here is the model, in full. Static prefix per agent: 9,000 tokens for a single agent carrying the whole tool catalogue, 4,500 for a specialist subagent carrying a subset. Shared-state brief re-sent to each subagent every turn: 2,500 tokens when the branches are independent, 9,000 when they are coupled and need the full picture. Task input 400 tokens per turn. History grows 1,650 tokens per completed turn. Output 250 tokens per turn for workers, 600 for the lead. Mid tier at $2 per million input and $10 per million output. Substituting your own numbers takes five minutes and the shape does not change.
Multi-agent can win because the history term is quadratic. A single agent running 60 turns re-sends its whole transcript 60 times: about 3.48 million cumulative input tokens and $7.12. Three agents running 20 turns each re-send three much shorter transcripts: about 1.38 million tokens and $3.15 including the lead. Splitting the context breaks the quadratic term. That is a genuine, structural, arithmetical benefit the do-not-build-multi-agents position tends to skip.
It usually loses anyway because the branches are coupled. Once each subagent needs the full 9,000-token shared brief every turn, and one branch in three has to be re-run because the lead rejected its report, the same 60-turn task costs about $5.53, still below the single-agent $7.12, but now with worse answer quality, four transcripts to debug, and a coordination agent consuming 11% of the total while producing no work of its own. At 30 turns the coupled version is already more expensive than one agent: $2.41 against $2.08.
One more figure worth naming: the fixed floor per extra agent. A specialist subagent carries 4,500 tokens of static prefix plus a 2,500-token brief on each of its nine turns. That is 63,000 tokens, about 12.6 cents at mid-tier pricing, before it does a single piece of useful work. It is the marginal price of the fourth agent on a diagram, charged whether or not the branch contributes anything.
| Total turns of work | Single agent, one context | Multi-agent, independent branches | Multi-agent, coupled + 1 rerun in 3 | Cheapest option |
|---|---|---|---|---|
| 10 | $0.36 | $0.44 | $1.06 | Single agent |
| 20 | $1.05 | $0.77 | $1.66 | Multi, if independent |
| 30 | $2.08 | $1.20 | $2.41 | Multi, if independent |
| 40 | $3.43 | $1.74 | $3.30 | Multi, if independent |
| 50 | $5.11 | $2.39 | $4.34 | Multi, if independent |
| 60 | $7.12 | $3.15 | $5.53 | Multi, if independent |
| Model inputs | 9,000 static + 400 task + 1,650 history per turn, 250 out | 3 branches, 4,500 static + 2,500 brief per turn, 8-turn lead at $0.232 | 3 branches, 4,500 static + 9,000 brief per turn, 14-turn lead at $0.608, x1.33 rerun factor | Mid tier $2/$10 per 1M, Aug 2026 list |
What is the real overhead nobody mentions?
Four things, and only one of them is tokens. Context duplication across agents, the coordination agent itself, a debugging surface that has quietly become a distributed system, and a cost model that multiplies rather than adds. Every architecture post covers the first. Almost none cover the third, which is the one that actually degrades your team's velocity.
Context duplication is the arithmetically obvious one. Every agent needs its own system prompt, its own tool schemas, and enough shared state to work. On the coupled model above that is 13,500 tokens of preamble on every turn of every branch: 526,500 tokens across a three-branch, thirteen-turn-per-branch run, or $1.05 of pure preamble at mid-tier pricing. That is 44% of the run cost spent re-establishing what each agent would already have known as the same agent. The real failure mode is not cost, it is drift. Three copies of a system prompt diverge, and the version skew shows up as branches that disagree about policy.
Coordination is the line that never appears in anyone's estimate. On the model above the lead agent is $0.232 in the independent case and $0.608 in the coupled case, 22% and 25% of the total, and it produces no primary output. It writes briefs, reads reports and synthesises. That is a real service, but price it as one, and compare it against the same tokens spent by a single agent actually doing the work. Its failure mode is the misbriefing above, silent by construction.
The debugging surface is the cost that compounds. A single agent produces one ordered transcript: step 7 did this, cost this, took this long, and the SQL to see it is in the reference architecture's journal schema. A four-agent system produces four transcripts plus the messages between them, and the interesting question is almost always the interleaving. Now you need a correlation identifier propagated through every spawn, a parent-child relationship in your span tree, and a way to reconstruct global ordering from four clocks. That is real distributed-systems work, roughly a week of engineering, and skipping it leaves your on-call engineer with four logs and no way to line them up.
And the cost model multiplies. A per-agent step budget does not bound a tree: three agents each allowed 25 steps is 75 steps, and if any can spawn, it is unbounded. The only mechanism that works is a run-scoped token and dollar budget shared atomically across every agent in the tree, decremented before each call, terminating the run into a named budget_exceeded status at zero. Without it, the detection signal for a runaway tree is the invoice.
$ $ agentctl trace 8f3a --tree --with-costrun 8f3a kind=research_brief status=succeeded wall=214s cost=$2.41├─ lead 14 steps $0.608 ctx_peak 61k model=mid│ step 03 delegate -> branch_a brief=8,940 tok│ step 05 delegate -> branch_b brief=9,102 tok│ step 07 delegate -> branch_c brief=8,873 tok│ step 11 REJECT branch_b report (reason: wrong fiscal year)│ step 12 delegate -> branch_b' brief=9,240 tok <-- $0.449 repeat├─ branch_a 13 steps $0.451 ctx_peak 44k FY=2026├─ branch_b 13 steps $0.451 ctx_peak 44k FY=2025 <-- diverged├─ branch_b' 13 steps $0.449 ctx_peak 44k FY=2026└─ branch_c 13 steps $0.451 ctx_peak 44k FY=2026$ $ agentctl diff-brief 8f3a branch_a branch_b --field fiscal_yearbranch_a brief L41: 'the current fiscal year (FY2026)'branch_b brief L39: 'the most recent completed fiscal year'-> lead paraphrased the same constraint two ways. No error was raised.-> cost of the divergence: $0.451 wasted + $0.449 rerun = $0.900 (37% of run)verdict: not a model failure. a briefing failure, invisible to every error metric.
Which multi-agent topology should you use if you genuinely need one?
Orchestrator with stateless workers, in almost every case. It is the only common topology where the state boundary is explicit, the failure semantics are simple, and the cost is boundable. Anthropic's own Research system uses exactly this shape: a lead agent plans, spawns three to five subagents in parallel, and synthesises with a separate citation pass.
The critical property is that workers are stateless and return once. Give each one an explicit input schema, an explicit output schema, its own step and token budget deducted from the run-scoped global budget, and no ability to spawn. That last constraint is not stylistic: recursion turns a bounded cost into an unbounded one, and a boolean field on the worker contract is a cheaper defence than any amount of prompting. A worker that returns structured fields rather than prose also removes one of the two lossy compression steps, because the lead parses data instead of re-reading an essay at $2 per million tokens.
Sequential handoff pipelines are the second defensible shape, and only when each stage transforms rather than reasons: extract, then classify, then draft. They are cheap because no stage carries the others' history, and the failure mode is clean: stage three fails, stages one and two stay valid, and you resume from the journal. The weakness is they cannot backtrack. If stage two made a bad call, stage three has no way to notice.
Peer-to-peer and debate topologies I would avoid outside research settings. They multiply cost by participants times rounds, have no natural termination condition, and Cognition's guidance addresses them directly: parallel actions produce conflicting implicit decisions, and a single-threaded context is usually good enough. On the same token assumptions, a three-participant, three-round debate on a 10-turn task costs roughly $1.90 against $0.36 for one agent. That is a 5x premium for consensus rather than answers, with no failure signal when the participants confidently agree on something wrong.
| Modelled cost, 30-turn task | When it wins | Coordination overhead | Primary failure mode | Verdict | |
|---|---|---|---|---|---|
| Single agent, better tools | $2.08 | Under ~13 turns of total work, or any coupled task | None | Context window fills; tool catalogue crowds out the task at 7,500 tok/turn | The default. Exhaust it first. |
| Orchestrator + stateless workers | $1.20 independent / $2.41 coupled | Independent branches, different permission scopes, or a context firewall | 22-25% of spend | Lead misbriefs a branch: $0.45 of confidently wrong work, no error raised | The only topology I would ship by default |
| Sequential handoff pipeline | $1.05-$1.60 | Stages that transform rather than reason: extract, classify, draft | Near zero, no lead agent | No backtracking. Stage two errs, stage three cannot notice | Good, and underused |
| Peer-to-peer / debate | ~$5.70 (3 peers x 3 rounds) | Research settings and evaluation harnesses | Unbounded, no natural termination | Confident consensus on something wrong; no signal fires | Avoid in production |
| Hierarchical (workers spawn workers) | $4+ and unbounded | Essentially never at current model prices | Multiplies per level | Recursive spawn; cost detected on next month's invoice | Forbid it with a field on the contract |
import { z } from "zod";
/** A worker is a tool that happens to be implemented with a model call.
* It returns once. It holds no state. It cannot spawn. */
export type WorkerSpec<TIn extends z.ZodTypeAny, TOut extends z.ZodTypeAny> = {
name: string;
model: "cheap" | "mid" | "frontier";
tools: string[]; // explicit subset, never the full catalogue
scopes: string[]; // credential scopes, enforced at the gateway
accepts: TIn;
returns: TOut; // structured, so the lead parses instead of re-reading
canSpawn: false; // not a default. a type. no code path sets it true.
maxSteps: number;
};
export type RunBudget = {
/** Shared atomically across EVERY agent in the tree. Per-agent budgets
* do not bound a tree: 3 agents x 25 steps is 75 steps, and if any of
* them can spawn, it is unbounded. */
reserve(tokens: number): Promise<"ok" | "exhausted">;
spentMicros(): Promise<number>;
};
export async function runWorker<TIn extends z.ZodTypeAny, TOut extends z.ZodTypeAny>(
spec: WorkerSpec<TIn, TOut>,
brief: unknown,
budget: RunBudget,
journal: Journal,
): Promise<z.infer<TOut> | { status: "budget_exceeded" | "invalid_brief" }> {
const parsed = spec.accepts.safeParse(brief);
if (!parsed.success) {
// Fail loudly here. A malformed brief silently accepted is the
// $0.45-of-wrong-work failure, and nothing downstream will catch it.
await journal.writeBriefRejection(spec.name, parsed.error.issues);
return { status: "invalid_brief" };
}
// Prove later that every branch got the same constraint.
const briefHash = hashCanonical(parsed.data);
await journal.writeSpawn({ worker: spec.name, briefHash, scopes: spec.scopes });
const estimate = estimateTokens(spec, parsed.data);
if ((await budget.reserve(estimate)) === "exhausted") {
return { status: "budget_exceeded" };
}
const raw = await loop(spec, parsed.data, budget, journal);
return spec.returns.parse(raw); // structured out, or it throws
}What breaks in a multi-agent system that does not break in a single agent?
Nine things, and seven of them return HTTP 200. That is the defining operational property here: the new failure modes are not crashes, they are agreements. Branches that confidently agree, briefs that quietly diverge, syntheses that smooth over contradictions. Your error rate does not move for any of them.
The two that do throw are the easy ones. A worker that exceeds its budget terminates into a named status, and a worker whose output fails schema validation throws at the parse boundary. Both are handled by the contract above. Everything else in the table needs an eval or a purpose-built detector, and those detectors do not exist in any framework I know of. You write them.
The row I would build the detector for first is brief divergence: cheap to catch, expensive to miss. Hash the canonical form of every brief, store the hash on the spawn record, and alert when two branches of the same run got briefs whose constraint fields differ. That is about forty lines. On the model above it catches a failure worth $0.90 on a $2.41 run, 37% of the run, and it is the only detector in this table that pays for itself on a single incident.
The row that will actually page you is the orphaned worker. The lead crashes, three workers keep running, and nobody reads their results. Without a supervision relationship and a heartbeat, you pay for three branches producing output into a void, about $1.35 on the coupled model, and the run sits in a running state forever. The fix is a lease with a heartbeat and a reaper, the same durable-execution machinery from the reference architecture, applied one level up.
| Failure | Only in multi-agent? | Blast radius | Detection signal | Modelled cost | Fix |
|---|---|---|---|---|---|
| Lead misbriefs a branch — same constraint paraphrased two ways | Yes | One branch, silently wrong | Canonical brief-hash diff across branches of the same run | $0.45 wasted + $0.45 rerun | Hash the brief; alert on divergent constraint fields |
| Branches make conflicting implicit decisions (date format, identifier, scope) | Yes | Whole run, silently wrong | Trajectory eval only. No error, no 5xx | $1.35 across three branches | Pass structured constraints, not prose; or use one agent |
| Synthesis smooths over a contradiction between reports | Yes | The answer itself | Judge scoring contradiction handling on sampled runs | Full run cost, and a wrong answer shipped | Require the lead to cite branch and step for each claim |
| Recursive spawn — a worker spawns workers | Yes | The whole budget | Tree depth on the span graph; run-scoped budget exhaustion | $4+ and unbounded | canSpawn: false as a type, plus a global budget |
| Orphaned workers after the lead crashes | Yes | Cost with no output | Lease heartbeat expiry; runs stuck in running | ~$1.35 per abandoned run | Lease + heartbeat + reaper, one level above the worker |
| Per-agent budgets that do not bound the tree | Yes | The whole budget | Sum of per-agent spend versus the run budget | 3x the intended ceiling at three agents | Run-scoped budget, reserved before each call |
| Version skew between three copies of a system prompt | Yes | Policy inconsistency across branches | Prompt hash inventory per deploy | Unbounded — presents as policy violation | One prompt registry; branches reference, never copy |
| A worker holds broader credentials than its role needs | No, but worse | Externally visible, security | Gateway audit: scopes requested versus scopes used | Unbounded | Per-agent scopes enforced at the tool gateway |
| Worker output fails schema validation | No | One branch | Throws at the parse boundary | One branch, one mutated retry | Structured return schema; one mutated retry, then fail |
How do you migrate from one agent to several without rewriting everything?
Extract a subagent as a tool first, and only promote it to an agent when you have measured a reason. The migration path is short if your single agent was built correctly, because the contract for a stateless worker is identical to the contract for a tool: schema in, schema out, budgeted, journalled, idempotent.
Step one is to stop calling it a migration. Take the branch you believe needs its own agent and implement it as a tool that internally runs a bounded model loop and returns a structured result. It is now mechanically a subagent, with its own context, tool subset, model choice and budget, but from the parent's perspective it is just a tool call. Nothing in the parent loop, the journal schema or the observability changes. This gets you conditions two, three and five from the five-question test at zero architectural risk.
Step two is to measure the thing you assumed. Instrument the tool with its own token and cost lines and compare against the single-agent baseline for the same tasks. Most of the time the answer is that the branch is short, the brief is large, and the split loses money. That is a two-day experiment producing a number, versus a two-month rewrite producing an opinion.
Step three, only if the numbers hold, gives the worker true parallelism and independent failure handling. That is where you take on the distributed-debugging work: correlation identifiers, span parentage, global ordering, the brief-hash detector, the run-scoped budget and the reaper. Budget about a week and a half for that layer alone. If you are doing this under time pressure with a team that has never built a distributed system, that is exactly what AI product development services exist for, and the honest advice in most of those conversations is that steps one and two are the whole answer.
- Days 1‑2Extract the branch as a tool
Bounded internal loop, structured input and output schema, its own tool subset and model tier. The parent loop, journal schema and traces are unchanged. Reversible by deleting one file.
- Days 3‑4Instrument and compare
Token, cost and latency lines for the extracted branch against the single-agent baseline on the same task set. Expect the split to lose money below about 13 turns of total work. Two days for a number instead of two months for an opinion.
- Week 2Add the run-scoped budget
One atomic counter, shared across every agent in the tree, reserved before each call, terminating into budget_exceeded. Do this before parallelism, not after: it is the only mechanical bound on a tree.
- Weeks 3‑4Parallelism and the distributed-debugging layer
Correlation ids through every spawn, parent-child span relationships, global ordering across clocks, brief-hash divergence detector, lease and heartbeat with a reaper for orphaned workers. About a week and a half, and it has no demo.
- OngoingTrajectory evals on the delegation sequence
Score the ordered sequence of briefs, spawns and reports against a golden path. Final-answer evaluation cannot see seven of the nine failure modes above, because all seven produce a fluent answer.
What should you build instead, most of the time?
One agent with a tool layer good enough that a second agent is not tempting. Nearly every multi-agent proposal I review is a workaround for a tool layer that returns unbounded prose, exposes fifty schemas the agent never uses, and has no way to fetch tools on demand. Fix that and the case for the second agent usually evaporates.
The single highest-leverage change is tool subsetting and on-demand discovery. Anthropic reports that deferring tool definitions and letting the model search for them cut context from 77,000 tokens to 8,700, an 85% reduction, while tool-selection accuracy on their internal evaluation rose from 79.5% to 88.1% on Claude Opus 4.5. That is the same benefit people go multi-agent to get, without a serialisation boundary, a coordination agent or four transcripts to correlate. The tool-layer mechanics are in MCP in production.
The second is bounding tool results at ingestion. A tool that returns 40,000 tokens does not need a subagent to summarise it; it needs head-and-tail truncation with the full payload in an object store and a pointer in the journal. That is an afternoon. The subagent version is a week of engineering, adds a lossy compression step, and costs about 12.6 cents of fixed floor per invocation on the model in this post.
The third is unglamorous, and where I would actually start: measurement. My strongest example is not an agent-architecture story at all. Retell AI published a case study of my work on AccioMatrix where a proctoring false-positive rate went from roughly 50% to roughly 15%, about a 70% reduction, integrated in 48 hours. That was signal design and thresholding, not a second agent, and it took 48 hours rather than a quarter because the system was instrumented well enough to see which signal was firing wrongly. The principle holds: most problems that look like they need more agents need better observations, and per-request cost and quality attribution is the cheapest instrument you can build. The full method is in how routing and caching actually price a request.
- On-demand tool discovery: Anthropic reports 77K to 8.7K tokens, 85% less context, with tool-selection accuracy up from 79.5% to 88.1% on Opus 4.5
- Bound tool results at ingestion: head and tail, full payload to object storage, pointer in the journal. One afternoon
- Structured tool returns instead of prose, so nothing has to be re-read at $2 per million tokens
- Per-agent allowlist at the gateway: the permission benefit of multi-agent without the second agent
- Context compaction with the last two observations preserved verbatim
- Cost and quality attribution per request, which is what tells you whether any of this worked
- A coordination agent at 22-25% of spend that produces no primary output
- $0.126 of fixed floor per extra agent before it does anything useful
- Two lossy compression steps per branch: brief in, report out
- A distributed-debugging layer that is roughly a week and a half of engineering with no demo
- Seven failure modes that return HTTP 200 with a fluent answer
- A cost model that multiplies rather than adds, unbounded without a run-scoped budget
Multi-agent vs single-agent: common questions
→When should you use a multi-agent system instead of a single agent?
When at least four of five conditions hold: the subtasks are genuinely independent and never read each other's intermediate results, the roles need different tool or permission scopes, at least one branch needs its own context budget because it reads far more than it returns, a branch failing without killing the others produces a genuinely useful partial result, and the roles need different models. Independence and permission scope are the two that carry real weight. Fewer than four and you are buying coordination overhead for nothing.
→Is a multi-agent system more expensive than a single agent?
Not always, and the common claim that it is comes from an unfair comparison. Splitting contexts breaks the quadratic cost of re-sending one long history, so on a modelled 60-turn task at mid-tier August 2026 prices, three independent agents cost about $3.15 against about $7.12 for one. But once the branches are coupled and need the full shared brief every turn, and one branch in three has to be rerun, that same task costs about $5.53 with worse answer quality. Below about 13 turns of total work, one agent wins outright.
→Does Anthropic's 15x token figure mean multi-agent costs 15 times more?
No, and this is the most commonly misread number in the field. Anthropic's published figure compares its multi-agent Research product to a normal chat interaction, a completely different amount of work, not to a single agent doing the same research task. It also reports that token usage alone explains about 80% of performance variance in that system, so the multi-agent gain is substantially a test-time-compute gain. Model your own workload rather than importing the multiplier.
→What is the difference between a subagent and a tool?
State and lifetime. A subagent invoked with a fixed input schema, which returns once, holds no state and cannot spawn, is functionally a tool that happens to be implemented with a model call. That is the shape most successful production systems run. If the second agent has a conversation, holds state across calls, or can spawn further agents, it is a genuine multi-agent system, and it brings the whole distributed-debugging and budgeting problem with it.
→How do you budget a multi-agent system so it cannot run away?
With a run-scoped token and dollar counter shared atomically across every agent in the tree, reserved before each model call, terminating the whole run into a named budget_exceeded status when it hits zero. Per-agent budgets do not bound a tree: three agents at 25 steps each is 75 steps, and if any of them can spawn, it is unbounded. Also make non-spawning a type-level property of the worker contract rather than a runtime flag, because a recursive spawn multiplies cost rather than adding to it and the detection signal is next month's invoice.
→How do you debug a multi-agent system?
You need three things that do not come with any framework: a correlation identifier propagated through every spawn, parent-child relationships in your span tree so you can reconstruct a global ordering from several clocks, and a canonical hash of every brief stored on the spawn record. The brief hash is the one to build first: roughly forty lines, and it catches the single most common silent failure, where the lead agent paraphrases one user constraint two different ways to two branches and nothing errors.
→Should I use LangGraph, CrewAI or the Claude Agent SDK for multi-agent?
The framework is not the decision. LangGraph, CrewAI, AutoGen and the Claude Agent SDK all give you real things: graph execution, handoffs, subagent spawning, session persistence, MCP integration. But none gives you a run-scoped budget shared across the tree, a brief-divergence detector, per-agent credential scoping at a gateway, or trajectory evals over the delegation sequence. Those four decide whether a multi-agent system is operable, and you write all of them yourself regardless of framework.