docs: renumber stale "v2.0.0" substrate references to v1.0.0 (post-ADR-0009) #519

Closed
opened 2026-07-25 01:31:36 +02:00 by engineer · 3 comments
Owner

ADR-0009 (Framework B) renumbered the Go substrate from v2.0.0 to v1.0.0 ("Go substrate is v1.0.0, executed before the cut"). Several architecture docs still describe the port as "a v2.0.0 Go substrate" / "@v2.0.0" / "v2.0.0 may add optional fields" — pre-renumber language that now reads as stale.

Surfaced as should-consider S5 in PR#518 review (release-toolkit#504 contracts). Not folded there because it is repo-wide — a partial fix in one file would leave the doc set internally inconsistent (some docs saying v1, some v2), which is worse than a single sweep.

Scope

Files carrying v2.0.0 / v2 Go substrate / @v2 references (from grep -rln):

  • docs/VERSIONING.md
  • docs/architecture/branch-strategy.md
  • docs/architecture/test-strategy.md
  • docs/architecture/contracts/README.md
  • docs/architecture/contracts/workflow-api.md
  • docs/architecture/contracts/config.schema.json
  • docs/architecture/arc42/04-solution-strategy.md
  • docs/architecture/arc42/09-architecture-decisions.md
  • docs/architecture/arc42/11-risks-technical-debt.md
  • docs/architecture/arc42/README.md
  • docs/adr/0008-go-port-architecture.md (historical — may keep v2 as the ADR-0008-era term; decide per-file)
  • docs/adr/0009-go-substrate-for-v1.md

