Multi agent systems multiply coordination problems faster than capability. Here is how to pick a pattern for platform engineering and specify it so it survives production.
Highlights
- The MAST research annotated more than 1,600 agent traces across seven frameworks and found failure rates between 41 and 86 percent, with roughly 42 percent traced to specification and design problems rather than model quality.
- Inter agent misalignment accounts for about 37 percent of failures, which is what happens when two agents hold different views of the same shared state.
- Five patterns cover almost all real platform work: supervisor, pipeline, fan out, hierarchical, and swarm, and each maps to a specific class of platform task.
- Supervisor is the sensible 2026 default for platform engineering, because a single coordinator gives you one trace, one audit trail, and one place to enforce policy.
- MCP and A2A solve different problems, since MCP connects an agent to tools while A2A connects agents to each other, and A2A now sits under the Linux Foundation with adoption across the major clouds.
- An agent contract, written before any code, is the single most valuable artifact in the whole design, because it attacks the largest failure category directly.
- Every agent needs its own identity and blast radius, so a provisioning agent and a read only audit agent never share a credential.
Gartner projects that by the close of 2026, four in ten enterprise applications will have task specific AI agents built into them, against fewer than one in twenty during 2025. The research on whether those systems actually work is much less flattering. The MAST study, which annotated over 1,600 execution traces across seven multi agent frameworks, measured failure rates between 41 and 86 percent, and found that stronger base models would not be enough to fix the failure taxonomy it documents. The failures cluster into system design issues at roughly 42 percent, inter agent misalignment at about 37 percent, and weak task verification at around 21 percent.
Read that breakdown again, because it is unusually good news for platform engineers. Bad specifications, lossy handoffs, and missing verification are distributed systems problems, and your profession has been solving them since before anyone used the word agent. This guide covers the patterns that hold up for platform work, the contracts that make them reliable, and the honest test of whether you need more than one agent at all.
What a multi agent system for platform engineering is
A multi agent system for platform engineering is an architecture in which several specialized agents, each with its own role, toolset, and identity, coordinate to handle platform work such as provisioning, incident triage, compliance audit, or developer self service requests, with an explicit orchestration pattern deciding who does what and how results combine.
The word specialized carries the weight. Three agents sharing one prompt and one toolset are not a multi agent system, they are one agent billed three times. The design only earns its complexity when agents differ meaningfully in the tools they hold, the permissions they carry, the data they see, or the judgment they apply.
First, the honest test: do you need more than one agent?
Start here, because the most common architectural mistake in 2026 is reaching for a multi agent design when a single agent with more tools would work better and cost less.
A single agent handles it when the task is one coherent job with a shared context, even if it takes many steps, since a Kubernetes troubleshooting agent that runs eight kubectl calls is still one job. Add agents when at least one of these is true. Permissions genuinely differ, so an agent that reads audit data and an agent that provisions infrastructure should never share a credential. Context would otherwise overflow, because a single agent holding cluster state, billing data, and compliance rules loses coherence long before it hits a token limit. Work is genuinely parallel, such as auditing forty clusters where each audit is independent. Or a domain needs a different model, prompt, or tuning to perform acceptably.
If none of those apply, add tools rather than agents. Every handoff you introduce is an opportunity for the 37 percent failure category, and that cost is real even when the design looks elegant on a whiteboard.
The five patterns, mapped to platform work
Generic pattern lists are easy to find and hard to use. Here is each pattern against the platform tasks it actually fits.
| Pattern | Shape | Platform use case | Main risk |
|---|---|---|---|
| Supervisor | One coordinator routes to specialists and synthesizes results. | Incident response where a coordinator consults Kubernetes, metrics, and deploy history agents. | The coordinator becomes a bottleneck and a single point of failure. |
| Pipeline | Fixed sequence where each stage consumes the previous output. | Golden path provisioning: validate request, generate manifests, run policy check, open pull request. | One weak stage corrupts everything downstream. |
| Fan out | Identical agents run the same task over many targets in parallel. | Auditing every cluster or account for policy drift and reporting exceptions. | Cost scales linearly and rate limits bite quickly. |
| Hierarchical | Nested supervisors, each owning a domain. | A platform coordinator delegating to networking, security, and cost sub coordinators. | Debugging spans layers, so root cause gets expensive to find. |
| Swarm | Peers share state with no central control. | Rarely appropriate for platform work, occasionally useful for broad exploration. | No single trace, so auditability is effectively gone. |
Two conclusions follow, and both are load bearing.
Supervisor is the right default for platform engineering, and not because it is fashionable. A single coordinator gives you one trace per request, one place to enforce policy, and one audit record, which is exactly what you need when the system provisions infrastructure or touches production. Regulated environments make this decisive rather than merely convenient.
Swarm is almost never the answer here. Losing central control means losing the single trace, and diagnosing a failure then means re running many agents at once against state they all mutate. For anything auditable, that is not a defensible architecture, however well it performs in a benchmark.
Cost deserves a mention too. Patterns that run agents against each other for consensus, sometimes called debate, have been measured at roughly two and a half times single model cost. Occasionally that buys real accuracy on a high stakes judgment. Usually it buys a more expensive version of the same answer.
Build the platform engineering foundation first
These patterns land differently once you have built an internal developer platform and felt where the seams are. The Cloud Native Platform Engineering Associate (CNPA) course on KodeKloud covers platform APIs, internal developer platforms, observability, and DORA metrics, which are the surfaces your agents will act on and the metrics that tell you whether they helped.
Attack the 42 percent: write agent contracts first
The largest failure category is specification and design, so the most valuable artifact in this entire discipline is a written contract per agent, produced before any code. Treat it exactly like an API contract, because that is what it is.
from dataclasses import dataclass, field
@dataclass(frozen=True)
class AgentContract:
"""The specification that gets reviewed before the agent gets built."""
name: str
responsibility: str # one sentence, one job
tools: list[str] # exhaustive, no implicit capability
identity: str # ServiceAccount or IAM role, never shared
inputs: str # the schema it accepts
outputs: str # the schema it must return
termination: str # how it knows it is finished
escalation: str # what it does when it cannot finish
forbidden: list[str] = field(default_factory=list)
PROVISIONER = AgentContract(
name="provisioner",
responsibility="Generate and validate infrastructure manifests for an approved request.",
tools=["render_template", "validate_schema", "run_policy_check", "open_pull_request"],
identity="sa:platform-provisioner",
inputs="ProvisionRequest",
outputs="ProvisionResult",
termination="A pull request URL exists, or validation failed with a named reason.",
escalation="Post the validation failure to #platform-requests and stop.",
forbidden=["applying manifests directly", "merging its own pull request"],
)Two fields there get left out most often, termination and escalation, and both map onto documented failure modes. Agents that do not recognize when a task is complete keep working, and agents with no escalation path invent a result rather than admitting failure. Writing both down forces the conversation before the failure.
The forbidden field is equally deliberate. Stating that the provisioner may not merge its own pull request is a separation of duties decision, and separation of duties is a property of your architecture rather than something a prompt can promise.
Attack the 37 percent: type your handoffs
Inter agent misalignment is what happens when agents pass prose to each other and each interprets it slightly differently. The fix is unglamorous and effective: make every handoff a validated schema.
from pydantic import BaseModel, Field
from typing import Literal
class Finding(BaseModel):
"""One specialist's contribution. Every field is required for a reason."""
agent: str
confidence: Literal["high", "medium", "low"]
claim: str = Field(description="What the agent concluded, one sentence.")
evidence: str = Field(description="The raw output that supports the claim.")
evidence_source: str = Field(description="Exact command or query that produced it.")
class Handoff(BaseModel):
"""The envelope that moves between agents."""
request_id: str # correlates the whole trace
from_agent: str
to_agent: str
task: str
findings: list[Finding] = []
unresolved: list[str] = [] # explicit, so nothing is silently droppedThree properties of that schema do the real work. Requiring evidence and evidence_source on every finding stops an agent from passing an unsupported assertion downstream as though it were established fact. The unresolved list makes gaps explicit rather than letting them vanish in a summary, which is precisely how context gets lost in handoffs. And request_id gives you one correlation key across the whole system, which is the difference between a trace you can read and a pile of logs.
Prose handoffs feel natural because agents speak in prose. Resist it. A schema violation raises an error at the boundary, where you can see it, instead of surfacing three agents later as a confidently wrong answer.
Attack the 21 percent: add a verifier
The smallest category is still one failure in five, and the fix is a dedicated agent whose only job is to check the work.
from langchain.agents import create_agent
VERIFIER_PROMPT = """You verify other agents' findings. You do not solve the task.
For each finding, decide:
- SUPPORTED: the evidence directly demonstrates the claim.
- UNSUPPORTED: the claim goes beyond what the evidence shows.
- CONTRADICTED: another finding conflicts with this one.
Quote the specific text behind every judgment. If findings disagree, say so
explicitly rather than choosing a winner. Never add findings of your own."""
verifier = create_agent(
model="anthropic:claude-sonnet-4-6",
tools=[], # no tools: it only reads what it is given
system_prompt=VERIFIER_PROMPT,
)Giving the verifier no tools is intentional. A verifier that can gather its own evidence starts solving the problem instead of checking it, and then you have two specialists and no reviewer. Independence is the whole value.
A worked example: the golden path provisioning pipeline
Here is a pipeline pattern applied to the most common platform request there is, a team asking for a new service. Four stages, each with a narrow job and its own identity.
from langchain.agents import create_agent
from langchain.agents.middleware import HumanInTheLoopMiddleware
from langgraph.checkpoint.memory import InMemorySaver
# Stage 1 validates the request against your catalog and quotas.
# Stage 2 renders manifests from approved templates only.
# Stage 3 runs policy as code and reports violations.
# Stage 4 opens a pull request. It cannot merge.
publisher = create_agent(
model="anthropic:claude-sonnet-4-6",
tools=[render_template, validate_schema, run_policy_check, open_pull_request],
system_prompt=PROVISIONER_PROMPT,
middleware=[
HumanInTheLoopMiddleware(
interrupt_on={
"render_template": False, # safe, produces text
"validate_schema": False, # safe, read only
"run_policy_check": False, # safe, read only
"open_pull_request": {"allowed_decisions": ["approve", "reject"]},
},
description_prefix="Platform change pending approval",
),
],
checkpointer=InMemorySaver(),
)The design decision worth copying is that the pipeline ends at a pull request rather than at an applied change. Your existing review, CI, and GitOps controls then apply unchanged, which means the agent accelerates the work without becoming a new privileged path into production. Platform engineering already solved safe change delivery, so let the agent feed that machinery instead of bypassing it.
MCP and A2A are not competitors
These two protocols get conflated constantly, and the distinction is simple once stated.
MCP, the Model Context Protocol, connects an agent to tools and data. When your Kubernetes agent reads pods or your provisioning agent renders a template, that is the MCP shaped problem, and it is vertical: agent to capability.
A2A, the Agent2Agent protocol, connects agents to each other. When your platform coordinator delegates to a security agent owned by a different team, running on a different framework, that is the A2A shaped problem, and it is horizontal: agent to agent. A2A now sits under the Linux Foundation, and by April 2026 it had been adopted by more than 150 organizations with integrations across the major cloud providers, which makes it the reasonable default for cross team and cross vendor coordination.
Most platform systems need both, and the practical rule is straightforward. Inside one team's system, direct framework calls are simpler than a protocol. The moment an agent must be consumed by a team that did not build it, you want a documented interface, and that is where A2A's agent card earns its place.
{
"name": "platform-security-agent",
"description": "Evaluates infrastructure changes against organization security policy.",
"version": "1.4.0",
"capabilities": { "streaming": true, "pushNotifications": false },
"skills": [
{
"id": "evaluate-manifest",
"name": "Evaluate manifest against policy",
"description": "Accepts Kubernetes manifests and returns policy violations with severity.",
"inputModes": ["application/json"],
"outputModes": ["application/json"]
}
]
}That document is really just service discovery for agents, and it is doing the same job an OpenAPI spec does for your microservices. Treat it with the same rigor, including versioning.
Practice orchestration patterns hands on
Agent loops, sub agents, and feedback are much clearer once you have wired them yourself. The Loop Engineering course on KodeKloud covers how automations, memory, tools, and sub agents fit together in reliable agent workflows, and the LangGraph course covers the stateful graph patterns these designs are built from.
Give every agent its own blast radius
Platform engineers hold an advantage over most people building these systems, because scoping identities is already the job. Apply it directly.
Each agent gets its own ServiceAccount or IAM role, never a shared platform credential, and the scope follows the contract rather than convenience. An audit agent gets read only access across many namespaces, since breadth without write access is a modest risk. A provisioning agent gets write access to a repository and nothing in the cluster, because the pull request is its output. A remediation agent gets one verb on one resource in the namespaces it owns. No agent gets secrets unless reading a specific secret is its stated purpose.
The reason this matters more in a multi agent system than a single agent one is compounding. When five agents share one over privileged credential, a prompt injection in any of their inputs reaches the union of all five capabilities, and the system's blast radius is its most permissive component rather than its average.
Observability, or you are guessing
One rule covers most of it: every agent action carries the request_id, so a single query reconstructs the full path a request took.
Log the tool calls, arguments, and results for each agent, the handoff envelopes at each boundary, tokens and latency per agent so cost has an owner, and every escalation with the reason. Watch specifically for step repetition, where agents redo completed work, and for runs that never reach a termination condition, since both are documented failure modes that are trivial to detect once you look and invisible when you do not.
The maturity ladder
| Level | What you have | Move on when |
|---|---|---|
| 0 | One agent, several tools, read only. | Context or permission boundaries genuinely conflict. |
| 1 | Two agents with typed handoffs and separate identities. | The handoff schema holds for a month without changes. |
| 2 | Supervisor with three or four specialists, one trace per request. | Traces are readable and cost per request is known. |
| 3 | A verifier agent independently checking findings. | Verifier disagreement rate is stable and understood. |
| 4 | Cross team agents exposed over A2A with published cards. | Another team consumes yours without asking you questions. |
Most platform teams should live at levels 1 and 2 for a long time, and there is no prize for reaching level 4 with an unreliable level 2 underneath.
Where to start
- Pick one platform workflow that already annoys people, such as new service provisioning or the weekly compliance audit.
- Write the agent contract for a single agent that does the whole thing, then try to build it and see whether it holds.
- Split into two agents only where a permission or context boundary forced your hand, and record which one it was.
- Define the handoff schema as a validated model before writing either agent's logic.
- Give each agent its own identity and verify the scope with your cloud or cluster authorization tooling rather than by reading YAML.
- Add the
request_idand per agent cost logging on day one, since retrofitting observability is far harder than starting with it. - Add a verifier once two specialists disagree about something real, which is the moment its value becomes obvious.
Conclusion
The evidence on multi agent systems is unusually clear about where the risk lives. Roughly four failures in five trace back to specification, coordination, or verification, and none of those are model problems. They are the same problems distributed systems engineers have always faced, which means the discipline that makes these architectures work is one platform engineers already have: clear contracts, typed interfaces, scoped identities, correlated traces, and independent verification.
So resist the pull toward architectural ambition. Write the contract for one agent this week and see whether one is enough, because a single well specified agent beats an elegant five agent design that nobody can debug at two in the morning. Add agents when a boundary forces you to, type the handoff when you do, and let the number of agents be an outcome of the constraints rather than the starting point.
Ready to Build Platform Engineering Depth?
Multi agent design rewards engineers who already understand platforms, identities, and delivery pipelines. The Cloud Native Platform Engineering Associate (CNPA) course on KodeKloud covers internal developer platforms, platform APIs, and DORA metrics, the Platform Engineer learning path sequences the whole track from containers through GitOps, and the KodeKloud playgrounds give you environments to prototype in for free. Start with one today.
FAQs
Q1: When should I use a multi agent system instead of one agent with more tools?
Add agents only when a boundary forces it, and prefer more tools otherwise. Four conditions genuinely justify the extra complexity: permissions differ enough that sharing a credential would be unsafe, such as separating an audit agent from a provisioning agent; context would overflow or lose coherence if one agent held every domain at once; the work is genuinely parallel across many independent targets, like auditing forty clusters; or one domain needs a different model or prompt to perform acceptably. If none of those apply, a single agent with a larger toolset is cheaper, easier to trace, and less likely to fail, because every handoff you add is an opportunity for the inter agent misalignment that accounts for roughly 37 percent of documented multi agent failures. The number of agents should be a consequence of your constraints rather than a design goal.
Q2: Which pattern should I start with for platform engineering?
Start with supervisor, and treat it as the default rather than a stepping stone. A single coordinator routing work to specialists gives you three properties that matter enormously for platform work: one trace per request, one place to enforce policy, and one audit record showing what the system did and why. Pipeline is the right choice when your workflow genuinely has fixed sequential stages, which describes golden path provisioning well, since validation must precede rendering and policy checks must precede a pull request. Fan out fits parallel work over many targets, and hierarchical designs make sense only once one supervisor is demonstrably managing too many domains. Swarm is almost never appropriate for platform engineering, because peers sharing state with no central coordinator means no single trace, and losing auditability is disqualifying for systems that touch infrastructure.
Q3: What do I need to know before building multi agent systems?
You need platform and distributed systems fundamentals more than machine learning knowledge, which is why platform engineers tend to do well at this. Specifically, understand identity and authorization deeply enough to scope a ServiceAccount or IAM role per agent, since that is the actual security boundary; know how to design and version an interface, because handoffs between agents are interfaces whether you treat them as such or not; and be comfortable with tracing and correlation IDs, as debugging a multi agent failure without a shared trace is close to impossible. On the implementation side, intermediate Python plus one agent framework is enough. For structured preparation, the Cloud Native Platform Engineering Associate (CNPA) course on KodeKloud covers the platform surfaces these agents act on, the Loop Engineering course covers agent loops and sub agents, and the LangGraph course covers stateful orchestration.
Q4: What is the difference between MCP and A2A, and do I need both?
They solve different problems and most mature systems use both. MCP, the Model Context Protocol, is the vertical connection from an agent to tools and data, so reading cluster state, querying a database, or calling an internal API is MCP shaped work. A2A, the Agent2Agent protocol, is the horizontal connection between agents, so a platform coordinator delegating to a security agent that another team built and operates is A2A shaped work. A2A now sits under the Linux Foundation and by April 2026 had adoption from more than 150 organizations with integrations across the major clouds, which makes it a reasonable standard to build toward. The practical rule is that MCP is useful almost immediately, because every agent needs tools, whereas A2A becomes valuable at the organizational boundary, when an agent must be consumed by people who did not build it. Inside a single team's system, direct framework calls are simpler and perfectly legitimate.
Q5: How do I debug a multi agent system when something goes wrong?
Instrument for it before you need it, because retrofitting observability into a running agent system is painful. Assign one request_id at the entry point and attach it to every tool call, handoff, model invocation, and escalation, so a single query reconstructs the full path. Log the handoff envelopes at each boundary specifically, since the majority of coordination failures are visible right there as a dropped field, a lost constraint, or an unsupported claim promoted to fact. Then classify failures with the MAST categories rather than treating each incident as unique: specification problems where an agent misunderstood its job, coordination problems where the handoff lost something, and verification problems where a wrong answer passed unchallenged. That classification tells you where to invest, and teams that do it usually discover their problem is a vague contract rather than the orchestration code they were about to rewrite.
Q6: Will better models make these coordination problems go away?
Not according to the evidence, and this is the most important finding to internalize before designing one. The MAST research examined more than 1,600 traces across seven frameworks and stated plainly that stronger base models will not resolve the taxonomy it documents, because the failures come from missing structure in how these systems are organized rather than from weak reasoning. A stronger model cannot infer a termination condition you never specified, cannot recover a constraint that a prose handoff dropped, and cannot verify its own output independently. Better models do help with the reasoning inside each agent, which is real value, but the coordination layer is engineering work that stays yours. That is precisely why the durable investment is in contracts, typed interfaces, scoped identities, and verification rather than in waiting for the next model release.
Discussion