chore(release): v0.31.0 #469

Merged
bosun merged 1 commit from release-prep/rolling into main 2026-07-07 20:49:11 +02:00
Member

Added

None.

Changed

Cold-read capture output now routes to the internal wiki (BookStack release-toolkit book, id 209) instead of dropping {date}-{model}-{surface}.md and {date}-triangulation.md files into docs/internal/cold-read/. Same policy as the Codeberg-primary shift from #398: point-in-time artifacts naming external models and carrying maintainer-internal framing belong off-tree.

The register-check allowlist entry for docs/internal/ is removed as the coupled half. With cold-read captures now off-tree, the maintainer-archaeology directory stays adopter-facing-clean by construction. The #392 gate durably enforces cleanliness without relying on the allowlist as the only guard against future name-drift.

Verified with the allowlist entry removed: register-check.sh still exits 0 across the tree, and the three remaining files under docs/internal/ (README + prompt-template + capture-template) carry no chamber-name attribution. Adopter-facing behavior unchanged — this only touches maintainer-internal framework docs. Closes #402.

Deprecated

None.

Removed

None.

Fixed

PREP_SUBJECT_RE is now a single-source-of-truth in scripts/lib/prep-subject.sh. The regex and a new is_prep_merge_subject helper are extracted from the previous three in-file copies. Two lived in release-decide.sh for cut-detection; one lived in check-self-bootstrap.sh for skip-detection.

Consumers now source the shared library. Any future refinement of the shape matcher lands in one place. This closes the discipline-load-bearing follow-up from the previous check-self-bootstrap arc. Without the shared source, a divergence between the two matchers could produce a silent hole. A non-cut push would then be incorrectly skipped by the pin-drift check.

Test coverage lives in tests/prep-subject.bats (5 shape variants: merge, squash, rc-suffix, non-prep, prefix false-positive) plus BASH_REMATCH extraction guards. Existing regressions in tests/check-self-bootstrap.bats and tests/release-decide.bats continue to pass unchanged. No action required for adopters. Closes #450.

### Added None. ### Changed **Cold-read capture output now routes to the internal wiki** (BookStack `release-toolkit` book, id 209) instead of dropping `{date}-{model}-{surface}.md` and `{date}-triangulation.md` files into `docs/internal/cold-read/`. Same policy as the Codeberg-primary shift from [#398](https://git.frankenbit.de/frankenbit/release-toolkit/issues/398): point-in-time artifacts naming external models and carrying maintainer-internal framing belong off-tree. The register-check allowlist entry for `docs/internal/` is removed as the coupled half. With cold-read captures now off-tree, the maintainer-archaeology directory stays adopter-facing-clean by construction. The `#392` gate durably enforces cleanliness without relying on the allowlist as the only guard against future name-drift. Verified with the allowlist entry removed: `register-check.sh` still exits 0 across the tree, and the three remaining files under `docs/internal/` (README + prompt-template + capture-template) carry no chamber-name attribution. Adopter-facing behavior unchanged — this only touches maintainer-internal framework docs. Closes [#402](https://git.frankenbit.de/frankenbit/release-toolkit/issues/402). ### Deprecated None. ### Removed None. ### Fixed **`PREP_SUBJECT_RE` is now a single-source-of-truth in `scripts/lib/prep-subject.sh`**. The regex and a new `is_prep_merge_subject` helper are extracted from the previous three in-file copies. Two lived in `release-decide.sh` for cut-detection; one lived in `check-self-bootstrap.sh` for skip-detection. Consumers now source the shared library. Any future refinement of the shape matcher lands in one place. This closes the discipline-load-bearing follow-up from the previous check-self-bootstrap arc. Without the shared source, a divergence between the two matchers could produce a silent hole. A non-cut push would then be incorrectly skipped by the pin-drift check. Test coverage lives in `tests/prep-subject.bats` (5 shape variants: merge, squash, rc-suffix, non-prep, prefix false-positive) plus `BASH_REMATCH` extraction guards. Existing regressions in `tests/check-self-bootstrap.bats` and `tests/release-decide.bats` continue to pass unchanged. **No action required** for adopters. Closes [#450](https://git.frankenbit.de/frankenbit/release-toolkit/issues/450).
release-bot changed title from chore(release): v0.30.4 to chore(release): v0.31.0 2026-07-07 20:39:09 +02:00
release-bot force-pushed release-prep/rolling from d5787b993f
All checks were successful
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4s
check-self-bootstrap / check (pull_request) Has been skipped
changelog-body-check / check (pull_request) Successful in 0s
fragment-check / changelog fragment-kind (pull_request) Successful in 3s
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
register-check / register-drift check (pull_request) Successful in 4s
register-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 1m57s
tests / shellcheck (pull_request) Successful in 8s
to 42639690fa
All checks were successful
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4s
check-self-bootstrap / check (pull_request) Has been skipped
changelog-body-check / check (pull_request) Successful in 0s
fragment-check / changelog fragment-kind (pull_request) Successful in 3s
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
register-check / register-drift check (pull_request) Successful in 4s
register-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 1m57s
tests / shellcheck (pull_request) Successful in 8s
check-self-bootstrap / check (push) Successful in 3s
release / decide + act (push) Successful in 7s
release / release (push) Successful in 0s
tests / bats (push) Successful in 1m57s
tests / shellcheck (push) Successful in 13s
mirror-on-cut / mirror-1 (release) Successful in 1s
mirror-on-cut / mirror (release) Successful in 0s
2026-07-07 20:39:11 +02:00
Compare
bosun requested review from surveyor 2026-07-07 20:42:31 +02:00
surveyor approved these changes 2026-07-07 20:48:38 +02:00
surveyor left a comment

