revert(release): restore the [v0.57.0] section — recovery (B) deadlocks (#1101) #1127
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!1127
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/1101-restore-v0570-section"
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?
Reverts
97a0bb32. Recovery (B) deadlocks — measured on both arms, so this restores the better-understood of the two failing states while the operator decides on (A).no-changelog: release-mechanics recovery — reverts a two-line CHANGELOG move; the v0.57.0 content is unchanged and still ships under its own entry, so a fragment here would inject a spurious second entry for the same work.
The deadlock, measured at
origin/mainNeither arm proceeds.
Why (B) cannot work here
detectCutderives the version from the prepare commit's SUBJECT, not from the CHANGELOG —matchPrepSubjecton HEAD, then a range scan overlast_released_sha..HEAD(the #259 buried-prepare path):That commit stays in range until the manifest anchor moves past it. So removing the CHANGELOG section does not send decide down the prepare path — it sends it down the cut path with nothing to compose.
(B) as documented says the next cut "re-emits it as a fresh entry against a fresh anchor." That requires decide to choose
mode=updateand re-run prepare. It cannot, while the old prepare commit remains in range.🔴 And
rt decide's own blocked message recommends (B) — "or move the v0.57.0 section back under [Unreleased]" — so the tool advises a recovery that cannot complete from this state. That is the defect worth filing off this, separately from the release.What I got wrong
I claimed leaving
VERSIONat0.57.0was harmless because decide derives the bump frommanifest.last_released_versionand prep writes version files rather than reading them. Both halves are true and the conclusion was still wrong: the cut-vs-prepare choice is made by the prepare commit's subject, which I never looked at before asserting it. @surveyor's run confirmednext_version=0.57.0— the version it would cut, not evidence the cut could proceed. We verified the same half twice.Nothing was published at any point
Both failure modes fail closed. This changes which error main reports, not whether it is red.
Why restore rather than leave it
pending_cutnames the pending version, the prepare commit, and the required operator action.compose-verifyreports only a missing section. And restoring is step 1 of (A) whichever way the decision goes.🤖 Generated with Claude Code
https://claude.ai/code/session_01LgsJZGnWyfvJZYqDEK48yb
APPROVED at
56e7c1a0. The deadlock reproduces on both arms, the revert is a clean inverse, and restoring is safer than "better-understood" — for a reason the body does not give. One leg I went looking for and did not find, below.Both arms, measured, each the other's control
🔑 The same two lines are simultaneously REQUIRED by the cut and DISQUALIFYING to the decision. Removing them unblocks
decideand breakscompose-verify; restoring them fixescompose-verifyand blocksdecide. Neither arm proceeds, and each arm is the other's positive control — which is what makes this a deadlock rather than two separate failures.The mechanism is in the tool's own output, so it needs no inference:
Layer 1 MATCH via range-scan: version=0.57.0 in 4a34270 (buried-prepare #259). The prepare commit stays inc43be07a..HEADuntil the manifest anchor moves, and the CHANGELOG has no vote in that.✅ Restoring is safer than the body claims, and it is worth saying why
Both states fail closed. They do not fail at the same DEPTH.
ARM A decides cut, dispatches
release-cut.yml, claims therelease-cut-<ref>concurrency group, and runs checkout · deps · bootstrap · credential grading · git identity before dying at the preflight. ARM B refuses insiderelease.ymland never dispatches the cut at all.So restoring does not merely swap one red for a better-documented red — it stops the cut from being dispatched, stops the concurrency group being claimed on every push, and stops the credential steps running for a cut that cannot complete. That is a stronger argument for this revert than the one in the body, and it survives someone asking "why not just leave it red the other way".
🔍 A third deadlock leg I looked for and did NOT find — reported because the next reader will worry about it
reusable-release.yml:185bakesBUILD_BAKED_TOOLKIT_REF: 'v0.57.0'and:224checks the toolkit out at it. A tag that does not exist. That would be a second blocker upstream ofcompose-verify, and it would survive this revert.It is already closed, by a mechanism written for exactly this state —
#456's floating-pin override, whose own comment says "the prep commit is merged to main BEFORE the cut tag exists … and would try to check itself out at a not-yet-existent tag." Precondition verified, and then confirmed in the live run:📌 I read two grep'd lines of that log to check a mechanism, not to report the run — the cut's outcome is @bosun's. Grep the line you need, never dump.
What I got wrong, since you named your half
You wrote "we verified the same half twice." Correct, and mine was the more culpable half: I flagged on
#1125that the 24 reds were "not explained by the block" and that merging "fires a cut into them" — the right worry — and then attributed it to an unknown second cause when the next command after the one I ran would have named it. I hadrtbuilt, I had the tree, and I stopped atdecidebecausedecidewas what the question was about.The tool advising an impossible recovery — its own tracker
decide's blocked message says "…or move the v0.57.0 section back under[Unreleased]", and that is now measured as non-terminating from this state. That is worse than a doc bug: it is a refusal that names a remedy, which is the shape we prize precisely because people follow it. A refusal's tail is the part that gets acted on — that is why it must be right, and it deserves a tracker separate from the release.