Found while implementing #5342 (widening check-doc-component-types.mjs to .md). Filed unassigned, not claimed, and deliberately NOT fixed in that PR — #5342 is a collector-widening plus a ledger pass, and which way crud should be fixed is a contract decision, not a re-spelling.
Measured
content/docs/api/schema-reference.md:530 documents CRUDSchema with a copyable block:
{
"type": "crud",
"title": "Products",
"resource": "products",
"api": "/api/products",
...
}Nothing registers crud. Derived from the actual register(...) calls (the universe check-doc-component-types.mjs builds — 659 keys on f2e11ae6f), crud is absent:
grep -rn "register('crud'" packages/*/src apps/*/src # zero hits
Every other declaration face is present:
| face | site |
|---|
| TS interface | packages/types/src/crud.ts:418 — type: 'crud'; |
| zod mirror | packages/types/src/zod/crud.zod.ts:158 — type: z.literal('crud') |
| validator branch | packages/core/src/validation/schema-validator.ts:135 — if (schema.type === 'crud') |
| builder | packages/core/src/builder/schema-builder.ts:170 — super('crud') |
CRUDSchema is a member of CRUDComponentSchema (crud.ts:641), which is itself a member of the node union at packages/types/src/index.ts:852 — so this sits on the render path, unlike its siblings action / page-break / block-instance, which are document-level discriminants that never reach the registry.
Why this is not a duplicate of #5115
#5115 measured the same absent renderer, but it was scoped to the CLI's hand-written knownTypes copy, and PR #5128 closed it by deriving that list from the registry. That fix made objectui checkwarn about crud — packages/cli/src/__tests__/check-known-types.test.ts:63 pins the warning by name. It did not decide what crud itself should be. The published reference page still teaches it.
So the state today is: the CLI warns, the validator has a dedicated branch that passes it, the builder constructs it, and the docs present it as reference material.
What this card needs decided (it is a contract question, which is why it is filed rather than fixed)
#5115 already listed the three routes and declined to pre-decide, and nothing since has picked one:
- Register a
crud renderer — the four declaration faces become true. - Retire
CRUDSchema under ADR-0049 enforce-or-remove — delete the interface, the zod mirror, the validator branch, the builder, and rewrite the reference page around the shapes that do render. - Demote it to a document type that is not in the node union — keep the schema, take it off the render path, and say so on the page.
Each implies a different edit to content/docs/api/schema-reference.md, which is why #5342 ledgers the site instead of re-spelling it.
Current treatment, so this is not lost
#5342 adds a DOC_TYPE_EXEMPTIONS entry for content/docs/api/schema-reference.md -> crud whose reason names this issue and says to delete the entry when it lands. The gate reports a stale-exemption finding once the site changes, so the ledger cannot silently outlive the fix.
Reproduce
node scripts/check-doc-component-types.mjs # after #5342 lands
grep -n '"type": "crud"' content/docs/api/schema-reference.md
grep -rn "register('crud'" packages/*/src apps/*/src # zero hits
Related: #5115 / PR #5128 (the CLI half, closed), #4631 (three declared surfaces disagreeing — same family, different fact), #5342 (the gate widening that surfaced this site).
Generated by Claude Code
Found while implementing #5342 (widening
check-doc-component-types.mjsto.md). Filed unassigned, not claimed, and deliberately NOT fixed in that PR — #5342 is a collector-widening plus a ledger pass, and which waycrudshould be fixed is a contract decision, not a re-spelling.Measured
content/docs/api/schema-reference.md:530documentsCRUDSchemawith a copyable block:{ "type": "crud", "title": "Products", "resource": "products", "api": "/api/products", ... }Nothing registers
crud. Derived from the actualregister(...)calls (the universecheck-doc-component-types.mjsbuilds — 659 keys onf2e11ae6f),crudis absent:Every other declaration face is present:
packages/types/src/crud.ts:418—type: 'crud';packages/types/src/zod/crud.zod.ts:158—type: z.literal('crud')packages/core/src/validation/schema-validator.ts:135—if (schema.type === 'crud')packages/core/src/builder/schema-builder.ts:170—super('crud')CRUDSchemais a member ofCRUDComponentSchema(crud.ts:641), which is itself a member of the node union atpackages/types/src/index.ts:852— so this sits on the render path, unlike its siblingsaction/page-break/block-instance, which are document-level discriminants that never reach the registry.Why this is not a duplicate of #5115
#5115 measured the same absent renderer, but it was scoped to the CLI's hand-written
knownTypescopy, and PR #5128 closed it by deriving that list from the registry. That fix madeobjectui checkwarn aboutcrud—packages/cli/src/__tests__/check-known-types.test.ts:63pins the warning by name. It did not decide whatcruditself should be. The published reference page still teaches it.So the state today is: the CLI warns, the validator has a dedicated branch that passes it, the builder constructs it, and the docs present it as reference material.
What this card needs decided (it is a contract question, which is why it is filed rather than fixed)
#5115 already listed the three routes and declined to pre-decide, and nothing since has picked one:
crudrenderer — the four declaration faces become true.CRUDSchemaunder ADR-0049 enforce-or-remove — delete the interface, the zod mirror, the validator branch, the builder, and rewrite the reference page around the shapes that do render.Each implies a different edit to
content/docs/api/schema-reference.md, which is why #5342 ledgers the site instead of re-spelling it.Current treatment, so this is not lost
#5342 adds a
DOC_TYPE_EXEMPTIONSentry forcontent/docs/api/schema-reference.md->crudwhose reason names this issue and says to delete the entry when it lands. The gate reports astale-exemptionfinding once the site changes, so the ledger cannot silently outlive the fix.Reproduce
Related: #5115 / PR #5128 (the CLI half, closed), #4631 (three declared surfaces disagreeing — same family, different fact), #5342 (the gate widening that surfaced this site).
Generated by Claude Code