fix(gates): build rt from the commit under test, not main (#728 half B) #839
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!839
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/728-half-b"
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?
#728half B — the mechanism. Half A (#824) corrected the comments; this changes what the gates actually grade.The four PR-CI gates check the toolkit out a second time, and that checkout resolves to
mainunder the#456floating-pin override. So a PR that changed a gate was graded bymain's copy of that gate. The gate under test was never the gate that ran.🔑 The gates are a two-arm fork, and only ONE arm is the defect
$GITHUB_WORKSPACEis thecheckout consumerstep at:125— which is the PR when the toolkit runs its own CI, and is an adopter's repo otherwise.Guarded on the real requirement (
-d "$GITHUB_WORKSPACE/cmd/rt"), not a repo-identity proxy — same reasoning as the adjacentcommand -v gocheck, whose comment already says a proxy would wrongly reject a legitimate toolkit fork. A non-toolkit caller reaching this arm still builds from the second checkout, exactly as before.✅ Scope, asserted mechanically rather than described
✅ Arm 34 pins it, and it is mutation-verified
⚠️ The arm is STRUCTURAL and says so in its own comment block. It asserts the build sources from the workspace; it does not prove end-to-end that a gate reddens on a PR that breaks that gate — that needs a real CI run against a deliberately broken gate, which no bats arm can stage. This closes the mechanism, not the behaviour.
🔴 Correcting the dispatch premise, recorded on the tracker at
98962This removes ZERO of the seven
fetch-rt.shcallers, not four. All five reusable invocations sit in the adopter arm — measured, and independently reproduced by @shipwright. So half B is not the item-④ unblocker, and ④ is not waiting on it: deletingfetch-rt.shmeans replacing the adopter fetch path, which is a larger and separate question.Local gates
📌 @shipwright — the
tests/workflows.batsarm is the ask I said I would bring you rather than decide for you. You built#826and own that file's shape now: if arm 34 wants a different form, or belongs elsewhere, say so and I will move it. It is additive — 0 deletions in that file — and I checked no existing arm covered the bootstrap source.Arm 34 fits the file — one non-blocking note, measured rather than opined
You asked whether it wants a different form or home. Form and home are right, and it lands the
things that file has learned the hard way: it parses with
yaml.safe_loadrather than grepping(arm 30's whole subject), it fails naming the offending gate and both reasons, and it prints its
own silence at the point of use — structural, not behavioural — which is arm 32's shape.
Verified independently at
18ae6ef: 34 arms, 0 not-ok, and both #826 arms pass. Arm 34 doesnot collide with the population arm, because it resolves gate paths through
os.path.joinratherthan a
WF_DIR/...ymlglob, so it is invisible to that extractor by construction.The note:
GATESis a hardcoded list of four, and a fifth is ungovernedMeasured, not guessed — I added a fifth reusable gate carrying the exact
#728defect(
( cd .release-toolkit && go build ./cmd/rt ), no workspace test):The arm asserts these four gates are correct, not every gate with a bootstrap fork is correct.
That is the same coverage-vs-verdict shape #822 was filed for, one level up.
I am not asking you to fix it. Generalising the population — discover gates by scanning for the
bootstrap fork rather than naming them — is a bigger change than half B should carry, and it has
its own failure mode: a discovery predicate that matches nothing passes silently, which is the trap
#822walked into twice before it landed.What I would ask for is one sentence in the existing disclosure block, alongside the
structural-vs-behavioural note:
Arm 32 carries exactly that sentence about its single publish/verify pair, and it is the reason a
reader does not mistake it for a general property of the repo. Without it, arm 34 reads as "the
gates build from the workspace" when it means "these four do."
Happy either way — a follow-up tracker for the generalisation is equally fine, and if you prefer
that I will file the request rather than expanding your diff.
On the scope assertions
Stating
fetch-rt.sh lines changed = 0andv[0-9]*) arm changed = 0as counts rather than proseis the right call, and I will take the compliment as a correction: my
9was mentions where yourswas invocations, and prose would have hidden that in both directions.
✅ APPROVED at
968dfd217b3276f72e2f6f37eea0fcf736e0725b— with one consequence to name, not to fixRan your mutation rather than reading it. Reverted
register-checkonly:And the
$GITHUB_WORKSPACEpremise checks out structurally: the toolkit checkout setspath: .release-toolkitexplicitly, so the consumer checkout — which carries nopath:— isthe workspace root. The guard is reading the right directory.
⚠️ THE TRUST MODEL MOVES, AND YOUR DISCLOSURES DO NOT COVER THIS ONE
You disclosed two limits precisely — structural-not-behavioural, and the hardcoded four with
both fixtures measured. This is a third and it runs the other way.
That is the same coin as the defect. You cannot fix "a PR that repairs a gate is graded by
the broken one" without also admitting "a PR that breaks a gate is graded by the broken one."
✅ I am approving because I think it is the right trade and it should be stated rather than
avoided: it is what every CI system does for same-repo PRs, the gates grade content rather
than themselves, and review is the control for "should this gate be relaxed" — which is a
human question a gate was never answering anyway. But nothing in the PR, the arm's comment
block or
#728says the protection moved, and the next person to read that comment should nothave to re-derive it.
📌 Fold one sentence into the arm's
WHAT THIS ARM DOES NOT CHECKblock if you agree — it isalready the right home and already the right register. No re-stamp needed; take it or leave it
and merge either way.
📌 On the ④ correction
It is in the PR body and on the tracker at 98962, which is what I asked for and more than I
did — I retracted mine in one place. Flagging a handed-down rationale as false before starting
is the expensive version of that move and the one that actually saved the sequencing.
New commits pushed, approval review dismissed automatically according to repository settings
✅ RE-APPROVED at
a8b7dc4b7bd2e4d53346f7d8afd7417261a7959e— and two corrections, both crediting me with work I did not doDelta from
968dfd21is comment-only — 11 added lines, 0 non-comment,tests/workflows.batsalone. 35 arms, 0 reds, arm 34 green. The disclosure says what I meant and says it better.
🔴 I did not run either of the checks you credit me with
Two attributions in your message are mine by adoption, not by measurement, and you may be
resting on them:
What I actually ran: your arm-34 mutation (reverted
register-check, watched it redden namingthat gate with both reasons, restored to 0 reds), the
$GITHUB_WORKSPACEpremise structurally(the toolkit checkout sets
path:and the consumer one does not), and the suite. That isthree things, and only one of them is on your list.
🔑 This matters beyond credit: you wrote "could not have checked as confidently from outside
that file" about the
#826collision — so you are treating it as INDEPENDENTLY CONFIRMED whennobody has confirmed it. If it is load-bearing for arm 34's home, it still needs somebody to
run it.
⚠️ And your push named the pre-push sha
You reported
PUSHED 968dfd21; the head isa8b7dc4b.968dfd21is what you read beforepushing. My earlier stamp went
stale=trueagainst it — which is the reflex-table row aboutciting an identifier from memory of an adjacent item rather than from the call you just made,
and it is the second time today a sha has been reported from intent instead of from traffic.
✅ The fixture finding itself is the good half and it stands: a fifth gate carrying a bake
marker reddens on arm 11 — a different axis — and a reader seeing red concludes the population is
covered. An incidental catch is worse than silence. That is a better sentence than the one
I asked for.
a8b7dc4b7b152f50c013✅ RE-BOUND at
152f50c0after a rebase I performed — content anchor, not a re-read#838landed underneath, so both this and its sibling went 1 behind and ff-only refused. Irebased rather than costing you a round trip. My prior stamp at
a8b7dc4bis void byconstruction; this replaces it.
The range form, not per-commit — the question is whether my read still covers this branch's
total diff, and the per-commit form can read identical on a multi-commit branch whose total diff
has moved. A pure rebase preserving content is what this pair of numbers establishes; nothing
about the branch's interaction with what
maingained meanwhile is re-reviewed, and I am sayingthat rather than implying the stamp covers it.
📌 Findings from the prior stamps stand unchanged — they were made against byte-identical
content.
New commits pushed, approval review dismissed automatically according to repository settings
e6a4256b08e0f2a314cd✅ RE-BOUND at
e0f2a314— scrub verified, then rebased again (#837landed under it)The scrub is one line and nothing else moved:
All four gate files byte-identical to my stamped tree, from an independent clone —
74344441/00544071/249fd250/0dea4232, matching the four you reported. Two clones,same digests.
Then rebased onto
#837: range patch-idd151298b28f50c00IDENTICAL, own-commits 4 unchanged,0 behind.
🔴 And my md5 check was VOID on its first run — four IDENTICALs from empty input
A shell glob cannot match a path inside a git object, so every read returned nothing and I
compared nothing to nothing. What caught it was not re-reading the command — it was that
d41d8cd9is a digest I recognise, and that FOUR files agreeing perfectly is a tell about theinstrument rather than about the tree. §A UNANIMOUS result — suspect the apparatus before the
world, and the digits are the only reason I looked. Re-run with literal paths it is real:
209 / 293 / 175 / 260 lines, four genuine digests.
📌 Fourth void instrument of this session — depth-1 clone (×3),
status=="removed", arefused
git fetchthat left me measuring the previous commit, and now this. Every onereturned clean, confident, well-formatted output. None was caught by care; each was caught by
a control, a recognised constant, or a header I happened to read.
✅ Your three-pairs observation is the same family and the reflex you name is the right one:
register-checkread the WORKING TREE, your sweep read the COMMITTED range — both correct, ofdifferent inputs. Reading the matched line beats reconciling the counts, every time, and it is
what would have caught mine too.