Problem
plugins/claude-config/skills/audit/reference/required-permissions.md recommends a
sensitive-file-deny baseline — Read(./.env), Read(./secrets/**),
Read(./.claude/settings.local.json), key/PEM/SSH patterns — as the remedy for protecting secrets,
with no statement of what a Read deny actually reaches. A reader who follows it comes away
believing the file is protected.
Reported from a consuming project after an agent, blocked on Read, read the same file through a
python -c one-liner in the shell tool with no deny firing. Both observations were routine
fallbacks after a denied Read, not adversarial bypass attempts — which is what makes the
false confidence expensive.
What the current docs actually say
Verified this session against
https://code.claude.com/docs/en/permissions#read-and-edit,
https://code.claude.com/docs/en/sandboxing, and
https://code.claude.com/docs/en/tools-reference#powershell-tool:
- Partly refuted. A
Read(...) deny is not simply a separate namespace from the shell tool. It
applies to "file commands Claude Code recognizes in Bash, such as cat, head, tail, and
sed", plus Read/Grep/Glob/LSP, @file mentions, IDE selection context, and Edit on the same path.
- Confirmed. The rules "don't apply to arbitrary subprocesses that read or write files
indirectly, like a Python or Node script that opens files itself." That is the real gap and it
matches the reported observation exactly.
- The suggested fix in the report is itself the defect. Enumerating shell readers as
Bash(...)
deny globs is documented as fragile ("Bash permission patterns that try to constrain command
arguments are fragile"), and a PreToolUse hook inspecting the same command string inherits the
same evasion surface. Neither is a boundary.
- The documented enforcement path is the sandbox (
sandbox.filesystem.denyRead,
sandbox.credentials.files with "mode": "deny") — OS-level over every Bash command and its
children. It does not run on native Windows, so it is unavailable in exactly the environment that
produced the observation.
Scope
Only required-permissions.md states this recommendation; no other plugin or docs/** page does.
No plugin in this marketplace contributes permissions.* entries. guardrails'
secret-pattern-detection.sh matches Write|Edit|NotebookEdit (blocks writing secrets); its
Bash|PowerShell hooks are git/commit-scoped. Whether guardrails should grow a credential-read
matcher is a separate product call and is not proposed here.
Fix
Add a "Scope of a Read deny" subsection stating covered vs not-covered, ranking the remedies
honestly, carrying the platform limit, and flagging what upstream does not state (PowerShell-tool
read coverage; the full recognized-command set). Leave the pattern table itself unchanged — it is
the Category B presence check.
Problem
plugins/claude-config/skills/audit/reference/required-permissions.mdrecommends asensitive-file-denybaseline —Read(./.env),Read(./secrets/**),Read(./.claude/settings.local.json), key/PEM/SSH patterns — as the remedy for protecting secrets,with no statement of what a
Readdeny actually reaches. A reader who follows it comes awaybelieving the file is protected.
Reported from a consuming project after an agent, blocked on
Read, read the same file through apython -cone-liner in the shell tool with no deny firing. Both observations were routinefallbacks after a denied
Read, not adversarial bypass attempts — which is what makes thefalse confidence expensive.
What the current docs actually say
Verified this session against
https://code.claude.com/docs/en/permissions#read-and-edit,
https://code.claude.com/docs/en/sandboxing, and
https://code.claude.com/docs/en/tools-reference#powershell-tool:
Read(...)deny is not simply a separate namespace from the shell tool. Itapplies to "file commands Claude Code recognizes in Bash, such as
cat,head,tail, andsed", plus Read/Grep/Glob/LSP,@filementions, IDE selection context, and Edit on the same path.indirectly, like a Python or Node script that opens files itself." That is the real gap and it
matches the reported observation exactly.
Bash(...)deny globs is documented as fragile ("Bash permission patterns that try to constrain command
arguments are fragile"), and a
PreToolUsehook inspecting the same command string inherits thesame evasion surface. Neither is a boundary.
sandbox.filesystem.denyRead,sandbox.credentials.fileswith"mode": "deny") — OS-level over every Bash command and itschildren. It does not run on native Windows, so it is unavailable in exactly the environment that
produced the observation.
Scope
Only
required-permissions.mdstates this recommendation; no other plugin ordocs/**page does.No plugin in this marketplace contributes
permissions.*entries.guardrails'secret-pattern-detection.shmatchesWrite|Edit|NotebookEdit(blocks writing secrets); itsBash|PowerShellhooks are git/commit-scoped. Whetherguardrailsshould grow a credential-readmatcher is a separate product call and is not proposed here.
Fix
Add a "Scope of a Read deny" subsection stating covered vs not-covered, ranking the remedies
honestly, carrying the platform limit, and flagging what upstream does not state (PowerShell-tool
read coverage; the full recognized-command set). Leave the pattern table itself unchanged — it is
the Category B presence check.