"Always allow" permission not persisted when ~/.claude is a symlinked directory

Resolved 💬 3 comments Opened Feb 22, 2026 by k2m30 Closed Feb 22, 2026

"Always allow" permission not persisted when ~/.claude is a symlinked directory

Related: #3575 (symlinked settings.json — closed as fixed)

Environment

  • Claude Code: 2.1.50
  • OS: macOS Darwin 25.3.0
  • Shell: zsh
  • Setup: ~/.claude -> ~/dotfiles/.claude (entire directory is a symlink to a dotfiles repo)

Bug Description

Bash commands that redirect output to /tmp/ trigger a permission dialog with the option "Yes, and always allow access to tmp/ from this project". Selecting this option has no effect — the same dialog reappears on the very next matching command within the same session, on resumed sessions (claude --resume), and on new sessions.

No settings file is created anywhere after clicking "always allow".

Steps to Reproduce

  1. Symlink the ~/.claude directory to a dotfiles repo:

``bash
ln -s ~/dotfiles/.claude ~/.claude
``

  1. Configure ~/.claude/settings.json with bash permissions:

``json
{
"permissions": {
"allow": [
"Bash(kubectl get *)",
"Bash(kubectl describe *)",
"Read(//tmp/**)"
]
}
}
``

  1. Have Claude run a bash command that writes to /tmp/:

``bash
kubectl get pods -o wide > /tmp/pods.txt
``

  1. Permission dialog appears:

```
Do you want to proceed?

  1. Yes
  2. Yes, and always allow access to tmp/ from this project
  3. No

```

  1. Select option 2
  1. Have Claude run another bash command with > /tmp/ redirect:

``bash
kubectl get nodes -o wide > /tmp/nodes.txt
``

  1. Same dialog appears immediately. Makes no difference whether it is the same session, a resumed session (claude --resume), or a new session.

Expected Behavior

After selecting "always allow", the permission persists and the dialog does not reappear.

Actual Behavior

  • Permission is not persisted — dialog reappears every time
  • No settings.json or settings.local.json files are created in any project directory under ~/.claude/projects/ (verified: glob across all project directories returns zero results)
  • No .claude/ directory is created at the project root
  • No error or warning indicates the persistence failed

Workaround

Adding Edit(//tmp/**) to the global ~/.claude/settings.json allow list resolves the prompt. Note: // prefix is required for absolute paths per gitignore spec.

Test Results

| Check | Result |
|---|---|
| ~/.claude symlink resolves correctly | Yes — settings.json loads, permissions work |
| settings*.json in ~/.claude/projects/*/ after "always allow" | None found |
| .claude/settings.local.json in project root after "always allow" | Not created |

View original on GitHub ↗

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