Measured while re-anchoring objectui#6598 on origin/main @ ece68882. Filing, not claiming.
The finding
PageComponentSchema.dataSource — { object, view?, filter?, sort?, limit? }, the spec's per-element data binding — is the one spelling that resolves a saved view for an object-bound block on the html tier. It works. It also draws a diagnostic saying it does not exist.
Measured through the live path (registry-built manifest, the exact page.tsx html-kind construction, SchemaRenderer, the real plugin-list registration):
| page source |
compile diagnostics |
columns that reach the grid |
list-view with objectName + dataSource={{object:'opportunity', view:'all'}} |
warning unknown-prop: list-view has no prop "dataSource" |
['name','amount'] — resolved from the saved view ✅ |
list-view with objectName + viewName="all" |
warning unknown-prop: list-view has no prop "viewName" |
none |
list-view with objectName + view="all" |
warning unknown-prop: list-view has no prop "view" |
none |
So the working spelling and the two non-working ones are reported identically, and the tier's only signal points away from the one that works.
Mechanism
validateTree skips BASE_PROPS (the BaseSchema mirror: type, id, className, style, visible, visibleOn, disabled, disabledOn, children) and otherwise looks the prop up in the component's declared inputs. dataSource is in neither: git grep "name: 'dataSource'" packages/ returns zero registrations, and it is not a base prop.
But it is read — by ElementDataSourceGate in @object-ui/react, on behalf of every object-bound block that wraps itself in it (plugin-list, plugin-form, plugin-calendar, plugin-detail, plugin-charts, plugin-gantt, plugin-kanban, plugin-map, plugin-dashboard). It is a cross-block key of the same kind as style, published by the spec and consumed by the runtime, that the manifest has no way to describe.
Why this is not just noise
It is the objectstack#4413 shape inverted. That one was declared and unread; this one is read and undeclared — and the cost lands on the tier meant to accept AI-authored pages, where the diagnostic IS the contract. The objectui#6598 reporter tried viewName and view and gave up; the key that would have worked was the one the tier would also have told them does not exist.
The decision this needs
Two shapes, and picking between them is a declaration-surface call rather than a mechanical fix, which is why this is a card and not a PR:
- A — add
dataSource to BASE_PROPS in packages/sdui-parser/src/validate.ts. One edit; but that set is documented as mirroring BaseSchema, and dataSource belongs to PageComponentSchema, so it would also silence the key on blocks that do not read it (flex, card).
- B — declare it on the
inputs of each registration that wraps ElementDataSourceGate. Truthful per block and it reaches codegen and the designer; spans nine packages, and every one of them then owes the framework's spec/registry parity gate an answer.
Related: objectui#6598, objectui#5905 (manifest serializer keys with no reader), objectui#6150 (schema keys renderers read that no shipped type declares).
Generated by Claude Code
Measured while re-anchoring objectui#6598 on
origin/main@ece68882. Filing, not claiming.The finding
PageComponentSchema.dataSource—{ object, view?, filter?, sort?, limit? }, the spec's per-element data binding — is the one spelling that resolves a saved view for an object-bound block on the html tier. It works. It also draws a diagnostic saying it does not exist.Measured through the live path (registry-built manifest, the exact
page.tsxhtml-kind construction,SchemaRenderer, the realplugin-listregistration):list-viewwithobjectName+dataSource={{object:'opportunity', view:'all'}}warning unknown-prop: list-view has no prop "dataSource"['name','amount']— resolved from the saved view ✅list-viewwithobjectName+viewName="all"warning unknown-prop: list-view has no prop "viewName"list-viewwithobjectName+view="all"warning unknown-prop: list-view has no prop "view"So the working spelling and the two non-working ones are reported identically, and the tier's only signal points away from the one that works.
Mechanism
validateTreeskipsBASE_PROPS(theBaseSchemamirror:type,id,className,style,visible,visibleOn,disabled,disabledOn,children) and otherwise looks the prop up in the component's declaredinputs.dataSourceis in neither:git grep "name: 'dataSource'" packages/returns zero registrations, and it is not a base prop.But it is read — by
ElementDataSourceGatein@object-ui/react, on behalf of every object-bound block that wraps itself in it (plugin-list,plugin-form,plugin-calendar,plugin-detail,plugin-charts,plugin-gantt,plugin-kanban,plugin-map,plugin-dashboard). It is a cross-block key of the same kind asstyle, published by the spec and consumed by the runtime, that the manifest has no way to describe.Why this is not just noise
It is the objectstack#4413 shape inverted. That one was declared and unread; this one is read and undeclared — and the cost lands on the tier meant to accept AI-authored pages, where the diagnostic IS the contract. The objectui#6598 reporter tried
viewNameandviewand gave up; the key that would have worked was the one the tier would also have told them does not exist.The decision this needs
Two shapes, and picking between them is a declaration-surface call rather than a mechanical fix, which is why this is a card and not a PR:
dataSourcetoBASE_PROPSinpackages/sdui-parser/src/validate.ts. One edit; but that set is documented as mirroringBaseSchema, anddataSourcebelongs toPageComponentSchema, so it would also silence the key on blocks that do not read it (flex,card).inputsof each registration that wrapsElementDataSourceGate. Truthful per block and it reaches codegen and the designer; spans nine packages, and every one of them then owes the framework's spec/registry parity gate an answer.Related: objectui#6598, objectui#5905 (manifest serializer keys with no reader), objectui#6150 (schema keys renderers read that no shipped type declares).
Generated by Claude Code