Skip to content

finding(types): SchemaRegistry['kanban'] names the declarative schema, but the renderer registered for kanban honours the plugin's — the map's value does not describe the component it names #7645

Description

@claude

Carded now because #6172's 2026-08-31 maintainer ruling asked for it: the escalation that produced that ruling recorded this as evidence rather than a card, on the explicit disposition "card it separately if the ruling picks A or B". The ruling picked A, and PR #7643 landed it — so this is due. ⛔ Unassigned; grading is the triage seat's.

What was measured, at 2e99852ca (before PR #7643) and re-derived after it

packages/types/src/registry.ts documents SchemaRegistry as "the Single Source of Truth for component type lookups". Its 'kanban' entry maps to the declarative schema declared in packages/types/src/complex.ts — after #7643 that is DeclarativeKanbanSchema, before it, the same declaration under the bare name.

The renderer actually registered for the 'kanban' key is ObjectKanbanRenderer in @object-ui/plugin-kanban, and it consumes that package's KanbanSchema (packages/plugin-kanban/src/ObjectKanban.tsx:31 imports it from ./types). The two are structurally unrelated dialects — the declarative face carries draggable, column color and card labels / assignees / priority; the plugin face carries objectName, groupBy, cardTitle, cardFields, card badges and thirteen more.

⇒ For this key, the value side of the "single source of truth" map does not describe the component the key names.

It is LATENT, and that is the point of filing rather than fixing

Measured, not assumed: the value side of SchemaRegistry is reached only through ComponentType = keyof SchemaRegistry, and nothing in the repo performs an indexed access (no SchemaRegistry['kanban'], no SchemaRegistry[K] read site). So nothing consumes the wrong value today — the defect is a false claim in a map that advertises itself as authoritative, waiting for the first consumer that trusts it.

PR #7643 renamed the declarative copy rather than relocating the plugin dialect into @object-ui/types, which was the ruled outcome and which leaves this latent-but-named — that PR adds a comment at the entry saying exactly this. Only the option-C route (promoting the plugin dialect into @object-ui/types) would have made the map true, and the ruling declined it because it would move sixteen renderer-specific keys into the declared zero-workspace-dependency bottom layer.

The question this card is really asking

Should the one-authority family rule be extended so that SchemaRegistry's value must be the type the registered renderer honours — and if so, for kanban specifically, by which of: relocating the plugin dialect up, letting @object-ui/types declare a renderer-facing alias it can reach without a workspace dependency, or narrowing the map's documented promise to the key set it really owns?

That is a contract decision about a published type, not a measurement, so it is recorded rather than answered.

Reproduce

grep -n "'kanban':" packages/types/src/registry.ts
grep -rn "SchemaRegistry\[" packages --include=*.ts --include=*.tsx    # zero indexed accesses
grep -n "from './types'" packages/plugin-kanban/src/ObjectKanban.tsx

Refs: #6172 (the ruling and its escalation record) · PR #7643 (option A, landed) · #6155.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions