<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Engineering Notes]]></title><description><![CDATA[Engineering notes on multi-agent coordination, AI infrastructure, and organizational design for agent systems]]></description><link>https://blog.adrq.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/69b44e3d6e27dd07d92bbf57/05f9957d-bdd0-4210-b08f-c5a15e7dfd1b.png</url><title>Engineering Notes</title><link>https://blog.adrq.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 02:20:44 GMT</lastBuildDate><atom:link href="https://blog.adrq.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Your AI Agents Need an Org Chart]]></title><description><![CDATA[You start out with one agent. As you embrace the productivity boost you tolerate the small failures, after all, the working label has a nice shimmer effect on your terminal, and you start delegating m]]></description><link>https://blog.adrq.dev/your-ai-agents-need-an-org-chart</link><guid isPermaLink="true">https://blog.adrq.dev/your-ai-agents-need-an-org-chart</guid><category><![CDATA[ai agents]]></category><category><![CDATA[multi-agent systems]]></category><category><![CDATA[claude-code]]></category><category><![CDATA[distributed systems]]></category><category><![CDATA[codex]]></category><dc:creator><![CDATA[Adrian Quiroga]]></dc:creator><pubDate>Thu, 09 Apr 2026 14:30:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69b44e3d6e27dd07d92bbf57/bdd08222-ae06-4df0-a2aa-787772cbf5cc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You start out with one agent. As you embrace the productivity boost you tolerate the small failures, after all, the <em>working</em> label has a nice shimmer effect on your terminal, and you start delegating more and more. Your agents start spawning subagents, but you can't sit still.</p>
<p>You want MORE AGENTS. So you start divvying up your backlog, proliferating worktrees, and suddenly you're juggling fourteen terminals and acting like a human clipboard while slowly losing your mind. What if you could <em>orchestrate</em> your agents?</p>
<p>The industry is in a mad rush to solve this, coming at it from wildly different angles. Turns out orchestration needs two things: agents that can delegate work down (and keep going deeper), and agents that can talk to each other.</p>
<p><a href="https://code.claude.com/docs/en/agent-teams">Claude Code's Agent Teams</a> got the communication part right, any agent can message any other. But delegation is capped at one level. <a href="https://developers.openai.com/codex/multi-agent/">Codex</a> went the other direction with configurable depth, agents all the way down, but locked communication to parent-child only. Siblings are invisible to each other, everything routes through the boss. Perhaps the most sophisticated agent orchestrator, <a href="https://github.com/steveyegge/gastown">Gas Town</a>, ships with free messaging and a deep role hierarchy — nearly 400,000 lines of code worth of orchestration. But the agent that delegates the work doesn't own what it delegated. It can't terminate a subtree, can't choose how to recover from a failure. Crash recovery, termination, completion are all handled by a separate monitoring stack.</p>
<p>In a company, when your direct report's project goes sideways, you handle it. You don't wait for some monitoring department to notice and restart them. You decide: reassign, retry, or cut your losses. An org chart encodes who is responsible for what, not who can talk to whom.</p>
<p>I've been building an orchestrator that separates the two.</p>
<h2>What happens without authority</h2>
<p>The research on multi-agent coordination is starting to pile up, and the failure modes keep pointing in the same direction: Authority gaps.</p>
<p>A benchmark called <a href="https://arxiv.org/abs/2601.13295">CooperBench</a> tested what happens when peer coding agents work together as equals: no manager, no hierarchy, just a shared communication channel. Success rates were 30% lower on average than agents working alone. More agents made it worse, monotonically. Two agents succeeded 68.6% of the time. Three agents: 46.5%, four agents: 30.0%. The interesting part is that communication wasn't the bottleneck. Agents used the channel extensively, burning up to 20% of their action budget on messages, and it actually helped with merge conflicts (29.4% conflict rate vs. 51.5% without). But they couldn't converge on what to build. The paper sorts the gaps into three categories: agents acknowledge each other's plans then proceed as if nothing was said (expectation), agents claim work as done when it isn't (commitment), and agents fail to reach a shared answer at all (communication). The shared root cause is that no agent had the standing to decide what gets built, verify what got done, or call a halt when things went sideways. These were teams with Slack but no manager.</p>
<p>An <a href="https://arxiv.org/abs/2503.13657">analysis of over 1,600 execution traces</a> across seven multi-agent frameworks found that nearly one in five failures are termination-related: agents that don't know when to stop (12.4%), or stop too early (6.2%). In org chart terms: nobody to say "this project is done" or "this project is cancelled."</p>
<p>When these gaps compound, the numbers get ugly. A <a href="https://arxiv.org/abs/2512.08296">Google Research study</a> found that independent multi-agent systems amplify errors 17.2x compared to single-agent baselines. Centralized coordination, where one agent has authority to intervene and redirect, reduces that to 4.4x. (A caveat: every multi-agent variant degraded sequential reasoning tasks by 39-70%. This advantage is specific to parallel workstreams where decomposition and oversight matter most.)</p>
<p>You can see the gap in production too. Codex CLI has documented <a href="https://github.com/openai/codex/issues/12491">zombie processes</a>: 1,319 orphaned agents and 37GB of leaked memory, spawned with no authority to reclaim them. <a href="https://github.com/langchain-ai/deepagents/issues/694">Deep Agents</a> shipped async subagents with a cascade cancellation bug where one failure cancels all parallel siblings, an example of authority flowing the wrong direction. These problems are showing up throughout the industry.</p>
<h2>Intent flows down, outcomes flow up</h2>
<p>Telecom engineers hit this problem decades before AI agents existed. When you're running a telephone switching system with thousands of concurrent processes, some of them will crash at odd hours with no one around to fix it. The solution, formalized in Erlang's <a href="https://erlang.org/download/armstrong_thesis_2003.pdf">supervision trees</a>, was a structural principle: if process A creates process B, then A is responsible for B. Not as a design preference, as an architectural requirement. That responsibility relationship, replicated at every level, produces a tree. The core rule was the same one every org chart encodes: the entity that creates is responsible for what it created. OpenAI's <a href="https://github.com/openai/symphony">Symphony</a> inherited this directly, built on Elixir which runs on the same runtime as Erlang.</p>
<p>In a <a href="https://blog.adrq.dev/multi-agent-coordination-primitives">previous post</a> I argued that <code>create</code> and <code>destroy</code> need infrastructure. The next question is what that infrastructure produces when you go deep — not one level of delegation, but three, five, ten.</p>
<p>A useful way to think about this is information flow. In any hierarchical organization the <em>intent</em> tends to flow down and the <em>outcomes</em> flow up.</p>
<p>When a parent delegates, the child inherits the goal. When a parent terminates, that intent cascades through the entire subtree. Delegation and termination are both downward flows: one says "do this," the other says "stop." At the same time, outcomes flow up. When a child finishes or fails, the result surfaces to the parent. The parent absorbs it — retry, redelegate, or move on. A grandchild failure is the child's problem unless the child fails too. Each level of the tree filters the complexity below it, which is what makes deep delegation viable: whoever is at the root doesn't need to monitor every leaf. They manage one agent. That agent manages its own.</p>
<p>One important caveat is that while this authority tree should constrain who can terminate, recover, and verify lifecycle state, it should not constrain who can talk. Any agent should be able to message any other, like Slack in a company. You don't need your manager's permission to DM a colleague in another department. <a href="https://block.xyz/inside/from-hierarchy-to-intelligence">Block just articulated the same separation</a> for their entire company: AI handles information routing, authority relationships persist.</p>
<p>Where are the current frameworks on this? Closer than you'd think. The spawn is there. Crash notifications exist. But cascade, recovery authority, and lifecycle reporting aren't in the delegation chain yet. Any framework with parent-child spawning is one architectural step from a full authority model. The gap is smaller than it looks.</p>
<h2>What this looks like in practice</h2>
<p>I've been building this separation into an orchestrator called <a href="https://github.com/adrq/agentbeacon">AgentBeacon</a>. The coordination surface an agent sees is two MCP tools:</p>
<pre><code class="language-rust">fn delegate_schema() -&gt; JsonValue {
    json!({
        "name": "delegate",
        "title": "Delegate",
        "description": "Assign work to a child agent. Returns immediately with a session_id.",
        "inputSchema": {
            "type": "object",
            "properties": {
                "agent":  { "type": "string", "description": "Name of the agent to delegate to" },
                "prompt": { "type": "string", "description": "Task description for the child agent" },
                "cwd":    { "type": "string", "description": "Working directory for child (defaults to parent's cwd)" }
            },
            "required": ["agent", "prompt"]
        }
    })
}

