Edit and Write allow rules in ~/.claude/settings.json are ignored on Windows; Bash allow rules work
Summary
On Windows 11, permissions.allow entries for the Edit and Write tools in ~/.claude/settings.json do not silence permission prompts, even when the rule is bare (no path glob). The same settings file's Bash(...) allow rules and mcp__* allow rules DO work, so the file is being read and parsed. The bug appears to be tool-class-specific to Edit and Write.
Environment
- OS: Windows 11 Pro 10.0.26200
- Claude Code: desktop app (current as of 2026-05-02)
- Shell: Git Bash
- Path under test: a directory junction (NTFS reparse point) created with
mklink /J, pointing into a Google Drive Desktop mount. Same behaviour reproduces on a plain non-junction directory underC:\Users\...(see test 5 below).
Repro (minimal)
~/.claude/settings.json:
{
"permissions": {
"allow": ["Edit", "Write"]
}
}
- Fully quit Claude Code (close the desktop app, not just new chat).
- Reopen.
- Make any Edit (e.g. one-line change to any file).
- Permission prompt fires.
Expected: Edit auto-approved by the bare Edit allow rule.
Actual: Permission prompt fires every time.
Forms tested and failed
Each tested after a full Claude Code restart, with a one-line edit to a file under the listed path. Prompt fired in every case.
| # | Allow rule | Result |
|---|---|---|
| 1 | Edit(C:\Users\mkauf\.claude\ceramics\**) (Windows backslash) | prompt |
| 2 | Edit(C:/Users/mkauf/.claude/ceramics/**) (Windows forward slash) | prompt |
| 3 | Edit(/c/Users/mkauf/.claude/ceramics/**) (single-slash POSIX) | prompt |
| 4 | Edit(//c/Users/mkauf/.claude/ceramics/**) (double-slash POSIX absolute) | prompt |
| 5 | Edit (bare; no path bound) | prompt |
| 6 | Edit(~/.claude/ceramics/**) + Edit(//g/My Drive/Claude/ceramics/**) paired (link path + symlink target per docs) | prompt |
Counter-example: Bash allow rules in the SAME settings file work
~/.claude/settings.json and project .claude/settings.local.json contain dozens of Bash(/c/...) and mcp__* allow entries that all silence prompts correctly. So the settings file IS being read, parsed, and the matcher works for Bash and MCP. It just doesn't fire for Edit/Write.
Shadowing ruled out
- No
permissions.denyblock anywhere (user or project). - No
permissions.askblock anywhere (user or project). - Project
.claude/settings.jsonhas onlymcp__Claude_Preview__*allow entries plus hooks. - Project
.claude/settings.local.jsonhas onlyBashandWebFetchallow entries.
Note: /permissions slash command does not exist in this build
Running /permissions returns "no such command", so I cannot paste the loaded-rules output that the docs reference. If there is an alternative way to dump the effective permissions table, please point me at it and I'll attach.
What I tried
Across four back-to-back sessions, with full Claude Code restarts between each:
- Windows-format paths (forward + back slash) -- prompt.
- POSIX-format paths (single + double leading slash) -- prompt.
- Bare
Edit/Write(no path) -- prompt. - Tilde + symlink-target paired (per docs that say symlink rules should match both link AND resolved target) -- prompt.
The docs-blessed forms not silencing prompts is what triggered this report.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