“Everything Below Loads.” Three Of These Do Not.
Somebody drew the .claude/ folder as a tree — sixteen entries, each with a one-line label, colour-coded. “anatomy of a .claude/ folder. every file. what it does. why it matters.” It is the single most useful kind of card: a map of a thing that is normally invisible until it breaks.
And in the smallest type on the image, under the call to action, the author writes this:
Folder names and features change between versions. Check the official Claude Code docs before you rely on this map.
So we did. Every row, against Anthropic’s own page on the .claude directory, which documents each file with a field for exactly the thing the card is trying to convey: when it loads.
The result is better than we expected. The card is right about the things people usually get wrong — the 200-line guidance on CLAUDE.md is genuinely in the docs, .mcp.json really does belong at the project root and not inside .claude/, glob-scoped rules are real and the card’s example path is almost word for word the docs’ own, and calling commands/ “legacy but live” matches the documentation’s own note.
But one sentence on the card is wrong, and it is the one in the middle, printed next to the folder everything else hangs off.
The source card — “anatomy of a .claude/ folder”, BANI Academy. A sixteen-row tree of the Claude Code project folder, with a one-line description of each entry.
The sentence in the middle
Next to .claude/ the card says:
the brain. everything below loads.
Three rows below that, it lists hooks/ with the label “shell scripts that always fire.” And four rows below that, it lists settings.json with the label “permissions, model, hook registry.”
Both of those cannot be true. If settings.json is the hook registry, then a shell script sitting in hooks/ is not a hook yet. It is a file.
The documentation is unambiguous about this. A hook is a JSON entry in a settings file whose command points at a path — the docs’ own example is ${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh. The .claude/hooks/ directory is a convention for where to keep the scripts, nothing more. It does not appear in the documented .claude/ tree at all, because Claude Code never reads it as a directory. It only ever opens the exact path your settings file names.
The docs even describe the failure: when the path is wrong, the hook silently does not run and you get a non-blocking notice on the first attempt. In their words, “a mistyped path in settings.json means the hook never runs”. A script in the right folder with the wrong line in settings fires exactly as often as a script in no folder at all.
The folder is five mechanisms wearing one icon
Once you stop reading .claude/ as a single thing that loads, the map reorganises itself. Anthropic’s documentation gives every entry a when, and those whens fall into five groups. This is the diagram the card is missing, and it is the one that matters, because the groups differ in the only currency that is actually scarce: how much of your context window they eat before you have typed anything.
| # | Load moment | What lives there | Costs you context… | How you check |
|---|---|---|---|---|
| 1 | Always — read at session start | CLAUDE.md, CLAUDE.local.md, rules with no paths:, auto memory MEMORY.md |
Every session, every token. This is the only tier you pay for unconditionally | /context lists them under Memory files |
| 2 | On match — when Claude touches a matching file | Rules with paths: frontmatter; CLAUDE.md files in subdirectories |
Only in sessions that touch those files | /context after the file is read |
| 3 | On pick — you type /name, or Claude chooses it |
skills/, commands/, agents/, workflows/ |
Only when invoked. A hundred unused skills cost you a list, not their contents | The / menu; /doctor |
| 4 | On registration — only if a settings key names it | Hook scripts, the status line script, the selected output style | Nothing. These run outside the model entirely | /hooks, and the bottom bar itself |
| 5 | Never into context — enforced by the program | settings.json permissions, .mcp.json server connections |
Nothing — but they constrain what can happen whether Claude agrees or not | /mcp, permission prompts |
That last point is worth sitting with, because it explains a rule the card states without a reason. “Keep it under 200 lines” is real guidance — the documentation says that when CLAUDE.md approaches 200 lines you should start splitting it into rules/. But the number is not a style preference. It is tier 1 arithmetic. Everything in CLAUDE.md is paid for at the start of every session, in every repository, forever. Everything moved into a paths:-gated rule is paid for only when it is relevant.
The same arithmetic shows up again in the part of the system the card does not mention at all: auto memory. Anthropic caps it explicitly — the first 200 lines, and no more than 25KB, of MEMORY.md is loaded at session start. Same tier, same bill, same ceiling.
So the design principle behind the whole folder is: push everything you can out of tier 1 and into tiers 2, 3 and 4. That is what rules, skills and hooks are for. A map that flattens them into “everything below loads” hides the one idea that makes the folder make sense.
Row by row, against the documentation
The card has twenty-eight rows. Below are its eighteen structural entries — the files and folders themselves, not the illustrative examples hanging off them — each checked against Anthropic’s published documentation. Most of them pass.
| Entry | The card says | What the docs say | Verdict |
|---|---|---|---|
your-project/ |
where Claude actually lives | Project instructions and settings are read from the session’s primary working directory | Right |
CLAUDE.md |
your rules. keep it under 200 lines | “When CLAUDE.md approaches 200 lines, start splitting into rules”. Loaded into context at the start of every session | Right, and the number is genuinely theirs |
CLAUDE.local.md |
personal overrides. never commit | Loads alongside CLAUDE.md and is treated the same way; add it to .gitignore yourself |
Right. One trap the card misses — see below |
.gitignore |
block *.local.* and your secrets | Claude Code adds **/.claude/settings.local.json to your global git excludes the first time it writes that file |
Right but partly automatic |
.mcp.json |
MCP servers. root only, no nesting | “Lives at the project root, not inside .claude/”. Servers connect when the session begins |
Right |
.claude/ |
the brain. everything below loads | Each entry has its own load moment; most do not load at session start | Wrong, and it is the load-bearing sentence |
skills/ |
model-invokable. Claude picks them | “By default, both you and Claude can invoke a skill.” disable-model-invocation and user-invocable: false change that |
Half. You invoke them too, with /name |
agents/ |
subagents. own context window | “Specialized subagents with their own context window”. Spawned by Claude or @-mentioned by you | Right |
commands/ |
slash commands. legacy but live | “New commands should usually be skills instead; commands remain supported” | Right, almost verbatim |
hooks/ |
shell scripts that always fire | Not a documented directory. Hooks are JSON entries in a settings file pointing at a script path | Wrong until registered |
plugins/ |
first-class in 2026. /plugin:cmd | Plugins install from a marketplace and are recorded in enabledPlugins in a settings file |
Not a folder you create |
claude-finance/ |
official Anthropic plugin. 6 agents | No plugin by that name in Anthropic’s documented marketplaces. See the correction below | Name is wrong |
rules/ |
glob-scoped. loads on match | “Rules without paths: load at session start. Rules with paths: load when Claude reads, writes, or edits a matching file” |
Right for gated rules; ungated ones load always |
api.md |
fires only inside src/api/** | The docs’ own example rule uses paths: ["src/api/**/*.ts"] |
Right, near word for word |
output-styles/ |
response shape on tap | “Files read at startup; the style you select with outputStyle applies to every response” |
Right, with a catch: only the selected one applies |
statusline |
bottom-bar. branch, model, tokens | A statusLine key in settings points at a script, conventionally ~/.claude/statusline.sh |
A script, not a loaded file |
settings.json |
permissions, model, hook registry | Permissions, hooks, statusLine, model, env, outputStyle |
Right — and it quietly corrects the hooks/ row |
settings.local.json |
your machine. gitignored | Your personal overrides for one project; kept out of git automatically when Claude Code creates it | Right |
The one factual correction
The card lists claude-finance/ under plugins/ and calls it an “official Anthropic plugin” with six agents. We could not find a plugin by that name.
Anthropic’s documentation names three general-purpose marketplaces — claude-plugins-official, claude-community and the demo claude-code-plugins — plus topic-specific ones such as anthropics/skills and anthropics/knowledge-work-plugins. There is a real finance marketplace, but it is called something else: the repository anthropics/financial-services publishes a marketplace named claude-for-financial-services. Reading its catalogue file directly, it lists nineteen plugins, including financial-analysis, investment-banking, equity-research, earnings-reviewer, kyc-screener and valuation-reviewer, plus two vendor connectors.
So the thing exists; the name on the card does not. If you type /plugin install claude-finance you will get Plugin “claude-finance” not found in any marketplace, and you will spend ten minutes assuming you set something up wrong.
Worth adding, because it is the same lesson as the hooks row: installing a plugin and enabling it are separate. The docs are explicit that committing a plugin entry in .claude/settings.json “turns the plugin on for your collaborators but doesn’t download it to their machines”. Presence is not installation, here either.
What the map leaves out
The bigger gap is not an error, it is a boundary. This card maps your project folder. Half of what Claude Code reads lives in your home folder, and none of it is on the map.
| Missing from the card | Where it lives | When it loads | Why it matters |
|---|---|---|---|
workflows/ |
.claude/ and ~/.claude/ |
“Loaded at startup; each file becomes a /<name> command” |
A documented project directory, same tier as skills |
agent-memory/ |
.claude/ and ~/.claude/ |
First 200 lines (capped at 25KB) of the subagent’s MEMORY.md, loaded when that subagent runs |
Subagents keep their own memory, separate from yours |
| Auto memory | ~/.claude/projects/<project>/memory/ |
MEMORY.md loaded at session start; topic files read on demand |
Tier 1. Costs tokens every session and most people do not know it is there |
~/.claude/CLAUDE.md |
Home folder | “Loaded at the start of every session, in every project” | Your personal instructions, everywhere, forever |
~/.claude/settings.json |
Home folder | Your defaults; project and local settings override individual keys | Where most people’s real configuration actually lives |
User-level rules/ skills/ commands/ agents/ output-styles/ |
~/.claude/ |
Same rules as the project copies | Every folder on the card has a twin you did not see |
keybindings.json, themes/ |
~/.claude/ |
Read at session start; keybindings hot-reload on edit | Small, but they are part of the anatomy |
.worktreeinclude |
Project root | Read when a worktree is created | Gitignored files to copy into new worktrees |
There is also a trap in the CLAUDE.local.md row that is worth knowing even though the card’s label is correct. Having a CLAUDE.local.md anywhere on the project path stops Claude reading an AGENTS.md by default — the documentation spells out that AGENTS.md is read only when there is no CLAUDE.md or CLAUDE.local.md above your working directory. If you work in a repository that standardises on AGENTS.md and you drop in a personal local file, you have just switched your teammates’ shared instructions off for yourself, silently.
It is the same shape of problem as a CLAUDE.md in the wrong folder: nothing errors, nothing warns, the file is simply never read.
The two lines that turn three of those rows on
If you took the card at its word, built .claude/hooks/format-on-save.sh, made it executable and waited for it to always fire — this is what was missing. Both registrations live in the same file, which is why the card’s settings.json label was the honest one all along.
{
"hooks": {
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/format-on-save.sh"
}]
}]
},
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh"
}
}
Three details that bite. The script has to be executable — chmod +x — or the shell exits with code 127 and you get a non-blocking notice instead of a hook. The matcher decides which tool calls the hook sees. And ${CLAUDE_PROJECT_DIR} is there on purpose: it keeps pointing at the project root the session started in, so the same line works from a subdirectory and inside a worktree.
Stop guessing: four commands that show you what loaded
The real lesson of the card is not any one row. It is that a folder tree cannot tell you whether something loaded, because loading is not a property of where a file sits. Anthropic has a whole page on debugging your configuration for exactly this, and four commands do most of the work.
/context— what is actually in the window right now, including the Memory files list. This is how you confirm a CLAUDE.md or an ungated rule loaded./hooks— which hooks are registered. If yours is not listed, the folder was never the problem./mcp— which MCP servers connected, as opposed to which ones are written in.mcp.json./doctor— the broad sweep, including a prompt audit across your CLAUDE.md, rules, skills, commands, subagents and output styles.
Thirty seconds with /context settles an argument that a map cannot.
Four honest caveats
- This check has a date on it. Everything above was read from the current Claude Code documentation in October 2026. The card’s own footnote is right: names and features move between versions, and a correct map goes stale without anyone editing it.
- This is a documentation check, not a machine test. We compared the card against what Anthropic publishes; we did not sit down and create all twenty-eight entries to watch what happened. Where documented behaviour and actual behaviour disagree, trust the machine and file a bug.
- The missing plugin may exist somewhere we did not look. We checked Anthropic’s documented marketplaces and read the
claude-for-financial-servicescatalogue file directly. A third-party marketplace could publish something calledclaude-finance; it would not be an official Anthropic plugin. - The example names are examples.
ui-ux-pro-max,remotion,code-reviewer.mdand the rest are the author’s illustrations of what you might put in those folders. We did not verify them and the card does not claim they are official. Onlyclaude-financewas labelled official, which is why it was the one worth checking.
The one-line version
A .claude/ folder is not a brain and nothing “below” it simply loads. It is five different loading mechanisms sharing one folder icon, and the only tier that costs you anything before you type is the small one at the top. Learn which row is in which tier and the 200-line rule, the rules/ folder and the entire design of the thing stop looking like trivia and start looking like one idea.
If this is the file-system half of getting more out of Claude, the conversation half is here — four named knobs and how to tell which one to turn. On the folder side, we have also written about which commands produce output and which one checks it, and about the difference between a map and a bag — which is, in the end, what this card was trying to be.
Do this one thing. Open a project, run /context, and read the Memory files list. Anything on it is costing you tokens in every session from now until you move it into a paths:-gated rule.




4 Comments