Skip to content

machine-specific-paths at v0.19.0: five classes fire on prose, published changelog history, and fixtures whose assertion subject is the path #549

Description

@kyle-sexton

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.priority: mediumReal value, no hard deadline; normal backlog flow.status: needs-decisionAwaiting a human or maintainer judgment call.work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions