CClaude Cert Prep
D320% of exam

Frequently Confused Concepts — Claude Code Configuration (CCA-F Domain 3)

CLAUDE.md, Rules, Skills, slash commands, hooks, permissions, and the planning modes all shape how Claude Code behaves — but they sit at different layers. Learn the mental model so any scenario instantly maps to the right mechanism.

15 min read Reviewed July 25, 2026
On this page

Domain 3 is where most candidates lose points, not because the mechanisms are hard, but because they overlap. CLAUDE.md, .claude/rules/, Skills, slash commands, hooks, and permissions can all influence a session, so a scenario that says "make Claude always run lint before committing" has several plausible-looking answers and exactly one correct one. The exam rewards knowing which layer a requirement belongs to.

The single most useful distinction to carry into the exam is guidance versus enforcement. CLAUDE.md, rules, and skills are natural-language context: Claude reads them and usually follows them, but it is interpreting, not obeying. Hooks and permissions are the harness: shell commands and allow/deny rules the client applies deterministically, regardless of what the model decides. When a question says "guaranteed," "must," "block," or "regardless," it is pointing at the enforcement layer.

This guide is unofficial and not affiliated with Anthropic. It covers Foundations-level concepts only, grounded in how Claude Code actually works as of 2026 (note that Skills and custom slash commands are now unified — a SKILL.md also registers a /name command). Where an exact flag or path is version-specific, we teach the concept rather than guess.

The big five: Skills vs Slash Commands vs Rules vs CLAUDE.md vs Hooks

These five are the master cluster. They differ on two axes: nature (does Claude read it as guidance, or does the harness run it as enforcement?) and loading (always in context, on-demand, glob-scoped, or event-triggered?). CLAUDE.md is always-loaded guidance; rules are always-loaded or glob-scoped guidance; skills are on-demand guidance you or Claude invoke; slash commands are the explicit way to invoke a skill; hooks are event-triggered shell commands the harness executes.

As of 2026, Skills and custom slash commands are unified. A skill at .claude/skills/deploy/SKILL.md and a command file at .claude/commands/deploy.md both register /deploy. The difference is who triggers it: a skill can be auto-invoked when Claude decides its description matches the task, while typing /deploy invokes it explicitly. Frontmatter like disable-model-invocation makes a skill slash-only.

MechanismNatureScope / loadingTrigger — when it appliesWho invokesBest forWhen NOT to use
CLAUDE.mdGuidance (model reads)Always loaded every sessionFrom the moment the session startsAutomaticStable conventions, build/test commands, architecture facts every task needsOne-off procedures; anything that must happen deterministically
Rules (.claude/rules/)Guidance (model reads)Always loaded, OR glob-scoped via paths frontmatterUnscoped: at launch. Scoped: when Claude reads a file matching the globAutomaticTopic- or path-specific guidance you want to keep out of the always-on budgetGuidance that truly applies everywhere (use CLAUDE.md) or must be enforced (use a hook)
Skill (SKILL.md)Guidance (model reads on demand)Loaded only when invoked or matchedClaude matches its description, or you type its slash nameClaude (auto) or user (slash)Reusable multi-step procedures invoked when relevantFacts needed in every task (that's CLAUDE.md); hard guarantees (that's a hook)
Slash commandGuidance (explicit invoke)Loaded on invocationYou type /nameUser (explicit)On-demand procedures you want to trigger by nameAnything that should fire automatically without you typing it
HookEnforcement (harness runs)Outside the context window entirelyA lifecycle event fires (e.g. PreToolUse, PostToolUse, Stop)The harness (deterministic)Guaranteed, mechanical actions — format on save, block a path, run lint pre-commitJudgment calls or flexible guidance the model should weigh
text
Do I want this ALWAYS in context, every task?
  -> CLAUDE.md  (or an unscoped rule, to keep it modular)

Only when working on CERTAIN files/paths?
  -> Path-scoped Rule  (.claude/rules/ with `paths:`)

A reusable PROCEDURE invoked on demand (by me or by Claude)?
  -> Skill  (SKILL.md, which also registers /name)

Must it happen MECHANICALLY, guaranteed, regardless of the model?
  -> Hook  (shell command on a lifecycle event)

Is it a hard BOUNDARY — never allow this action?
  -> Permission  (permissions.deny in settings)
Which mechanism? — a decision tree

Project vs User vs Directory CLAUDE.md

All CLAUDE.md files are guidance, but they differ in scope and who shares them. User memory (~/.claude/CLAUDE.md) is personal and applies to every project on your machine. Project memory (./CLAUDE.md or ./.claude/CLAUDE.md) is committed to source control and shared with the team. Above these sits an optional managed policy file deployed by IT that no user setting can exclude. A gitignored `CLAUDE.local.md` holds personal, per-project notes.

Crucially, these files do not override each other — they are all concatenated into context. Load order runs broad to specific: managed policy, then user, then project, then more-specific directories. Files closer to your working directory are read last, so when instructions genuinely conflict, the model tends to weight the most specific, but the docs warn that direct contradictions are resolved arbitrarily — so avoid them.

