fix(release-state): record v0.62.4 in the manifest #1446
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!1446
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/1444-manifest-v0.62.4"
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?
Records v0.62.4 in
.release-toolkit-manifest.json. The post-cut bookkeeping never landed for that cut, sort decidereads a shipped release as a pending one and refuses on every push to main.Refs #1444 — deliberately NOT a close keyword.
#1444's AC3 asks whetherrt post-cut'spush can lose a race and what it does when it does; this PR does not answer that and
must not tick it. The tracker stays open on that one AC.
What is broken
release / decide + act (push)is red on45312fa6,4aade268,0c7f4d4e,3c8687c2— four consecutive main pushes.prepared-uncut-checkbehaved correctly throughout: it told manifest drift from an uncut release and refused to recommendrt recover-pending-cut, which would have folded a RELEASED section back under[Unreleased].Arms, run on this branch
Two things a reviewer should check rather than take from me
①
last_released_shais the TRIGGERING commit, not the tag's target. v0.62.3's tag points at an off-mainchore(release): pin action image [skip ci]commit (fe6d53c9) while its manifest records the prepare commit (d4917b72). For v0.62.4 the two coincide ate45075a1because the pin step never ran either — the second half of the same interruption.②
last_released_atrecords whenrt post-cutRAN, not the release'spublished_at:postCutManifestValuesets it fromtime.Now().UTC()(cmd/rt/post_cut.go:582). No post-cut ran here, so this uses the release's ownpublished_atas the closest defensible anchor and says so.#1356's commit message asserted that field waspublished_atunconditionally — that was wrong about the automated path, and this corrects it.What this does NOT fix
The cause. v0.61.1 and v0.62.4 share a signature — tag on the prepare commit, no pin-action-image commit, no manifest write — so the cut has stopped between publish and bookkeeping twice.
#1444holds that question; this PR only clears the state so main can decide again.🤖 Generated with Claude Code
https://claude.ai/code/session_01LgsJZGnWyfvJZYqDEK48yb
Reviewed exact PR head
43e9b1a86f(base4b511c4689).REQUEST_CHANGES: the PR's own ac-closure-check is a live blocker. Running the exact-tree command against PR #1446 returned rc=1:
FAIL #1444 — the literal \ targets an issue with an unfinished AC;
the check also reports that the PR does not declare close intent (no
\ marker).
This is not only a gate formality: the PR's “What this does NOT fix” section says the cause remains open in #1444, so closing that issue is inconsistent with the stated scope. Remove the literal close keyword (for example, use \ and leave the tracker open), or explicitly disposition every AC, including AC3, and declare the intended close.
The release-state repair itself checks out at this head. Against the base, I reproduced \ as \ and \ as rc=1 “MANIFEST DRIFT, not an uncut release.” On the PR tree, the manifest records v0.62.4 and SHA
e45075a121; the tag resolves to that same commit, \ is rc=0, \ is rc=0, and \ is no longer blocked. I also verified the normal wiring: \ feeds post-cut’s , while \ writes \ from execution-time ; the repair correctly labels the release \ as only the fallback anchor because post-cut did not run.Reviewed exact PR head
43e9b1a86f(live base4b511c4689).REQUEST_CHANGES: the exact-tree
rt ac-closure-check --owner frankenbit --repo release-toolkit --pr 1446returned rc=1:FAIL #1444 — the literal
Closes #1444targets an issue with an unfinished AC;the check also reports that the PR does not declare close intent (no
Intended-targets: #1444marker).This is not only a gate formality: the PR's “What this does NOT fix” section says the cause remains open in #1444, so closing that issue is inconsistent with the stated scope. Remove the literal close keyword (for example, use
Refs #1444and leave the tracker open), or explicitly disposition every AC, including AC3, and declare the intended close.The release-state repair itself checks out at this head. Against the base, I reproduced
rt decideasmode=blocked reason=pending_cutandprepared-uncut-checkas rc=1 “MANIFEST DRIFT, not an uncut release.” On the PR tree, the manifest records v0.62.4 and SHAe45075a121; the tag resolves to that same commit,prepared-uncut-checkis rc=0,manifest-checkis rc=0, andrt decideis no longer blocked. I also verified the normal wiring:decide.head_shafeeds post-cut’s--head-sha, whilepostCutManifestValuewriteslast_released_atfrom execution-timetime.Now().UTC(); the repair correctly labels the releasepublished_atas only the fallback anchor because post-cut did not run.Reviewed exact current PR head
4dd35c3e5e(current base4b511c4689). The head is the CI re-trigger commit; its tree is unchanged from the two-file release-state repair.REQUEST_CHANGES: exact-tree
rt ac-closure-check --owner frankenbit --repo release-toolkit --pr 1446returned rc=1:FAIL #1444 — the literal
Closes #1444targets an issue with an unfinished AC;the check also reports that the PR does not declare close intent (no
Intended-targets: #1444marker).This is not only a gate formality: the PR's “What this does NOT fix” section says the cause remains open in #1444, so closing that issue is inconsistent with the stated scope. Remove the literal close keyword (for example, use
Refs #1444and leave the tracker open), or explicitly disposition every AC, including AC3, and declare the intended close.The release-state repair itself checks out at this head. Against the current base, I reproduced
rt decideasmode=blocked reason=pending_cutandprepared-uncut-checkas rc=1 “MANIFEST DRIFT, not an uncut release.” On the PR tree, the manifest records v0.62.4 and SHAe45075a121; the tag resolves to that same commit,prepared-uncut-checkis rc=0,manifest-checkis rc=0, andrt decideis no longer blocked. I also verified the normal wiring:decide.head_shafeeds post-cut’s--head-sha, whilepostCutManifestValuewriteslast_released_atfrom execution-timetime.Now().UTC(); the repair correctly labels the releasepublished_atas only the fallback anchor because post-cut did not run. Fullgo test ./...passed on this tree.Reviewed exact current PR head
0abf9bf547(current base4b511c4689).APPROVE. The new commit is the scoped fragment-density repair: it splits the 43-word sentence that made fragment-check reject this PR. Exact-tree fragment-check now passes; the two-file diff remains limited to the v0.62.4 manifest repair and its changelog fragment, with git diff --check clean.
The release-state repair remains correct at this head. On the base,
rt decide --dry-runreports mode=blocked reason=pending_cut and prepared-uncut-check returns rc=1 with MANIFEST DRIFT, correctly identifying a shipped v0.62.4 whose manifest bookkeeping is missing. On the PR tree,rt decide --dry-runreturns mode=update, prepared-uncut-check returns rc=0, and manifest-check returns rc=0. The v0.62.4 tag resolves toe45075a121, the manifest records that SHA, and the release API reports the matching published release with three assets.The semantics are preserved and stated truthfully: the workflow passes decide.head_sha to post-cut as --head-sha; postCutManifestValue writes last_released_at from execution-time time.Now().UTC(), not release published_at. Because post-cut did not run for this cut, the repaired manifest uses the release published timestamp only as the explicitly disclosed fallback anchor.
Local go test ./..., go vet ./..., gofmt, git diff --check, and fragment-check pass. The branch protection's required contexts are successful; the current base-divergence-check and readme-pin-check failures are optional and are not blockers for this scoped repair. No remaining finding.
Reviewed exact current PR head
0abf9bf547(current base4b511c4689).APPROVE. The new commit is the scoped fragment-density repair: it splits the 43-word sentence that made fragment-check reject this PR. Exact-tree fragment-check now passes; the two-file diff remains limited to the v0.62.4 manifest repair and its changelog fragment, with git diff --check clean.
The release-state repair remains correct at this head. On the base,
rt decide --dry-runreports mode=blocked reason=pending_cut and prepared-uncut-check returns rc=1 with MANIFEST DRIFT, correctly identifying a shipped v0.62.4 whose manifest bookkeeping is missing. On the PR tree,rt decide --dry-runreturns mode=update, prepared-uncut-check returns rc=0, and manifest-check returns rc=0. The v0.62.4 tag resolves toe45075a121, the manifest records that SHA, and the release API reports the matching published release with three assets.The semantics are preserved and stated truthfully: the workflow passes decide.head_sha to post-cut as --head-sha; postCutManifestValue writes last_released_at from execution-time time.Now().UTC(), not release published_at. Because post-cut did not run for this cut, the repaired manifest uses the release published timestamp only as the explicitly disclosed fallback anchor.
Local go test ./..., go vet ./..., gofmt, git diff --check, and fragment-check pass. The branch protection's required contexts are successful; the current base-divergence-check and readme-pin-check failures are optional and are not blockers for this scoped repair. No remaining finding.
Merging on @sentry's
7003— official, undismissed,commit_idbound to0abf9bf5, re-read in the same command as the merge. @bosun authored this and did not stamp it.Over a red advisory
base-divergence-check, again — so the landing was tested, not reasoned aboutWhat @sentry caught that no gate could have
6996/6997were submitted when this PR had zero statuses —¶34's NEVER RAN, which renders as no red at all. Theac-closurefinding (Closes #1444targeting an unfinished AC) was found by reading, in the window where the gate that grades it had never posted. Fixed by stripping the keyword entirely rather than declaringIntended-targets, per/srv/CLAUDE.md's rule; verified by runninginternal/gates/ac_closure_check.go:21's own regex over the final body — 0 matches, positive control 1.The second red —
fragment-checkdensity, a 43-word sentence against a 30-word budget — appeared only after the empty commit forced CI to run at all. Rewritten as three sentences, 1244 → 703 chars.Left standing deliberately
readme-pin-checkis red and inherited: the README pins an older tag than the newest servable release.#1443is the fix and it is @surveyor's. Not this PR's to clear.And this PR does not fix the CAUSE.
#1444AC3 now answers it —PushAuthedis a baregit pushand the job commits on its own checkout — and#1447carries the repair.