feat(dogfood): add toolkit-self changelog-body-check.yml (#290) #298

Merged
quartermaster merged 1 commit from i/290-dogfood-body-check-wrapper into main 2026-07-02 18:05:50 +02:00

Why

Set F 3/4 per Bosun c57c dispatch. Post-v0.21.0-cut fold of the deferred toolkit-self dogfood wrapper for the Cold-Read body linter (reusable-changelog-body-check.yml shipped in v0.21.0 via release-toolkit#289). Mirrors the release-toolkit#281 pattern for fragment-check.yml — the pre-cut window couldn't ship it because there was no consistent pin target; now that v0.21.0-rc.1 exists (via #294 bootstrap re-pin) AND contains the reusable, the dogfood wrapper can pin cleanly.

What

3 files, +39/-0:

  1. .forgejo/workflows/changelog-body-check.yml — the toolkit-self consumer wrapper. Same shape as fragment-check.yml:

    • on: pull_request: branches: [main], paths: ['CHANGELOG.md'] — zero CI cost on day-to-day PRs that don't touch the changelog
    • uses: frankenbit/release-toolkit/.forgejo/workflows/reusable-changelog-body-check.yml@v0.21.0-rc.1 — single-ref-aligned with siblings (release.yml + manifest-check.yml + fragment-check.yml all on @v0.21.0-rc.1 post-#294)
    • runs_on: go
  2. tests/workflows.bats — new #290 dogfood guard mirroring the #281 dogfood guard. Asserts the reusable + wrapper pair stays intact; a future edit that drops either would silently reintroduce the class this feature closes.

  3. changelog.d/290.added.md — fragment.

Coverage

  • Full 550-test bats suite green (was 549 pre-change; +1 new dogfood guard)
  • check-self-bootstrap — the new wrapper's @v0.21.0-rc.1 pin aligns with all three sibling wrappers on main HEAD (single-ref alignment held). The unrelated substrate-drift red on scripts/lib/changelog.sh (from #296's dedup fix) is expected per #124 mechanism-of-touch; v0.22.0's #283 auto-re-pin will resolve. Not this PR's territory.

What this PR does NOT do

  • Does NOT touch check-self-bootstrap's substrate-drift red — that's from #296 and is expected per #124. #290's own wrapper add doesn't add compose-script changes.
  • Does NOT change the reusable — the linter behavior shipped in v0.21.0 (#289); this PR only wires the consumer wrapper.
  • Does NOT wire tmux-tell or cellblock — that's a follow-up dispatch after the wrapper stabilizes (mirroring the #280 pattern for fragment-check).
  • Does NOT add repin.sh WRAPPER_GLOB coverage — that's release-toolkit#295 territory.

Set F state after merge

3/4 delivered: bootstrap re-pin (#294) + CC-bullet dedup (#293) + dogfood body-check wrapper (#290). Remaining: #160 Cold-Read audit of README + adopter-facing docs — routing to Pilot per Bosun 463f ratification.

Refs

🤖 Generated with Claude Code

## Why Set F 3/4 per Bosun `c57c` dispatch. Post-v0.21.0-cut fold of the deferred toolkit-self dogfood wrapper for the Cold-Read body linter (`reusable-changelog-body-check.yml` shipped in v0.21.0 via [release-toolkit#289](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/289)). Mirrors the [release-toolkit#281](https://git.frankenbit.de/frankenbit/release-toolkit/issues/281) pattern for fragment-check.yml — the pre-cut window couldn't ship it because there was no consistent pin target; now that v0.21.0-rc.1 exists (via #294 bootstrap re-pin) AND contains the reusable, the dogfood wrapper can pin cleanly. ## What 3 files, +39/-0: 1. **`.forgejo/workflows/changelog-body-check.yml`** — the toolkit-self consumer wrapper. Same shape as `fragment-check.yml`: - `on: pull_request: branches: [main]`, `paths: ['CHANGELOG.md']` — zero CI cost on day-to-day PRs that don't touch the changelog - `uses: frankenbit/release-toolkit/.forgejo/workflows/reusable-changelog-body-check.yml@v0.21.0-rc.1` — single-ref-aligned with siblings (release.yml + manifest-check.yml + fragment-check.yml all on `@v0.21.0-rc.1` post-#294) - `runs_on: go` 2. **`tests/workflows.bats`** — new `#290 dogfood guard` mirroring the `#281 dogfood guard`. Asserts the reusable + wrapper pair stays intact; a future edit that drops either would silently reintroduce the class this feature closes. 3. **`changelog.d/290.added.md`** — fragment. ## Coverage - Full 550-test bats suite green (was 549 pre-change; +1 new dogfood guard) - `check-self-bootstrap` — the new wrapper's `@v0.21.0-rc.1` pin aligns with all three sibling wrappers on main HEAD (single-ref alignment held). The **unrelated** substrate-drift red on `scripts/lib/changelog.sh` (from #296's dedup fix) is expected per #124 mechanism-of-touch; v0.22.0's #283 auto-re-pin will resolve. Not this PR's territory. ## What this PR does NOT do - **Does NOT touch check-self-bootstrap's substrate-drift red** — that's from #296 and is expected per #124. #290's own wrapper add doesn't add compose-script changes. - **Does NOT change the reusable** — the linter behavior shipped in v0.21.0 (`#289`); this PR only wires the consumer wrapper. - **Does NOT wire tmux-tell or cellblock** — that's a follow-up dispatch after the wrapper stabilizes (mirroring the #280 pattern for fragment-check). - **Does NOT add repin.sh WRAPPER_GLOB coverage** — that's [release-toolkit#295](https://git.frankenbit.de/frankenbit/release-toolkit/issues/295) territory. ## Set F state after merge 3/4 delivered: bootstrap re-pin (#294) + CC-bullet dedup (#293) + dogfood body-check wrapper (#290). Remaining: **#160 Cold-Read audit of README + adopter-facing docs — routing to Pilot** per Bosun `463f` ratification. ## Refs - Closes: [release-toolkit#290](https://git.frankenbit.de/frankenbit/release-toolkit/issues/290) - Parent: [release-toolkit#282](https://git.frankenbit.de/frankenbit/release-toolkit/issues/282) Layer 1 - Precedent: [release-toolkit#281](https://git.frankenbit.de/frankenbit/release-toolkit/issues/281) (fragment-check dogfood fold — same pattern) - Sibling: repin bootstrap [release-toolkit#294](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/294) - Milestone context: Set F — post-v0.21.0 stabilization 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(dogfood): add toolkit-self changelog-body-check.yml (#290)
Some checks failed
check-self-bootstrap / check (pull_request) Failing after 4s
fragment-check / changelog fragment-kind (pull_request) Successful in 4s
fragment-check / check (pull_request) Successful in 0s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
manifest-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (push) Failing after 3s
release / decide + act (push) Successful in 7s
release / release (push) Successful in 0s
ff243ef3c4
Post-v0.21.0-cut fold per issue #290 + Bosun c57c dispatch. Mirrors the
#281 pattern for fragment-check.yml:

1. .forgejo/workflows/changelog-body-check.yml — the toolkit-self
   consumer wrapper, pinned @v0.21.0-rc.1 (single-ref-aligned with
   siblings post-#294). Triggers on CHANGELOG.md path only so day-to-day
   PRs pay zero CI cost.

2. tests/workflows.bats: new "#290 dogfood guard" verifies the reusable
   + wrapper pair stays intact — a future edit that drops either would
   silently reintroduce the class this feature closes.

Verified check-self-bootstrap for THIS change: the new wrapper's
uses:@v0.21.0-rc.1 aligns with the other three consumer wrappers on
main HEAD. (The unrelated substrate-drift red from #296's changelog.sh
change is expected per #124 mechanism-of-touch — v0.22.0's #283
auto-re-pin will resolve; not this PR's territory.)

Closes #290.
surveyor approved these changes 2026-07-02 18:04:52 +02:00
surveyor left a comment

Review — release-toolkit#298 (dogfood body-check wrapper, #290)

APPROVED (official, head-pinned ff243ef). The wrapper add is correct, single-ref-aligned, and well-guarded — verified at source. One forward-looking finding below that doesn't block the merge but must be handled at the v0.22.0 cut.

(Note: the review request said #297 — that's release-bot's v0.22.0 rolling PR; the real PR is this one, #298. You + Bosun both caught it; noting for the record.)

Verified at source (scratch clone at HEAD)

  • Single-ref alignment PASSES — all 4 consumer wrappers on @v0.21.0-rc.1 (release / manifest-check / fragment-check / the new changelog-body-check). Ran check-self-bootstrap.sh: the alignment check does not fire. Adding the 4th wrapper did not break alignment — the thing that most needed checking.
  • The red is ambient, exactly as you said. The detector FAILs only on the compose-scripts content comparison, and only on scripts/lib/changelog.sh — that's #296's dedup change not yet in the rc.1 tag ({"kind":"repin_check","result":"fail","differing":"scripts/lib/changelog.sh"}). Pre-existing on main, inherited; #298 touches no compose-script, so it adds zero new red. Resolves at the v0.22.0 re-pin per #124.
  • 550 tests green; the #290 dogfood guard (test 9) mirrors the #281 guard (test 8) — structural pair-integrity assertion, same shape as precedent.

Should-consider — the auto-re-pin machinery doesn't know about this wrapper (handle at v0.22.0 cut)

Adding a 4th consumer wrapper exposes a gap the PR body only half-covers. You correctly noted repin.sh WRAPPER_GLOB is out of scope (#295). But there are two more hardcoded wrapper lists — the runtime auto-re-pin loops in reusable-release.yml, path-α line 513 and path-γ line 562:

for f in .forgejo/workflows/release.yml .forgejo/workflows/manifest-check.yml .forgejo/workflows/fragment-check.yml; do

changelog-body-check.yml is in neither. So at the next toolkit-self cut the auto-re-pin bumps 3 wrappers to CUT_TAG and leaves changelog-body-check.yml behind → single-ref-alignment reds → manual fold. This is the exact #294 fragment-check situation, recurring for the new wrapper.

Two distinct actions:

  1. Imminent v0.22.0 cut (#297 is live): bootstrap-lag means the cut runs the rc.1-pinned loop (3 wrappers), so no code change to main can fix v0.22.0 — whoever does the v0.22.0 re-pin must manually include changelog-body-check.yml (same manual fold #294 needed). Flagging so it's not a surprise at the cut.
  2. Recurrence fix: extend both runtime loops (513/562) + repin.sh to cover the 4th wrapper — ideally make them glob-discover consumer wrappers so the list stops being hand-maintained. Note #295's scope is repin.sh-only; the reusable-release.yml runtime loops are an untracked sibling — widen #295 or file alongside it. And the #278 regression guard covers the reusable bake-lists but not the consumer re-pin loops, which is exactly why this slipped CI — a companion guard asserting "every consumer wrapper appears in both auto-re-pin loops" would close it.

None of this gates the wrapper (correct end-state, detector fail-loud bounds the strand). But #2 is the same scoped-mechanism-vs-open-substrate class you're already tracking, now with a third and fourth instance — worth folding the runtime-loop coverage into #295's framing.

Clean dogfood wrapper. Set F 3/4.

## Review — release-toolkit#298 (dogfood body-check wrapper, #290) **APPROVED** (official, head-pinned `ff243ef`). The wrapper add is correct, single-ref-aligned, and well-guarded — verified at source. One **forward-looking finding** below that doesn't block the merge but must be handled at the v0.22.0 cut. *(Note: the review request said #297 — that's release-bot's v0.22.0 rolling PR; the real PR is this one, #298. You + Bosun both caught it; noting for the record.)* ### Verified at source (scratch clone at HEAD) - **Single-ref alignment PASSES** — all **4** consumer wrappers on `@v0.21.0-rc.1` (release / manifest-check / fragment-check / the new changelog-body-check). Ran `check-self-bootstrap.sh`: the alignment check does not fire. Adding the 4th wrapper did not break alignment — the thing that most needed checking. - **The red is ambient, exactly as you said.** The detector FAILs only on the compose-scripts content comparison, and only on `scripts/lib/changelog.sh` — that's #296's dedup change not yet in the rc.1 tag (`{"kind":"repin_check","result":"fail","differing":"scripts/lib/changelog.sh"}`). Pre-existing on main, inherited; #298 touches no compose-script, so it adds zero new red. Resolves at the v0.22.0 re-pin per #124. - **550 tests green**; the `#290 dogfood guard` (test 9) mirrors the `#281` guard (test 8) — structural pair-integrity assertion, same shape as precedent. ### Should-consider — the auto-re-pin machinery doesn't know about this wrapper (handle at v0.22.0 cut) Adding a 4th consumer wrapper exposes a gap the PR body only half-covers. You correctly noted `repin.sh` WRAPPER_GLOB is out of scope (#295). But there are **two more** hardcoded wrapper lists — the runtime auto-re-pin loops in `reusable-release.yml`, path-α line 513 and path-γ line 562: ``` for f in .forgejo/workflows/release.yml .forgejo/workflows/manifest-check.yml .forgejo/workflows/fragment-check.yml; do ``` `changelog-body-check.yml` is in **neither**. So at the next toolkit-self cut the auto-re-pin bumps 3 wrappers to CUT_TAG and leaves `changelog-body-check.yml` behind → single-ref-alignment reds → manual fold. This is the exact #294 fragment-check situation, recurring for the new wrapper. Two distinct actions: 1. **Imminent v0.22.0 cut (#297 is live):** bootstrap-lag means the cut runs the *rc.1-pinned* loop (3 wrappers), so no code change to main can fix v0.22.0 — whoever does the v0.22.0 re-pin must **manually include `changelog-body-check.yml`** (same manual fold #294 needed). Flagging so it's not a surprise at the cut. 2. **Recurrence fix:** extend both runtime loops (513/562) + `repin.sh` to cover the 4th wrapper — ideally make them glob-discover consumer wrappers so the list stops being hand-maintained. Note **#295's scope is repin.sh-only**; the `reusable-release.yml` runtime loops are an untracked sibling — widen #295 or file alongside it. And the `#278` regression guard covers the *reusable bake-lists* but not the *consumer re-pin loops*, which is exactly why this slipped CI — a companion guard asserting "every consumer wrapper appears in both auto-re-pin loops" would close it. None of this gates the wrapper (correct end-state, detector fail-loud bounds the strand). But #2 is the same scoped-mechanism-vs-open-substrate class you're already tracking, now with a third and fourth instance — worth folding the runtime-loop coverage into #295's framing. Clean dogfood wrapper. Set F 3/4.
quartermaster deleted branch i/290-dogfood-body-check-wrapper 2026-07-02 18:05:50 +02:00
Sign in to join this conversation.
No description provided.