fix(release): record the published v0.46.0 cut in the manifest #884
No reviewers
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!884
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/417-manifest-record-v0460"
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?
rt/main's release job is red and stays red until this lands
v0.46.0completed through tag and release and then stopped before the manifest write:So
rt decideemitsmode=blocked(the #417 pending-cut guard that shipped in #882/#883) and fails closed on every push to main.release / decide + act (push)andrelease / release (push)have been red since 02:42; every other context on the tip is green. The guard is deliberately not self-healing — choosing between recovery (A) and (B) is a scope decision an operator has to make.This is recovery (A), and (B) would be wrong here
docs/integration.md § Cut-cancellation recovery (#417)names two paths. Two of (A)'s three steps were already done by the interrupted cut, so only the manifest edit remained.(B) — moving the
v0.46.0section back under[Unreleased]— would orphan a release that is already public. Worth stating explicitly, because the state reads as "uncut" from the manifest's point of view and that phrasing selects (B). The release is not uncut; it is unrecorded.Verification — two arms, one variable
The guard was run against both manifest states on the same tree:
The blocked arm is the positive control. Without it, a clean run would not establish that the guard can fire in this environment at all — the clean arm alone is consistent with an instrument that never blocks.
Note
pending_prep_sharesolves to7d248947, the same commit thev0.46.0tag points at — independent confirmation that the prepare commit was tagged and only the manifest lagged.Reviewer notes
last_released_atis the release'spublished_atin UTC (21:29:56+02:00→19:29:56Z), matching the v0.45.1 precedent (18:41:16+02:00→16:41:16Z).Refs #417, deliberately notCloses— #417 is the mechanism tracker and lives in this repo, so a close keyword would fire on it.main's push whitelist is["release-bot"]only. I hold admin and did not bypass protection.Filed and verified by @bosun on operator instruction.
APPROVED — reviewed exact head
ed6d671048(basea9563b4263).The four manifest values are verified against the substrate: tag v0.46.0 resolves to
7d248947f6, that commit is an ancestor of this head, and Forgejo's published v0.46.0 release targets the same commit (draft=false, prerelease=false, assets checksums.txt and rt-linux-amd64). The manifest JSON parses, key order/newline are preserved, and diff-check passes.Both recovery controls were reproduced with the same built rt:
de927aad...) -> mode=blocked, reason=pending_cut, pending_prep_sha=7d248947...7d248947...) -> mode=update, next_version=0.46.1, bump=patchAt this exact head: go test -count=1 ./..., go vet ./..., go build ./..., golangci-lint, shellcheck, git diff --check, and bats tests/*.bats (61/61) all pass. No merge action taken.
Non-blocking scope note for the separate gate follow-up: manifest-check remains green on the old broken manifest because its tag-vs-manifest section compares the current VERSION file to the newest tag, while its release-state section checks only that the declared manifest tag/SHA are internally consistent. That looks like a real pre-existing advertised-scope gap, but #417/#882's decide guard correctly catches this recovery state and this PR repairs it.
APPROVED — reviewed exact head
ed6d671048(basea9563b4263).The four manifest values are verified against the substrate: tag v0.46.0 resolves to
7d248947f6, that commit is an ancestor of this head, and Forgejo's published v0.46.0 release targets the same commit (draft=false, prerelease=false, assets checksums.txt and rt-linux-amd64). The manifest JSON parses, key order/newline are preserved, and diff-check passes.Both recovery controls were reproduced with the same built rt:
de927aad...) -> mode=blocked, reason=pending_cut, pending_prep_sha=7d248947...7d248947...) -> mode=update, next_version=0.46.1, bump=patchAt this exact head: go test -count=1 ./..., go vet ./..., go build ./..., golangci-lint, shellcheck, git diff --check, and bats tests/*.bats (61/61) all pass. No merge action taken.
Non-blocking scope note for the separate gate follow-up: manifest-check remains green on the old broken manifest because its tag-vs-manifest section compares the current VERSION file to the newest tag, while its release-state section checks only that the declared manifest tag/SHA are internally consistent. That looks like a real pre-existing advertised-scope gap, but #417/#882's decide guard correctly catches this recovery state and this PR repairs it.