chore(ci): the shared checkout+build prefix sits in twelve jobs, not five #1304
Labels
No labels
bump
major
bump
minor
bump
patch
kind
bug
kind
chore
kind
docs
kind
epic
kind
feature
loop/paused
mirror-drift
priority
critical
priority
high
priority
low
priority
medium
size
L
size
M
size
S
size
XL
status
blocked
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
frankenbit/release-toolkit#1304
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
The shared checkout+build prefix that
#1253consolidates sits in twelve jobs, not five — the other seven are differently-named contexts and are out of scope there.Requested by @engineer, 2026-09-06, while building
#1297(step 1 of#1253). Filed by @bosun.Measured
#1253's consolidation is correct as scoped: it targets the five identically-named self-gate jobs and reconciles exactly —⚠️ The remaining seven carry the same redundant setup and are not reachable by the same rename, because their contexts differ and are individually required. Consolidating them is a different operation with a different branch-protection cost.
📌 @engineer requested this rather than widening
#1297mid-flight, which was the right call: step 1 of a three-step migration is the worst place to grow scope.What has to be established before anything moves
#1253produced, so "cheaper" is a fact and not a hope#1253's own finding: a consolidatedon:that is the INTERSECTION runs in strictly fewer situations than the jobs it replaces, and no drift arm can see thatRelated
#1253(the five),#1297(step 1),#1177(why every context's required-status is load-bearing)Anchor
@engineer, 2026-09-06. Measured while proving the consolidated job is not a stub — he pushed a deliberate 49-word density break and watched both the incumbent
fragment-checkgate (12:16:24) and the consolidated job (12:17:25) go red.📌 Why that demonstration was necessary is worth carrying here: a consolidated job whose nine gate steps ALL SKIPPED is GREEN too, and this instance exposes no job log — 404 on the API, 307 to a session login on the web route. So he had arithmetic (63s vs 34s) and not an observation, and arithmetic cannot distinguish ran and passed from skipped.
All three "establish before anything moves" items are measured, on
mainat0b1dd496(post-#1253). My recommendation is DO NOT CONSOLIDATE THESE. The duplication worth removing is already gone; what is left is a shared code prefix that is not a shared consolidation opportunity.① The enumeration — and it is 8 now, not 7, which reconciles exactly
The tracker says seven. It is eight because
base-divergence-check.ymllanded during the#1253migration — the same new workflow that made the AC3 timing comparison span two populations.7 + 1 = 8, nothing unaccounted for.② The triggers do NOT form a union a single job can carry — this is the answer to AC2 and it is a no
The five that
#1253consolidated shared one trigger:pull_request,branches: [main], nopaths. These eight span six different trigger sets:🔴
fork-pr-approval-noticeispull_request_targetand must never be merged with apull_requestjob. That is a security boundary, not a scheduling detail:pull_request_targetruns with repository secrets against a fork's base, and merging it into a job that also fires onpull_requestwould hand fork-controlled trigger conditions a job that holds secrets. This one is out on grounds that have nothing to do with cost.A union across the rest would make each job fire on events it does not currently handle —
release,schedule,push— which is strictly more running, not less.#1253's own union finding applies with the sign reversed: there the union was safe because the five differed only intypes; here they differ in events.③ Not worth the churn — and the cost figure that justified
#1253does not transferThe 24s median belonged to the five self-gate jobs, and it was their GATES, not their prefix. Measured per workflow, successful runs:
check-self-bootstrapis the informative row: at a 5s median over 826 runs it is close to pure prefix, so a checkout+build costs ~5s here, not ~24s. Applying the five's rate to this population is exactly the error AC3 made on#1253, one population's number carried onto another.Only two pairs share a trigger set exactly, so only two merges are even available:
~10s and 2 slots, against running the ADD → REQUIRE → REMOVE migration twice more over three required contexts.
#1253took three PRs, a branch-protection edit, an attest mechanism and two ordering corrections to move five jobs safely. That price bought ~96s and 4 slots. This one buys ~10s.⚠️ And consolidation makes WALL-CLOCK worse whenever slots are free
This is the part I had not appreciated before measuring, and it qualifies
#1253as well as this tracker.A consolidated job runs its steps sequentially. Two 26s jobs in parallel finish in ~27s wall; merged, they finish in ~53s.
#1253improved wall-clock anyway (115s → 92s) because the queue was saturated —running=8 waiting=47— so the five were never actually running in parallel.Recommendation
Close as won't-do, or hold it explicitly against a future state where the runner queue is the binding constraint again and a trigger-compatible pair is worth the protection churn. I am not proposing to widen it;
#1253's scoping was right and the remainder is not the same problem wearing a different name.What I would rather spend the effort on is the residual I flagged on
#1320: the nine consolidated gates now share one checkout and one$RUNNER_TEMPwhere they had five, and that they do not collide is an audit I performed, not a property anything enforces. That is a live hazard in code that already shipped, against a hypothetical saving of 10s here.🤖 Generated with Claude Code
https://claude.ai/code/session_01MMmaXmMhZdAAnttWBS6zqa
✅ CLOSING WITH A MEASURED NO. @engineer's recommendation is DO NOT CONSOLIDATE, and all three ACs are answered — two of them in the negative, which is a result rather than an absence of one.
AC1 — enumerated. It is EIGHT, not seven:
base-divergence-checklanded mid-migration, so7 + 1 = 8with nothing unaccounted for.AC2 — NO. The triggers do not form a union a single job can carry.
The eight span SIX different sets. 🔴 And
fork-pr-approval-noticeispull_request_target— a SECURITY boundary, not a scheduling detail. ⚠️ Merging it with apull_requestjob would hand fork-controlled conditions a job holding secrets. That is not a cost to weigh against a saving; it is a reason the merge must not happen.AC3 — NO, and the cost figure I would have used was wrong.
⚠️ That is
#1253's AC3 basis error repeating in a new place, caught before it was acted on this time — a number measured on one population, carried to another where it does not apply.🔑 And a finding that qualifies
#1253itself#1253improved wall-clock only because the queue was saturated atrunning=8 waiting=47. ⚠️ Under an idle queue the same change would have made wall-clock WORSE — nine sequential steps where there were five parallel jobs.📌 So
#1253was right for the conditions it ran in and is not a general rule, and this tracker is the evidence for the boundary. Worth carrying into any future consolidation proposal: measure the queue, not just the jobs.