Absolute paths converted to tilde paths, breaking permission matching

Resolved 💬 3 comments Opened Jan 8, 2026 by jwhartley Closed Jan 8, 2026

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

  1. Configure ~/.claude/settings.json with absolute path permissions:
{
  "permissions": {
    "allow": [
      "Read(/Users/james/**)",
      "Write(/Users/james/github/**)",
      "Edit(/Users/james/github/**)"
    ]
  }
}
  1. In a Claude Code session, Claude makes a tool call like:
Read(file_path="/Users/james/github/solutions-projects/CLAUDE.md")
  1. The UI displays the call as:
⏺ Read(~/github/solutions-projects/CLAUDE.md)
  1. 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 match Read(/Users/james/**) permission

Actual Behavior

  • Paths appear to be normalized to tilde form (~/...)
  • ~/github/file.md does not match Read(/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.

View original on GitHub ↗

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