release: draft the Release until assets are verified, so latest never points at nothing - #4
Merged
Conversation
… points at nothing
MattJackson
added a commit
that referenced
this pull request
Aug 12, 2026
The daily schedule's minute and hour fields had been shifted out of the cron
expression and into bundle_image, in BOTH consumer-verify.yml and release.yml:
- cron: " * * *" # three fields; GitHub requires five
bundle_image: 53 9 # the missing two, as an image name
GitHub rejected the workflow file outright -- every push to dev reported a
red 'This run likely failed because of a workflow file issue' with no job and
no log -- and the daily rot check that file exists to run had never fired once.
bundle_image is now empty, which is the truthful value: this repo publishes one
kind of artifact, a signed busbar-store-*.tar.gz per target, and no container
bundle appears in any of its workflows. Empty makes the shared workflow declare
the runnable-bundle boot check NOT-APPLICABLE rather than silently skip it. The
comment claiming this repo ships a runnable bundle came from headroom-hook and
was never true here.
Pre-existing on dev (#4), independent of the durable-store work landing beside
it; fixed here because it made every push to dev read as red.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
create-releasepublishes this repos GitHub Release before the build matrix runs. If every target then fails to build, pack, or upload, the tag is left with a published Release carrying zero assets andreleases/latestresolves to nothing. Anything followingreleases/latest, including busbars plugin-registry gate, sees an empty release.This is not hypothetical:
GetBusbar/webrequest-hookshipped exactly that phantom on the busbar 1.5.3 cascade (v1.0.4, zero assets, deleted by hand). This repo has the identical workflow shape, so it has the identical bug, and any total build failure will trigger it.The existing
verify-assetsguard already detects the assetless case, but only after the empty Release is public. Detection is not prevention.Fix
Create the Release as a draft, and let
verify-assetspromote it to published only once assets are provably attached. A release is then either complete or absent.Verified end to end against a throwaway repo before applying:
gh release create --draft --verify-tagworks.GET /repos/{o}/{r}/releases/tags/<tag>returns 404 while draft, andreleases/latestdoes not resolve it. This is the property that makes the empty window invisible.gh release upload <tag>andgh release view <tag>still resolve the draft by tag with the workflow token, so the matrix upload jobs and the asset count are unaffected.gh release edit <tag> --draft=false --latestpromotes it and pointslatestat it.The build matrix, packing, signing, attestation, and the downstream notify are all untouched.
verify-assetskeeps its existing hard-fail on zero assets; the only change is that the failure now leaves an unpublished draft rather than a public phantom, so there is nothing to clean up by hand.Fleet-wide change, applied identically to every first-party plugin repo sharing this release shape (store, auth, hook, and secret plugins).