Skip to content

Commit ee878eb

Browse files
dmealingclaude
andcommitted
docs: fix the Node boot command, refresh the roadmap, correct fixture counts
Launch-readiness pass over the public first-touch surface. - docs/ports/typescript.md "Prove it works" offered `node --experimental-strip-types src/server.ts`, which fails with ERR_MODULE_NOT_FOUND on the generated `./generated/<Entity>.routes.js` import: Node's type stripping deliberately does not rewrite `.js` specifiers to `.ts` sources, and the scaffold default is extStyle "js" (chosen in 0.20.1 so generated code type-checks under a stock `tsc --init`). Same class as that 0.20.1 fix — the compile half was covered, the run half was not. Now gives `bun src/server.ts` and `npx tsx src/server.ts`, both verified end-to-end in a cold project (201 create, list read-back, 400 on a @required violation), and says why Node's built-in stripping is not enough on its own. - spec/roadmap.md was ten-odd releases stale: it claimed the published line was npm 0.20.1 / NuGet 0.19.3 / PyPI 0.19.5 / Maven 7.11.3 while the README two clicks away said 0.20.13. For a project whose pitch is drift detection that is the worst artifact to have drifted. Refreshed to 0.20.13 / 7.20.13 and reconciled the 1.0-promotion text with the shared-patch policy: the four registries lock minor.patch, only the major stays decoupled. - Adjudicated the "Before 1.0" list rather than letting it become 1.0 by inertia. FR-026's stated gap ("UpdateSchema is generated but no codegen consumes it — edit forms don't exist") has been false since #227: the generated <Entity>Form switches to UpdateSchema when defaultValues are present, so the one form is the edit form; view-kind control dispatch and view.image shipped in 0.18/0.19. The remainder and `meta export` CLI parity move to 1.1; GA mechanics are marked satisfied by the 0.20.13 coordinated cut, leaving only the renumbering. - llms.txt / llms-full.txt understated the conformance corpora as "~90 fixtures" and "20 scenarios" — actually 260 and 41 per docs/CONFORMANCE.md. These are the AI-facing surface of a conformance-is-the-product pitch. CLAUDE.md's count aligned to the same source. - README "How to contribute" linked CLAUDE.md; CONTRIBUTING.md exists and is the right target. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S3msoGxjRMwx94PhKSLDuE
1 parent 9ee297a commit ee878eb

6 files changed

Lines changed: 50 additions & 25 deletions

File tree

‎CLAUDE.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ _Last refreshed 2026-08-05._
3232
- **Kotlin** — `codegen-kotlin` (KotlinPoet on JVM): entity + Exposed table + Spring controller + payload + relations + filter allowlist + validator + stored-proc + output-parser generators. `integration-tests-kotlin` runs the persistence-conformance corpus through Exposed against Testcontainers Postgres.
3333

