Permission engine misparses file paths containing colons
Summary
The permission engine appears to treat : in file paths as a special separator, causing permission checks to fail even when the path is covered by explicit allow rules. This makes "Allow for this session" ineffective and forces repeated permission prompts.
Environment
- Claude Code version: 2.1.84
- Platform: macOS (Darwin 21.6.0)
- File paths are on Dropbox (valid macOS paths containing colons in folder names)
Reproduction
- Have a file path containing a colon, e.g.:
````
.tmp/YTV-21-Unlock Your Creativity: Transform One Rhythm into Endless Guitar Parts/article-browser-part2.txt
- Configure explicit allow rules in project
settings.json:
``json`
"Write(.tmp/**)"
settings.local.json
And/or blanket allows in :`
json``
"Write",
"Edit"
- Attempt to Read or Write the file — Claude Code prompts for permission despite the allow rules.
- Click "Yes, during this session" — the next operation on the same file prompts again.
Expected behavior
- Paths matching
Write(.tmp/**)should be allowed without prompting, regardless of:in the path. - Blanket
"Write"/"Edit"allows (no path pattern) should allow all paths. - "Yes, during this session" should persist for at least the exact same file path.
Actual behavior
- Every Read/Write/Edit on paths containing
:triggers a permission prompt. - Session-level allows do not persist, even for the identical file.
- Restarting the session does not help (same files, same colons).
Evidence it is the colon
Two concurrent top-level instances (same version, same project, same settings files):
- Instance A processed a folder without a colon (
YTV-22- The Big Picture of Rhythm — Why These Ideas Apply to Any Style) — all permissions worked correctly, no prompts. - Instance B processed a folder with a colon (
YTV-21-Unlock Your Creativity: Transform One Rhythm into Endless Guitar Parts) — prompted repeatedly for every file operation, session allows did not stick.
Notes
Colons are valid in macOS file paths and common in video titles. The permission pattern syntax uses : as a separator in Bash rules (e.g., Bash(sqlite3:*)), which may be the source of the conflict — the engine may be applying the same parsing to file path arguments in Read/Write/Edit calls.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