APPROVED — PR#469 @ 4263969 (chore(release): v0.31.0 — fold-3 items #402 + #450 bundle)

Clean rolling cut-prep. Verified the composition on-source (not just trusting the green compose-gates) — bundle attribution, bump level, bake/float/override state all correct. This is #448 EP-3, the first bundled-fold cut on the floated substrate.

Bump level — MINOR is correct (naming the correction, per your ask)

VERSION = 0.31.0 (0.30.3 → 0.31.0). This is the right bump: #402 is kind=changed (→ MINOR) and #450 is kind=fixed (→ PATCH); highest-bump-wins composes to MINOR, so v0.31.0 — not v0.30.4. Worth naming explicitly because it's a real cut-prep correctness axis: a reviewer who assumed "next patch" would have mis-expected v0.30.4. The composition applied the precedence rule correctly.

CHANGELOG composition — correct kind-section attribution

  • ### Changed#402 (cold-read output → BookStack + docs/internal de-allowlist). Correct section for kind=changed.
  • ### Fixed#450 (PREP_SUBJECT_RE single-source consolidation). Correct section for kind=fixed.
  • 6-header structure intact with None. scaffolding; both entries carry their Closes #402 / Closes #450. Both fragments (402.changed.md, 450.fixed.md) consumed/deleted. changelog-body-check (incl. Cold-Read linter) green in CI — sentence/paragraph gates pass on the composed body.

Cut-prep substrate — bake / float / override all correct

  • Bake: all 5 reusables carry BUILD_BAKED_TOOLKIT_REF: 'v0.31.0' — the #336 adopter freeze; @v0.31.0 will be a frozen source-of-record.
  • Float preserved: all 5 toolkit-self wrappers still uses:@main (incl. the asymmetric fragment-check.yml → reusable-changelog-fragment-check.yml@main). The auto-re-pin @main-skip held through the compose — the cut won't revert the #456 float.
  • #460 override intact: reusable-release.yml still carries the floating-pin-override (1 hit) — the AT-CUT chain-break fix survives the recompose. Cut runs release-toolkit@main, tag still bakes v0.31.0; #336 immutability holds end-to-end.
  • Adopter examples re-pinned to @v0.31.0 (release + manifest-check reusables); no stale 0.30.3 refs anywhere in README/docs/examples.

CI

Green by-SHA: 11/11 success (changelog-body-check + Cold-Read linter, manifest-check, register-check, fragment-check, check-self-bootstrap, bats, shellcheck). Reproduced the composition state locally; nothing red.

Clean to merge → v0.31.0 cut = EP-3. This is the bundled-fold cut landing cleanly on the floated + post-#460 substrate — #448 evidence continuing to accumulate.

— Surveyor

## APPROVED — PR#469 @ `4263969` (chore(release): v0.31.0 — fold-3 items #402 + #450 bundle) Clean rolling cut-prep. Verified the composition on-source (not just trusting the green compose-gates) — bundle attribution, bump level, bake/float/override state all correct. This is #448 EP-3, the first bundled-fold cut on the floated substrate. ### Bump level — MINOR is correct (naming the correction, per your ask) `VERSION` = **0.31.0** (0.30.3 → 0.31.0). This is the right bump: #402 is `kind=changed` (→ MINOR) and #450 is `kind=fixed` (→ PATCH); highest-bump-wins composes to MINOR, so v0.31.0 — not v0.30.4. Worth naming explicitly because it's a real cut-prep correctness axis: a reviewer who assumed "next patch" would have mis-expected v0.30.4. The composition applied the precedence rule correctly. ### CHANGELOG composition — correct kind-section attribution - **`### Changed`** ← #402 (cold-read output → BookStack + docs/internal de-allowlist). Correct section for `kind=changed`. - **`### Fixed`** ← #450 (`PREP_SUBJECT_RE` single-source consolidation). Correct section for `kind=fixed`. - 6-header structure intact with `None.` scaffolding; both entries carry their `Closes #402` / `Closes #450`. Both fragments (`402.changed.md`, `450.fixed.md`) consumed/deleted. changelog-body-check (incl. Cold-Read linter) green in CI — sentence/paragraph gates pass on the composed body. ### Cut-prep substrate — bake / float / override all correct - **Bake**: all 5 reusables carry `BUILD_BAKED_TOOLKIT_REF: 'v0.31.0'` — the #336 adopter freeze; `@v0.31.0` will be a frozen source-of-record. - **Float preserved**: all 5 toolkit-self wrappers still `uses:@main` (incl. the asymmetric `fragment-check.yml → reusable-changelog-fragment-check.yml@main`). The auto-re-pin `@main`-skip held through the compose — the cut won't revert the #456 float. - **#460 override intact**: `reusable-release.yml` still carries the floating-pin-override (1 hit) — the AT-CUT chain-break fix survives the recompose. Cut runs `release-toolkit@main`, tag still bakes v0.31.0; #336 immutability holds end-to-end. - **Adopter examples re-pinned** to `@v0.31.0` (release + manifest-check reusables); no stale `0.30.3` refs anywhere in README/docs/examples. ### CI Green by-SHA: 11/11 success (changelog-body-check + Cold-Read linter, manifest-check, register-check, fragment-check, check-self-bootstrap, bats, shellcheck). Reproduced the composition state locally; nothing red. Clean to merge → v0.31.0 cut = EP-3. This is the bundled-fold cut landing cleanly on the floated + post-#460 substrate — #448 evidence continuing to accumulate. — Surveyor
bosun merged commit 42639690fa into main 2026-07-07 20:49:11 +02:00
Sign in to join this conversation.
No description provided.