Skip to content

pin gate: root manifest.json version is unguarded — it drifted two releases behind while every check stayed green #172

Closed

Description

@cdeust

Found while cutting v0.8.3 for #158.

Evidence (measured 2026-07-28)

  • manifest.json read "version": "0.8.0" while Cargo.toml, server.json, .claude-plugin/plugin.json and .claude-plugin/marketplace.json all read 0.8.2 — two releases of drift.
  • python3 scripts/check_marketplace_pins.py exited 0 (All marketplace pins current.) against that tree. The gate has a SERVER_JSON_SPLIT class for precisely this failure, but check_server_json() inspects server.json only; nothing reads root manifest.json.
  • Consequence: every .mcpb bundle since v0.8.1 shipped a manifest.json declaring the wrong version, because release.yml copies the file verbatim into the bundle staging dir.
  • The value itself was corrected to 0.8.3 in the release integrity: no published release carries a provenance attestation, an SBOM, or a signed tag #158 branch; this issue is about the missing guard, not the value.

Why it is filed rather than fixed in place

scripts/check_marketplace_pins.py is a byte-identical copy of the canonical file in cdeust/Cortex, and .github/workflows/marketplace-pins.yml diffs it against the canonical copy weekly and fails on drift. Adding a check here would redden that job. The fix has to land in Cortex first, then propagate — outside the blast radius of the release-integrity change.

Acceptance criteria

  • check_marketplace_pins.py in cdeust/Cortex gains a MANIFEST_JSON_SPLIT (or equivalent) class asserting root manifest.json version == the primary local pin, skipped cleanly when the file is absent (Cortex itself has no manifest.json).
  • A unit test in scripts/tests/test_check_marketplace_pins.py reproduces the 0.8.0-vs-0.8.2 split and fails on the pre-fix code.
  • The copy in automatised-pipeline is updated to the new canonical bytes and the weekly diff job passes.
  • Reintroducing the drift locally makes python3 scripts/check_marketplace_pins.py exit 1.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions