Skip to content

Commit 273f4b0

Browse files
dmealingclaude
andcommitted
docs(release): refresh version references for 0.24.1
The 0.24.1 cut was interrupted after npm and never walked docs/RELEASING-docs-checklist.md, so every "currently shipping" pointer in the repo still named 0.24.0 / 7.24.0 while all four registries were live at 0.24.1 / 7.24.1. Updated: README's port table, docs/ports/{typescript,csharp,java}.md, the "currently <ver>" notes in docs/RELEASING.md, both llms files (summary line, install snippets, per-port rows, Maven coordinates), and AGENTS.md's Status section — which also gains the 0.24.1 paragraph and moves the stale "current release line" marker off 0.23.x, where the 0.24.0 cut had left it. Historical references are deliberately NOT rewritten: llms.txt:72 and llms-full.txt:286 say @verifiedBy/@supersededBy "were retired in 0.24.0", and docs/RELEASING.md keeps its 0.24.0-rc.1 and 2FA anecdotes. Those state when something happened; a blanket version sed would have falsified all five. docs/ports/{kotlin,python}.md and docs/features/extending-with-providers.md carry no version pointer, so they are correctly untouched. Gates: scripts/ci-local.sh --only gates PASSED (12/12), including leak-scan and the #337 shipped-doc-examples gate. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015WgNA6uDN9qxu2nA471rAq
1 parent d36ca3b commit 273f4b0

8 files changed

Lines changed: 32 additions & 30 deletions

File tree

AGENTS.md

Lines changed: 5 additions & 3 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-22._
20+
_Last refreshed 2026-08-24._
21+
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.
23+
**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].
2124

22-
**TypeScript reference implementation** is **published to npm at `0.24.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.24.0` (NuGet); Python at `0.24.0` (PyPI); Java / Kotlin at `7.24.0` (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.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].
2426

2527

@@ -62,7 +64,7 @@ _Last refreshed 2026-08-22._
6264

6365
**Key cross-language features shipped:** FR5 family (a/b/c/d/e + WARN envelope-shape — actionable loader errors per ADR-0009); FR-003 (Java RDB runtime persistence + projections; schema migrations are TS-only — the Java migration engine was removed); FR-006 (template.output parser-on-receipt codegen per ADR-0010 in all 5 ports); FR-008 + FR-009 (cross-port REST API contract + 10 filter operators); FR-018 (M:N relationship codegen in all 5 ports — entity navigation + idiomatic ORM wiring [Drizzle m2m / EF Core `UsingEntity` / Spring repo+JPA / Exposed / Pydantic+route as the SQLAlchemy-secondary equivalent] + REST traversal `GET /<source-plural>/{id}/<relation>` + Tier-2 docs, gated by the shared api-contract m2m corpus in both lanes + persistence-conformance; the TanStack M:N client hook is a deferred client-ergonomics follow-up); SP-H (field-subtype end-to-end hardening: every concrete `field.*` subtype write+read round-trips cross-port via the persistence `op: roundtrip` gate; cut `field.byte`/`field.short`/`field.class` non-functional stubs; cross-port filter-op reconciliation for uuid/currency); source v2 paradigm (ADR-0007); metadata-ktx Kotlin facade; per-target output directories (TS codegen).
6466

65-
**Current release line.** `0.23.x` (npm / PyPI / NuGet, version-aligned) · `7.23.x` (Maven Central, aligned `minor.patch` on its historical major `7`). The `0.15.0` / `7.7.0` release is a coordinated **minor with breaking changes**: (1) the **metamodel-1.0 vocabulary program** — `field.uri` / `field.inet` subtypes + a `@stringFormat` attribute (ADR-0036/0037), `field.timestamp` **instant-by-default** with an `@localTime` naive opt-out, `@dbColumnType` **slim-and-derive** (array-ness + `text` derived; `uuid_array`/`text_array`/`@kind:text` dropped), and reverse-navigation via generated explicit FK finders (ADR-0038); (2) the **ADR-0039 own-accessor correctness fix** — resolving/effective accessors are the default everywhere, so a concrete field/entity that `extends` an abstract parent now correctly inherits its properties and members in codegen + runtime (an entire latent bug class, cross-port conformance-gated). Breaking: instant-default timestamps and the `@dbColumnType` slim. See `CHANGELOG.md` for the per-version detail. GA promotion is the next release move.
67+
**Current release line.** `0.24.x` (npm / PyPI / NuGet, version-aligned) · `7.24.x` (Maven Central, aligned `minor.patch` on its historical major `7`). The `0.15.0` / `7.7.0` release is a coordinated **minor with breaking changes**: (1) the **metamodel-1.0 vocabulary program** — `field.uri` / `field.inet` subtypes + a `@stringFormat` attribute (ADR-0036/0037), `field.timestamp` **instant-by-default** with an `@localTime` naive opt-out, `@dbColumnType` **slim-and-derive** (array-ness + `text` derived; `uuid_array`/`text_array`/`@kind:text` dropped), and reverse-navigation via generated explicit FK finders (ADR-0038); (2) the **ADR-0039 own-accessor correctness fix** — resolving/effective accessors are the default everywhere, so a concrete field/entity that `extends` an abstract parent now correctly inherits its properties and members in codegen + runtime (an entire latent bug class, cross-port conformance-gated). Breaking: instant-default timestamps and the `@dbColumnType` slim. See `CHANGELOG.md` for the per-version detail. GA promotion is the next release move.
6668

6769
See `spec/roadmap.md` for the active + planned work picture.
6870

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.0` (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.1` (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.0`):
447+
Four packages, version-locked at the C# port version (currently `0.24.1`):
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.0`), as an **sdist + a universal `py3-none-any` wheel** (pure Python).
539+
currently `0.24.1`), 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.0`) in the parent + module poms. Signed with the
595+
versioned on the `7.x` line (currently `7.24.1`) in the parent + module poms. Signed with the
596596
maintainer's GPG key.
597597

598598
## Procedure

0 commit comments

Comments
 (0)