Commit 69d89dd
docs: design — codegen is opt-in, and the catalog is the thing that already exists
A new project gets code it never asked for, and the amount varies wildly by
port: TypeScript wires five generators at `meta init`, C# runs nine with no
configuration, Python eight. Java runs zero and has been right all along.
The ruling: documentation codegen stays on, every code generator becomes
opt-in, all four ports in the same release. The governing principle is that the
tool describes what it can do and stops hard-coding which subset an application
needs — that judgement belongs to whoever is building it, increasingly an agent
in the repo, which is well served by a truthful catalog and badly served by a
default that pre-empts it.
The design's one non-obvious move is that "bundle" is never stored. The unit
stays the generator's existing ADR-0021 stable name — already the cross-port
identity, the copy unit, the config unit, the gate unit and the drift unit — and
a bundle is what you get by grouping the catalog on `layer` and `framework`. The
prior art is unanimous here: Babel removed its stage presets, Storybook
dissolved addon-essentials into core naming the packaged bundle as the defect,
.NET needed workload sets (a lockfile) because manifests drifted, Laravel
dropped its bundle-presets, Quarkus retired aggregative extensions, and ESLint
re-added `extends` only as imported objects you can see. A stored list over a
catalog fails the same three ways every time.
So no new document: the conformance manifest already names 29 generators and
`meta gen --list` already prints it. It gets completed (four TypeScript client
generators exist in neither the manifest nor the TS registry, and `gen --list`
and `eject --list` read different tables today), gains the facts a selection
needs, and grows `--probe`, which dry-runs every catalog generator against the
loaded model so "which of these does this app need" is answered from the model
rather than from a declaration. `eject` takes multiple names and reports the
wiring and the exact install set; it does not edit anyone's config.
Ships as a PATCH. No existing project changes by one byte — owned copies and
committed selections keep working, and `meta gen` keeps running exactly the list
it is given. What changes is what a NEW project starts with. The
compatibility-policy clause that lists the scaffolded generator set as breaking
is over-broad and is narrowed in the same change: the promise is the layout and
the interfaces, not which generators a fresh scaffold happens to wire.
`metamodelVersion` does not move; no metamodel vocabulary is added.
Two open questions carried for a ruling: whether framework exclusivity is a gate
or only procedure, and the closed `layer` set (verified to cover all 34 names
exactly).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011cQxyVuTkdPmAduLiedNEg1 parent 8d9b06a commit 69d89dd
1 file changed
Lines changed: 413 additions & 0 deletions
0 commit comments