I split agents by what they must not see, not by job title

A CTO agent and an engi­neer agent on the same model run on the same weights; only their system prompts differ. I don’t see how the title adds expertise. What it does add is a hand­off, and every hand­off passes on a sum­mary that loses detail. Yet the agent com­pa­nies are built on titles. Paperclip’s README puts it plainly: “Your agents have a boss, a title, and a job description.” MetaGPT and ChatDev work the same way, and Claude Code has agent teams. This might be an arti­fact of a com­pany orga­nized around human work, not agent teams.

A role team: three titles, one model
CTO
its own system prompt
detail
summary
Engineer
its own system prompt
detail
summary
QA engineer
its own system prompt
detail
One model underneath: the same weights in every role
Three titles on one set of weights. Each arrow is a hand­off that loses detail, and the titles buy noth­ing in return.

My setup with roles:

A role teamMy setup
CTOA lead session that watches the builder and checks its claims
EngineerOne builder that owns the change from start to finish, tests included
QA engineer or code reviewerBlind critics, each a fresh session that returns one verdict
CEO / boardMe

My setup hands off too, and loses detail like any other: the builder starts from a writ­ten task, and what reaches me is the lead’s summary. So the ques­tion isn’t whether a split costs detail, but whether it buys some­thing worth that. A role team splits by job title. I split only where a sep­a­rate agent gets some­thing a single one can’t: an inde­pen­dent review or truly par­al­lel work. In the review, the lost detail is the point: the crit­ics never see the builder’s account of its own work.

Where I split, and what each split buys
An independent review
Builder
the commit and the criteria
its own account, kept out
Critic

The critic judges the work, never the builder’s story about it.

Truly parallel work
Agent A
task A
Agent B
task B

Only for work that doesn’t depend on any­thing else in flight.

Each split buys some­thing a single agent can’t have. A job title buys neither.

Why a title might not help

A com­pany has roles because one person can’t know every­thing or be in two places at once.

Berkeley’s MAST study anno­tated more than 1,600 runs of seven multi-agent frame­works, ChatDev and MetaGPT among them. The authors call the gains on pop­u­lar bench­marks “often min­i­mal” and sort the fail­ures into 14 modes in three groups: system design, mis­align­ment between agents, and check­ing the work.

Anthropic, which built a multi-agent research system, counted the cost: agents use about 4× the tokens of a chat, multi-agent sys­tems about 15×. It also says where they don’t fit:

Some domains that require all agents to share the same con­text or involve many depen­den­cies between agents are not a good fit for multi-agent sys­tems today. For instance, most coding tasks involve fewer truly par­al­leliz­able tasks than research, and LLM agents are not yet great at coor­di­nat­ing and del­e­gat­ing to other agents in real time.

Cognition’s case against multi-agent sys­tems comes down to two principles:

Share con­text, and share full agent traces, not just indi­vid­ual messages

Actions carry implicit deci­sions, and con­flict­ing deci­sions carry bad results

A team organ­ised by job title breaks both by design. Each role hands the next one a sum­mary instead of its trace: the engi­neer gets the CTO’s task, not the rea­son­ing behind it. And each role makes deci­sions the others never see, so the next one can act against them with­out knowing. My crit­ics see even less, on pur­pose, but they don’t build anything. One builder makes every deci­sion in the change, and the crit­ics only judge it.

Two exper­i­ments put a split setup next to a single owner. Matt Shumer’s Claude of Duty tried both on one artifact. Three rounds of six par­al­lel agents took its defects from 60 to 47 and back up to 66. One sequen­tial pass by a single owner cut them from 66 to 26.

The Co-Coder paper ran Claude Code’s agent teams against a single sequen­tial agent: 16.3% against 20.1% on CodeProjectEval, and 54.1% against 56.8% on DevEval. The paper’s own system, Co-Coder, splits the work too, but differently. Before any agent starts, it maps which files depend on which and hands each agent a group of files that mostly stand alone. That split beat the single agent on qual­ity, speed and cost. The dif­fer­ence is depen­den­cies: agent teams divide the work and then coor­di­nate as they go, while Co-Coder splits only where the parts barely depend on each other. That’s the split Anthropic’s warn­ing leaves room for, and the only kind of par­al­lel work I split for.

Where a role split pays: the review

A code reviewer on the same model, start­ing from the same fram­ing as the engi­neer, is likely to miss what the engi­neer missed. In ChatDev, the code reviewer gets the team’s ideas from ear­lier phases along with the code, runs on the one model the whole com­pany uses, and sends its com­ments straight back to the programmer. My crit­ics are set up the other way round:

The clos­est study I’ve found is a preprint by Tae-Eun Song. One fresh same-model review plus one cross-model review found 56.7% of planted errors, against 42.7% for two fresh same-model reviews (p = .006; 30 arti­facts, 150 planted errors, 900 review ses­sions). What it can’t tell is whether the gain comes from a fresh model or a stronger one. The mixed pair didn’t find sig­nif­i­cantly more than two reviews by the strongest out­side model, and a light­weight out­side model did no better than a review by the same model.

Claude Code has a second model built in, the advi­sor, and its docs sug­gest it for “tasks you want inde­pen­dently checked before Claude declares them done.” The main reason I don’t use it as a reviewer is its input:

The advi­sor receives the full con­ver­sa­tion, includ­ing every tool call and result, and returns guid­ance that Claude applies before continuing.

