Introduction
Add a fifth engineer to a standup and the side conversations don't grow by one, they multiply. Put five AI agents on a coding task together and the same thing happens, except now someone can put a number on it, and a survey just put a dollar figure on what happens when nobody's watching that number.
This post connects three things that are really one problem wearing different hats: a paper that measured agent-to-agent chatter as a temporal network, a survey showing enterprises are already getting burned by uncontrolled agent spend, and an architectural fix that Netflix shipped for microservices a decade ago and never had to think about again.
The Bill Nobody's Watching
A VentureBeat Pulse Research survey of enterprise AI teams published this month found that multi-platform agent orchestration isn't the exception, it's the default — and that default is already costing people money nobody can stop in real time.
Read that last pair of numbers together: a quarter of enterprises have already eaten a runaway bill, and a fifth have no way to stop the next one mid-flight. That's not a tooling gap, it's an architecture gap — and it's the same gap that shows up on the coordination side of these systems, not just the spending side.
The Measured Cost
A paper published this month (arXiv:2608.16801) built an actual instrument for this instead of eyeballing transcripts. The authors modeled 1,902 multi-agent coding runs as temporal networks — agents and files as nodes, every message, read, and write as a timestamped, cost-weighted edge — and varied team size, team structure, and file-access policy across all of them.
Two findings matter here:
- Direct messaging between agents grows close to quadratically as team size increases. This is the N-squared communication-paths problem from human team theory, empirically confirmed for AI agent teams rather than assumed by analogy.
- A large share of that growth happens in an early "introductions" phase, before agents get to substantive, task-relevant collaboration.
The shape of that growth is just combinatorics — every agent added to a fully-connected team creates a new pairwise channel with every existing agent:
Team size doubles from 4 to 8, channel count doesn't double, it goes up 4.6x. That's before counting the "introductions" overhead the paper found sitting on top of it. If you're orchestrating agents by letting them all message each other freely, this curve is not a tuning problem you can throttle your way out of — it's the shape of the topology itself.
We've Solved This Before
This isn't a one-off fix someone at Netflix happened to invent. It's the answer that peer-to-peer coordination converges on every time it stops scaling, and it's been rediscovered independently often enough that it's worth treating as a law rather than a tip: Netflix hit it with microservices a decade ago, and the multi-agent framework world hit the identical wall on its own just two years ago.
Netflix's Content Platform team ran business processes — onboarding a piece of content, say — across many microservices: encoding, metadata extraction, quality checks, licensing, publishing. Their original approach was choreography: services talked to each other peer-to-peer, mostly via pub/sub, each one reacting to events and deciding on its own what happened next. No service owned "the current state of this process" — that state was implicit, scattered across whatever had most recently touched it.
That worked fine while the number of services and the complexity of each process stayed small. It stopped working as both grew. Answering "where is process #48213 right now, and what's it waiting on?" meant reconstructing the answer from logs across every service that might have touched it. Adding one new step meant touching the peer-to-peer wiring inside every service with a stake in that transition — the same N×N coordination cost the coding-agent paper just measured, at a different layer of the stack.
Netflix's fix was Conductor, a workflow engine that plays the Mediator role: services ("workers") stop talking to each other about process state and instead each perform one task, then report the result back to a central coordinator. A Decider component combines a declarative, JSON-defined workflow blueprint with the process's current state to decide what runs next. Workers only ever talk to Conductor — poll a task queue, do their one job, report completion — so they stay decoupled from each other, can be written in whatever language suits the team, and the state of any in-flight process becomes a single query away instead of a log-archaeology exercise. Conductor has since run millions of concurrent workflows at Netflix on that model.
The more telling data point is that nobody had to port Conductor's idea over to get the same answer in the agent world. When LangChain shipped LangGraph about two years ago, its supervisor pattern landed on the identical shape from scratch: a supervisor node owns the graph's state and routes each step to a worker agent, workers report back and never call each other directly, and the supervisor decides what runs next — Conductor's Decider, reinvented by people who were solving a multi-agent problem, not a microservices one. That's a second, independent arrival at the same fix, inside the exact domain this post is about, which is stronger evidence than one company's decade-old war story.
DoorDash hit a related version of this coupling problem on their search stack: a single Elasticsearch process per shard handled both indexing (writes) and query serving (reads), so a burst of merchant updates competed for the same CPU and I/O the shard needed to answer live searches, and the slowest shard set the tail latency for the whole scatter-gather query. Their fix wasn't a mediator, it was splitting write-owning and read-owning responsibilities into independently-scaled services that only communicate through immutable, durable artifacts — but the diagnosis is the same species: two things were sharing a resource they didn't need to share, and no amount of tuning the shared thing fixes an architecture problem.
Choreography's appeal — agents/services react independently, no central bottleneck — is real at small scale. It's exactly what makes debugging and evolving a complex process expensive once it crosses a complexity threshold. Recognizing that threshold before it becomes an incident is the actual skill, whether the participants are microservices or LLM agents.
Two Topologies, Side by Side
Translate Conductor's choreography-vs-mediator distinction directly onto a multi-agent system and you get two topologies for the same team of agents.
Mesh (choreography). Every agent can message every other agent directly. Flexible, no single point of failure, and exactly the topology the paper measured: message count grows close to quadratically, and a chunk of it is agents "introducing themselves" before real work starts.
Five agents, ten channels, and no single place that knows the state of the overall task without reconstructing it from every agent's side of every conversation.
Mediator (orchestration). Agents stop talking to each other and only talk to a central coordinator, which owns task state and routes work — Conductor's Decider, translated to an agent team.
Five agents, five channels — linear instead of quadratic — plus two things the mesh topology has nowhere to put: a shared state store and a budget/kill-switch that sits on the one path every agent's work has to cross.
Why the Mediator Also Fixes the Money Problem
Go back to the VentureBeat numbers: 25% of enterprises already hit by a runaway agent bill, 20% with no real-time kill switch. Look at the mesh diagram again and the reason isn't mysterious — there is no single wire to cut. Any agent in a mesh can independently decide to make another API call, spin up a sub-task, or retry into a loop, and stopping it means reaching into every agent individually, in the middle of however many conversations it's currently having.
The mediator topology puts a budget check and a kill switch on the one path every unit of work has to cross to happen at all. That's not a bolted-on feature, it falls directly out of the topology — the same way Conductor's centralized state made "where is process #48213 right now" a single query instead of log archaeology. A choke point you can query for state is also a choke point you can gate on spend.
Managed vs. Build-Your-Own: Where the Observability Actually Lives
Knowing where the choke point goes is only half the problem — you still have to decide what watches it. AWS has already built one answer to that: Amazon Bedrock AgentCore now ships persistent Runtime instances that let multiple collaborating agents share a long-lived host instead of a microVM torn down per session, plus a Gateway layer for routing tool/MCP calls — and AgentCore's whole pitch is that cost, metrics, traces, and events for a run come bundled with the platform instead of something you wire up yourself. If you're already all-in on Bedrock, that's a real, legitimate reason to just use it: the mediator's observability job is done for you.
But that convenience is a trade, not a free lunch, and it's the same trade the LLM gateway pattern documents for the plain API-gateway case: a managed platform gives you built-in visibility at the cost of tying your agent runtime, tool routing, and observability all to one vendor's catalog and roadmap. If you're not on Bedrock, running agents across multiple clouds, or just don't want that coupling, you build the same three things yourself — and the mediator topology is exactly what makes that tractable instead of a research project.
Traces — OpenTelemetry, rooted at the mediator. The mediator is the one place a trace can start cleanly: it opens a root span the moment a task comes in, and every dispatch to an agent becomes a child span carrying the trace context forward, the same parent-child model distributed tracing uses for service call chains. Do this in a mesh instead and you're instrumenting N(N-1)/2 peer-to-peer edges instead of N mediator edges — the same quadratic-vs-linear split from the topology diagrams, now showing up in your instrumentation burden.
There's a sharp edge here worth calling out explicitly: the dispatch from mediator to agent is almost always an async hop — a task queue, not a synchronous call — and that's precisely the boundary where trace propagation silently breaks if you're not deliberate about it. A queue message doesn't carry an HTTP header for free; the trace ID and span ID have to be explicitly written into the message envelope on the way in and read back out on the way out, or you get two disconnected traces instead of one continuous one, with nothing telling you the link is missing until an incident needs it.
Cost and metrics — an LLM gateway in front of every agent's model calls. If you haven't run into the term: an LLM gateway is a thin middleware layer that sits between your agents and the model providers (OpenAI, Anthropic, Bedrock) so every call routes through one place instead of each agent importing a provider SDK and calling out directly. Think of it as the same job a regular API gateway does for your microservices — one door in front of many services — except this door is in front of every outbound call to a model. Because every token any agent spends has to physically pass through that one door, the gateway can log cost and latency per call for free, without each agent having to instrument its own spending.
Route each agent's calls to the underlying LLM through a gateway (self-hosted options like LiteLLM or bedrock-access-gateway, or a managed one like Portkey) rather than each agent importing a provider SDK directly. That gives you the same per-agent, per-task cost attribution AgentCore bundles, but vendor-neutral — the gateway sees every token any agent spends because, structurally, that's the only door out to a model provider.
Attribution alone doesn't stop a bill, though — it just reports on it after the fact. The actual kill switch from earlier in this post lives here, at the gateway, as an enforced rule rather than a dashboard: a per-agent/per-task rate limit or hard spend cap that the gateway rejects calls against once hit, not something a human has to notice and act on. That's what turns "we can see the runaway agent" into "the runaway agent's next call gets refused before it adds another dollar to the bill."
Events — the mediator's task state is already the event log. Conductor's Decider pattern means the mediator already holds a structured record of every task dispatched, completed, or failed; you don't need a separate events system, you need to export that state to wherever you keep metrics (Prometheus/Grafana, or an OTel Collector feeding Jaeger/Tempo) instead of leaving it queryable only in the mediator's own store.
Put all three pieces on one canvas and the build-your-own stack reads the same way AgentCore's own architecture diagrams do — every layer has one job, and nothing skips the layer whose job it is:
Four layers, four jobs, and the answer to "where does X go" is fixed by which job X does, not by convenience:
- Orchestration Layer — the mediator from every diagram so far, now paired with the task-state store it was always implicitly using as the event log.
- Agent Team — every agent talks up to the mediator for task dispatch and sideways to one place — the gateway — for anything that costs tokens. No agent ever calls a model provider directly; that path doesn't exist in this architecture.
- LLM Access Layer — the gateway sits between every agent and every model provider, with the budget/kill-switch as an enforced hop inside it, not a dashboard next to it. This is the layer that answers the VentureBeat stat: a call that would blow the budget gets rejected here, before a provider ever sees it.
- Observability Stack — the mediator and each agent emit trace spans out to a collector (dotted lines, since this is a side channel, not the request path), and the gateway feeds the same collector cost and latency per call. One collector, feeding whatever tracing/metrics backend you already run.
This is deliberately the same shape AgentCore ships pre-wired: a runtime layer, an access/gateway layer, and an observability layer that see every request by construction. The difference is who owns and operates each box.
| Bedrock AgentCore (managed) | OTEL + gateway (build your own) | |
|---|---|---|
| Setup cost | Low — comes with the platform | Real: instrument every mediator↔agent boundary, stand up a collector and backend |
| Vendor lock-in | Tied to Bedrock's runtime and model catalog | None — OTEL is vendor-neutral, the gateway can front any provider |
| Cross-cloud / mixed-runtime agents | Only covers what runs on AgentCore | Works regardless of where each agent actually runs |
| On-call burden for the observability path itself | AWS's problem | Yours — you now own an availability-critical service |
| Best fit | Already standardized on Bedrock for agent hosting | Multi-cloud, self-hosted, or avoiding platform lock-in on purpose |
Neither side of this table is free — AgentCore trades engineering effort for lock-in, the DIY stack trades lock-in for engineering effort and an on-call rotation. What the mediator topology buys you either way is a single place to put that observability, instead of trying to retrofit tracing and cost attribution onto N agents that were all talking to each other and to model providers directly.
Decision Framework
| Situation | Mesh | Mediator |
|---|---|---|
| Team size | 2-3 agents | 4+ agents |
| Stage | Exploratory, local, prototyping | Production, anything customer-facing |
| Cost sensitivity | Low — you're watching the terminal | High — nobody's watching in real time |
| Need to audit "what happened" | Nice to have | Required |
| Need a kill switch | Optional | Non-negotiable |
Once you're on the mediator side, the AgentCore-vs-build-it-yourself question above narrows to one thing: are you already standardized on Bedrock for hosting these agents? If yes, use AgentCore's built-in observability and skip the DIY stack — you'd be reinventing something you already pay for. If your agents run across clouds, on your own infrastructure, or you have a hard rule against runtime lock-in, root an OpenTelemetry trace at the mediator and put an LLM gateway in front of each agent's model calls — more setup, but it's yours regardless of what AWS ships next.
If you're an indie developer bolting two or three agents together to prototype something, a mesh is genuinely fine — the paper's quadratic curve barely bites at N=2 or N=3, and the overhead of building a mediator isn't worth it yet. The moment you're adding a fourth agent, putting it in front of real users, or handing it a budget it can spend unsupervised, build the choke point before you need it, not after the bill arrives.
Conclusion
The paper measured a real cost that was always implicit in letting agents talk freely: coordination overhead that grows faster than the team does, front-loaded into chatter that isn't the actual work. The survey put a price tag on what happens when nobody put a mediator in the way of that cost. Microservices architects hit the identical wall with choreography a decade ago and the fix — Netflix's Conductor — is sitting there as a working blueprint. You don't need to invent a new pattern for multi-agent orchestration; you need to recognize which one you're already looking at.
Key takeaways:
- Agent-to-agent messaging in a free-form mesh grows close to quadratically with team size, and a real chunk of that growth is coordination overhead, not task progress.
- This is the same choreography-vs-mediator tradeoff microservices architectures already solved — Netflix Conductor is a working reference implementation of the mediator side.
- A mediator topology isn't just fewer messages, it's a choke point — the one place a budget cap and a kill switch can actually live.
- Mesh is fine for 2-3 exploratory agents; put a mediator in front of anything bigger, production-facing, or spending money unsupervised.
- Managed (Bedrock AgentCore) trades engineering effort for platform lock-in; OpenTelemetry rooted at the mediator plus an LLM gateway trades that lock-in for effort and an on-call rotation — pick based on whether you're already standardized on one cloud.