Skip to content
CCAF Preparation

Task Statement 3.1·Domain 320% of exam

CLAUDE.md Hierarchy, Scoping, and Modular Organisation

Configure CLAUDE.md files with appropriate hierarchy, scoping, and modular organization

Jump to practice →

Official Exam Guide Objectives

Knowledge of

  • The CLAUDE.md configuration hierarchy: user-level (~/.claude/CLAUDE.md), project-level (.claude/CLAUDE.md or root CLAUDE.md), and directory-level (subdirectory CLAUDE.md files)
  • That user-level settings apply only to that user—instructions in ~/.claude/CLAUDE.md are not shared with teammates via version control
  • The @import syntax for referencing external files to keep CLAUDE.md modular (e.g., importing specific standards files relevant to each package)
  • .claude/rules/ directory for organizing topic-specific rule files as an alternative to a monolithic CLAUDE.md

Skills in

  • Diagnosing configuration hierarchy issues (e.g., a new team member not receiving instructions because they're in user-level rather than project-level configuration)
  • Using @import to selectively include relevant standards files in each package's CLAUDE.md based on maintainer domain knowledge
  • Splitting large CLAUDE.md files into focused topic-specific files in .claude/rules/ (e.g., testing.md, api-conventions.md, deployment.md)
  • Using the /memory command to verify which memory files are loaded and diagnose inconsistent behavior across sessions

What You Need to Know

Claude Code picks up CLAUDE.md files from three places, and a surprising number of exam items reduce to noticing that a rule was written at the wrong one. Knowing what each level reaches — and what it cannot — is most of this task statement.

The Three-Level Hierarchy

User-level: ~/.claude/CLAUDE.md

Yours alone. It sits in your home directory rather than in any repository, which means git never sees it and it never reaches anybody else. A new teammate cloning the project inherits none of it. Reserve this level for things that are genuinely about you: how verbose you like responses, an output style you prefer, shortcuts nobody else would want.

Project-level: .claude/CLAUDE.md or root CLAUDE.md

Everyone's. It is committed with the code, so cloning or pulling the repository brings it along automatically for every developer. Anything the team has agreed on belongs here — naming conventions, how errors are handled, what testing is expected, architectural decisions, the review checklist.

Two paths are equally valid at this level: CLAUDE.md sitting at the repository root, or .claude/CLAUDE.md inside the .claude directory. Exam items use both, so neither is a signal that something is wrong.

Directory-level: subdirectory CLAUDE.md files

Scoped to work happening in that part of the tree. These carry conventions that are real for one package and irrelevant elsewhere — REST conventions in /packages/api/CLAUDE.md, say, which the frontend package has no use for.

Loading Order and Conflict Handling

It is tempting to read three levels as three tiers of precedence. That is not how CLAUDE.md behaves, and the Anthropic memory docs say so directly: "All discovered files are concatenated into context rather than overriding each other." Everything applicable ends up in the same context window together, and nothing displaces anything.

What the docs describe is a load order — the sequence in which files arrive — rather than a chain of overrides:

  1. Ordering runs from broadest scope to most specific, so a project instruction lands in context after a user instruction. Down the directory tree, "content is ordered from the filesystem root down to your working directory," which means "instructions closer to where you launched Claude are read last."
  2. At any one level, CLAUDE.local.md follows CLAUDE.md, putting your personal notes last in that directory.

Arriving later is not the same as winning. On this the docs leave no room: "if two rules contradict each other, Claude may pick one arbitrarily." CLAUDE.md reaches the model as a user message rather than as part of the system prompt, and Anthropic states plainly that "there's no guarantee of strict compliance." It is guidance that is usually followed — not a configuration layer resolving conflicts deterministically.

Which has a practical consequence worth carrying into the exam. Where a rule has to hold on every single run — a tool that must stay blocked, a formatter that must run, a permission that must not be granted — scoping it into the right CLAUDE.md does not make it binding. Put it in settings.json, which the client applies whatever the model concludes, or in a hook, which fires at a fixed point in the lifecycle. The docs state the division outright: "Settings rules are enforced by the client regardless of what Claude decides to do. CLAUDE.md instructions shape Claude's behavior but are not a hard enforcement layer."

Modular Organisation with @ path imports

Once a CLAUDE.md runs past a few hundred lines it stops being pleasant to maintain, and the @ syntax exists to break it apart. A line is just @ followed by a path — there is no @import keyword, whatever a good proportion of the write-ups online show.

The syntax in your CLAUDE.md:

# .claude/CLAUDE.md

Coding standards:

@./standards/naming-conventions.md
@./standards/error-handling.md
@./standards/testing-requirements.md

Every @<path> pulls that file inline as the CLAUDE.md loads. Because each package's CLAUDE.md imports only what it needs, the API package takes the API conventions and the frontend takes the component rules, with nothing written twice.

Here is the part the docs skip over, and it matters for context budgeting: imports resolve eagerly. The referenced file is inlined the instant Claude reads the CLAUDE.md, exactly as though you had pasted it there yourself. Breaking 600 lines into six files of 100 improves the editing experience and leaves the context Claude receives precisely as large as before. Shrinking what actually loads per session is a different tool — .claude/rules/ with path-scoped frontmatter, covered in Task Statement 3.3, where files load only when the paths match.

CLAUDE.local.md, local-only overrides

CLAUDE.local.md sits beside CLAUDE.md at any level and loads by the same mechanism. Three differences are worth holding:

  • Loading order. It arrives after the CLAUDE.md beside it, giving it the final word within that directory — subject, still, to conflicts resolving arbitrarily.
  • Gitignored by convention. The .local suffix signals "not for committing", and most teams add it to .gitignore so private adjustments stay private.
  • What it's for. The committed CLAUDE.md carries what the team agreed; the CLAUDE.local.md beside it carries what only you need here — a scratch directory you favour, an explanation you are tired of retyping, a debugging note with a short life expectancy.

The clean way to think about it: CLAUDE.local.md is ~/.claude/CLAUDE.md narrowed to one repository. Reaching for it to express something the whole team should follow is a signal that the rule belongs in CLAUDE.md instead.

The .claude/rules/ Directory

Rather than one CLAUDE.md carrying everything, .claude/rules/ holds a file per topic:

  • testing.md — test naming, assertion patterns, fixture usage
  • api-conventions.md — endpoint naming, request/response schemas
  • deployment.md — deployment checklist, environment configuration

Any of these may carry YAML frontmatter that scopes it to particular paths, which Task Statement 3.3 covers properly. A rules file without frontmatter simply loads for every session.

The /memory Command

/memory reports which memory files the current session actually has. It earns its place when behaviour drifts — between two sessions, or between two developers running what should be identical setups — because it answers the question underneath most of those puzzles: are the files you assume are loaded genuinely loaded?

The Critical Exam Scenario: New Team Member Not Receiving Instructions

This is the exam's favourite trap for Task Statement 3.1, and the setup barely varies:

Someone who has been on the team a while gets exactly the behaviour they expect — API naming, test structure, error handling all followed. A new joiner clones the same repository, checks out the same branch, and gets output that ignores every one of those conventions.

The cause is the same every time. Those conventions live in the long-standing developer's own ~/.claude/CLAUDE.md, not in the repository's .claude/CLAUDE.md or root CLAUDE.md. Nothing at user level travels through git, so the new joiner never received any of it — and never could have, on any branch.

The fix: move instructions from user-level to project-level configuration.

Learn to recognise it from the pairing alone. A new team member plus inconsistent behaviour, with the repository and branch confirmed identical, points at where the configuration lives rather than at anything in the code.

Deep Dive

settings.json: the precedence chain CLAUDE.md doesn't have

CLAUDE.md files concatenate; settings.json files don't — they resolve through a genuine five-level precedence order, highest to lowest: managed (enterprise policy, can't be overridden by anything) → command line arguments (temporary session overrides) → local (overrides project and user) → project (overrides user) → user (lowest, applies only when nothing else specifies the setting). A project actually has two settings files: .claude/settings.json for settings checked into source control and shared with the team, and .claude/settings.local.json for settings that are not checked in — personal preferences and experimentation.

