Domain 3 of the Claude Certified Developer – Foundations (CCDV-F) exam is small — about 3.1% of the total weight — but it is the domain most likely to trip up someone who has only used Claude Code casually. The official sub-objective is Claude Code Operation: Rules, Skills, Commands, Agents, Agent Memory; session management; slash commands; headless/streaming/auto-mode; the CLAUDE.md hierarchy; repo init; and settings.json. The exam is not testing whether you can type claude at a terminal — it's testing whether you understand how the tool decides what it's allowed to do, and how that configuration is layered, scoped, and (as of a significant change in mid-August 2026) defaulted.
This guide is an independent, unofficial study resource. It is not affiliated with, authorized by, or endorsed by Anthropic, and it reproduces no real exam items. Where the tool's behavior has changed recently, that's flagged explicitly — CCDV-F questions on this domain tend to reward whoever has the current mental model, not the one from six months ago.
CLAUDE.md and the settings hierarchy
CLAUDE.md is Claude Code's persistent context file — project or user instructions that get loaded automatically rather than pasted into every prompt. It is not a single flat file: Claude Code loads a CLAUDE.md hierarchically, and it also picks up a CLAUDE.md per subdirectory as you work in different parts of a repo. A monorepo can carry a root CLAUDE.md with org-wide conventions plus a packages/api/CLAUDE.md with API-specific notes, and both apply when you're working inside packages/api.
settings.json is a separate axis: it controls permissions, hooks, and tool behavior rather than prose instructions, and it is layered across multiple files with a strict precedence order. When two settings files disagree, the higher layer wins outright — it is not a merge of "most permissive" or "most restrictive", it's a strict override by source.
| Layer (highest → lowest) | File / mechanism | Typical owner | Committed to git? |
|---|---|---|---|
| 1. Managed settings | Org/MDM-pushed policy | IT/security admin | No — pushed externally |
| 2. CLI flags | --settings, --permission-mode, etc. | Whoever launches the session | N/A |
| 3. Project local | .claude/settings.local.json | Individual developer | No — meant to be gitignored |
| 4. Shared project | .claude/settings.json | The team | Yes — committed |
| 5. User | ~/.claude/settings.json | You, across all projects | N/A — personal machine |
Permission modes — and the auto-mode shift
Claude Code's permission mode governs whether an action (a file write, a shell command, an MCP tool call) proceeds without asking. There are several modes, and the exam expects you to know the practical difference between them, not just the names.
| Mode | Behavior |
|---|---|
| default (Manual) | Reads proceed freely; writes and commands prompt for approval each time. |
| acceptEdits | File edits are auto-approved; commands and other higher-risk actions still prompt. |
| plan | Claude researches and proposes a plan before any mutating action is taken. |
| auto | A second classifier model reviews most actions and lets low-risk ones through automatically, escalating only the ones it judges worth a human look. |
| dontAsk | Actions proceed without prompting, scoped by an explicit allow/deny tool list. |
| bypassPermissions | No permission checks at all — intended for containers/VMs running as non-root, not a general workstation setting. |
bypassPermissions still exists and still means what it always did — zero checks — but it's explicitly scoped to sandboxed, non-root automation contexts (CI containers, ephemeral VMs), not something you'd reach for on a personal workstation now that auto covers that use case with a review layer intact.
Hooks: deterministic enforcement, not a prompted suggestion
Permission modes and CLAUDE.md instructions both operate at the level of the model's judgment — even a well-instructed model can misjudge a case. Hooks are different in kind: they are code-level, deterministic checks that run at defined lifecycle points, independent of what the model decides to do. This distinction — prompted behavior versus enforced behavior — is the core concept the exam is testing under "Hooks."
- Session-level:
SessionStart,SessionEnd— fire once per session. - Per-turn:
UserPromptSubmit,Stop— fire around each conversational turn. - Tool-loop-level:
PreToolUse,PostToolUse,PermissionRequest— fire around individual tool calls, the finest-grained and most commonly used tier. - Additional events for subagent/task lifecycle, MCP activity, and file-watch triggers.
A hook handler can be a command (run a script), an http call, an mcp_tool invocation, a prompt (ask the model something), or an agent (dispatch a subagent). Critically, a hook can block an action outright — either by exiting with status code 2, or by returning a JSON payload with a permissionDecision field — and that block is enforced by the harness, not negotiated with the model. A CLAUDE.md instruction saying "never commit to main" is a strong nudge the model will usually follow; a PreToolUse hook that rejects git commit on main with exit code 2 is a wall.
Skills absorbed slash commands
Custom slash commands used to be their own separate mechanism. That has changed: custom slash commands have been merged into Skills. A file at .claude/skills/<name>/SKILL.md now creates a /<name> command directly — there is no longer a separate, parallel commands system to learn.
The detail worth internalizing for the exam is when a Skill's content enters context. CLAUDE.md content is loaded up front and stays resident for the whole session — every turn pays its token cost, whether or not it's relevant to what you're currently doing. A Skill's body, by contrast, loads on demand, only when that skill is actually invoked. This is a context-budget distinction, not just an organizational one.
| Mechanism | When content enters context | Best for |
|---|---|---|
| CLAUDE.md | Loaded up front, resident all session | Conventions and facts relevant to nearly every turn |
Skill (.claude/skills/<name>/SKILL.md) | Loaded on demand when /<name> is invoked | Detailed, occasional-use procedures — a large body of instructions you don't want costing tokens on unrelated turns |
Subagents, sessions, and repo init
Subagents are defined in Markdown files with YAML frontmatter — .claude/agents/*.md for project-level agents, ~/.claude/agents/*.md for personal ones available across projects. The frontmatter specifies name, description, a tools allow/deny list, model, permissionMode, and optionally isolation: worktree to give the subagent its own git worktree.
The detail the exam expects precisely: a subagent gets a fresh, isolated context by default — it does not inherit the conversation that spawned it, only the task it was given. That is the opposite of a "fork," which inherits the full parent conversation history and branches from there. Confusing these two is an easy exam trap: dispatching a subagent to "go check something" without giving it the necessary background will fail silently, because it genuinely doesn't have that background — it isn't lazily choosing to ignore it.
- Subagent: fresh context, defined by a name/description/tools/model file, good for isolating noisy or exploratory work from the main thread.
- Session resume: continues the exact prior context, same thread.
- Session fork: branches from a point in history into a new session, leaving the original untouched — useful for trying an alternative approach without losing the main line of work.
Repo init is the documented workflow where Claude Code bootstraps a CLAUDE.md for a new or unfamiliar repository — it explores the codebase and captures build/test commands, conventions, and architecture notes, so a future session doesn't have to rediscover them from scratch. It's the recommended first step on any repo that doesn't already have a CLAUDE.md.
Headless mode and CI usage
Headless (non-interactive) mode runs Claude Code as a single command rather than an interactive session — this is the mechanism for using it inside CI pipelines and scripts. The basic form is claude -p "<prompt>", with --output-format text|json|stream-json controlling how the result is emitted for a calling script to parse.
claude -p "Run the test suite and report failures" \
--output-format json \
--bare \
--allowedTools "Bash(npm test)" \
--permission-mode dontAsk--bare skips auto-discovery of hooks, Skills, and MCP servers — it's the flag that makes a CI run fast and deterministic, since the run isn't picking up whatever happens to be configured in the environment it executes in. --allowedTools combined with --permission-mode dontAsk scopes exactly which tools may run without a prompt, which is what makes headless mode safe to run unattended: nothing outside the explicit allowlist executes.
{
"permissions": {
"defaultMode": "auto",
"allow": ["Bash(npm test)", "Bash(npm run lint)"],
"deny": ["Bash(git push --force*)"]
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "./.claude/hooks/block-main-commits.sh" }
]
}
]
}
}Key takeaways
- 01Settings precedence, highest to lowest: managed settings > CLI flags > project local (.claude/settings.local.json) > shared project (.claude/settings.json) > user (~/.claude/settings.json). Higher layers override, they don't merge.
- 02As of mid-August 2026,
autois the built-in default permission mode on Pro/Max/Team plans — a classifier model reviews actions instead of prompting for each one, replacing the older habit of reaching for--dangerously-skip-permissions.bypassPermissionsstill exists but is scoped to non-root container/VM automation. - 03Hooks are deterministic, code-level enforcement — they can block an action via exit code 2 or a JSON
permissionDecision, regardless of what the model decides. CLAUDE.md and permission modes shape the model's judgment; hooks constrain it from outside. - 04Custom slash commands are now created by Skills:
.claude/skills/<name>/SKILL.mdproduces a/<name>command. Skill bodies load on demand when invoked; CLAUDE.md content stays resident for the whole session — a real context-budget distinction. - 05A subagent gets a fresh, isolated context by default and is defined via
.claude/agents/*.mdfrontmatter (name, description, tools, model, permissionMode, optional isolation: worktree). A session fork inherits full prior context and branches; resume continues the same thread exactly. - 06Headless mode (
claude -p) is the CI/scripting mechanism, with--output-format,--bare(skip hook/Skill/MCP auto-discovery for determinism),--allowedTools, and--permission-mode dontAskas the standard locked-down combination.
Common mistakes
Assuming a CLAUDE.md instruction ("never push to main") is an enforced guarantee.
Treat CLAUDE.md as guidance to the model's judgment. For a hard, no-exceptions constraint, implement a PreToolUse hook that blocks the specific command with exit code 2 — that's enforcement outside the model's control, not a request to it.
Dispatching a subagent for a task and assuming it knows what the main conversation has already discussed.
Remember subagents start with a fresh, isolated context by default — brief them explicitly with everything they need. Use a session fork instead if you actually need the full prior conversation history carried forward.
Studying permission modes as a fixed allow/ask/deny list without accounting for the auto-mode default change.
Learn auto as the current Pro/Max/Team default (classifier-reviewed, not a static rule set) and know that bypassPermissions is scoped to non-root sandboxed automation, not a general replacement for it.
Frequently asked
What's the practical difference between a Skill and a CLAUDE.md entry for the same information?
CLAUDE.md content loads at session start and stays resident — every turn pays its token cost. A Skill's SKILL.md body loads only when its /<name> command is actually invoked. Put things relevant to nearly every turn in CLAUDE.md; put large, occasional-use procedures in a Skill so they don't tax unrelated turns.
If `.claude/settings.local.json` and `.claude/settings.json` disagree, which wins?
Project local (.claude/settings.local.json) is higher precedence than the shared project file (.claude/settings.json) — it's meant for personal, typically gitignored overrides on top of the team-shared configuration, so it wins for that developer's session.
Is `bypassPermissions` the right choice for an unattended local automation script?
No. It's intended for containers or VMs running as non-root, not general workstation use. For a locked-down but auditable unattended run, use headless mode with --allowedTools and --permission-mode dontAsk, which scopes exactly what may execute without a prompt.
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.