Skip to content

Commit 82f66f2

Browse files
dmealingclaude
andcommitted
docs(roadmap): conform the Release cells, and rule out the 1.0-cut slot explicitly
Three corrections from the challenge's differential, which caught things both arms missed. The Release column is a MILESTONE bucket, not a version: FR-031/032/035/036 all read "1.0" and all shipped in 0.x. "pre-1.0 MINOR" was a mechanism token in a milestone column, so the cells now read "1.0 · 1.1" — the same compound form FR-024 already uses, and accurate, since the 1.0 line IS where a pre-1.0 breaking MINOR lands. Rules out the option both challenge arms treated as non-existent — and it is the one a reader will reach for first, because it looks free. 1.0.0 is a MAJOR under semver, so a break landing IN the renumbering is neither a pre-1.0 MINOR nor a 2.0 event. It is still wrong: §G3 wants "at least one coordinated release … with no metamodel-breaking changes, to prove the rate has actually dropped". A 1.0 that carries a break has had no quiet period, so it freezes the vocabulary on a stability claim nothing tested. The gate is about evidence, not arithmetic — worth writing down, because the arithmetic reading is the tempting one. Names the tension instead of implying it is closed. CLAUDE.md and the "Before 1.0" section say GA is next and nothing blocks it; this section says a breaking MINOR comes first. Both challenge arms leaned on roadmap:139 to conclude a further MINOR is available and neither engaged the contrary evidence — so the section now states the choice and points at #210's reversal trigger as the mechanism for making it. The one thing that stays unavailable either way is targeting the breaking half at 1.1. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DhpswkF1NvwxhFWMmdAT15
1 parent 0601916 commit 82f66f2

1 file changed

Lines changed: 16 additions & 2 deletions

File tree

spec/roadmap.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ under **Shipped**; planned FRs under **Planned** + the **Release plan**. ✅ shi
4848
| FR-034 | Ecosystem tier — connected systems (`system`/`container`/`surface`/`environment`) | 📋 designed (**draft, deferred post-1.0**) | 1.1 ||
4949
| FR-035 | Present-key PATCH tristate (mutation surface) | 🟢 shipped 5 ports (absent→untouched / present-null→clears / null-on-`@required`→400); coordinated **breaking** release held for FR-036 | 1.0 ||
5050
| FR-036 | Constraint-validation enforcement + semantic pins | 🟢 shipped 5 ports in the coordinated `0.16.0`/`7.8.0` breaking release (required-string = non-empty·accept-whitespace · `@Pattern` = full-match · strictest-wins length; HTTP-tier enforcement all 5 ports; TPH tristate) | 1.0 ||
51-
| FR-037 | Projection expressiveness (`origin.rank`) + field write-access modes (`@mutability`) | ⚪ requirements (pre-design), decisions resolved. **R1/R2 retire registered vocabulary (`@readOnly`), so the breaking half must ride a coordinated pre-1.0 breaking MINOR** — post-1.0 a metamodel-vocabulary break is a 2.0 event (ADR-0035 §1), not a 1.1 minor. `origin.rank` + the rest are additive → 1.1. Design: `docs/superpowers/specs/2026-08-10-fr-037-projection-expressiveness-and-write-once-design.md` | pre-1.0 MINOR · 1.1 ||
52-
| FR-038 | Requirement-derived test stubs (inverts `@verifiedBy`) | ⚪ proposed. Generate the test from the requirement so the link is structural, not a name the author picks — an audit of one 19-name ledger found 4 names that did not verify their claim. **The `@verifiedBy` retirement is breaking and rides the SAME pre-1.0 MINOR as FR-037's R1/R2, not a second one**; the stub generator is additive → 1.1. Design: `docs/superpowers/specs/2026-08-15-fr-038-requirement-derived-test-stubs-design.md` | pre-1.0 MINOR · 1.1 ||
51+
| FR-037 | Projection expressiveness (`origin.rank`) + field write-access modes (`@mutability`) | ⚪ requirements (pre-design), decisions resolved. **R1/R2 retire registered vocabulary (`@readOnly`), so the breaking half must ride a coordinated pre-1.0 breaking MINOR** — post-1.0 a metamodel-vocabulary break is a 2.0 event (ADR-0035 §1), not a 1.1 minor. `origin.rank` + the rest are additive → 1.1. Design: `docs/superpowers/specs/2026-08-10-fr-037-projection-expressiveness-and-write-once-design.md` | 1.0 · 1.1 ||
52+
| FR-038 | Requirement-derived test stubs (inverts `@verifiedBy`) | ⚪ proposed. Generate the test from the requirement so the link is structural, not a name the author picks — an audit of one 19-name ledger found 4 names that did not verify their claim. **The `@verifiedBy` retirement is breaking and rides the SAME pre-1.0 MINOR as FR-037's R1/R2, not a second one**; the stub generator is additive → 1.1. Design: `docs/superpowers/specs/2026-08-15-fr-038-requirement-derived-test-stubs-design.md` | 1.0 · 1.1 ||
5353

5454
_(FR-001 was the original metamodel foundation — pre-dates the FR-numbered tracking.)_
5555
_(FR-032 was developed under the working number "FR-026" — see commit history; renumbered to avoid the FR-026=Forms collision. Design: `docs/superpowers/specs/2026-06-13-fr-032-canonical-fqn-refs-design.md`, ADR-0032.)_
@@ -252,6 +252,13 @@ that retires registered vocabulary. Chartered to ride the next such MINOR:
252252
- **FR-038** — the `@verifiedBy` retirement, explicitly "the same coordinated pre-1.0 breaking
253253
slot as FR-037's `@mutability`, not a second one".
254254

255+
**Why not carry the break in the `1.0` cut itself?** `1.0.0` is a MAJOR under semver, so a
256+
break landing *in* the renumbering is neither a pre-1.0 MINOR nor a 2.0 event — it looks like a
257+
free slot. It is not: §G3 requires "at least one coordinated release after the last breaking
258+
move … with **no** metamodel-breaking changes, **to prove the rate has actually dropped**". A
259+
1.0 that carries a break has had no quiet period at all, so it freezes the vocabulary on the
260+
strength of a stability claim nothing tested. The gate is about evidence, not arithmetic.
261+
255262
**Cost, stated plainly:** landing any of these resets the §G3 quiet-period clock in
256263
`docs/1.0-readiness.md` — "at least one coordinated release after the last breaking move with no
257264
metamodel-breaking changes". So this MINOR pushes the 1.0 renumbering out by at least one
@@ -260,6 +267,13 @@ Group-B entry above: it rides the breaking batch "while 1.0 stays unscheduled",
260267
scheduled imminently" listed as the reversal trigger). Note that ADR-0035's own §C3 text still
261268
names `0.15.1` as the last breaking move — stale; `0.21.0` superseded it.
262269

270+
**The open tension, named:** `CLAUDE.md` and the "Before 1.0" section above both say GA is the
271+
next release move and that nothing outstanding blocks the promotion. This section says a
272+
breaking MINOR comes first. Those are reconcilable only by deciding which goes first — and
273+
#210's reversal trigger is the mechanism for deciding it: if 1.0 is scheduled imminently, ship
274+
the break as documentation-and-rule-of-thumb instead and let the vocabulary changes become 2.0
275+
work. What is NOT available is targeting the breaking half at `1.1`.
276+
263277
### 1.1 — Serialization foundation + connected-systems tier
264278

265279
- **FR-024 declared-API surface** — the deferred half of FR-024: `api.base`/`api.operational`,

0 commit comments

Comments
 (0)