Field note · 31 August 2026 · Daniel Wright

Putting defaultMode auto in the project settings file looks correct and does nothing. Anthropic only honours it from user settings or the flag.

A brass AUTO toggle on a closed slate-blue project box is switched on, but its cloth-covered wire is cut short of a cream control panel
The switch is labelled and thrown. The wire never arrives.

The annoyance

I put "permissions": { "defaultMode": "auto" } in the project's .claude/settings.json so every session in that repo would start in auto mode. The JSON is valid. The key is the one the docs name. The session still opens in Manual — or whatever the built-in default is — and nothing throws.

I had the usual suspects lined up. A stale CLI. A plan that did not include auto. A managed setting I had forgotten. Then I put the same object in ~/.claude/settings.json and the next terminal session started in auto. The project file had never been the lever.

It is not a silent permissions miss. It is the documented exception for one value.

What Anthropic actually says

From the official permission modes page, under “Which mode a session starts in”:

“permissions.defaultMode in a settings file. An "auto" value in .claude/settings.json or .claude/settings.local.json doesn't take effect, and Claude Code then uses the built-in default rather than a defaultMode from ~/.claude/settings.json. The other values apply from any settings file.”

Same page, troubleshooting a silent miss:

“If you set defaultMode: "auto" in settings and a terminal session starts in Manual mode with no error, the setting is likely in .claude/settings.json or .claude/settings.local.json. auto doesn't take effect from those files. Move it to ~/.claude/settings.json.”

Two things follow. First, project settings are not ignored wholesale — they are ignored for this one value. Second, once auto misses in the project file, Claude Code does not fall through to a user-level defaultMode. It skips to the built-in default. That is why a machine-wide auto setting can look broken if a project file also sets auto.

The rest of the map

Project .claude/settings.json can still pin default, manual, acceptEdits, plan, bypassPermissions or dontAsk for terminal sessions. Those values apply from any settings file.

The VS Code extension never reads project settings for the starting permission mode. claudeCode.initialPermissionMode does not accept auto. Leave it unset and pick Auto from the mode indicator, or rely on user or managed settings.

The flag always works: claude --permission-mode auto.

The fix

The wrong shape is the one I keep finding in repos. It is valid JSON. It is the documented key. It does nothing for auto:

Wrong shape · project file · silent miss
{
  "permissions": {
    "defaultMode": "auto"
  }
}

Put the same object in the user file if you want every terminal session on this machine to start in auto:

~/.claude/settings.json · machine-wide terminal default
{
  "permissions": {
    "defaultMode": "auto"
  }
}

For one session, skip the files:

One session · flag always works
claude --permission-mode auto

If the project file is the right place, pin a value that actually applies there. Plan is the one I use when a repo should start by reading, not writing:

.claude/settings.json · plan does apply here
{
  "permissions": {
    "defaultMode": "plan"
  }
}

Prove it

Start a terminal session from the project with the wrong file in place. Confirm the status bar. Move the same JSON to ~/.claude/settings.json, start again. Or skip the files and pass the flag once. If the VS Code conversation still opens in Manual, that is a different list: the extension does not read the project file for this, and it will not take auto from claudeCode.initialPermissionMode.

Why it fails

I treat project settings as the place that wins. For every other defaultMode they do. For auto they do not, and they also stop a user-level auto from applying. The JSON looks correct. Nothing throws. Same family as top-level additionalContext and exit 1 does not block — the output looks successful, and the documented field is a different one. The silent Opus tax is the same class of miss: nothing tells you the default you never chose.

If you want to run this with other operators rather than on your own, we are doing that in the public Skool community, and that is https://www.skool.com/navaigate.

Sources

Make the next AI decision concrete.

NavAIgate helps leadership teams identify high-value AI opportunities, prove them safely and turn the winners into working systems.