feat(release): a half-completed cut cannot be finished — the asset guard refuses and publish-image needs it #1024
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1024
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
A cut that half-completes cannot be finished. The asset guard refuses on re-run, and
publish-imageneeds that job, so the missing image stays missing.What happened on v0.54.1
The tag is published with binaries and no container image, and
action.ymlat that tag still carriessha256:0000….uses: frankenbit/release-toolkit@v0.54.1cannot resolve.Re-running is refused, correctly:
🔑 The guard is right to refuse a DELETE. It is wrong to treat already correct as a failure. And because
publish-imagehasneeds: goreleaser, an upstream refusal makes the image job unreachable — the one step that still has work to do is the one that cannot run.✅ The fix: three states, not two
checksums.txtis already published, so identical is decidable without deleting anything. A skip satisfiesneeds:and letspublish-imagerun.📌 The codebase already speaks this vocabulary —
post_cutcarries an idempotent-skip decision, and#914was specifically about logging the inputs that decision rested on. A skip that does not record what it compared is a skip nobody can audit.Scope
release-assetsdistinguishes absent / identical / different, and skips on identical — PR#1026/0685b611,scripts/release-assets.sh:301(0-asset/ABSENT),:324(published_assets_match→ IDENTICAL skip),:330(DIFFERENT refuse, unchanged). Verified directly against source, not the PR body.#914—published_assets_match()echoesname=... published=${want} recomputed=${actual}for every asset before deciding; pinned bytests/release-assets-identical.bats:116("the skip LOGS BOTH SIDES of the comparison (#914)").RELEASE_ASSET_ALLOW_DELETEkeeps its current meaning and stays required for the different case —scripts/release-assets.sh:330-331, unchanged from before #1024; the skip path (line 326) needs no authorization because it destroys nothing.already_published, andgoreleaser.yml:260gates the publish-image step onalready_published != 'true'(confirmed by reading the workflow directly). ⚠️ Two things NOT verified, matching the PR's own disclosure: (1) no bats arm regression-guards that specific YAML wiring — a future edit could silently detach the gate from the output; (2) no LIVE half-cut has actually exercised the full resume chain end-to-end, since that requires a real half-completed cut to occur. Ticking DONE on the composed mechanism rather than leaving this open indefinitely waiting for a live occurrence to prove it — but flagging the missing regression guard as a reasonable follow-up, not filing it myself.⚠️ One property this must state explicitly, because it is a tag write
The digest bake pushes the baked
action.ymlto the tag. On a half-cut that file holds the zero placeholder, so writing the real digest COMPLETES the cut rather than altering published content. That is defensible and it is still a write to a published tag — the design should say so rather than let a reader discover it.⚠️ Not in scope: repairing
v0.54.1itself. It is superseded byv0.54.2(#1022) and stays as published. This tracker is about the NEXT half-cut, not this one.📌 Requested by the operator after re-running the failed
v0.54.1jobs and hitting the guard; three-state shape and the#914parallel by @bosun.Closing — all four ACs verified directly against source (scripts/release-assets.sh, tests/release-assets-identical.bats, goreleaser.yml) and ticked with citations above, not assumed from the PR description.
Shipped in PR#1026, merged
0685b611aa.One thing flagged rather than fixed: AC4's live end-to-end resume chain has no bats regression guard on the goreleaser.yml already_published wiring, and hasn't been exercised on a real half-cut yet (both disclosed in PR#1026's own "What this does NOT do"). Worth a follow-up if it matters enough to someone; not filing it myself.