Claude Certified Architect – Foundations: study guide and free practice questions The ideas the Claude Certified Architect exam tests, one page each: what the docs say, the traps the questions set, and real practice questions to try. Every page is written from Anthropic's own documentation and links to it.
Topics Agent architecture and orchestration Tool design, MCP and server tools Claude Code configuration and workflows Prompt engineering, structured output and retrieval Context management and reliability 10 free practice questions Drawn from every domain. Pick an answer to see why each option is right or wrong.
Your company runs its own Kubernetes cluster and must keep every tool execution inside that cluster for compliance. Your engineers want Claude to call three internal Python functions in a loop without hand-writing the tool-call cycle, and they do not want built-in filesystem tools.
Which approach should you take? Right. In the game that’s Renown for your Agent Architecture and Orchestration building.
Not that one: A is right. In the game your Agent Architecture and Orchestration building would lose a little Renown, and this question would come back later.
The answer A. Define the three functions with @beta_tool and drive them with client.beta.messages.tool_runner(...) inside the cluster.Tool Runner is the harness-only helper inside the regular anthropic SDK: it automates the request → execute → loop cycle for tools the developer defines, with no built-in tools and no sandbox. Your answer B. Define the three functions as MCP tools and expose them through the MCP connector with beta mcp-client-2025-11-20.The MCP connector lets the Messages API talk to a remote MCP server without the developer running an MCP client, and it requires both mcp_servers and a matching mcp_toolset entry. It is a way to reach tools over the network, not a loop helper, and it is not zero-data-retention eligible. Your answer C. Create a Managed Agent whose tools are the three functions and let the per-session container execute them.In Managed Agents, Anthropic supplies both the harness and a per-session container where bash, file and code-execution tools run. That hosted sandbox is exactly what the compliance requirement rules out. Your answer D. Use the Claude Agent SDK's query() entry point and restrict its built-in tool set to the three functions.The Claude Agent SDK is a separate product from the Anthropic API SDK. It packages the Claude Code harness with built-in Read, Write, Edit, Bash, Glob, Grep and web tools — a batteries-included agent, not a minimal loop over three custom functions.
You run an agent loop on Claude Opus 5 (claude-opus-5) with four independent lookup tools. Early responses contain three tool_use blocks at once, but after several turns Claude issues only one tool call per turn and latency triples. Your loop appends each tool_result as its own user message as soon as that tool finishes.
What change would most effectively restore parallel tool calling? Right. In the game that’s Renown for your Tool Design, MCP and Server Tools building.
Not that one: A is right. In the game your Tool Design, MCP and Server Tools building would lose a little Renown, and this question would come back later.
The answer A. Collect every tool_result block for the turn and return them together in a single user message.Parallel tool use is enabled by default. The conversation transcript is what teaches Claude the shape of a turn: when the results of a multi-call turn are split across several user messages, the model learns that pattern and converges on one call per turn. Your answer B. Set disable_parallel_tool_use: false as a top-level request parameter alongside tools.disable_parallel_tool_use is not a top-level parameter — it nests inside tool_choice. Parallel tool use is already on by default, so explicitly setting it to false is a no-op and leaves the split-message transcript untouched.Your answer C. Set tool_choice to {"type": "any"} so the model is forced to emit several tool calls each turn.tool_choice: {"type":"any"} forces Claude to call at least one tool instead of replying with text. It says nothing about how many tools are called in one assistant turn, and it also raises the tool-use system prompt overhead.Your answer D. Add eager_input_streaming: true to each tool definition so inputs stream as they are produced.eager_input_streaming changes how a tool call's input JSON is delivered while the response streams. It does not influence how many tool_use blocks the model emits, and it cannot undo the single-call pattern the transcript has established.
You keep a deny rule in ~/.claude/settings.json so that Claude Code can never read a secrets/ directory in any project on your machine. The rule reads Read(/secrets/**). In a session started at the root of a project that has a secrets/ directory, Claude reads files inside it without a prompt. /status lists user settings as loaded, and claude doctor reports no rejected entries.
What is the most likely root cause? Right. In the game that’s Renown for your Claude Code Configuration and Workflows building.
Not that one: C is right. In the game your Claude Code Configuration and Workflows building would lose a little Renown, and this question would come back later.
Your answer A. Deny rules match only at the depth they are written, so the pattern misses a secrets/ directory nested below the project root.Applies the allow-rule depth behaviour to a deny rule. A relative single-segment pattern such as Read(secrets/**) matches only <cwd>/secrets as an allow rule, but as a deny or ask rule it matches a secrets directory at any depth under the current directory. Depth is not what fails here; the anchor is. Your answer B. User settings sit at the lowest precedence level, so an allow rule in the project's own settings file overrides your deny rule.Reads permission resolution as an ordinary settings ladder in which a higher scope replaces a lower one. Deny rules from any scope are evaluated before allow rules, and a tool denied at any level cannot be allowed at another, so no project allow rule could reopen this path. The answer C. A single leading slash anchors a pattern at the settings source, so in user settings the rule matches ~/.claude/secrets/** instead.In Claude Code permission rules a single leading slash does not mean the filesystem root. It anchors the pattern at the settings source that defines the rule: a project, local or command-line rule anchors at the primary working directory, but a rule in ~/.claude/settings.json anchors at ~/.claude. Your answer D. Read deny rules cover Claude's own file tools only, so a secrets/ file opened by a Bash command is never checked.Read and Edit rules reach past the built-in file tools. They also cover the file commands Claude Code recognises in Bash, such as cat, head, tail and sed, and the targets of Bash redirections. They stop at arbitrary subprocesses that open files themselves; for those, enable the sandbox.
Show the full explanation and doc quotes So Read(/secrets/**) written in user settings denies ~/.claude/secrets/** and never reaches the project's own secrets/. A user-settings rule that must apply inside every project has to use a filesystem-absolute // pattern or a home-relative ~/ pattern instead.
Written from code.claude.com/docs/en/permissions.md
Your document-review service sends PDFs with citations enabled to Claude Opus 5 (claude-opus-5) and renders a deep link to the cited page of the original file. Users report that every link opens the page immediately before the passage that was quoted.
What is the most likely cause? Right. In the game that’s Renown for your Prompt Engineering, Structured Output and Retrieval building.
Not that one: C is right. In the game your Prompt Engineering, Structured Output and Retrieval building would lose a little Renown, and this question would come back later.
Your answer A. The client reads start_char_index from a char_location object and converts it to a page number by division.Character locations apply to plain-text documents, where the location object is typed char_location with start_char_index and end_char_index. A PDF citation carries page_location instead, so there is no character index to divide. Your answer B. The client reads document_index and uses it as the page number rather than as the index of the document.document_index tells the client which of the documents supplied in the request the quote came from. Treating it as a page number would produce links unrelated to the passage rather than a uniform one-page offset.The answer C. The client treats start_page_number from a page_location object as zero-indexed when it is 1-indexed.For PDF sources, a citation's location object is typed page_location and carries start_page_number and end_page_number, both 1-indexed. Your answer D. The client reads end_page_number instead of start_page_number when building the deep link.end_page_number marks the last page of the cited span. Using it would send readers to the end of the quotation or beyond, which is the opposite of the reported behaviour.
Your data agent enables context_management: {edits: [{type: "clear_tool_uses_20250919"}]} on Claude Opus 5 (claude-opus-5). Token counts fall, but the context still carries very large tool_use blocks whose inputs are multi-kilobyte SQL statements. Your team needs those tool parameters cleared as well.
Which approach should you take? Right. In the game that’s Renown for your Context Management and Reliability building.
Not that one: A is right. In the game your Context Management and Reliability building would lose a little Renown, and this question would come back later.
The answer A. Add clear_tool_inputs: true to the clear_tool_uses_20250919 edit so the tool_use parameters are cleared too.The clear_tool_uses_20250919 strategy clears old tool results by default and accepts an optional clear_tool_inputs: true flag that additionally clears the tool_use parameters. Your answer B. Add a second edit of type clear_thinking_20251015, which clears tool parameters along with thinking blocks.clear_thinking_20251015 is the second context-editing strategy and targets thinking blocks. Adding it alongside the tool-clearing edit is valid, but it will not touch a single byte of the SQL in the tool_use inputs.Your answer C. Replace the beta header with compact-2026-01-12, which clears tool inputs as part of its edit strategy.Swaps in the compaction feature. Compaction (beta compact-2026-01-12, strategy compact_20260112) summarizes earlier context server-side; it does not clear tool_use parameters, and replacing the context-editing beta would drop the clearing strategy altogether. Your answer D. Move the edits array into output_config so that it applies to tool inputs as well as tool results.output_config is where effort, the structured-output format and task_budget live. Context-editing strategies belong to the top-level context_management object, and moving them would be a validation error rather than a behaviour change.
Your migration agent spends nine minutes and roughly 180,000 input tokens mapping the monorepo before it proposes an approach. You want three rival approaches worked out from that same mapped state, and your first attempt chained them into one thread, so the second and third proposals kept restating the first.
Which approach should you take? Right. In the game that’s Renown for your Agent Architecture and Orchestration building.
Not that one: B is right. In the game your Agent Architecture and Orchestration building would lose a little Renown, and this question would come back later.
Your answer A. Run each variant with continue: true, which picks up the most recent session in that directory.continue: true does not name a session - it resumes whichever session in the current directory was written most recently. The first variant becomes that session, so the second continues it and the third continues the second. You end up with one thread carrying all three proposals, which is the behaviour you set out to remove.The answer B. Capture the session ID and pass it to resume with forkSession: true on each variant's own query.Forking creates a new session that starts with a copy of the original's history but diverges from that point. The fork gets its own session ID and the original's ID and history stay unchanged. Your answer C. Resume the same session ID for every variant and revert the agent's file changes with file checkpointing between runs.Checkpointing operates on the working tree, not on the conversation. Rolling files back between runs leaves the transcript exactly as it was, so each variant still reads the previous variant's reasoning. Branching the history is a session option, not a file operation. Your answer D. Attach a sessionStore adapter so each variant mirrors the transcript to your own backend and reads the shared prefix back.A sessionStore adapter exists so a session created on one machine can be resumed on another - CI workers, containers, serverless. It changes where the transcript is kept, not how many histories there are, so all three variants continue to land in the same one.
Show the full explanation and doc quotes Setting resume to the captured ID and forkSession: true on each of the three runs therefore yields three independent sessions, each inheriting the mapping work and none of them able to see the others' turns.
Written from code.claude.com/docs/en/agent-sdk/sessions
Your data team uploads a 30 MB CSV through client.files.upload and wants Claude Opus 5 (claude-opus-5) to process it with pandas via the code execution tool — the code in the sandbox must be able to open the file from its filesystem.
Which approach should you take? Right. In the game that’s Renown for your Tool Design, MCP and Server Tools building.
Not that one: D is right. In the game your Tool Design, MCP and Server Tools building would lose a little Renown, and this question would come back later.
Your answer A. Attach it to the user message as a document content block referencing the file_id.Document blocks exist for prompt-side reading — PDFs and text Claude analyzes directly in context. For a 30 MB CSV meant for pandas, the file must exist on disk inside the sandbox, which only container_upload arranges. Your answer B. Pass the file_id in the request's top-level container parameter alongside the tool.container is how a later request reuses an earlier response's container by its id, preserving files and state. It accepts a container identifier, not Files API ids.Your answer C. Have Claude retrieve it with the web fetch tool, using the Files API file's URL.Runs into two walls; web fetch retrieves conversation URLs from the web, Files API content is not addressed that way, and fetched content would land in context rather than on the container's filesystem. The answer D. Reference it in the message with a container_upload block carrying the file_id.The documented flow is upload-then-reference: upload the file with the Files API, then include {"type": "container_upload", "file_id": ...} in the message content. That block places the file into the code-execution container's filesystem, where Claude's Python or bash can open it like any local file.
Your project CLAUDE.md ends with @~/.claude/team-conventions.md so the same personal notes reach every worktree of the repository. On your machine /context lists the imported file under **Memory files**. A teammate who keeps that file at the same path in their own home directory says it never appears for them, and their sessions report no error.
What is the most likely root cause? Right. In the game that’s Renown for your Claude Code Configuration and Workflows building.
Not that one: C is right. In the game your Claude Code Configuration and Workflows building would lose a little Renown, and this question would come back later.
Your answer A. An @ import resolves against the working directory, not the containing file, so ~/ is never expanded.Import paths may be relative or absolute, and a relative path resolves against the file containing the import, not against the working directory. A ~/ path is a home-directory path and expands to the reader's own home directory on every machine. Your answer B. CLAUDE.local.md is the file that carries personal imports, so a @~/ reference in the shared file is ignored.Reads the local file as the only home for personal content. CLAUDE.local.md is a place to keep private preferences out of version control, not a precondition for imports: a project CLAUDE.md can import any path, and the home-directory import is the documented way to share personal notes across worktrees precisely because a gitignored local file exists in only one of them. The answer C. The import points outside the working directory, so it needs the project's one-time external-import approval, which the teammate declined.An import in a project-level memory file counts as external when its path resolves outside the working directory, which a @~/... path always does. Your answer D. Claude Code loads a project CLAUDE.md's imports only after the teammate accepts the workspace trust dialog.Attributes the gate to the wrong dialog. Workspace trust withholds a repository's permissions.allow rules, its additionalDirectories, subagent frontmatter hooks and inline MCP servers. Memory imports have their own separate one-time approval, and trusting the folder neither triggers nor satisfies it.
Show the full explanation and doc quotes The first time Claude Code meets external imports in a project it shows an approval dialog listing the files, and if the person declines, the imports stay disabled and the dialog does not appear again -- so a single decision made once, quietly, explains a file that never loads and never errors. The dialog exists to protect people from files other contributors commit to a shared project, which is why the answer is asked for once per project and then remembered rather than raised again each session.
Written from code.claude.com/docs/en/memory.md
You send a scanned 40-page contract to Claude Opus 5 (claude-opus-5) as a base64 PDF in the same user message as the analysis question. Extraction quality is poor and the model frequently answers as though it has not seen the file. The PDF is well under the request size limit.
What change would most effectively resolve the issue? Right. In the game that’s Renown for your Prompt Engineering, Structured Output and Retrieval building.
Not that one: A is right. In the game your Prompt Engineering, Structured Output and Retrieval building would lose a little Renown, and this question would come back later.
The answer A. Place the document content block before the text block in the user message content array.A base64 PDF is supplied as {"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": ...}} and must be placed before the text block in the user message content. Ordering matters for document comprehension, so a question that precedes its document degrades results. Your answer B. Split the PDF into pages of 100 or fewer, because Claude Opus 5 caps documents at 100 pages.The documented page limit is 600 pages per request, dropping to 100 only for 200k-context models. Claude Opus 5 has a 1M-token context window, so a 40-page contract is far inside the limit either way. Your answer C. Set media_type to application/octet-stream so the API detects the format from the payload.The media_type for a PDF source must be application/pdf. The API does not infer the format from the payload bytes, and a generic MIME type is not part of the documented content-block shape. Your answer D. Wrap the base64 payload at 76 characters so the encoded data conforms to MIME line length.The base64 string must contain no newlines. Standard MIME line wrapping at 76 characters is exactly the formatting the docs warn against, so applying it introduces a new failure rather than fixing this one.
Your agent runs with context_management: {"edits": [{"type": "clear_tool_uses_20250919"}]}. After the first clearing pass your team inspects the context the model now sees and finds a block still sitting at every cleared position, each one carrying a few words of filler text rather than the original output. Your team proposes filing this as a bug.
How should you evaluate this proposal? Right. In the game that’s Renown for your Context Management and Reliability building.
Not that one: D is right. In the game your Context Management and Reliability building would lose a little Renown, and this question would come back later.
Your answer A. Close it as expected: the block at each cleared position holds the parameters of the original call, which the strategy leaves in place unless you explicitly ask for those to go too.clear_tool_inputs decides whether the tool call parameters are cleared along with the results. It defaults to false, which leaves the original calls visible, but it is the call that stays, not a stand-in sitting in the result's place.Your answer B. File it as a bug: the block at each cleared position is a partial write, left behind when a pass runs out of its budget before it has finished the position.clear_at_least sets a minimum number of tokens a single activation must free. If that minimum cannot be met the strategy simply does not apply on that request; nothing is left half-done and nothing is queued for later.Your answer C. File it as a bug: the block at each cleared position is text the model itself emitted after the pass ran, and you are billed for every word of it as output.Attributes the text to the model. The substitution is performed by the API on the context it assembles, so it is input the model reads, not generated output. The answer D. Close it as expected: the block at each cleared position is placeholder text replaced in place by the API, which keeps every tool_use paired with a result block of its own.Tool-result clearing does not delete blocks outright. The API clears the oldest tool results in chronological order and replaces each one with placeholder text indicating to Claude that it was removed.
Show the full explanation and doc quotes The block therefore stays in position, which is what keeps the conversation structurally valid and every tool call matched with a result, while the large payload that made it expensive is gone.
Written from platform.claude.com/docs/en/build-with-claude/context-editing
Certopolis is an independent study game. It is not affiliated with, endorsed by or sponsored by Anthropic, and its questions are not the exams' questions. Exam names are trademarks of their owners.