Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 7 additions & 11 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,14 @@ because a conformance corpus gates the ports against each other and never agains
in ADR-0035 **Amendment 3**. Do not reintroduce a waiting gate in any form.


**Where the versions are.** `latest` is **`1.0.13`** on npm, **`8.0.13`** on Maven Central,
**`1.0.13`** on PyPI and **`1.0.13`** on NuGet (the Maven major is always **npm major + 7**, so
1.0.13 is 8.0.13). All four moved at 1.0.13, 1.0.12, 1.0.11, 1.0.10 and 1.0.9 (Maven skipped 8.0.8); Maven sat out 1.0.8 (no JVM
product change), and earlier Maven alone took 1.0.6 (8.0.6) while the other three skipped that
number. Both are the convergent-publishing rule working as intended. **1.0 is CUT**: the `1.0.0-rc.5` through `rc.8` candidates, 1.0.4's `rc.1`,
1.0.5's `rc.1` through `rc.11`, 1.0.7's and 1.0.8's `rc.1`, and 1.0.9's `rc.1` through `rc.6` are
superseded, and npm's `next` tag is REPOINTED onto each release β€” not deleted, because
**Where the versions are.** `latest` is **`1.1.0`** on npm, **`8.1.0`** on Maven Central,
**`1.1.0`** on PyPI and **`1.1.0`** on NuGet (the Maven major is always **npm major + 7**, so
1.1.0 is 8.1.0). 1.0.13 was the last 1.0.x release; the four registries moved together on 1.0.13, 1.0.12, 1.0.11, 1.0.10 and 1.0.9 (Maven skipped 8.0.8), and earlier Maven alone took 1.0.6 (8.0.6) while the other three skipped that
number. Both patterns are the convergent-publishing rule working as intended. **1.0 is CUT** and **1.1 is shipped**: the 1.0.0-rc candidates through 1.0.13 are superseded, and npm's `next` tag is REPOINTED onto each release β€” not deleted, because
`dist-tag rm` 403s for every token we hold (`docs/RELEASING.md` Β§4).
`metamodelVersion` read **`1.0`** through 1.0.13 β€” C4 landed and G4 shipped it, and no 1.0.x patch
moved it (1.0.4 relaxed `@sourceRefField` onto `@cardinality: one` with a prose-only
manifest footprint, and was ruled a hold). `main` now carries **`1.1`** for the FR-044 reporting
vocabulary, so 1.0.x PATCH releases are held from `main` until 1.1 ships. Per-release detail lives in **`CHANGELOG.md`** β€” it is the log, and this file does
manifest footprint, and was ruled a hold). **`metamodelVersion` now reads `1.1`** for the FR-044 reporting vocabulary and the requirements slice 1 (the first slice of two, covering existence gates and per-entity coverage). Per-release detail lives in **`CHANGELOG.md`** β€” it is the log, and this file does
not duplicate it.

The npm surface is **14 `@metaobjectsdev/*` packages in full lockstep**; the two `angular`
Expand Down Expand Up @@ -82,9 +78,9 @@ PyPI has had no product change since `0.25.0` β€” nothing is broken.
- YAML / verify corpora green across the ports that ship those layers.
- **Codegen-compile gate** (all five ports; a GATE, not a corpus β€” it has no fixtures of its own and no row in the matrix). Every corpus above gates BEHAVIOUR; none asks whether the emitted code BUILDS, which is how four "generated code does not compile" defects shipped in 1.0.4 with the whole matrix green β€” `gen` exits 0 in all four cases and the adopter's build is the first thing that disagrees. Each port generates from `fixtures/persistence-conformance/canonical/meta.fitness.json` (reused deliberately: a second kitchen sink would drift from the one the other corpora already maintain) and compiles the emitted tree with its real compiler β€” `ts.createProgram` / Roslyn / `javac` / `KotlinCompilation` / (Python, having no static compiler) importing the generated package plus `ruff` F821. **Every port excludes its framework-bound route tier** (TS `routesFile`, C# `RoutesGenerator`, Java `SpringControllerGenerator`, Kotlin `KotlinSpringControllerGenerator`): those imports are not on an in-memory compile's classpath and stubbing them drowns the signal, so that tier is proven by the api-contract integration lane instead. One cross-port rule, not four local concessions. Found 5 further real defects on first run. Boundary detail: `docs/CONFORMANCE.md` β†’ "Split coverage".

**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 + the nine 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); FR-044 (the reporting vocabulary β€” `dimension.attribute`/`dimension.time`, `measure.aggregate`/`measure.ratio`, `segment.filter`, `object.report`, `@spine` on a report to take rows from a to-one dimension entity, `@default` on a measure for empty aggregates, plus the relative-date filter value β€” registered and loader-validated in all five ports; a report that declares a read-only `source.rdb @kind: view` is lowered to a SQL view by `meta migrate` and read by every port, and served by a generated read-only list route in every port, gated by the api-contract `report/` sub-corpus; the TypeScript `cube-model` reference generator writes the vocabulary as Cube data-model files, gated by the `fixtures/cube-model/` corpus and a `cube` lane that loads the output into a real Cube; no grid or form is generated for a report yet, see [docs/features/reporting.md](docs/features/reporting.md) and [docs/features/cube-export.md](docs/features/cube-export.md)).
**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 + the nine 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); FR-044 (the reporting vocabulary β€” `dimension.attribute`/`dimension.time`, `measure.aggregate`/`measure.ratio`, `segment.filter`, `object.report`, `@spine` on a report to take rows from a to-one dimension entity, `@default` on a measure for empty aggregates, plus the relative-date filter value β€” registered and loader-validated in all five ports; a report that declares a read-only `source.rdb @kind: view` is lowered to a SQL view by `meta migrate` and read by every port, and served by a generated read-only list route in every port, gated by the api-contract `report/` sub-corpus; the TypeScript `cube-model` reference generator writes the vocabulary as Cube data-model files, gated by the `fixtures/cube-model/` corpus and a `cube` lane that loads the output into a real Cube; a served report gets the generated TanStack list hook (`use<R>List`) but no grid or form, see [docs/features/reporting.md](docs/features/reporting.md) and [docs/features/cube-export.md](docs/features/cube-export.md)).