FileLocationScopeWhen it appliesWho shares itBest forWhen NOT to use
Managed policyOS-specific (e.g. /Library/Application Support/ClaudeCode/CLAUDE.md)Every session on the machine, every repoLoaded first, alwaysAll users in the org (IT-deployed)Company-wide standards and compliance remindersRepo-specific guidance — commit a project file instead
User~/.claude/CLAUDE.mdAll your projectsLoaded after managed, before projectJust youPersonal style and tooling preferencesTeam conventions others need (they won't see your user file)
Project./CLAUDE.md or ./.claude/CLAUDE.mdThis repositoryLoaded after user memoryThe whole team via gitArchitecture, build/test commands, shared conventionsPersonal preferences; secrets or sandbox URLs
Directory / nestedCLAUDE.md in a subdirectoryThat subtreeOn demand, when Claude reads a file in that directoryTeam via gitGuidance specific to one part of a large repoAnything needed before Claude ever opens that subdirectory
Local./CLAUDE.local.md (gitignored)This repo, this machineLoaded alongside project CLAUDE.mdJust youPersonal sandbox URLs, test data, private notesAnything the team should share — it isn't committed

Directory CLAUDE.md vs path Rules (.claude/rules/ globs)

Both scope guidance to part of a repo, but they scope by different keys. A directory CLAUDE.md is scoped by location: it loads when Claude reads files in that subdirectory. A path-scoped rule is scoped by glob pattern: it loads when Claude reads any file matching patterns like src/api/**/*.ts, no matter where that file physically lives relative to the rule file. A rule can therefore target **/*.test.ts across the whole tree; a directory CLAUDE.md cannot cross into a sibling folder.

Both are lazy: a directory CLAUDE.md and a path-scoped rule only enter context once Claude reads a matching file — triggered on read, not on write. A rule without a paths: field loads at launch with the same priority as .claude/CLAUDE.md. Rules also keep each concern in its own small file, which many teams prefer over one growing subdirectory CLAUDE.md.

AspectDirectory CLAUDE.mdPath-scoped Rule
NatureGuidance (model reads)Guidance (model reads)
Scoped byPhysical location — its subtreeGlob pattern in paths: frontmatter, matched anywhere
When it appliesClaude reads a file in that directoryClaude reads a file matching the glob (on read, not write)
Who invokesAutomatic (lazy)Automatic (lazy); unscoped rules load at launch
Best forGuidance tied to one folder of the repoGuidance tied to a file type or cross-cutting path set (e.g. all tests, all API handlers)
When NOT to useCross-cutting concerns that span foldersGuidance every task needs regardless of file (use CLAUDE.md)

Rules vs Hooks

This is the cluster the exam loves, because both can sound like "enforce a standard." But a rule is natural-language guidance the model reads and interprets — it usually complies, but it can reason its way to an exception. A hook is a shell command the harness runs at a lifecycle event; it executes program logic and its outcome does not depend on the model's judgment. Rules live in .claude/rules/*.md; hooks are configured in settings.json against events like PreToolUse, PostToolUse, and Stop.

Cost and determinism trade off. Rules cost context tokens (always-loaded ones especially) and offer flexibility. Hooks sit outside the context window, cost no tokens until they fire, and offer the highest determinism but the least nuance — a hook can't weigh whether an exception is reasonable, it just runs.

AspectRulesHooks
NatureGuidance — model reads and interpretsEnforcement — harness runs a shell command
DeterminismUsually followed; the model can deviateDeterministic; runs regardless of the model
Location.claude/rules/*.mdsettings.json (hooks config)
TriggerLoaded at launch, or on reading matching pathsA lifecycle event fires (PreToolUse, PostToolUse, Stop, …)
Context costConsumes tokens while loadedZero context tokens; runs out of band
Best forConventions and preferences that benefit from judgmentMechanical guarantees: format, lint, block, validate
When NOT to use"Must always happen" guaranteesNuanced guidance needing the model's discretion

Hooks vs CLAUDE.md

This pair distills the whole domain: deterministic enforcement vs discretionary instruction. CLAUDE.md is delivered to Claude as context after the system prompt — the docs are explicit that it is "context, not enforced configuration," with "no guarantee of strict compliance." A hook is a shell command the harness executes at a fixed lifecycle event, applied "regardless of what Claude decides." If your requirement can tolerate the model's discretion, CLAUDE.md; if it cannot, a hook.

The official memory docs make the routing explicit: for an instruction that "must run at a specific point, such as before every commit or after each file edit, write it as a hook instead." CLAUDE.md is for the standing context you'd otherwise re-explain — conventions, commands, architecture — where usually-followed is good enough.

AspectCLAUDE.mdHook
NatureDiscretionary guidance (context)Deterministic enforcement (shell command)
ComplianceUsually followed; not guaranteedGuaranteed to run on its event
Where it livesMemory files, in contextsettings.json, outside the context window
When it appliesRead every session (or on demand for nested)Only when its lifecycle event fires
Who actsThe model, using judgmentThe harness, mechanically
Best forConventions, build/test commands, project factsFormat-on-save, pre-commit lint, hard blocks, audit logging
When NOT to useAnything that must be guaranteed at a precise momentFlexible guidance or facts the model should weigh in reasoning

Plan Mode vs Direct Execution vs Explore

These are three working postures, not config files. Direct execution is the default: Claude reads, edits, and runs commands immediately to make the change. Plan Mode is a read-only state — write and mutating tools are blocked — where Claude investigates and proposes a structured plan you approve before any file changes. Explore is read-only investigation/search: it sweeps the codebase to find and summarize what you need, without committing to a full implementation plan or making edits.

Plan Mode is entered with Shift+Tab (cycling through the permission modes) or by starting the session with a plan permission mode; in it, Read/Grep/Glob work while Edit, Write, and Bash mutations are blocked. Explore is best thought of as read-only reconnaissance — great for "where does X live?" or "how does this system fit together?" — whereas Plan Mode ends in an actionable, reviewable plan.

ModeNatureWhat it can doWhen it appliesWho invokesBest forWhen NOT to use
Direct executionImmediate actionRead, edit, and run commands freelyDefault postureYou (just ask) Small, well-understood changes you want done nowRisky multi-file refactors on an unfamiliar codebase
Plan ModeRead-only planningRead/search only; write & mutations blocked; ends in a planYou enable it (Shift+Tab / plan permission mode)UserMulti-file or sensitive changes you want to review before editsTrivial one-line fixes where planning is overhead
ExploreRead-only investigationSearch and read to locate and summarize; no edits, no full planYou ask Claude to investigate/searchUserUnderstanding a codebase, locating code, answering "where/how" questionsWhen you actually need the change made or a committed plan to execute

Key takeaways

  • 01Two axes decode every Domain 3 question: guidance vs enforcement, and always-loaded vs on-demand vs glob-scoped vs event-triggered.
  • 02CLAUDE.md, rules, and skills are guidance the model interprets; hooks and permissions are deterministic layers the harness applies regardless of the model.
  • 03The words "always," "must," "guarantee," "block," and "before every" point to a hook or permission — never to CLAUDE.md.
  • 04CLAUDE.md files stack and concatenate by scope (managed → user → project → nested → local); they do not override one another.
  • 05Rules scope by glob pattern; directory CLAUDE.md scopes by location — and both trigger on read, not write.
  • 06Skills and custom slash commands are unified in 2026: a SKILL.md also registers /name; a skill can auto-trigger or be invoked explicitly.
  • 07Skills and path-scoped rules load on demand and cost no context until relevant; unscoped CLAUDE.md and rules cost tokens every session.
  • 08Plan Mode is a read-only state that blocks writes until you approve a plan; Explore is read-only investigation; direct execution acts immediately.
  • 09Louder wording in CLAUDE.md never converts guidance into enforcement — move the requirement to a hook or permission instead.

Common mistakes

Putting "always run lint before commit" in CLAUDE.md and expecting it to be guaranteed.

CLAUDE.md is discretionary. Use a PreToolUse or pre-commit hook for anything that must run at a precise moment every time.

Assuming a subdirectory CLAUDE.md overrides the project-root CLAUDE.md.

All discovered CLAUDE.md files are concatenated into context, ordered broad to specific. Nested files add to — they do not replace — ancestors.

Reaching for a hook when the requirement is really a hard boundary on an action.

A never-allow boundary is best expressed as a permission deny in settings. Use hooks for actions to run; use permissions to forbid actions.

Treating skills and slash commands as two separate systems.

They are unified. A SKILL.md registers /name; the distinction is auto-invocation (Claude matches the description) vs explicit invocation (you type the slash command).

Believing a path-scoped rule always covers a file it matches.

Path rules trigger when Claude reads a matching file. A newly created file may not have loaded the rule, since the trigger is on read, not write.

Frequently asked

If CLAUDE.md and a hook both address the same behavior, which wins?

The hook, in practice. CLAUDE.md is guidance the model may or may not follow; a hook runs deterministically on its lifecycle event regardless of the model. If you need a guarantee, rely on the hook and treat the CLAUDE.md line as explanatory.

When should I use a path-scoped rule instead of just adding to CLAUDE.md?

When the guidance only matters for certain files or file types. Path-scoped rules load only when Claude reads a matching file, keeping them out of the always-on context budget. Reserve CLAUDE.md for facts every task needs.

Is a slash command different from a skill?

Not fundamentally, as of 2026. Both live in the unified system: a SKILL.md registers a /name command. Typing the slash name invokes it explicitly; a skill can also be auto-invoked by Claude when its description matches. Frontmatter can restrict a skill to slash-only invocation.

What exactly does Plan Mode prevent?

It blocks write and mutating tools — Edit, Write, and Bash mutations — while allowing read-only tools like Read, Grep, and Glob. Claude investigates and proposes a plan, and no files change until you approve it. It is enforced by the harness, not merely a request to the model.

Do user-level and project-level rules conflict?

They stack, with project rules taking higher priority — user-level rules in ~/.claude/rules/ load before project rules. As with CLAUDE.md, avoid writing directly contradictory instructions, since genuine conflicts may be resolved arbitrarily.

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 July 25, 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 ♥