Skip to content

Commit 2b33f63

Browse files
dmealingclaude
andcommitted
docs: three corrections to yesterday's ruling, found by re-reading the sources
**The correction bar overstated its own evidence.** It said "four times before 1.0 the loader accepted a form that could not work," then cited #342 and #335. Only those two made metadata stop LOADING. The other two applications of the doctrine — the 0.19.1 `@min` clamp and the 0.21.6 `like` case-sensitivity fix — corrected OUTPUT and needed no exception at all, since RELEASING.md's "output change = pure bugfix" row already covers them. Writing the count as four made the exception look four times as load-bearing as it is, in the one document where an adopter goes to find out what we are allowed to do to them. Now split explicitly: two output, two load. **The `agent-docs` migration instruction was invented.** I wrote "import from the package root instead" from a summary rather than the changelog. The actual entry says: delete the import, the live surface is `@metaobjectsdev/sdk/agent-context`. A migration guide that names the wrong replacement is worse than one that omits the entry, because the reader stops looking. **G3a's evidence is assembled** rather than left as an instruction to go and find it. Three checkable facts: the registry carries zero `experimental` markers; every 1.1 roadmap item is additive (FR-024 and FR-034 add reserved vocabulary, FR-026/028/030 add no vocabulary at all); and all three open issues are CLI surfaces over vocabulary that already exists. The mark stays 🔶 because declaring the scope closed is the maintainer's call, not the evidence-gatherer's — and the claim to declare is the weaker, true one: not that the vocabulary is complete, but that completing it later adds and never changes or removes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01At3v6M6uqECZ2Sb5eUv6YY
1 parent ea7a61e commit 2b33f63

3 files changed

Lines changed: 36 additions & 12 deletions

File tree

docs/1.0-readiness.md

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,27 @@ Status legend: ✅ done · 🔶 in progress · ⬜ not started · ❓ **[RATIFY]
207207
**What replaces it:**
208208

209209
- 🔶 **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. Half
211-
ratified already: A2 puts FR-024's declared-API tier explicitly outside 1.0, and
212-
`spec/roadmap.md` charters FR-037 R3/R4/R5 and the FR-038 stub generator as additive
213-
1.1 work — **no breaking change is currently chartered**. Turn that into a positive
214-
scope statement rather than a list of deferrals.
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.**
212+
213+
1. **Nothing in the registry is experimental.** `expected-registry.json` carries zero
214+
`experimental` markers, and `docs/compatibility-policy.md` already excludes
215+
"anything explicitly marked experimental or reserved and not yet in the registry"
216+
from the covered set — so the covered surface IS the manifest at the cut commit.
217+
2. **Every outstanding roadmap item is ADDITIVE.** 1.1 holds FR-024's declared-API tier
218+
(`api.*`/`operation.*`/`binding.*` — reserved, unregistered, additive by
219+
construction: A2), FR-034's ecosystem tier (same shape), FR-026's view-render polish
220+
(TS web only), FR-028's object↔JSON parity + `meta export`, and FR-030's serializer
221+
SPI. FR-037 R3/R4/R5 and the FR-038 stub generator are explicitly additive
222+
(`spec/roadmap.md`). **No breaking change is chartered anywhere.**
223+
3. **No open issue needs new vocabulary.** The three open at the cut — `meta why`
224+
(#306), enforcing the already-shipped `@deprecated` (#305), and `meta fmt` (#304) —
225+
are CLI surfaces and enforcement over vocabulary that already exists.
226+
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.
215231
-**G3b — the 1.0 promise is livable: the correction bar is ratified.** DONE
216232
2026-09-06. `docs/compatibility-policy.md` now carries *"Correcting input we wrongly
217233
accepted"* — the three-part bar under which a form that never had a valid meaning may

docs/compatibility-policy.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,16 @@ Everything above answers "what happens when we *change* the contract." This sect
9090
answers a different question: **what happens when we find that the toolchain accepted
9191
something the contract never allowed, and the fix makes it stop loading?**
9292

93-
That case is real and it recurs. Four times before 1.0 the loader accepted a form that
94-
could not work — an index declaring both `@fields` and `@expr`, where one half was
95-
silently discarded ([#342](https://github.com/metaobjectsdev/metaobjects/issues/342));
93+
That case is real and it recurs. The doctrine behind it — *a correction of previously-wrong
94+
acceptance is a bug fix, not a contract change* — has been applied four times before 1.0.
95+
**Two of those changed only OUTPUT** and are ordinary bug fixes needing no exception: the
96+
`0.19.1` `@min` clamp (an authored `@min: 0` was silently discarded) and the `0.21.6` `like`
97+
case-sensitivity fix. **Two made previously-LOADING metadata stop loading**, and those are
98+
what this section governs: an index declaring both `@fields` and `@expr`, where one half was
99+
silently thrown away ([#342](https://github.com/metaobjectsdev/metaobjects/issues/342)), and
96100
`@filterable` on an array field, which emitted SQL that cannot execute
97-
([#335](https://github.com/metaobjectsdev/metaobjects/issues/335)). Refusing those is
98-
not a new rule. It is the documented rule finally being enforced.
101+
([#335](https://github.com/metaobjectsdev/metaobjects/issues/335)). Refusing those two is not
102+
a new rule. It is the documented rule finally being enforced.
99103

100104
Under ADR-0023 the registry is strict and sealed, so there is no deprecation shim: a
101105
refusal takes effect on the release that ships it. That makes it important to say

docs/features/migrations/0.x-to-1.0.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,12 @@ a table, a view and a stored procedure, told apart only by a sibling `kind`.
227227

228228
**10E. The `@metaobjectsdev/sdk/agent-docs` subpath is removed**
229229

230-
Import from the package root instead. The subpath shipped a blob that the new `agent/` docs
231-
surface replaces.
230+
Breaking only for code importing `AGENT_DOCS_BODY` from it. **Delete the import; the live
231+
surface is `@metaobjectsdev/sdk/agent-context`.** It was the pre-agent-context single-blob
232+
reference — `meta init` had already stopped scaffolding it, but it stayed exported while its
233+
prose rotted, teaching six things the loader rejects. It was deleted rather than corrected,
234+
because keeping it means two prompt surfaces held in agreement forever, one of which nothing
235+
assembles, tests or scaffolds.
232236

233237
**10F. Python `GenConfig.column_naming` raises `TypeError`**
234238

0 commit comments

Comments
 (0)