Sourcecode.claude.com › settingsfetched 2026-07-30

settings.json locations, including the enterprise managed path

User-scope settings live at ~/.claude/settings.json and apply across all projects. Enterprise managed settings (managed-settings.json) load from an OS-specific path that individual users can't touch: /Library/Application Support/ClaudeCode/ on macOS, /etc/claude-code/ on Linux and WSL, and C:\Program Files\ClaudeCode\ on Windows.

Sourcecode.claude.com › settingsfetched 2026-07-30

The fourth CLAUDE.md scope: managed policy

Beyond the user/project/directory levels introduced above, Claude Code recognises a fourth scope: managed policy, loaded from the same OS-specific system paths as managed settings (e.g. /etc/claude-code/CLAUDE.md on Linux/WSL, C:\Program Files\ClaudeCode\CLAUDE.md on Windows). A managed policy CLAUDE.md is organisation-deployed, applies to every session on the machine, and "cannot be excluded" by any individual setting — it always applies, "regardless of individual settings."

Sourcecode.claude.com › memoryfetched 2026-07-30

@import mechanics: depth limit and what parsing skips

Imports recurse — an imported file can itself import others — but only to a maximum depth of four hops in current docs (older documentation said five; see the divergence log). Import parsing deliberately skips Markdown code spans and fenced code blocks, so wrapping a path in backticks lets you mention it in prose without triggering an import of it.

