Skip to content

fix(ci): attach SBOM at release-create time (immutable-releases 422)#116

Merged
m1ngshum merged 1 commit into
mainfrom
fix/release-sbom-immutable
Jul 3, 2026
Merged

fix(ci): attach SBOM at release-create time (immutable-releases 422)#116
m1ngshum merged 1 commit into
mainfrom
fix/release-sbom-immutable

Conversation

@m1ngshum

@m1ngshum m1ngshum commented Jul 3, 2026

Copy link
Copy Markdown
Member

What

The publish workflow's final step created the GitHub Release, then uploaded the CycloneDX SBOM in a separate gh release upload --clobber step. The repo has immutable releases enabled, which seals a release's assets at creation and rejects later uploads:

https://github.com/getmcpm/cli/releases/tag/v0.17.0
HTTP 422: Cannot upload assets to an immutable release.

So the v0.17.0 publish went green through pnpm publish --provenance (the package is live on npm) and only died on the release-asset upload.

Fix

Attach the SBOM as a positional asset to gh release create so it's sealed atomically with the release. Preserves:

  • the file-guard (create an asset-less release if SBOM generation failed — it's continue-on-error),
  • the idempotent already-exists branch (now honestly notes an immutable release can't be amended).

Scope

CI-only; one workflow step. No product code. Root-causes the release-pipeline break introduced with the SBOM step (#113).

Note: v0.17.0's release is already immutable and asset-less; this fixes it for v0.18.0 onward. Backfilling v0.17.0's SBOM (delete + recreate) is a separate manual step.

The publish workflow created the GitHub Release, then uploaded the CycloneDX
SBOM as a separate `gh release upload` step. With immutable releases enabled
on the repo, that follow-up upload is rejected (HTTP 422: 'Cannot upload assets
to an immutable release'), failing the workflow after npm publish had already
succeeded — v0.17.0 shipped to npm but its GitHub Release has no SBOM asset.

Pass the SBOM to `gh release create` as a positional asset so it's sealed with
the release atomically. Keep the file-guard (asset-less release if generation
failed) and the idempotent already-exists branch (now honest that an immutable
release can't be amended).
@m1ngshum m1ngshum merged commit a59d0c2 into main Jul 3, 2026
8 checks passed
@m1ngshum m1ngshum deleted the fix/release-sbom-immutable branch July 3, 2026 03:05
m1ngshum added a commit that referenced this pull request Jul 3, 2026
Bring the docs back in line with what shipped:
- v0.16.0 released guard --confine (F1) — was still marked 'shipped to main,
  unreleased' in CLAUDE.md + docs/ROADMAP.md (3 spots).
- v0.17.0 released Wave 0 (E3/B1a/E11/E9a) — mark ROADMAP-ADOPTION Wave 0 shipped.
- Claude Code (D1) is now a first-class client — add it to the supported-clients
  list everywhere it's stated as current capability (README table, CLAUDE.md
  intro/positioning/adapters diagram, GUARD.md, ARCHITECTURE.md config-key note)
  and mark D1 shipped in ROADMAP-ADOPTION.
- Fix the suggested release mapping (v0.17 was Wave 0 only; D1 rides v0.18).
- CLAUDE.md: version line v0.15→v0.17, Last-updated date, +2 decisions-log rows
  (release+D1, and the immutable-releases SBOM gotcha from #116).

Docs-only; no code change. Illustrative mermaid diagrams left as-is.
m1ngshum added a commit that referenced this pull request Jul 3, 2026
Developer-reach release: Claude Code (~/.claude.json) becomes a first-class
client (D1). First release to attach the CycloneDX SBOM correctly (v0.17.0's
attach step tripped over GitHub immutable releases; fixed in #116). Also folds in
the confine macOS dogfood race fix (#119). Version is derived from the git tag.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant