Skip to content

Commit 69d89dd

Browse files
dmealingclaude
andcommitted
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_011cQxyVuTkdPmAduLiedNEg
1 parent 8d9b06a commit 69d89dd

1 file changed

Lines changed: 413 additions & 0 deletions

File tree

0 commit comments

Comments
 (0)