CClaude Cert Prep
CCDV-F reference

Frequently Confused Concepts — Claude Certified Developer Foundations (CCDV-F)

Six implementation choices where several options genuinely work — the mental model that decides which one the exam rewards.

12 min read Reviewed August 24, 2026
On this page

CCDV-F tests implementation judgment, not just recall — most of its harder questions hand you two or three mechanisms that all technically work, and ask which one fits the stated constraint. The traps are near-duplicates: a workflow versus an agent, a custom tool versus an MCP server, a retryable error versus a permanent one. Each pair has a real dividing line, and the exam is testing whether you know exactly where it falls.

This guide is independent and unofficial, not affiliated with Anthropic. Every section grounds its comparison in current platform.claude.com, code.claude.com, and modelcontextprotocol.io behavior — verify anything load-bearing before you rely on it, since these surfaces move fast.

Read each section as a decision, not a description. The table shows the axes that separate the options; the "Which one?" callout gives you the single question to ask; the trap warns you off the plausible-but-wrong answer; and the memory hook gives you something durable to carry into the exam.

Workflow vs. Agent

Both get a multi-step task done, so both look correct. The dividing line is who owns control flow. A workflow is your code, orchestrating LLM calls and tools through a predefined path (prompt chaining, routing, parallelization, orchestrator-workers, evaluator-optimizer). An agent hands that control to the model, which dynamically decides which tools to call and when, looping until it judges the task done.

DimensionWorkflowAgent
PurposeA multi-step task whose path can be fully diagrammed in advanceAn open-ended task whose path depends on what's discovered mid-task
When to useYou can enumerate the branches and steps before writing codeThe number of steps or the branching genuinely can't be pre-specified
Cost or riskPredictable, testable, cheaper — but can't handle genuinely novel pathsHigher latency/cost, compounding-error risk over the loop; needs guardrails and sandboxed testing
When NOT to useGenuinely open-ended exploration where a fixed diagram would miss casesAny task you could fully diagram in advance — the autonomy is wasted cost

Synchronous vs. Streaming vs. Message Batches

All three call the same Messages API, so the confusion is real. The choice is about who's waiting and how long the work takes. Synchronous is a single blocking request-response. Streaming returns the same response incrementally over SSE as it's generated. Message Batches processes many requests asynchronously, decoupled from any live connection, with a much higher output-token ceiling (up to 300K in beta, vs. 128K synchronous).

DimensionSynchronousStreamingMessage Batches
PurposeOne request, one response, nothing in betweenSame as sync, but the client sees tokens as they're generatedBulk asynchronous processing of many requests
When to useShort, fast responses where blocking briefly is fineAnything long-running or user-facing where perceived latency matters — Anthropic explicitly recommends this over sync for long requestsNightly jobs, evals, backfills — nothing is waiting in real time
Cost or riskNon-streaming requests risk an idle-connection timeout (~10 minutes) on long generations, and can silently fail with a large max_tokensRequires SSE-handling on the client; no idempotency guarantee any more than syncHigher token ceiling per request, but results aren't immediate — not for interactive use
When NOT to useA generation likely to run long — you're risking a silent timeout failureA short, fast, one-shot call where streaming adds client complexity for no benefitAnything a user is actively waiting on right now

Custom Tool vs. Built-in Tool vs. Skill vs. MCP Server

All four give Claude a new capability, which is why they're easy to conflate. The differences are who hosts it, how much control you get, and how many consumers reuse it.

DimensionBuilt-in toolCustom client-side toolSkillMCP server
PurposeAnthropic-hosted capability (web_search, code_execution, etc.)You define the schema and execute it yourselfPackaged, on-demand capability/instructions inside Claude Code specificallyA standardized, reusable integration surface any MCP client can connect to
When to useThe exact capability you need already exists and needs no customizationYou need full control over execution and data accessRepeatable capability used only within Claude Code sessionsThe same tool/resource must be reusable across multiple different AI hosts/apps, not just one Claude Code instance
Cost or riskLeast effort, least control — you can't customize behaviorYou own hosting, security, and maintenanceLoads into context on demand (not resident like CLAUDE.md) — cheap until invokedYou run/operate a server; protocol overhead pays off through reuse
When NOT to useYou need custom logic or data access it doesn't provideA capability Anthropic already hosts well (reinventing it)A capability that needs to work outside Claude CodeA single, one-off integration for exactly one consumer — the server is unjustified overhead

Retryable vs. Permanent Errors — and Why Retrying Isn't Automatically Safe

Every error the Messages API returns falls into exactly one of two buckets, and the exam expects you to sort them without hesitation. But there's a second axis candidates often miss: even a correctly-classified retryable error can cause harm if the original request already had a side effect.

