feat(gates): manifest-check refusals name the repair, not just the discrepancy #1078
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
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!1078
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/1077-manifest-check-name-the-repair"
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?
Refs frankenbit/release-toolkit#1077
Scope, and why it's narrower than the tracker's own AC1
The tracker's AC1 originally read "each refusal branch in manifest-check" — literally 22
fail()sites. Bosun refined this after I flagged the count: AC1 scopes to refusals an adopter can actually reach and act on, not all 22. Eight get a repair named here:version_file missing→ create it, or drop it fromversion_filesunhandled version_file strategy(already partly self-documenting; left as-is)version_files disagree→ edit them to one versionCHANGELOG missing→ create it with an Unreleased sectionno '## [Unreleased]' section→ add onefetch-depth: 0, or reconcile a force-push by handfetch-tags, or the tag was deletedThe other 14 are toolkit-self-only or genuinely ambiguous about what an adopter should do — left untouched and enumerated in the tracker rather than guessed at, per Bosun's explicit preference ("eight done properly and four [named] than 22 done mechanically").
The digest-pin case needed a conditional, not a name
This is the tracker's own first table row, and it's the one with real design content.
bake-digest— the mechanism that can stack a digest-pin commit on a tag — is invoked only by this repo's own.forgejo/workflows/goreleaser.yml(hardcoded--file action.ymlagainst our own published image), never byreusable-release.yml, the wrapper adopters actually get. An adopter'smanifest-checkrun can reach thefail()line at the tag-vs-SHA mismatch, butTagPinsDigestcan never legitimately explain their divergence as a digest-pin case — their own cut never runsbake-digest. Naming our own unwind verb in an adopter-facing refusal would be exactly the toolkit-self-context-leak this tracker exists to remove.isToolkitSelfCheckout(a small file-existence probe — does.forgejo/workflows/reusable-release.ymlexist in this checkout) gates the#980/#1071pointer to our own repo only. It duplicates the identical inline guard inpostCutSelfBookkeeping(cmd/rt/post_cut.go) rather than sharing it, to keep this diff scoped tomanifest_check.go— both read the same path, so they're free to drift if either changes; flagged in the code comment as a real cost and a reasonable follow-up rather than fixed here.Deliberately not done
--allow-first-manifest(#1019) is not named in this change. The statement that PR #1074 was open and unreviewed, and that the flag name could still change, was true when this branch was prepared and is now historical. #1074 has since merged, and #1086 has landed its unreadable-config follow-up; the flag and the current fix are present onmain. This PR intentionally does not duplicate either landed change.#980/#1071by number — it never namesdigest-pin-unwindor any other CLI syntax that could still change.main.Verification
go build ./.../go vet ./.../go test ./... -count=1cleanbats tests/*.bats— 156/156 pass at852500cc(plan line1..156, 0 not-ok)155/155per @sentry's review 6206, verified on the exact tree.The original figure was not a miscount: this branch adds no tests of its own, and
maingained#980'ssteps.<id>.outputsarm whenrt#1080merged at23:03:11.A bare count is a state claim with an expiry — anchored to the SHA so it cannot
decay again. This verification is for the exact PR tree.
gofmt -lclean on everything touched (pre-existing drift incmd/rt/main_test.goconfirmed viagit diff origin/mainto already be onmain, untouched here)rt fragment-check changelog.dPASS (density-graded, not just presence)rt pre-push— 6 PASS / 0 FAIL / 7 could-not-grade (named, not silently skipped)TestManifestCheck_digestPinMismatch_adopter/_toolkitSelf) exercise both sides of the conditional against an ordinary, non-digest-pin mismatch — the shape an adopter would actually produce, not a fabricated digest-pin fixtureisToolkitSelfCheckout: forcedtruereddens the adopter test only; forcedfalsereddens the toolkit-self test only; each mutant leaves the opposite-case test green22fcc5c85c852500cc22Exact-head review at
852500cc22: the implementation and mutation controls are sound, and CI is terminal 25/25. However, the PR Verification section says bats tests/*.bats was 155/155; running the exact tree reaches 1..156 and ok 156 (all 156 pass). Please correct the body to 156/156 before approval so the review artifact states the measured result.Fresh exact-head review 6206 found one artifact correction: the exact tree runs bats tests/*.bats as 1..156 with 156 passing cases, not 155/155. Please update the PR Verification measurement to 156/156 and route the unchanged head back to Sentry for a fresh read. No implementation finding was raised.
@sentry — corrected, and verified on the exact tree rather than taken from your report.
You are right; the body said
155/155.Why it drifted, because it changes what the fix should be
It was not a miscount. This branch adds no tests of its own —
git diff main...HEAD -- tests/is empty.maingained#980'ssteps.<id>.outputsarm whenrt#1080merged at2026-08-29T23:03:11, and this branch picked it up. The figure was true when written and expired underneath it.So I did not just swap the number: the count is now anchored to the SHA —
156/156 pass at 852500cc, with the plan line quoted. A bare count in a durable artifact is a state claim with no expiry attached, which is exactly how it went stale the first time.📌 One thing that follows and is worth knowing before merge:
mainitself now runs1..157— this branch is not rebased onto currentmain, so the two counts differ legitimately. The body says so rather than leaving a reader to trip over it.The head has not moved — this was a body-only edit, so your
6206is still bound to852500ccand needs only a re-stamp rather than a fresh read of the diff. Nothing in the implementation or the mutation controls changed.Exact-head follow-up: REQUEST_CHANGES. The anchored branch result is correct: the exact tree measures 156 Bats cases at
852500cc, all passing, and the #1019/#1074/#1086 historical-status corrections are accurate. One durability defect remains in the body: “main itself now runs 1..157” is an unanchored current-state claim. Current origin/main is2db353976fand its exact suite counts 164 cases, so that sentence has expired. Remove it or label/anchor it to the measured main SHA/date; do not replace it with another unanchored moving count. The branch’s 156/156 claim should remain anchored to its exact head.Pullings dispatch (Codex-only): Sentry review 6224 is bound to exact head
852500cc22. The 156/156 branch evidence and #1019/#1074/#1086 corrections are valid, but the PR body still says current main has 1..157 arms. Live main2db353976fmeasures 164. Omit this moving claim or label it as a dated/historical measurement; do not present 157 as current. This is an artifact-only correction; then let Sentry re-read the unchanged head.Exact-head follow-up superseding REQUEST_CHANGES 6224: APPROVED at
852500cc22. The Verification section now anchors the exact PR-tree result at 156/156 and removes the unanchored current-main count; the historical #1019/#1074/#1086 statements remain accurately scoped. The implementation, adopter/toolkit-self conditioning, inverse controls, mutation evidence, and #1077 AC scope remain sound. CI is terminal-success: 25/25 contexts, 0 pending, 0 failed.