Review comments about a chain of agents usually describe the happy path. The failure model is the part that says which hop can fail, what error each caller must raise, and what each caller is allowed to do with that error. Until that model is written down, no test can be wrong or right, because there is nothing to assert against.
Start by listing every hop in the chain. A typical research pipeline has a planner, a retriever, a tool executor, a summarizer and a writer. Each hop has one downstream dependency and one upstream caller, which gives you two questions per hop: what can fail here, and what must my caller do about it.
The table below is the artifact to get reviewed. Fill one row per hop and per failure class. The point of the exercise is that the caller decision column holds a decision, not a sentence. If you cannot choose retry, fall back or abort for a row, you do not yet understand that hop.
| Hop | Failure class | Error the hop raises | Caller decision | Log fields that prove it |
|---|---|---|---|---|
| Retriever | Tool returns HTTP 500 | ToolError with tool name and status | Retry up to 2 times, then abort the task | trace_id, hop, tool, status, attempt, final_decision |
| Retriever | Tool call exceeds 20 s | TimeoutError with elapsed ms | Abort, no retry, set partial context flag | trace_id, hop, timeout_ms, retry_suppressed |
| Planner | Model returns unparseable plan | ContractError with raw payload hash | Abort the run, do not pass to executor | trace_id, hop, validator, payload_hash |
| Executor | Valid plan names a nonexistent tool | ValidationError | Abort, log tool name, page the owning team | trace_id, hop, requested_tool, known_tools_version |
| Summarizer | Plausible but wrong summary | None raised (semantic) | Re-check claims against retrieved source, flag mismatch | trace_id, hop, claims_checked, claims_failed |
| Writer | Output omitted a required field | SchemaError | Abort delivery, keep the draft | trace_id, hop, missing_field, draft_id |
Two rows in that table behave very differently. The first four failures raise exceptions and stop the chain. The summarizer row is the dangerous one, because nothing throws. Work on LLM-based multi-agent systems has shown that they coordinate through unstructured natural language, which makes them prone to semantic failures such as hallucinations, misinterpreted instructions and reasoning drift that propagate silently without raising runtime exceptions MAS-FIRE. A test suite that only checks for exceptions will pass while the worst class of failure runs through your chain untouched.



