fix(scanner): reject duplicate invocation identities without namespace false positives - #1157
seonghobae wants to merge 9 commits into
Conversation
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Stacked successor: Draft #1158 ( Unique delta is |
Summary: - Snapshot 18:16 UTC records Draft #1158 `8c9f2d6` stacked on #1157. - Named env secrets copied into prompts, logs, or child env fail closed. - Curl/wget stays the secret-to-network class. Rationale: - #999 is the single writer of the product-technical gap baseline. - #1099 remaining surfaces stay on stacked successors, not Close. Tests: - documentation-only; detector evidence lives on #1158 (1878/1878)
Namespace FP repair — exact head
|
|
Current-head follow-up after the concurrent RED refinement Exact lineage:
Root cause refined from the current official Claude Code plugin contract: RED on the exact predecessor production blob plus exact concurrent test blob: 2 failed / 13 passed:
Minimal GREEN derives command identity from Fresh bounded verification with the exact remote blobs above: 15 passed in 0.10s; Primary contract: https://code.claude.com/docs/en/plugins (retrieved 2026-09-12). |
Command-identity semantics correction — exact RED
|
Nested legacy-command identity RED — exact head
|
|
Current exact GREEN for the nested legacy-Command boundary
Exact RED checkout produced 1 failed / 15 passed: The minimal repair derives the full path relative to root Fresh exact source/test verification: 16 passed in 0.18s; Primary contract: https://code.claude.com/docs/en/plugins and https://code.claude.com/docs/en/skills (retrieved 2026-09-12). |
|
Fresh exact-tree regression expansion: remote head |
Current repair boundary — 2026-09-12
feat/claude-plugin-vendored-scope-1099@12f968c76da6569dd281efdb91b0677fb2e1a754ba1e146c759e3c6dedd5ea14fe651e0733320697c76586500501f96b67f60f1b903a61302028037f62d91cd…and current feat(scanner): flag ambiguous vendored plugin code scope #1156 head12f968c…; no force updatePYTHONPATH=. python -m pytest -q tests/test_claude_plugin*.py→ 221 passed;py_compileandgit diff --checkpassedSuccessor of #1156 / issue #1099. Keep Draft. This lane owns identity-collision admission only; #1156 retains vendored/generated scope and #1155 retains non-NFC identity handling.
Authoritative identity model
Current Claude Code documentation makes three boundaries relevant here:
plugin.json.nameis the plugin namespace;commands/both expose Skill/slash-command invocation surfaces;commands/; command Markdown does not support frontmattername. Nested directories are part of the command name (for examplecommands/frontend/component.md→frontend:component).agents/remain a separate surface.Primary sources:
This is an interoperability/admission precision boundary, not a demonstrated RCE vulnerability.
TDD lineage
d4d5df567963cd9d11f43c37e436263d07471bf7added the first realistic RED:ship+commands/ship.mdmust collide;commands/one.mdandcommands/two.mdmust stay distinct even if both contain unsupportedname: shipfrontmatter;Intervening ordinary descendant
1b761e04f81f6b28eb9e541ce14802af6b5cc158correctly adopted that finding: it stopped reading Command frontmatter names and put legacy Commands into the same localskillcollision set. That delta is retained.Exact test-only head
4207f11b2bab1d6e1ea9357b263a483e34af3043adds the remaining nested-path RED. Production used onlypath.stem, socommands/frontend/deploy.mdandcommands/backend/deploy.mdboth collapsed todeploy. Exact GREEN head62d91cdc096f2a8174ad97ca41042bf11052a132derives the entire path relative tocommands/, removes.md, and joins every segment with:. It is one normal commit ahead / zero behind the RED and changes only five production lines.Fresh exact-tree focused verification is 16/16 passed,
py_compilepassed, andgit diff --checkis clean. This local checkout is exact for the named source/test blobs, but it is not the full repository/coverage/hosted suite. This custom-base stack currently has no PR workflow check-runs; no hosted GREEN or release is claimed.Minimal GREEN acceptance
namewhere supported, otherwise documented directory/root fallback.commands/,.mdsuffix removed, with every directory segment preserved using Claude's documented:separator; unsupported Command frontmatternamedoes not redefine identity.Stack state
#1158 was ordinary-restacked through two-parent merge
29d4214c3d634ac7e5af271d503d39b4c7525691. It is now three ahead / zero behind this exact parent, mergeable, and preserves its seven-file secret-to-prompt delta plus every current #1157 source/test change. Combined focused identity and secret-flow verification is 34/34 passed withpy_compileand diff checks clean. Both PRs remain Draft pending hosted exact-head gates and independent review. No destructive rebase or force push.No self-approval, gate weakening, scanner suppression, source-neutral retrigger, or predecessor evidence transfer.