fn release_schema() -&gt; JsonValue {
    json!({
        "name": "release",
        "title": "Release",
        "description": "Terminate a child session and free its resources. Works in any non-terminal state (including while the child is working). Also terminates any descendants.",
        "inputSchema": {
            "type": "object",
            "properties": {
                "session_id": { "type": "string", "description": "The session ID of the child to release (returned by delegate)" }
            },
            "required": ["session_id"]
        }
    })
}
</code></pre>
<p><em>Source: <a href="https://github.com/adrq/agentbeacon/blob/8c4fb4a01e3ccd00de13db86ab6986b868c628e7/scheduler/src/api/mcp_tools.rs#L530-L554">delegate_schema</a>, <a href="https://github.com/adrq/agentbeacon/blob/8c4fb4a01e3ccd00de13db86ab6986b868c628e7/scheduler/src/api/mcp_tools.rs#L494-L510">release_schema</a></em></p>
<p>That's the whole coordination API. Everything else the infrastructure handles silently: cascade termination follows the delegation chain, crash recovery retries with a configurable budget or fails upward and notifies the parent, and when a child is terminated the system reports whether the exit was clean or interrupted. The agent delegates and releases. The system handles the rest.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/69b44e3d6e27dd07d92bbf57/536ecb58-81a9-459c-8653-55737168bc71.png" alt="AgentBeacon dashboard showing delegate and release MCP tools in use" /></p>
<p>The schemas above are the whole API. I run my own delegation workflows on it, and <a href="https://github.com/adrq/agentbeacon">AgentBeacon is open source</a> if you want to do the same. It's early — expect the rough edges that come with that — but the structural claim is testable today.</p>
<h2>The interface boundary</h2>
<p>This ownership structure changes more than reliability. It changes how humans interact with agent teams.</p>
<p>If each parent owns its children and absorbs their complexity, the human only needs to talk to the root. Not every agent, not every terminal. No more acting as a human clipboard between seven sessions. The tree becomes the interface boundary between human judgment and agent execution.</p>
<p>But that boundary creates a new problem. When agents can reliably execute deep hierarchies of work, the failure mode shifts. The bottleneck isn't crashes or zombies anymore, it's agents <a href="https://x.com/thdxr/status/2037158294792319164">working on the wrong things</a>. Without a structured way for agents to surface decisions upward, more agent capacity just means more wrong work, faster.</p>
<p>An org chart tells you who is responsible for whom. It doesn't tell you when to pick up the phone. That's the next question: what happens when you replace the chat window with a structured decision queue.</p>
]]></content:encoded></item><item><title><![CDATA[Multi-Agent Coordination Primitives]]></title><description><![CDATA[How many coordination primitives does your multi-agent framework need? The field is converging on a shared goal of effective multi-agent coordination but seems unsure about the mechanisms to get there]]></description><link>https://blog.adrq.dev/multi-agent-coordination-primitives</link><guid isPermaLink="true">https://blog.adrq.dev/multi-agent-coordination-primitives</guid><dc:creator><![CDATA[Adrian Quiroga]]></dc:creator><pubDate>Thu, 19 Mar 2026 14:30:00 GMT</pubDate><content:encoded><![CDATA[<p>How many coordination primitives does your multi-agent framework need? The field is converging on a shared goal of <em>effective multi-agent coordination</em> but seems unsure about the <em>mechanisms to get there</em>.</p>
<p>There is a pervasive sense of re-invention and confusion between scaffolding tools and real coordination primitives. The coordination surface of current AI agent frameworks ranges from a handful of tools to over a dozen operations, without clear agreement on the fundamental operations that multi-agent coordination systems need. Where do you draw the line?</p>
<p>See for example:</p>
<ul>
<li><strong><a href="https://code.claude.com/docs/en/agent-teams">Claude Code Agent Teams</a></strong> (Anthropic, experimental): <a href="https://gist.github.com/kieranklaassen/d2b35569be2c7f1412c64861a219d51f">13+ operations</a> — <code>spawnTeam</code>, <code>cleanup</code>, <code>write</code>, <code>broadcast</code>, <code>approvePlan</code>, <code>rejectPlan</code>, <code>requestShutdown</code>, <code>approveShutdown</code>, task management (<code>TaskCreate</code>, <code>TaskUpdate</code>, <code>TaskList</code>, <code>TaskGet</code>), shared task boards, file-based mailboxes, dependency tracking, plan approval workflows.</li>
<li><strong><a href="https://developers.openai.com/codex/multi-agent/">Codex CLI</a></strong> (OpenAI, experimental): <code>spawn_agent</code>, <code>send_input</code>, <code>wait_agent</code>, <code>close_agent</code>, <code>resume_agent</code>, <code>spawn_agents_on_csv</code> (hierarchical parent-child, configurable depth, no peer messaging).</li>
<li><strong><a href="https://github.com/steveyegge/gastown">Gas Town</a></strong> (by Steve Yegge): role-based hierarchy (Mayor, Polecats, Refinery, Witness, Deacon, Crew), Beads (Git-backed work tracking), Hooks (work queues), GUPP, Sweeps, Agent Mail integration.</li>
<li><strong><a href="https://docs.crewai.com/en/concepts/collaboration">CrewAI</a></strong>: delegation tools (Delegate work to coworker, Ask question to coworker), hierarchical process with manager agent, sequential process, Flows with <code>@router</code> conditional routing, role/goal/backstory agent definitions.</li>
<li><strong><a href="https://docs.langchain.com/oss/python/langgraph/overview">LangGraph</a></strong>: edges, conditional routing via <code>add_conditional_edges()</code>, state with reducers, checkpointing, <code>Send</code> for dynamic fan-out, <code>Command</code> for programmatic control.</li>
<li><strong><a href="https://google.github.io/adk-docs/agents/multi-agents/">Google ADK</a></strong>: <code>SequentialAgent</code>, <code>ParallelAgent</code>, <code>LoopAgent</code> (workflow agents), <code>AgentTool</code>, <code>transfer_to_agent()</code>, shared session state.</li>
</ul>
<hr />

<p><strong>TLDR</strong>: You only need two coordination primitives. The rest is either communication (let the model handle it) or human interface (a separate concern).</p>
<h2>Computer Science meets Organization Theory</h2>
<p>Both computer science and organizational design theory have studied coordination for decades — different vocabularies, different concerns, but overlapping conclusions. The recurring patterns across both traditions converge on the following 11 primitives.</p>
<table>
<thead>
<tr>
<th>Primitive</th>
<th>What it is</th>
</tr>
</thead>
<tbody><tr>
<td><strong>TELL</strong></td>
<td>Assert information to another agent<br /><em><a href="https://en.wikipedia.org/wiki/Actor_model#Fundamental_concepts">Actor model</a> send; <a href="https://en.wikipedia.org/wiki/Henry_Mintzberg">Mintzberg</a> informal communication</em><br />→ Agent Teams <code>message</code>, <code>broadcast</code>; Codex <code>send_input</code>; LangGraph shared state with <code>add_messages</code> reducer</td>
</tr>
<tr>
<td><strong>ASK</strong></td>
<td>Request information or action<br /><em><a href="https://en.wikipedia.org/wiki/Foundation_for_Intelligent_Physical_Agents">FIPA</a> <code>request</code>; <a href="https://en.wikipedia.org/wiki/Communicating_sequential_processes">CSP</a> input</em><br />→ CrewAI Ask question to coworker; ADK <code>AgentTool</code> (wraps agent as callable tool)</td>
</tr>
<tr>
<td><strong>CREATE</strong></td>
<td>Spawn a child, establish authority<br /><em><a href="https://en.wikipedia.org/wiki/Actor_model#Fundamental_concepts">Actor model</a> create; Unix <a href="https://en.wikipedia.org/wiki/Fork_(system_call)"><code>fork()</code></a></em><br />→ Agent Teams <code>spawnTeam</code>; Codex <code>spawn_agent</code>; Gas Town Mayor dispatches work</td>
</tr>
<tr>
<td><strong>DESTROY</strong></td>
<td>Terminate a child and subtree<br /><em><a href="https://en.wikipedia.org/wiki/Erlang_(programming_language)">Erlang supervision trees</a> <code>terminate_child</code>; Unix <a href="https://en.wikipedia.org/wiki/Kill_(command)"><code>kill()</code></a></em><br />→ Agent Teams <code>requestShutdown</code>; Codex <code>close_agent</code></td>
</tr>
<tr>
<td><strong>CLAIM</strong></td>
<td>Atomically acquire exclusive access<br /><em><a href="https://en.wikipedia.org/wiki/Linda_(coordination_language)">Linda</a> <code>in</code></em><br />→ Agent Teams task claiming (file-locked). Rare in practice — see below.</td>
</tr>
<tr>
<td><strong>SYNC</strong></td>
<td>Block until agents converge<br /><em><a href="https://en.wikipedia.org/wiki/Communicating_sequential_processes">CSP</a> parallel composition</em><br />→ Codex <code>wait_agent</code>; LangGraph <code>Send</code> fan-out + superstep convergence</td>
</tr>
<tr>
<td><strong>ESCALATE</strong></td>
<td>Transfer a decision upward<br /><em><a href="https://en.wikipedia.org/wiki/Management_by_exception">Management by exception</a>; <a href="https://en.wikipedia.org/wiki/Command_and_control">military C2</a></em><br />→ Agent Teams plan approval requests (teammate submits to lead); LangGraph <code>interrupt()</code> (pauses execution, surfaces to human/parent)</td>
</tr>
<tr>
<td><strong>NEGOTIATE</strong></td>
<td>Iterative exchange to reach agreement<br /><em><a href="https://en.wikipedia.org/wiki/Contract_Net_Protocol">Contract Net Protocol</a> bidding; org theory lateral negotiation</em><br />→ No mainstream framework implements negotiation in the Contract Net sense</td>
</tr>
<tr>
<td><strong>OBSERVE</strong></td>
<td>Monitor for state changes<br /><em><a href="https://en.wikipedia.org/wiki/Linda_(coordination_language)">Linda</a> <code>rd</code>; <a href="https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern">pub-sub pattern</a></em><br />→ Agent Teams shared task boards; ADK shared session state (read-on-demand); LangGraph state channels (nodes read state written by others)</td>
</tr>
<tr>
<td><strong>SCOPE</strong></td>
<td>Define a communication boundary<br /><em><a href="https://en.wikipedia.org/wiki/Communicating_sequential_processes">CSP</a> hiding; <a href="https://en.wikipedia.org/wiki/Multi-agent_system">MOISE+</a> structural dimension</em><br />→ Agent Teams file-based mailboxes; Gas Town Rigs; LangGraph subgraphs (own state schema); CrewAI crew boundaries (agents scoped to a crew)</td>
</tr>
<tr>
<td><strong>REPORT</strong></td>
<td>Send aggregated status upward<br /><em><a href="https://en.wikipedia.org/wiki/Contract_Net_Protocol">Contract Net Protocol</a> report phase</em><br />→ Agent Teams task status updates; Codex parent-child result return</td>
</tr>
</tbody></table>
<p>This list probably isn't perfect. Some of these may collapse into each other, others may be missing. But it gives us something to work with. The real engineering question is: how many of these actually need to be built out as infrastructure?</p>
<p>Taking inspiration from Richard Sutton's <a href="http://www.incompleteideas.net/IncIdeas/BitterLesson.html">"bitter lesson"</a>, which observes that hand-engineered approaches in AI tend to lose to general methods as computation scales, we can apply a similar lens to agent coordination infrastructure. Some teams are already finding that removing tools sometimes improves performance, not degrades it. We could take this to the extreme and say "no infrastructure is needed", "swarms of autonomous agents will solve everything", but there is no historical precedent for this ever working at scale. I'm talking about undirected, non-hierarchical swarms of entities, building a complex system, and maintaining it over time. Even ant colonies, the canonical example of leaderless coordination, only produce repetitive/stereotypical output, honed by millions of years of evolution. Building complex systems requires authority structures: Linux has a BDFL, Wikipedia has admins, you (probably) have a boss.</p>
<p>I will explore this in more detail in a future post, but to answer the question from earlier we can use a simple heuristic to categorize our coordination primitives. Each primitive above can be categorized as one of:</p>
<ul>
<li>requires infrastructure enforcement</li>
<li>the model can handle it through conversation</li>
</ul>
<p>Out of all the primitives above, only two require external enforcement in an organizational setting: <code>CREATE</code> and <code>DESTROY</code>. The rest can all be reduced to communication when you really stop to think about it. If an agent sends a bad message, it can just correct in the next one. Two agents can negotiate a contract using natural language (whether they adhere to the contract is a separate story, but that applies to all systems where autonomous entities interact). Even synchronization and exclusive access (<code>SYNC</code>, <code>CLAIM</code>), which sound like they might need formal mechanisms, are things that high-functioning teams handle through conversation every day: "I'm working on the auth module, don't touch it" or "let me know when you're done." Think of a well-run Zoom stand up, you don't need to fight over the unmute button, you just talk. But you can't "talk" another team member into existence.</p>
<p><code>CREATE</code> needs infrastructure because it implies resource allocation. In a human org, if you want to add someone to your team, you need to go through the proper channels for recruiting/HR/onboarding/budgeting etc. In a human organization "spawn" means "add to organizational structure" rather than literal "spawn from nothing". In the AI agents world this means "add to coordination unit". Whether the agent is pre-existing (ie. a human being brought in as an employee) or new-to-this-world (fresh AI Agent process), we care about its lifecycle <em>as a part of the organization/coordination unit</em>. For AI agents, spawning a new one means allocating compute, worktrees, auth, process ownership, potentially gigabytes of memory (looking at you Claude Code). A model can make this request, just like you can ask HR to post a job opening, but the organizational infra and process needs to actually set it in motion. "But at my last company we just hired a person on the spot off the street and it worked out great." How big was that company? Two people working in a coffee shop? Non-structured spawning doesn't scale.</p>
<p><code>DESTROY</code> is less obvious. The first instinct might be to think this can just be handled in conversation, and to some extent it can. An agent can send a message to a child agent asking it to shut down, and you can tell your employee to stop what they are doing or fire them. But where conversation breaks down is enforceability. You might have a rogue agent going off script, or an employee who refuses to leave. Human organizations have developed processes and systems to deal with this: cancel ID badge, lock out of company accounts, escort them out of the building. AI agents need similar infrastructure and systems in place to enforce the organizational lifecycle of an entity. If an agent hangs, gets stuck in a loop, or ignores the parent instructions then we need a reliable way to terminate the process. </p>
<p>You may have noticed that the <code>DESTROY</code> primitive appears to be mostly sourced from real engineering implementations. Most theoretical models assume that processes are self-terminating. Process calculi formalized self-completion ie. a process that finishes and becomes inert. The real world is a lot messier. Agent sessions don't always finish, they get stuck in loops, they stop responding. The parent needs a mechanism that works whether or not the child cooperates, for the same reason that a company needs HR procedures for termination and not just a polite message. <a href="https://www.erlang.org/doc/system/sup_princ.html">Erlang's supervision trees</a> and Unix signals both arrived at the same answer: the entity that creates must be able to destroy.</p>
<p>"But if my agent has a Bash tool it doesn't need any infra." Sure, a model with terminal access can technically do anything, including <code>claude -p 'go rogue'</code>. But "technically can" isn't the same as "organizationally should." That's the agent equivalent of you hiring your friend off the street, giving them a desk, no paperwork, and hoping it works out. Maybe some work gets done, but you can imagine how this ends. When things go wrong, there's no audit trail of who spawned what, no resource management, no authority hierarchy, and no guarantee that "fired" actually means fired. Maybe they handed their badge to someone else on the way out. <code>CREATE</code> and <code>DESTROY</code> need to be infrastructure because the organization needs to know what's running, what it costs, and who's responsible for each running entity.</p>
<h2>Two Is All You Need</h2>
<p>If you go back to the framework list from the opening and run each tool through this filter, the same pattern shows up every time. <code>spawnTeam</code> and <code>requestShutdown</code>. <code>spawn_agent</code> and <code>close_agent</code>. <code>fork()</code> and <code>kill()</code>. Everything else, the messaging, the broadcasting, the task boards, the approval workflows and so on is just communication disguised as infrastructure.</p>
<p>Teams are finding that having fewer tools generally improves agent performance. <a href="https://vercel.com/blog/we-removed-80-percent-of-our-agents-tools">Vercel removed 80% of their agent's tools</a> and saw a 3.5x speedup, <a href="https://blog.cloudflare.com/code-mode/">Cloudflare found</a> that agents handle complex APIs better when they write code instead of calling tools directly, and <a href="https://www.anthropic.com/engineering/code-execution-with-mcp">Anthropic measured</a> a 98.7% token reduction when agents have freedom to explore their tools vs. loading all upfront. If this holds for API tools, it applies even more to coordination tools, where each additional primitive is another point of failure in a multi-agent chain.</p>
<p>I have a strong suspicion that frameworks will converge on thinner coordination surfaces over the next few model generations. Infrastructure for authority: who gets created, who gets terminated, and who decides. Conversation for everything else. If this is wrong, adding a tool later is easy. If it's right, frameworks that built tools for negotiation, synchronization, and claiming are carrying dead weight, and that dead weight <a href="https://www.oreilly.com/radar/the-hidden-cost-of-agentic-failure/">compounds</a>. <a href="https://arxiv.org/abs/2512.08296">Google Research found</a> that independent multi-agent systems amplify errors 17.2x compared to single-agent baselines. Each additional coordination step in a chain eats into your end-to-end reliability.</p>
<p>This is a bet on the trajectory of model improvement. Models will keep getting better at communication, but just as in human organizations, the create/destroy, hire/fire operations need to be regulated and enforceable.</p>
<p>In subsequent posts I will show what a system built on these principles looks like in practice, starting with the problem none of these primitives solve: what happens when an organization of agents needs human input?</p>
<h2>Further reading</h2>
<ul>
<li>Kim et al., <a href="https://arxiv.org/abs/2512.08296">Towards a Science of Scaling Agent Systems</a> (Google Research, 2025) — the 17.2x error amplification study</li>
<li>Cemri et al., <a href="https://arxiv.org/abs/2503.13657">Why Do Multi-Agent LLM Systems Fail?</a> (2025) — failure taxonomy across 1,642 execution traces</li>
<li>Joe Armstrong, <a href="https://erlang.org/download/armstrong_thesis_2003.pdf">Making reliable distributed systems in the presence of software errors</a> (2003) — the Erlang/OTP supervision thesis</li>
</ul>
]]></content:encoded></item></channel></rss>