DimensionRetryablePermanent
Codes429, 500, 504, 529, network errors400, 401, 402, 403, 404, 409, 413
What it meansA transient condition — rate limit, server hiccup, overload — likely to resolveThe request itself is wrong or unauthorized — retrying it changes nothing
Correct responseExponential backoff, honoring retry-after; SDKs do this by default (~2 retries)Fix the request (auth, payload, permissions) before sending again — retrying blindly wastes calls
The catchA spend-cap 429 is retryable-shaped but won't resolve until the next billing cycle — no retry-after is givenThere's no documented idempotency-key mechanism — retrying a request with a side-effecting tool call can duplicate that side effect

Direct vs. Indirect Prompt Injection

Both are "prompt injection," which is why candidates conflate them — but the adversary is different, and so is the defense. Direct injection: the end user themselves is trying to manipulate the model. Indirect injection: the user is trusted, but third-party content the app pulls in (a document, a web page, a tool result) carries hidden instructions.

DimensionDirect injectionIndirect injection
Who's the adversaryThe end userThird-party content the app retrieves on the user's behalf
Documented mitigationsHarmlessness screens (a cheap classifier checking input), input validation against known patterns, hardened system prompts, throttling repeat offendersUntrusted content only in tool_result blocks, never in system or plain user text; label its source/type; JSON-encode it; never embed app instructions inside a tool_result
Where it shows upChatbots, public-facing generation endpointsRAG pipelines, web-browsing tools, any tool that fetches external content
When NOT to apply itApplying indirect-injection defenses (content labeling) doesn't substitute for direct-injection defenses (input validation) — they cover different attack surfaces

Claude Agent SDK vs. Managed Agents vs. Raw API Tool-Use

All three let you build an agent, at three different points on the build-vs-host spectrum. Raw API tool-use is the lowest level — you call client.messages.create with tools and build your own harness/loop around it. The Claude Agent SDK packages the full Claude Code harness (built-in tools, agent loop, context management, hooks, subagents, MCP, permissions, session resume/fork) as a callable library — you still deploy and host it yourself. Managed Agents goes further and hosts the sandbox for you as well.

DimensionRaw API tool-useClaude Agent SDKManaged Agents
PurposeFull control, build your own harness from scratchFull Claude Code harness as a library — you deploy itAnthropic hosts the agent and its sandbox for you
When to useYou need a bespoke loop with no built-in tools/harness assumptionsYou want Claude Code's built-in tools/hooks/subagents but need to host it yourself (custom infra, on-prem, specific deployment constraints)You want the least operational overhead and don't need to host anything yourself
Cost or riskYou build and maintain the entire harnessYou still own hosting/deployment/ops for the harnessLeast control over the hosting environment, most convenience
Language supportAny language the API supportsPython and TypeScript officially — other languages shell out to the claude CLIN/A — you're not writing the harness

Key takeaways

  • 01Workflow vs. agent is decided by whether the control flow can be fully diagrammed in advance, not by how many steps a task has.
  • 02Choose sync/streaming/Batches by two questions in order: is anything blocked waiting, and could the response take a while to generate?
  • 03For a new capability, check built-in tool, then MCP server (multi-host reuse), then Skill (Claude-Code-specific, on-demand), then custom tool, in that order.
  • 04Error classification (retryable vs. permanent) and idempotency safety are two separate questions — the API answers the first, your application has to answer the second.
  • 05Direct injection (the user) and indirect injection (fetched content) need different, specific mitigations — content labeling doesn't substitute for input validation or vice versa.
  • 06Raw tool-use, the Agent SDK, and Managed Agents sit on a build-vs-host spectrum — the Agent SDK is still self-hosted, only Managed Agents removes hosting responsibility.

Common mistakes

Picking the more autonomous, more infrastructure-heavy option because it sounds more capable.

Every comparison above rewards the least complex mechanism that satisfies the stated constraint — treat extra autonomy or infrastructure as a cost to justify, not a default.

Assuming a mitigation for one attack surface (direct injection) covers an adjacent one (indirect injection).

Match the defense to the specific adversary in the scenario — user-typed input vs. fetched third-party content need different documented mitigations.

Treating error-code classification as the whole answer to "is it safe to retry?"

Retryable-vs-permanent tells you whether the API will accept a retry. Whether retrying is safe for your application depends on whether the failed request had a side effect — a separate question the API doesn't answer for you.

Frequently asked

Is this the same content as the domain guides, just condensed?

No — the domain guides teach each topic on its own. This guide is specifically about the pairs and groups of options that look interchangeable on the exam, with the decision rule that separates them.

Which comparison is most likely to show up given the domain weights?

Synchronous vs. streaming vs. Batches and the tool/Skill/MCP decision are the highest-value ones to know cold — they sit inside Applications & Integration (33.1%) and Tools & MCPs (10.6%), two of the three largest domains.

Independent, unofficial study material. Not affiliated with, endorsed by, or authorized by Anthropic. Every example is original and written to teach the public exam objectives — no real exam questions are reproduced. Technical details reflect Claude, the Anthropic API, Claude Code, and MCP as of August 24, 2026; always confirm specifics against current official documentation.

Test yourself

Turn what you just read into answers you can check.

Take the mock exam

Keep studying

All guides

These guides are free and never paywalled. Keep Claude Cert Prep free ♥