Skip to content

Commit aaa929b

Browse files
dmealingclaude
andcommitted
docs(1.0): declare the scope; rule that the RC must run against an adopter
Two maintainer decisions, recorded where the gate lives. **G3a — DECLARED.** What Metamodel 1.0 covers is the vocabulary named by expected-registry.json at the cut commit, plus the canonical format and the wire contract; everything outstanding only ADDS to that set. The declaration is deliberately the weaker claim — NOT "the vocabulary is finished", since FR-024's declared-API tier and FR-034's ecosystem tier are both real and both unbuilt, but that finishing them is additive, so freezing now costs an adopter nothing. Backed by three checks: zero experimental markers in the registry, every remaining roadmap item additive, and all three open issues CLI surfaces over vocabulary that already exists. The bullet says to RE-RUN those at the cut commit, because the declaration is about the manifest that ships. **G3d — RULED: the RC must be exercised against a real adopter, and it BLOCKS.** Publish the RC, wire it into an adopter's CI with the drift gate ENFORCED, run gen + verify + a migration, fix what it finds, then promote. The argument against is recorded rather than dropped, because it is a real cost and the decision should stay legible: all six known adopters are maintainer-owned, so this is closer to self-validation than independent evidence, and it makes the cut wait on a repository that is not the one being frozen. It was heard and rejected. A conformance corpus gates the five ports AGAINST EACH OTHER and never against use — every port can agree perfectly on a contract that is wrong in practice. 0.24.3 and 0.24.5 are the precedent: both were largely defects found by running the documented path, which nothing in this repo was asking. So the open path to 1.0 is now G3d, then G1/G2/G4 — all mechanics after it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01At3v6M6uqECZ2Sb5eUv6YY
1 parent 2b33f63 commit aaa929b

2 files changed

Lines changed: 51 additions & 14 deletions

File tree

‎AGENTS.md‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,14 @@ longer asks for "one coordinated release with no metamodel-breaking change." It
2424
variable the maintainer sets, and it had already converged — `metamodelVersion` held at `0.13`
2525
across `v0.24.2`–`v0.24.5`, four consecutive releases — before `0.25.0` spent the breaking slot
2626
by decision. It is replaced by **G3a** (declared scope covered, nothing outstanding needs new
27-
vocabulary), **G3b** (DONE — `docs/compatibility-policy.md` carries the *correction bar*: the
28-
three-part test under which input that never had a valid meaning may stop loading in a PATCH,
29-
explicitly NOT covering retirement of vocabulary that worked) and **G3c** (DONE — the migration
30-
guide and compat policy are current at the cut). Ruling in ADR-0035 **Amendment 3**. Do not
31-
reintroduce a waiting gate in any form.
27+
vocabulary — **DECLARED 2026-09-07**), **G3b** (DONE — `docs/compatibility-policy.md` carries
28+
the *correction bar*: the three-part test under which input that never had a valid meaning may
29+
stop loading in a PATCH, explicitly NOT covering retirement of vocabulary that worked), **G3c**
30+
(DONE — the migration guide and compat policy are current at the cut) and **G3d** (OPEN, and the
31+
one gate now blocking the cut — an adopter estate must run the RELEASE CANDIDATE with the drift
32+
gate ENFORCED before promote; ruled 2026-09-07 knowing all six adopters are maintainer-owned,
33+
because a conformance corpus gates the ports against each other and never against use). Ruling
34+
in ADR-0035 **Amendment 3**. Do not reintroduce a waiting gate in any form.
3235

3336

