The failure modes that cost the most time, grouped by the subsystem that causes them. Most of them present identically, as "Claude is ignoring my configuration".
Configuration
Gotcha
Symptom
Fix
// comments in a settings file
“Settings Error” at startup; the entire file ignored
Strict JSON only. Annotate in a sibling .md
Committed env not applied for a teammate
Builds fail on a fresh clone
They must accept the workspace trust prompt
Secrets in committed settings.json
In git history permanently
Use settings.local.json
Trying to unset an inherited env var
No mechanism exists
Set it to ""
settings.local.json not gitignored
Your tokens get pushed
Add it to .gitignore on day one
A hook path committed but the script isn’t
Every teammate’s tool calls fail
Commit .claude/hooks/ and keep it executable
permissions.deny written as a bare path
Never matches
Rules are Tool(pattern), e.g. Write(**/generated/**)
Memory
Anti-pattern
Why it hurts
A 900-line CLAUDE.md
Adherence degrades sharply. Paid on every turn
Language style guides in CLAUDE.md
Loaded during sessions where they are irrelevant. Use paths: rules
keep-coding-instructions defaults to false. Set it to true
Change appears to do nothing
Takes effect after /clear or a new session
Style not applying inside a subagent
Expected. Subagents run their own system prompt. Forks are the exception
Reaching for /output-style
Removed in v2.1.91. Use /config
Hooks
Gotcha
Detail
A hook that exits non-zero on unhandled input
Blocks unrelated work. Always exit 0 on anything you do not handle
Blocking with no message on stderr
Claude cannot route around it and the block looks like a bug. Exit 2 and explain
Two PostToolUse formatters on one path
They fight. Order between hooks is not guaranteed
A slow Stop hook
Every turn gains its runtime. Keep it to the fast suite
Assuming hook order
There is none. Never chain two hooks that depend on sequence
The meta-gotcha
Almost every entry above presents identically: Claude does something you did not
ask for, and it is not obvious why. Before theorising about the model, run the
conflict checklist. The first
step alone — /context — resolves roughly half of them, because the instruction
was never loaded in the first place.