Single-agent debugging is mostly a solved shape: see the prompt, see the tool call, see the output.
Multi-agent graphs are different. The pattern that keeps biting teams:
The failure is usually not at step 5. The wrongness happened at the handoff (step 2). By the time you stare at the final output, you’re reconstructing the chain from logs by hand.
That is the multi-agent debugging tax.
In a single chain, one component owns the state story.
In a multi-agent run, state is often implicit:
If you only log each agent’s own outputs, that gap never shows up. Log more than “agent A finished” / “agent B started”:
That last line matters. Payload can match while authority still diverges (B can’t read the memory A assumed it could).
Re-running the whole graph to debug is slow and dangerous when tools have side effects (email sent, ticket updated, money moved).
What you want first is: jump to the handoff step and inspect state there.
A useful pattern from practice: snapshot at the boundary.
If they diverge, you catch it at step 2, not step 5. Cheaper than full replay: compare snapshots, don’t re-execute the graph. Fork-from-node (test a different tool/policy from that state without replaying upstream) is the recovery half. Detection is the half most teams never build.
Generic “show me LLM spans” helps single chains.
Multi-agent systems need boundary-aware ops: That’s the direction we’re building toward with ** Cartha** (SDK-first: traces, scoped memory, budgets, multi-agent nest). We’re still early on full fork-from-node and automatic handoff divergence probes — and we’re honest about that.
If you only take one idea away: **log the handoff, not just the agents.**
If you run multi-agent graphs (LangGraph or otherwise):
Curious what’s worked (or failed) for you in production.
Docs / try: cartha.in/how-to-use