Which settings file wins when two of them set the same key
Two files set the same key. Which one applies?
Two things surprise people who assume plain overriding: lists are merged, and some keys let a lower level win.
Five levels
Highest first. A key at a higher level overrides the same key below it.
| Where | What | |
|---|---|---|
| 1 | Managed settings | managed-settings.json, MDM policy, or server-managed settings |
| 2 | Command line | --settings and other startup flags. One session only |
| 3 | .claude/settings.local.json |
Your personal settings for this project |
| 4 | .claude/settings.json |
Your team's settings, checked into the repository |
| 5 | ~/.claude/settings.json |
Your personal settings for every project |
3 sits above 4, which is the useful part. A value your team set in the shared
file can be put back for you alone in settings.local.json — without editing
the file everyone shares.
Nothing beats managed. Not --settings, and --model picks only from the
models your organisation allows.
Lists are merged, not overridden
A list key such as permissions.allow, set in more than one file, is
combined rather than resolved to one winner.
// ~/.claude/settings.json
"permissions": { "allow": ["Bash(npm run *)"] }
// .claude/settings.json (your team's)
"permissions": { "allow": ["Bash(git commit *)"] }
// → both apply
Which also means entries cannot be removed from below. A lower-level file
cannot subtract what a higher one added. Use deny, or edit that file.
Four keys that do not merge
The model-related keys have their own rules.
| Key | What happens |
|---|---|
fallbackModel |
Position carries meaning, so the whole value comes from the highest file that defines it |
modelPicker |
Rows are never merged. Taken from the highest of managed / --settings / user, and ignored in project and local |
availableModels |
A managed list applies as-is; entries added below are ignored. Managed sources do not merge either |
modelSettings |
Resolved one model at a time, together with effortLevel |
Environment variables are not a level
They are not part of the stack. Which one applies is decided per key.
ANTHROPIC_MODEL |
Overrides the model key from any file |
ANTHROPIC_DEFAULT_MODEL |
Applies only when no file sets model |
Two variables that both choose a model: one wins, one yields. Check the pair for the key you care about.
An env block inside a settings file is an ordinary key and follows the five
levels above.
Seven keys where a lower level beats managed
For security-sensitive keys, Claude Code honours the more restrictive value.
| Key | Value honoured |
|---|---|
disableClaudeAiConnectors |
true from any scope |
enableArtifact |
false from any scope (and disableArtifact: true) |
isolatePeerMachines |
true from any scope |
remoteControlAtStartup |
false from .claude/settings.json or settings.local.json |
crossSessionInbound |
The stricter value on accept < hold < refuse, from project or local |
useAutoModeDuringPlan |
false from managed, --settings, user, or local |
syncClaudeAiSkills |
Same as above |
This works in one direction only. A project true for
remoteControlAtStartup is ignored. useAutoModeDuringPlan and
syncClaudeAiSkills ignore a false written in the shared
.claude/settings.json, while honouring one from local.
enableArtifact cannot be turned back on. Once anything sets it false,
nothing — managed included — restores the Artifact tool.
When a setting does not apply
/status # which files were loaded
claude doctor # the resolved settings, and any skipped rules
Three causes:
- A higher level sets the same key — see the table above
- That file cannot set that value —
permissions.defaultModevaluesautoandbypassPermissionsdo not take effect from project or local settings (before v2.1.257,bypassPermissionstook effect from any file) - The key is out of that file's scope entirely — 71 of the 223 keys
The full list for the third one:
https://quintetkit.github.io/en/reference/claude-code-settings-scope.html
Checking it
The "cannot set that value" cases are mechanically detectable.
npx @quintetkit/ccheck
warn .claude/settings.json:12
`defaultMode: bypassPermissions` does not take effect from project or local settings.
why: https://code.claude.com/docs/en/settings-reference
Precedence itself is not checked. Which files load is decided at run time and cannot be known from the files in front of you. What cannot be determined is not judged.
Source
https://code.claude.com/docs/en/settings
Based on a snapshot taken 2026-09-04.
The workflow itself is available
Quartet, the four-persona version, is published free under MIT. Quintet adds a UI Designer persona, review criteria, a per-Issue parallel execution script, and a 10-chapter guide.
See the free version Product page