Skip to content

fix: #66 recovery dispatch for stranded releases; SBOMs to per-crate releases - #67

Merged
CarlAllenn merged 1 commit into
mainfrom
fix/66-release-recovery
Jul 31, 2026
Merged

fix: #66 recovery dispatch for stranded releases; SBOMs to per-crate releases#67
CarlAllenn merged 1 commit into
mainfrom
fix/66-release-recovery

Conversation

@CarlAllenn

Copy link
Copy Markdown
Owner

Fixes the two remaining publish-path defects from #66.

Defect 1 — SBOM upload targeted a release that never exists. publish.yml finished with gh release upload "${GITHUB_REF_NAME}" …, but phase 1 creates only per-crate releases — there is no release at the umbrella tag. SBOMs now attach to the per-crate releases via upload-sboms.sh, which is also the honest shape: each SBOM describes exactly one crate's dependency closure.

Defect 2 — a fix landing after the release PR merges could not be released. release-plz refuses to tag unless the current commit is a release-PR merge commit, so a defect found after merge stranded the release (bumped manifests, nothing tagged, nothing published, phase 1 a no-op). release-plz.yml gains a workflow_dispatch job (tag-dispatch) that runs tag-release.sh: from main only, it creates the six per-crate tags and GitHub releases at the current commit — refusing if the version is already on crates.io or the umbrella tag already exists — then pushes the umbrella tag through the existing push-umbrella-tag.sh unchanged, which triggers publish.yml as usual.

Release notes for the dispatch path are extracted from each crate's changelog section for the version, with a plain fallback for crates whose bump came only from the version group.

Idempotent: a partial dispatch run (tags created, releases missing, umbrella absent) converges on re-dispatch.

The existing release-pr and tag jobs are gated to push events; the stale "five per-crate tags" comment now says six.

Closes #66's two defect checkboxes; the release itself follows via dispatch once this merges.

🤖 Generated with Claude Code

…releases

Defect 1: publish.yml uploaded SBOMs to a release at the umbrella tag,
which phase 1 never creates — only the per-crate releases exist. The
SBOMs now attach per-crate, which is also the honest shape: each SBOM
describes exactly one crate's dependency closure.

Defect 2: release-plz refuses to tag unless the current commit is a
release-PR merge commit, so any defect fixed after the release PR merges
strands the release — manifests bumped, nothing tagged, nothing
published, phase 1 a no-op. release-plz.yml gains a workflow_dispatch
job that creates the six per-crate tags and releases directly at the
head of main, guarded by the same unpublished-and-untagged checks as
the umbrella step, then pushes the umbrella tag through the existing
script unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@CarlAllenn CarlAllenn mentioned this pull request Jul 31, 2026
@CarlAllenn
CarlAllenn merged commit 7cdf66f into main Jul 31, 2026
13 checks passed
@CarlAllenn
CarlAllenn deleted the fix/66-release-recovery branch July 31, 2026 02:55
CarlAllenn added a commit that referenced this pull request Jul 31, 2026
* chore: release v1.0.2

Hand-authored bump (release-plz opens no PR for CI-only changes): no
library changes — this version exists to ship through the fully hardened
release pipeline from #66/#67/#69, producing the first release with
in-run provenance self-verification, a single attestation set, and SBOMs
attached to the per-crate releases.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: fuzz workspace lockfile follows edtf-core 1.0.2

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@CarlAllenn CarlAllenn mentioned this pull request Aug 8, 2026
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.

release: v1.0.1 is tagged nowhere and published nowhere — two defects left in the publish path

1 participant