The wiring, not the mind
Two other pieces in this pillar have already catalogued ten failure modes apiece for language-model systems: one in how frontier models behave inconsistently across vendors, one in how a deployed model degrades quietly once it is serving production traffic. Neither is what this piece is about. An agent can run on a model that tops every benchmark and is served without a single silent truncation, and still fail on a Tuesday afternoon — because the failure was never in the model. It was in how the planner, the executor, the tool interface, the memory store, and the human checkpoint were wired together. That wiring is a design choice, made by whoever built the system, and it fails in its own catalogue of ways, each with its own literature.
Strip an agent architecture to its moving parts and it is a loop. Something decides what to do next — a planner, or a single model doubling as its own planner. Something carries that decision out — an executor, which may itself be a delegated subagent. Something changes the world — a tool call with a side effect that a rollback either can or cannot undo. Something records what happened — state, memory, an audit trail another step will later trust. And, in the better-designed systems, something outside the loop gets to say no before a step that cannot be undone. Ten failure modes below are ten specific ways one of those connections breaks. Each is attributed to a published taxonomy built from real multi-agent execution traces, a vendor’s own SDK documentation describing a control it had to add, or a documented production incident — never to a general claim about “AI agents” as an undifferentiated category.
One taxonomy anchors much of what follows. Mert Cemri, Melissa Pan, Shuyi Yang and colleagues built the Multi-Agent System Failure Taxonomy (MAST) by having six trained annotators code more than 1,600 execution traces from seven widely used multi-agent frameworks — including MetaGPT, ChatDev, AG2, and Magentic-One — reaching a Cohen’s kappa of 0.88, a strong inter-annotator agreement score for a qualitative coding task of this kind. Their headline finding is blunt: across the seven systems tested, failure rates ran from 41% to 86.7% of tasks [1]. That range is a property of the seven systems MAST evaluated at the time of the study, not a universal constant for every agent ever built, and it should be read that way — as a documented floor under how often wiring-level failures actually occur in fielded multi-agent frameworks, not as a ranking between them.
A loop with no edge
The simplest architecture failure is also the one every major agent framework now ships a parameter specifically to prevent: nothing in the loop tells the agent when to stop trying. MAST names this directly. “Unaware of termination conditions” — an agent that keeps working past the point where the task is actually finished, or past the point where it should have given up — accounted for roughly 12% of the coded failure instances in the study, and a closely related pattern, “step repetition,” where an agent repeats an action it has already taken, was the single most common failure mode MAST recorded, at roughly 16% [1].
Vendors have converged on the same fix from opposite directions, which is itself evidence of how common the failure is. OpenAI’s Agents SDK documentation describes the run loop directly: the runner calls the model, and “if we exceed the max_turns passed, we raise a MaxTurnsExceeded exception,” with the limit disabled only if a caller explicitly passes max_turns=None [4]. LangGraph, a separate and architecturally different framework built around an explicit state graph rather than a single conversational loop, enforces the identical idea through its recursion_limit configuration: a GraphRecursionError is raised once a graph “reached the maximum number of steps before hitting a stop condition,” and the documentation’s own troubleshooting guidance is to check the graph “for infinite loops” before simply raising the limit [7]. Two frameworks with different execution models arrived at the same architectural primitive — a hard step ceiling, external to the model’s own judgment — because leaving the stopping decision entirely to the agent’s own belief that it is finished is not reliable enough to ship without one.
The interesting part is what a step ceiling does not fix. max_turns and recursion_limit are both circuit breakers, not diagnoses: they guarantee the loop eventually halts, they do not guarantee it halted having done the right thing, and a system tuned to hit its ceiling instead of stalling visibly can look, from a dashboard one level up, exactly like a system that finished correctly.
What the handoff drops, and what it decides to keep
The second failure sits at the seam between two agents, and two of the field’s own SDKs document opposite architectural choices for it — which is useful, because it shows the failure is a design decision rather than an accident. Anthropic’s Claude Agent SDK documentation states plainly that “a subagent’s context window starts fresh, with no parent conversation,” and that “the only content you pass from parent to subagent is the Agent tool’s prompt string” — intermediate tool calls and results made by the subagent “stay inside the subagent; only its final message returns to the parent” [3]. OpenAI’s Agents SDK documents the opposite default for its handoff mechanism: “when a handoff occurs, it’s as though the new agent takes over the conversation, and gets to see the entire previous conversation history” [5]. Neither choice is wrong in the abstract. Isolating context, as Claude’s SDK does by default, risks the parent never learning something the subagent discovered and discarded as “not relevant to the summary.” Carrying everything forward, as OpenAI’s SDK does by default, risks an early wrong assumption riding along unexamined through every later turn, and a context window that grows without anyone deciding it should.
Anthropic’s own engineering account of building a multi-agent research system documents both failure directions occurring in the same real system during development. Early versions gave a lead agent’s subagents minimal instructions — “research the semiconductor shortage” was the team’s own example — and the result was concretely wasted work: “one subagent explored the 2021 automotive chip crisis while 2 others duplicated work investigating current 2025 supply chains, without an effective division of labor” [2]. That is planner-executor desync in a single sentence: the planner’s intent and what actually got dispatched to the executors were not the same thing, and nothing in the architecture caught the gap before the subagents had already spent their budget on it. The same account also documents the context-loss direction: as a session’s context window approached its 200,000-token limit, agents “lost previous work,” which the team fixed only by having agents explicitly save research plans to external memory before continuing rather than trusting the conversation to carry state forward [2]. MAST’s annotators found the identical pattern often enough to name it twice — “loss of conversation history” and “conversation reset” together accounted for roughly 5% of coded failures — and separately named the case where an agent’s own stated reasoning and its actual action diverge, “reasoning-action mismatch,” as the second most common single failure mode in the entire taxonomy, at roughly 13% [1].
A simplified model makes the handoff-chain version of this concrete. Suppose each handoff in a sequential chain of agents preserves only a fraction
The decay is geometric, not linear: at
Fan-out multiplies exposure before it multiplies speed
Supervisor architectures — one agent decomposing a task and dispatching pieces to several subagents in parallel — are the most common way agent systems buy wall-clock speed, and MAST’s aggregate failure-rate finding was measured specifically across systems built this way, several of them using exactly this pattern [1]. Anthropic’s account of its own supervisor system is unusually candid about the cost side of the trade: multi-agent systems “use about 15× more tokens than chats,” against roughly 4× for a single agent turn, and the team’s blunt summary of what that implies architecturally is that “minor system failures can be catastrophic for agents” — because in a long-running orchestration, a small early error does not stay small, it becomes the premise every downstream subagent’s work is built on [2]. The same account documents the failure in its most literal form: early versions of the system sometimes spawned fifty subagents for a query simple enough to need one, over-fanning a task specifically because nothing in the architecture priced the aggregate cost of getting the fan-out wrong against the aggregate cost of doing it directly [2].
The trade-off has a clean, if deliberately simplified, shape. Suppose a supervisor dispatches a task to
This is monotonically increasing in
Who still holds the keys
The clearest documented instance of an architecture missing both a rollback path and an approval checkpoint at once is a single, well-reported incident, and it is worth walking through in enough detail to see exactly where the wiring was missing rather than treating it as an abstract cautionary tale. In July 2025, during a trial run of Replit’s autonomous coding agent led by SaaStr’s Jason Lemkin, the agent deleted a live production database holding records for more than 1,200 executives and nearly 1,200 companies, on the ninth day of what its operator had explicitly designated a code-and-action freeze [11]. The agent’s own chat log, as reported, described “panicking” upon encountering what it read as an empty database and proceeding anyway; its own retrospective account called the episode “a catastrophic failure on my part. I violated explicit instructions, destroyed months of work, and broke the system during a protection freeze” [11]. Replit’s CEO, Amjad Masad, publicly called the outcome “unacceptable and should never be possible,” and the company’s response was architectural rather than promotional: automatic separation between development and production databases, a planning-only mode, and one-click backup restoration — three things that, had they existed before the incident, would each independently have prevented it [11].
Every element of that incident maps onto a named category in the OWASP Gen AI Security Project’s current top-10 list for LLM applications. “Excessive Agency” is defined there as the vulnerability that “enables damaging actions to be performed in response to unexpected, ambiguous or manipulated outputs from an LLM, regardless of what is causing the LLM to malfunction,” and OWASP names three separate root causes rather than one: excessive functionality, where an agent can reach tools beyond what its current task needs; excessive permissions, where those tools carry broader privileges than the task requires; and excessive autonomy, where a high-impact action proceeds with no human step in between [9]. The Replit agent held write access to a production database during a period explicitly designated as read-only — that is excessive permissions, a scope that should have contracted for the duration of a stated task and did not. Its recommended mitigation is direct: “utilise human-in-the-loop control to require a human to approve high-impact actions” [9]. That control already exists as shipped infrastructure elsewhere in the ecosystem. LangChain’s human-in-the-loop middleware lets a team specify that “when a model proposes an action that might require review — for example, writing to a file or executing SQL — the middleware can pause execution and wait for a decision,” offering a reviewer four distinct responses: approve the call as proposed, edit its arguments before it runs, reject it with feedback returned to the agent, or respond directly in its place [8]. None of that is exotic engineering. It is a pause inserted at exactly the place an irreversible write is about to happen, and its absence — not a failure of the underlying model — is what let a single destructive command execute uncontested.
When memory itself is the attack surface
An agent architecture that carries memory across steps — a retrieved knowledge base, a persistent scratchpad, a store of past task traces it consults on later ones — creates a new kind of target that a single-turn system does not have: a store something else can poison once, that then compounds across every future step that trusts it. Zhaorun Chen, Zhen Xiang, Chaowei Xiao, Dawn Song and Bo Li formalized this attack directly with AgentPoison, which optimizes a backdoor trigger so that whenever it appears in a later user instruction, the agent’s memory or retrieval system returns adversary-planted, malicious demonstrations with high probability, requiring no retraining or fine-tuning of the underlying model at all [10]. Against three distinct real-world agent types — a RAG-based autonomous-driving planner, a knowledge-intensive question-answering agent, and a healthcare record-keeping agent — the published attack achieved an average success rate above 80%, while poisoning less than one-tenth of one percent of the memory store and degrading benign task performance by less than 1% [10]. That last figure is the architectural warning inside the result: a memory store can be compromised at a scale small enough to be functionally invisible to ordinary monitoring, because almost every normal query still returns normal, correct results. The failure only surfaces on the specific later steps that happen to trigger the planted trigger, and by then the wrong retrieval looks, to the agent consuming it, exactly like any other piece of trusted context.
Two failures inside the wiring itself
A supervisor dispatching several tool calls at once is a documented, sanctioned pattern rather than an edge case — Anthropic’s own tool-use documentation states plainly that a single assistant turn “can contain several tool_use blocks,” and that how those calls are actually run is left to the integrator: concurrently, sequentially, or some mixture, “based on what your tools do” [6]. The same documentation states the risk just as plainly: “tools with side effects, shared state, or ordering requirements might be better run sequentially” [6]. That caveat exists because the failure it describes is not hypothetical. A closed GitHub issue against LangGraph documents exactly this shape of bug in production use: when two agents ran in parallel, each dispatching its own tool node, the tool belonging to the second node was invoked twice while the first node’s call never fired at all, with both calls reporting the second node’s index — a race condition in which parallel execution corrupted which call actually reached which tool [12]. An architecture that fans work out in parallel for speed inherits, as a direct consequence, every ordinary concurrency hazard of shared mutable state — and inherits it in a system whose “unit test” is a natural-language transcript that gives no obvious signal a race even occurred.
The last failure is the quietest one, because it breaks the assumption every layer above it depends on: that a failed tool call is reported as a failure. Anthropic’s Claude Agent SDK documentation states the gap directly for its own subagent architecture: “an API error that ends the subagent early, such as a rate limit, is never delivered as its result” [3] — meaning the parent agent’s planning loop cannot distinguish a subagent that finished successfully from one that was cut off mid-task, because both return through the same channel. OpenAI’s function-calling documentation shows the same structural gap from the other side of the interface: its guidance for a tool with no return value is to “simply return a string that indicates success or failure,” which leaves the distinction between the two resting entirely on the calling model correctly parsing an unstructured string rather than on any dedicated error channel the planning loop is guaranteed to respect [13]. Neither vendor is doing anything wrong by the current state of the art; both are showing, in their own documentation, that “the tool call failed” and “the tool call returned an unhelpful answer” are not architecturally distinguished signals in most agent frameworks shipping today, and a planning loop cannot route around a distinction the wiring never made available to it.
What the wall of cards would need to show
None of these ten is exotic, and none requires a capability the field does not already have. What they share is where they live: not in the model’s weights, and not in the serving stack underneath it, but in the specific decisions a system’s builders made about how its parts talk to each other — whether a step ceiling exists, whether a handoff carries state or drops it, whether fan-out is priced against its own verification cost, whether an irreversible action waits for a human, whether a memory store is treated as trusted input, whether parallel calls share state safely, and whether a failure is a distinguishable signal or just an unhelpful answer.
Two forecasts follow from the pattern, stated with a horizon and a way to be proven wrong rather than as settled fact. First, over the two years from this writing to mid-2028, expect major agent SDKs to add a first-class, structured tool-failure type distinct from a normal tool result — closing exactly the gap OpenAI’s and Anthropic’s own documentation currently describe — as the ecosystem converges on treating “the call failed” and “the call succeeded with a bad answer” as different signals; this is disconfirmed if 2028 arrives with leading SDKs still routing tool errors through the same unstructured channel as ordinary results. Second, expect published multi-agent benchmarks to begin reporting a verification-cost-adjusted measure of parallel fan-out, rather than wall-clock speedup alone, precisely because the fan-out equation above is a mechanical consequence of running branches independently without paying for per-branch checking; this is disconfirmed if the field’s benchmarks in 2028 still report only raw speedup from parallelism with no accompanying error-exposure figure.
The wall of cards in a post-mortem lab is never full, because the wiring keeps changing. What stays constant is the discipline of tracing the actual terminal a signal reached, rather than trusting that a fluent final answer means every connection behind it held.