What happened (v1.131.0)
create-release publishes the GitHub Release; flight-component (which builds, guards, attaches and OCI-pushes the wasm components) runs after it. When flight-component failed — a missing rustc target, #332 — the release was already public: 12 assets (binaries, SBOM, sums, cosign bundle) and no wasm components.
The result is incomplete, not incorrect: nothing wrong was published (the #323 fail-loud aborted the build and the ghcr push was skipped, so ghcr still served only 1.129.0/1.130.0). But a published release that permanently lacks its components is a bad artifact to leave lying around, and it cannot be repaired without either moving a tag or cutting a new version.
Why the existing guard doesn't cover it
The #100/#140 guard asserts a falcon-flight-*.wasm asset exists on the release — good — but it lives inside the flight-component job, i.e. downstream of the publish. If that job fails before the upload, the guard never runs and the release is already out. The gate is downstream of the damage.
Options
- Draft-then-finalize —
create-release publishes with --draft; a final step flips it to published only after components are attached and the guard passes. Most faithful: nothing is public until it is complete.
- Gate publish on the component build — reorder so components are built (and guarded) before the release is created, then create it with everything at once. Simpler ordering, but the release job loses its current independence and the binaries wait on the wasm toolchain.
- Accept + automate repair — leave ordering, but on flight-component failure automatically delete the release (keeping the tag) so a re-run can recreate it cleanly.
(1) looks best — a draft release is invisible to consumers and to gh release view --json assets consumers, so the failure mode becomes "no release" rather than "half a release".
Acceptance
Context
Three defects in this arc were caught only after something was published or built wrong (core module shipped in 1.129.0; memory.grow in 1.130.0; this). Each was found by checking the artifact. Moving this particular gate upstream of the publish removes one of those windows entirely.
Refs: #332 (the triggering regression), #323 (fail-loud + header assert), #140/#100 (the existing guard).
🤖 Generated with Claude Code
What happened (v1.131.0)
create-releasepublishes the GitHub Release;flight-component(which builds, guards, attaches and OCI-pushes the wasm components) runs after it. When flight-component failed — a missing rustc target, #332 — the release was already public: 12 assets (binaries, SBOM, sums, cosign bundle) and no wasm components.The result is incomplete, not incorrect: nothing wrong was published (the #323 fail-loud aborted the build and the ghcr push was skipped, so ghcr still served only 1.129.0/1.130.0). But a published release that permanently lacks its components is a bad artifact to leave lying around, and it cannot be repaired without either moving a tag or cutting a new version.
Why the existing guard doesn't cover it
The #100/#140 guard asserts a
falcon-flight-*.wasmasset exists on the release — good — but it lives inside the flight-component job, i.e. downstream of the publish. If that job fails before the upload, the guard never runs and the release is already out. The gate is downstream of the damage.Options
create-releasepublishes with--draft; a final step flips it to published only after components are attached and the guard passes. Most faithful: nothing is public until it is complete.(1) looks best — a draft release is invisible to consumers and to
gh release view --json assetsconsumers, so the failure mode becomes "no release" rather than "half a release".Acceptance
Context
Three defects in this arc were caught only after something was published or built wrong (core module shipped in 1.129.0;
memory.growin 1.130.0; this). Each was found by checking the artifact. Moving this particular gate upstream of the publish removes one of those windows entirely.Refs: #332 (the triggering regression), #323 (fail-loud + header assert), #140/#100 (the existing guard).
🤖 Generated with Claude Code