Sourcecode.claude.com › memoryfetched 2026-07-30

Sharing personal preferences across worktrees

CLAUDE.local.md is scoped to a single working-tree checkout, so it doesn't follow you into a git worktree of the same repo. To share personal instructions across worktrees, import a file from your home directory instead of relying on CLAUDE.local.md — e.g. a line reading @~/.claude/my-project-instructions.md inside the project CLAUDE.md.

Sourcecode.claude.com › memoryfetched 2026-07-30

/init and the 200-line size guidance

/init generates a starting CLAUDE.md by analysing the codebase: it creates a file with build commands, test instructions, and conventions it discovers, and if a CLAUDE.md already exists, /init suggests improvements rather than overwriting it. Separately, the docs recommend keeping each CLAUDE.md under 200 lines, since "longer files consume more context and reduce adherence" — the same argument that motivates splitting into .claude/rules/.

Sourcecode.claude.com › memoryfetched 2026-07-30

Quick Reference

ItemValue / behaviour
User-level CLAUDE.md~/.claude/CLAUDE.md — personal, not git-shared
Project-level CLAUDE.md.claude/CLAUDE.md or root CLAUDE.md — shared via git
Directory-level CLAUDE.mdsubdirectory CLAUDE.md — loads on demand when Claude reads files there
Managed policy CLAUDE.mdOS-specific enterprise path — cannot be excluded, applies to every session
CLAUDE.md load orderbroadest → most specific; CLAUDE.local.md loads after CLAUDE.md at the same level
CLAUDE.md conflict handlingconcatenated, not overridden — "Claude may pick one arbitrarily"
settings.json precedencemanaged > CLI args > local > project > user (strict, highest wins)
settings.json locationsuser ~/.claude/settings.json; project .claude/settings.json (shared) / .claude/settings.local.json (personal); enterprise OS-specific path
@ import syntax@path on its own line — no @import keyword in current docs
@ import depth4 hops max, recursive (current docs; older docs said 5)
@ import scope skipmarkdown code spans / fenced code blocks are never parsed for imports
/initgenerates or improves a CLAUDE.md from codebase analysis
/memorydiagnostic only — shows loaded files, never triggers loading
Recommended CLAUDE.md sizeunder 200 lines per file
.claude/rules/ (no paths)loads at launch, same priority as .claude/CLAUDE.md

Exam Traps

Practice Scenario

Developer A's Claude Code follows the team's API naming conventions perfectly. Developer B, who joined last week, gets inconsistent naming from Claude Code. Both work on the same repo and branch. What is the most likely root cause?

Build Exercise

Build a Multi-Level CLAUDE.md Configuration

Difficulty: Beginner (1/4)

30 minutes

  1. Create a project-level .claude/CLAUDE.md with universal coding standards: naming conventions, error handling patterns, and a code review checklist

Why: Project-level configuration is the foundation of team-wide standards. The exam tests whether you place shared conventions here rather than in user-level config, which is the most common misconfiguration scenario.

You should see: A .claude/CLAUDE.md file at the repository root containing at least three sections: naming conventions, error handling patterns, and a code review checklist. Running /memory in the project root shows this file as loaded.

  1. Create a directory-level CLAUDE.md in a /packages/api/ subdirectory with API-specific conventions (REST endpoint naming, request/response schema requirements)

Why: Directory-level configuration scopes conventions to a specific package. The exam tests whether you know that directory-level CLAUDE.md applies only within that directory, not across the entire project.

You should see: A CLAUDE.md file inside /packages/api/ containing REST-specific conventions. When you run /memory while working in /packages/api/, both the project-level and directory-level files appear as loaded.

  1. Create .claude/rules/testing.md with test-specific conventions (test naming pattern, assertion style, fixture usage)

Why: The .claude/rules/ directory holds topic-specific rule files that can optionally include YAML frontmatter for path scoping. Understanding this mechanism is tested alongside path-specific rules in Task Statement 3.3.