3437
**TypeScript reference implementation** is **published to npm at `0.25.0`** (14 `@metaobjectsdev/*` publish candidates on the `latest` tag, full lockstep; the two `angular` packages are versioned on their own `0.6.x` line and are **NOT published to npm — source-only by decision** (ADR-0048): they build in-repo, and stay off the registry until they meet the ADR's promotion bar). C# at `0.25.0` (NuGet); Python at `0.25.0` (PyPI); Java / Kotlin at `7.25.0` (Maven Central). **The four registries no longer move in lockstep — since `0.24.5` a registry publishes only when it has a changed product file**, and when it does it adopts the shared `minor.patch` then current, skipping the numbers it sat out (ADR-0035 Amendment 1 / `docs/RELEASING.md`). Two carve-outs: the 14 npm packages still move atomically with each other, and a change to `expected-registry.json` / `metamodelVersion` still forces all four. So a lagging number is INFORMATION — PyPI at `0.25.0` while npm is at `0.25.2` says PyPI has had no product change since `0.25.0`.

‎docs/1.0-readiness.md‎

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ Status legend: ✅ done · 🔶 in progress · ⬜ not started · ❓ **[RATIFY]
173173
`→8.0.0`, freeze the spec version at `Metamodel 1.0` (C4). Both forward; no
174174
backwards move on any registry.
175175
- ⬜ **G2. Remove the deprecated export** if A3=remove (one-time).
176-
- 🔶 **G3. Scope declared, promise livable, publications current.**
176+
- 🔶 **G3. Scope declared, promise livable, publications current, RC exercised.**
177+
*(G3a/G3b/G3c done; **G3d is the one open gate** and it blocks G1.)*
177178

178179
**RULING (2026-09-06, maintainer): the quiet-period criterion is RETIRED. It measured
179180
the wrong variable.** G3 used to read *"at least one coordinated release after the last
@@ -206,9 +207,20 @@ Status legend: ✅ done · 🔶 in progress · ⬜ not started · ❓ **[RATIFY]
206207

207208
**What replaces it:**
208209

209-
- 🔶 **G3a — the declared scope is covered, and no known gap needs NEW vocabulary.**
210-
State what Metamodel 1.0 covers and show every outstanding item is additive. **The
211-
evidence is assembled (2026-09-06); what remains is the maintainer declaring it.**
210+
- ✅ **G3a — the declared scope is covered, and no known gap needs NEW vocabulary.**
211+
**DECLARED 2026-09-07 (maintainer).**
212+
213+
> **What Metamodel 1.0 covers** is the registered vocabulary named by
214+
> `fixtures/registry-conformance/expected-registry.json` at the cut commit, together
215+
> with the canonical authoring/interchange format and the wire contract — the set
216+
> `docs/compatibility-policy.md` lists under "Covered by the METAMODEL version."
217+
> **Everything still outstanding only ADDS to that set. Nothing outstanding changes or
218+
> removes any part of it.**
219+
220+
The declared claim is deliberately the weaker one. It is **not** "the vocabulary is
221+
finished" — FR-024's declared-API tier and FR-034's ecosystem tier are both real, both
222+
wanted, and both still unbuilt. It is that finishing them is *additive*, so freezing
223+
now costs an adopter nothing later. Three checks back it:
212224

213225
1. **Nothing in the registry is experimental.** `expected-registry.json` carries zero
214226
`experimental` markers, and `docs/compatibility-policy.md` already excludes
@@ -224,10 +236,10 @@ Status legend: ✅ done · 🔶 in progress · ⬜ not started · ❓ **[RATIFY]
224236
(#306), enforcing the already-shipped `@deprecated` (#305), and `meta fmt` (#304) —
225237
are CLI surfaces and enforcement over vocabulary that already exists.
226238

227-
The claim to declare is therefore not "the vocabulary is complete" but the weaker and
228-
true one: **completing it later adds, and never changes or removes.** That is what
229-
ADR-0035 §1 already promises by excluding reserved-but-unregistered vocabulary from the
230-
compat surface; G3a is where the project states it has checked, rather than assumed it.
239+
ADR-0035 §1 already promises this by excluding reserved-but-unregistered vocabulary
240+
from the compat surface. G3a is where the project records that it **checked**, rather
241+
than assumed. Re-run the three checks at the cut commit before G1 — the declaration is
242+
about the manifest that ships, not the one that was current when this was written.
231243
- ✅ **G3b — the 1.0 promise is livable: the correction bar is ratified.** DONE
232244
2026-09-06. `docs/compatibility-policy.md` now carries *"Correcting input we wrongly
233245
accepted"* — the three-part bar under which a form that never had a valid meaning may
@@ -242,6 +254,27 @@ Status legend: ✅ done · 🔶 in progress · ⬜ not started · ❓ **[RATIFY]
242254
ended at the `0.24.0` batch and carried none of `0.24.1`'s two refusals or `0.25.0`'s
243255
six breaks; both are written now. Re-check this at the cut commit, not before it.
244256

257+
- ⬜ **G3d — an adopter estate runs the RELEASE CANDIDATE before promote.**
258+
**RULED 2026-09-07 (maintainer): this DOES block the cut.**
259+
260+
Concretely: publish the RC, wire it into a real adopter's CI with the drift gate
261+
ENFORCED (not advisory), run `meta gen` + `meta verify` + a migration against that
262+
estate, and fix what it finds before promoting. This is the evidence half that replaces
263+
the retired quiet period — real usage instead of a calendar.
264+
265+
**The argument against it was heard and rejected, and is recorded so the decision is
266+
legible.** All six known adopters are maintainer-owned, so this is closer to
267+
self-validation than to independent evidence, and it makes the cut wait on work in a
268+
repository that is not the one being frozen. The ruling is that it is still worth it:
269+
a conformance corpus gates the five ports **against each other**, never against use,
270+
and every port could agree perfectly on a contract that is wrong in practice. The
271+
`0.24.3` and `0.24.5` lines are the precedent — both were largely defects found by
272+
*running the documented path*, which no gate in this repo was asking.
273+
274+
Pairs with **F2**, which asks the same question from the adoption-maturity side. F2 is
275+
satisfied by an adopter reaching Deep/Exemplary with the gate wired; G3d additionally
276+
requires that the RC specifically — not a released version — is what got exercised.
277+
245278
**Deliberately NOT a gate: another waiting period, in any form.** Neither a release
246279
count, a calendar window, nor "one more quiet cut." If a replacement gate is ever
247280
proposed whose pass condition is the passage of time or the absence of our own recent
@@ -259,4 +292,5 @@ were stale and are corrected. The last breaking metamodel move is `0.25.0` / `7.
259292
(`metamodelVersion` `0.14`); A1 ratified — decouple._
260293

261294
_Owner: maintainer. Update the status marks as items land. All four §A decisions are
262-
ratified; the open path to the cut is G3a, then G1/G2/G4._
295+
ratified. **The open path to the cut is G3d — run the RC against a real adopter estate
296+
with the drift gate enforced — then G1/G2/G4.**_

0 commit comments

Comments
 (0)