Repinning claude-code-plugins from c2654182 to v0.19.0 (85e140fa2fe9ebe96c41156055e7676de208090a) turned the machine-specific-paths lane red with 40 hits across 22 files and all five detection classes. On inspection, none of them is a machine-specific path that a contributor accidentally committed. Every one is prose describing the path form, or a test fixture whose assertion subject is the path.
Observed on melodic-software/claude-code-plugins run 33808374809, where all five classes fired at once.
What the patterns are matching
machine-path-patterns.sh's own header states the design intent this contradicts:
Excluding whitespace from the class is what makes dropping the separator prose-safe: a phrase like /Users/ for details cannot match because at least one non-space child character must follow the root.
That reasoning holds only for a root followed by a space. It does not hold for the shape prose actually uses, which is a root followed by a concrete example segment, /Users/alice, C:/Users/..., D:\repos\..., inside a sentence explaining what the code parses. The child-segment class admits ., so even the ellipsis form C:/Users/... matches. Fixtures are not addressed by the header at all.
The 40 hits, grouped by class
Windows user path
plugins/ai-slop/skills/audit/scripts/detect.sh:474
plugins/claude-ops/skills/plugins/scripts/fleet-state.sh:558
plugins/machine-health/skills/audit/tests/windows/lib/ConvertFrom-Jsonc.Tests.ps1:84
plugins/machine-health/skills/audit/tests/windows/lib/ConvertFrom-Jsonc.Tests.ps1:86
plugins/source-control/skills/pull-request/scripts/fetch-annotations.test.sh:21
plugins/source-control/skills/pull-request/scripts/fetch-failed-logs.test.sh:21
macOS user path
plugins/claude-config/CHANGELOG.md:1202
plugins/disk-hygiene/skills/clean/scripts/<the module under test>:1159
plugins/disk-hygiene/skills/clean/scripts/test_<same module>:2358
plugins/guardrails/CHANGELOG.md:3643
Linux user path
plugins/disk-hygiene/skills/clean/evals/evals.json:19
plugins/disk-hygiene/skills/clean/scripts/test_<same module>:2372
plugins/disk-hygiene/skills/clean/scripts/test_<same module>:2375
Windows repo path
plugins/claude-config/CHANGELOG.md:1508
plugins/claude-config/lib/state-key.test.sh:121
plugins/claude-ops/skills/plugins/context/gotchas.md:37
plugins/disk-hygiene/skills/clean/scripts/test_guard_launch_monitor.py:81
plugins/guardrails/CHANGELOG.md:3944
plugins/guardrails/CHANGELOG.md:3968
plugins/guardrails/CHANGELOG.md:3969
plugins/knowledge/skills/video-digest/extraction/lib/run-args.test.js:149
plugins/knowledge/skills/video-digest/extraction/lib/run-args.test.js:150
plugins/markdown-format/hooks/markdown-format.sh:209
plugins/repo-fleet-hygiene/skills/audit/scripts/audit-fleet.sh:1867
plugins/repo-hygiene/CHANGELOG.md:521
plugins/repo-hygiene/skills/clean/context/clean-batch.md:65
plugins/repo-hygiene/skills/clean/context/clean-batch.md:66
plugins/repo-hygiene/skills/clean/scripts/git-tree-reset-batch.test.sh:92
plugins/repo-hygiene/skills/clean/scripts/lib/batch-common.sh:17
plugins/repo-hygiene/skills/clean/scripts/lib/batch-common.sh:18
plugins/session-flow/skills/retro/scripts/test_parse_transcript.py:183
plugins/session-flow/skills/retro/scripts/test_parse_transcript.py:197
plugins/source-control/scripts/landed-work.sh:106
Escaped Windows repo path
plugins/disk-hygiene/skills/clean/scripts/test_guard_launch_monitor.py:81
plugins/knowledge/skills/video-digest/extraction/lib/run-args.test.js:149
plugins/knowledge/skills/video-digest/extraction/lib/run-args.test.js:150
plugins/session-flow/skills/retro/scripts/test_parse_transcript.py:183
plugins/session-flow/skills/retro/scripts/test_parse_transcript.py:197
Two disk-hygiene paths above are written with placeholders because quoting them verbatim trips that plugin's own guardrail hook.
Three categories that cannot be reworded
Published CHANGELOG history. Four hits are in CHANGELOG.md files, across three plugins. These are released entries. Rewording them edits history that already shipped to consumers, and several of them are describing a previous fix to this very detector: guardrails/CHANGELOG.md:3968 documents that the drive-letter-anchored pattern used to match only X:\repos\…, and it necessarily quotes the forms it then began catching.
Fixtures whose assertion subject is the path. Path("/Users/alice") in a case-folding test; "C:\\Projects\\..." in a cwd-parsing fixture; D:\\repos\\knowledge-corpus in an environment-variable expansion test; a Pester case asserting a JSONC reader preserves an escaped path. Changing the literal changes what the test proves, so the remedy is not available at any price.
Prose naming the form the surrounding code parses. A comment saying git answers C:/Users/... on Git Bash, sitting directly above the code that handles that answer. Replacing the example with a placeholder makes the comment describe nothing.
What we did downstream, and what we would like
We held machine-specific-paths alone at c2654182 while every other reference in that workflow moved to v0.19.0, tracked in melodic-software/claude-code-plugins#3699. That leaves a deliberate second SHA in a file we had just unified, which we would rather not keep.
No fix design proposed beyond the shape of the need: placeholder forms and fixture contexts need to be recognised, or opt-out-able per phrase rather than per file. A file-level exclude is the only lever the action offers today, and excluding twenty-two files to silence forty phrases removes ten plugins from the scan entirely, which costs more than the finding is worth.
Repinning
claude-code-pluginsfromc2654182tov0.19.0(85e140fa2fe9ebe96c41156055e7676de208090a) turned themachine-specific-pathslane red with 40 hits across 22 files and all five detection classes. On inspection, none of them is a machine-specific path that a contributor accidentally committed. Every one is prose describing the path form, or a test fixture whose assertion subject is the path.Observed on
melodic-software/claude-code-pluginsrun 33808374809, where all five classes fired at once.What the patterns are matching
machine-path-patterns.sh's own header states the design intent this contradicts:That reasoning holds only for a root followed by a space. It does not hold for the shape prose actually uses, which is a root followed by a concrete example segment,
/Users/alice,C:/Users/...,D:\repos\..., inside a sentence explaining what the code parses. The child-segment class admits., so even the ellipsis formC:/Users/...matches. Fixtures are not addressed by the header at all.The 40 hits, grouped by class
Windows user path
macOS user path
Linux user path
Windows repo path
Escaped Windows repo path
Two
disk-hygienepaths above are written with placeholders because quoting them verbatim trips that plugin's own guardrail hook.Three categories that cannot be reworded
Published CHANGELOG history. Four hits are in
CHANGELOG.mdfiles, across three plugins. These are released entries. Rewording them edits history that already shipped to consumers, and several of them are describing a previous fix to this very detector:guardrails/CHANGELOG.md:3968documents that the drive-letter-anchored pattern used to match onlyX:\repos\…, and it necessarily quotes the forms it then began catching.Fixtures whose assertion subject is the path.
Path("/Users/alice")in a case-folding test;"C:\\Projects\\..."in a cwd-parsing fixture;D:\\repos\\knowledge-corpusin an environment-variable expansion test; a Pester case asserting a JSONC reader preserves an escaped path. Changing the literal changes what the test proves, so the remedy is not available at any price.Prose naming the form the surrounding code parses. A comment saying git answers
C:/Users/...on Git Bash, sitting directly above the code that handles that answer. Replacing the example with a placeholder makes the comment describe nothing.What we did downstream, and what we would like
We held
machine-specific-pathsalone atc2654182while every other reference in that workflow moved tov0.19.0, tracked inmelodic-software/claude-code-plugins#3699. That leaves a deliberate second SHA in a file we had just unified, which we would rather not keep.No fix design proposed beyond the shape of the need: placeholder forms and fixture contexts need to be recognised, or opt-out-able per phrase rather than per file. A file-level
excludeis the only lever the action offers today, and excluding twenty-two files to silence forty phrases removes ten plugins from the scan entirely, which costs more than the finding is worth.