Curriculum/Multi-Agent Systems
The Coordination Tax
Every extra agent needs a message schema, an orchestration policy, shared memory with access control, team evals, and a story for loops. If you cannot name those, you are not ready to multiply agents.
Every extra agent is not “more intelligence.” It is a tax: work you must design, test, and operate because two policies now share a job. If you skip the tax, you still pay it — as incidents, as ping-pong, as a bill you cannot explain.
A single agent already needed a parser, a dispatcher, a stop, and a trace. You paid that in the Agents track. A second agent does not reuse those for free. You need a message the second policy can parse, a rule for whose turn it is, a store both can read with access control, evals that score the job not only the member, and a cap so A asking B asking A cannot melt the card.
If you cannot name those five, you are not ready to multiply agents. You are ready to write a better single-agent prompt, or a sequential workflow with no extra policy.
The five line items
| You must name | If you skip it | Typical symptom |
|---|---|---|
| Message schema | Free-form Slack fanfic between models | The next hop treats a rant as instructions |
| Orchestration policy | Who speaks is a vibe | Loops, silence, two speakers at once |
| Shared memory with access control | Injection and leaked tools | A wiki line becomes a supervisor order; a coder sees refund tools |
| Evals for the team | Each member looks fine; the job fails | Pretty briefs, red tests, thumbs-up on a double refund |
| A story for loops | A asks B asks A until the card melts | Hop count in the thousands; duplicate payloads |
Name all five before you multiply agents. A nickname is not a tax paid.
The coordination taxMessage schema. The interface-as-data lesson will freeze this as a dict: brief, citations, step_id, budget. Here you only need the rule: chat is not a schema. If the only wire is a paragraph, you will debug tone for a quarter.
Orchestration policy. Sequential pipeline, peer handoff with hop limits, or a supervisor star. Pick one and log it. “They will figure it out” is how you get a mesh. This track’s orchestration part exists because this tax line item is a product, not a prompt sentence.
Shared memory with access control. A blackboard keyed by the run, not a 90-turn group chat. Role A may write artifacts. Role B may read ids, not raw dumps, if that is the split. If every role can read and write everything, you undid tool isolation with a side channel.
Team evals. Member-level scores lie. A researcher can pass “has citations” while the coder never gets a usable brief. A critic can pass “left a comment” while the worker ignored it. The job score is: ticket resolved, tests green, no double refund, cost under cap. The evals track will go deep. You still owe the name of that score before you split.
Loop cap. Max hops, illegal edges, duplicate payload hashes, swarm price-before-launch. A story for loops means you can point to the function that returns cannot: ping-pong or priced_swarm launched False. Hope is not a story.
Walkthrough: thin spec versus full spec
A team proposes researcher plus coder for job 17. The thin spec has a schema “we will use JSON” and nothing else. Who speaks after the brief? Unclear. Can the coder read the researcher’s scratchpad? Unclear. How do you know the pair beats one agent? Unclear. What if they bounce the brief? Unclear.
The full spec answers all five. Schema: parse_brief fail-closed. Who next: sequential researcher then coder then tests, code-owned. Memory: brief id on the blackboard; coder cannot fetch raw logs. Team eval: tests green and brief has a citation id and cost under 2× baseline. Loop cap: one handoff, no peer reverse edge.
The thin spec is a slide. The full spec is a product. ready_to_split in the box below is that review encoded as five keys.
Run to execute this in your browser. Nothing is sent to a server.
What printed: the thin spec is ok: False with missing listing who_next, memory_acl, team_eval, and loop_cap. A schema without “who speaks next” is still not a team. The full spec is ok: True with an empty missing list. The checklist is the design review. Add a sixth key in your company if you have a real extra (HITL on money, tenant ACL). Do not remove one of the five because it is hard.
False on a key means “we have not named it,” not “the framework will provide it.” Frameworks give you graphs. They do not give you a team eval or an allow-list for memory.
Budget the tax in dollars
A second agent is rarely “one extra API call.” It is a new queue or child job, a new allow-list to audit, a new parser to fail-closed, a new dashboard slice (role=), a new golden that induces ping-pong, and on-call who must know which policy to freeze. Price that as engineering weeks plus token spend, then compare to the single-agent baseline.
If the quality win is a few points of pass rate and the tax is a new service, you may still split for safety (refund tools off the coder). Safety is a real win. Fashion is not. Write the win in the spec: “billing never clones the repo,” not “we have a team.”
Debate and swarms multiply the tax. Debate is three policies (proposer, opponent, judge) plus evidence plumbing. A swarm is N children plus reduce plus a write barrier. Do not start there. Start with two contracts that differ, sequential code, and this checklist all true.
What goes wrong if you skip a line
Skip schema: injection travels sideways; the coder treats a wiki rant as a patch order.
Skip who-next: two speakers, or zero; hops explode; nobody calls finish.
Skip memory ACL: the planner “just this once” reads customer PII the researcher fetched; or the critic edits src through a shared scratch file.
Skip team eval: each demo looks smart; production double-refunds.
Skip loop cap: the failure-modes lesson’s ping-pong, now with a real card.
How agents use this
Budget the tax in dollars before you budget personas. A second agent that needs a new queue, a new allow-list, and a new eval is a product, not a prompt tweak. Put ready_to_split in the RFC template. If ok is false, the RFC is a single-agent change or a workflow with no extra policy.
Name owners for each line item the way you name an owner for billing. Schema without an owner becomes chat again. Loop cap without an owner becomes a ticket titled “cost exploded.”
When a vendor shows a mesh of agents, translate it onto this table. If they cannot show hop caps and team evals, you are buying the skip column. Stay on one agent until the five keys are true in your repo, not in their GIF.
The rest of this track is how to pay each line item without theatre: typed interfaces, roles with teeth, orchestration you can log, debate and swarms with barriers, and the ways teams fail when you do not.
Check your understanding