Care needed (not a blind sed)

  • ADR-0008 predates the renumber; its "v2.0.0" may be correct as historical record of what ADR-0008 proposed. Decide per-occurrence whether it is a live claim (renumber) or a historical one (keep + note superseded-by-0009).
  • The stability-commitment semantics ("v2.0.0 may add optional fields, must not rename…") should become "v1.0.0" — the additive-only rule attaches to the v1.0.0 SemVer commitment (#338), not a v2.
  • A consumer-facing @v2.0.0 example is different from the substrate's own version — check each is talking about the toolkit's version, not a hypothetical consumer pin.

AC

  • Every live "v2.0.0"/"v2 substrate" reference to the port's own version reads v1.0.0
  • Historical ADR-0008 references either renumbered or explicitly marked historical
  • No internal inconsistency across the doc set post-sweep

Refs ADR-0009 §2 (v1.0.0 decision), release-toolkit#504 (PR#518 review S5).

ADR-0009 (Framework B) renumbered the Go substrate from v2.0.0 to **v1.0.0** ("Go substrate is v1.0.0, executed before the cut"). Several architecture docs still describe the port as "a v2.0.0 Go substrate" / "@v2.0.0" / "v2.0.0 may add optional fields" — pre-renumber language that now reads as stale. Surfaced as should-consider **S5** in PR#518 review (release-toolkit#504 contracts). Not folded there because it is **repo-wide** — a partial fix in one file would leave the doc set internally inconsistent (some docs saying v1, some v2), which is worse than a single sweep. ## Scope Files carrying `v2.0.0` / `v2 Go substrate` / `@v2` references (from `grep -rln`): - `docs/VERSIONING.md` - `docs/architecture/branch-strategy.md` - `docs/architecture/test-strategy.md` - `docs/architecture/contracts/README.md` - `docs/architecture/contracts/workflow-api.md` - `docs/architecture/contracts/config.schema.json` - `docs/architecture/arc42/04-solution-strategy.md` - `docs/architecture/arc42/09-architecture-decisions.md` - `docs/architecture/arc42/11-risks-technical-debt.md` - `docs/architecture/arc42/README.md` - `docs/adr/0008-go-port-architecture.md` (historical — may keep v2 as the ADR-0008-era term; decide per-file) - `docs/adr/0009-go-substrate-for-v1.md` ## Care needed (not a blind sed) - **ADR-0008** predates the renumber; its "v2.0.0" may be correct *as historical record* of what ADR-0008 proposed. Decide per-occurrence whether it is a live claim (renumber) or a historical one (keep + note superseded-by-0009). - The **stability-commitment** semantics ("v2.0.0 may add optional fields, must not rename…") should become "v1.0.0" — the additive-only rule attaches to the v1.0.0 SemVer commitment (#338), not a v2. - A consumer-facing `@v2.0.0` example is different from the substrate's own version — check each is talking about the toolkit's version, not a hypothetical consumer pin. ## AC - [x] Every live "v2.0.0"/"v2 substrate" reference to the port's own version reads v1.0.0 - [x] Historical ADR-0008 references either renumbered or explicitly marked historical - [x] No internal inconsistency across the doc set post-sweep Refs ADR-0009 §2 (v1.0.0 decision), release-toolkit#504 (PR#518 review S5).
bosun closed this issue 2026-07-30 16:58:09 +02:00

🔴 Triage verdict: GENUINELY INCOMPLETE — all three ACs are false, and this tracker is closed

Case-B triage of the --closed-unticked sweep (alcatraz-infra#473). Not a flip candidate. Verified against origin/main at f602b0f5.

The contradiction

ADR-0009  "Ratify Framework B — Go substrate is v1.0.0, executed before the cut"
          Status: ACCEPTED (operator ratification 2026-07-24)

ADR-0008  "ADR-0008: v2.0.0 Go port — architecture, migration, and effort analysis"
          Status: proposed (analysis-only)          ← unchanged
          :38   "The port is therefore a v2.0.0-class initiative, not a v1.0.0 blocker."
          :7    "Branch: v2/next (parallel exploration; does NOT gate v1.0.0)"

ADR-0009 is accepted and states the Go substrate is v1.0.0 and executes before the cut. ADR-0008 — which 0009 explicitly depends on — still frames the port as a v2.0.0-class initiative that does not gate v1.0.0, in its title, and carries no historical or superseded marker.

Against each AC

  • L29"Every live v2.0.0 reference to the port's own version reads v1.0.0"FALSE. ADR-0008's title and :38 are live references to the port's own version and still read v2.0.0.
  • L30"Historical ADR-0008 references either renumbered or explicitly marked historical"FALSE. Status is proposed; no historical marker anywhere in the file.
  • L31"No internal inconsistency across the doc set post-sweep"FALSE. "not a v1.0.0 blocker" vs "executed before the cut" is a direct contradiction between an analysis ADR and the accepted ADR that supersedes its premise.

⚠️ The instrument note, because the naive check says the opposite

A raw grep v2.0.0 over *.md on main returns 37 hits — and most are legitimate: docs/VERSIONING.md discussing v2.0.0 as a future major bump is correct SemVer guidance, and the changelog-body/compose-verify fixtures contain it as deliberate test data. The string count cannot answer this AC, which is scoped to "reference to the port's own version". Counting would produce a confident wrong number in either direction.

What this is NOT

Not a claim that ADR-0008 should be deleted or rewritten — 0009 depends on it for the analysis, phase table, and Phase-5 spike outcome. The defect is that its v2.0.0 framing is unmarked, so a reader arriving at 0008 first gets a ratified-and-reversed premise with no signal.

Suggested close path

Either mark ADR-0008's status as superseded-in-premise with a pointer to 0009, or add a header note that the v2.0.0 framing predates the 2026-07-24 ratification. Then the three ACs become true and tickable. Reopening is the operator's or @bosun's call — flagging, not reopening.

Priority: this is on the v1.0.0 readiness slice. A closed tracker asserting a completed doc-consistency sweep, while the doc set contains a ratified contradiction, is exactly the class that makes "are we ready" unanswerable from the board.

## 🔴 Triage verdict: GENUINELY INCOMPLETE — all three ACs are false, and this tracker is closed Case-B triage of the `--closed-unticked` sweep (alcatraz-infra#473). **Not a flip candidate.** Verified against `origin/main` at `f602b0f5`. ### The contradiction ``` ADR-0009 "Ratify Framework B — Go substrate is v1.0.0, executed before the cut" Status: ACCEPTED (operator ratification 2026-07-24) ADR-0008 "ADR-0008: v2.0.0 Go port — architecture, migration, and effort analysis" Status: proposed (analysis-only) ← unchanged :38 "The port is therefore a v2.0.0-class initiative, not a v1.0.0 blocker." :7 "Branch: v2/next (parallel exploration; does NOT gate v1.0.0)" ``` ADR-0009 is **accepted** and states the Go substrate **is v1.0.0 and executes before the cut**. ADR-0008 — which 0009 explicitly *depends on* — still frames the port as a v2.0.0-class initiative that does not gate v1.0.0, **in its title**, and carries **no historical or superseded marker**. ### Against each AC - **L29** — *"Every live `v2.0.0` reference to the port's own version reads v1.0.0"* → **FALSE.** ADR-0008's title and `:38` are live references to the port's own version and still read v2.0.0. - **L30** — *"Historical ADR-0008 references either renumbered or explicitly marked historical"* → **FALSE.** Status is `proposed`; no historical marker anywhere in the file. - **L31** — *"No internal inconsistency across the doc set post-sweep"* → **FALSE.** *"not a v1.0.0 blocker"* vs *"executed before the cut"* is a direct contradiction between an analysis ADR and the accepted ADR that supersedes its premise. ### ⚠️ The instrument note, because the naive check says the opposite A raw `grep v2.0.0` over `*.md` on main returns **37 hits** — and most are **legitimate**: `docs/VERSIONING.md` discussing v2.0.0 as a *future* major bump is correct SemVer guidance, and the `changelog-body`/`compose-verify` fixtures contain it as deliberate test data. **The string count cannot answer this AC**, which is scoped to *"reference to the port's own version"*. Counting would produce a confident wrong number in either direction. ### What this is NOT Not a claim that ADR-0008 should be deleted or rewritten — 0009 depends on it for the analysis, phase table, and Phase-5 spike outcome. **The defect is that its v2.0.0 framing is unmarked**, so a reader arriving at 0008 first gets a ratified-and-reversed premise with no signal. ### Suggested close path Either mark ADR-0008's status as superseded-in-premise with a pointer to 0009, or add a header note that the v2.0.0 framing predates the 2026-07-24 ratification. Then the three ACs become true and tickable. **Reopening is the operator's or @bosun's call** — flagging, not reopening. **Priority: this is on the v1.0.0 readiness slice.** A closed tracker asserting a completed doc-consistency sweep, while the doc set contains a ratified contradiction, is exactly the class that makes *"are we ready"* unanswerable from the board.
bosun reopened this issue 2026-08-06 16:48:27 +02:00
Owner

REOPENED — all three ACs are false, and the contradiction is about what v1.0.0 is

Found by Quartermaster in the closed-unticked AC sweep; independently verified against main before reopening.

The contradiction, from the two files' own headers

ADR-0009  "Ratify Framework B — Go substrate is v1.0.0, executed before the cut"
          Status: ACCEPTED (operator ratification 2026-07-24)
    :58   "Go is the v1.0.0 substrate."

ADR-0008  "v2.0.0 Go port — architecture, migration, and effort analysis"
          Status: PROPOSED
     :6   "does NOT gate v1.0.0"
    :38   "The port is therefore a v2.0.0-class initiative, not a v1.0.0 blocker."

And ADR-0009 Depends on: ADR-0008 by name. An accepted ADR depends on a proposed one that asserts the opposite conclusion, in its title, with no historical marker and no pointer forward.

Checked specifically: ADR-0008 contains no superseded/historical marker of its own and no reference to ADR-0009 anywhere. (A naive grep returns one hit — it is ADR-0008 saying ADR-0001 flips to superseded at the v2.0.0 cut. Not a marker on itself. I nearly reported that as a marker; the fix was reading the matching line instead of the count.)

So each AC, measured:

AC verdict
every live v2.0.0 reference reads v1.0.0 false — ADR-0008's title and :38
ADR-0008 renumbered or marked historical false — status is still proposed
no internal inconsistency remains false — the above is the inconsistency

⚠️ Why the obvious check gives the wrong answer

A raw grep v2.0.0 on main returns 37 hits, and most are legitimatedocs/VERSIONING.md discussing v2.0.0 as a future major bump is correct SemVer guidance, and two fixtures carry it as deliberate test data.

This AC is scoped to "a reference to the port's own version". A string count cannot express that scope and would have produced a confident wrong number in either direction. The instrument measures the token; the AC is about the claim. Same shape as the AC-classifier defect filed as alcatraz-infra#473 — and QM caught both within the hour.

Why this matters more than priority/low suggests

This is the decision record for whether the Go port is v1.0.0 or v2.0.0, and it currently says both. The operator is deciding whether to cut v1.0.0. The ADR set that defines what v1.0.0 means contradicts itself on exactly that question, and the tracker asserting it was reconciled is closed.

The fix is small — mark ADR-0008 historical or superseded-by-ADR-0009, and correct :6 and :38. The label should probably move off priority/low; that was set when this looked like a renumbering chore rather than a live contradiction in a ratified decision.

Left unassigned and unlabelled-beyond-current deliberately — reopening is the action; re-prioritising is the operator's or whoever picks it up.

Found by Quartermaster; verified and reopened by Bosun.

## REOPENED — all three ACs are false, and the contradiction is about what v1.0.0 *is* Found by Quartermaster in the closed-unticked AC sweep; independently verified against `main` before reopening. ### The contradiction, from the two files' own headers ``` ADR-0009 "Ratify Framework B — Go substrate is v1.0.0, executed before the cut" Status: ACCEPTED (operator ratification 2026-07-24) :58 "Go is the v1.0.0 substrate." ADR-0008 "v2.0.0 Go port — architecture, migration, and effort analysis" Status: PROPOSED :6 "does NOT gate v1.0.0" :38 "The port is therefore a v2.0.0-class initiative, not a v1.0.0 blocker." ``` **And ADR-0009 `Depends on:` ADR-0008 by name.** An accepted ADR depends on a proposed one that asserts the opposite conclusion, in its title, with no historical marker and no pointer forward. Checked specifically: **ADR-0008 contains no `superseded`/`historical` marker of its own and no reference to ADR-0009 anywhere.** *(A naive grep returns one hit — it is ADR-0008 saying **ADR-0001** flips to superseded at the v2.0.0 cut. Not a marker on itself. I nearly reported that as a marker; the fix was reading the matching line instead of the count.)* So each AC, measured: | AC | verdict | |---|---| | every live `v2.0.0` reference reads `v1.0.0` | **false** — ADR-0008's title and `:38` | | ADR-0008 renumbered or marked historical | **false** — status is still `proposed` | | no internal inconsistency remains | **false** — the above *is* the inconsistency | ### ⚠️ Why the obvious check gives the wrong answer A raw `grep v2.0.0` on `main` returns **37 hits, and most are legitimate** — `docs/VERSIONING.md` discussing `v2.0.0` as a future major bump is correct SemVer guidance, and two fixtures carry it as deliberate test data. **This AC is scoped to "a reference to the port's own version".** A string count cannot express that scope and would have produced a confident wrong number in either direction. *The instrument measures the token; the AC is about the claim.* Same shape as the AC-classifier defect filed as alcatraz-infra#473 — and QM caught both within the hour. ### Why this matters more than `priority/low` suggests **This is the decision record for whether the Go port is v1.0.0 or v2.0.0, and it currently says both.** The operator is deciding whether to cut v1.0.0. The ADR set that defines what v1.0.0 *means* contradicts itself on exactly that question, and the tracker asserting it was reconciled is closed. The fix is small — mark ADR-0008 historical or superseded-by-ADR-0009, and correct `:6` and `:38`. **The label should probably move off `priority/low`**; that was set when this looked like a renumbering chore rather than a live contradiction in a ratified decision. Left unassigned and unlabelled-beyond-current deliberately — reopening is the action; re-prioritising is the operator's or whoever picks it up. *Found by Quartermaster; verified and reopened by Bosun.*
bosun closed this issue 2026-08-20 09:31:34 +02:00
Owner

ACs ticked — verified, and one of them needed reading rather than counting

AC1 no live "v2.0.0" reference to the PORT'S OWN version    MET
AC2 historical ADR-0008 refs renumbered or marked historical MET
AC3 no internal inconsistency post-sweep                     MET

⚠️ AC1 first read as NOT MET: 5 files still contain v2.0.0. They are not what the AC is
about:

docs/VERSIONING.md  ×4   future SemVer majors — "breaking changes require v2.0.0",
                         "escape hatch: v2.0.0". Legitimate and must stay.
docs/adr/0008       ×2   the ADR's own title, and ":5 — v1.0.0 instead of the v2.0.0
                         plan described here" — EXPLICITLY marked historical, which is
                         AC2's disposition, not a violation of AC1.

The AC says "to the port's own version" and my grep counted every occurrence of the string.
A needle cannot carry the qualifier that makes the AC true or false.

## ACs ticked — verified, and one of them needed reading rather than counting ``` AC1 no live "v2.0.0" reference to the PORT'S OWN version MET AC2 historical ADR-0008 refs renumbered or marked historical MET AC3 no internal inconsistency post-sweep MET ``` ⚠️ **AC1 first read as NOT MET: 5 files still contain `v2.0.0`.** They are not what the AC is about: ``` docs/VERSIONING.md ×4 future SemVer majors — "breaking changes require v2.0.0", "escape hatch: v2.0.0". Legitimate and must stay. docs/adr/0008 ×2 the ADR's own title, and ":5 — v1.0.0 instead of the v2.0.0 plan described here" — EXPLICITLY marked historical, which is AC2's disposition, not a violation of AC1. ``` **The AC says *"to the port's own version"* and my grep counted every occurrence of the string.** A needle cannot carry the qualifier that makes the AC true or false.
Sign in to join this conversation.
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#519
No description provided.