You should see: A testing.md file inside .claude/rules/ containing at least three test conventions. Running /memory shows this rules file as loaded in your session.

  1. Use an @ path import in the project-level CLAUDE.md to reference a shared standards file at ./standards/naming.md

Why: The @ import syntax enables modular organisation of conventions. There is no @import keyword — a path prefixed with @ on its own line is the import. Each package can import only relevant standards, reducing duplication and drift in the source files. The exam tests whether you know the mechanism exists and how the syntax actually looks.

You should see: The project-level .claude/CLAUDE.md contains a line beginning with @ pointing to ./standards/naming.md. A separate file at .claude/standards/naming.md (or standards/naming.md relative to the CLAUDE.md) exists with naming conventions. Running /memory confirms the imported content is loaded inline.

  1. Run /memory in different directories to verify the correct files are loaded in each context

Why: The /memory command is the diagnostic tool for verifying which configuration files are active. The exam specifically tests that /memory reveals loaded files but does not trigger loading — configuration loads automatically based on location.

You should see: In the project root, /memory shows the project-level CLAUDE.md and rules files. In /packages/api/, /memory additionally shows the directory-level CLAUDE.md. The imported standards file content appears as part of the project-level configuration.

  1. Move one convention from project-level to user-level (~/.claude/CLAUDE.md) and verify that a different user session does NOT pick it up — confirming the scoping boundary

Why: This is the exam favourite trap scenario. When conventions live in user-level config, new team members who clone the repo do not receive them. Proving this boundary experimentally cements the concept.

You should see: After moving a convention to ~/.claude/CLAUDE.md, your own /memory shows it loaded. A simulated second user session (or a fresh clone without your home directory config) does NOT show that convention. This confirms the scoping boundary.

Sources


Appendix A — Build Exercise Step Hints

Progressive hints revealed by the "Stuck? Get a nudge" control on each step.

Step 1. Create a project-level .claude/CLAUDE.md with universal coding standards: naming conventions, error handling patterns, and a code review checklist

Why: Project-level configuration is the foundation of team-wide standards. The exam tests whether you place shared conventions here rather than in user-level config, which is the most common misconfiguration scenario.

You should see: A .claude/CLAUDE.md file at the repository root containing at least three sections: naming conventions, error handling patterns, and a code review checklist. Running /memory in the project root shows this file as loaded.

Stuck? Get a nudge

Step 2. Create a directory-level CLAUDE.md in a /packages/api/ subdirectory with API-specific conventions (REST endpoint naming, request/response schema requirements)

Why: Directory-level configuration scopes conventions to a specific package. The exam tests whether you know that directory-level CLAUDE.md applies only within that directory, not across the entire project.

You should see: A CLAUDE.md file inside /packages/api/ containing REST-specific conventions. When you run /memory while working in /packages/api/, both the project-level and directory-level files appear as loaded.

Stuck? Get a nudge

Step 3. Create .claude/rules/testing.md with test-specific conventions (test naming pattern, assertion style, fixture usage)

Why: The .claude/rules/ directory holds topic-specific rule files that can optionally include YAML frontmatter for path scoping. Understanding this mechanism is tested alongside path-specific rules in Task Statement 3.3.

You should see: A testing.md file inside .claude/rules/ containing at least three test conventions. Running /memory shows this rules file as loaded in your session.

Stuck? Get a nudge

Step 4. Use an @ path import in the project-level CLAUDE.md to reference a shared standards file at ./standards/naming.md

Why: The @ import syntax enables modular organisation of conventions. There is no @import keyword — a path prefixed with @ on its own line is the import. Each package can import only relevant standards, reducing duplication and drift in the source files. The exam tests whether you know the mechanism exists and how the syntax actually looks.

You should see: The project-level .claude/CLAUDE.md contains a line beginning with @ pointing to ./standards/naming.md. A separate file at .claude/standards/naming.md (or standards/naming.md relative to the CLAUDE.md) exists with naming conventions. Running /memory confirms the imported content is loaded inline.

Stuck? Get a nudge

Step 5. Run /memory in different directories to verify the correct files are loaded in each context

Why: The /memory command is the diagnostic tool for verifying which configuration files are active. The exam specifically tests that /memory reveals loaded files but does not trigger loading — configuration loads automatically based on location.

You should see: In the project root, /memory shows the project-level CLAUDE.md and rules files. In /packages/api/, /memory additionally shows the directory-level CLAUDE.md. The imported standards file content appears as part of the project-level configuration.

Stuck? Get a nudge

Step 6. Move one convention from project-level to user-level (~/.claude/CLAUDE.md) and verify that a different user session does NOT pick it up — confirming the scoping boundary

Why: This is the exam favourite trap scenario. When conventions live in user-level config, new team members who clone the repo do not receive them. Proving this boundary experimentally cements the concept.

You should see: After moving a convention to ~/.claude/CLAUDE.md, your own /memory shows it loaded. A simulated second user session (or a fresh clone without your home directory config) does NOT show that convention. This confirms the scoping boundary.

Stuck? Get a nudge

Appendix B — Interactive Study Prompts

Two prompts to paste into Claude. B1 drills the judgement the exam actually measures; B3 reviews the configuration you wrote for the Build Exercise above. The exam simulator between them is the interactive quiz on this page.

B1. Concept Check — Discrimination Drill

Prompt — paste into Claude

You are examining me for the Claude Certified Architect – Foundations (CCAR-F) exam, Domain 3: Claude Code Configuration & Workflows (20% of the exam), Task Statement 3.1: CLAUDE.md Hierarchy, Scoping, and Modular Organisation. Use British English throughout.

What this exam actually measures. Not one item on the official exam asks what something is. Every item drops you into a production system that is already misbehaving, offers four defensible engineering responses, and asks which is best. The skill being tested is proportionality: fix the root cause with the cheapest instrument that gives the guarantee the situation demands. So do not quiz me on definitions. Make me choose between options that are both defensible, then attack whatever I chose.

How to run this session.

  • One question at a time. Stop and wait. Never answer your own question, and never move on until I have committed.
  • Never reveal which option is right before I commit to one.
  • Do not praise me. A correct answer earns "Yes" and the next question. If I am right for the wrong reason, say so — that is the failure that costs marks on exam day.
  • When I am wrong, quote the exact phrase in my answer that gave it away, correct it in one sentence, and move on. One correction at a time.
  • If I write something fluent but empty, name it: "That is a restatement, not a reason."
  • Set every scenario inside one of the exam's production contexts: Code Generation with Claude Code (a team leaning on custom slash commands, CLAUDE.md configuration, and plan mode versus direct execution), Claude Code for Continuous Integration (automated review, test generation and PR feedback in a pipeline that has to keep false positives down), or Developer Productivity with Claude (an agent over an unfamiliar codebase using the built-in Read, Write, Bash, Grep, Glob tools).

Session plan — about twelve questions.

Round 1 — Anchor (1 question). One concrete question to check I have actually read the material. If I cannot answer it, stop the session and tell me to read the lesson before continuing.

Round 2 — Discrimination (5 questions). Each one: describe a symptom in one of the contexts above, with a number or a concrete observation in it — a file count, a diff between two developers' sessions, a line from a /memory listing. Offer exactly two responses, both defensible. Ask me to pick one and justify it in a single sentence. Then argue the case for the option I rejected as strongly as you can, and ask whether I am holding or changing my answer. Only after I answer that, tell me which is right and why the other one is the more tempting trap.

Round 3 — Proportionality (2 questions). Take one symptom and run it twice with different stakes: once where the cost of the rule being ignored is one developer's session drifting off the house naming style, once where it is a mandatory security review step skipped on a release branch. The right answer must change between the two — the second stops being a placement question about CLAUDE.md at all. If I answer the same way both times without noticing the stakes moved, that is the finding — tell me.

Round 4 — Code review (3 questions). Present a colleague's confident proposal containing one of the trap errors listed below, written the way a teammate would write it in a pull request. Ask me what is wrong with it. Do not signal that anything is wrong.

Round 5 — Verdict. Rate me green, amber or red on each concept below. Name the single weakness most likely to cost me marks, and give me one specific next action: a section of this lesson to re-read, or a step of the Build Exercise to redo. If I am not ready for this task statement, say so plainly.

Concepts in scope

  1. The three-level hierarchy — user-level ~/.claude/CLAUDE.md lives outside the repository and reaches nobody else; project-level .claude/CLAUDE.md or a root CLAUDE.md travels through git to everyone who clones; a directory-level CLAUDE.md applies when work is happening in that directory.
  2. Concatenation, not precedence — every applicable file loads into the same context ordered broadest to most specific, none replaces another, and two contradictory rules may be resolved arbitrarily. A rule that must hold on every run belongs in settings.json or a hook, which have real enforcement.
  3. @ path imports — a bare @ before a path on its own line inlines that file at load time, so each package pulls in only the standards it needs. Imports load eagerly, so splitting one long file into several shortens the source, not the context.
  4. .claude/rules/ — topic-specific rule files as the alternative to one monolithic CLAUDE.md; with no paths frontmatter they load at launch with the same priority as .claude/CLAUDE.md.
  5. /memory as a diagnostic — it reports which memory files are already loaded in this session. It never causes anything to load, so it tells you where behaviour drift comes from, not how to end it.

