Edit and Write allow rules in ~/.claude/settings.json are ignored on Windows; Bash allow rules work

Resolved 💬 3 comments Opened May 2, 2026 by matthewjkaufman Closed May 6, 2026

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 under C:\Users\... (see test 5 below).

Repro (minimal)

~/.claude/settings.json:

{
  "permissions": {
    "allow": ["Edit", "Write"]
  }
}
  1. Fully quit Claude Code (close the desktop app, not just new chat).
  2. Reopen.
  3. Make any Edit (e.g. one-line change to any file).
  4. 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.deny block anywhere (user or project).
  • No permissions.ask block anywhere (user or project).
  • Project .claude/settings.json has only mcp__Claude_Preview__* allow entries plus hooks.
  • Project .claude/settings.local.json has only Bash and WebFetch allow 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:

  1. Windows-format paths (forward + back slash) -- prompt.
  2. POSIX-format paths (single + double leading slash) -- prompt.
  3. Bare Edit / Write (no path) -- prompt.
  4. 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.

View original on GitHub ↗

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