Skip to content

Release publishes before components are built — a flight-component failure leaves an incomplete public release #333

Description

@avrabe

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

  1. Draft-then-finalizecreate-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.
  2. 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.
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions