Skip to content

Commit b68d216

Browse files
dmealingclaude
andcommitted
docs(release): refresh version references for 0.24.2 / 7.24.2
Walks `docs/RELEASING-docs-checklist.md` §A. All four registry lines move together this cut — npm, PyPI and NuGet to `0.24.2`, Maven Central to `7.24.2` — so unlike an npm-only patch every per-port reference changes. `AGENTS.md` gains the `0.24.2` Status paragraph: FR-039 restores `@status: retired`, `@supersededBy` returns as a reference the loader resolves, and `retired` forbids `@implementedBy` outright so the dangling -reference class that removed the vocabulary is unreachable rather than exempted. It records what is NOT claimed as prominently as what is — 19 of 40 is under half and no production prevention case is documented. `docs/ports/kotlin.md` and `docs/ports/python.md` need no edit by design (the former uses `${metaobjects.version}`, the latter pins nothing), and `docs/1.0-readiness.md`'s `0.24.1` references are historical reasoning about that release, not live version pins. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NynrRND6ZUwGvq3ZUTCfxG
1 parent a53c81b commit b68d216

8 files changed

Lines changed: 31 additions & 29 deletions

File tree

AGENTS.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ Equal weight — all four ship per-language today across the five ports (TS / C#
1717

1818
## Status
1919

20-
_Last refreshed 2026-08-24._
20+
_Last refreshed 2026-08-26._
21+
22+
**TypeScript reference implementation** is **published to npm at `0.24.2`** (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.24.2` (NuGet); Python at `0.24.2` (PyPI); Java / Kotlin at `7.24.2` (Maven Central). **All four registries share the same `minor.patch`, and stay locked in lockstep going forward** — the `0.20.15` cut moved Maven `7.20.12``7.20.15` to close the last per-registry drift.
23+
**The `0.24.2` line is a coordinated PATCH across all four registries** (npm `0.24.2` · PyPI `0.24.2` · NuGet `0.24.2` · Maven `7.24.2`) — **a retired capability gets its status back.** `@status` gains a fourth member, **`retired`**, and `@supersededBy` is registered again, this time as a reference the loader RESOLVES (FR-039). `0.24.0` had retired `abandoned`, `superseded` and `@supersededBy`; this reverses that half, and it is **additive — nothing that loads on `0.24.x` stops loading**, so a ledger using only `planned | live | partial` sees no change at all. **Why it came back is the measurement:** the ruling that authorised `requirement.*` tested six claims under control across five rounds and 52 agents with pre-registered kill conditions, and **refuted five**; the one that HELD is the retired-capability guardrail — model-only agents flagged a deliberately-retired capability **0 times out of 24**, every run proposing to extend it "each believing it was reusing rather than reviving", against ledger arms catching it **19 of 40**. `0.24.0` removed the survivor and left the five refuted claims standing. **The finding that removed it was real and is answered STRUCTURALLY rather than exempted:** one estate carried **29 `@implementedBy` references that could never resolve across 14 entries while `meta verify` reported zero** — but they dangled because the ruling deliberately chartered them as correct, so the defect was in the REPORTING and was answered by deleting vocabulary. `retired` therefore **forbids** `@implementedBy` outright (`ERR_REQUIREMENT_RETIRED_HAS_IMPLEMENTORS`, a LOAD error in all five ports, not a `verify` check — every other requirement check lives only in the TS CLI, so a Java or Python estate would otherwise author the shape freely): a retired capability has no implementation by definition, so the references cannot dangle because they cannot exist, and the bug class is unreachable rather than patched. It stays **PRESCRIPTIVE**, which is what makes it admissible under the rule that removed it — a `retired` entry states *"this must not be rebuilt"*, a prohibition in force falsifiable by one observable, not a diary entry about the past. It is a **status member, not a subtype**, because the claim that held is literally *"a status field prevents reviving retired features"* and what was proven works *because the retired entry sits where the live one sat*. **`@supersededBy` resolves now** — point 4 of the original ruling, which `0.24.0` deregistered without ever building — legal on `retired` only and resolved package-locally under ADR-0042, so a supersession that is itself superseded chains where a prose note rots. Migration is **one command**: `meta upgrade --apply` now repairs the case it used to refuse, and the same run drops the `@implementedBy` a retired entry may not carry, so one invocation leaves a LOADING estate rather than a document that still fails — the #342 failure exactly. `metamodelVersion` moves `0.12` → `0.13`. **What is deliberately NOT claimed: 19 of 40 is under half, there is no documented production prevention case, and in the audited estate nothing routed an agent to the ledger at all** — the restore is necessary and *not sufficient*. Also ships a **`meta verify` requirement-authoring lint** in a section of its own (seven warnings for a ledger that agrees with the model perfectly and records less than its author thinks — a `name` that breaks the dotted path or its generated stub filename, prose duplicated across two slots, an id-shaped `title`; every finding a WARNING that can never fail a build, muted with `--no-requirement-lint`, narrowed against three real adopter ledgers after a blanket title check produced 355 findings that were all false); requirement diagnostics addressed by **dotted path** rather than bare name; **`meta upgrade` repairs the `@fields` + `@expr` index key** ([#342](https://github.com/metaobjectsdev/metaobjects/issues/342)), which `0.24.1` made illegal while leaving the one repair command unaware of it; the generated requirements page rendering a requirement's `title`; and **the JVM agent-context staleness nudge, which fired forever** ([#347](https://github.com/metaobjectsdev/metaobjects/issues/347)) — `generatedBy` is always an **npm** version because `meta agent-docs` is the canonical scaffolder for every port, while the JVM compared its **Maven** version, so `"7.24.1".equals("0.24.1")` was false and always would be and the nudge fired on every `mvn metaobjects:generate` in perpetuity, including when the context was perfectly in sync. This is also the release that satisfies **`docs/1.0-readiness.md` §G3's quiet period** — additive, adopter-edit-free, one coordinated release after `0.24.1`. See `CHANGELOG.md` [0.24.2].
2124

22-
**TypeScript reference implementation** is **published to npm at `0.24.1`** (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.24.1` (NuGet); Python at `0.24.1` (PyPI); Java / Kotlin at `7.24.1` (Maven Central). **All four registries share the same `minor.patch`, and stay locked in lockstep going forward** — the `0.20.15` cut moved Maven `7.20.12``7.20.15` to close the last per-registry drift.
2325
**The `0.24.1` line is a coordinated PATCH across all four registries** (npm `0.24.1` · PyPI `0.24.1` · NuGet `0.24.1` · Maven `7.24.1`) — it ships **`metamodelVersion` 0.12**, and that pairing is the durable half: the package and metadata axes are SEPARATE contracts (ADR-0035 Amendment 2), so a metamodel move does not force a package minor. **Two changes make previously-LOADING metadata fail to load, and both are PATCH on purpose** — each corrects previously-*wrong acceptance* rather than changing a contract, the same call as the `@min` clamp in `0.19.1` and the `like` case-sensitivity fix in `0.21.6`: an index key is now `@fields` XOR `@expr` ([#342](https://github.com/metaobjectsdev/metaobjects/issues/342)) — an expression index was undeclarable and the one spelling that loaded silently threw half of itself away; and `@filterable`/`@sortable: true` on an `isArray` field is refused ([#335](https://github.com/metaobjectsdev/metaobjects/issues/335)) — it emitted a `like`/`eq` rule against a `text[]` column, i.e. SQL that cannot execute. Exposure is bounded but **not zero** and the changelog says so out loud: pre-1.0 `^0.24.x` resolves a patch, so an adopter who wrote either form independently auto-adopts a load error on `npm update`; in both cases the fix is deleting an attribute that was doing nothing. **The headline feature is the whole-object rollup** (#335): `@of` becomes OPTIONAL on `@agg: collect`, and omitting it collects each related row as the carrying field's declared value object, closing the one gap `origin.collection`'s retirement had to state rather than close. The declared value object IS the exposure and its members bind to the `@via` terminal entity **by name, deliberately not by `extends`** — name matching keeps one value object collectable from two entities — written into the byte-gated `origin.aggregate` registry prose so no port infers it from TypeScript. Eight load errors guard it, five under a new `ERR_COLLECT_WHOLE_OBJECT`, which is not taxonomy for its own sake: the shared corpus compares error **code + source and never message text**, and `ERR_INVALID_ORIGIN` is exactly what a loader still *requiring* `@of` emits, so five negative fixtures passed against three ports containing none of the rules. Two defects were found only by the emit→apply→introspect→re-diff round-trip: SQLite's **in-aggregate `ORDER BY` destroys the JSON subtype** (the obvious `json(json_object(…))` wrapper does not survive it — the shipped form re-wraps through `json_each`), and a `field.long` member arrives inside the rollup as a JSON **number** while the same value as a top-level BIGINT arrives as a **string**. Also: the C# EF Core target emitted **no foreign keys at all**, so `@onDelete` was inert, and an unconfigured FK is now `NoAction` rather than EF's implicit cascade ([#294](https://github.com/metaobjectsdev/metaobjects/issues/294)); `meta upgrade` rewrote nothing on a YAML estate and then reported it clean ([#339](https://github.com/metaobjectsdev/metaobjects/issues/339)); a sub-project generated from the ancestor's union of sources rather than its own ([#340](https://github.com/metaobjectsdev/metaobjects/issues/340)); generated enum types were value imports (TS1484) ([#341](https://github.com/metaobjectsdev/metaobjects/issues/341)) and generated SQLite did not compile on two drizzle minors the peer range admitted; a blank optional form field submitted `""` instead of clearing ([#223](https://github.com/metaobjectsdev/metaobjects/issues/223)); and **every shipped metadata example is now gated against the strict registry** ([#337](https://github.com/metaobjectsdev/metaobjects/issues/337)) — three times a doc or an agent-context skill taught vocabulary the loader had already retired and an adopter found it every time, so the gate loads every fenced JSON block under `docs/` and the skills, failing on vocabulary a block USES and tolerating what it OMITS. See `CHANGELOG.md` [0.24.1].
2426

2527
**The `0.24.0` line is a coordinated MINOR across all four registries** (npm `0.24.0` · PyPI `0.24.0` · NuGet `0.24.0` · Maven `7.24.0`) — **the pre-1.0 breaking slot, spent deliberately on four vocabulary retirements plus one rename in ONE window.** Under ADR-0023's sealed strict registry a retirement has no deprecation shim, so a legacy model fails to LOAD and every one of these is a migration an adopter must perform; two breaking MINORs back to back would mean two migrations for work budgeted as one. **(A)** a `template.*` subtype's axis is DIRECTION — `@promptStyle` on a `template.output` now fails the load, the inbound tier (parser, tolerant extractor, response-format fragment) belongs to a `template.prompt` carrying `@responseRef`, and emitted paths follow the direction (`.output.*` → `.response.*`); **(B)** the requirement vocabulary becomes PRESCRIPTIVE-ONLY (FR-038) — `@verifiedBy`/`@supersededBy` deregister and `@status` shrinks to `planned | live | partial`, forced by two SHIPPED statements contradicting each other (the byte-gated registry justified the dangling-`@implementedBy` exemption on `abandoned`/`superseded` while the authoring guidance said deleting such an entry destroys the record — only one could be the rule), and the deciding argument is second-order: because `verify` was SILENT on unresolved refs for exactly those two statuses, one estate held **29 references that could never resolve across 14 entries** while `meta verify` reported zero; **(C)** `@readOnly` becomes the `@mutability` enum (FR-037 R1), whose point is the new middle mode **`writeOnce`** — set on create, frozen after — that the boolean could not express and an assigned primary key has always wanted; **(D)** `origin.collection` retires to reserved-not-registered, having duplicated `origin.aggregate @agg: collect` on a strictly smaller attr set with nothing ever dispatching on it; **(E)** `@violation` becomes `@counterexample` on `requirement.*` — a rename caught BEFORE ship and folded in rather than held for `0.25.0`, because holding it out would have made every adopter with a ledger edit the same files twice, the second pass landing on the hand-judgment `abandoned` cases they had just finished. **Most of it is one command — `meta upgrade --apply`** (new in this release), a raw-document rewriter driven by the SAME retirement map the loader's errors come from, so the fixer and the diagnosis cannot drift apart; it refuses rather than guesses, and `@status: abandoned` is refused because deciding what happens to a retired capability's record is judgment, not substitution. **This release also moves `metamodelVersion` `0.9` → `0.10` — the first time that number has ever moved**, and one move covers all five. Two changes are DEFAULT FLIPS rather than corrections of previously-wrong behaviour: the Java Maven plugin now fails a build that a silently-empty model used to let pass, and Java and Python now follow symlinked directories. **The cost of batching is paid elsewhere and was adjudicated, not discovered:** `docs/1.0-readiness.md` §G3's quiet-period clock resets, so 1.0 now needs at least one coordinated release after this one with NO metamodel-breaking change, to prove the rate actually dropped. Also ships a `libraries` key so a shipped library is loadable through the toolchain (TS CLI + JVM `EmbeddedLibrary`/`LibrarySources` + a Maven `LoaderParam`), a `meta docs` requirements surface on by default with entity pages naming the requirements that claim them, and a requirements summary on every `meta verify` run. Migration guides for all five changes live under `docs/features/migrations/`. See `CHANGELOG.md` [0.24.0].

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ first-week wedge plan — and `meta init` picks up from there.
9393

9494
| Language | Status | Quickstart | Source |
9595
|---|---|---|---|
96-
| TypeScript | Published to npm at `0.24.1` (the `@metaobjectsdev/*` packages) | [`docs/ports/typescript.md`](docs/ports/typescript.md) | [`server/typescript/`](server/typescript/) · [`client/web/`](client/web/) |
96+
| TypeScript | Published to npm at `0.24.2` (the `@metaobjectsdev/*` packages) | [`docs/ports/typescript.md`](docs/ports/typescript.md) | [`server/typescript/`](server/typescript/) · [`client/web/`](client/web/) |
9797
| Java | Loader + OMDB + render + Maven plugin all shipped; full conformance green | [`docs/ports/java.md`](docs/ports/java.md) | [`server/java/`](server/java/) |
9898
| Kotlin | Codegen tier on top of Java — 14 generators (entity, Exposed table, relations, repository, payload, output-parser, output-prompt, render-helper, extractor, filter-allowlist, validator, Spring config, storedProc, Spring controller); 24 / 24 persistence-conformance | [`docs/ports/kotlin.md`](docs/ports/kotlin.md) | [`server/java/codegen-kotlin/`](server/java/codegen-kotlin/) · [`server/java/metadata-ktx/`](server/java/metadata-ktx/) |
9999
| C# | Loader + conformance + EF Core codegen + render engine + `dotnet meta` CLI all shipped | [`docs/ports/csharp.md`](docs/ports/csharp.md) | [`server/csharp/`](server/csharp/) |

docs/RELEASING.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ How to publish the `MetaObjects*` C# packages to nuget.org. We use **Trusted Pub
444444

445445
## What gets published
446446

447-
Four packages, version-locked at the C# port version (currently `0.24.1`):
447+
Four packages, version-locked at the C# port version (currently `0.24.2`):
448448

449449
| Package | Contents |
450450
|---|---|
@@ -536,7 +536,7 @@ How to publish the **`metaobjects`** Python package to PyPI via **Trusted Publis
536536
## What gets published
537537

538538
One package, `metaobjects` (version in [`server/python/pyproject.toml`](../server/python/pyproject.toml),
539-
currently `0.24.1`), as an **sdist + a universal `py3-none-any` wheel** (pure Python).
539+
currently `0.24.2`), as an **sdist + a universal `py3-none-any` wheel** (pure Python).
540540

541541
## How we publish: Trusted Publishing (OIDC)
542542

@@ -592,7 +592,7 @@ subsequent releases keyless.)
592592
# Releasing the Java/Kotlin modules to Maven Central
593593

594594
The 18 `com.metaobjects:*` modules ship to **Maven Central via the Sonatype Central Portal**,
595-
versioned on the `7.x` line (currently `7.24.1`) in the parent + module poms. Signed with the
595+
versioned on the `7.x` line (currently `7.24.2`) in the parent + module poms. Signed with the
596596
maintainer's GPG key.
597597

598598
## Procedure

0 commit comments

Comments
 (0)