[BUG] defaultMode: bypassPermissions in settings.json has no effect — permission prompts still appear
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Setting "defaultMode": "bypassPermissions" in both ~/.claude/settings.json and the project-level
.claude/settings.local.json does not suppress permission prompts. Every tool call still triggers an approval
prompt, and approved commands accumulate in the permissions.allow list in settings.local.json, confirming the
bypass is not active.
The only working solution is --dangerously-skip-permissions via CLI flag.
Prompts appear on every tool call. Each approval writes the specific command to settings.local.json under
permissions.allow, growing the allowlist indefinitely.
What Should Happen?
No approval prompts. All tools run automatically as documented.
Error Messages/Logs
Steps to Reproduce
- Set {"defaultMode": "bypassPermissions"} in ~/.claude/settings.json
- Open a new terminal and start claude in any project
- Observe that Bash tool calls still require approval
Claude Model
Sonnet (default)
Is this a regression?
Yes, this worked in a previous version
Last Working Version
_No response_
Claude Code Version
2.1.72
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Warp
Additional Information
The settings.local.json file is also being modified in real-time during sessions, causing race conditions
when Claude attempts to write to it (receiving "file modified since last read" errors).
It was working fine in Terminal and in Craft Agents as well.
Showing cached comments. Read the full discussion on GitHub ↗
14 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
It's not resolved 👎
Confirming on v2.1.81 — neither settings.json nor CLI flag works
Same issue. Running CLI
claude --dangerously-skip-permissionson macOS (not VS Code) — every tool call still prompts.Confirming the settings.local.json accumulation behavior: approved commands pile up in
.claude/settings.local.jsonunderpermissions.allow, proving bypass mode is not active. This matches your description exactly.Additional finding: having any
permissions.allowrules in project-level.claude/settings.local.jsonmay make it worse. I tried removing all project-level allow rules and keeping only the globaldefaultMode: "bypassPermissions"+ the CLI flag — still prompts.Workaround attempt (untested): adding broad
permissions.allowrules globally (Bash,Write,Edit,Read,Glob,Grep,WebFetch,Agent,Skill,mcp__*) to~/.claude/settings.jsonas a fallback. Will update if this helps.Environment: v2.1.81, macOS Darwin 25.3.0, zsh, Anthropic API, Apple Silicon.
+1000 this is killing my workflow. no variation fixes this.
Confirming this is still broken on 2.1.81 (macOS, Apple Silicon, terminal CLI).
What I've tried — none of it works:
defaultMode: bypassPermissionsin project-level.claude/settings.jsondefaultMode: bypassPermissionsin project-level.claude/settings.local.jsonskipDangerousModePermissionPrompt: truein~/.claude/settings.jsonclaude --dangerously-skip-permissionspermissions.allow(Bash, Edit, Write, MultiEdit, Read, Glob, Grep, WebFetch, mcp__*) — they show up in/permissionsunder Allow but still promptNothing suppresses the prompts.
Key observation: The status bar shows "Bypass Permissions" but
/permissionsreports the active mode as "Workspace", not bypass. The indicator and the actual permission evaluation are out of sync.Confirming this is still broken on 2.1.81 (macOS, Apple Silicon, terminal CLI).
What I've tried — none of it works:
defaultMode: bypassPermissionsin project-level.claude/settings.jsondefaultMode: bypassPermissionsin project-level.claude/settings.local.jsonskipDangerousModePermissionPrompt: truein both project and user-level settingsclaude --dangerously-skip-permissionspermissions.allow(Bash, Edit, Write, MultiEdit, Read, Glob, Grep, WebFetch, mcp__*) — they show up in/permissionsunder Allow but still promptNothing suppresses the prompts.
Key finding: the status bar says "Bypass Permissions" but
/permissionsreports the active mode as "Workspace." The indicator and the actual permission evaluation are out of sync.Possible root cause — workspace trust in non-git directories:
My project layout uses workspace directories that are not git repositories. The structure is intentional:
Issue #28506 documents that
--dangerously-skip-permissionsdoes not bypass the workspace trust prompt in directories without a.gitfolder. I believe the workspace trust system is silently overridingbypassPermissionsto "Workspace" mode in non-git directories — which explains why the status bar shows bypass (config was read) but/permissionsshows Workspace (trust check downgraded it).This means any developer using a workspace-wrapper pattern (common for managing multiple worktrees or monorepo tooling) cannot use
bypassPermissionsvia settings at all.Related issues: #36454, #36219, #35718, #32466, #29026, #25503, #28506
I've also tried to make the outer workspace (-wspc) directory a git directory because that has been mentioned elsewhere.
It didn't work either.
Still experiencing this on the desktop app (macOS, Opus 4.6, March 2026).
bypassPermissionsset at user, project, and worktree levels -- all correctly formatted, all ignored. Every Bash, Edit, Write, and WebSearch call prompts. This has persisted for months across dozens of sessions.I am a non-developer business user who relies on Claude Code via the desktop app for daily email triage and project management (~30+ tool calls per morning routine). The CLI flag workaround is not viable because the desktop app has no way to pass
--dangerously-skip-permissions.This is a significant workflow blocker. Filed a detailed standalone report at #38662.
Confirmed on Windows 11 + Claude Code v2.1.86
Setup:
defaultMode: "dontAsk"with all tools listed inallow(Bash,Read,Edit,Write,Glob,Grep,Agent, etc.)denylist with destructive commands onlyResult:
Bash→ auto-approved as expectedEdit/Write→ denied, even though explicitly in allow listpermissionDecision: "allow"→ hook fires (confirmed viahookSpecificOutput) but permission denial still occursWorkaround that works:
acceptEdits+allow: ["Bash"]+denylistImpact:
dontAskmode is the most secure option for autonomous workflows since unlisted tools are auto-denied. Being forced to useacceptEditsinstead reduces security posture — there's no way to auto-deny unknown tools while also auto-approving Edit/Write.Would appreciate path-level granularity for
.claude/protection as suggested in #37516 — protectingsettings.jsonandhooks/but allowingskills/,commands/, andagents/.While
defaultMode: "bypassPermissions"is broken, you can replicate the same behavior with aPermissionRequesthook. This fires whenever a permission prompt would appear and can auto-approve it.~/.claude/settings.json:This catches every permission prompt across all tools (Bash, Edit, Write, etc.) and returns
allow. Emptymatcher= match everything.Safer alternative — auto-approve non-destructive tools only:
Known limitation: In headless/pipe mode (
claude -p), PermissionRequest hooks don't fire for protected-directory checks (#35646). Interactive mode works fine.Tested on v2.1.86.
+1000 I unfortunately have to confirm that even today (12th of April) the problem still persists.
I set the setting in the json-file for Claude Code (in the Windows Claude Desktop app) to bypassPermissions as the defaultMode.
I also added all keywords (edit, write etc.) to the allow-list and I also set in the Windows GUI the session to ("Allow dangerously skip permissions").
It's a new session and I still get asked to confirm every single edit every single time. This is pretty disruptive to my workflow, because instead of having Claude work until it's done I have to continuously monitor this window and interrupt what I am doing to click "Allow". Which basically makes it impossible for me to focus on any other task during that time that is intellectually more demanding than watching a TikTok.
It would be nice if "Allow dangerously skip permissions" would really do what it says: skip all permission request and just finish its work.
I am having the same problem (as of latest version today).
The problem seems to have gotten worse with the new update.
--------------
Edittool prompts for permission inacceptEditsandbypassPermissions/auto modes — affects both CLI and desktop app (v2.1.126)Summary
In Claude Code 2.1.126, the
Edittool fires a permission prompt even when the session is inacceptEditsor auto /bypassPermissionsmode. The bug:~/.claude/settings.jsonremoved entirely).Writetool in auto mode, despiteWritebeing in the same tool category and same modes — which scopes the bug narrowly toEdit's permission resolution path.This blocks normal day-to-day use because every file edit interrupts the workflow with a prompt that no documented mechanism (mode toggle, allowlist,
skipAutoPermissionPrompt) can suppress.Environment
/Users/<user>/.local/share/claude/versions/2.1.126)/doctoroutput: all green — auto-updates enabled, latest channel, no version-lock conflicts.The fact that the same bug reproduces in both the CLI and the desktop app rules out terminal/TTY handling, shell integration, and CLI-specific Shift-Tab parsing as causes. The bug must live in the shared permission-resolver layer that both clients use.
Steps to reproduce (clean-room — settings file removed)
mv ~/.claude/settings.json ~/.claude/settings.json.bak(no project-level settings, emptysettings.local.json).acceptEditsmode. The system reminder confirms the mode change is registered.please add a line to note.txt).Edit(...).bypassPermissionsmode. System reminder confirms "Auto Mode Active".Edit(...).Writein the same auto-mode session.Writeis correctly auto-approved.Expected behavior
acceptEditsmode is documented to auto-approveEdit,Write, andNotebookEdit.Editshould not prompt.bypassPermissions/ auto mode is documented to auto-approve all non-destructive tools.Editshould not prompt.Actual behavior
Editprompts inacceptEditsmode.Editprompts in auto /bypassPermissionsmode.Writedoes not prompt in auto mode (working as expected).Readprompts inacceptEditsmode (this is expected —acceptEditsis for edit tools only — but mentioning for completeness).Readdoes not prompt in auto mode (working as expected).Earlier (non-clean-room) findings
Before stripping the config, the user's
~/.claude/settings.jsoncontained:"Read"to the allowlist correctly silencedReadprompts in all modes."Write"and"Edit"to the allowlist (tested previously) did not silenceEditprompts.skipAutoPermissionPrompt: truehad no effect onEditprompts.So three independent suppression mechanisms (allowlist, mode,
skipAutoPermissionPrompt) all fail forEditspecifically.Plugin / hook audit
Confirmed no installed plugin registers a
PreToolUsehook. The two plugins withhooks/hooks.jsonfiles (vercel,explanatory-output-style) only registerSessionStart/SessionEndhooks. So plugin interception is ruled out.The clean-room reproduction further rules out plugins entirely, since the test session ran with no
enabledPluginsconfig.Hypothesis for maintainers
Because
EditandWritediffer in behavior despite being in the same tool category and the same modes:Edit("you're about to modify existing content") that is not properly gated onacceptEdits/bypassPermissionsmode.Editpattern even when literally"Edit"is configured, while it does match"Read"and"Write".Both hypotheses predict the observed asymmetry between
EditandWrite.Impact
Daily use is significantly degraded. Every routine file edit interrupts the workflow with a prompt that no documented in-product mechanism can suppress. The user has confirmed that all four of the following bypass mechanisms fail to suppress
Editprompts in v2.1.126:"Edit"explicitly in~/.claude/settings.json— no effect.acceptEditsmode (Shift-Tab toggle) — no effect.bypassPermissionsmode (Shift-Tab toggle) — no effect."skipAutoPermissionPrompt": truesetting — no effect.The only mechanism that does currently suppress
Editprompts is launching with the--dangerously-skip-permissionsCLI flag. This is not a viable day-to-day workaround because it disables all permission resolution globally and is documented as unsafe.Cross-version progression (potentially useful for maintainers)
The
--dangerously-skip-permissionsbehavior changed across versions:--dangerously-skip-permissionsdid not suppressEditprompts.--dangerously-skip-permissionsdoes suppressEditprompts.So progress was made between these two releases on at least one bypass path. However, the four documented (non-
--dangerously-) mechanisms above still don't work forEdit. This suggests the fix between 2.1.123 → 2.1.126 patched the--dangerously-skip-permissionsflag's path specifically, but the corresponding fix foracceptEdits,bypassPermissions, allowlist matching, andskipAutoPermissionPromptwas not made. A grep for whatever change unblocked the--dangerously-path may point directly at where the analogous fix needs to go for the other paths.Repro environment available
Happy to provide:
~/.claude/settings.json/doctoroutputIt would indeed be nice if expected behavior and actual behavior would actually match.
Now the names of the options do promise more than they can keep. And no matter the setting, you have to sit next to your Claude Code window and permanently keep an eye on it, because you never know, it might suddenly stop all operation and ask you a silly question like "May I edit the file you asked me to amend?"
If you don't, you most likely will return to a Claude window that has stopped in the middle of the action and then you have to approve and wait again until it's either finished or nagging you with the next question.
I have backups of everything before I let any AI get its virtual hands on it. Why I should approve every single operation on the data it is supposed to work with, makes no sense to me. And let's be honest: if Claude Code asks you for approval 10 times in 30 seconds, do you really read every single prompt, pause for a moment to consider the ramifications? And have you ever clicked on "no"? I don't even know what happens then. Does Claude Code then stop working or does it suggest a work around if you brutally stop it halfway in its tracks?
Closing for now — inactive for too long. Please open a new issue if this is still relevant.