The MetaObjects standard has 6 cross-language conformance corpora plus a deferred
7th (codegen-conformance/, tracked as FR-007). Every port runs every applicable
corpus and asserts the same expected behavior against the same fixtures. This
page is the inverse index: fixture → feature doc + per-port pass status.
If you are coming from a feature doc's ## Verified by section, you are in the
right place. If you are wondering whether a particular fixture has a
human-readable explanation somewhere, look it up in the
"Fixture-to-doc mapping" table below.
| Corpus | Fixtures | TS | Java | Kotlin | C# | Python |
|---|---|---|---|---|---|---|
fixtures/conformance/ (metamodel) |
219 | 219 / 219 | 219 / 219 | inherits via metadata-ktx |
219 / 219 | 219 / 219 |
fixtures/yaml-conformance/ |
15 | 15 / 15 | 14 / 15 (1 ledgered: yaml-quoted-leading-zero — Java pipeline strips quotes off "007") |
inherits via Java | 14 / 15 (1 ledgered: error-yaml-coerced-hex-in-string — YamlDotNet doesn't coerce 0xFF) |
15 / 15 |
fixtures/verify-conformance/ |
31 | 31 / 31 | 31 / 31 | inherits via Java | 31 / 31 | 31 / 31 |
fixtures/render-conformance/ |
15 | 15 / 15 | 15 / 15 | inherits via Java | 15 / 15 | 15 / 15 |
fixtures/persistence-conformance/ |
29 (24 query + 5 migration) | 29 / 29 | 24 / 24 query (migrations TS-only) | 24 / 24 query (via Exposed) | 24 / 24 query | 24 / 24 query |
fixtures/api-contract-conformance/ |
21 | 21 / 21 (Fastify reference runner) | 21 / 21 (embedded HTTP + JDBC reference runner) | 21 / 21 (embedded HTTP + Exposed reference runner) | 21 / 21 (HttpListener + Npgsql reference runner) | 21 / 21 (FastAPI + pg8000 reference runner) |
fixtures/codegen-conformance/ (FR-007 — DROPPED in favor of persistence-conformance participation) |
0 | n/a | n/a | n/a | n/a | n/a |
The two ledgered YAML fixtures are documented library-vs-pipeline divergences (see the
_comment block in each port's yaml-conformance-expected-failures.json for the
full reconciliation note). They are tracked as known-gaps rather than silently
patched — the runner treats listed fixtures as passing, but a future port-level
reconciliation pass would close them.
Per-port runners + commands:
| Port | Metamodel + YAML + render + verify | Persistence | API contract |
|---|---|---|---|
| TypeScript | cd server/typescript && bun test (per-package, ~3s) |
scripts/integration-test.sh ts (needs Docker) |
cd server/typescript/packages/integration-tests && bun test test/api-contract.test.ts (needs Docker) |
| Java | mvn -pl metaobjects-conformance test (and per-tier -pl render, etc.) |
scripts/integration-test.sh java (needs Docker) |
mvn -f server/java/integration-tests/pom.xml test -Dtest=ApiContractConformanceTest (needs Docker) |
| Kotlin | mvn -pl codegen-kotlin test (snapshot suite) |
mvn -pl integration-tests-kotlin test (needs Docker) |
mvn -f server/java/integration-tests-kotlin/pom.xml test -Dtest=ApiContractConformanceTest (needs Docker) |
| C# | dotnet test (per project) |
scripts/integration-test.sh csharp (needs Docker) |
dotnet test server/csharp/MetaObjects.IntegrationTests/MetaObjects.IntegrationTests.csproj --filter "FullyQualifiedName~ApiContractConformanceTest" (needs Docker) |
| Python | pytest (per package) |
scripts/integration-test.sh python (needs Docker) |
cd server/python && uv run --extra integration pytest tests/integration/test_api_contract.py (needs Docker) |
The persistence-conformance corpus is intentionally on-demand — none of the
unit-test runners (bun test, dotnet test, pytest, mvn test) pull Docker.
scripts/integration-test.sh is the entry point and is wired into
docs/RELEASING.md §2b as the pre-latest gate.
| Fixture prefix | Feature doc |
|---|---|
loader-basic-*, error-parse-* |
features/loaders.md |
extends-*, error-extends-* |
features/entities.md (inheritance) |
identity-*, subtype-entity-*, subtype-value-* |
features/entities.md (identity / entity vs value) |
attr-*, error-attr-*, error-reserved-word-as-attr |
features/entities.md (attributes) |
doc-common-attrs-* |
features/entities.md (documentation common attrs) |
auto-set-on-* |
features/entities.md (auto-set timestamps) |
attr-filter-*, loader-filterable-*, warning-filterable-*, layout-data-grid-*, error-data-grid-* |
features/entities.md (filter / sort / grid) |
overlay-* |
features/entities.md (overlay / merge) |
merge-three-way-no-conflict, error-merge-conflict-attr, warning-duplicate-declaration |
features/loaders.md (multi-file merge attribution, FR5c) |
field-string-*, field-decimal-*, field-object-storage-*, error-field-object-storage-* |
features/field-types.md |
currency-* |
features/field-types.md (currency) |
enum-*, error-enum-* |
features/field-types.md (enum) |
source-rdb-*, source-db-table-*, source-db-view-*, source-multi-source-*, error-source-* |
features/source-kinds.md |
relationship-*, error-unknown-relationship-* |
features/relationships.md |
template-*, error-template-* |
features/templates-and-payloads.md |
origin-*, error-origin-* |
features/templates-and-payloads.md (payload origins) |
smoke-empty-metadata |
features/entities.md |
All 15 fixtures → features/yaml-authoring.md. The corpus
splits into 7 happy-path fixtures (sigil-free attrs, array suffix, anchor/alias,
block scalars, mixed bare-and-prefixed, quoted leading zero, etc.) and 6
error-yaml-* fixtures that pin the YAML 1.1 coercion guards (bool / null / hex
in string contexts; numeric in enum contexts; reserved-as-attr).
All 15 fixtures → features/templates-and-payloads.md (render engine output section). 4 are end-to-end shape examples (prompt / email / spreadsheet / CSV-injection escape); 10 pin Mustache-engine semantics — dotted-path lookup, parent-context fallthrough, falsy/empty-array section behavior, inverted sections, nested partials, standalone-tag whitespace stripping, raw-HTML bypass, trailing-newline preservation, and unicode multibyte handling.
All 31 fixtures → features/migrations-and-drift.md
(template drift section — Renderer.verify).
migrations/*(3) → features/migrations-and-drift.md (schema migration section)queries/*(9) → features/source-kinds.md (query semantics againstsource.rdb)
All 21 scenarios → features/api-contract.md (cross-port
REST API URL grammar + JSON wire format). Verifies every backend's emitted CRUD
routes answer identically over HTTP — list / get / create / patch+put / delete,
plus pagination (limit/offset), sort (sort=field:dir), the withCount=1
envelope, the not_found / invalid_sort error envelopes, and the 201 / 204
status codes.
The corpus also covers the 9 cross-port filter operators (eq, ne, gt,
gte, lt, lte, in, like, isNull) plus the implicit-AND combinator
and 2 error shapes (invalid_filter_field / invalid_filter_op) under the
URL grammar ?filter[<field>][<op>]=<value> (FR-009) — 10 filter scenarios
on top of the 10 base CRUD scenarios. All 5 ports — TS, Java, Kotlin, C#,
Python — satisfy all 20 scenarios today.
All 330 fixtures across the 6 active corpora (metamodel 219 + yaml 15 + verify 31
- render 15 + persistence 29 + api-contract 21) map to a feature doc. None are orphaned today.
If you add a new fixture and don't see a clear home for it, either:
- Add a section to the closest matching feature doc and reference it from its
## Verified byblock, or - Open an issue if the fixture exercises behavior the feature docs haven't yet described.
None of the 8 feature docs lack fixture coverage. The closest case is the
high-level overview material in each doc (e.g., the "Anatomy of an entity"
explainer in entities.md) — these are pedagogical, not behavioral, and don't
require pinning.
- features/ — the per-feature reference, each with its own
## Verified by spec/conformance-tests.md— fixture format + canonical serializer contractspec/cross-language-porting-guide.md— how a new port wires up against the corporafixtures/conformance/ERROR-CODES.json— the enumerated error codes everyerror-*fixture pinsdocs/RELEASING.md—scripts/integration-test.shrunspersistence-conformanceper port pre-release