chore(workflows)!: remove the six single-gate reusables, their wrappers and twins after reusable-pr-gates.yml lands, and cut the next minor #1542

Closed
opened 2026-10-04 10:53:57 +02:00 by claude · 1 comment
Member

Part of #1530. Depends on #1539 (ADR accepted), #1541 (reusable-pr-gates.yml on main), and the live probe of the adopter path in frankenbit/tmux-tell#963 on pr-gates@v0.66.0.

Cut order (operator decision, 2026-10-05). v0.66.0 (#1549) ships reusable-pr-gates.yml ALONGSIDE the old reusables, so adopters can migrate before anything is removed. tmux-tell migrates first, and its job log is read. This removal then ships in v0.67.0.

Why

Once adopters can call reusable-pr-gates.yml, the six single-gate reusables, their wrappers and their twins are duplicate surface: every gate change would land in two places. Old tags keep working, so the removal breaks no adopter until it bumps its pin.

Measured at origin/main e5fcf1d, with branch protection read live on 2026-10-04

  • Six gate reusables: reusable-manifest-check.yml, reusable-changelog-fragment-check.yml, reusable-changelog-body-check.yml, reusable-register-check.yml, reusable-ac-closure-check.yml and reusable-workflow-parse-check.yml.

  • Six toolkit-self wrappers call them, and six Gitea twins mirror them. gitea_twin.go fails on an orphan twin, so all of them go in one PR.

  • 14 of the 25 required checks on main come from these six wrappers:

    • ac-closure-check, changelog-body-check, manifest-check and register-check: 2 each;
    • fragment-check and workflow-parse-check: 3 each.

    One of the three workflow-parse-check contexts is the toolkit-self parse guard. Whether it goes depends on where #1541 moves it.

  • A reusable called from a wrapper posts two contexts: the caller job and the reusable's job. So pr.yml adds two contexts, not one.

Plan

  1. Swap the required checks. Before the merge, and after approving this PR, the operator removes the contexts above and requires the PR-gates context or contexts named by ADR-0013 D3 (the caller job's status from pr.yml). They have reported on every PR since #1541 merged, so no PR is left waiting.
  2. Delete:
    • the 6 wrappers, the 6 reusables and the 6 twins;
    • the stale pre_push.go rows.
  3. Update the lists and docs: the bake, compose and C3 lists, docs/, examples/ and the README.
  4. Add a removed fragment with a BREAKING CHANGE line that names the renamed checks and the migration (#1479).
  5. Cut the next minor, v0.67.0. Adopters no longer wait for it: they migrate at v0.66.0 or later.

Acceptance criteria

  • The required-check swap names the exact PR-gates context or contexts (caller job, reusable job, or both, per ADR-0013 D3: the caller job's status), and leaves no PR waiting on a check that no longer reports. — DONE @ #1552 (0de3876, reviewed as 0de3876, review 7255). The operator swapped them before the merge. Read back: main requires exactly go-ci / lint + build + test, pr / gates, tests / bats, tests / checks and toolkit-self-gates / toolkit-self gates (PR's own rt), each with (pull_request). That is 5, down from 18.
  • The six gate reusables, their wrappers and their twins are gone. The C3 contract, the bake and compose lists, pre_push.go, docs/, examples/ and the README agree. — DONE @ #1552 (0de3876, reviewed as 0de3876, review 7255). The reviewer verified that C3 no longer lists the six, that the examples and docs/integration.md carry the pr.yml recipe, and that pre_push.go matches the post-swap set.
  • The fragment carries a BREAKING CHANGE line naming the renamed checks (#1479). — DONE @ #1552 (0de3876, reviewed as 0de3876, review 7255). The fragment's summary line carries the migration, since only summaries render (#854). The BREAKING CHANGE: text is in the fragment body and the commit footer. rt decide --dry-run gives a major bump, downgraded to minor: v0.67.0.
  • Toolkit-self's jobs and required checks per PR, measured on the live forge after the merge from task timings and job logs, match the count ADR-0013 implies. — DONE @ #1552 (0de3876, reviewed as 0de3876, review 7255). Measured from /actions/tasks on the first toolkit-self PR after the merge, rolling PR #1553 (head 901c9fc), counting jobs that ran at least 1 s and leaving out the 0 s caller rows as #1530 did: 8 jobs, 114 s summed, 122 s wall clock, 5 required checks. The baseline (#1540) was 22 jobs, 181 s and 207 s.
    • With the parse gate inside pr.yml: at most 8 jobs and 6 required checks.
    • A separate parse workflow adds two contexts and its own job or jobs. The ADR and this measurement give the exact count.
  • The cut containing the removal (v0.67.0) has shipped, and its tag is recorded on #1530. — DONE: v0.67.0 was cut from rolling PR #1553, which landed as 901c9fc with cut review 7260 and Alex's approval 7259. The tag points at 8e59136. Its release carries rt-linux-amd64, checksums.txt and checksums.txt.minisig: sha256 caecc117… matches, and the trusted comment reads tag:v0.67.0 file:checksums.txt. All 8 remaining reusables are baked to v0.67.0, and none of the six removed ones is in the tag. Recorded on #1530.
  • These stay unchanged: fork-pr-approval-notice, recover-pending-cut, the release/release-cut split, and the scheduled, release and dispatch workflows. — DONE @ #1552 (0de3876, reviewed as 0de3876, review 7255). git diff 6172d9f 0de3876 is empty for fork-pr-approval-notice.yml, recover-pending-cut.yml and its reusable, release.yml, release-cut.yml, reusable-release.yml, prepared-uncut-check.yml, mirror-drift-check.yml, goreleaser.yml and mirror-release.yml.
Part of #1530. Depends on #1539 (ADR accepted), #1541 (`reusable-pr-gates.yml` on `main`), and the live probe of the adopter path in frankenbit/tmux-tell#963 on `pr-gates@v0.66.0`. **Cut order (operator decision, 2026-10-05).** v0.66.0 (#1549) ships `reusable-pr-gates.yml` ALONGSIDE the old reusables, so adopters can migrate before anything is removed. tmux-tell migrates first, and its job log is read. This removal then ships in v0.67.0. ## Why Once adopters can call `reusable-pr-gates.yml`, the six single-gate reusables, their wrappers and their twins are duplicate surface: every gate change would land in two places. Old tags keep working, so the removal breaks no adopter until it bumps its pin. ## Measured at origin/main `e5fcf1d`, with branch protection read live on 2026-10-04 - **Six gate reusables:** `reusable-manifest-check.yml`, `reusable-changelog-fragment-check.yml`, `reusable-changelog-body-check.yml`, `reusable-register-check.yml`, `reusable-ac-closure-check.yml` and `reusable-workflow-parse-check.yml`. - **Six toolkit-self wrappers** call them, and **six Gitea twins** mirror them. `gitea_twin.go` fails on an orphan twin, so all of them go in one PR. - **14 of the 25 required checks on `main` come from these six wrappers:** - `ac-closure-check`, `changelog-body-check`, `manifest-check` and `register-check`: 2 each; - `fragment-check` and `workflow-parse-check`: 3 each. One of the three `workflow-parse-check` contexts is the toolkit-self parse guard. Whether it goes depends on where #1541 moves it. - **A reusable called from a wrapper posts two contexts:** the caller job and the reusable's job. So `pr.yml` adds two contexts, not one. ## Plan 1. **Swap the required checks.** Before the merge, and after approving this PR, the operator removes the contexts above and requires the PR-gates context or contexts named by ADR-0013 D3 (the caller job's status from `pr.yml`). They have reported on every PR since #1541 merged, so no PR is left waiting. 2. **Delete:** - the 6 wrappers, the 6 reusables and the 6 twins; - the stale `pre_push.go` rows. 3. **Update the lists and docs:** the bake, compose and C3 lists, `docs/`, `examples/` and the README. 4. **Add a `removed` fragment** with a `BREAKING CHANGE` line that names the renamed checks and the migration (#1479). 5. **Cut the next minor, v0.67.0.** Adopters no longer wait for it: they migrate at v0.66.0 or later. ## Acceptance criteria - [x] The required-check swap names the exact PR-gates context or contexts (caller job, reusable job, or both, per ADR-0013 D3: the caller job's status), and leaves no PR waiting on a check that no longer reports. — DONE @ #1552 (`0de3876`, reviewed as `0de3876`, review 7255). The operator swapped them before the merge. Read back: `main` requires exactly `go-ci / lint + build + test`, `pr / gates`, `tests / bats`, `tests / checks` and `toolkit-self-gates / toolkit-self gates (PR's own rt)`, each with `(pull_request)`. That is 5, down from 18. - [x] The six gate reusables, their wrappers and their twins are gone. The C3 contract, the bake and compose lists, `pre_push.go`, `docs/`, `examples/` and the README agree. — DONE @ #1552 (`0de3876`, reviewed as `0de3876`, review 7255). The reviewer verified that C3 no longer lists the six, that the examples and `docs/integration.md` carry the `pr.yml` recipe, and that `pre_push.go` matches the post-swap set. - [x] The fragment carries a `BREAKING CHANGE` line naming the renamed checks (#1479). — DONE @ #1552 (`0de3876`, reviewed as `0de3876`, review 7255). The fragment's summary line carries the migration, since only summaries render (#854). The `BREAKING CHANGE:` text is in the fragment body and the commit footer. `rt decide --dry-run` gives a major bump, downgraded to minor: v0.67.0. - [x] Toolkit-self's jobs and required checks per PR, measured on the live forge after the merge from task timings and job logs, match the count ADR-0013 implies. — DONE @ #1552 (`0de3876`, reviewed as `0de3876`, review 7255). Measured from `/actions/tasks` on the first toolkit-self PR after the merge, rolling PR #1553 (head `901c9fc`), counting jobs that ran at least 1 s and leaving out the 0 s caller rows as #1530 did: **8 jobs, 114 s summed, 122 s wall clock, 5 required checks**. The baseline (#1540) was 22 jobs, 181 s and 207 s. - With the parse gate inside `pr.yml`: at most 8 jobs and 6 required checks. - A separate parse workflow adds two contexts and its own job or jobs. The ADR and this measurement give the exact count. - [x] The cut containing the removal (v0.67.0) has shipped, and its tag is recorded on #1530. — DONE: v0.67.0 was cut from rolling PR #1553, which landed as `901c9fc` with cut review 7260 and Alex's approval 7259. The tag points at `8e59136`. Its release carries `rt-linux-amd64`, `checksums.txt` and `checksums.txt.minisig`: sha256 `caecc117…` matches, and the trusted comment reads `tag:v0.67.0 file:checksums.txt`. All 8 remaining reusables are baked to `v0.67.0`, and none of the six removed ones is in the tag. Recorded on #1530. - [x] These stay unchanged: `fork-pr-approval-notice`, `recover-pending-cut`, the `release`/`release-cut` split, and the scheduled, release and dispatch workflows. — DONE @ #1552 (`0de3876`, reviewed as `0de3876`, review 7255). `git diff 6172d9f 0de3876` is empty for `fork-pr-approval-notice.yml`, `recover-pending-cut.yml` and its reusable, `release.yml`, `release-cut.yml`, `reusable-release.yml`, `prepared-uncut-check.yml`, `mirror-drift-check.yml`, `goreleaser.yml` and `mirror-release.yml`.
Author
Member

Closing by hand: all six acceptance criteria are ticked.

  • Landed: #1552, fast-forwarded to 0de3876018392134d38dfda82ac1b35bcdcfb7be, which is exactly the reviewed head. Alex merged it on 2026-10-05 at 23:50, right after he swapped the required checks, and the head branch is deleted.
  • Review: 7255 from the reviewer session (verdict APPROVE at 0de3876, posted as a COMMENT), plus Alex's approval.
  • Protection, read back: main requires 5 contexts (go-ci, pr / gates, tests / bats, tests / checks, toolkit-self-gates), down from 18.
  • Measured on the first toolkit-self PR afterwards (#1553): 8 jobs, 114 s summed, 122 s wall clock.
  • Cut: v0.67.0 (#1553, cut review 7260). The tag is at 8e59136, and the assets and signature are verified. The mirror to gitea.com is dispatched, and its read-back will go on #1348.
  • Follow-ups filed along the way: #1550 (runner cost of the cache save and of the skipped split jobs), #1551 (changelog_body upgrade notes), #1554 (### Upgrade stays empty on a breaking release).
Closing by hand: all six acceptance criteria are ticked. - **Landed:** #1552, fast-forwarded to `0de3876018392134d38dfda82ac1b35bcdcfb7be`, which is exactly the reviewed head. Alex merged it on 2026-10-05 at 23:50, right after he swapped the required checks, and the head branch is deleted. - **Review:** 7255 from the reviewer session (verdict APPROVE at `0de3876`, posted as a COMMENT), plus Alex's approval. - **Protection, read back:** `main` requires 5 contexts (`go-ci`, `pr / gates`, `tests / bats`, `tests / checks`, `toolkit-self-gates`), down from 18. - **Measured** on the first toolkit-self PR afterwards (#1553): 8 jobs, 114 s summed, 122 s wall clock. - **Cut:** v0.67.0 (#1553, cut review 7260). The tag is at `8e59136`, and the assets and signature are verified. The mirror to gitea.com is dispatched, and its read-back will go on #1348. - **Follow-ups filed along the way:** #1550 (runner cost of the cache save and of the skipped split jobs), #1551 (changelog_body upgrade notes), #1554 (`### Upgrade` stays empty on a breaking release).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
frankenbit/release-toolkit#1542
No description provided.