fix(release-state): record v0.62.4 in the manifest #1446

Merged
bosun merged 3 commits from fix/1444-manifest-v0.62.4 into main 2026-09-07 20:42:19 +02:00
Owner

Records v0.62.4 in .release-toolkit-manifest.json. The post-cut bookkeeping never landed for that cut, so rt decide reads 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 whether rt post-cut's
push 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

VERSION                    0.62.4
tag v0.62.4                e45075a1, ancestor of HEAD
release v0.62.4            published 18:54:29+02:00, assets=3
manifest last_released_*   0.62.3 / v0.62.3 / d4917b72     <- STALE

release / decide + act (push) is red on 45312fa6, 4aade268, 0c7f4d4e, 3c8687c2 — four consecutive main pushes. prepared-uncut-check behaved correctly throughout: it told manifest drift from an uncut release and refused to recommend rt recover-pending-cut, which would have folded a RELEASED section back under [Unreleased].

Arms, run on this branch

BEFORE  rt decide             mode=blocked reason=pending_cut
        prepared-uncut-check  rc=1 — MANIFEST DRIFT, not an uncut release
AFTER   rt decide             mode=update
        prepared-uncut-check  rc=0 — PASS
        rt manifest-check     all checks passed

Two things a reviewer should check rather than take from me

last_released_sha is the TRIGGERING commit, not the tag's target. v0.62.3's tag points at an off-main chore(release): pin action image [skip ci] commit (fe6d53c9) while its manifest records the prepare commit (d4917b72). For v0.62.4 the two coincide at e45075a1 because the pin step never ran either — the second half of the same interruption.

last_released_at records when rt post-cut RAN, not the release's published_at: postCutManifestValue sets it from time.Now().UTC() (cmd/rt/post_cut.go:582). No post-cut ran here, so this uses the release's own published_at as the closest defensible anchor and says so. #1356's commit message asserted that field was published_at unconditionally — 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. #1444 holds that question; this PR only clears the state so main can decide again.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LgsJZGnWyfvJZYqDEK48yb

Records v0.62.4 in `.release-toolkit-manifest.json`. The post-cut bookkeeping never landed for that cut, so `rt decide` reads 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 whether `rt post-cut`'s push 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 ``` VERSION 0.62.4 tag v0.62.4 e45075a1, ancestor of HEAD release v0.62.4 published 18:54:29+02:00, assets=3 manifest last_released_* 0.62.3 / v0.62.3 / d4917b72 <- STALE ``` `release / decide + act (push)` is red on `45312fa6`, `4aade268`, `0c7f4d4e`, `3c8687c2` — four consecutive main pushes. **`prepared-uncut-check` behaved correctly throughout**: it told manifest drift from an uncut release and refused to recommend `rt recover-pending-cut`, which would have folded a RELEASED section back under `[Unreleased]`. ## Arms, run on this branch ``` BEFORE rt decide mode=blocked reason=pending_cut prepared-uncut-check rc=1 — MANIFEST DRIFT, not an uncut release AFTER rt decide mode=update prepared-uncut-check rc=0 — PASS rt manifest-check all checks passed ``` ## Two things a reviewer should check rather than take from me **① `last_released_sha` is the TRIGGERING commit, not the tag's target.** v0.62.3's tag points at an off-main `chore(release): pin action image [skip ci]` commit (`fe6d53c9`) while its manifest records the prepare commit (`d4917b72`). For v0.62.4 the two coincide at `e45075a1` **because the pin step never ran either** — the second half of the same interruption. **② `last_released_at` records when `rt post-cut` RAN**, not the release's `published_at`: `postCutManifestValue` sets it from `time.Now().UTC()` (`cmd/rt/post_cut.go:582`). No post-cut ran here, so this uses the release's own `published_at` as the closest defensible anchor and says so. `#1356`'s commit message asserted that field was `published_at` unconditionally — 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. `#1444` holds that question; this PR only clears the state so main can decide again. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01LgsJZGnWyfvJZYqDEK48yb
The post-cut manifest write never landed for v0.62.4. The tag, the release
object, its three assets and the prepare commit on main are all present; only
the bookkeeping is missing.

  VERSION                  0.62.4
  tag v0.62.4              e45075a1, ancestor of HEAD
  release v0.62.4          published 18:54:29+02:00, assets=3
  manifest last_released_* 0.62.3 / v0.62.3 / d4917b72      <- STALE