That is the ses­sion’s whole con­ver­sa­tion so far, not a fresh context. By the time the advi­sor is called, it holds the builder’s plan, its fram­ing of the prob­lem and its account of what it did, so the review starts from the builder’s story, the one thing my crit­ics are kept away from. The other dif­fer­ences matter less. Claude calls it mid-task, when it decides to, and no set­ting forces a call. It runs with­out tools, so it can’t run anything. And every model it accepts is a Claude model, ranked at or above the one doing the work. It’s a rea­son­able second opin­ion mid-task. As a merge gate, it arrives contaminated.

The one mea­sure­ment I know of doesn’t back me up yet. In Song’s preprint, a model review­ing its own work in the ses­sion that pro­duced it found about as many planted errors as a fresh ses­sion (F1 27.1% against 28.6%, not a sig­nif­i­cant dif­fer­ence). The errors in that study were planted, though, so the ses­sion had never claimed its work was proven. A claim like that is exactly what my crit­ics never see. I wrote up the advi­sor’s gaps, and the panel I built for deci­sions, in an earlier post.

What the reviewer sees
Builder’s session
Reviewer’s context window
The task
The user’s task
The code
All the code
Its plan and framing
The team’s ideas from earlier phases
Its report: “Proven locally”
Not passed on
Runs thingsNo: it comments on the code. A separate test engineer runs it
ModelThe same as every other role: ChatDev takes one model for the whole company
Started byThe next phase in the chain, after coding
Verdict goes toStraight back to the programmer

It starts from the same fram­ing as the pro­gram­mer, on the same model, and reads the code instead of run­ning it.

One code fix, two critics

In late October a builder changed the fiscal-receipt add-on in my shop’s ERP, so that copies of the pro­duc­tion data­base can’t issue real receipts or keep real credentials. Its report said “Proven locally”. That was true as far as it went, and nobody who read it saw what it left out. Both crit­ics found it, inde­pen­dently and blind: pass­words and other cre­den­tials still sat in cashier sign-in log rows. Astra also found two receipt-download calls that skipped the new guard, and wrongly called a key ID a cre­den­tial; the lead ses­sion caught that mis­take in the vendor’s spec and dropped the finding. After one repair round both crit­ics passed the change, and I merged it.

One change, step by step
Swipe sideways to step through.
Memerges
Leadchecks claims
Builderowns the change“Proven locally”
Fablecritic
Astracritic
Step 1 of 5
The builder reports

The change stops copies of the pro­duc­tion data­base from issu­ing real receipts or keep­ing real credentials. The report is true as far as it goes, and nobody who reads it sees what it leaves out.

Read the work, not the agent’s account of it

That’s the rule I take from this project. Nobody caught the gap by read­ing the builder’s report, and the lead agent caught Astra’s mis­take by read­ing a spec document. So read­ing isn’t the prob­lem: read­ing the code, the data or the vendor’s spec is part of checking. What fails is read­ing what an agent says about its own work. One of my stand­ing rules puts it this way: “a worker’s sum­mary says what it intended to do, not what it did.”

The rule has a second half, because some­one still ends up read­ing a sum­mary, and at the top that’s me. A sum­mary is safe to read when it car­ries evi­dence that can be re-run and some­one has actu­ally re-run some of it. The lead’s sum­mary to me links the crit­ics’ ver­dicts and the com­mands behind them, and before writ­ing it, the lead re-ran the proof itself on a clean copy.

I needed the same rule for this post. I had asked a Claude Code ses­sion about role teams, and its answer said my own mea­sure­ments had twice shown a single agent beat­ing a split team. They hadn’t. Shumer’s run and the Co-Coder paper, and in the second the paper’s own split beat the single agent. The answer was con­fi­dent and easy to read, and read­ing it didn’t catch the error. Tracing every claim in this post to its source did.

Where role teams are ahead

For changes to pro­duc­tion soft­ware, I think my setup beats a role team. For run­ning many unre­lated work­streams with nobody watch­ing, role-team tools have machin­ery mine lacks.

In Paperclip, agents wake on heart­beats or on a sched­ule, tasks link up to com­pany goals, and com­pany, agent and project bud­gets pause work at set limits. My equiv­a­lent is one overnight queue that gives each task a fresh Opus 5.5 builder, with Fable and Astra judg­ing blind. Everything else starts when I start it, so I am the bottleneck.

For gen­uinely dif­fer­ent domains, such as sup­port, mar­ket­ing or oper­a­tions, a role means dif­fer­ent tools, data and con­text, and split­ting there is right. My two Slack agents for the shop are split that way.

And the review costs money. I pay for it on pur­pose, but not on every merge:

TierFor a change whereReview
Fulla mistake could reach money, customer data, fiscal records or credentials before anyone notices, and can’t be undone in minutesBoth critics, plus a design check before any code is written
Lightthe change reaches users or runs unattended, but a mistake would show and could be undoneOne fresh Claude Opus
Nonea preview and a one-click rollback cover itNo critic

Each repo declares its tier by what a change touches, and the lead may raise it but never lower it with­out me.

Song’s preprint is why I think one fresh critic is a real review: a top-tier cross-model reviewer did not score sig­nif­i­cantly dif­fer­ently from a fresh same-model ses­sion, and the two found partly dif­fer­ent errors. The second vendor is the extra I pay for where a mis­take is hard­est to undo.

Paperclip also lets you choose a model per agent, so a role team could review across model families. The issue is what the team is organ­ised around, not the tool.

What would settle it

I haven’t yet run the two setups head to head. Settling it would take the same task given to a role team and to a setup like mine, judged by the same two blind critics. This is a task for my fur­ther research.