Task Statement 5.3·Domain 5 — 15% of exam
Error Propagation in Multi-Agent Systems
Implement error propagation strategies across multi-agent systems
Official Exam Guide Objectives
Task 5.3: Implement error propagation strategies across multi-agent systems.
Knowledge of
- Structured error context (failure type, attempted query, partial results, alternative approaches) as enabling intelligent coordinator recovery decisions
- The distinction between access failures (timeouts needing retry decisions) and valid empty results (successful queries with no matches)
- Why generic error statuses ("search unavailable") hide valuable context from the coordinator
- Why silently suppressing errors (returning empty results as success) or terminating entire workflows on single failures are both anti-patterns
Skills in
- Returning structured error context including failure type, what was attempted, partial results, and potential alternatives to enable coordinator recovery
- Distinguishing access failures from valid empty results in error reporting so the coordinator can make appropriate decisions
- Having subagents implement local recovery for transient failures and only propagate errors they cannot resolve, including what was attempted and partial results
- Structuring synthesis output with coverage annotations indicating which findings are well-supported versus which topic areas have gaps due to unavailable sources
What You Need to Know
How failure information travels decides whether a multi-agent system degrades gracefully or fails without anyone noticing. A subagent hits a timeout, a permission refusal, a malformed query — and what it sends back up determines every option the coordinator has afterwards. The exam tests three things here: what structured error context contains, the two anti-patterns, and a distinction most developers get wrong.
Structured Error Context
A failing subagent owes the coordinator enough to decide with. Four elements:
1. Failure type. Which kind of failure this is: transient (a timeout or rate limit, so another attempt may work), validation (the input was wrong, so fix it), business (a rule refused it, so find another route or escalate), or permission (access denied, and no retry helps until authorisation changes).
2. What was attempted. The actual query, the parameters, the system it went to. "Searched academic database for 'renewable energy policy' with date range 2022-2024" can be acted on — narrowed, redirected, retried. "Search failed" cannot.
3. Partial results gathered before failure. Three sources retrieved before the timeout are three sources. Discarding them because the operation as a whole did not finish throws away work that already succeeded.
4. Potential alternative approaches. The subagent knows its own domain, and the coordinator does not. A database being unreachable, a query worth broadening, a cached result worth checking — these are suggestions only the failing agent is positioned to make.
{
"status": "partial_failure",
"failureType": "transient",
"attemptedAction": {
"tool": "search_academic_db",
"query": "renewable energy policy",
"dateRange": "2022-2024"
},
"partialResults": [
{
"title": "EU Renewable Energy Directive 2023",
"source": "EUR-Lex",
"retrieved": true
}
],
"alternativeApproaches": [
"Retry with narrower date range (2023-2024)",
"Search alternative database: government_publications",
"Use cached results from previous research session"
]
}With that in hand every option is open: repeat the call, take one of the alternatives, proceed on what was gathered, or escalate — and each is a decision rather than a guess.
The Two Anti-Patterns
The exam tests these explicitly. Both are catastrophic in different ways:
Silent suppression: returning empty results marked as success. The subagent times out and reports { "results": [], "status": "success" }. As far as the coordinator can tell, the search ran and the topic is empty — so it does not retry, does not try elsewhere, and synthesises a report missing an entire area of research. The report reads as complete.
That invisibility is what makes it the worst of the two. A crash announces itself; this does not, and nothing downstream can distinguish a subject that was searched and found barren from one that was never searched at all. The customer-support version is a support agent telling someone they have no account, because the lookup service was down and reported nothing found.
Workflow termination: killing the entire pipeline on a single failure. One subagent times out and everything stops. Four others finished successfully and their work is discarded along with the failure. The response is out of proportion to the event, and it leaves no path forward except starting again.
Between the two sits the correct behaviour: the failure is reported in full, the coordinator judges how much it costs, and the system proceeds on partial results or targeted recovery.
Access Failure vs Valid Empty Result
This distinction is critical and the exam tests it directly:
Access failure: the source was never reached — a timeout, a refused connection, a permission denial. The query did not run, so whether anything matches remains unknown. A retry, as-is or adjusted, is worth considering.
Valid empty result: the source was reached and the query ran. Nothing matched, and that is the answer. Retrying re-executes a successful operation to obtain the same correct result.
Conflating these leads to two problems:
- Treating access failures as valid empty results means you never retry when you should.
- Treating valid empty results as access failures means you waste time retrying a query that will always return nothing.
// Access failure — the tool never reached the data, so a retry may work.
const accessFailure = {
status: "error",
failureType: "transient",
message: "Connection timeout after 30s",
shouldRetry: true,
};
// Valid empty result — the query ran and the answer is "nothing matched".
const validEmptyResult = {
status: "success",
results: [],
message: "Query executed successfully. No matching records found.",
shouldRetry: false,
};Coverage Annotations
A synthesis drawing on several subagents should state where its support is solid and where it is thin. Where the sources on geothermal energy never arrived, the report says so:
"Section on geothermal energy is limited due to unavailable journal access during research."
The alternative is a report that simply covers geothermal lightly, which a reader will interpret as a judgement about the topic's importance rather than a gap in the research. Annotating turns an invisible omission into a known limitation, and only one of those can be followed up.
Local Recovery for Transient Failures
Transient failures belong to the subagent that hit them. Retries, fallback sources, degraded responses — all of it happens locally, and only what survives that treatment travels upward, carrying what was attempted and whatever partial results exist.
The benefit is structural. A coordinator that handles every transient failure of every subagent has to know each subagent's failure modes, which is knowledge that belongs where the failure occurs. Handling it locally leaves the coordinator dealing only with failures that are genuinely its problem.
Deep Dive
is_error — the API-level mechanism for signalling tool failure
At the Messages API level, tool failure has a specific, documented shape: "if the tool itself throws an error during execution... you can return the error message in the content along with \"is_error\": true," and "Claude will then incorporate this error into its response." Crucially, when a tool_result reports an invalid or missing-parameter call, "Claude will retry 2-3 times with corrections before apologizing to the user" — the model attempts local recovery on its own before giving up, which is the same principle this lesson's subagents apply at a higher level (retry locally, propagate only what survives).
Sourceplatform.claude.com › handle-tool-callsfetched 2026-07-30
Client tools vs server tools — who owns the error
Not every failure needs your is_error handling. Client tools (user-defined tools, and Anthropic-schema tools like bash/text_editor) "run in your application" — Claude responds with stop_reason: "tool_use", your code executes, and you return the tool_result including is_error on failure. Server tools (web_search, web_fetch, code_execution, tool_search) run on Anthropic's infrastructure instead, and "you do not need to handle is_error results for server tools" — Claude handles those failures transparently. Knowing which category a failing tool falls into determines whether your coordinator code is even responsible for catching the error at all.
Sources: https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview (client vs server tool split) · https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls (is_error and server tool errors) (fetched 2026-07-30)
Errors compound in stateful, long-running agent systems
Anthropic's own multi-agent research system was built around the observation that "without effective mitigations, minor system failures can be catastrophic for agents... errors occur, we can't just restart from the beginning." Because agents hold state across many steps, a single unhandled failure doesn't stay local — it can propagate into a wasted multi-step trajectory. This is the production-grade justification for why silent suppression and workflow termination are both wrong: suppression hides the failure until it compounds invisibly, and termination throws away everything the system had already legitimately accomplished.
Sourceanthropic.com › multi-agent-research-systemfetched 2026-07-30
Resume-from-failure instead of restart-from-scratch
The documented fix at Anthropic is durable execution: "we built systems that can resume from where the agent was when the errors occurred." This is the architectural sibling of this lesson's "proceed with partial results" recovery decision — rather than discarding a partially-completed pipeline (workflow termination) or lying about it having succeeded (silent suppression), the system picks up from the last good state.
Sourceanthropic.com › multi-agent-research-systemfetched 2026-07-30
The prototype-to-production gap: one bad step derails the whole trajectory
Anthropic reports that "one step failing can cause agents to explore entirely different trajectories, leading to unpredictable outcomes," and that "the gap between prototype and production is often wider than anticipated" for exactly this reason. A coordinator that receives a generic "search unavailable" status has no way to tell whether the agent should retry, redirect, or continue with what it has — it can only guess, and guessing is how one failure metastasizes into a derailed trajectory. Structured error context (failure type, attempted action, partial results, alternatives) is the concrete fix that keeps a single failure from cascading.
Sourceanthropic.com › multi-agent-research-systemfetched 2026-07-30
Non-determinism means production tracing is required to diagnose failures
Because "agents make dynamic decisions and are non-deterministic between runs, even with identical prompts," Anthropic found that "adding full production tracing let us diagnose why agents failed and fix issues systematically," while monitoring "agent decision patterns and interaction structures—all without monitoring the contents of individual conversations." The same structured fields a coordinator needs for automated recovery (failure type, attempted query, partial results) are also what a human debugging the system after the fact needs — structured error context serves both real-time recovery and post-hoc diagnosis.
Sourceanthropic.com › multi-agent-research-systemfetched 2026-07-30
Quick Reference
| Fact | Value |
|---|---|
| Four structured error elements | Failure type · what was attempted · partial results · alternative approaches |
| Four failure type categories | Transient · validation · business · permission |
| Access failure vs valid empty result | Access failure = retry candidate; valid empty result = the answer, no retry |
is_error: true | Client-tool failure signal returned in tool_result content |
Server tools and is_error | Not your responsibility — Anthropic's infrastructure handles server-tool errors transparently |
| Invalid tool call default behaviour | Claude retries 2–3 times with corrections before apologising |
| Anti-pattern 1 | Silent suppression — empty results marked as success (worst anti-pattern) |
| Anti-pattern 2 | Workflow termination — killing the whole pipeline on one subagent failure |
| Correct recovery pattern | Local retry first; propagate only unresolved errors with context; resume from last good state |
| Why generic errors fail | They hide the query, partial results, and alternatives the coordinator needs to decide |
| Coverage annotations | Explicitly mark synthesis gaps ("limited due to X") rather than silently omitting them |
Exam Traps
Practice Scenario
A web search subagent in a multi-agent research system times out while researching a complex topic. You need to design how this failure information flows back to the coordinator. Which approach best enables intelligent recovery?
Build Exercise
Build a Structured Error Propagation System
Difficulty: Advanced (3/4)
50 minutes
- Define a structured error schema with fields: failureType (transient/validation/business/permission), attemptedAction (tool, query, parameters), partialResults (array of any retrieved data), and alternativeApproaches (suggested recovery strategies)
Why: Structured error context enables intelligent coordinator recovery. The four elements give the coordinator everything it needs to decide: retry, try an alternative, proceed with partial results, or escalate. Generic error messages like search unavailable prevent all informed recovery.
You should see: A TypeScript interface or JSON schema with failureType as an enum of the four categories, attemptedAction as an object with tool/query/parameters, partialResults as an array, and alternativeApproaches as a string array. Each field should have a description explaining its purpose.
- Implement a subagent that distinguishes access failures (timeout, connection error) from valid empty results (successful query, no matches) in its error reporting
Why: Conflating access failures with valid empty results is a critical error the exam tests directly. Access failures mean the query did not execute and should be retried. Valid empty results mean the query succeeded and found nothing, which IS the answer. Treating them the same leads to either never retrying when you should or wasting time retrying queries that will always return nothing.
You should see: A subagent function that catches exceptions (timeouts, connection errors) and reports them as access failures with shouldRetry: true, while successful queries returning no results are reported as success with an empty results array and shouldRetry: false.
- Build local retry logic for transient failures within the subagent (3 retries with exponential backoff) before propagating to the coordinator
Why: Subagents should handle their own transient failures locally before escalating. This reduces coordinator complexity as the coordinator does not need to manage retry logic for every possible transient failure across every subagent. Only persistent failures that survive local retry should propagate.
You should see: A retry wrapper with exponential backoff (e.g., 1s, 2s, 4s) that attempts the operation up to 3 times before propagating the structured error to the coordinator. Partial results gathered before failure should be preserved across retries.
- Create a coordinator that receives structured errors and decides between retry with modified query, alternative approach, or proceed with partial results
Why: The coordinator is the intelligent recovery decision-maker. With structured error context, it can make informed choices rather than applying blanket policies. This is the correct middle ground between silent suppression (ignoring failures) and workflow termination (killing the pipeline on one failure).
You should see: A coordinator function that examines the failure type, checks partial results, evaluates alternative approaches, and selects the appropriate recovery strategy. It should handle all four failure types differently and never silently suppress errors.
- Add coverage annotations to synthesis output noting which findings are well-supported versus which topic areas have gaps due to unavailable sources
Why: Coverage annotations let the consumer know what the report covers fully and where there are known limitations. Without them, a gap looks like the topic was not relevant rather than the source being unavailable. This transparency is far better than silently omitting topics.
You should see: A synthesis output that includes a coverage section listing each topic area with its data quality status: well-supported, limited (with reason), or unavailable (with reason). Failed subagent topics should be explicitly noted, not silently omitted.
Sources
- Claude Certified Architect Foundations Exam Guide — Domain 5, Task Statement 5.3 — Anthropic
- Anthropic Multi-Agent Patterns — Anthropic
- Handle tool calls — Anthropic
- How we built our multi-agent research system — Anthropic
Appendix A — Build Exercise Step Hints
Progressive hints revealed by the "Stuck? Get a nudge" control on each step.
Step 1. Define a structured error schema with fields: failureType (transient/validation/business/permission), attemptedAction (tool, query, parameters), partialResults (array of any retrieved data), and alternativeApproaches (suggested recovery strategies)
Why: Structured error context enables intelligent coordinator recovery. The four elements give the coordinator everything it needs to decide: retry, try an alternative, proceed with partial results, or escalate. Generic error messages like search unavailable prevent all informed recovery.
You should see: A TypeScript interface or JSON schema with failureType as an enum of the four categories, attemptedAction as an object with tool/query/parameters, partialResults as an array, and alternativeApproaches as a string array. Each field should have a description explaining its purpose.
Stuck? Get a nudge
Step 2. Implement a subagent that distinguishes access failures (timeout, connection error) from valid empty results (successful query, no matches) in its error reporting
Why: Conflating access failures with valid empty results is a critical error the exam tests directly. Access failures mean the query did not execute and should be retried. Valid empty results mean the query succeeded and found nothing, which IS the answer. Treating them the same leads to either never retrying when you should or wasting time retrying queries that will always return nothing.
You should see: A subagent function that catches exceptions (timeouts, connection errors) and reports them as access failures with shouldRetry: true, while successful queries returning no results are reported as success with an empty results array and shouldRetry: false.
Stuck? Get a nudge
Step 3. Build local retry logic for transient failures within the subagent (3 retries with exponential backoff) before propagating to the coordinator
Why: Subagents should handle their own transient failures locally before escalating. This reduces coordinator complexity as the coordinator does not need to manage retry logic for every possible transient failure across every subagent. Only persistent failures that survive local retry should propagate.
You should see: A retry wrapper with exponential backoff (e.g., 1s, 2s, 4s) that attempts the operation up to 3 times before propagating the structured error to the coordinator. Partial results gathered before failure should be preserved across retries.
Stuck? Get a nudge
Step 4. Create a coordinator that receives structured errors and decides between retry with modified query, alternative approach, or proceed with partial results
Why: The coordinator is the intelligent recovery decision-maker. With structured error context, it can make informed choices rather than applying blanket policies. This is the correct middle ground between silent suppression (ignoring failures) and workflow termination (killing the pipeline on one failure).
You should see: A coordinator function that examines the failure type, checks partial results, evaluates alternative approaches, and selects the appropriate recovery strategy. It should handle all four failure types differently and never silently suppress errors.
Stuck? Get a nudge
Step 5. Add coverage annotations to synthesis output noting which findings are well-supported versus which topic areas have gaps due to unavailable sources
Why: Coverage annotations let the consumer know what the report covers fully and where there are known limitations. Without them, a gap looks like the topic was not relevant rather than the source being unavailable. This transparency is far better than silently omitting topics.
You should see: A synthesis output that includes a coverage section listing each topic area with its data quality status: well-supported, limited (with reason), or unavailable (with reason). Failed subagent topics should be explicitly noted, not silently omitted.
Stuck? Get a nudge
Appendix B — Interactive Study Prompts
Two prompts to paste into Claude. B1 drills the judgement the exam actually measures; B3 reviews the code you wrote for the Build Exercise above. The exam simulator between them is the interactive quiz on this page.
B1. Concept Check — Discrimination Drill
You are examining me for the Claude Certified Architect – Foundations (CCAR-F) exam, Domain 5: Context Management & Reliability (15% of the exam), Task Statement 5.3: Error Propagation in Multi-Agent Systems. Use British English throughout.
What this exam actually measures. Not one item on the official exam asks what something is. Every item drops you into a production system that is already misbehaving, offers four defensible engineering responses, and asks which is best. The skill being tested is proportionality: fix the root cause with the cheapest instrument that gives the guarantee the situation demands. So do not quiz me on definitions. Make me choose between options that are both defensible, then attack whatever I chose.
How to run this session.
- One question at a time. Stop and wait. Never answer your own question, and never move on until I have committed.
- Never reveal which option is right before I commit to one.
- Do not praise me. A correct answer earns "Yes" and the next question. If I am right for the wrong reason, say so — that is the failure that costs marks on exam day.
- When I am wrong, quote the exact phrase in my answer that gave it away, correct it in one sentence, and move on. One correction at a time.
- If I write something fluent but empty, name it: "That is a restatement, not a reason."
- Set every scenario inside one of the exam's production contexts: the Multi-Agent Research System (a coordinator delegating to web-search, document-analysis, synthesis and report-generation subagents that produce cited reports), the Customer Support Resolution Agent (Agent SDK, MCP tools
get_customer,lookup_order,process_refund,escalate_to_human, held to an 80%+ first-contact resolution target), Structured Data Extraction over batches of documents, or Code Generation with Claude Code over an unfamiliar repository.
Session plan — about twelve questions.
Round 1 — Anchor (1 question). One concrete question to check I have actually read the material. If I cannot answer it, stop the session and tell me to read the lesson before continuing.
Round 2 — Discrimination (5 questions). Each one: describe a symptom in one of the contexts above, with a number or a log observation in it. Offer exactly two responses, both defensible. Ask me to pick one and justify it in a single sentence. Then argue the case for the option I rejected as strongly as you can, and ask whether I am holding or changing my answer. Only after I answer that, tell me which is right and why the other one is the more tempting trap.
Round 3 — Proportionality (2 questions). Both turn on the size of the instrument, which is where this domain is decided: enrich what already exists or build something new, recover automatically or put a human on it. Ask the first where the cheap fix is genuinely enough — making the subagent return failure type, attempted query, partial results and alternatives instead of a generic status, so the coordinator can already decide — and a retry orchestration service, a circuit-breaker layer or a supervising model would be over-engineering. Ask the second on a symptom that reads the same but where the failure is a business rule violation or a permission denial on a refund, so no amount of retrying or alternative-seeking is legitimate and the correct recovery route is a human decision. Tell me which was which only after I have answered both. If I reach for the elaborate option both times, or the cheap one both times, that is the finding — say so.
Round 4 — Code review (3 questions). Present a colleague's confident proposal containing one of the trap errors listed below, written the way a teammate would write it in a pull request. Ask me what is wrong with it. Do not signal that anything is wrong.
Round 5 — Verdict. Rate me green, amber or red on each concept below. Name the single weakness most likely to cost me marks, and give me one specific next action: a section of this lesson to re-read, or a step of the Build Exercise to redo. If I am not ready for this task statement, say so plainly.
Concepts in scope
- Structured error context — a failing subagent hands back four things: the failure type, what it attempted with which tool and parameters, whatever it had already retrieved, and the alternative approaches it can see from inside its own domain.
- The four failure categories — transient, validation, business and permission, each pointing at a different recovery route, which is why a single generic status leaves the coordinator with nothing to reason about.
- Silent suppression — catching a failure and returning an empty result marked as success, the worst of the two anti-patterns because the coordinator never learns there is anything to recover from and the output looks complete.
- Workflow termination — killing the whole pipeline because one subagent failed, discarding the work every other subagent legitimately completed and offering no recovery path.
- Access failure versus valid empty result — a timeout means the query never ran and retry is worth considering; a query that executed and matched nothing is the answer, and retrying it will always return nothing.
- Local recovery, then propagation and coverage annotation — the subagent absorbs its own transient failures first and propagates only what survives, and the synthesis names the gap rather than quietly dropping the topic.
Trap errors to plant in Round 4
- Catching a timeout and returning an empty result set with a success status attached.
- Terminating the entire research pipeline because one subagent timed out.
- Returning a generic "search unavailable" once retries are exhausted, with no query, partial results or alternatives attached to it.
- Retrying a query that executed correctly and legitimately matched nothing, because an empty response looks like a failure.
Stay inside the material above. If I raise something outside it, tell me it is out of scope for this task statement and return to the drill. Begin with Round 1.
B2. Exam Simulator
Exam simulator
Question 1 of 10
Scenario · Multi-Agent Research System
Your document-analysis subagent times out forty seconds into a run, having already retrieved three of the five papers it was asked to read. You are designing what it hands back to the coordinator. Which error propagation approach best enables intelligent recovery?
B3. Build Coach — Code Review
The Build Exercise and its hint ladder are already on this page. This prompt is for the one thing the page cannot do: review the code you actually wrote.
You are a staff engineer reviewing my implementation of a build exercise for the Claude Certified Architect – Foundations exam, Domain 5, Task Statement 5.3: Error Propagation in Multi-Agent Systems. Use British English throughout.
I am building a structured error propagation system: the shape a failing subagent hands back, a subagent that can tell a failure to reach the source apart from a query that ran and matched nothing, local retry with backoff before anything leaves the subagent, a coordinator that picks a recovery route from what it receives, and synthesis output that states its own coverage gaps.
It has to satisfy all of the following:
- An error shape carrying the failure category, the attempted action with its tool, query and parameters, anything already retrieved, and suggested alternatives.
- A subagent that reports caught infrastructure errors as retryable and an executed query with no matches as a non-retryable success.
- Retry with exponential backoff inside the subagent, carrying accumulated partial results forward across attempts before anything reaches the coordinator.
- A coordinator that branches differently on each of the four categories and never converts a failure into a success.
- Synthesis output with a coverage section marking each topic area well-supported, limited or unavailable, with the reason attached to anything short of well-supported.
How to review.
- Ask me to paste my code. If I have not pasted any, ask for it and nothing else. Do not write the implementation for me, do not offer a reference solution, and do not fill in a step I have skipped.
- Work through the criteria above in order. For each one, quote the line of my code that satisfies it, or say plainly that nothing does.
- Then hunt for the failure modes below. Each is a real production bug, not a style preference.
- Rank everything you find: (1) would fail in production, (2) would lose marks on the exam, (3) style. Give me the first item under (1) and then stop — wait for my fix before giving me the next one.
- If my code satisfies everything, do not congratulate me. Change the requirements — two subagents now fail in the same run, one on a permission denial and one on a timeout that yielded three of five sources — and make me handle it.
- If I ask you to just write it for me, refuse once and give me the smallest nudge that would unblock me instead.
Failure modes to probe
- A catch block that logs the problem and returns an empty list, which is silent suppression however carefully the log line is worded.
- The coordinator treating anything that is not a success as fatal, so one timeout still costs the run every result the other subagents produced.
- Partial results gathered during retries and then dropped when the last attempt fails, so the propagated error arrives empty of the work already done.
- Retry wrapped around the whole subagent including the empty-result path, so a query that correctly matched nothing gets attempted three times.
- Alternatives generated as generic advice rather than something the coordinator can act on without going back and asking.
Start by asking me for my code.