Skip to content

Commit 32941ef

Browse files
dmealingclaude
andcommitted
docs(conformance): reconcile FR-007 as REJECTED + record A/B hardening shipped
The codegen-conformance README said PENDING and the hardening-review R12 listed FR-007 as backlog, both contradicting the 2026-05-26 rejection. Flip both to REJECTED (a codegen-output corpus adds ~0 net coverage — behavior corpora gate codegen's observable consequences; Phase B empirically caught real per-port codegen bugs via the persistence round-trip). Record that conformance-hardening A (CI wiring, db6440f) + B (normalization+projection, 6252130) shipped; the residual vocab long-tail (R10) is opportunistic, not a campaign. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 6252130 commit 32941ef

2 files changed

Lines changed: 69 additions & 40 deletions

File tree

docs/superpowers/specs/2026-05-29-conformance-hardening-review.md

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,29 @@
22

33
_Date: 2026-05-29. Status: Review complete; remediation is a ranked backlog (each item gets its own plan when picked up). No code changes in this document._
44

5+
> **UPDATE 2026-05-31 — conformance-hardening pass A/B shipped; FR-007/R12 rejected.** A fresh
6+
> corpus×port×CI audit drove a two-phase hardening:
7+
> - **Phase A (`db6440ff`)** — wired the byte-exact corpora (render/verify/recover/output-prompt/
8+
> object-model) into the per-push `conformance.yml` for all 5 ports (incl. a new Kotlin job), and
9+
> widened `integration-tests.yml` (persistence+api) to run on **all PRs + pushes to main**. Closes
10+
> the "Kotlin runs only 2 corpora" + "persistence/api not in default CI" + the newly-found
11+
> "byte-exact corpora run in NO workflow" gaps below.
12+
> - **Phase B (`62521308`, 6 units, all 5 ports)** — the remaining **R6** normalization
13+
> (timestamp/timestamptz/date/time) is now gated by shared persistence round-trip scenarios
14+
> (timestamptz-`Z` hazard resolved); **R10** projection holes closed (passthrough-view read +
15+
> sum/avg/min/max aggregates — only `count` was tested); divergent per-port normalization unit
16+
> tests retired. B caught a real codegen/normalization bug in every port (proof the behavior
17+
> corpora gate codegen drift). Spec: `docs/superpowers/specs/2026-05-31-normalization-conformance-design.md`.
18+
> - **R12 (FR-007 codegen-conformance) — REJECTED (re-confirmed 2026-05-31).** Per the 2026-05-26
19+
> rejection (`docs/superpowers/specs/2026-05-25-fr-007-codegen-conformance-corpus-design.md` §0):
20+
> a dedicated codegen-output corpus adds ~0 net coverage — the behavior corpora gate codegen's
21+
> observable consequences, and B proved it empirically. Do NOT build it. See
22+
> `fixtures/codegen-conformance/README.md`.
23+
> - **Still open (opportunistic, lowest tier):** R10 vocabulary long-tail (`field.short`/`byte`,
24+
> `validator.*`, non-cascade referential actions, advanced `@kind`s) — closed via the normal
25+
> "new behavior ⇒ new fixture" discipline, not a campaign. R1 (CLI smoke gate, ties to CLI work)
26+
> + install-smoke remain.
27+
528
## Why this exists
629

730
A real defect — the **Python port shipped with no CLI** (`meta gen` / `meta verify` / `meta migrate`) — passed every conformance corpus. That prompted a full audit of the conformance suite. The CLI gap is not a one-off; it is the visible tip of a structural blind spot plus several "looks-green-but-isn't-a-gate" issues and broad under-assertion.
@@ -43,7 +66,7 @@ Siblings of the CLI gap — a port can silently lack or diverge on these and sta
4366

4467
6. **CLI / tooling entry point** — no corpus exercises any `meta` binary / maven-plugin / `dotnet meta`. Python ships none (`server/python` has no `[project.scripts]`, no `cli`/`__main__`); Kotlin ships none (driven only via the Java Maven plugin). Per-port CLI tests (TS, C#) are local, not a shared contract, and can't detect a port that ships no CLI.
4568
7. **Packaging / publish parity** — nothing installs the built/published artifact and runs it. This is the class that hid both the CLI gap and the documented `workspace:*` npm leak.
46-
8. **Codegen output drift**`fixtures/codegen-conformance/README.md` states drift between ports is undetected. A port could mis-map `field.currency`, drop `@maxLength`, or omit a generator and stay green. FR-007 plans a *semantic* (not byte) corpus.
69+
8. **Codegen output drift**~~`fixtures/codegen-conformance/README.md` states drift between ports is undetected... FR-007 plans a *semantic* corpus.~~ **RESOLVED-BY-REJECTION (R12, 2026-05-31):** the framing was wrong — the behavior corpora (persistence/render/api-contract) gate codegen's observable consequences; a `field.currency`/`@maxLength`/missing-generator regression that *matters* explodes there (Phase B empirically caught real per-port codegen bugs that way). A dedicated codegen-output corpus = ~0 net coverage. Only the vocab long-tail no behavior corpus exercises (R10) is a residual gap, closed opportunistically.
4770
9. **Prompt output-parser (FR-006)** — claimed shipped in 5 ports, no corpus. Java even carries a documented origin-resolution deferral that a corpus would surface.
4871
10. **Doc-gen** — providers exist in several ports; no corpus for JSDoc / XML-doc / `COMMENT ON` / Mermaid output.
4972

@@ -75,7 +98,7 @@ Siblings of the CLI gap — a port can silently lack or diverge on these and sta
7598
| R9 | **Add missing negative fixtures** for the live ERR codes (finding #14), starting with `ERR_SUBTYPE_RULE_VIOLATION` | 3 | fixtures | med |
7699
| R10 | **Fill vocabulary holes** — fixtures for the untested subtypes/attrs (finding #13); a jsonb-without-objectRef negative; a TIMESTAMPTZ row; a JSONB-row persistence scenario | 3 | fixtures | med |
77100
| R11 |**DONE (2026-05-29, `42f2e0ae`).** Kotlin query runner globs the corpus minus a deferral ledger (allowlist removed) — new fixtures auto-run. Verified 9/9 via Testcontainers. | 1 | refactor Kotlin persistence runner | done |
78-
| R12 | **FR-007 codegen-conformance** (semantic parity: file inventory + type-mapping + payload-VO shape, not bytes) — pulls Kotlin into a codegen gate | 2 | new corpus + per-port manifest emitters | high |
101+
| R12 | **REJECTED (2026-05-26, re-confirmed 2026-05-31).** FR-007 codegen-conformance — a codegen-output corpus adds ~0 net coverage; the behavior corpora gate codegen's observable consequences (Phase B proved it: real per-port codegen bugs were caught by persistence round-trip). Do NOT build. The residual vocab-hole tail is R10/opportunistic. See `fixtures/codegen-conformance/README.md`. | 2 || n/a |
79102
| R13 | **Prompt output-parser corpus** + **install/run smoke per port** | 2 | sibling corpora / CI smoke | med |
80103

81104
## Scope notes
Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,44 @@
1-
# `codegen-conformance/` — PENDING (FR-007)
2-
3-
> ⚠️ **This corpus does not exist yet.** It is **DEFERRED** and tracked as **FR-007**.
4-
5-
Cross-language codegen conformance is the one shared-corpus gap in the MetaObjects testing matrix. Other corpora exist (`conformance/`, `render-conformance/`, `persistence-conformance/`, `verify-conformance/`, `yaml-conformance/`). This one will gate **what** each port's codegen emits — file inventory, type-mapping semantics, FR-004 payload-VO shape — independently of *how* (each port emits its own ecosystem's native code).
6-
7-
## Status
8-
9-
- **Spec:** [docs/superpowers/specs/2026-05-25-fr-007-codegen-conformance-corpus-design.md](../../docs/superpowers/specs/2026-05-25-fr-007-codegen-conformance-corpus-design.md)
10-
- **Blocked on:** `codegen-kotlin` shipping (the 4th codegen target — 3rd is TS, C# already shipped; Java's codegen-base is general-purpose but doesn't have an FR-004-typed payload generator).
11-
- **Helped by:** Python codegen, when it ships, becoming the 5th port that needs to participate.
12-
13-
## What this corpus will gate
14-
15-
**Tier 1 (cross-port invariant):**
16-
- File-per-entity inventory per declared generator
17-
- Field type semantic mapping (`field.long` → 64-bit int everywhere; `field.currency` → minor-units long everywhere; etc.)
18-
- Required vs nullable flags
19-
- `@maxLength` propagation to the appropriate native column type
20-
- FR-004 payload-VO field tree (each port's generated payload class has the same property names + semantic types)
21-
- Generator-catalog membership (every port implements the same generator names)
22-
23-
**NOT gated (intentionally divergent per port):**
24-
- Native column type spelling
25-
- Native repo / ORM style (Drizzle relations vs EF Core DbSet vs Exposed Table vs omdb-ktx extensions vs SQLAlchemy)
26-
- Native serialization annotation
27-
- Native package / module naming conventions
28-
- Native framework integration
29-
30-
## Why this README exists
31-
32-
To make the gap **impossible to miss**. If you're reading this because you stumbled into this directory while building a new codegen target or looking for cross-port codegen tests — that gate doesn't exist yet, and the spec above is the plan-of-record for when it does.
33-
34-
Until then, each port runs its own codegen snapshot tests against port-local golden files. Drift between ports is undetected.
35-
36-
## Do not delete this README
37-
38-
Even when the corpus eventually ships (per FR-007), keep this README to point newcomers at the design spec.
1+
# `codegen-conformance/` — REJECTED (FR-007 will not be built)
2+
3+
> ⚠️ **This corpus is NOT going to be built.** FR-007 was **formally rejected 2026-05-26**
4+
> (`docs/superpowers/specs/2026-05-25-fr-007-codegen-conformance-corpus-design.md` §0), and the
5+
> 2026-05-31 conformance-hardening pass (A/B) re-confirmed the rejection with empirical evidence.
6+
> This README is kept only so a newcomer who lands here understands *why* there is no codegen
7+
> corpus, instead of re-proposing one.
8+
9+
## Why it was rejected
10+
11+
A dedicated cross-port **codegen-output** corpus would add ~0 net coverage at real maintenance cost,
12+
because **codegen is a substrate and the behavior corpora already gate its observable consequences**:
13+
14+
- Field-type semantics (`field.long`→64-bit, `field.currency`→minor-units long), required/nullable,
15+
and `@maxLength` propagation are gated by **`persistence-conformance/`** executing the generated
16+
DDL + queries — a wrong mapping explodes there.
17+
- The FR-004 payload-VO field tree is gated by **`render-conformance/`** (a missing/renamed VO field
18+
changes the byte-identical rendered output).
19+
- Generated validators, filters, and routes are gated by **`api-contract-conformance/`**.
20+
- "Generator-catalog membership" was a false premise — each port's catalog is idiomatic-divergent by
21+
design (TS `entityFile/queriesFile/...` ≠ C# `entities/AppDbContext/routes` ≠ Kotlin
22+
`Entity/ExposedTable/Payload/...`); there is no shared catalog to gate.
23+
24+
**Empirical confirmation (2026-05-31):** the Phase-B normalization+projection work surfaced a real
25+
*codegen* bug in **every** port (C#'s MIN/MAX projection result-type + enum-over-view conversion,
26+
Kotlin's missing `TimeField` arm, etc.) — and every one was caught by the **behavior** (persistence
27+
round-trip) corpus, exactly as the rejection predicted. Codegen drift that matters shows up in
28+
behavior; codegen drift that doesn't is, by definition, not a correctness issue.
29+
30+
## The one residual gap — handled opportunistically, not by a corpus
31+
32+
Codegen/type drift *could* go uncaught for vocabulary **no behavior corpus exercises** — the
33+
"type-universe-shrinks" long tail (`field.short`/`byte`, `validator.{length,regex,numeric,array}`,
34+
non-cascade `@onDelete`/`@onUpdate`, `@kind: storedProc|tableFunction|materializedView`, the
35+
`view.*` UI subtypes). This is the lowest-priority backlog tier (hardening-review **R10**), and it is
36+
closed the project's normal way: **adding new metamodel behavior ⇒ add a behavior-corpus fixture that
37+
exercises it** (`spec/conformance-tests.md`). No standing codegen-manifest corpus is needed; add a
38+
persistence/api-contract fixture when one of those types/validators is touched.
39+
40+
## Do not delete this README / do not re-propose FR-007
41+
42+
Keep this file so the gap-that-isn't stays documented. If you believe a codegen corpus is warranted,
43+
the bar (per the rejection) is **a concrete codegen-drift incident that slipped past the behavior
44+
corpora** — not a coverage-completeness argument.

0 commit comments

Comments
 (0)