Claude Certified Architect
Foundations
Table of Contents
Click any entry to jump straight to it. You can also use the sidebar on the left at any time, filter chapters with the search box, and move with the ← / → arrow keys.
How to Use This Book
This guide is a complete course, not a summary. Read it front to back once, then use the practice questions and quick-reference tables to drill weak spots.
The book is organized to mirror the exam itself. After this front matter and an exam-strategy chapter, there is one chapter per exam domain, weighted roughly to how heavily that domain is tested. A cross-cutting chapter collects the "anti-patterns" (the wrong answers the exam loves to dangle in front of you), because recognizing them is often the fastest route to the correct choice. The book closes with a readiness self-assessment, thirty worked scenario-style practice questions, a glossary, and a footnote of official external resources.
How the reader works
Use the table of contents on the left to jump anywhere. The arrow buttons at the bottom of each page move you forward and back, and your keyboard's ← / → arrow keys do the same. The progress bar at the top tracks how far through the book you are. Everything is on one page, so you can also use your browser's Find (Ctrl/Cmd-F) to search the entire book, and Print (Ctrl/Cmd-P) produces a clean, expanded PDF with all answer explanations revealed.
The exam rewards judgment about trade-offs, not memorization of syntax. Nearly every question is a short scenario ending in "what should the architect do?" For each concept in this book, don't just learn what it is. Learn when you'd choose it over the alternative, and what breaks if you choose wrong. The "Exam lens" boxes throughout call this out explicitly.
Legend for the callout boxes
A fact or definition you should be able to recall cold.
The recommended approach: usually the "correct answer" shape on the exam.
A subtle distinction or common confusion.
A tempting-but-wrong approach. The exam uses these as distractors.
How this specific idea tends to show up in a question.
The Exam at a Glance
What the Claude Certified Architect Foundations (CCAR-F) credential tests, how it is scored, and how to spend your 120 minutes.
What the credential means
The Claude Certified Architect Foundations (often abbreviated CCA‑F or CCAR‑F) validates that a practitioner can make sound architectural trade-off decisions when building real production systems on Claude. It is deliberately not a coding test. Anthropic frames the target candidate as a solution architect with roughly six months of hands-on experience across four technologies: the Claude API, Claude Code, the Claude Agent SDK, and the Model Context Protocol (MCP). If you can build with all four and reason about when to reach for each, you are the intended audience.
Format and logistics
| Attribute | Detail |
|---|---|
| Questions | 60 multiple-choice questions |
| Answer shape | One correct answer, three distractors (single-select) |
| Time limit | 120 minutes (~2 minutes per question) |
| Scoring | Scaled 100-1000; 720 required to pass (≈72%) |
| Delivery | Online, proctored, closed-book |
| Structure | Scenario-based: 4 scenario contexts drawn from a pool of 6 |
| Validity | Credential valid ~12 months |
| Cost | Roughly $99-$125 (often waived for early Partner Network members) |
| Access | Via the Claude Partner Network (free to join); broader public access expected later in 2026 |
Exact price, seat availability, and score-report timing change over time. Treat the numbers above as current-as-of-2026 and confirm against the official exam guide PDF before you book. The content blueprint below is what matters for study and is stable.
The five domains and their weights
Every question maps to one of five domains. The weightings tell you where to invest study time: Agentic Architecture alone is more than a quarter of the exam.
| # | Domain | Weight | ≈ Questions |
|---|---|---|---|
| 1 | Agentic Architecture & Orchestration | 27% | ~16 |
| 2 | Tool Design & MCP Integration | 18% | ~11 |
| 3 | Claude Code Configuration & Workflows | 20% | ~12 |
| 4 | Prompt Engineering & Structured Output | 20% | ~12 |
| 5 | Context Management & Reliability | 15% | ~9 |
The six scenario contexts
The scenarios are the recurring "worlds" the questions live in. You will see four of these six. Knowing them in advance means the framing never surprises you; only the specific trade-off does.
- Customer Support Resolution Agent: an agent that resolves returns, billing, and account issues; heavy on ambiguity handling, escalation, and MCP tools into backend systems.
- Code Generation with Claude Code: using Claude Code to generate, refactor, and document code; configuration and workflow decisions.
- Multi-Agent Research System: a coordinator delegating to research subagents; orchestration, context isolation, and synthesis.
- Developer Productivity Tools: internal tooling built on the API/SDK; structured output and reliability.
- Claude Code in CI/CD: headless Claude Code in pipelines; non-interactive mode, permissions, structured output.
- Structured Data Extraction: pulling schema-valid JSON from messy documents; validation and edge cases.
How to spend the 120 minutes
Two minutes per question is comfortable if you do not stall. A reliable rhythm: read the last sentence of the scenario first (it contains the actual question), then read the scenario body knowing what to look for. Eliminate the two obviously wrong distractors, then choose between the remaining two by asking which one an experienced architect would defend in a design review. Flag anything that takes more than 90 seconds and return to it; there is no penalty for guessing, so never leave a question blank.
When two options both "work," the exam almost always prefers the one that is deterministic, scoped, and fails loudly over the one that is flexible, broad, and relies on the model to police itself. Internalize that single heuristic and a surprising share of questions answer themselves.
Agentic Architecture & Orchestration
The single largest domain. It tests whether you can design the control flow of an agent (the loop that turns a language model into something that acts), and whether you can coordinate several agents without the system collapsing into chaos.
Explain the agentic loop and what drives it; read and react to every stop_reason; choose between a single agent and a multi-agent system; design coordinator/subagent (hub-and-spoke) topologies; isolate subagent context; decide when to delegate versus keep work in one context; and place guardrails and lifecycle hooks correctly.
1.1 What "agentic" actually means
A plain language-model call is a single turn: you send messages, you get text back, you are done. An agent is what you get when you wrap that call in a loop and give the model tools it can invoke. The model is no longer just producing text; it is deciding, step by step, which action to take next, observing the result, and deciding again, until the task is complete. The intelligence that used to live in your hard-coded control flow now lives in the model's choices. Your job as an architect is to build the harness around that intelligence: the loop, the tools, the stopping conditions, and the guardrails.
Anthropic draws a useful distinction between two shapes of system. A workflow is one where the steps are predetermined and orchestrated by code you wrote: the LLM fills in blanks at fixed points. An agent is one where the model itself dynamically directs the steps and tool use, deciding the path at runtime. Both are valid; the exam wants you to know that you should reach for the simplest thing that works. Do not build a multi-agent swarm when a single well-prompted call, or a fixed workflow, would do the job more cheaply and predictably.
Prefer, in order: a single model call → a single call with tools → a single agent with a loop → a multi-agent system. Add complexity only when the current tier demonstrably cannot meet the requirement. Every added agent multiplies token cost, latency, and failure surface.
1.2 The agentic loop
The heartbeat of every Claude agent is the same four-beat cycle. Commit it to memory because the exam phrases many questions in its terms.
- Send the conversation (system prompt, message history, and the list of available tools) to the model.
- Inspect the response's
stop_reasonto learn why the model stopped. - Act: if the model asked to use a tool, execute that tool and append the result to the conversation as a
tool_result. - Repeat: loop back to step 1 with the appended result, until the model returns
end_turn, signalling it is finished.
# The canonical agentic loop (Messages API, Python)
messages = [{"role": "user", "content": user_request}]
while True:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=2048,
tools=tools,
messages=messages,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason == "end_turn":
break # Claude is done: return final text
if response.stop_reason == "tool_use":
tool_results = []
for block in response.content:
if block.type == "tool_use":
result = run_tool(block.name, block.input) # YOUR code executes the tool
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
})
messages.append({"role": "user", "content": tool_results})
continue # loop again with the tool output in context
Claude never executes your tools itself. When it decides to use a client tool it emits a tool_use block (a structured request naming the tool and its inputs) and stops. Your application code runs the tool and feeds the answer back as a tool_result. This client-side execution model is why tool descriptions and error handling (Domain 2) matter so much: the model is reasoning about tools it cannot see the innards of.
1.3 Reading stop_reason: your control signal
The stop_reason field is how the model tells your loop what to do next. Treating it as an afterthought is a classic source of broken agents. Learn all of them.
| stop_reason | Means | What your loop should do |
|---|---|---|
end_turn | Claude finished naturally. | Use the response; exit the loop. |
tool_use | Claude wants to call one or more tools. | Execute the tool(s), append tool_result(s), loop again. |
max_tokens | Output hit your max_tokens cap: response is truncated. | Raise the cap or ask Claude to continue; never treat as complete. |
stop_sequence | Claude emitted one of your custom stop sequences. | Check response.stop_sequence to see which fired. |
pause_turn | A long server-side tool loop (e.g. web search) hit its iteration limit. | Send the assistant response back unchanged to continue the turn. |
refusal | Claude declined for safety reasons. Still an HTTP 200. | Inspect stop_details; rephrase or route to a fallback, do not silently retry the identical request. |
model_context_window_exceeded | Generation hit the context-window ceiling. | Treat output as truncated; reduce input or summarize. |
All of these arrive on a successful HTTP 200 response. A refusal or max_tokens is not a 4xx/5xx error and will not raise an exception. If your loop only handles exceptions, it will happily treat a truncated or refused answer as a finished one. The exam likes to test this: "The agent sometimes returns half-finished code. What is the most likely cause?" → the loop is ignoring max_tokens.
A frequent question shape: an agent "hangs" or "loops forever." The right answer usually involves a missing termination condition (no check for end_turn, or no maximum-iteration guard), not a bigger model or more tokens. Always give an agentic loop a hard iteration ceiling as a safety net.
Single Agent or Many?
The most consequential architectural decision in this domain. Choosing multi-agent when a single agent would do is the more common, and more heavily penalized, mistake.
1.4 When a single agent is right
A single agent with a good loop and a well-chosen tool set handles the large majority of real tasks. Keep to one agent when the task is essentially sequential, when all the work shares the same context, and when the total context comfortably fits the window. One agent is cheaper, easier to debug, has no coordination overhead, and never suffers from information getting lost in hand-offs. The exam's default expectation is a single agent unless the scenario gives you a concrete reason to split.
1.5 When multi-agent earns its keep
Multi-agent systems shine on tasks that decompose into independent, parallelizable subtasks, each of which needs its own large context. Anthropic's own multi-agent research system is the canonical example: a lead agent plans the research, then spawns several subagents that each investigate a different sub-question simultaneously, each burning through its own context window reading sources, before returning a compact summary to the lead for synthesis. The wins are real: parallel exploration is faster, and each subagent's heavy reading never pollutes the others' or the coordinator's context.
The primary architectural motivation for subagents is context isolation, not merely "dividing labor." Each subagent gets a fresh, private context window. It can read ten thousand tokens of documentation, reason over it, and return a two-hundred-token summary, and the coordinator only ever sees the summary. This keeps the coordinator's context clean and focused, which is what preserves its reasoning quality on long tasks.
| Choose a single agent when… | Choose multi-agent when… |
|---|---|
| Work is sequential and shares one context | Subtasks are independent and parallelizable |
| The whole job fits the context window | Each subtask needs its own large context |
| You want the cheapest, simplest system | Isolation of exploration/tokens is worth the overhead |
| Latency and cost are tight | Breadth-first exploration (research, fan-out) dominates |
Every subagent is another full context, another set of model calls, more tokens, more latency, and a new place for information to get dropped during hand-off. Anthropic has publicly noted multi-agent systems can burn many times the tokens of a single agent. If a scenario stresses cost sensitivity or a strictly sequential task, multi-agent is likely the wrong answer.
1.6 Orchestration topologies
Hub-and-spoke (coordinator / orchestrator-worker)
The recommended topology is a hub-and-spoke (also called orchestrator-worker or coordinator-subagent) design. One coordinator agent owns the task: it decomposes the work, spawns subagents, hands each a scoped instruction, collects their results, and synthesizes the final answer. Subagents talk only to the coordinator, never directly to each other. This gives you a single point of control, clear information provenance, and a predictable flow.
┌─────────────────┐
│ Coordinator │ plans, delegates, synthesizes
└───┬────┬────┬────┘
│ │ │ (spokes: scoped tasks in,
┌───────┘ │ └───────┐ summaries out)
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│Subagent │ │Subagent │ │Subagent │ each: own context,
│ A │ │ B │ │ C │ own tools, returns a summary
└─────────┘ └─────────┘ └─────────┘
A flat multi-agent topology, where every agent can message every other agent directly, is a named exam anti-pattern. It produces uncontrolled communication, circular dependencies, duplicated work, and untraceable provenance: you can no longer say which agent produced a given claim. Always funnel coordination through a hub. If an option describes "agents negotiating directly with one another," it is almost certainly the wrong answer.
Task decomposition
Good decomposition is what makes hub-and-spoke work. The coordinator should split a task into subtasks that are independent (one subagent's work does not depend on another's mid-flight), clearly scoped (each subagent gets an unambiguous objective and only the tools it needs), and appropriately sized (not so fine-grained that coordination overhead dominates). The coordinator's prompt is where you tell it how aggressively to fan out and how to recombine results.
"Information provenance" (knowing which subagent or source produced each piece of the final answer) is a recurring theme. Hub-and-spoke preserves it because everything flows back through one coordinator that can tag results by source. Flat topologies destroy it. If a question asks how to keep the final report auditable/traceable, the answer involves centralized coordination and structured summaries, not richer inter-agent chat.
Subagents, Context Forking & the Agent SDK
How delegation actually works in practice: the mechanics of spawning isolated subagents, and the lifecycle hooks that let you enforce rules deterministically.
1.7 Context forking
Context forking is the mechanism behind subagent isolation. When a coordinator delegates, the subagent runs in a forked context: a fresh window that does not carry the coordinator's full history, and whose own token consumption never flows back except as the summary the subagent chooses to return. This is the difference between "the subagent read 50 pages" and "the coordinator now has 50 pages jammed into its context." Forking is what lets you explore expensively without paying for it downstream.
A subagent should hand back a compact, structured result (findings, a decision, a short synthesis), not its entire working transcript. Design each subagent's final instruction to produce exactly the shape the coordinator needs. This preserves the whole point of forking: the coordinator's context stays small and focused.
1.8 Delegation in the Claude Agent SDK
The Claude Agent SDK (the same engine that powers Claude Code, exposed for you to build your own agents) provides first-class primitives for this. Delegation happens through a Task tool (sometimes called the "Agent" or subagent tool): the main agent invokes it with a description and an agent type, and the SDK runs that subagent in its own isolated context, returning only its final message. Subagent types can be defined with their own system prompts, their own restricted tool sets, and their own model choice, so a "researcher" subagent might have web tools and a big model, while a "formatter" subagent has no tools and a small one.
| SDK concept | What it does |
|---|---|
| Agentic loop | The SDK runs the send → stop_reason → tool → repeat cycle for you. |
| Subagents / Task tool | Delegate a scoped task to an isolated, forked context; get back a summary. |
| Custom subagent types | Each has its own system prompt, allowed tools, and model. |
| Hooks | Deterministic code that fires at lifecycle points (see below). |
| Permissions | Allow/deny/ask rules that gate what tools can do. |
| MCP integration | Attach external tools/data via MCP servers (Domain 2). |
1.9 Lifecycle hooks: deterministic control
A hook is your own code that the runtime executes automatically at a defined point in the agent's lifecycle. Hooks are how you enforce things you must not leave to the model's discretion. The key lifecycle points:
PreToolUse: runs before a tool executes. Can inspect the call and block it (e.g. deny arm -rf, require approval for a production write). Deterministic guardrail.PostToolUse: runs after a tool returns. Good for logging, validation, formatting, or reacting to the result (e.g. auto-run tests after an edit).UserPromptSubmit,Stop,SubagentStop,SessionStart,PreCompactand others let you hook input handling, turn completion, subagent completion, and context compaction.
If a rule must always hold (a security constraint, a compliance requirement, "never touch the production database"), enforce it with a hook (deterministic code), not with a sentence in the prompt. A prompt requests behavior; the model may or may not comply. A PreToolUse hook guarantees it. This is one of the exam's most reliable distinctions.
"Add a line to the system prompt telling the agent never to delete files" is a distractor. Prompts are probabilistic guidance; a determined or confused model can still act against them, and a prompt injection can override them. Critical invariants belong in PreToolUse hooks or permission rules where they are enforced in code.
1.10 Session & state management
Agents that run over long or resumable interactions need somewhere to keep state: the evolving message history, intermediate results, and any facts that must survive across turns. The context window is the working memory, but it is finite, so for anything long-lived you externalize state (to a store, a file, a scratchpad) and re-inject only what is relevant. The SDK supports session persistence and resumption so an agent can pause and pick up later. The architectural point the exam probes: don't rely on the context window as durable storage; treat it as a working set and keep the source of truth elsewhere when the interaction outlives a single window. (Context-preservation strategy is developed fully in Domain 5.)
Across this domain, the "senior architect" answer consistently favors: the simplest topology that meets the need; hub-and-spoke over flat; isolated/forked subagent contexts that return summaries; deterministic hooks for hard rules; and a loop that handles every stop_reason and has a termination guard. When a distractor offers "more agents," "direct agent chat," or "just tell it in the prompt," be suspicious.
The Five Workflow Patterns & Guardrails
Before you reach for a fully autonomous agent, know the five composable workflow patterns from Anthropic's "Building Effective Agents." The exam expects you to name the right pattern for a scenario, and to prefer the simplest one that fits.
1.11 The pattern ladder
These build from simplest to most flexible. The rule of thumb: climb the ladder only as far as the task forces you.
| Pattern | Shape | Use when… |
|---|---|---|
| Prompt chaining | Fixed sequence of LLM calls; each step's output feeds the next, with programmatic gates between steps. | The task decomposes into clean, predictable sub-steps (outline → draft → polish). You can validate at each hand-off. |
| Routing | A classifier directs each input to one of several specialized handlers/prompts. | Inputs fall into distinct categories that each deserve a tailored prompt or model (e.g. refund vs. tech-support vs. billing). |
| Parallelization | Run multiple LLM calls at once. Two flavors: sectioning (split into independent subtasks) and voting (run the same task N times and aggregate). | Subtasks are independent (sectioning) or you want diversity/consensus for reliability (voting, e.g. multiple reviewers). |
| Orchestrator-workers | A central LLM dynamically decomposes the task at runtime, delegates to workers, and synthesizes. | You cannot pre-define the subtasks: they depend on the input. This is the dynamic sibling of hub-and-spoke. |
| Evaluator-optimizer | One LLM generates; a second evaluates against criteria and gives feedback; loop until it passes. | You have clear evaluation criteria and iterative refinement measurably helps (translation, complex writing, code). |
Both "send work to specialists," but the distinction is who decides the breakdown and when. Routing picks one pre-defined path from a fixed menu (classification up front). Orchestrator-workers dynamically invents the subtasks at runtime because they can't be known in advance. Fixed categories → routing; unknowable decomposition → orchestrator.
Sectioning splits different pieces of work to run concurrently (each does part of the whole). Voting runs the same task multiple times to get diverse takes and then aggregates (majority, or "flag if any reviewer objects"): a reliability technique, not a speed one.
1.12 Workflow vs. autonomous agent: the deciding question
A workflow orchestrates LLM calls through predefined code paths: you keep control of the flow. An autonomous agent lets the model direct its own actions in a loop, using tools and environmental feedback until a stopping condition. Agents buy flexibility at the price of predictability, higher cost, and compounding errors. Anthropic's explicit guidance: "find the simplest solution possible, and only increase complexity when needed." Often a single optimized call with retrieval and good examples is enough, no agent at all.
When a scenario describes a fixed multi-step pipeline with checks between steps → prompt chaining. Distinct input types needing different handling → routing. Independent parallel subtasks → parallelization (sectioning). Multiple independent checks/opinions for confidence → voting. Runtime-unknown decomposition → orchestrator-workers. Generate-then-critique-then-revise → evaluator-optimizer. Naming the pattern is often half the answer.
1.13 Guardrails
Because agents act with real tools and can compound mistakes, guardrails are part of the architecture, not an afterthought. The exam-relevant guardrail layers:
- Permissions & hooks (deterministic): allow/deny/ask rules and
PreToolUseblocks for anything destructive or irreversible. The hard guarantees. - Bounded loops: a maximum-iteration /
--max-turnsceiling so a stuck agent can't spin or burn budget forever. - Sandboxing & least privilege: run agents in isolated/ephemeral environments with only the tools and access the task needs.
- Human-in-the-loop checkpoints: approvals (plan mode, permission prompts) before high-impact actions.
- Validation & monitoring: check outputs programmatically (Domain 4) and log/trace actions for auditability.
Anthropic recommends extensive testing in sandboxed environments before granting real-world power, precisely because agents' errors compound across a loop. Combine that with deterministic guardrails so a single bad decision can't cascade into damage.
1.14 Parallel tool use
Within a single turn, Claude can request multiple tool calls at once: several tool_use blocks in one response. Your loop should execute them (ideally concurrently) and return all the corresponding tool_result blocks together in the next user message, each keyed by its tool_use_id. Handling only the first tool call and dropping the rest is a subtle bug that stalls agents. This is the intra-turn cousin of the parallelization pattern above.
Tool Design & MCP Integration
Tools are how an agent touches the world. This domain tests whether you can design tools Claude uses correctly, return errors it can act on, and wire in external systems through the Model Context Protocol.
Write tool descriptions and schemas that steer Claude to the right tool with the right arguments; structure error responses so the model can recover; decide which tools each agent should have; and configure MCP servers/clients, understanding its three primitives and its transports.
2.1 A tool is a prompt
From Claude's perspective, a tool is defined entirely by its name, its description, and its input schema. Claude cannot see the code behind the tool. So the description is not documentation for humans: it is instructions to the model about when and how to use this capability. A vague or ambiguous description is the number-one cause of tools being called at the wrong time, with the wrong arguments, or not at all.
State plainly what the tool does, when to use it (and when not to), what each parameter means, units and formats, and any important side effects. Anthropic's guidance: invest more effort in tool descriptions than almost anything else. A few extra sentences of clarity beats clever prompting elsewhere. Describe edge cases and how the tool differs from similar tools so Claude can disambiguate.
{
"name": "get_order_status",
"description": "Look up the current fulfillment status of a customer order by its
order ID. Use this when the customer asks where their order is or whether it
has shipped. Do NOT use this to modify an order; use update_order for that.
Returns status, carrier, and estimated delivery date.",
"input_schema": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "The order ID, formatted like 'ORD-12345'. Ask the
customer for it if not provided; never guess."
}
},
"required": ["order_id"]
}
}
Two tools with overlapping descriptions make Claude hesitate or pick wrong. Give tools distinct, non-overlapping responsibilities and say explicitly how they differ ("use X for reads, Y for writes"). Prefer descriptive names (search_knowledge_base) over cryptic ones (skb).
2.2 Structured, actionable error responses
When a tool fails, how you report the failure decides whether the agent recovers gracefully or spirals. Returning a bare stack trace or an opaque "Error 500" gives Claude nothing to reason about. Instead, return a structured error that tells the model what went wrong and whether it is worth trying again.
| Field | Purpose |
|---|---|
isError | Flags the result as a failure so the model doesn't treat it as valid data. |
isRetryable | Tells the agent whether retrying could succeed (transient timeout) or is pointless (invalid ID). |
errorCategory | Classifies the failure (e.g. not_found, rate_limited, validation, auth) so the agent can choose a strategy. |
| message | A human/model-readable explanation with enough detail to correct course ("order_id must match ORD-#####"). |
# A recoverable error the agent can act on
{
"isError": true,
"isRetryable": false,
"errorCategory": "validation",
"message": "No order found for 'ORD-9'. IDs look like 'ORD-12345' (5 digits).
Ask the customer to re-check the number."
}
A well-formed error steers the next action. isRetryable: true on a transient failure invites a retry; isRetryable: false with a clear reason tells the agent to stop retrying and try something else (ask the user, use another tool, escalate). This turns brittle failures into graceful recovery.
Two failure modes the exam punishes: (1) swallowing an error and returning empty/normal-looking output, so the agent proceeds on a false premise; and (2) returning a raw exception with no structure, so the agent cannot tell transient from permanent and either gives up or retries forever. Fail loudly and informatively.
The Model Context Protocol
MCP is the open standard for connecting Claude to external tools and data. Anthropic calls it "a USB-C port for AI": one protocol so any client can talk to any server. The exam leans on MCP heavily.
2.3 Why MCP exists
Before MCP, every integration between an AI application and an external system (a database, GitHub, Slack, a filesystem) was bespoke: an M×N explosion of custom connectors. MCP replaces that with a single, open, client-server protocol. A host application (Claude Desktop, Claude Code, your own agent) runs one or more MCP clients, each of which connects to an MCP server that exposes some capability. Write a server once and any MCP-speaking client can use it; add a client once and it can use any MCP server.
2.4 The three primitives
An MCP server can expose three kinds of things. Know all three and who controls each.
| Primitive | What it is | Controlled by |
|---|---|---|
| Tools | Executable functions the model can call to do things (query a DB, send a message, call an API). Model-driven. | Model decides when to invoke. |
| Resources | Read-only data the server exposes for context (a file, a record, a document), addressed by URI. Application-driven. | Application/user selects what to load. |
| Prompts | Reusable prompt templates/workflows the server offers (e.g. a "summarize this PR" template). User-driven. | User typically invokes explicitly. |
The classic MCP distinction: tools do, resources are. A tool performs an action and is invoked by the model as part of its reasoning; a resource provides data and is loaded into context, usually under application or user control. If a scenario needs the agent to fetch and act, that's a tool. If it needs to expose reference data for grounding, that's a resource. Prompts are pre-built templates the user triggers.
2.5 Transports
MCP clients and servers communicate over a transport. Two matter for the exam:
- stdio: the server runs as a local subprocess and communicates over standard input/output. Ideal for local tools (filesystem, a local script) where client and server live on the same machine. Fast, simple, no network.
- Streamable HTTP (the modern remote transport, superseding the older HTTP+SSE): the server runs as a remote service reached over HTTP, supporting streaming. Ideal for hosted/shared servers and remote APIs, and where auth (e.g. OAuth) is needed.
Underneath, MCP uses JSON-RPC 2.0 as its message format regardless of transport. Choose stdio for local, single-user tools; choose Streamable HTTP for remote, multi-user, or networked services.
2.6 Configuring MCP servers
In Claude Code and SDK-based agents, MCP servers are declared in configuration, most commonly a .mcp.json file. Each entry names a server and says how to launch or reach it (command + args for stdio, or a URL for HTTP), plus any environment/credentials.
// .mcp.json: checked into the repo so the whole team shares these servers
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "./src"]
},
"github": {
"type": "http",
"url": "https://api.githubmcp.example/mcp",
"headers": { "Authorization": "Bearer ${GITHUB_TOKEN}" }
}
}
}
A project-scoped .mcp.json lives in the repo and is shared via version control: everyone on the team gets the same servers. A user-scoped configuration (e.g. in ~/.claude.json) holds personal servers and credentials that shouldn't be shared. Put team infrastructure in the project file; put your personal API keys in user scope. (This mirrors the CLAUDE.md scoping in Domain 3.)
2.7 Distributing tools across agents
When you have many tools and (per Domain 1) multiple agents, who gets what is an architectural choice. The guiding principle: give each agent only the tools its role requires.
Handing the full tool catalog to every agent causes reasoning overload: with dozens of similar tools in context, Claude spends reasoning on selection, confuses overlapping tools, and picks wrong more often. It also widens the blast radius of a mistake. Scope tools per agent role: the researcher gets search tools, the writer gets none, the ops agent gets the deploy tool. Fewer, well-chosen tools per agent means better selection and tighter security.
Two reliable Domain 2 answers: (1) when a tool is being misused or ignored, fix the description/schema before touching the model or prompt; (2) when an agent has "too many tools," the fix is role-scoped tool distribution (and possibly splitting into subagents), not a bigger model. And remember: critical restrictions on what a tool may do belong in permissions/hooks, not in the tool's description.
Advanced Tool & MCP Engineering
Beyond a good description, the details that separate a tool Claude uses flawlessly from one it fumbles, and the MCP capabilities the exam expects you to recognize.
2.8 Designing tools that are hard to misuse
Anthropic frames tool design as interface design: put as much effort into your tools as you would into a good human-computer interface. Several concrete techniques:
| Technique | Why it matters |
|---|---|
| Poka-yoke (mistake-proofing) | Shape parameters so wrong usage is hard. Prefer an enum over a free-text string; require an absolute path instead of a relative one; make ambiguous-but-critical fields required. The schema itself prevents errors. |
| Return meaningful context, not raw dumps | A tool should return what Claude needs to reason, in a natural format, not a giant blob of low-signal data. Filter, summarize, or paginate. High-signal results improve the next decision and save context. |
| Consolidate over-fragmented tools | Many tiny overlapping tools cause selection overload. Sometimes one well-parameterized tool beats five near-duplicates. (Balance against clarity: don't build one god-tool either.) |
| Namespacing | With many MCP servers, prefix tool names by service (github_create_issue, jira_create_issue) so similar tools don't collide or confuse. |
| Token-efficient results | Tool outputs consume context. Return identifiers and summaries the agent can expand on demand rather than everything up front. |
Decide deliberately what a tool returns and in what shape. Return the fields Claude will actually use, name them clearly, and keep formatting overhead low. A tool that returns a tidy, relevant result is used correctly far more often than one that returns a wall of JSON.
If a scenario says a tool "returns too much data and the agent gets confused / runs out of context," the answer is usually to curate the tool's output (summarize/filter/paginate), not to enlarge the context window. If the agent "passes malformed arguments," tighten the schema (enums, required, formats): poka-yoke.
2.9 MCP capabilities you should recognize
Beyond the three primitives (tools, resources, prompts) and the two transports (stdio, Streamable HTTP), the exam may touch these MCP concepts:
- Authentication / OAuth: remote (HTTP) MCP servers commonly authenticate via OAuth 2.0 so a server can act on a user's behalf against a third-party API. Local stdio servers typically rely on local credentials/env vars.
- Roots: a client-provided set of filesystem/URI boundaries that tell a server where it's allowed to operate; a scoping/safety mechanism.
- Sampling: a server can ask the client's model to generate a completion on its behalf (the client stays in control of model choice and approval). Enables agentic behavior inside a server without the server holding its own model keys.
- Discovery: clients query a server at connect time to list its available tools/resources/prompts, so capabilities are advertised dynamically rather than hard-coded.
2.10 MCP configuration scopes
When you register MCP servers for Claude Code (e.g. via claude mcp add), you choose a scope: the same shared-vs-personal split that recurs across the exam:
| Scope | Stored in | Who gets it |
|---|---|---|
| local | Your user settings for this project only | Just you, just this project (default; good for experiments & secrets) |
| project | .mcp.json committed to the repo | Everyone who clones the repo: shared team infrastructure |
| user | Your user-level config | You, across all your projects |
Shared team infrastructure → project scope, version-controlled. Personal or secret servers → local/user scope, never committed. This same logic governs CLAUDE.md, settings, and MCP config alike.
Claude Code Configuration & Workflows
Claude Code is Anthropic's agentic coding tool in the terminal. This domain tests how you configure it (memory, rules, skills, permissions) and how you drive it in real developer and CI/CD workflows.
Use the CLAUDE.md memory hierarchy correctly; scope rules to paths; build custom slash commands and skills (including context: fork and allowed-tools); choose plan mode vs. direct execution; run headless in CI/CD with the right flags and structured output; and set permissions safely.
3.1 CLAUDE.md: the project's memory
CLAUDE.md is a special file Claude Code automatically loads into context at the start of a session. It is where you record the things Claude should always know about this project: architecture and conventions, how to build and test, coding standards, naming patterns, "do this / never do that" rules, and pointers to key files. Think of it as the durable, version-controlled briefing you'd give a new engineer, except Claude re-reads it every session.
It consumes context on every turn, so make it high-signal: concrete conventions and commands, not a wall of prose. Prefer imperative, testable statements ("Run pnpm test before every commit"; "Use tabs, not spaces"; "Never edit files in /generated"). Bloated memory files dilute attention: a Domain 5 concern that starts here.
The memory hierarchy
Claude Code reads memory from several locations and merges them, with more-specific scopes layering on top of broader ones. Know the levels and precedence.
| Level | Location | Scope / use |
|---|---|---|
| Enterprise | System-wide managed policy file | Organization-wide standards pushed to everyone. |
| Project | ./CLAUDE.md (repo root, committed) | Shared team conventions for this repo: the main one. |
| Project (local) | ./CLAUDE.local.md (git-ignored) | Your personal, uncommitted project notes. |
| User | ~/.claude/CLAUDE.md | Your personal preferences across all projects. |
| Subdirectory | CLAUDE.md in nested folders | Loaded on demand when Claude works in that subtree. |
Nested files let a monorepo give each package its own conventions; the closest file to the code being edited wins on conflicts, layered over the broader files. You can also pull in other files with @path/to/file imports to avoid duplication.
Team-wide truth goes in the committed CLAUDE.md; personal, machine-specific, or secret things go in CLAUDE.local.md (git-ignored) or user-level memory. The exam tests this split: "how do you share build conventions with the whole team?" → project CLAUDE.md in version control. "How do you keep your personal scratch notes out of everyone's way?" → local/user memory.
3.2 Rules & path-scoping
Beyond a single memory file, Claude Code supports a .claude/rules/ directory of rule files that use YAML frontmatter to declare when each rule applies, most importantly, scoping a rule to file paths via glob patterns. This lets you say "these constraints apply only to files under src/payments/" without loading them for unrelated work.
# .claude/rules/payments.md
---
globs: "src/payments/**/*.ts"
description: "Rules for the payments module"
---
- Never log full card numbers; mask all but the last four digits.
- All monetary amounts are integers in the smallest currency unit (cents).
- Every write to the ledger must go through `postTransaction()`.
Path-scoped rules keep guidance relevant and lean: the payments constraints only enter context when Claude touches payments code. This is better than dumping every rule into one giant CLAUDE.md, which wastes context and dilutes attention on unrelated tasks.
Rules and CLAUDE.md are still instructions to the model: strong guidance, but probabilistic. For rules that must be guaranteed (never run a destructive command, never touch prod), combine them with permissions and hooks (§3.5, and Domain 1 §1.9), which enforce deterministically.
Skills, Slash Commands & Plan Mode
The extensibility surface of Claude Code (reusable capabilities and workflows), plus the single most-tested workflow decision: plan first, or execute directly.
3.3 Custom slash commands
A slash command is a reusable prompt saved as a Markdown file, invoked by typing /name. Project commands live in .claude/commands/ (shared via the repo); personal ones in ~/.claude/commands/. They can take arguments (via $ARGUMENTS or positional $1, $2) and are perfect for codifying repeated workflows, such as "/review", "/write-tests", or "/changelog", so the whole team runs them the same way.
# .claude/commands/fix-issue.md → invoked as: /fix-issue 123
---
description: "Investigate and fix a GitHub issue"
allowed-tools: ["Bash(git*)", "Edit", "Read"]
---
Look at GitHub issue #$1. Reproduce it, find the root cause,
fix it, and add a regression test. Explain the fix before committing.
3.4 Skills
Agent Skills package expertise (instructions, and optionally scripts and resources) into a folder with a SKILL.md that Claude loads when relevant. Skills are model-invoked (Claude decides to use one based on its description) and progressively disclosed (only the metadata is always in context; the body loads on demand), which keeps them cheap. Two frontmatter options the exam calls out:
| Frontmatter | Effect |
|---|---|
context: fork | Runs the skill in an isolated, forked context (a subagent-style separate window), so its work doesn't consume or clutter the main conversation's context. Use for skills that read/produce a lot. |
allowed-tools | Restricts the skill (or command) to a specific set of tools: least-privilege. The skill can only use what you list. |
context: fork is context isolation, againThe same forking idea from Domain 1 appears here. A skill marked context: fork does its heavy lifting in a separate context and returns just the result, keeping the main session lean. If a question describes a skill that "pollutes the conversation with intermediate output," the fix is context: fork.
3.5 Permissions & hooks in Claude Code
Claude Code gates tool actions through a permission system: rules that allow, deny, or ask for each kind of action (e.g. allow Read, ask before Bash(git push), deny Bash(rm -rf*)). Settings live in .claude/settings.json (project, committed) or user settings. Combined with hooks (PreToolUse, PostToolUse, etc.), this is your deterministic safety layer.
Grant the narrowest permissions that let the workflow succeed, and require approval (or deny outright) for anything destructive or irreversible. In interactive use you can approve on the fly; in automation you pre-declare an allowlist (see §3.7).
3.6 Plan mode vs. direct execution
Plan mode puts Claude Code into a read-only research phase: it explores the codebase and proposes a plan without making any changes, and waits for your approval before executing. Direct execution lets it act immediately (read, edit, run) as it goes.
| Use plan mode when… | Use direct execution when… |
|---|---|
| The change is large, risky, or spans many files | The task is small, well-understood, low-risk |
| You want to review the approach before any edits | Speed matters and mistakes are cheap to undo |
| The codebase is unfamiliar and needs exploration first | You're iterating quickly on a tight loop |
| Changes are hard or costly to reverse | Work is easily reversible (e.g. a scratch branch) |
When a scenario involves a substantial or sensitive refactor, especially in unfamiliar or production-adjacent code, the exam-preferred answer is usually plan mode first, review, then execute. Direct execution is right for small, reversible tasks. The theme, think before you touch, echoes across the exam.
Claude Code in CI/CD
Running Claude Code non-interactively (in pipelines, scripts, and automation) where no human is there to approve prompts and outputs must be machine-parseable.
3.7 Headless / non-interactive mode
The -p (or --print) flag runs Claude Code in headless mode: it takes a prompt, does the work, prints the result, and exits, with no interactive session. This is the entry point for CI/CD, cron jobs, git hooks, and any scripted use.
# Headless run in a CI pipeline
claude -p "Review the diff on this PR for security issues and summarize findings" \
--output-format json \
--allowedTools "Read" "Bash(git diff*)" \
--max-turns 15
| Flag | Purpose |
|---|---|
-p / --print | Non-interactive: run once, print, exit. The CI entry point. |
--output-format json | Emit a structured JSON result (message, cost, session id…) instead of prose, so the pipeline can parse it. stream-json streams events. |
--json-schema | Constrain the output to a schema you supply, so downstream steps get exactly the fields they expect. |
--allowedTools / --permission-mode | Pre-declare what may run without prompting: essential when no human can approve. |
--max-turns | Cap the agentic loop so a stuck run can't spin forever (and rack up cost) in CI. |
In CI there is nobody to click "approve." So you must (a) pre-authorize exactly the tools/actions the job needs via an allowlist / permission mode, and (b) request structured output so the next pipeline stage can act on the result deterministically. Interactive approval prompts and free-form prose are both non-starters in automation.
Reaching for a "skip all permissions / bypass" mode in CI to "make it just work" is dangerous: it gives an autonomous agent unrestricted, unattended power over your pipeline and secrets. The correct approach is a tight allowlist scoped to the job, run in an isolated/ephemeral environment, plus --max-turns as a circuit breaker.
3.8 Structured output for pipelines
Because a pipeline stage consumes Claude's output programmatically, you want it typed and predictable. --output-format json gives you a machine envelope; --json-schema forces the content into a shape you define (e.g. {"verdict": "pass|fail", "issues": [...]}). A CI gate can then branch on verdict without parsing prose. This is the Claude Code cousin of the API's structured-output techniques in Domain 4.
Headless -p + explicit --allowedTools allowlist + --output-format json (or --json-schema) + --max-turns ceiling + an isolated runner. That combination is safe, parseable, and bounded: the shape of nearly every correct CI/CD answer on the exam.
Committed CLAUDE.md = shared team truth; local/user memory = personal. Path-scoped rules keep guidance lean. Skills/commands codify reusable workflows; context: fork isolates, allowed-tools restricts. Plan mode before big/risky changes. CI/CD = headless, allowlisted, structured, bounded. Hard guarantees = permissions + hooks, never prose.
Claude Code Subagents, Settings & Integrations
How Claude Code delegates to specialized subagents, how its settings resolve, and how it plugs into the wider toolchain.
3.9 Custom subagents in Claude Code
Claude Code lets you define reusable custom subagents as Markdown files with YAML frontmatter. Each runs in its own context window, with its own system prompt, its own restricted tool access, and optionally its own (cheaper/faster) model. When Claude hits a task matching a subagent's description, it delegates automatically; the subagent works in isolation and returns only its result, keeping the main conversation clean.
# .claude/agents/code-reviewer.md
---
name: code-reviewer
description: "Reviews diffs for bugs and security issues. Use after writing code."
tools: [Read, Grep, Bash(git diff*)] # least privilege
model: haiku # route to a cheaper model
---
You are a meticulous code reviewer. Check the diff for bugs, security
issues, and missing tests. Return a prioritized list of findings only.
| Location | Scope |
|---|---|
.claude/agents/ | Project subagents, shared via version control. |
~/.claude/agents/ | Personal subagents, available across all your projects. |
Three reasons to define one: (1) preserve context by keeping noisy exploration out of the main window; (2) enforce constraints by limiting the subagent's tools; (3) control cost by routing routine work to a smaller model. This is the Claude Code face of Domain 1's forking/isolation idea.
Claude decides when to use a subagent from its description, exactly like a tool. A vague description means it's never invoked (or invoked wrongly). Write the description to say clearly what it does and when to use it ("Use proactively after code changes").
3.10 Settings precedence
Claude Code merges settings from several layers, most-specific winning: the same hierarchy shape as memory. Know the order:
| Layer | File | Note |
|---|---|---|
| Enterprise managed policy | system-level managed settings | Highest precedence; org can't be overridden by users. |
| Project (local) | .claude/settings.local.json | Personal project overrides, git-ignored. |
| Project (shared) | .claude/settings.json | Committed team settings (permissions, hooks, env). |
| User | ~/.claude/settings.json | Your global defaults. |
Settings files hold permission rules, hook definitions, environment variables, and model/tool defaults. Committed settings.json is how a team ships shared permissions and hooks; settings.local.json is your private override.
3.11 Integrations & the SDK relationship
Claude Code is built on the Claude Agent SDK: the same engine you can import to build your own agents in TypeScript or Python. Practical integration surfaces the exam may reference:
- Headless in CI/CD: the
-pflag (Domain 3.7) drives pipelines, git hooks, and cron jobs. - GitHub Actions / PR automation: Claude Code can run in CI to review PRs, triage issues, or implement changes on a branch, gated by an allowlist.
- IDE and terminal: interactive use with the same config (CLAUDE.md, rules, permissions) applying everywhere.
- Agent SDK: when you need a custom agent (not the coding assistant), build directly on the SDK; you get the loop, subagents, hooks, permissions, and MCP support described throughout this guide.
"A team keeps re-writing the same review instructions" → define a project subagent (or slash command). "Routine sub-work is expensive" → subagent on a smaller model. "Shared permissions/hooks for everyone" → committed .claude/settings.json. "Personal override" → settings.local.json. The shared-vs-personal split is tested relentlessly.
Prompt Engineering & Structured Output
Not "prompt tricks," but engineering: writing prompts precise enough for production, and getting output that downstream code can rely on. Plus the economics of batch processing.
Apply the core prompting techniques (explicit criteria, examples, structure, roles, chain-of-thought); force schema-valid output via tool_use; build validation-retry loops; use multi-pass review; and choose the Message Batches API when latency-tolerant.
4.1 The core techniques
Anthropic's prompt-engineering guidance is a toolbox applied roughly in this order of impact. You should recognize each by name and know why it works.
| Technique | What & why |
|---|---|
| Be explicit & specific | State exactly what you want: criteria, format, constraints, edge cases. Claude cannot read intent; vague asks yield vague output. This is the highest-leverage move. |
| Give examples (few-shot) | Show 2-5 input→output examples. Demonstrating the pattern beats describing it, especially for format and tone. Cover edge cases in your examples. |
| Let it think (chain-of-thought) | Ask for step-by-step reasoning before the answer (or use structured thinking). Improves accuracy on complex/analytical tasks by giving the model room to work. |
| Use XML tags / structure | Delimit inputs and sections (<document>, <instructions>) so Claude reliably separates data from instructions and you can target its output. |
| Assign a role (system prompt) | Set persona/expertise and standing rules in the system prompt; it steers tone and priorities across the whole conversation. |
| Prefill the response | Start the assistant turn (e.g. with { or <analysis>) to force format and skip preamble. |
| Chain prompts | Break a complex job into linked steps, each a focused prompt, rather than one overloaded prompt. |
The most repeated Domain 4 idea: replace "write a good summary" with measurable criteria, such as "summarize in 3 bullet points, each under 20 words, covering cause, impact, and fix; use no jargon." Explicit success criteria are what make output consistent and testable in production. When two prompt options compete, the more specific and criteria-driven one is almost always the answer.
"Just tell the model to be accurate/careful/thorough" is a distractor. Adjectives aren't criteria. Specify the standard, give an example of meeting it, and where correctness is critical, validate the output in code rather than trusting the instruction.
4.2 Structured output via tool_use
When you need JSON your code can parse, the reliable method is not "ask nicely for JSON." It's to define a tool with a JSON input schema and let Claude "call" it. Because the API constrains the tool call to your input_schema, you get output matching the schema's shape and types. This is far more reliable than parsing prose and hoping the braces line up.
# Force schema-valid extraction by defining a tool
tools = [{
"name": "record_invoice",
"description": "Save the fields extracted from an invoice.",
"input_schema": {
"type": "object",
"properties": {
"invoice_number": {"type": "string"},
"total_cents": {"type": "integer"},
"due_date": {"type": "string", "format": "date"},
"currency": {"type": "string", "enum": ["USD","EUR","GBP"]}
},
"required": ["invoice_number", "total_cents", "currency"]
}
}]
# Force the call so Claude MUST return this structure:
tool_choice = {"type": "tool", "name": "record_invoice"}
Set tool_choice to require your extraction tool so Claude always answers in-schema. Add enums, required, types, and formats to the schema: they do real constraining work. This underpins the "Structured Data Extraction" scenario.
The schema guarantees shape (it's a valid date string, an integer, an allowed enum) but not truth (the date is the right date). Structural validation is necessary but not sufficient, which leads directly to validation-retry loops.
Validation Loops, Multi-Pass Review & Batch
Turning "usually right" into "reliably right," and knowing when to trade latency for half-price throughput.
4.3 Validation-retry loops
For production reliability you close the loop: take Claude's output, validate it programmatically, and if it fails, feed the specific error back and ask for a corrected version. Validation can be schema checks, business rules (does the invoice total equal the line items?), a checksum, a compile/test run, or a database lookup. The retry includes what was wrong so the model can fix it rather than guess again.
result = extract(document)
for attempt in range(MAX_RETRIES):
errors = validate(result) # YOUR deterministic checks
if not errors:
break
result = extract(document, feedback=errors) # retry WITH the specific errors
else:
escalate_to_human(result, errors) # bounded: give up cleanly after N tries
You cannot trust the model to catch its own factual mistakes by asking it to "double-check." Real reliability comes from external, deterministic validation (code that verifies the claim against a source of truth) with a bounded retry that passes the error back. Always cap retries and have an escalation path so the loop can't run forever.
4.4 Multi-pass review
Some quality goals are better met by separating generation from evaluation: one pass produces the work, a second pass (a fresh call, often with a critic prompt) reviews it against explicit criteria, and optionally a third revises. Because the reviewer starts clean and is told exactly what to check, it catches issues the generator was blind to. This "generator → critic → reviser" pattern is more reliable than asking a single pass to be perfect, and maps onto multi-agent review architectures from Domain 1.
A review pass is only as good as its criteria. Hand it explicit, itemized checks ("verify each cited number appears in the source; flag any claim without support") rather than "review this." Specific criteria (the Domain 4 refrain) apply to evaluation too.
4.5 Confidence & escalation
Routing on "how confident are you (0-100)?" is a named exam anti-pattern. A model's stated confidence is not calibrated: it will happily say "95% sure" while wrong. Do not gate escalation or auto-approval on self-reported confidence. Instead use deterministic signals: validation results, agreement across independent passes, business-rule checks, or explicit thresholds on verifiable quantities. (Developed further in Domain 5.)
4.6 The Message Batches API
For large volumes of independent, non-urgent requests (nightly document processing, bulk classification, dataset generation, evaluations), the Message Batches API processes them asynchronously at roughly 50% lower cost, with results returned within a 24-hour window (often much sooner). You submit a batch, poll for completion, then retrieve results. It's the economical choice whenever you can tolerate latency.
| Use the Batch API when… | Do NOT use it when… |
|---|---|
| Requests are independent and high-volume | A user is waiting on the response (interactive/real-time) |
| Latency up to ~24h is acceptable | The workflow is blocking or time-sensitive |
| Cost matters (≈50% savings) | Requests depend on each other's results in sequence |
| e.g. nightly extraction, bulk eval, offline classification | e.g. a live chat agent, a synchronous API call |
Putting a blocking, user-facing request through the Batch API to "save money" is wrong: the user could wait hours. Batch is for latency-tolerant, offline work. Real-time paths use standard synchronous calls (and reduce cost via prompt caching instead; see Domain 5).
Explicit criteria over vagueness; examples over description; tool_use+schema for structured output; deterministic validation-retry (bounded, with escalation) over "double-check yourself"; multi-pass review with checklists; never trust self-reported confidence; Batch API only for latency-tolerant bulk work.
Extended Thinking & Empirical Prompting
Giving Claude room to reason on hard problems, placing long inputs well, and treating prompt quality as something you measure, not guess.
4.7 Extended thinking
Extended thinking lets Claude produce internal reasoning (thinking content blocks) before its final answer, materially improving accuracy on complex math, analysis, and coding. You enable it and set a budget_tokens target for how much internal reasoning it may use. Reach for it when a task genuinely needs multi-step reasoning; skip it for simple, latency-sensitive calls where it just adds cost and delay.
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
thinking={"type": "enabled", "budget_tokens": 10000},
messages=[{"role": "user", "content": hard_problem},
)
A few facts worth knowing: budget_tokens must be ≥1024 and less than max_tokens; you're billed for thinking tokens even though they're internal. Extended thinking is not compatible with modifying temperature/top_k or with forced tool use (tool_choice must be auto/none). And when combining thinking with tool use across turns, you must pass the thinking blocks back unchanged to preserve reasoning continuity.
Extended thinking is the built-in, first-class way to get step-by-step reasoning; it generally supersedes hand-rolled "think step by step, show your work in <scratchpad>" prompting for hard tasks. But for simple tasks, neither is needed: don't pay for reasoning a task doesn't require.
4.8 Temperature and determinism
temperature controls randomness. For extraction, classification, and anything you'll validate against a schema or expect to be reproducible, use a low temperature (near 0) for consistency. For brainstorming, creative drafting, or voting-style diversity, a higher temperature helps. Match the setting to whether you want the same answer every time or varied answers.
4.9 Placing long context well
When a prompt includes large inputs (documents, transcripts), where you put them matters because of attention effects (Domain 5). Best practices from Anthropic's long-context guidance:
- Put large documents near the top of the prompt, above the instructions and the question; this tends to improve quality noticeably on long inputs.
- Wrap each input in XML tags (
<document>…</document>) with metadata (title, source) so Claude can reference and cite them precisely. - Put the specific instruction/question last, after the data, so it's fresh at generation time.
- Ask Claude to ground answers in quotes pulled from the documents first, then answer, improving faithfulness on long context.
4.10 Empirical prompting: define success, then measure
The professional discipline the exam rewards: don't eyeball prompt quality. Define success criteria and evaluate against them. Build a small eval set of representative inputs with expected outputs (or graded rubrics), run prompt variants against it, and pick the winner on evidence. This is what turns "seems good" into "measurably meets the bar," and it's the same criteria-first mindset behind explicit instructions and validation loops.
In production, separate the fixed template from the variable inputs (use variables/placeholders, often delimited by XML tags). This makes prompts testable, cacheable (a stable prefix; see Domain 5), and consistent across a fleet of requests.
"The model is inconsistent on a hard reasoning task" → enable extended thinking (and/or lower temperature if you validate output). "Answers drift on a long document" → put the doc first, tag it, ask for grounded quotes. "How do we know the new prompt is better?" → evaluate against a criteria-based eval set, don't guess.
Context Management & Reliability
The context window is finite and attention within it is imperfect. This domain is about preserving what matters across long interactions, controlling cost, and making multi-component systems fail safely.
Preserve critical information across long conversations and large-codebase exploration; understand attention dilution and why bigger windows don't fix it; use prompt caching correctly; design deterministic escalation and routing; and stop errors from silently propagating through multi-agent systems.
5.1 The context window is a budget, not a warehouse
Everything the model reasons over (system prompt, memory files, tool definitions, history, tool results) competes for one finite window. Two failure modes follow. First, you can simply run out of room on long tasks. Second, and subtler, is attention dilution (sometimes "context rot" or "lost in the middle"): as a window fills, the model attends less reliably to any given token, and information buried in the middle of a huge context is more likely to be overlooked. More context is not more understanding.
A flagship exam anti-pattern: solving an attention problem by stuffing more into the window (or moving to a larger-window model). Bigger windows raise the ceiling but worsen dilution: the model still can't attend equally to a million tokens. The fix is less, better-curated context: retrieve only what's relevant, summarize, or split the work into focused passes.
5.2 Strategies for preserving critical information
| Strategy | How it helps |
|---|---|
| Compaction / summarization | Periodically compress older turns into a concise summary, keeping the essentials and dropping the noise. Claude Code does this automatically as context fills; the PreCompact hook lets you shape it. |
| Externalize state | Write durable facts, decisions, and progress to files/scratchpads/a store, and re-inject only what's needed. The window holds the working set, not the archive. |
| Retrieval on demand | Pull in a document/record only when it's relevant (as an MCP resource or a search result) instead of preloading everything. |
| Structured hand-offs | Between agents/phases, pass compact structured summaries, not full transcripts (Domain 1 forking). |
| Placement matters | Put the most critical instructions where attention is strongest (clearly delimited, often near the start or end), not buried mid-context. |
5.3 Large-codebase exploration: per-file passes
A recurring scenario: an agent must understand or modify a codebase far too large to fit in context. The wrong instinct is to jam as much of the repo as possible into one window. The right approach is multi-pass, per-file (or per-module) processing: examine one unit at a time in a focused context, extract a compact finding, and accumulate those findings. Each pass gets the model's full attention on a manageable slice, and the running summary, not the raw files, is what persists.
Processing N files in N focused passes gives each file the model's full attention; cramming N files into one context spreads attention thin and buries detail. When a question pits "load the whole codebase into a big context" against "iterate file-by-file and synthesize," the iterative, focused option wins: this is the direct counter to the bigger-window anti-pattern.
Prompt Caching, Deterministic Routing & Failure Handling
Cutting cost and latency on repeated context, routing without trusting the model's self-assessment, and keeping failures from silently corrupting a multi-agent system.
5.4 Prompt caching
Prompt caching lets you mark a stable prefix of your prompt (a long system prompt, a big document, a fixed tool set, few-shot examples) so it is cached and reused across calls instead of re-processed every time. Cache reads are much cheaper (roughly a 90% discount on the cached portion) and faster; writing to the cache carries a small premium. It shines in high-volume workflows and multi-turn conversations that repeatedly send the same large context.
Put the unchanging, expensive-to-process content first (system prompt, reference docs, tool defs, examples) and mark the cache breakpoint after it; keep the variable part (the user's new message) after the breakpoint. Order matters: a cache hit requires the prefix to be byte-identical to a prior call. This is the right cost lever for real-time repeated context; the Batch API (Domain 4) is the lever for offline bulk work.
Don't confuse the two cost tools. Prompt caching = reuse a repeated prefix, helps latency-sensitive/interactive high-volume flows. Batch API = 50% off for latency-tolerant asynchronous bulk. A live support agent reusing a big knowledge-base prompt → caching. A nightly run over 100k documents → batch. They can even combine.
5.5 Deterministic routing & escalation
Reliable systems decide when to escalate, retry, or hand off using deterministic logic, not the model's vibe. Route on verifiable signals: a validation failure, a value crossing an explicit threshold, a category returned by a classifier step, a business rule, or disagreement between independent passes. Define the thresholds in code so the behavior is predictable, testable, and auditable.
(Reprised from Domain 4 because it lives here too.) "If the model says it's unsure, escalate" fails, because stated confidence isn't calibrated. Use deterministic thresholds on verifiable quantities and explicit validation outcomes to drive routing and escalation.
Design an explicit escalation path for low-confidence-by-evidence and out-of-policy cases: hand to a human, a stricter model pass, or a fallback flow. Bounded retries then clean escalation beats infinite retrying or silent best-guessing.
5.6 Error propagation in multi-agent systems
In a coordinator/subagent system, a subagent failure that isn't surfaced is dangerous: the coordinator synthesizes a final answer on top of a missing or wrong piece, and no one notices. This is silent failure propagation. Reliable designs make every subagent failure visible to the coordinator through the structured error contract from Domain 2 (isError, category, retryability), so the coordinator can retry, route around, flag the gap, or escalate, rather than treating an empty result as success.
Swallowing a subagent's error (returning empty or a plausible-looking placeholder) lets a corrupted result flow into the final output undetected. Subagents must report failures explicitly; coordinators must check for them before synthesizing. Fail loud, propagate the error, handle it deliberately.
Curate context, don't inflate it: bigger windows don't fix attention. Per-file passes for big codebases. Prompt caching for repeated real-time context; Batch for offline bulk. Route and escalate on deterministic, verifiable signals, never self-reported confidence. Surface every failure explicitly so nothing propagates silently.
Prompt-Cache Mechanics & Agent Memory
The precise mechanics behind caching that questions like to probe, plus how modern agents keep memory across very long or unbounded tasks.
5.7 How prompt caching actually works
You already know why to cache (reuse a stable prefix; ~90% cheaper reads; see §5.4). Here are the mechanics worth knowing precisely:
| Detail | Value |
|---|---|
| Default cache lifetime (TTL) | 5 minutes, refreshed on each hit, at ~1.25× write cost. |
| Extended TTL option | 1 hour ("ttl": "1h") at ~2× write cost. |
| Cache read cost | ~0.1× base input price (a ~90% discount). |
| Breakpoints per request | Up to 4 (cache_control: {"type": "ephemeral"}). |
| Minimum cacheable length | Model-dependent: commonly 1024 tokens (some models 2048/4096). Shorter prefixes won't cache. |
| Prefix order | Cached in hierarchy order: tools → system → messages. Put the most stable content first. |
| Hit requirement | The prefix must be byte-identical to a prior request (same tools, same config) and within the TTL. |
Because a hit needs an identical prefix, put unchanging content first (tools, system prompt, reference docs, examples) and the variable user input last, with the breakpoint after the stable part. Any change before the breakpoint, even a whitespace edit, invalidates the cache. Structure the prompt around that constraint.
Both cut cost but solve different problems. Caching = reuse a repeated prefix, best for interactive/high-volume repeats; savings come from cache reads. Batch = ~50% off for latency-tolerant asynchronous bulk. Real-time agent reusing a big system prompt → cache. Overnight bulk job → batch. If a question stresses "same large prompt every turn, low latency needed," it's caching.
5.8 Memory beyond the window: context editing & the memory tool
For agents that run for a very long time or across many turns, the context window alone isn't enough. Two complementary mechanisms handle this:
- Context editing / compaction: the runtime automatically trims or summarizes stale content (e.g. old tool results) as the window fills, keeping the working set relevant. In Claude Code this is automatic; the
PreCompacthook lets you influence what's preserved. - The memory tool / external memory: the agent writes durable facts, decisions, and progress to storage outside the context (files, a memory store) and reads them back when needed. This lets knowledge persist across sessions and beyond any single window: the source of truth lives outside the prompt.
Treat the context window as RAM (fast, small, volatile) and an external store as disk (durable, large). Keep only the active working set in context; persist everything that must survive to storage and re-inject selectively. This is the durable-state principle from Domain 1 §1.10, made concrete.
5.9 Reliability extras: citations & verification
Two more reliability levers the exam may nod to. Citations: having the model ground claims in, and cite, specific source passages (natively supported for documents) reduces hallucination and makes outputs auditable. Independent verification: cross-checking an answer with a separate pass or a deterministic check (the evaluator-optimizer/voting ideas) catches errors self-review misses. Both push reliability toward evidence and away from trusting a single unverified generation.
"How do we cut cost on a chat agent that resends a 30k-token knowledge base each turn?" → prompt caching (stable prefix first, breakpoint after). "The agent forgets earlier decisions on a multi-day task" → external memory + compaction, not a bigger window. "How do we make the report trustworthy/auditable?" → citations + independent verification.
The Seven Anti-Patterns
The exam is built around trade-offs, and its distractors recycle a small set of tempting-but-wrong ideas. Learn to spot these seven and you can eliminate a wrong answer on sight.
| # | Anti-pattern (the trap) | The right answer instead |
|---|---|---|
| 1 | Prompt-based enforcement of critical rules: "tell it in the system prompt never to…" | Enforce hard rules with hooks & permissions (deterministic code), not prose. |
| 2 | Self-reported confidence for escalation/routing: "if the model says it's unsure, escalate." | Route on deterministic, verifiable signals: validation results, thresholds, cross-checks. |
| 3 | Batch API for user-facing latency: using async batch on a blocking request to save money. | Batch only for latency-tolerant offline work; use sync + prompt caching for real-time. |
| 4 | Bigger context window fixes attention: stuff more in / go to a larger window. | Curate context: retrieve relevant only, summarize, iterate in focused passes. |
| 5 | Silent failure on subagent errors: swallow errors, return empty/placeholder. | Surface failures explicitly (structured errors) so the coordinator handles them. |
| 6 | All tools to all agents: give every agent the full catalog. | Scope tools per role (least privilege) to avoid reasoning overload & risk. |
| 7 | Flat multi-agent topology: every agent talks to every agent. | Hub-and-spoke coordination through one orchestrator; preserves control & provenance. |
Every anti-pattern above shares a shape: it hands responsibility to something flexible and self-policing (a prompt, the model's self-assessment, a giant context, free-form agent chat) when it should hand it to something deterministic, scoped, and loud (code, thresholds, curated context, structured errors, a coordinator). When you're stuck between two options, pick the one that is explicit, bounded, and fails visibly.
Beyond the seven: prefer the simplest architecture that works (don't add agents gratuitously); plan before large/irreversible changes; put team truth in version control (project CLAUDE.md / .mcp.json) and personal things in user scope; write tool descriptions and success criteria that are explicit; and always give loops a termination guard.
Rapid-Review Cheat Sheet
The night-before, one-screen distillation. If you can explain every line here, you're ready.
Agentic loop & stop_reason
Loop = send → check stop_reason → run tool → append tool_result → repeat until end_turn. tool_use → you execute; max_tokens → truncated, continue; pause_turn → send back to continue; refusal → 200, not an error, rephrase/fallback; stop_sequence → check which fired. Always cap iterations.
Single vs. multi-agent
Default single. Go multi only for independent, parallel subtasks each needing its own large context. Real reason = context isolation via forking. Topology = hub-and-spoke, never flat. Subagents return summaries, not transcripts. Multi-agent = more tokens/latency/failure surface.
Tools & MCP
A tool = name + description + schema (Claude can't see the code). Great descriptions steer selection. Structured errors: isError, isRetryable, errorCategory, message. MCP primitives: tools (do, model-driven), resources (data, app-driven), prompts (templates, user-driven). Transports: stdio (local) vs Streamable HTTP (remote); JSON-RPC underneath. Config in .mcp.json (project=shared, user=personal). Scope tools per agent role.
Claude Code
CLAUDE.md hierarchy: enterprise → project (committed) → project-local (git-ignored) → user; nested subdir files; closest wins. .claude/rules/ + YAML frontmatter globs: for path-scoping. Slash commands (.claude/commands/) & skills; context: fork = isolate, allowed-tools = restrict. Plan mode for big/risky/unfamiliar; direct execution for small/reversible. CI/CD: -p headless + --output-format json/--json-schema + allowlist + --max-turns. Hard rules = permissions + hooks (PreToolUse blocks).
Prompt engineering & structured output
Explicit criteria > vague; examples (few-shot); think step-by-step; XML tags; roles; prefill; chain. Structured output = define a tool with JSON schema + force tool_choice. Schema-valid ≠ correct → validation-retry loop (bounded, feed errors back, escalate). Multi-pass generator→critic→reviser with checklists. Batch API = ~50% off, ≤24h, offline only.
Context & reliability
Window = budget; beware attention dilution: bigger ≠ better. Compact/summarize, externalize state, retrieve on demand, per-file passes for big codebases. Prompt caching = reuse stable prefix (~90% off reads) for real-time repeats. Deterministic routing/escalation on verifiable signals, never self-reported confidence. Surface subagent errors instead of letting them propagate silently.
Readiness Self-Assessment
If you can answer every prompt below out loud without notes, you have the coverage to pass. Any you stumble on points you back to the exact section to revisit.
Domain 1: Agentic Architecture (27%)
- Recite the four beats of the agentic loop and name all seven
stop_reasonvalues and how you'd handle each. (§1.2-1.3) - Give two concrete reasons to choose multi-agent, and the one main reason it's really about context. (§1.5-1.6)
- Explain why flat topology is an anti-pattern and what hub-and-spoke fixes. (§1.6)
- Match a scenario to the right pattern: chaining, routing, parallelization (sectioning/voting), orchestrator-workers, evaluator-optimizer. (§1.11)
- Say when you'd enforce a rule with a hook vs. a prompt, and name the lifecycle hooks. (§1.9, §1.13)
Domain 2: Tool Design & MCP (18%)
- Explain why a tool description is "a prompt," and list the fields of a structured error. (§2.1-2.2)
- Define MCP's three primitives and who controls each; contrast stdio vs. Streamable HTTP. (§2.4-2.5)
- State the project-vs-user/local scope rule for
.mcp.json. (§2.6, §2.10) - Describe poka-yoke tool design and why "all tools to all agents" fails. (§2.7-2.8)
Domain 3: Claude Code (20%)
- Order the CLAUDE.md hierarchy and say what's committed vs. personal. (§3.1)
- Explain path-scoped rules,
context: fork, andallowed-tools. (§3.2, §3.4) - Decide plan mode vs. direct execution for a given task. (§3.6)
- Write the safe CI/CD recipe (flags + guardrails). (§3.7-3.8)
- Say when to define a custom subagent and what its frontmatter controls. (§3.9)
Domain 4: Prompt Engineering & Structured Output (20%)
- Name the core techniques and why explicit criteria beat vague instructions. (§4.1)
- Show how to force schema-valid output and why schema-valid ≠ correct. (§4.2)
- Describe a bounded validation-retry loop and multi-pass review. (§4.3-4.4)
- Decide Batch API vs. synchronous, and when to use extended thinking. (§4.6-4.7)
Domain 5: Context Management & Reliability (15%)
- Explain attention dilution and why bigger windows don't fix it. (§5.1)
- Give the per-file-passes strategy for large codebases. (§5.3)
- State caching TTLs, breakpoint count, and prefix order. (§5.7)
- Contrast caching vs. batching; window vs. external memory. (§5.4, §5.8)
- Explain deterministic routing and why self-reported confidence fails. (§5.5)
Confident on all → you're ready; do the practice sets to sharpen timing. A few gaps → targeted re-read of the cited sections. Many gaps in one domain → re-read that whole chapter, then re-test here. The exam is scenario-based, so practice applying each answer to a situation, not just reciting it.
Practice Questions: Domains 1 & 2
Click an option to check it, or hit Reveal answer. Explanations follow the exam's reasoning, not just the label. (Printing reveals all explanations.)
stop_reason == "max_tokens" and treats truncated output as final.max_tokens. The loop must detect it and continue/raise the cap rather than treat the response as complete. Rate limiting would surface as 429 errors, not 200s; model size and prompt length don't explain clean truncation.PreToolUse hook / permission rule that blocks those commands deterministically.PreToolUse hook (or a deny permission rule) inspects and blocks the call in code: a guarantee. Prompts (A) and self-rating (D) are probabilistic; fine-tuning (B) still can't guarantee it and is overkill.search_orders when it should call search_products. The code is correct. What's the best first fix?isRetryable and errorCategory so the agent retries transient failures but not invalid input.Practice Questions: Domains 3, 4 & 5
Continue drilling. Watch for the anti-pattern hidden in each distractor set.
CLAUDE.md committed to the repo root.~/.claude/CLAUDE.md.CLAUDE.local.md that's git-ignored.CLAUDE.md so version control distributes them to everyone. User memory (B) is personal-only; local files (C) are git-ignored; manual pasting (D) isn't reproducible..claude/rules/ with YAML globs: scoping it to the payments path.-p and no review.-p with a "bypass all permissions" flag and prose output.-p with a scoped --allowedTools allowlist, --output-format json, and --max-turns.input_schema and force it via tool_choice.Practice Questions: Advanced & Mixed
These cover the deeper material (workflow patterns, cache mechanics, subagents, extended thinking) and mix domains the way the real exam does.
.claude/agents/ with a focused prompt, restricted tools, and a cheaper model.status argument. Which change most reliably prevents this?status to an enum of the allowed values in the schema.enum makes invalid values impossible to submit. Prompt pleading (A) is probabilistic; tokens (C) and model size (D) don't constrain arguments.tool_choice naming it, at temperature 0.tool_choice: auto, then validate the numbers programmatically.tool_choice: auto and enforce correctness with external validation. Self-reported confidence (D) isn't a reliable gate.main. What's the correct guarantee?PreToolUse hook and a scoped --allowedTools allowlist that excludes the push.Glossary
Every term the exam expects you to know cold, in one place.
Core & agentic
Agent: a model wrapped in a loop with tools, dynamically deciding its own steps.
Workflow: a system whose steps are predetermined in code; the model fills fixed gaps. Prefer over an agent when the path is known.
Agentic loop: send → check stop_reason → run tool → append tool_result → repeat until end_turn.
stop_reason: why the model stopped: end_turn, tool_use, max_tokens, stop_sequence, pause_turn, refusal, model_context_window_exceeded. All arrive on HTTP 200.
tool_use block: the model's structured request to call a client tool; your code executes it.
tool_result: the message you append with a tool's output (or structured error) to continue the loop.
Coordinator / orchestrator: the hub agent that decomposes tasks, delegates to subagents, and synthesizes results.
Subagent: a delegated agent running in an isolated context; returns a summary to the coordinator.
Hub-and-spoke: orchestrator-worker topology; the recommended multi-agent shape.
Flat topology: every agent messaging every agent; an anti-pattern.
Context forking: running a subagent/skill in a fresh, isolated context window so its work doesn't consume the parent's context.
Task tool: the SDK primitive for delegating to a subagent.
Information provenance: knowing which source/agent produced each claim; preserved by hub-and-spoke.
Tools & MCP
Tool: name + description + input schema the model can invoke; Claude can't see its code.
Structured error: a failure response with isError, isRetryable, errorCategory, and a message, so the agent can recover.
MCP (Model Context Protocol): open client-server standard for connecting Claude to external tools/data ("USB-C for AI").
MCP host / client / server: host app runs clients; each client connects to a server exposing capabilities.
MCP primitives: tools (executable, model-driven), resources (read-only data, app-driven), prompts (templates, user-driven).
stdio transport: local subprocess over stdin/stdout.
Streamable HTTP transport: remote server over HTTP with streaming (supersedes HTTP+SSE).
JSON-RPC 2.0: MCP's underlying message format.
.mcp.json: config declaring MCP servers; project-scoped (committed, shared) vs. user-scoped (personal).
Claude Code
CLAUDE.md: auto-loaded project memory; hierarchy: enterprise → project (committed) → project-local (git-ignored) → user, plus nested subdir files (closest wins).
.claude/rules/: rule files with YAML frontmatter (globs:) for path-scoped constraints.
Slash command: reusable prompt in .claude/commands/, invoked as /name, supports arguments.
Skill: packaged expertise (SKILL.md + optional scripts), model-invoked, progressively disclosed.
context: fork: skill frontmatter that runs it in an isolated context.
allowed-tools: frontmatter restricting a skill/command to specific tools (least privilege).
Plan mode: read-only research + proposed plan awaiting approval before edits.
Hooks: deterministic code at lifecycle points: PreToolUse (can block), PostToolUse, UserPromptSubmit, Stop, SubagentStop, PreCompact, SessionStart.
Permissions: allow/ask/deny rules gating tool actions (.claude/settings.json).
-p / --print: headless, non-interactive run for CI/CD.
--output-format json / --json-schema: machine-parseable / schema-constrained output.
--max-turns: caps loop iterations (circuit breaker).
Prompting, output & reliability
Few-shot prompting: 2-5 input→output examples to demonstrate the pattern.
Chain-of-thought: asking for step-by-step reasoning before the answer.
System prompt / role: standing persona, rules, and priorities for the conversation.
Prefill: starting the assistant turn to force format/skip preamble.
tool_choice: forcing a specific tool call to guarantee schema-valid output.
Validation-retry loop: validate output in code; on failure, feed the error back and retry (bounded), then escalate.
Multi-pass review: separate generator, critic, and reviser passes with explicit checklists.
Message Batches API: async bulk processing, ~50% cheaper, ≤24h; latency-tolerant only.
Prompt caching: reuse a stable prompt prefix (~90% cheaper reads) for repeated real-time context.
Attention dilution / context rot: degraded attention as the window fills; not fixed by bigger windows.
Compaction: summarizing older context to reclaim room (shape via PreCompact).
Deterministic routing/escalation: routing on verifiable signals (validation, thresholds, cross-checks), never self-reported confidence.
Silent failure propagation: a swallowed subagent error corrupting the final output; prevented by explicit structured errors.
External Resources & Footnotes
This book is designed to be sufficient on its own. The resources below are for deeper practice and for confirming current exam logistics; treat them as optional reinforcement, not required reading.
Official: start here
- Certification & exam guide: the official landing page and downloadable exam guide PDF (the authoritative source for current blueprint, price, and logistics): anthropic-partners.skilljar.com/claude-certified-architect-foundations-certification
- Prep courses (free): Anthropic Academy's recommended path: Foundations Prep Courses. Key courses: AI Fluency: Framework & Foundations, Building with the Claude API, Claude Code in Action, Introduction to Model Context Protocol, Claude 101, plus the Amazon Bedrock and Google Vertex AI tracks.
- Anthropic Academy: the full self-paced course catalog: anthropic.skilljar.com
- Anthropic Cookbook & courses (GitHub): runnable notebooks and course code: github.com/anthropics/courses and anthropic-cookbook
Official documentation: by domain
- Agentic loop & stop reasons: Handling stop reasons; How tool use works.
- Building effective agents: Anthropic's foundational engineering essay on workflows vs. agents and orchestration patterns: anthropic.com/engineering/building-effective-agents; and the multi-agent research system write-up: multi-agent-research-system.
- Claude Agent SDK: subagents, hooks, permissions, the agent loop: Agent SDK docs.
- Tool design: Tool use overview and best practices for tool descriptions.
- MCP: the spec and concepts: modelcontextprotocol.io; Anthropic's Claude Code MCP guide.
- Claude Code: memory/CLAUDE.md, settings, hooks, slash commands, skills, headless mode: code.claude.com/docs.
- Prompt engineering: the overview and technique pages: Prompt engineering overview.
- Structured output & tool_use for JSON, Message Batches API, and Prompt caching: see the respective "Build with Claude" doc pages on the Claude platform.
Community study aids (verify against official sources)
- Community study-materials repository with multi-language guides and practice HTML: github.com/paullarionov/claude-certified-architect.
- Independent walkthroughs and question banks exist (Medium guides, dev.to breakdowns, third-party prep sites). Useful for extra reps, but always defer to the official exam guide where they disagree.
Exam logistics (price, question count nuances, seat availability, credential validity) evolve. Everything conceptual in this book reflects Anthropic's published guidance and product behavior as of mid-2026 and is what the exam actually tests. Before you book, skim the official exam guide PDF once to confirm the current numbers. Then trust your preparation: you've covered all five domains.
Read the whole book once, drill the practice questions until the anti-patterns are reflexes, and re-skim the Rapid-Review Cheat Sheet the morning of the exam. Remember the meta-heuristic: when two answers both "work," choose the one that is deterministic, scoped, and fails loudly. Good luck, you've got this.