Why most AI agent systems fail in production — and what to do instead
Everyone's building agents. Almost nobody is running them reliably at scale. After deploying production multi-agent systems across a dozen client environments, we've found the same failure patterns appearing again and again.

We've built agent systems for legal tech companies, travel operators, buying groups, and enterprise analytics teams. The problems that kill production agents are almost never the ones people worry about — they're not hallucinations, they're not model quality, and they're not the ones your LLM vendor talks about.
They're architectural. They're process design problems dressed up as AI problems. And once you know what they are, they're surprisingly preventable.
Failure 1: No separation between planning and execution
The most common pattern we see is agents that plan and act in the same pass. The model receives a task, reasons through it, and starts calling tools — all in one turn. This feels natural because it mirrors how the demos work. But it's a recipe for compounding errors in production.
When planning and execution are interleaved, a bad assumption early in the chain gets amplified by every subsequent step. There's no checkpoint where you can say: "does this plan make sense before we execute it?" By the time the agent has made three tool calls based on a flawed premise, you've consumed tokens, time, and potentially done something irreversible.
The planning step should produce a structure you can validate, log, and approve — not a stream of consciousness that immediately acts.
The fix is a strict planning/execution split. The planner outputs a structured task graph. That graph gets validated — either programmatically, or by a supervisor agent, or even by surfacing it to a human for high-stakes operations. Only then does the executor begin work. This adds latency, but it adds correctness and debuggability at the same time.
Failure 2: Memory that doesn't survive a turn boundary
Every multi-turn agent interaction has a memory problem. The context window is a leaky bucket. Stuffing the entire conversation history into every prompt is expensive and gets worse as the conversation extends. Naive truncation loses the wrong things.
What we've settled on after many iterations is a tiered approach:
- Working memory — the immediate context window, managed by keeping only what's relevant to the current task step
- Episodic memory — structured summaries of completed task steps, stored externally and retrieved selectively
- Persistent memory — user preferences, entity relationships, domain facts — stored in a proper retrieval layer and injected on need
The mistake most teams make is treating the context window as the database. It's not. It's a working surface. The database needs to be external, queryable, and structured enough that you can retrieve the right things at the right time.
In our InSight product, we maintain a separate knowledge store that auto-updates from the client's data sources. This means the agent's "memory" of the business is always current — it doesn't depend on the conversation to stay informed.
Failure 3: Tool calling without a contract
Agents fail loudly when tools fail silently. A tool call that returns an empty response, an unexpected schema, or a partial result can cascade through an agent's reasoning in ways that are genuinely hard to debug after the fact.
Every tool in a production agent system needs three things: a clear input schema, a typed return contract, and explicit error semantics. The model needs to know not just what the tool does, but what failure looks like — so it can reason about it rather than barrel through.
This is the part where most frameworks let you down. Langchain, CrewAI, and most off-the-shelf abstractions hide the tool layer in ways that make it opaque to the model. We've found that simpler is almost always better: a tool is a function with a typed signature and a documented failure mode. The model can work with that.
What actually works in production
The systems that run reliably share a few characteristics. They have clean architectural separation between planning, execution, and validation. They treat memory as an external resource problem, not a context window problem. Their tools are deterministic where possible, and they fail explicitly rather than silently.
Most importantly: they were designed to be debuggable from the start. Every agent action is logged with enough context to reconstruct what the model was thinking when it made the call. You can't fix what you can't observe.
If you're building agent infrastructure and you're not spending at least as much time on your observability and logging layer as on your prompts, you're building blind.
Get the next one
Enjoyed this? More like it, twice a month.
Practical AI and data perspectives. No hype, no filler.

