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

  1. Add a permission rule to .claude/settings.local.json:

``json
{
"permissions": {
"allow": [
"Bash(rm:*)"
],
"deny": []
}
}
``

  1. Start a new Claude Code session in the project
  1. Run /permissions — the rule Bash(rm:*) appears in the Allow list (e.g., as item 6)
  1. Ask Claude to run rm test.txt
  1. Expected: Command runs without prompting (since it's in the Allow list)
  1. Actual: Claude Code prompts with "Do you want to proceed?" dialog:

```
Do you want to proceed?
> 1. Yes

  1. Yes, and always allow access to <project>/ from this project
  2. 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 /permissions does 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 |

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