Uh oh!
There was an error while loading. Please reload this page.
feat(spec): the object-* block family enters ComponentPropsMap — typo'd props warn with did-you-mean (#7751) - #8524
Conversation
Direction A per the maintainer ruling (2026-08-12): six object-* blocks get props schemas derived from objectui's renderer read points, so validate-component-props has schemas to dispatch and 'filters' -> 'filter' did-you-mean comes free. object-chart deliberately excluded (two-vocabulary problem). Parity rides check:react-declaration-parity, which now iterates the object-* map entries under the same baseline ratchet. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012MNV7ZSCjNfA38eDCjsXQL
… props schemas (#7751) - api-surface/export-origins/docs-references/strictness-ledger counts regenerated (the four check:generated proved stale) - each new schema gets its author-state type alias (ObjectGridProps ...) per ADR-0122; all six are default-free so they pin isomorphic (Iso838-Iso843) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012MNV7ZSCjNfA38eDCjsXQL
…ect-block-props-map
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012MNV7ZSCjNfA38eDCjsXQL
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
…ollows) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012MNV7ZSCjNfA38eDCjsXQL
…ins to Iso839-Iso844 (#7751) Main's #8211 (PR #8450) took Iso838; the six object-* pins renumber to the next free ids on the merged tree (ids are claims about pins, not positions — renumbering unmerged pins is legal). Pin count 825 + 6 = 831, asserted by the count case, not arithmetic. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012MNV7ZSCjNfA38eDCjsXQL
Uh oh!
There was an error while loading. Please reload this page.
Fixes#7751
What
Per the maintainer ruling (2026-08-12, direction A), the
object-*block family's props schemas enterComponentPropsMap(packages/spec/src/ui/component.zod.ts), so the existingvalidate-component-propslint has schemas to dispatch for the platform's data-bound authoring surface — and did-you-mean (filters→filter) comes free. Six blocks are registered:object-grid,object-metric,object-kanban,object-calendar,object-form,object-master-detail-form.The #7750 specimen shape (an
object-gridauthored with pluralfilters) now warns:How the key sets were derived
Measured from the objectui renderers' own read points (checkout at
eb7f586b; per-key line citations in the section header), never from the designer palette or registryinputsalone — both publish keys with zero read points (object-gridstriped/bordered,object-kanbangroupField), and re-declaring one would recreate the declared-but-inert trap this card closes. Consequences:defaultFiltersstays declared —ObjectGrid.tsxreads it as a legacy fallback behindfilter(routed-finding hard constraint). Only pluralfiltershas zero read points and is rejected by name via the provenoptionsSourcealias-table pattern.groupFieldspelling is aliased to thegroupBythe board reads.object-calendar's flat field spellings (startDateField, …) get a wrong-layer prescription pointing at thecalendarconfig object (thebody→childrenprecedent: read as back-compat, not a second authorable spelling).objectNameis optional everywhere: the component-leveldataSourcebinding can supply the object (PageComponentSchema.dataSource 在 list-view 之外仍无人消费:element:record_picker 丢 view,object-grid/form/kanban/calendar 等整条绑定不读(按 spec 写 dataSource 渲染出空) #6953), and the lint's required-prop exemption only covers the key spelledobject.Scope judgment
object-grid,object-metric,object-kanban,object-calendar, plusobject-form/object-master-detail-form— their renderers read a destructured/enumerable set (ObjectForm.tsx+ the five sub-forms it forwards into;MasterDetailForm.tsx).object-chart. Its authored vocabulary is two-layered (chartTypeon the SDUI node vsChartConfigSchema.type; corpus authorsdataset/dimensions/valueswhile the rest of the bag spreads into the generic chart component), so its key set is not derivable with the same confidence — a partial entry would warn on working keys, worse than the status-quo skip. It stays a silently-skipped unregistered type, pinned in tests.z.unknown()where the value contract still lives in objectui). The card's class is a KEY typo; value tightening is a later ratchet.What did NOT change
packages/lint/src/validate-component-props.ts— zero semantic change; its dispatch simply starts finding schemas (PROPS_SCHEMASisComponentPropsMap). The silent-skip for unregistered types is untouched — 87 corpus nodes depend on it.PageComponent.properties是开放 record,ComponentPropsMap的 29 个站点从不被 parse(#4001 批 17 的 no gate 判定) #5068 inventory (the ruling: 「warning 层先行,error 升级仍以 inventory 为闸,本裁定不改那个闸」).PageComponentSchema.properties) stays an open record; direction B remains declined.Parity (the ruling's third point)
check:react-declaration-paritynow also iterates theobject-*ComponentPropsMapentries against objectui'ssdui.manifest.json— same comparison, same baseline ratchet, no new gate. Blocks not yet in the committed baseline are additive (pinned in the script's fixture tests), so the first pin-bump run stays green and--updaterecords them. The registry-declaredinputsof each block are a strict subset of its spec set, soregistry-onlyis empty by construction today; the spec surplus is the softspec-onlysignal ADR-0082 §2 expects. This gate remains on-demand (pin-bump-triggered,EXTERNAL_INPUT_REQUIREDforcheck:generated) — it could not be run here (no browser manifest); its new iteration is proven with the existing fixture harness instead.Tests
packages/spec/src/ui/component.test.ts— showcasemy-work: the personal work queue authorsfilters:(plural) and no$filterever reaches the wire — the grid lists every row #7750 specimen red with rename; corrected node green; all corpus metric/form/MDF shapes green;defaultFiltershonoured;groupField→groupBy; calendar flat-spelling prescription;object-chartexclusion pinned;objectNameoptional everywhere.packages/lint/src/validate-component-props.test.ts— anti-vacuity (warning FIRES on the showcasemy-work: the personal work queue authorsfilters:(plural) and no$filterever reaches the wire — the grid lists every row #7750 shape through the real walker door, warning-tier, no invalid findings); clean-corpus control (copied showcase nodes stay finding-free);object-metricswapped out of the skip-list test for the still-unregisteredobject-chart.packages/spec/scripts/check-react-blocks-declaration-parity.test.ts— the SDUI iteration can go red (fabricated registry-only input), reports missing blocks, and treats not-yet-baselined blocks as additive.validateComponentPropsrun over the real showcase corpus — 28 pages loaded, 0 findings (registering the family turned no working page red).Verified on the merged base (origin/main at
1e70d249f):@objectstack/spec394 files / 10469 tests pass,@objectstack/lint72 files / 2012 tests pass, both typechecks pass,check:generatedreports all 13 artifacts up to date. The six new type aliases are default-free and pinned isomorphic per ADR-0122 (Iso838-Iso843).Generated by Claude Code
Generated by Claude Code