Trap errors to plant in Round 4

  • Keeping team-wide conventions in ~/.claude/CLAUDE.md and expecting a new joiner who has cloned the repository to receive them.
  • Treating /memory as the command that activates configuration rather than the one that reports what is already active.
  • Reaching for a directory-level CLAUDE.md for conventions that span many directories, such as test files scattered through the tree.
  • Claiming that the more specific file wins a conflict, or that user-level overrides project-level, when the files are concatenated and a contradiction may go either way.

This task statement carries one divergence between the exam guide and current product behaviour: the guide names the mechanism "the @import syntax", while current Claude Code documentation has no @import keyword — the directive is a bare @ immediately before a path. Mark the exam guide's answer as the one that scores, and note the divergence in a single sentence rather than arguing it.

Stay inside the material above. If I raise something outside it, tell me it is out of scope for this task statement and return to the drill. Begin with Round 1.

B2. Exam Simulator

Exam simulator

Question 1 of 10

Scenario · Code Generation with Claude Code

Developer A has been on the repository for six months and Claude Code applies the team's API naming conventions on every task. Developer B cloned the same branch last week and gets inconsistent naming from the first prompt onward. Both run the same Claude Code version. What is the most likely root cause?

B3. Build Coach — Config Review

The Build Exercise and its hint ladder are already on this page. This prompt is for the one thing the page cannot do: review the configuration you actually wrote.

Prompt — paste into Claude

You are a staff engineer reviewing my implementation of a build exercise for the Claude Certified Architect – Foundations exam, Domain 3, Task Statement 3.1: CLAUDE.md Hierarchy, Scoping, and Modular Organisation. Use British English throughout.

I am building a multi-level Claude Code configuration for one repository: shared standards at project level, a package-scoped file for the API directory, a topic-specific rule file, a separate standards file pulled in through an @ path import, and one convention deliberately parked at user level so the scoping boundary can be demonstrated rather than asserted.

It has to satisfy all of the following:

  • Project-level standards — naming, error handling, a review checklist — sit in a version-controlled file that a colleague receives on clone, and appear as loaded from the repository root.
  • A directory-level file inside the API package carries REST conventions that appear alongside the project file only when work is happening in that directory.
  • A topic-specific rule file under .claude/rules/ carries at least three test conventions and shows as loaded in the session.
  • The project-level file references a separate standards file through a path import, and the imported content is visible as part of the loaded configuration.
  • One convention placed at user level is provably absent from a session that does not have my home directory, which is the boundary the exercise exists to prove.

How to review.

  • Ask me to paste the configuration files and the directory layout they sit in. If I have not pasted them, ask for that and nothing else. Do not write the configuration for me, do not offer a reference version, and do not fill in a step I have skipped.
  • Work through the criteria above in order. For each one, quote the line of my configuration that satisfies it, or say plainly that nothing does.
  • Then hunt for the failure modes below. Each is a real misconfiguration, not a style preference.
  • Rank everything you find: (1) would break for a teammate on clone, (2) would lose marks on the exam, (3) style. Give me the first item under (1) and then stop — wait for my fix before giving me the next one.
  • If my configuration satisfies everything, do not congratulate me. Change the requirements — one of these rules must now hold on every single run with no exceptions — and make me say where it goes instead and why.
  • If I ask you to just write it for me, refuse once and give me the smallest nudge that would unblock me instead.

Failure modes to probe

  • A rule the whole team depends on sitting in the home directory, where a fresh clone will never see it.
  • An import written with a keyword in front of the path, or wrapped in backticks, so nothing is inlined and the standards file is silently ignored.
  • The split into imported files being sold as a context saving, when imports are inlined eagerly and the loaded context is the same size as before.
  • A rule that must never be skipped expressed as prose in CLAUDE.md, where a contradiction can resolve either way, instead of somewhere the client enforces it.
  • /memory presented as the step that makes the configuration take effect, rather than the step that shows what already has.

Start by asking me for my configuration files and the directory layout.