macOS: Full Disk Access revoked on every Homebrew update — binary needs FDA entitlement
Summary
Every time Claude Code updates via brew upgrade, macOS revokes Full Disk Access (FDA) because the binary's code signature changes. This breaks access to external drives until the user manually toggles FDA off/on in System Settings → Privacy & Security.
This is a recurring regression that should be fixed at the binary level, not worked around by users.
Environment
- macOS Sequoia 15.x (Darwin 25.4.0)
- Claude Code installed via Homebrew
- Binary:
/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/bin/claude.exe - Bundle ID:
com.anthropic.claude-code
Reproduction Steps
- Grant Full Disk Access to Claude Code in System Settings
- Run
brew upgrade claude-code - Try to access an external drive from any Claude Code bash subprocess
- Result:
Operation not permittedon all external volumes
Root Cause
macOS TCC stores a code signature requirement alongside each FDA grant. When the binary is updated, the stored requirement no longer matches the new binary's signature — so auth_value=2 (allowed) exists in the TCC database but is rejected at runtime.
Confirmed via:
sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" \
"SELECT client, auth_value FROM access WHERE service='kTCCServiceSystemPolicyAllFiles'; "
# Shows auth_value=2 for claude.exe — but access still denied
ls /Volumes/<any-external-drive>/
# Operation not permitted
This affects ALL external drives, not just specific volumes.
Expected Behavior
FDA should survive binary updates. The fix is to declare com.apple.security.files.all as a hardened runtime entitlement in the binary. This pins FDA to the team identity + bundle ID rather than the per-build code directory hash, so it survives updates without user intervention.
Current Workaround
After every brew upgrade claude-code, user must manually:
System Settings → Privacy & Security → Full Disk Access → toggle Claude off → toggle back on
This is unacceptable as a permanent workaround for a development tool that updates frequently.
Impact
External drives are inaccessible to Claude Code bash subprocesses after every update. For users with models, datasets, or project files on external storage, this silently breaks overnight automation runs with no clear error message pointing to the cause.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