Bash permissions in settings.local.json not enforced at runtime
Resolved 💬 3 comments Opened Mar 10, 2026 by abhiunix Closed Mar 10, 2026
Bug Description
Bash permission rules defined in .claude/settings.local.json are displayed in the /permissions Allow list but are not enforced at runtime — Claude Code still prompts for confirmation.
Steps to Reproduce
- Add a permission rule to
.claude/settings.local.json:
``json``
{
"permissions": {
"allow": [
"Bash(rm:*)"
],
"deny": []
}
}
- Start a new Claude Code session in the project
- Run
/permissions— the ruleBash(rm:*)appears in the Allow list (e.g., as item 6)
- Ask Claude to run
rm test.txt
- Expected: Command runs without prompting (since it's in the Allow list)
- Actual: Claude Code prompts with "Do you want to proceed?" dialog:
```
Do you want to proceed?
> 1. Yes
- Yes, and always allow access to <project>/ from this project
- No
```
Additional Details
- Selecting option 2 ("Yes, and always allow") allows it for the current session only — no new rule is written to any settings file.
- The same permission rules work correctly when placed in
.claude/settings.json(project shared) or~/.claude/settings.json(global). - This suggests the runtime permission checker does not read from
settings.local.json, even though/permissionsdoes display rules from it. - Other permission types in
settings.local.json(e.g.,Bash(tail:*),Bash(npx tsc:*)) also appear to have the same issue.
Environment
- OS: macOS (Darwin 25.3.0)
- Claude Code: Latest version
- Shell: zsh
Files involved
| File | Role |
|------|------|
| ~/.claude/settings.json | Global settings — permissions ARE enforced |
| .claude/settings.json | Project shared settings — permissions ARE enforced |
| .claude/settings.local.json | Project local settings — permissions shown in /permissions but NOT enforced |
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