Skip to content

Commit 68d1f0b

Browse files
dmealingclaude
andcommitted
docs(release): refresh version references for 0.24.4 / 7.24.4
Walked docs/RELEASING-docs-checklist.md section A. The port docs and both llms mirrors carry only current-version references, so those are a clean sweep; AGENTS.md and README.md were edited surgically because they also carry the historical per-release paragraphs, which must keep their own numbers. Five files the checklist names (ports/kotlin, ports/python, ports/typescript-client, features/extending-with-providers, RELEASING-java) carry no version reference at all — nothing to update, verified rather than assumed. CLAUDE.md is a symlink to AGENTS.md; AGENTS.md is the file edited. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NynrRND6ZUwGvq3ZUTCfxG
1 parent 84a2aa7 commit 68d1f0b

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-27._
20+
_Last refreshed 2026-08-28._
21+
22+
**TypeScript reference implementation** is **published to npm at `0.24.4`** (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.4` (NuGet); Python at `0.24.4` (PyPI); Java / Kotlin at `7.24.4` (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.4` line is a coordinated PATCH across all four registries** (npm `0.24.4` · PyPI `0.24.4` · NuGet `0.24.4` · Maven `7.24.4`) — **the only changed product file is in `cli`**, so the other 13 npm packages and all three non-npm registries are version-parity bumps; `metamodelVersion` stays `0.13`. **Every fix in it was found by running the product's documented path and reading what it printed, not by a test** — this is the first cut since `0.24.3` made the cold quickstart part of the release procedure, and it is what the procedure is for. The four share one shape: the tool *saying* something untrue about work it had just done. (1) **`meta init` set `"type": "module"` for you and then printed an imperative telling you to set it** — on the last line the scaffold prints, so a run that had done exactly the right thing read as an unmet TODO; the existing test asserted only that the warning contained the substring `"type": "module"`, which both phrasings do, so the imperative could never fail it. (2) **`npx tsc` — the hint every `meta gen` prints — has no compiler to run**, because nothing MetaObjects installs brings `typescript`, so the documented next step hits npm's guard package. (3) **The documented order makes that typecheck fail**: `docs/ports/typescript.md` puts "Typecheck the generated code" before "Use", where `src/db.ts` is written, but the default `routesFile()` emits `import { db } from "../db.js"` — the module `dbImport` names and `meta init` scaffolds a path to without creating — so following the page top to bottom ends in `TS2307` on a project with nothing wrong. (4) **`meta verify --templates` reported a different denominator depending on whether it passed** — the same project reading "11 drift error(s) across 29 template(s)" while red and "22 template(s) clean" once green, seven templates apparently vanishing: the failure line divided by every `template.*` node found *including the ones it skips* (a project-local subtype from an adopter's own provider), the pass line by bodies verified (an `@kind: email` template has up to three and is one template). The red line claimed a denominator of work it had not done. Found in the drift-gate demo receipt on the public reference app — the artifact whose whole purpose is to be checked by a skeptical reader. Every existing assertion matched on a substring containing `template(s)`, so nothing could see it; the new test asserts the **pair** (same fixture, same number passing and failing), because the failure half alone was already correct for a single-body template. See `CHANGELOG.md` [0.24.4].
2124

22-
**TypeScript reference implementation** is **published to npm at `0.24.3`** (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.3` (NuGet); Python at `0.24.3` (PyPI); Java / Kotlin at `7.24.3` (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.3` line is a coordinated PATCH across all four registries** (npm `0.24.3` · PyPI `0.24.3` · NuGet `0.24.3` · Maven `7.24.3`) — **the theme is a gate that convicted the innocent, and three of the five fixes are the same shape: a check failing work the product itself sanctions.** (1) **`meta verify --codegen` failed the documented quickstart.** Its orphan branch fired on every file in `outDir` a fresh regen would not emit, whether or not MetaObjects wrote it — and the quickstart tells you to typecheck with `npx tsc`, which under a stock `tsc --init` (no `outDir` of its own) drops `.js`/`.d.ts`/`.map` beside the generated sources. Following the documented path to the letter ended in **exit 1 on a project with zero drift, naming sixteen files**. The rule is **jurisdiction, not staleness**: `outDir` is a directory, not a namespace MetaObjects owns, and `.gen-state/.hashes.json` already records what the generator WROTE — `meta gen`'s own orphan sweep scopes itself to those paths (`listGeneratedPaths`) before it will delete anything, so the write path and the gate were answering one ownership question two different ways. A file we wrote that a regen no longer emits (an entity deleted or renamed) is still drift; with NO manifest the old conservative verdict stands. (2) **The same gate convicted the hand edits the product invites** — `meta gen` three-way-merges an edit and reports `merged`, then `--codegen` failed the same file and the remedy it printed was a LOOP (running `meta gen` merges the edit back in, so the next run fails identically); it now compares a fresh regen's hash against the recorded one, failing closed when no hash exists. Worst for `requirementTests()` stubs, worthless until hand-edited. (3) **`dbImport` was demanded from the MODEL rather than the generator that reads it** — only a generator emitting `import { db } from …` can use it, and a project whose generated queries take `db` as a parameter has none, yet was refused and told its model "generates database code" that imported nothing. **The cost is measured, not hypothetical:** the public reference app's automated dependency PR had been failing on exactly this since **15 August — twelve days** — because the remedy is one config line no bot can write, so the app sat four minor lines behind with a red PR nobody reads while every human-facing signal said it was healthy. It is now demanded at the point of USE, named by the generator that wants it, with declaration TRACKED rather than inferred by comparing against the default. Also: **`bun run release` ran the private-registry publisher and never reached the release** (npm and bun run `pre<name>` before `<name>`; the root manifest declared both `release` and `prerelease`, and it failed loudly only by accident — with credentials present the hook would have SUCCEEDED, publishing a private iteration as an invisible side effect of every public release), and **the pre-release pin detector passed when the violation was large** (`grep | head -20` under `pipefail`: past ~64KB, `head` closes the pipe, `grep` dies of SIGPIPE and `|| return 0` fires before the hit is recorded — inverted severity, reproduced independently at 500 violations, old script exit 0 / fixed exit 1; its header tells adopters to copy it downstream, so every pre-fix copy carries it). **Two of the five were found by running the documented quickstart cold against the published `0.24.2`** — install, author, `gen`, `tsc`, `migrate --from-db --apply`, boot the generated server, five verbs, `verify` — which is now part of the release procedure rather than something done only at a cut. Every fix is TypeScript-side (`cli` + `codegen-ts` + repo tooling), so PyPI, NuGet and Maven Central are version-parity bumps; `metamodelVersion` stays `0.13`. See `CHANGELOG.md` [0.24.3].
2426

2527
**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].

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

598598
## Procedure

0 commit comments

Comments
 (0)