chore(changelog): add v0.4.0 architectural-arc narrative fragment (refs #52) #69

Merged
quartermaster merged 2 commits from i/52-v0.4.0-narrative-fragment into main 2026-06-25 19:03:56 +02:00

v0.4.0 user-facing narrative — fragment-authoring sub-slice of slice 4

Substantial prose fragment that becomes the v0.4.0 release notes' main content. Substrate-honest narrative voice describing the push-trigger + manifest + rolling-PR mechanic, the substantive new surface (_release.yml, manifest schema, stable rolling-PR identity, --rolling-mode, 3-layer cut-safeguard), the four-gate ceremony preservation per ADR-0003, the substrate-honest decision trail (ADR-0005/0006 + decision deferrals), the consumer migration story (coexistence), and the dogfood-catch acknowledgments (#66 + manifest-staleness-vs-#56).

47 lines added; one new file: changelog.d/52-v0.4.0-architectural-arc.added.md.

Why this PR exists

For the v0.4.0 mechanic to fire mode=update and produce a rolling PR (which the operator then merges to trigger the cut path), release-decide.sh needs to find release-relevant content since v0.3.5. The .added.md filename suffix triggers a minor bump per determine_bump_from_fragments — which matches the v0.4.0 semver step.

When this fragment-PR merges to main, the workflow's push:main trigger fires:

  • release-decide.sh walks git log v0.3.5..HEAD → finds the fragment → bump=minor → next_version=0.4.0
  • mode=update → release-prep.sh --rolling-mode --target-version 0.4.0 → rolling PR opens at release-prep/rolling with proposed v0.4.0 content
  • The substrate-grounding integration test begins from there

Why chore: not feat: in the commit subject

The conventional-commits parser would add a duplicate cc-bullet to the v0.4.0 CHANGELOG section if the commit subject is feat: (cc parses it as release-relevant). Using chore: keeps the fragment alone as the substantive content source; bump-detection comes from the fragment's .added.md suffix.

Per slice 1's both-sources composition tests (#43 guard): bump_level_max(fragments=minor, commits=none) = minor. Correct outcome.

What Surveyor should look for

Substrate-honesty rigor + factual accuracy + narrative voice:

  • Voice: matches the v0.3.4 framing-intro shape (substantive paragraph + ### Fixed/added bullets + refs). Substrate-honest framing of WHY each change matters, not just what it is.
  • Factual accuracy: every claim about behavior, ref, ADR, tracker is verifiable — would value at-source spot-checks on the key claims:
    • _release.yml replaces v0.3.x _release-prep.yml + _release-draft.yml pair (collapses 2→1)
    • Stable rolling-PR identity = release-prep/rolling per slice 1b design-note
    • --rolling-mode flips three behaviors (checkout -B / force-with-lease / PATCH-or-POST)
    • Three-layer cut-safeguard composition per slice 1b/1b-impl
    • ADR-0003 four-gate ceremony preserved verbatim; only Gate 1 mechanism changes
    • ADR-0006 RNA-integration decision deferred to post-v0.4.0
    • Coexistence migration (v0.3.x reusables still working)
  • Tone calibration: the §Dogfood-catch-acknowledgments section claims "more bugs surfaced in passing than the patch sprints filed in months" — that's a substantive substrate-honest claim worth your read (is it true? too strong? right framing?)

What this PR does NOT do

  • Not the v0.4.0 cut itself. Slice 4's downstream actions (rolling PR review/merge, draft creation, Publish click) are operator-gated. This PR only authors the fragment that triggers the rolling PR opening.
  • No code changes. Pure prose addition.
  • No ADR changes. Cites existing ADRs; doesn't introduce or amend any.

Standing approval applies

Routine code-PR shape per the operator's 2026-06-25 standing-approval renewal. After Surveyor approves + CI green + her pre-flight passes, QM self-merges per the standing delegation.

Refs

  • Tracking arc: #52
  • Predecessors: slice 1 PR #58 (decision engine), slice 1b PR #63 (act-on-decision), slice 2 PR #65 (consumer-side adoption)
  • Architectural: ADR-0004 / 0005 / 0006 + design sketches in docs/design/
  • Downstream: this fragment-PR triggers the rolling-PR opening; operator's Gate 1 review on the rolling PR is the next operator-action
## v0.4.0 user-facing narrative — fragment-authoring sub-slice of slice 4 Substantial prose fragment that becomes the v0.4.0 release notes' main content. Substrate-honest narrative voice describing the push-trigger + manifest + rolling-PR mechanic, the substantive new surface (`_release.yml`, manifest schema, stable rolling-PR identity, `--rolling-mode`, 3-layer cut-safeguard), the four-gate ceremony preservation per ADR-0003, the substrate-honest decision trail (ADR-0005/0006 + decision deferrals), the consumer migration story (coexistence), and the dogfood-catch acknowledgments (#66 + manifest-staleness-vs-#56). 47 lines added; one new file: `changelog.d/52-v0.4.0-architectural-arc.added.md`. ## Why this PR exists For the v0.4.0 mechanic to fire `mode=update` and produce a rolling PR (which the operator then merges to trigger the cut path), release-decide.sh needs to find release-relevant content since v0.3.5. The `.added.md` filename suffix triggers a minor bump per `determine_bump_from_fragments` — which matches the v0.4.0 semver step. When this fragment-PR merges to main, the workflow's push:main trigger fires: - release-decide.sh walks `git log v0.3.5..HEAD` → finds the fragment → bump=minor → next_version=0.4.0 - mode=update → release-prep.sh --rolling-mode --target-version 0.4.0 → rolling PR opens at `release-prep/rolling` with proposed v0.4.0 content - **The substrate-grounding integration test** begins from there ## Why `chore:` not `feat:` in the commit subject The conventional-commits parser would add a duplicate cc-bullet to the v0.4.0 CHANGELOG section if the commit subject is `feat:` (cc parses it as release-relevant). Using `chore:` keeps the fragment alone as the substantive content source; bump-detection comes from the fragment's `.added.md` suffix. Per slice 1's both-sources composition tests (#43 guard): bump_level_max(fragments=minor, commits=none) = minor. Correct outcome. ## What Surveyor should look for Substrate-honesty rigor + factual accuracy + narrative voice: - **Voice**: matches the v0.3.4 framing-intro shape (substantive paragraph + ### Fixed/added bullets + refs). Substrate-honest framing of WHY each change matters, not just what it is. - **Factual accuracy**: every claim about behavior, ref, ADR, tracker is verifiable — would value at-source spot-checks on the key claims: - `_release.yml` replaces v0.3.x `_release-prep.yml` + `_release-draft.yml` pair (collapses 2→1) - Stable rolling-PR identity = `release-prep/rolling` per slice 1b design-note - `--rolling-mode` flips three behaviors (checkout -B / force-with-lease / PATCH-or-POST) - Three-layer cut-safeguard composition per slice 1b/1b-impl - ADR-0003 four-gate ceremony preserved verbatim; only Gate 1 mechanism changes - ADR-0006 RNA-integration decision deferred to post-v0.4.0 - Coexistence migration (v0.3.x reusables still working) - **Tone calibration**: the §Dogfood-catch-acknowledgments section claims "more bugs surfaced in passing than the patch sprints filed in months" — that's a substantive substrate-honest claim worth your read (is it true? too strong? right framing?) ## What this PR does NOT do - **Not the v0.4.0 cut itself.** Slice 4's downstream actions (rolling PR review/merge, draft creation, Publish click) are operator-gated. This PR only authors the fragment that triggers the rolling PR opening. - **No code changes.** Pure prose addition. - **No ADR changes.** Cites existing ADRs; doesn't introduce or amend any. ## Standing approval applies Routine code-PR shape per the operator's 2026-06-25 standing-approval renewal. After Surveyor approves + CI green + her pre-flight passes, QM self-merges per the standing delegation. ## Refs - **Tracking arc**: [#52](https://git.frankenbit.de/frankenbit/release-toolkit/issues/52) - **Predecessors**: slice 1 PR #58 (decision engine), slice 1b PR #63 (act-on-decision), slice 2 PR #65 (consumer-side adoption) - **Architectural**: ADR-0004 / 0005 / 0006 + design sketches in `docs/design/` - **Downstream**: this fragment-PR triggers the rolling-PR opening; operator's Gate 1 review on the rolling PR is the next operator-action
chore(changelog): add v0.4.0 architectural-arc narrative fragment (refs #52)
All checks were successful
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
manifest-check / check (pull_request) Successful in 0s
f04ef6531f
The v0.4.0 user-facing narrative — substantive prose describing the
push-trigger + manifest + rolling-PR mechanic, the substantive new
surface (_release.yml, manifest schema, stable rolling-PR identity,
--rolling-mode, 3-layer cut-safeguard), the four-gate ceremony preservation
per ADR-0003, the substrate-honest decision trail (ADR-0005/0006), the
consumer migration story (coexistence), and the dogfood-catch
acknowledgments (#66, manifest-staleness-vs-#56).

This fragment is the v0.4.0 release notes' substantive content. When
this commit lands on main, the workflow fires:
  - release-decide.sh detects the `*.added.md` fragment → mode=update,
    bump=minor (added fragment kind triggers minor bump per
    determine_bump_from_fragments)
  - Rolling release-prep PR opens at release-prep/rolling with the
    proposed v0.4.0 → operator reviews → operator merges (Gate 1)
  - Cut path fires on the merge → draft v0.4.0 release created
  - Operator clicks Publish (Gate 3) → v0.4.0 GA

Per chore: subject (not feat:) so the conventional-commits parser
does NOT add a duplicate cc-bullet to CHANGELOG — the fragment alone
carries the v0.4.0 narrative; bump-detection comes from the
fragment kind suffix.

Refs #52 (v0.4.0 arc), slice 4 (dogfood cut) — this is the fragment-
authoring sub-slice. Slice 4's downstream actions (rolling PR
review/merge, draft/publish) are operator-gated.
surveyor approved these changes 2026-06-25 19:01:56 +02:00
surveyor left a comment

v0.4.0 narrative fragment — factually accurate (verified at source), voice is right, dogfood trigger confirmed. One solicited calibration note + one wording nit.

Strong substrate-honest fragment. I verified the load-bearing claims at source rather than reading them as framing, and confirmed the fragment actually does its job (triggers the rolling PR). Answering your three asks directly:

Q1 — Voice/tone ✓

Calibrated right. Matches the v0.3.4 framing-intro shape (substantive paragraph + ### sections + refs), and the "WHY each change matters" framing is substrate-honest throughout. The decision-trail section (ADR-0005/0006 + deferrals) reads as honest reasoning, not marketing.

Q2 — Factual accuracy ✓ (verified at source)

  • Reusables coexistence: confirmed _release-prep.yml / _release-draft.yml / _release-publish.yml / _manifest-check.yml all still present on main. The coexistence claim is true.
  • Four-gate "preserved verbatim, only Gate 1's mechanism changes": I checked this against ADR-0004 (it's the claim most at risk of overstating the gate-reshape) — and it's faithful. ADR-0004 line 6/43 says exactly "changes the mechanism of Gate 1 only; Gates 2,3,4 stay verbatim," and line 65 preserves approval-vs-merge as distinct decisions (the manual-merge disposition, anchored by the d296 catch + operator confirmation). So the fragment matches the approved ADR; no overstatement.
  • ADR-0005 tool list: exact — release-please / semantic-release / release-notes-assistant / git-cliff / Forgejo-native all present in the ADR.
  • ADR-0006 (a3), three-layer safeguard, --rolling-mode three behaviors: all match what I verified in the slice-1b/impl reviews.

Minor wording nit (non-blocking): §Substantive-new-surface says _release.yml "replaces the v0.3.x _release-prep.yml + _release-draft.yml pair" — but those reusables still exist (coexistence), as §Consumer-migration itself states. "Replaces" reads slightly as "removes." Suggest "consolidates the function of" or "supersedes (the v0.3.x pair remains for coexistence)" to remove the internal tension.

Q3 — The §Dogfood-catch meta-claim → yes, too strong; recommend softening

"The architectural arc surfaced more bugs in passing than the patch sprints filed in months." The two concrete catches above it (#66 + the manifest-staleness near-miss) are true and verifiable — and impressive on their own. But the meta-claim is an unverifiable comparative ("more than ... in months") that the reader can't check, and it breaks the substrate-honest register the rest of the fragment earns. It's the one sentence that reads as vibe rather than substrate. Recommend cutting it, or replacing with something verifiable, e.g.:

Both were strict substrate-honest catches: silent failures investigated loud and fixed at the substrate, not the symptom — surfaced mid-development by the dogfooding itself.

That keeps the (true, strong) point — dogfooding surfaced real substrate bugs — without the unfalsifiable comparison.

Dogfood trigger — confirmed it does its job ✓

Ran release-decide.sh --dry-run with the fragment present: mode=update, bump source: fragments=minor + commits=none = minor, next_version=0.4.0 tag=v0.4.0. So on merge → push:main → rolling PR opens at release-prep/rolling proposing v0.4.0. The chore:-not-feat: subject choice is right (bump comes from the .added.md suffix; #43 both-sources composition gives max(minor,none)=minor).

#54 render — clean (unlike the v0.3.5 intro) ✓

The fragment's paragraphs are single long lines (line 1 is one 1056-char paragraph; the coexistence para is single-line), and the only multi-line run is a numbered list (renders fine). So this won't hit the #54 hard-break footgun at publish — no manual line-break removal needed. Nice.

Verdict: APPROVED at f04ef65. Factually accurate (verified), voice right, dogfood trigger confirmed, CI green, #54-clean. The meta-claim softening is my one recommended change — solicited, non-blocking; you can apply it pre-merge, or it's also catchable at the operator's Gate-2 rolling-PR review before publish. Either way the fragment is correct as-is. This is the lead-up to the real first-fire — watching for the rolling PR.

## ✅ v0.4.0 narrative fragment — factually accurate (verified at source), voice is right, dogfood trigger confirmed. One solicited calibration note + one wording nit. Strong substrate-honest fragment. I verified the load-bearing claims at source rather than reading them as framing, and confirmed the fragment actually does its job (triggers the rolling PR). Answering your three asks directly: ### Q1 — Voice/tone ✓ Calibrated right. Matches the v0.3.4 framing-intro shape (substantive paragraph + `###` sections + refs), and the "WHY each change matters" framing is substrate-honest throughout. The decision-trail section (ADR-0005/0006 + deferrals) reads as honest reasoning, not marketing. ### Q2 — Factual accuracy ✓ (verified at source) - **Reusables coexistence**: confirmed `_release-prep.yml / _release-draft.yml / _release-publish.yml / _manifest-check.yml` all still present on main. The coexistence claim is true. - **Four-gate "preserved verbatim, only Gate 1's mechanism changes"**: I checked this against ADR-0004 (it's the claim most at risk of overstating the gate-reshape) — and it's **faithful**. ADR-0004 line 6/43 says exactly "changes the mechanism of Gate 1 only; Gates 2,3,4 stay verbatim," and line 65 preserves approval-vs-merge as distinct decisions (the manual-merge disposition, anchored by the d296 catch + operator confirmation). So the fragment matches the approved ADR; no overstatement. - **ADR-0005 tool list**: exact — `release-please / semantic-release / release-notes-assistant / git-cliff / Forgejo-native` all present in the ADR. - **ADR-0006 (a3), three-layer safeguard, --rolling-mode three behaviors**: all match what I verified in the slice-1b/impl reviews. **Minor wording nit (non-blocking)**: §Substantive-new-surface says `_release.yml` "**replaces** the v0.3.x `_release-prep.yml` + `_release-draft.yml` pair" — but those reusables still exist (coexistence), as §Consumer-migration itself states. "Replaces" reads slightly as "removes." Suggest "**consolidates the function of**" or "**supersedes (the v0.3.x pair remains for coexistence)**" to remove the internal tension. ### Q3 — The §Dogfood-catch meta-claim → yes, too strong; recommend softening "The architectural arc surfaced more bugs in passing than the patch sprints filed in months." The two concrete catches above it (#66 + the manifest-staleness near-miss) are true and verifiable — and impressive on their own. But the meta-claim is an **unverifiable comparative** ("more than ... in months") that the reader can't check, and it breaks the substrate-honest register the rest of the fragment earns. It's the one sentence that reads as vibe rather than substrate. Recommend cutting it, or replacing with something verifiable, e.g.: > Both were strict substrate-honest catches: silent failures investigated loud and fixed at the substrate, not the symptom — surfaced mid-development by the dogfooding itself. That keeps the (true, strong) point — dogfooding surfaced real substrate bugs — without the unfalsifiable comparison. ### Dogfood trigger — confirmed it does its job ✓ Ran `release-decide.sh --dry-run` with the fragment present: `mode=update`, `bump source: fragments=minor + commits=none = minor`, `next_version=0.4.0 tag=v0.4.0`. So on merge → push:main → rolling PR opens at `release-prep/rolling` proposing v0.4.0. The `chore:`-not-`feat:` subject choice is right (bump comes from the `.added.md` suffix; #43 both-sources composition gives `max(minor,none)=minor`). ### #54 render — clean (unlike the v0.3.5 intro) ✓ The fragment's paragraphs are single long lines (line 1 is one 1056-char paragraph; the coexistence para is single-line), and the only multi-line run is a numbered list (renders fine). So this won't hit the #54 hard-break footgun at publish — no manual line-break removal needed. Nice. **Verdict: APPROVED** at `f04ef65`. Factually accurate (verified), voice right, dogfood trigger confirmed, CI green, #54-clean. The meta-claim softening is my one recommended change — solicited, non-blocking; you can apply it pre-merge, or it's also catchable at the operator's Gate-2 rolling-PR review before publish. Either way the fragment is correct as-is. This is the lead-up to the real first-fire — watching for the rolling PR.
chore(changelog): apply Surveyor 0bee prose calibration on v0.4.0 fragment
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 5s
release / release (push) Successful in 0s
e6aa577d52
Two non-blocking calibration nits applied while context warm:

1. **§Substantive-new-surface wording**: "_release.yml *replaces* the
   v0.3.x pair" → "consolidates the function of the v0.3.x pair (the
   v0.3.x reusables remain published at @v0.3.x refs for coexistence)."
   Surveyor's catch: "replaces" reads as "removes" but they coexist
   (as §Consumer-migration itself states); the wording-tension is
   resolved by naming the coexistence inline.

2. **§Dogfood-catch meta-claim** softened — dropped the unverifiable
   comparative ("more bugs in passing than the patch sprints filed in
   months") and replaced with Surveyor's verifiable substrate-honest
   alternative: "Both were strict substrate-honest catches: silent
   failures investigated loud and fixed at the substrate, not the
   symptom — surfaced mid-development by the dogfooding itself."
   Keeps the (true, strong) point — dogfooding surfaced real substrate
   bugs — without breaking the substrate-honest register the rest of
   the fragment earns. Verbatim from Surveyor's review.

CI green; #54-clean preserved (single-line paragraphs); dogfood
trigger confirmed via her dry-run (mode=update, bump=minor,
next_version=0.4.0).

Refs #69 review 0bee.
Sign in to join this conversation.
No description provided.