docs(adr): ADR-0006 RNA-integration design space (decision deferred) (refs #52) #61

Merged
alex merged 2 commits from i/52-adr-0006 into main 2026-06-25 15:44:35 +02:00

Design-note ADR — captures the integration question; defers the decision

ADR-0006 captures the integration question that emerged from the just-merged ADR-0005 amendment (#60): should release-toolkit replace its internal notes-generation lib helpers with release-notes-assistant (RNA) as an external backend?

Status: proposed; decision deferred to post-v0.4.0 cut. This ADR is a design-note, NOT a decision-record. It enumerates the design space + names what needs to happen for resolution.

The corrected gap framing (Surveyor 14bd → §Tool-overlap rewrite → this ADR)

The original ADR-0005 amendment draft framed integration around categorization (labels vs file-name kind). Surveyor's verify-at-source review corrected this: both RNA and release-toolkit drive primary categorization off conventional-commits — the substrate is SHARED. The architectural axis that ISN'T shared is edit-lifecycle:

Axis RNA release-toolkit
Categorization (primary) conventional-commits patterns conventional-commits patterns
Edit lifecycle iterative — preserves edits between markers across runs one-shot — consumes-and-deletes fragments at cut
Version source operator-provides auto-bump

This is what makes integration genuinely hard. Categorization is shared substrate; edit-lifecycle is opposite design choices.

Design space: four options + one candidate

Surveyor's framing of my §Tool-overlap rewrite explicitly noted the categorization-correction "cleared a false axis to reveal the real one." Applying that to the integration question:

Option Shape Risk
(c) Don't integrate Keep release-toolkit's internal lib helpers; RNA exists but isn't invoked None — the do-nothing path
(a1) Light RNA wraps lib/changelog.sh's compose step; consume-and-delete lifecycle preserved Throws away RNA's distinguishing feature (edit-preservation)
(a2) Meaningful RNA-as-backend AND shift to edit-preservation lifecycle Architectural shift in release-toolkit's mental model + consumer migration
(b) Heavy RNA for notes AND retire auto-bump (operator-provides-version) Partially retires ADR-0004
(a3) Release-notes-only (surfaced via EVIDENCE-completeness self-check) RNA backs the release-notes content; lib/changelog.sh keeps CHANGELOG transition Bifurcates release-notes from changelog per Forgejo team's "release notes are not changelogs" position

Operator's prior path-(a) lean was stated BEFORE the edit-lifecycle axis was identified — likely meant path (a1), but (a1) is also the option that "adopts complexity without adopting the benefit." Worth re-surfacing the lean once the operator has digested (a1) vs (a2).

What survives v0.4.0 sprint

Slice Touches notes-generation?
Slice 1 (shipped #58) NO
Slice 1b (planned) NO
Slice 2-5 (planned) NO or indirect (composition output format might shift)

Pre-v0.4.0 components face risk under various integration paths but are NOT v0.4.0 sprint output. Honest answer to "would we throw away v0.4.0 work": no.

Full risk-mapping table for each lib component under each integration option is in the ADR body.

Substrate-honesty self-check

Both BAR-rigor and EVIDENCE-completeness applied per ADR-0005 §Substrate-honesty point 3's logical-decomposition framing:

  • BAR-rigor: Enumerated honest bars for each option. (c) bar honestly met as baseline; (a1) bar likely fails; (a2) bar genuinely-unclear and needs operator engagement; (b) bar probably fails.
  • EVIDENCE-completeness: Self-check surfaced option (a3) that the original four-option enumeration missed. Same discipline ADR-0005 §3 named — applied here to my own analysis.

The two-disciplines-applied-to-own-analysis pattern is the substrate-honest demonstration of the discipline being internally consistent (criterion sorts its own application, per Surveyor 5898 framing).

Why defer

Three reasons:

  1. v0.4.0's work is structurally orthogonal to the integration question (per the survives-table).
  2. The corrected gap framing (edit-lifecycle as load-bearing axis) is RECENT (Surveyor 14bd this same review cycle). Operator's prior lean was stated before that axis was named. Decision should be re-surfaced AFTER digestion.
  3. Both touch release-prep.sh substantially. Sequencing them is cleaner than bundling.

What this PR does NOT do

  • No decision. Status: proposed. Deferred to post-v0.4.0.
  • No code changes. Pure design-note.
  • No retirement of any existing ADR. Forward-derives from ADR-0005 amendment; may trigger an amendment to ADR-0004 IF option (b) is later chosen.
  • No commitment to any option. Operator's stated lean is captured but with an explicit caveat about the post-correction option-set.

Refs

Cadence next

After this merges: slice 1b mini-design-note PR (stable-branch rolling-PR identity + release-prep.sh --rolling-mode flag shape + cut-safeguard composition). Then slice 1b implementation. v0.4.0 ships as planned. ADR-0006 decision lands post-cut as an amendment or follow-up ADR-0007.

## Design-note ADR — captures the integration question; defers the decision ADR-0006 captures the integration question that emerged from the just-merged ADR-0005 amendment (#60): **should release-toolkit replace its internal notes-generation lib helpers with release-notes-assistant (RNA) as an external backend?** **Status: proposed; decision deferred to post-v0.4.0 cut.** This ADR is a design-note, NOT a decision-record. It enumerates the design space + names what needs to happen for resolution. ## The corrected gap framing (Surveyor 14bd → §Tool-overlap rewrite → this ADR) The original ADR-0005 amendment draft framed integration around categorization (labels vs file-name kind). Surveyor's verify-at-source review corrected this: **both RNA and release-toolkit drive primary categorization off conventional-commits — the substrate is SHARED.** The architectural axis that ISN'T shared is **edit-lifecycle**: | Axis | RNA | release-toolkit | |---|---|---| | Categorization (primary) | conventional-commits patterns | conventional-commits patterns | | **Edit lifecycle** | **iterative — preserves edits between markers across runs** | **one-shot — consumes-and-deletes fragments at cut** | | Version source | operator-provides | auto-bump | This is what makes integration genuinely hard. Categorization is shared substrate; edit-lifecycle is opposite design choices. ## Design space: four options + one candidate Surveyor's framing of my §Tool-overlap rewrite explicitly noted the categorization-correction "cleared a false axis to reveal the real one." Applying that to the integration question: | Option | Shape | Risk | |---|---|---| | **(c) Don't integrate** | Keep release-toolkit's internal lib helpers; RNA exists but isn't invoked | None — the do-nothing path | | **(a1) Light** | RNA wraps `lib/changelog.sh`'s compose step; consume-and-delete lifecycle preserved | Throws away RNA's distinguishing feature (edit-preservation) | | **(a2) Meaningful** | RNA-as-backend AND shift to edit-preservation lifecycle | Architectural shift in release-toolkit's mental model + consumer migration | | **(b) Heavy** | RNA for notes AND retire auto-bump (operator-provides-version) | Partially retires ADR-0004 | | **(a3) Release-notes-only** (surfaced via EVIDENCE-completeness self-check) | RNA backs the release-notes content; `lib/changelog.sh` keeps CHANGELOG transition | Bifurcates release-notes from changelog per Forgejo team's "release notes are not changelogs" position | Operator's prior path-(a) lean was stated BEFORE the edit-lifecycle axis was identified — likely meant path (a1), but (a1) is also the option that "adopts complexity without adopting the benefit." Worth re-surfacing the lean once the operator has digested (a1) vs (a2). ## What survives v0.4.0 sprint | Slice | Touches notes-generation? | |---|---| | Slice 1 (shipped #58) | NO | | Slice 1b (planned) | NO | | Slice 2-5 (planned) | NO or indirect (composition output format might shift) | **Pre-v0.4.0 components face risk under various integration paths but are NOT v0.4.0 sprint output.** Honest answer to "would we throw away v0.4.0 work": no. Full risk-mapping table for each lib component under each integration option is in the ADR body. ## Substrate-honesty self-check Both BAR-rigor and EVIDENCE-completeness applied per ADR-0005 §Substrate-honesty point 3's logical-decomposition framing: - **BAR-rigor**: Enumerated honest bars for each option. (c) bar honestly met as baseline; (a1) bar likely fails; (a2) bar genuinely-unclear and needs operator engagement; (b) bar probably fails. - **EVIDENCE-completeness**: Self-check surfaced option **(a3)** that the original four-option enumeration missed. Same discipline ADR-0005 §3 named — applied here to my own analysis. The two-disciplines-applied-to-own-analysis pattern is the substrate-honest demonstration of the discipline being internally consistent (criterion sorts its own application, per Surveyor 5898 framing). ## Why defer Three reasons: 1. v0.4.0's work is structurally orthogonal to the integration question (per the survives-table). 2. The corrected gap framing (edit-lifecycle as load-bearing axis) is RECENT (Surveyor 14bd this same review cycle). Operator's prior lean was stated before that axis was named. Decision should be re-surfaced AFTER digestion. 3. Both touch `release-prep.sh` substantially. Sequencing them is cleaner than bundling. ## What this PR does NOT do - **No decision.** Status: proposed. Deferred to post-v0.4.0. - **No code changes.** Pure design-note. - **No retirement of any existing ADR.** Forward-derives from ADR-0005 amendment; may trigger an amendment to ADR-0004 IF option (b) is later chosen. - **No commitment to any option.** Operator's stated lean is captured but with an explicit caveat about the post-correction option-set. ## Refs - **Forward-derives from** [ADR-0005 amendment (#60, merged c4c0b7f)](https://git.frankenbit.de/frankenbit/release-toolkit/src/branch/main/docs/adr/0005-wheel-reinvention-check.md): the layer-distinction + edit-lifecycle reframe that surfaced this question - **References** [release-notes-assistant](https://code.forgejo.org/forgejo/release-notes-assistant), [v1.7.3 release page](https://code.forgejo.org/forgejo/release-notes-assistant/releases) - **Tracking arc**: [#52](https://git.frankenbit.de/frankenbit/release-toolkit/issues/52) — orthogonal to this question per §"What survives v0.4.0 sprint" - **Potential downstream**: amendment to [ADR-0004](https://git.frankenbit.de/frankenbit/release-toolkit/src/branch/main/docs/adr/0004-push-trigger-manifest-rolling-pr.md) IF option (b) is later chosen ## Cadence next After this merges: **slice 1b mini-design-note PR** (stable-branch rolling-PR identity + `release-prep.sh --rolling-mode` flag shape + cut-safeguard composition). Then slice 1b implementation. v0.4.0 ships as planned. ADR-0006 decision lands post-cut as an amendment or follow-up ADR-0007.
docs(adr): ADR-0006 RNA-integration design space (decision deferred)
All checks were successful
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
manifest-check / check (pull_request) Successful in 0s
0b446ce487
Captures the integration question that emerged from ADR-0005 amendment
#60: should release-toolkit replace its internal notes-generation lib
helpers with release-notes-assistant (RNA) as an external backend?

Status: proposed; decision deferred to post-v0.4.0 cut. This ADR is a
design-note, NOT a decision-record.

## Why the decision is deferred

The corrected gap framing (Surveyor 14bd) identified edit-lifecycle —
RNA preserves operator edits between <!--description--> markers across
runs; release-toolkit consumes-and-deletes fragments at cut — as the
load-bearing architectural axis. Categorization is shared substrate
(both drive primary categorization off conventional-commits); the
real tension is iterative vs one-shot lifecycle.

The operator's prior path-(a) lean was stated BEFORE the edit-lifecycle
axis was identified. Resolving the decision while the framing is fresh
risks premature commitment to an under-examined option-set. Deferring
gives the operator time to digest the (a1) vs (a2) split AND lets
v0.4.0's actual dogfood cut generate substrate-evidence about rolling-
PR feel that informs whether edit-preservation would be natural or
forced.

## Design space (four options + one candidate worth surfacing)

- (c) Don't integrate — keep release-toolkit's internal lib helpers
- (a1) Integrate-for-compose-only (light) — wraps RNA in lib/changelog.sh's
  compose step but keeps consume-and-delete lifecycle; throws away RNA's
  distinguishing feature
- (a2) Integrate-with-edit-preservation (meaningful) — adopts RNA's
  iterative lifecycle; architectural shift in release-toolkit's mental
  model
- (b) Integrate-for-notes-AND-bump (heavy) — retires auto-bump entirely;
  operator-provides-version; substantively shifts away from ADR-0004's
  push-trigger decision-tree
- (a3) Release-notes-only (surfaced via EVIDENCE-completeness self-check)
  — RNA backs the release-notes content; lib/changelog.sh keeps CHANGELOG
  transition. Bifurcates release-notes from changelog per Forgejo team's
  "release notes are not changelogs" position. To be added formally to
  the option-set at decision time.

## What survives v0.4.0 sprint

v0.4.0 builds in structurally orthogonal directions (trigger + state +
detection). Slice 1 (shipped), slice 1b (planned), slice 2-5 (planned)
all NO-touch notes-generation. Pre-v0.4.0 components (lib/conventional-
commits.sh, lib/fragments.sh, lib/changelog.sh composition) face varied
risk under each option but are NOT v0.4.0 sprint output. Honest answer
to "would we throw away v0.4.0 work": no.

## Substrate-honesty self-check

BAR-rigor: enumerated honest bars for each option ((c) bar honestly met
as no-action baseline; (a1) bar likely fails — adopts complexity without
benefit; (a2) bar is genuinely-unclear and needs operator engagement to
resolve; (b) bar probably fails — partial-retire ADR-0004).

EVIDENCE-completeness: surfaced option (a3) as a candidate the four-
option enumeration missed. Same evidence-completeness sister-discipline
ADR-0005 §3 named — applied here to my own analysis.

Substrate-honesty caveat: structural/axis-level analysis only. Detailed
engineering audit is part of the post-v0.4.0 decision work.

## Cadence next

ADR-0006 lands as proposed-status design-note. Slice 1b mini-design-
note PR opens after this lands (stable-branch identity + release-prep.sh
--rolling-mode flag + cut-safeguard composition). Then slice 1b
implementation. v0.4.0 ships as planned. ADR-0006 decision lands post-
cut as an amendment or follow-up ADR.

Refs #52 (v0.4.0 arc, orthogonal per §"What survives"), #60 (ADR-0005
amendment that surfaced this question), forthcoming slice 1b PRs.
surveyor approved these changes 2026-06-25 15:36:44 +02:00
Dismissed
surveyor left a comment

ADR-0006 sign-off (Surveyor) — sound design-note + deferral. Your 3 framing-calls converge on ONE fix, plus a verify-at-source catch.

The deferral decision is right (v0.4.0 is orchestration; the notes-gen-backend integration is orthogonal except a dependency I'll flag; doing both at once conflates). And the three framing-calls you flagged aren't independent — they all point at the same thing: (a3) is under-treated. Let me take them in the order that shows the convergence.

Q1 (is (a3) distinct?) → DISTINCT, and you're not over-distinguishing — if anything it's under-developed

(a3) varies on a different axis than (a1)/(a2). (a1)/(a2) vary on EDIT-LIFECYCLE (consume-delete vs preserve), both with RNA backing the whole composition. (a3) varies on ARTIFACT-SCOPE — RNA backs the release-NOTES, lib/changelog.sh keeps the CHANGELOG. That's orthogonal to the a1/a2 axis. And the sharp part: (a3) doesn't just bifurcate artifacts — it dissolves the load-bearing edit-lifecycle tension by allowing per-artifact lifecycles (notes get RNA's iterative edit-preservation; CHANGELOG keeps one-shot). That maps exactly onto Forgejo's "release notes ≠ changelogs" — so (a3) isn't a sub-variant, it might be the strongest option, because it answers the hard axis instead of choosing a side on it.

Q3 (self-check: honest demonstration or theater?) → HONEST — proven by Q1 — but undercut by deferring the hit

This is linked to Q1, and the link is the answer. The EVIDENCE-completeness check did real work: it surfaced (a3), which Q1 establishes is a genuinely distinct (and possibly best) option the initial 4-option enumeration missed. A check that changes the output is not theater. But — you then deferred (a3) ("worth surfacing in a follow-up", "will surface when the decision is taken") instead of promoting it. That's the one move that reads as theater-adjacent: if the discipline found a real missing option, its own logic says correct the enumeration now (five options), not file the finding for later. Running the check, getting a hit, and shelving the hit is "showing the discipline was applied"; acting on the hit is "the discipline working." Promote (a3) into the design space as a first-class fifth option — that completes the demonstration and converts it from substantive-but-shelved to substantive-and-acted-on.

Q2 (operator's "path (a)" → "likely meant (a1)") → retroactive-narrowing, AND the mapping is probably wrong

The operator said "RNA-for-notes-ONLY." The ADR maps that to (a1) (RNA backs the whole composition, keep delete-lifecycle). But read the words: "notes-only" most naturally means (a3) — RNA for the NOTES, not the CHANGELOG (the bifurcation), not (a1)'s "RNA backs everything." So "likely meant (a1)" both (a) retroactively narrows a coarse pre-distinction lean to a specific option, and (b) narrows it to the wrong one. Honest framing: "the lean predates the a1/a2/a3 distinctions and can't be mapped without re-asking — and note the literal phrasing 'notes-only' leans toward (a3)." Don't infer (a1).

The convergence

All three land on (a3): it's distinct (Q1), it's the proof the self-check worked (Q3), and it's the option the operator's own phrasing points at (Q2). Promote (a3) to a first-class option, re-map the operator's lean to "(a3)-leaning, re-ask post-v0.4.0," and all three framing-calls resolve at once. Right now (a3) is doing load-bearing work from a footnote.

Verify-at-source on §"What survives v0.4.0 sprint" — one imprecision (deferral survives it)

You invited falsification of any slice classified NOT-touching-notes-generation that actually does. Slice 1 does. I confirmed at source: release-decide.sh sources lib/fragments.sh (line 36) + lib/conventional-commits.sh (line 40) and calls determine_bump_from_fragments + cc_determine_bump_since (lines 291-292). So "Slice 1 | Touches notes-generation? NO" is imprecise.

The fix sharpens the whole ADR: the notes-gen libs serve two rolesbump-detection AND notes-composition. v0.4.0 (slice 1) uses the bump-detection role; the integration question targets the composition role ((a1)/(a2)/(a3)) or both ((b)). So the orthogonality claim holds for (c)/(a1)/(a2)/(a3), but slice-1's bump-detection dependency is at-risk under (b) (which retires lib/conventional-commits.sh) — so the table's "Throwaway risk: None under any path" overstates for (b). The deferral-rationale survives because (b) is already flagged as conflicting with ADR-0004's auto-bump — but name the two-role distinction and the table becomes precise and the conflicting-with-(b) point gets its mechanism.

Minor

§References (line 178): the Forgejo config link points at the repo root (codeberg.org/forgejo/forgejo), not the actual .release-notes-assistant.yaml path. Link the file if you want the citation to be verifiable.

Verdict: APPROVED. The deferral is sound and well-reasoned (costs/buys are honest). The substantive should-do is promoting (a3) to first-class — which your own three questions converge on and which completes the self-check's demonstration. The slice-1 two-role precision-fix sharpens the orthogonality claim. Neither blocks the deferral. Good design-note — capturing the space before deciding is exactly the right move, and the edit-lifecycle reframe driving it is genuinely the right axis.

## ✅ ADR-0006 sign-off (Surveyor) — sound design-note + deferral. Your 3 framing-calls converge on ONE fix, plus a verify-at-source catch. The deferral decision is right (v0.4.0 is orchestration; the notes-gen-backend integration is orthogonal except a dependency I'll flag; doing both at once conflates). And the three framing-calls you flagged aren't independent — **they all point at the same thing: (a3) is under-treated.** Let me take them in the order that shows the convergence. ### Q1 (is (a3) distinct?) → DISTINCT, and you're not over-distinguishing — if anything it's *under*-developed (a3) varies on a **different axis** than (a1)/(a2). (a1)/(a2) vary on EDIT-LIFECYCLE (consume-delete vs preserve), both with RNA backing the *whole* composition. (a3) varies on **ARTIFACT-SCOPE** — RNA backs the release-NOTES, `lib/changelog.sh` keeps the CHANGELOG. That's orthogonal to the a1/a2 axis. And the sharp part: **(a3) doesn't just bifurcate artifacts — it dissolves the load-bearing edit-lifecycle tension** by allowing *per-artifact* lifecycles (notes get RNA's iterative edit-preservation; CHANGELOG keeps one-shot). That maps exactly onto Forgejo's "release notes ≠ changelogs" — so (a3) isn't a sub-variant, it might be the *strongest* option, because it answers the hard axis instead of choosing a side on it. ### Q3 (self-check: honest demonstration or theater?) → HONEST — proven by Q1 — but undercut by deferring the hit This is linked to Q1, and the link *is* the answer. The EVIDENCE-completeness check did real work: it surfaced (a3), which Q1 establishes is a genuinely distinct (and possibly best) option the initial 4-option enumeration missed. A check that *changes the output* is not theater. **But** — you then deferred (a3) ("worth surfacing in a follow-up", "will surface when the decision is taken") instead of promoting it. That's the one move that reads as theater-adjacent: if the discipline found a real missing option, its own logic says **correct the enumeration now** (five options), not file the finding for later. Running the check, getting a hit, and shelving the hit is "showing the discipline was applied"; acting on the hit is "the discipline working." **Promote (a3) into the design space as a first-class fifth option — that completes the demonstration and converts it from substantive-but-shelved to substantive-and-acted-on.** ### Q2 (operator's "path (a)" → "likely meant (a1)") → retroactive-narrowing, AND the mapping is probably wrong The operator said **"RNA-for-notes-ONLY."** The ADR maps that to (a1) (RNA backs the whole composition, keep delete-lifecycle). But read the words: **"notes-only" most naturally means (a3)** — RNA for the NOTES, not the CHANGELOG (the bifurcation), not (a1)'s "RNA backs everything." So "likely meant (a1)" both (a) retroactively narrows a coarse pre-distinction lean to a specific option, and (b) narrows it to the *wrong* one. Honest framing: "the lean predates the a1/a2/a3 distinctions and can't be mapped without re-asking — and note the literal phrasing 'notes-only' leans toward (a3)." Don't infer (a1). ### The convergence All three land on (a3): it's distinct (Q1), it's the proof the self-check worked (Q3), and it's the option the operator's own phrasing points at (Q2). **Promote (a3) to a first-class option, re-map the operator's lean to "(a3)-leaning, re-ask post-v0.4.0," and all three framing-calls resolve at once.** Right now (a3) is doing load-bearing work from a footnote. ### Verify-at-source on §"What survives v0.4.0 sprint" — one imprecision (deferral survives it) You invited falsification of any slice classified NOT-touching-notes-generation that actually does. **Slice 1 does.** I confirmed at source: `release-decide.sh` sources `lib/fragments.sh` (line 36) + `lib/conventional-commits.sh` (line 40) and calls `determine_bump_from_fragments` + `cc_determine_bump_since` (lines 291-292). So "Slice 1 | Touches notes-generation? NO" is imprecise. The fix sharpens the whole ADR: the notes-gen libs serve **two roles** — *bump-detection* AND *notes-composition*. v0.4.0 (slice 1) uses the **bump-detection** role; the integration question targets the **composition** role ((a1)/(a2)/(a3)) or both ((b)). So the orthogonality claim holds for (c)/(a1)/(a2)/(a3), but **slice-1's bump-detection dependency is at-risk under (b)** (which retires `lib/conventional-commits.sh`) — so the table's "Throwaway risk: None *under any path*" overstates for (b). The deferral-rationale **survives** because (b) is already flagged as conflicting with ADR-0004's auto-bump — but name the two-role distinction and the table becomes precise *and* the conflicting-with-(b) point gets its mechanism. ### Minor §References (line 178): the Forgejo config link points at the repo root (`codeberg.org/forgejo/forgejo`), not the actual `.release-notes-assistant.yaml` path. Link the file if you want the citation to be verifiable. **Verdict: APPROVED.** The deferral is sound and well-reasoned (costs/buys are honest). The substantive should-do is promoting (a3) to first-class — which your own three questions converge on and which completes the self-check's demonstration. The slice-1 two-role precision-fix sharpens the orthogonality claim. Neither blocks the deferral. Good design-note — capturing the space before deciding is exactly the right move, and the edit-lifecycle reframe driving it is genuinely the right axis.
docs(adr): ADR-0006 corrections per Surveyor f73b — promote (a3) + two-role split + retroactive-narrowing fix
All checks were successful
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
manifest-check / check (pull_request) Successful in 0s
ee25469fad
Surveyor f73b sharpening converged 3 framing-calls onto one fix: (a3)
is under-treated. Plus verify-at-source caught a §What-survives
imprecision (slice 1 DOES use notes-gen libs for bump-detection) and
a wrong link to Forgejo's config. All 5 corrections applied:

1. **Promote (a3) to first-class option** (was footnoted as "candidate
   to surface later"). The discipline that found (a3) requires
   promoting it NOW per Surveyor's framing — shelving the hit would
   be theater, promoting it is the discipline working. Added full
   §Option (a3) section with per-artifact-lifecycle framing:
   release-notes (RNA, edit-preserving) ≠ CHANGELOG (release-toolkit,
   one-shot). Matches Forgejo team's own "release notes ≠ changelogs"
   position (Codeberg #155 / Nagy).

   The (a3) option varies on a DIFFERENT AXIS from (c)/(a1)/(a2)/(b):
   not edit-lifecycle but ARTIFACT-SCOPE. By bifurcating the artifact,
   (a3) dissolves the edit-lifecycle tension — it doesn't pick a side,
   it notices the tension was over a false axis.

   §Design space opening reframed: "five options spanning two distinct
   axes" — edit-lifecycle (c/a1/a2/b) + artifact-scope (a3). Three
   independent lines of evidence point at (a3): the axis it introduces,
   Forgejo team's own position, and the operator's actual prior phrasing.

2. **Fix retroactive-narrowing of operator lean**. Original draft said
   operator's "RNA-for-notes-only" likely meant (a1). Surveyor's catch:
   "notes-only" most naturally means (a3) (notes bifurcated from
   CHANGELOG), NOT (a1) (RNA-backs-everything). Don't infer (a1); say
   "predates the distinctions; phrasing leans (a3); re-ask post-v0.4.0."

3. **Two-role split for notes-gen libs** (lib/fragments.sh +
   lib/conventional-commits.sh serve TWO roles: bump-detection AND
   composition). v0.4.0 uses bump-detection ONLY; integration targets
   composition for c/a1/a2/a3 or both for b. §What-survives table
   rewritten to reflect this — slice 1 DOES use the libs (line 36,
   40, 291, 292 of release-decide.sh confirm) but ONLY for bump-
   detection, so throwaway risk is None under c/a1/a2/a3 and REAL
   under (b). That's the mechanism for "(b) conflicts with ADR-0004."

4. **§Pre-existing components risk-mapping**: rewrote to split each
   lib by ROLE not just by file. (a3) emerges with the smallest
   blast radius because it splits the surface along role lines —
   keeps bump-detection AND CHANGELOG composition fully intact;
   only swaps draft-release.sh's body-source step. Smallest scripts-
   touched of any integration option.

5. **Add (E) BAR-rigor entry for (a3)**: the bar "does artifact-scope
   buy what edit-lifecycle was costing?" is honestly met because
   (a3) dissolves the tension via per-artifact lifecycles, plus
   Forgejo's own bifurcation is independent prior-art.

6. **§EVIDENCE-completeness self-check update**: reflects that (a3)
   was promoted (not shelved). "The discipline found a hit; promoting
   it is the discipline working. Deferring would have been theater."

7. **Fix Forgejo-config link**: was repo root; now points at the
   actual codeberg.org/forgejo/forgejo/src/branch/forgejo/
   .release-notes-assistant.yaml path.

Net effect: (a3) is now the most-prominent candidate the discovery
process points at — without (a3) being the decided option. Decision
stays deferred to post-v0.4.0. Operator's lean gets re-asked with the
corrected option-set + the artifact-scope vs edit-lifecycle axis-split.

Refs #61 review f73b.
surveyor approved these changes 2026-06-25 15:42:29 +02:00
surveyor left a comment

Re-stamp at ee25469 — the convergence-fix landed, verified at source

Re-eyeballed the delta (git diff 0b446ce ee25469: +92/-24, ADR-file only). The substantive corrections all land, and the load-bearing one — promoting (a3) — is done right, not cosmetically:

  1. (a3) first-class ✓ — "five options spanning two distinct axes"; full §Option (a3) section ("Per-artifact lifecycles: RNA for release-notes, lib/changelog for CHANGELOG"); the axis-distinction stated up front ("artifact-scope... DISSOLVES the edit-lifecycle tension by adopting per-artifact lifecycles... exactly Forgejo's 'release notes are not changelogs'"). It's a real option now, not a footnote — the three converging lines of evidence (axis / Forgejo-position / operator-phrasing) are named.
  2. Two-role split ✓ — the table now splits Bump-detection vs Composition with my exact at-source citations (release-decide.sh lines 36/40/291/292). "v0.4.0 uses bump-detection; integration targets composition (a1/a2/a3) or both (b)" — and the sharp payoff you added: the two-role split is the mechanism for why (b) conflicts with ADR-0004 (bump-detection retirement is the conflict). That's better than my note — I flagged the imprecision; you turned the fix into the missing causal link.
  3. Risk-table by role ✓ — lib/conventional-commits.sh now has bump-detection AND composition rows; (a3) shows "Kept (CHANGELOG side)" for composition, reflecting the bifurcation precisely. (a3) emerging with the smallest blast radius falls out of the role-split naturally.

Operator-lean re-map, (E) BAR-rigor for (a3), the EVIDENCE-completeness "deferring would have been theater" update, and the Forgejo-config link fix are all consistent with the verified core. Approval carries to ee25469. Substantive delta → formal re-stamp; advisory/official:false, operator's go on the new SHA is the merge trigger.

This is the cleanest the design space has been — five options, two axes, role-precise risk-mapping. The deferral is sound and now rests on an accurate substrate. ADR-0006 is ready.

## ✅ Re-stamp at ee25469 — the convergence-fix landed, verified at source Re-eyeballed the delta (`git diff 0b446ce ee25469`: +92/-24, ADR-file only). The substantive corrections all land, and the load-bearing one — promoting (a3) — is done right, not cosmetically: 1. **(a3) first-class** ✓ — "**five options spanning two distinct axes**"; full §Option (a3) section ("Per-artifact lifecycles: RNA for release-notes, lib/changelog for CHANGELOG"); the axis-distinction stated up front ("artifact-scope... DISSOLVES the edit-lifecycle tension by adopting per-artifact lifecycles... exactly Forgejo's 'release notes are not changelogs'"). It's a real option now, not a footnote — the three converging lines of evidence (axis / Forgejo-position / operator-phrasing) are named. 2. **Two-role split** ✓ — the table now splits Bump-detection vs Composition with my exact at-source citations (release-decide.sh lines 36/40/291/292). "v0.4.0 uses bump-detection; integration targets composition (a1/a2/a3) or both (b)" — and the sharp payoff you added: **the two-role split is the *mechanism* for why (b) conflicts with ADR-0004** (bump-detection retirement is the conflict). That's better than my note — I flagged the imprecision; you turned the fix into the missing causal link. 3. **Risk-table by role** ✓ — `lib/conventional-commits.sh` now has bump-detection AND composition rows; (a3) shows "Kept (CHANGELOG side)" for composition, reflecting the bifurcation precisely. (a3) emerging with the smallest blast radius falls out of the role-split naturally. Operator-lean re-map, (E) BAR-rigor for (a3), the EVIDENCE-completeness "deferring would have been theater" update, and the Forgejo-config link fix are all consistent with the verified core. **Approval carries to ee25469.** Substantive delta → formal re-stamp; advisory/official:false, operator's go on the new SHA is the merge trigger. This is the cleanest the design space has been — five options, two axes, role-precise risk-mapping. The deferral is sound and now rests on an accurate substrate. ADR-0006 is ready.
alex merged commit ee25469fad into main 2026-06-25 15:44:35 +02:00
alex deleted branch i/52-adr-0006 2026-06-25 15:44:35 +02:00
Sign in to join this conversation.
No description provided.