3434
**Cross-port conformance corpora** (every port runs the shared corpus):
35-
- Metamodel: `fixtures/conformance/` (258 fixtures; 19 shared corpora in total — per-corpus counts + the corpus x port matrix live in `docs/CONFORMANCE.md`). TS / C# / Java / Python all green.
35+
- Metamodel: `fixtures/conformance/` (260 fixtures; 19 shared corpora in total — per-corpus counts + the corpus x port matrix live in `docs/CONFORMANCE.md`). TS / C# / Java / Python all green.
3636
- Render: `fixtures/render-conformance/`. TS / C# / Java / Kotlin / Python byte-identical.
3737
- Persistence: `fixtures/persistence-conformance/`. **Query** scenarios run on every port (TS / C# / Java / Kotlin / Python), each provisioning its test DB by executing the committed, TS-produced `canonical/schema.postgres.sql` (Postgres only — Derby dropped for the cross-port query corpus, ADR-0015). The **migration** scenarios are exercised by **TS only** (TS owns schema migrations). **The corpus now gates WRITES, not just reads (SP-H):** an `op: roundtrip` scenario type INSERTs through each port's runtime/ORM write codec (NOT raw SQL), reads the row back, and asserts the wire-normalized value. The `AllTypes` entity (`roundtrip-all-types.yaml`) carries one field of **every** persistable `field.*` subtype — string/int/long/double/float/decimal/boolean/date/time/timestamp(+tz)/currency/enum/uuid/object — plus an **array-of-VO** `field.object @isArray @storage:jsonb` column (`labels`, written as 2-element / empty-`[]` / single-element arrays across the three rows) — so every subtype write+read (incl. the array-of-value-object jsonb codec) round-trips through every port against Testcontainers PG. (`field.byte`/`field.short`/`field.class` were cut as non-functional registration-only stubs — the matrix tracks only genuinely-supported subtypes; see `fixtures/registry-conformance/README.md` → "Per-subtype write-round-trip matrix".)
3838
- API-contract: `fixtures/api-contract-conformance/`. TS / C# / Java / Kotlin / Python all green — each port runs **two lanes**: a hand-rolled reference server AND its **generated** API artifact booted over HTTP (the deployed controller/routes; TS+C# full-stack vs Testcontainers PG, Java/Kotlin/Python generated controller + in-memory repo behind the consumer seam). The generated fan-out found 10 real deployment bugs golden snapshots missed.

‎README.md‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,10 +235,11 @@ normalized results across every port, or it's a port bug. See
235235

236236
## How to contribute
237237

238-
PRs welcome. Read [`CLAUDE.md`](CLAUDE.md) for the project conventions (TDD
239-
discipline, named-constants-for-metamodel-strings, no-`any` rule, cross-language
240-
porting contract). For significant new features, open an issue first to discuss
241-
the approach.
238+
PRs welcome. Read [`CONTRIBUTING.md`](CONTRIBUTING.md) for how to propose a
239+
change and the project conventions it has to meet (TDD discipline,
240+
named-constants-for-metamodel-strings, no-`any` rule, cross-language porting
241+
contract, public-repo hygiene). For significant new features, open an issue
242+
first to discuss the approach.
242243

243244
## Roadmap
244245

‎docs/llms/llms-full.txt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ Because the render is conformance-gated, the determinism guarantee holds in ever
9999
| C# | NuGet `0.20.13` (.NET tool) | Loader + canonical serializer + EF Core + ASP.NET codegen + render/verify. `dotnet meta` tool. |
100100
| Python | PyPI `0.20.13` | Loader + serializer + render + verify + codegen + `ObjectManager` runtime. Fully green across all corpora. |
101101

102-
Conformance fixtures live at [`fixtures/`](https://github.com/metaobjectsdev/metaobjects/tree/main/fixtures). Every port runs the shared corpus byte-identically: metamodel (`conformance/`, ~90 fixtures), render, persistence (Testcontainers Postgres, with an `op: roundtrip` gate so every `field.*` subtype write+read round-trips on every port), api-contract (20 scenarios, two lanes — a reference server AND each port's generated API booted over HTTP), registry (byte-matched metamodel-vocabulary manifest, live + green in all five ports), and yaml/verify.
102+
Conformance fixtures live at [`fixtures/`](https://github.com/metaobjectsdev/metaobjects/tree/main/fixtures). Every port runs the shared corpus byte-identically: metamodel (`conformance/`, 260 fixtures), render, persistence (Testcontainers Postgres, with an `op: roundtrip` gate so every `field.*` subtype write+read round-trips on every port), api-contract (41 scenarios — 26 core plus TPH / M:N / jsonb / write-through — two lanes: a reference server AND each port's generated API booted over HTTP), registry (byte-matched metamodel-vocabulary manifest, live + green in all five ports), and yaml/verify.
103103

104104
---
105105

‎docs/llms/llms.txt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ This `llms.txt` is the short index; the deep, version-matched how-to is the scaf
3131
## Spec and standard
3232

3333
- [Specification (canonical, target-agnostic)](https://github.com/metaobjectsdev/metaobjects/tree/main/spec): the normative metadata schema and semantics that every implementation must conform to.
34-
- [Conformance fixtures](https://github.com/metaobjectsdev/metaobjects/tree/main/fixtures): cross-port corpora — `conformance/` (metamodel, ~90 fixtures), `render-conformance/`, `persistence-conformance/` (against Testcontainers Postgres, including an `op: roundtrip` gate so every `field.*` subtype write+read round-trips on every port), `api-contract-conformance/` (20 scenarios across REST contract + filter operators, run in two lanes: a reference server AND each port's generated API booted over HTTP), `registry-conformance/` (byte-matched metamodel-vocabulary manifest, live + green in all five ports), and `yaml-conformance/` / `verify-conformance/`. Every port runs the shared corpus byte-identically.
34+
- [Conformance fixtures](https://github.com/metaobjectsdev/metaobjects/tree/main/fixtures): cross-port corpora — `conformance/` (metamodel, 260 fixtures), `render-conformance/`, `persistence-conformance/` (against Testcontainers Postgres, including an `op: roundtrip` gate so every `field.*` subtype write+read round-trips on every port), `api-contract-conformance/` (41 scenarios — 26 core REST contract + filter operators, plus TPH / M:N / jsonb / write-through — run in two lanes: a reference server AND each port's generated API booted over HTTP), `registry-conformance/` (byte-matched metamodel-vocabulary manifest, live + green in all five ports), and `yaml-conformance/` / `verify-conformance/`. Every port runs the shared corpus byte-identically.
3535
- [Roadmap](https://github.com/metaobjectsdev/metaobjects/blob/main/spec/roadmap.md): current + planned work across all implementations.
3636

3737
## The four pillars

‎docs/ports/typescript.md‎

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,22 @@ recipe above).
238238

239239
### Prove it works
240240

241-
Boot the server (`bun src/server.ts` or `node --experimental-strip-types
242-
src/server.ts`) and exercise the generated routes. Three calls are enough to show
243-
codegen, persistence and validation are all live:
241+
Boot the server:
242+
243+
```bash
244+
bun src/server.ts # Bun
245+
npx tsx src/server.ts # stock Node
246+
```
247+
248+
Node's built-in TypeScript support is **not** enough here — `node src/server.ts`
249+
(type stripping, on by default in Node 24; `--experimental-strip-types` before
250+
that) strips the types but deliberately does not rewrite module specifiers, so
251+
the generated `import … from "./generated/Author.routes.js"` fails with
252+
`ERR_MODULE_NOT_FOUND`. Run it through `tsx` as above, or compile with `npx tsc`
253+
first and run the emitted JavaScript.
254+
255+
Now exercise the generated routes. Three calls are enough to show codegen,
256+
persistence and validation are all live:
244257

245258
```bash
246259
# 1. create -> 201 with the persisted row (id assigned by the DB)

0 commit comments

Comments
 (0)