**Latest release: 1.0.13** (2026-10-03) β€” npm `1.0.13`, PyPI `1.0.13`, NuGet `1.0.13`, Maven Central `8.0.13`. A PATCH: an already-plural entity name (`Stats`, `Settings`) no longer doubles in API-surface names (REST paths, hooks, finders, DbSets) in any port, while default physical table names stay frozen on the old rule; two entities that would share one API name are now a generation error; two Kotlin controller compile fixes (`field.inet` filter ops, `@dbColumnType: uuid` on a string field). Gated by a private `1.0.13-rc.1` build on the adopter estate (`rc-gate.sh` 7/7) and a full `--strict-toolchains` local CI run. The previous release, 1.0.12 (2026-10-02), added `fmt` in every CLI, a deprecated-reference `verify` advisory, the `onLocate` extract hook, and an Exposed 1.x Kotlin output mode.
**Latest release: 1.1.0** (2026-10-10) β€” npm `1.1.0`, PyPI `1.1.0`, NuGet `1.1.0` and Maven Central `8.1.0`. The reporting release (FR-044): declare dimensions, measures, segments and an `object.report`, and get a SQL view, a served read-only list route in every port, a generated TanStack list hook, and a Cube data model, with `@spine` for rows that have no facts and `@default` for an empty measure. Also carries the first slice of requirements (the gate in every port's `verify`), the derived-key parity fix across the ports, and the list-hook and nested-average fixes found by the first adopter. See the `CHANGELOG.md` 1.1.0 section for the full scope, pre-release RC history, and the diffs to expect when you upgrade (ejected generators and keyless projections). The previous release, 1.0.13 (2026-10-03), was a PATCH on 1.0.x.

Active and planned work lives in GitHub: issues labelled `FR`, milestones for releases, and the MetaObjects Roadmap project board. `spec/roadmap.md` keeps the release direction and the FR β†’ issue β†’ spec index. Process: `docs/ROADMAP-PROCESS.md`.

Expand Down
40 changes: 35 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,41 @@ here.**

## [Unreleased]

_**`metamodelVersion` moves `1.0` to `1.1`.** The vocabulary is additive: a model that uses none
of the new names generates byte-for-byte what it did under 1.0. What loads changes only where the
Java and Python parser fixes under **Fixed** bring those ports into line with TypeScript, and each
entry says which models that affects. `main` carries 1.1 from here, so no 1.0.x PATCH is cut from
it until 1.1 ships._
## [1.1.0] β€” 2026-10-10

_npm `1.1.0` (all 14 `@metaobjectsdev/*` packages in lockstep), PyPI `1.1.0`, NuGet `1.1.0` and
Maven Central `8.1.0`. **`metamodelVersion` moves `1.0` to `1.1`.** The vocabulary is additive: a
model that uses none of the new names generates byte-for-byte what it did under 1.0. What loads
changes only where the Java and Python parser fixes under **Fixed** bring those ports into line
with TypeScript, and each entry says which models that affects. This is a MINOR because the
metamodel moved and reporting is a new feature, not because the package surface broke._

**What 1.1.0 is.** The reporting release (FR-044): declare dimensions, measures, segments and an
`object.report`, and get a SQL view, a served read-only list route in every port, a generated
TanStack list hook, and a Cube data model, with `@spine` for rows that have no facts and
`@default` for an empty measure. It also carries the first slice of requirements (the gate in
every port's `verify`), the derived-key parity fix across the ports, and the list-hook and
nested-average fixes found by the first adopter to map real report pages onto the feature.

**How much smaller the code gets.** The size reduction comes in two steps, and each is its own
number. The first landed on 1.0.x: 439 lines of handler code retired. The second is reporting:
with it, the same pages come to about 60 lines of SQL and about 180 lines of metadata.

**Two diffs to expect when you upgrade.**

- **An ejected generator needs a resync (G11).** An owned copy keeps the gate and the options it
was copied with, so it does not receive the new report behaviour until you resync it. The
entries under **Added** and **Fixed** name the command for each affected generator (`meta eject
hooks --force`, `meta eject routes --force`, `meta eject routes-hono --force`). A generator you
never ejected needs nothing.
- **A keyless projection regenerates differently (G12).** `meta gen` rewrites the read-only
surface of a keyless projection (no `/:id` route, no by-id function, and no write verbs in the
API docs), and `meta verify --docs` reports the affected pages as stale until they are
regenerated. Run `meta gen` and review the diff; three-way merge preserves hand edits.

**Not in 1.1.0.** Derived measures, the preview `reporting` library, the dbt exporter, the second
requirements slice and the advisory lint port, the JSON Schema and OpenAPI generators, the
generator catalog and the Atlas evaluation are 1.2 work.

### Added

Expand Down
Loading
Loading