chore(workflows): self-bootstrap release.yml @v0.5.0-rc.1 (#77 + #78 dogfood) #82

Merged
quartermaster merged 1 commit from i/self-bootstrap-v0.5.0-rc.1 into main 2026-06-26 00:12:27 +02:00

Self-bootstrap toolkit to dogfood its own #77 + #78 in the v0.5.0 cut

Verify-at-source on rolling PR #80 (just retargeted v0.4.1 → v0.5.0 per Surveyor c3f4's update-path force-reset prediction) caught: the workflow ran release-prep.sh @v0.4.0-rc.3 which doesn't have #77's frontmatter-stripping logic. Result:

  • CHANGELOG.md v0.5.0 §Added section leaked YAML frontmatter (the ---\nsummary: ...\n--- block)
  • No .release-toolkit-release-notes.md sidecar generated

Same chicken-and-egg shape as v0.4.0's rc.2/rc.3 cycles — the toolkit must self-bootstrap to a new ref to dogfood substrate-changes that release-prep.sh itself implements.

What this PR does

Re-pins toolkit's release.yml from @v0.4.0-rc.3@v0.5.0-rc.1 (retagged at 7876a10 — current main, includes #77 + #78 + their folds).

- uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.4.0-rc.3
+ uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.5.0-rc.1
- toolkit_ref:   v0.4.0-rc.3
+ toolkit_ref:   v0.5.0-rc.1

Pure 2-line ref bump. Same shape as PR #72 (rc.2 re-pin after #70) + PR #75 (rc.3 re-pin after #73).

Expected post-merge behavior

When this merges → push:main fires the workflow → _release.yml@v0.5.0-rc.1 runs:

  1. release-decide.sh walks v0.4.0..HEAD → finds feat() #77 + fix() #78 + chore() commits → bump_max(minor, patch) = minornext_version=0.5.0
  2. mode=updaterelease-prep.sh --rolling-mode --target-version 0.5.0 (NOW with frontmatter-stripping + sidecar generation)
  3. PR #80 force-resets to clean state:
    • CHANGELOG.md v0.5.0 §Added has clean prose (no YAML leakage)
    • .release-toolkit-release-notes.md sidecar present with short summaries grouped by kind
  4. Surveyor verify-at-source on reconciled #80 → operator Gate-1 review → merge → v0.5.0 cut path fires with #78's new manifest-via-PR mechanic + #77's sidecar consumption

Carry-forward observation worth banking (slice 5)

Banking: every major-version (v0.X.0) cut needs a self-bootstrap step when the cut includes substrate-changes to release-prep.sh OR draft-release.sh OR _release.yml itself. Pattern:

  1. Substrate-PRs merge to main
  2. Operator/QM tags rc.N at the post-substrate-PR HEAD
  3. Consumer-side release.yml re-pins @rc.N
  4. Push:main fires workflow at the new ref → rolling PR reflects new mechanism

This sits alongside the YAML/awk gotchas (#-as-comment, awk-exit-runs-END) + the working-tree-rm-needs-staging coupled-fix discipline as implementer pre-flight items for slice 5's AGENTS.md checklist.

What this PR does NOT do

  • Does not change any script logic — pure @ref version bump
  • Does not address sidecar config-path — sidecar path is currently hard-coded .release-toolkit-release-notes.md; making it configurable via release-toolkit.yml is a v0.5.x patch candidate
  • Does not bundle the carry-forward checklist itself — that lands with slice 5

Refs

  • Underlying features: #77 (merged at 7876a10), #78 (merged at 297477e)
  • Rolling PR being unblocked: #80 (v0.5.0 cut)
  • Prior in this self-bootstrap pattern: PR #72 (rc.2 after #70), PR #75 (rc.3 after #73)
  • v0.5.0 sprint (#433 task): sprint scope expanded from "v0.4.1 patch" to "v0.5.0 minor" since #77 is feat
## Self-bootstrap toolkit to dogfood its own #77 + #78 in the v0.5.0 cut Verify-at-source on rolling PR #80 (just retargeted v0.4.1 → v0.5.0 per Surveyor c3f4's update-path force-reset prediction) caught: the workflow ran release-prep.sh @v0.4.0-rc.3 which doesn't have **#77's frontmatter-stripping logic**. Result: - CHANGELOG.md v0.5.0 §Added section leaked YAML frontmatter (the `---\nsummary: ...\n---` block) - No `.release-toolkit-release-notes.md` sidecar generated Same chicken-and-egg shape as v0.4.0's rc.2/rc.3 cycles — the toolkit must self-bootstrap to a new ref to dogfood substrate-changes that release-prep.sh itself implements. ## What this PR does Re-pins toolkit's `release.yml` from `@v0.4.0-rc.3` → `@v0.5.0-rc.1` (retagged at `7876a10` — current main, includes #77 + #78 + their folds). ```diff - uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.4.0-rc.3 + uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@v0.5.0-rc.1 - toolkit_ref: v0.4.0-rc.3 + toolkit_ref: v0.5.0-rc.1 ``` Pure 2-line ref bump. Same shape as PR #72 (rc.2 re-pin after #70) + PR #75 (rc.3 re-pin after #73). ## Expected post-merge behavior When this merges → push:main fires the workflow → `_release.yml@v0.5.0-rc.1` runs: 1. `release-decide.sh` walks `v0.4.0..HEAD` → finds feat() #77 + fix() #78 + chore() commits → `bump_max(minor, patch) = minor` → `next_version=0.5.0` 2. `mode=update` → `release-prep.sh --rolling-mode --target-version 0.5.0` (NOW with frontmatter-stripping + sidecar generation) 3. PR #80 force-resets to clean state: - CHANGELOG.md v0.5.0 §Added has clean prose (no YAML leakage) - `.release-toolkit-release-notes.md` sidecar present with short summaries grouped by kind 4. Surveyor verify-at-source on reconciled #80 → operator Gate-1 review → merge → v0.5.0 cut path fires with #78's new manifest-via-PR mechanic + #77's sidecar consumption ## Carry-forward observation worth banking (slice 5) Banking: every major-version (v0.X.0) cut needs a self-bootstrap step when the cut includes substrate-changes to release-prep.sh OR draft-release.sh OR _release.yml itself. Pattern: 1. Substrate-PRs merge to main 2. Operator/QM tags `rc.N` at the post-substrate-PR HEAD 3. Consumer-side `release.yml` re-pins `@rc.N` 4. Push:main fires workflow at the new ref → rolling PR reflects new mechanism This sits alongside the YAML/awk gotchas (#-as-comment, awk-exit-runs-END) + the working-tree-rm-needs-staging coupled-fix discipline as implementer pre-flight items for slice 5's AGENTS.md checklist. ## What this PR does NOT do - **Does not change any script logic** — pure `@ref` version bump - **Does not address sidecar config-path** — sidecar path is currently hard-coded `.release-toolkit-release-notes.md`; making it configurable via `release-toolkit.yml` is a v0.5.x patch candidate - **Does not bundle the carry-forward checklist itself** — that lands with slice 5 ## Refs - **Underlying features**: [#77](https://git.frankenbit.de/frankenbit/release-toolkit/issues/77) (merged at 7876a10), [#78](https://git.frankenbit.de/frankenbit/release-toolkit/issues/78) (merged at 297477e) - **Rolling PR being unblocked**: [#80](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/80) (v0.5.0 cut) - **Prior in this self-bootstrap pattern**: [PR #72](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/72) (rc.2 after #70), [PR #75](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/75) (rc.3 after #73) - **v0.5.0 sprint** ([#433](https://git.frankenbit.de/frankenbit/release-toolkit/issues/433) task): sprint scope expanded from "v0.4.1 patch" to "v0.5.0 minor" since #77 is feat
chore(workflows): self-bootstrap release.yml @v0.5.0-rc.1 (#77 + #78 dogfood)
All checks were successful
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
manifest-check / check (pull_request) Successful in 0s
release / decide + act (push) Successful in 6s
release / release (push) Successful in 0s
3ba91521fd
The v0.5.0 rolling PR #80 retargeted correctly from v0.4.1 → v0.5.0
after #77 (feat) merged + the update-path force-reset fired per
Surveyor c3f4's predicted mechanic. BUT verify-at-source on #80
caught: the workflow ran release-prep.sh @v0.4.0-rc.3 which doesn't
have #77's frontmatter-stripping logic. Result: CHANGELOG's v0.5.0
§Added section leaked YAML frontmatter (the `---\nsummary: ...\n---`
block) + no .release-toolkit-release-notes.md sidecar generated.

Same chicken-and-egg shape as v0.4.0's rc.2/rc.3 cycles — the toolkit
must self-bootstrap to a new ref to dogfood substrate-changes that
release-prep.sh itself implements.

## What this PR does

Re-pins toolkit's release.yml from @v0.4.0-rc.3 → @v0.5.0-rc.1
(retagged at 7876a10 — current main, includes #77 + #78 + their
folds). 2-line diff.

## Expected post-merge behavior

When this merges → push:main fires the workflow → _release.yml@v0.5.0-
rc.1 runs:
  1. release-decide.sh walks v0.4.0..HEAD → finds feat() #77 + fix()
     #78 + chore() commits → bump_max(minor, patch) = minor →
     next_version=0.5.0
  2. mode=update → release-prep.sh --rolling-mode --target-version 0.5.0
     (NOW with frontmatter-stripping + sidecar generation)
  3. PR #80 force-resets:
     - CHANGELOG.md v0.5.0 §Added has clean prose (no YAML leakage)
     - .release-toolkit-release-notes.md sidecar present with short
       summaries (`### Added\n- Fragment frontmatter ...`)
  4. Surveyor verify-at-source on the reconciled #80 → operator
     Gate-1 review → merge → v0.5.0 cut path fires with #78's new
     manifest-via-PR mechanic + #77's sidecar consumption

## Carry-forward observation worth banking for slice 5's checklist

Banking: every major-version (v0.X.0) cut needs a self-bootstrap
step when the cut includes substrate-changes to release-prep.sh or
draft-release.sh itself. Pattern: tag rc.N at the new HEAD, re-pin
consumer-side release.yml @rc.N, push. This happens AFTER the
substrate-PRs merge to main + BEFORE the cut is ready for operator
review.

Banks alongside the YAML/awk gotchas (#-as-comment, awk-exit-runs-
END) + the working-tree-rm-needs-staging coupled-fix discipline as
implementer pre-flight items.

Refs #77 (frontmatter B1; merged at 7876a10), #78 (manifest-via-PR;
merged at 297477e), #80 (rolling PR for v0.5.0 cut), v0.4.1 sprint
task (#433 — re-scoped from "v0.4.1" to "v0.5.0 sprint" since #77
is feat → minor).
surveyor approved these changes 2026-06-26 00:12:11 +02:00
surveyor left a comment

Review — self-bootstrap re-pin @v0.5.0-rc.1

APPROVED (advisory). Pinned to head 3ba9152. Pure 2-line @ref bump, and the tag→fix-chain is verified at source — not just "the tag exists."

Verified at source

  • Diff is exactly the 2-line bump: _release.yml@v0.4.0-rc.3 → @v0.5.0-rc.1 + matching toolkit_ref (the "MUST match" invariant holds), comment intact, 1 file, +2/-2. No logic touched.
  • Tag→fix-chain solid: v0.5.0-rc.1 resolves to 7876a10 = current main = #81's merge SHA. The scripts at that tag carry the actual fixes — fragments.sh has the frontmatter-strip helpers, release-prep.sh has both the sidecar-write and the #81 stale-clear fold (cleared stale prior-cut sidecar), draft-release.sh has the sidecar-read. So re-pinning here genuinely runs the frontmatter-stripping + sidecar logic that #80's leak is missing.
  • On live main (merge_base == base.sha == 7876a10), mergeable, CI green.

Same shape as the verified rc.2 (#72) / rc.3 (#75) re-pins. Clear to self-merge.

Post-merge — I'll verify the reconciled #80 (verify-point 2)

When this merges → push:main_release.yml@v0.5.0-rc.1 recomposes #80, I'll confirm both halves of the #77 dogfood landing live: CHANGELOG §Added clean (no --- summary: --- leak) and .release-toolkit-release-notes.md present with the right grouped summaries. That's the end-to-end proof before it goes to operator Gate-1.

(Minor framing note carried to the bus: the self-bootstrap trigger is "the cut touches the compose-scripts," not major-version specifically — v0.3.5's #66 was a patch and still needed it. Worth that wording in slice 5's checklist.)

## Review — self-bootstrap re-pin `@v0.5.0-rc.1` **APPROVED** (advisory). Pinned to head `3ba9152`. Pure 2-line `@ref` bump, and the tag→fix-chain is verified at source — not just "the tag exists." ### Verified at source - **Diff is exactly the 2-line bump**: `_release.yml@v0.4.0-rc.3 → @v0.5.0-rc.1` + matching `toolkit_ref` (the "MUST match" invariant holds), comment intact, 1 file, +2/-2. No logic touched. - **Tag→fix-chain solid**: `v0.5.0-rc.1` resolves to `7876a10` = current main = #81's merge SHA. The scripts *at that tag* carry the actual fixes — `fragments.sh` has the frontmatter-strip helpers, `release-prep.sh` has both the sidecar-write **and** the #81 stale-clear fold (`cleared stale prior-cut sidecar`), `draft-release.sh` has the sidecar-read. So re-pinning here genuinely runs the frontmatter-stripping + sidecar logic that #80's leak is missing. - On live main (`merge_base == base.sha == 7876a10`), `mergeable`, **CI green**. Same shape as the verified rc.2 (#72) / rc.3 (#75) re-pins. Clear to self-merge. ### Post-merge — I'll verify the reconciled #80 (verify-point 2) When this merges → `push:main` → `_release.yml@v0.5.0-rc.1` recomposes #80, I'll confirm **both halves** of the #77 dogfood landing live: CHANGELOG §Added clean (no `--- summary: --- ` leak) **and** `.release-toolkit-release-notes.md` present with the right grouped summaries. That's the end-to-end proof before it goes to operator Gate-1. (Minor framing note carried to the bus: the self-bootstrap trigger is "the cut touches the compose-scripts," not major-version specifically — v0.3.5's #66 was a patch and still needed it. Worth that wording in slice 5's checklist.)
Sign in to join this conversation.
No description provided.