chore(ci): fold tests.yml's four short jobs into one and move four PR-time checks into toolkit-self-gates #1540
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
frankenbit/release-toolkit#1540
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?
Part of #1530. This one needs no ADR and changes nothing for adopters, so it can start first.
Measured at origin/main
e5fcf1d, with branch protection read live on 2026-10-04Each small job costs about 5.5 s, about 87% of it setup (#1530). These toolkit-self PR jobs are each a separate required check on
maintoday:maintodaytests.ymlworkflow-schema,dated-examples,contract-paths,shellcheck(batsstays its own job)check-self-bootstrap.ymlcheck(PR half)gitea-twin-check.ymlcheck(PR half)prep-order-check.ymlcheckreadme-pin-check.ymldigestFolding them removes 7 of the 22 jobs per toolkit-self PR: the four
testsjobs become one, and the other four move intotoolkit-self-gates.This needs its own swap of the required checks. #1530's plan has one admin edit, before PR-D. But this change removes eight required checks, the eight in the table above, and adds
tests / checks. If the old names stay required, every PR after the merge waits for checks that never report.Carry-forward (AGENTS.md section 1; from the plan review, #1530 comment 114846)
Folding jobs drops per-job preconditions unless each one is carried over. These are load-bearing today:
release-prep/skip.check-self-bootstrap.ymlskipsrelease-prep/heads with a job-levelif:.toolkit-self-gateshas no such skip.fetch-depth: 0. It is needed bydated-examples(a shallow clone gets an empty population and refuses), bycontract-pathsand bycheck-self-bootstrap.workflow-schemaandshellcheckuse depth 1.prep-order-checkneedspull-requests: readandFORGEJO_TOKEN.readme-pin-check / digestdeliberately runs with no token. In one job the permissions become the union, so the token-less property must hold at step level.toolkit-self-gatesfires onedited, so the moved checks start re-running on body edits.digestlosesreadme-pin-check'sworkflow_dispatchif it moves.tests / checksonly if the job id ischeckswith no othername:.Plan
tests.yml: onechecksjob runsworkflow-schema,dated-examples,contract-pathsandshellcheckas steps. It takes the build, tree-state and attest guards fromtoolkit-self-gates(#1323).batsstays a separate job, because it is the critical path (about 34 s).toolkit-self-gates.yml: itsgatesjob also runs the PR halves of check-self-bootstrap and gitea-twin-check, plus prep-order-check and readme-pindigest.$RUNNER_TEMP.readme-pin-check / mirrorandbase-divergence-checkstay their own jobs, because advisory checks need their own checks (#1177).Sequencing with #1541: #1541 moves the parse-self mutation control into
tests / workflow-schema. If this issue lands first, that job no longer exists, so the control goes into whichever job runs the workflow-schema step.Acceptance criteria
tests.ymlrunsbatsplus onechecksjob holding the four short checks as steps, with the build, tree-state and attest guards (#1323). — DONE @ #1546 (9968ed4, reviewed as9968ed4). The first push:main run, 19697 job 1, logsattest: all 12 gate steps AND the shared-tree guard ran (13 of 13 ...).toolkit-self-gatesruns the four PR-time checks above as steps, each with a namespaced verdict file. — DONE @ #1546 (9968ed4, reviewed as9968ed4). On the PR head, run 19651 attested 15 of 15.9968ed4, reviewed as9968ed4). Review 7222 diffed every moved step against its source.9968ed4, reviewed as9968ed4). The mutants ran through a local step emulator and the bats arms, not the forge runner. The reviewer reproduced two kills independently (review 7222).tests / checksto add. The operator swaps them at merge, and no PR is left waiting on a check that no longer reports. — DONE @ #1546 (9968ed4, reviewed as9968ed4). Read back live after the merge:mainrequires 18 contexts, includingtests / checks (pull_request)and none of the eight.readme-pin-check / mirrorandbase-divergence-check. — DONE @ #1546 (9968ed4, reviewed as9968ed4). The push halves of check-self-bootstrap and gitea-twin-check ran green on9968ed4(runs 19692 and 19693).9968ed4, reviewed as9968ed4). Measured from/actions/tasks, counting jobs that ran at least 1 s and leaving out the 0 s caller rows, as #1530 did. Before, on #1544's first head3bf6feeon the old main: 22 jobs, 181 s summed, 207 s wall clock. After, on #1544's rebased head5cc3b8con main9968ed4: 15 jobs, 156 s summed, 173 s wall clock. #1546's own head9968ed4: 15 jobs, 152 s, 167 s. That is 7 jobs fewer, as planned, and about 34 s less wall clock per PR.The PR needs a
no-changelogline: this is toolkit-self CI only, and no adopter sees it.Closing this by hand, now that all seven acceptance criteria are ticked.
9968ed4b9e97e4b6b7e361261763520fec82a5d0, exactly the reviewed head. Alex merged it on 2026-10-04 at 11:52. The head branch is deleted.9968ed4, posted as a COMMENT), and Alex's approval on the forge.mainrequires 18 contexts, includingtests / checks (pull_request)and none of the eight removed ones.9968ed4is green.tests / checks(run 19697 job 1) logsPARSED=36 TOTAL=36, the tree unchanged across c1-c12, and attest 13 of 13.rt decidegavemode=noop.release / fire-cutandgo-ci / page landing-tree failure. That is the known skipped-job display.A follow-up for the old g7/g9
command not foundoutput, and for a stale comment inmirror-release.yml, was offered as a separate task. It is not part of this issue.