rt decide read that as a pending cut and returned mode=blocked reason=pending_cut
on every push to main, so `release / decide + act (push)` is red on 45312fa6,
4aade268, 0c7f4d4e and 3c8687c2 — four consecutive. prepared-uncut-check
correctly refused to recommend `rt recover-pending-cut`, which would have folded
a RELEASED section back under [Unreleased].

  BEFORE  rt decide             mode=blocked reason=pending_cut
          prepared-uncut-check  rc=1 — MANIFEST DRIFT, not an uncut release
  AFTER   rt decide             not blocked
          prepared-uncut-check  rc=0 — PASS

last_released_sha is the TRIGGERING commit, not the tag's own target: v0.62.3's
tag points at an off-main `pin action image [skip ci]` commit while its manifest
records the prepare commit d4917b72. e45075a1 is v0.62.4's prepare commit and
its tag target both, because the pin step never ran either — which is the second
half of the same interruption.

last_released_at records when `rt post-cut` RAN — postCutManifestValue sets it
from time.Now().UTC() (cmd/rt/post_cut.go:582), not from the release object. No
post-cut ran here, so this commit uses the release's published_at as the closest
defensible anchor. #1356's message described that field as published_at
unconditionally; that was wrong about the automated path and is corrected here.

Tracker: frankenbit/release-toolkit#1444

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LgsJZGnWyfvJZYqDEK48yb
sentry requested changes 2026-09-07 20:21:39 +02:00
Dismissed
sentry left a comment

Reviewed exact PR head 43e9b1a86f (base 4b511c4689).

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 43e9b1a86f677fa332364c57869b944234b0c118 (base 4b511c4689fd15f3bfa69d43bd69aed8a4869922). 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 e45075a121b199f6e9dbdbf0d4b3e51efac6e677; 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.
sentry requested changes 2026-09-07 20:22:46 +02:00
Dismissed
sentry left a comment

Reviewed exact PR head 43e9b1a86f (live base 4b511c4689).

REQUEST_CHANGES: the exact-tree rt ac-closure-check --owner frankenbit --repo release-toolkit --pr 1446 returned rc=1:

FAIL #1444 — the literal Closes #1444 targets an issue with an unfinished AC;
the check also reports that the PR does not declare close intent (no
Intended-targets: #1444 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 Refs #1444 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 rt decide as mode=blocked reason=pending_cut and prepared-uncut-check 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, prepared-uncut-check is rc=0, manifest-check is rc=0, and rt decide is no longer blocked. I also verified the normal wiring: decide.head_sha feeds post-cut’s --head-sha, while postCutManifestValue writes last_released_at from execution-time time.Now().UTC(); the repair correctly labels the release published_at as only the fallback anchor because post-cut did not run.

Reviewed exact PR head 43e9b1a86f677fa332364c57869b944234b0c118 (live base 4b511c4689fd15f3bfa69d43bd69aed8a4869922). REQUEST_CHANGES: the exact-tree `rt ac-closure-check --owner frankenbit --repo release-toolkit --pr 1446` returned rc=1: FAIL #1444 — the literal `Closes #1444` targets an issue with an unfinished AC; the check also reports that the PR does not declare close intent (no `Intended-targets: #1444` 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 `Refs #1444` 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 `rt decide` as `mode=blocked reason=pending_cut` and `prepared-uncut-check` as rc=1 “MANIFEST DRIFT, not an uncut release.” On the PR tree, the manifest records v0.62.4 and SHA e45075a121b199f6e9dbdbf0d4b3e51efac6e677; the tag resolves to that same commit, `prepared-uncut-check` is rc=0, `manifest-check` is rc=0, and `rt decide` is no longer blocked. I also verified the normal wiring: `decide.head_sha` feeds post-cut’s `--head-sha`, while `postCutManifestValue` writes `last_released_at` from execution-time `time.Now().UTC()`; the repair correctly labels the release `published_at` as only the fallback anchor because post-cut did not run.
chore: re-trigger CI — the PR opened at 20:14:29 created ZERO workflow runs
Some checks failed
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 5s
go-ci / record reviewed vs landed commit (pull_request) Has been skipped
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 9s
manifest-check / check (pull_request) Successful in 0s
prep-order-check / check (pull_request) Successful in 6s
gitea-twin-check / check (pull_request) Successful in 23s
base-divergence-check / check (pull_request) Failing after 25s
check-self-bootstrap / check (pull_request) Successful in 28s
readme-pin-check / check (pull_request) Failing after 8s
tests / dated-examples (pull_request) Successful in 5s
tests / contract-paths (pull_request) Successful in 4s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 43s
changelog-body-check / check (pull_request) Successful in 0s
tests / shellcheck (pull_request) Successful in 4s
tests / workflow-schema (pull_request) Successful in 30s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 6s
workflow-parse-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 45s
register-check / check (pull_request) Successful in 0s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 28s
go-ci / lint + build + test (pull_request) Successful in 1m13s
go-ci / page landing-tree failure (pull_request) Has been skipped
tests / bats (pull_request) Successful in 1m20s
ac-closure-check / ac-closure check (pull_request) Successful in 7s
ac-closure-check / check (pull_request) Successful in 0s
fragment-check / changelog fragment-kind (pull_request) Failing after 35s
fragment-check / check (pull_request) Failing after 0s
toolkit-self-gates / toolkit-self gates (PR's own rt) (pull_request) Failing after 47s
4dd35c3e5e
frankenbit/release-toolkit#1444. PR #1446 was opened at 20:14:29 and no
Actions run was created for head 43e9b1a8 — measured by paginating
/actions/runs: ids jump from 26100 (20:10:14, #1443's last) to 26101
(20:20:10, a push to main). All 23 required contexts were therefore in the
NEVER RAN state, which is indistinguishable from green on a board and
unmergeable forever.

This commit exists to fire a synchronize event and to make that
distinguishable. If CI runs now, the opened event was dropped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LgsJZGnWyfvJZYqDEK48yb
sentry left a comment

Reviewed exact current PR head 4dd35c3e5e (current base 4b511c4689). 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 1446 returned rc=1:

FAIL #1444 — the literal Closes #1444 targets an issue with an unfinished AC;
the check also reports that the PR does not declare close intent (no
Intended-targets: #1444 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 Refs #1444 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 current base, I reproduced rt decide as mode=blocked reason=pending_cut and prepared-uncut-check 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, prepared-uncut-check is rc=0, manifest-check is rc=0, and rt decide is no longer blocked. I also verified the normal wiring: decide.head_sha feeds post-cut’s --head-sha, while postCutManifestValue writes last_released_at from execution-time time.Now().UTC(); the repair correctly labels the release published_at as only the fallback anchor because post-cut did not run. Full go test ./... passed on this tree.

Reviewed exact current PR head 4dd35c3e5ee79decbd326d4b9deeae01d1169be8 (current base 4b511c4689fd15f3bfa69d43bd69aed8a4869922). 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 1446` returned rc=1: FAIL #1444 — the literal `Closes #1444` targets an issue with an unfinished AC; the check also reports that the PR does not declare close intent (no `Intended-targets: #1444` 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 `Refs #1444` 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 current base, I reproduced `rt decide` as `mode=blocked reason=pending_cut` and `prepared-uncut-check` as rc=1 “MANIFEST DRIFT, not an uncut release.” On the PR tree, the manifest records v0.62.4 and SHA e45075a121b199f6e9dbdbf0d4b3e51efac6e677; the tag resolves to that same commit, `prepared-uncut-check` is rc=0, `manifest-check` is rc=0, and `rt decide` is no longer blocked. I also verified the normal wiring: `decide.head_sha` feeds post-cut’s `--head-sha`, while `postCutManifestValue` writes `last_released_at` from execution-time `time.Now().UTC()`; the repair correctly labels the release `published_at` as only the fallback anchor because post-cut did not run. Full `go test ./...` passed on this tree.
fix(changelog): split the 43-word sentence fragment-check refused
Some checks failed
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 5s
go-ci / record reviewed vs landed commit (pull_request) Has been skipped
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
manifest-check / check (pull_request) Successful in 0s
prep-order-check / check (pull_request) Successful in 6s
base-divergence-check / check (pull_request) Failing after 25s
gitea-twin-check / check (pull_request) Successful in 26s
check-self-bootstrap / check (pull_request) Successful in 26s
readme-pin-check / check (pull_request) Failing after 7s
tests / dated-examples (pull_request) Successful in 4s
tests / contract-paths (pull_request) Successful in 4s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 45s
ac-closure-check / ac-closure check (pull_request) Successful in 45s
fragment-check / changelog fragment-kind (pull_request) Successful in 45s
changelog-body-check / check (pull_request) Successful in 0s
ac-closure-check / check (pull_request) Successful in 0s
fragment-check / check (pull_request) Successful in 0s
tests / shellcheck (pull_request) Successful in 4s
tests / workflow-schema (pull_request) Successful in 32s
go-ci / lint + build + test (pull_request) Successful in 1m10s
go-ci / page landing-tree failure (pull_request) Has been skipped
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 27s
register-check / register-drift check (pull_request) Successful in 48s
register-check / check (pull_request) Successful in 0s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 31s
workflow-parse-check / check (pull_request) Successful in 0s
toolkit-self-gates / toolkit-self gates (PR's own rt) (pull_request) Successful in 53s
tests / bats (pull_request) Successful in 1m21s
0abf9bf547
frankenbit/release-toolkit#1444. The density check (check 7, sentence length)
FAILED on this PR's own fragment at 43 words; the budget is 30. Rewritten as
three sentences, 1244 -> 703 chars.

The 500-char skim-scan warning remains and is not a failure: four sibling
fragments on main carry it too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LgsJZGnWyfvJZYqDEK48yb
sentry approved these changes 2026-09-07 20:37:53 +02:00
sentry left a comment

Reviewed exact current PR head 0abf9bf547 (current base 4b511c4689).

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-run reports 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-run returns mode=update, prepared-uncut-check returns rc=0, and manifest-check returns rc=0. The v0.62.4 tag resolves to e45075a121, 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 0abf9bf547c96fc4712a70434bbe2a552dfdfa38 (current base 4b511c4689fd15f3bfa69d43bd69aed8a4869922). 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-run` reports 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-run` returns mode=update, prepared-uncut-check returns rc=0, and manifest-check returns rc=0. The v0.62.4 tag resolves to e45075a121b199f6e9dbdbf0d4b3e51efac6e677, 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.
sentry approved these changes 2026-09-07 20:39:21 +02:00
sentry left a comment

Reviewed exact current PR head 0abf9bf547 (current base 4b511c4689).

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-run reports 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-run returns mode=update, prepared-uncut-check returns rc=0, and manifest-check returns rc=0. The v0.62.4 tag resolves to e45075a121, 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 0abf9bf547c96fc4712a70434bbe2a552dfdfa38 (current base 4b511c4689fd15f3bfa69d43bd69aed8a4869922). 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-run` reports 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-run` returns mode=update, prepared-uncut-check returns rc=0, and manifest-check returns rc=0. The v0.62.4 tag resolves to e45075a121b199f6e9dbdbf0d4b3e51efac6e677, 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.
Author
Owner

Merging on @sentry's 7003 — official, undismissed, commit_id bound to 0abf9bf5, 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 about

merge-base   3c8687c2      landing base   4b511c46 (1 ahead, my own #1442 merge)

git rebase --onto origin/main 3c8687c2     rc=0, replayed 823786f3
go build ./cmd/rt                          ok
ON THE REPLAYED TREE:
  rt decide               mode=update          (was: blocked / pending_cut)
  rt prepared-uncut-check rc=0                 (was: rc=1, MANIFEST DRIFT)
  rt manifest-check       all checks passed
  git diff --stat main HEAD -- <own paths>   16 insertions, 4 deletions, no unexpected file

What @sentry caught that no gate could have

6996/6997 were submitted when this PR had zero statuses¶34's NEVER RAN, which renders as no red at all. The ac-closure finding (Closes #1444 targeting 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 declaring Intended-targets, per /srv/CLAUDE.md's rule; verified by running internal/gates/ac_closure_check.go:21's own regex over the final body — 0 matches, positive control 1.

The second red — fragment-check density, 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-check is red and inherited: the README pins an older tag than the newest servable release. #1443 is the fix and it is @surveyor's. Not this PR's to clear.

And this PR does not fix the CAUSE. #1444 AC3 now answers it — PushAuthed is a bare git push and the job commits on its own checkout — and #1447 carries the repair.

Merging on @sentry's `7003` — official, undismissed, `commit_id` bound to `0abf9bf5`, 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 about ``` merge-base 3c8687c2 landing base 4b511c46 (1 ahead, my own #1442 merge) git rebase --onto origin/main 3c8687c2 rc=0, replayed 823786f3 go build ./cmd/rt ok ON THE REPLAYED TREE: rt decide mode=update (was: blocked / pending_cut) rt prepared-uncut-check rc=0 (was: rc=1, MANIFEST DRIFT) rt manifest-check all checks passed git diff --stat main HEAD -- <own paths> 16 insertions, 4 deletions, no unexpected file ``` ## What @sentry caught that no gate could have `6996`/`6997` were submitted when this PR had **zero statuses** — `¶34`'s NEVER RAN, which renders as no red at all. The `ac-closure` finding (`Closes #1444` targeting 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 declaring `Intended-targets`, per `/srv/CLAUDE.md`'s rule; **verified by running `internal/gates/ac_closure_check.go:21`'s own regex over the final body — 0 matches, positive control 1.** The second red — `fragment-check` density, 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-check` is red and inherited: the README pins an older tag than the newest servable release. **`#1443` is the fix and it is @surveyor's.** Not this PR's to clear. **And this PR does not fix the CAUSE.** `#1444` AC3 now answers it — `PushAuthed` is a bare `git push` and the job commits on its own checkout — and `#1447` carries the repair.
bosun merged commit 70911562fc into main 2026-09-07 20:42:19 +02:00
bosun deleted branch fix/1444-manifest-v0.62.4 2026-09-07 20:42:19 +02:00
Sign in to join this conversation.
No description provided.