Absolute paths converted to tilde paths, breaking permission matching
Description
When making Read/Write/Edit tool calls with absolute paths (e.g., /Users/james/github/...), Claude Code appears to convert them to tilde paths (~/github/...) somewhere in the pipeline. This breaks permission matching when permissions are defined with absolute paths.
Steps to Reproduce
- Configure
~/.claude/settings.jsonwith absolute path permissions:
{
"permissions": {
"allow": [
"Read(/Users/james/**)",
"Write(/Users/james/github/**)",
"Edit(/Users/james/github/**)"
]
}
}
- In a Claude Code session, Claude makes a tool call like:
Read(file_path="/Users/james/github/solutions-projects/CLAUDE.md")
- The UI displays the call as:
⏺ Read(~/github/solutions-projects/CLAUDE.md)
- Permission prompt appears even though the absolute path should match
Read(/Users/james/**)
Expected Behavior
- Absolute paths in tool calls should remain absolute for permission matching
Read(/Users/james/github/file.md)should matchRead(/Users/james/**)permission
Actual Behavior
- Paths appear to be normalized to tilde form (
~/...) ~/github/file.mddoes not matchRead(/Users/james/**)pattern- Permission prompts appear despite having appropriate permissions configured
Environment
- Claude Code version: 2.1.1
- OS: macOS (Darwin 24.6.0)
- Shell: zsh
Related Issues
- #15421 - Global permission rules not matching paths
- #13340 - settings.json allow permissions not respected
- #15894 - Permission matching fails for relative paths
Workaround
Currently none known. Adding both tilde and absolute path versions to permissions doesn't help if the conversion happens after the tool call is made but before permission checking.
Additional Context
This issue manifests alongside the "allow reading from X from this project" prompts, which appear to be a separate project-scoped permission layer. The combination of tilde conversion and project-scoped permissions makes it very difficult to configure Claude Code for autonomous operation without permission prompts.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