ci(scan): deterministic static pin check for auto-exec MCP launchers (#2361) Statically classify every MCP server declared in a scanned entry's .mcp.json (and plugin.json mcpServers): a package-manager launcher (npx/bunx/uvx/pipx) with a floating spec — @latest/dist-tag, a version range, or a bare unversioned name that isn't locally vendored — executes registry-resolved code at session start, which the entry's pinned source SHA does not fix. - lib/pin-check.sh: pure classifier (rows/vendored-refine/waivers), jq @tsv rows so hostile server names can't forge or split rows - scripts/static-pin-check.sh: always-on, auth-free step — detection always annotates; hard-fail only behind the new fail-on-unpinned-autoexec input (per-consumer severity) - launch-shape-waivers input: package-grained repo-local exception file; every floating spec must match an adjudicated prefix - scan.sh joins unpinned_autoexec_{runtime,specs} into scanned[] (action-emitted, never model-produced) + summary column; new pin-scanned/pin-failed outputs; result falls back to the pin gate's verdict when the AI review is skipped - lib/targets.sh: target resolution factored out of scan.sh so both steps resolve the identical set - test-pin-check.sh: 59 golden vectors, wired into validate-plugins.yml Inert for existing consumers until they repin and opt in. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>