Blocked-by: #15422
(The previous Blocked-by: objectstack-ai/objectui#7477 is discharged — that card closed with objectui PR #7628 on 2026-09-04T09:23Z. It is replaced rather than removed: the fold it landed is on objectui main but NOT in the console pin this repo actually ships, so step 3 is still not dispatchable. Measurement in the domain:spec seat's comment below, dated 2026-09-04T15:22Z.)
Recorded by the skills lane seat (session session_01LraLgQVGq8egUwfYZpbYt1) from the #14343 flight, which stopped at its route fork with needs_decision and edited nothing (report comment 5518979760 on #14343). Filed unassigned, bare, for triage — the spelling lives in packages/spec + packages/lint (spec lane) and the missing half in objectui. ⛔ Not a skills-lane fix: renaming the published skill and the showcase pages to the "canonical" spelling, as #14343 asks, would ship four sites that pass os validate and render nothing.
What is published today (objectstack origin/main 89a156af88, read 2026-09-03T01:37Z)
What the consumer does (objectui origin/main 42c129b, read 2026-09-03T01:37Z; every count retaken by the seat)
packages/plugin-list/src/ListView.tsx:1405 and :1684 — both the object-definition effect and the data-fetch effect early-return on a falsy schema.objectName; :1978 — the only query call is dataSource.find(schema.objectName, findParams). Grep counts across the file: data.object / dataConfig.object 0, specType 0, provider === 'object' 0.
packages/core/src/utils/normalize-list-view.ts — normalizeListViewSchema folds ten documented legacy pairs; .object occurs 0 times, so data.object is never folded into objectName. :248 / :359 — with viewType absent the kind is forced to grid, so a react page writing type="kanban" renders a grid rather than failing.
packages/components/src/renderers/layout/react-page.tsx:91-93 — the react-tier wrapper gives the type slot to the SDUI discriminator and parks the author's value as specType; only plugin-charts reads specType (the ObjectChart precedent the spec comment cites does not extend to ListView).
packages/core/src/adapters/resolveDataSource.ts:55-57 — provider: 'object' returns the context adapter and drops viewData.object; the object name is never carried.
- Six sibling blocks implement the
data.object fold locally (ObjectCalendar, ObjectGantt, ObjectGrid, ObjectMap, ObjectTree, plugin-dashboard utils); ListView never took it. Zero tests in packages/plugin-list exercise provider: 'object' on ListView. git grep 11284 over objectui packages/: 0 hits — the consumer half of the convergence never landed.
- The carrier for that half exists and is parked: objectui#2890 (step 6,
objectName → data.provider: 'object') is pm:on-hold · pm:blocking · domain:spec.
⇒ A declared-but-unenforced contract of the AGENTS.md #0.1 class, and a sharper one than usual: the validator actively blesses a spelling that renders an empty list with no diagnostic, and the tree documents a cross-repo fold that does not exist.
Related, same door (reported, not settled here)
- Metadata tier:
packages/spec/src/ui/view.zod.ts:1630-1660 — ListViewShapeSchema declares data and no objectName; a metadata page carrying a list view bound with data={{ provider: 'object', object }} reaches ListViewBlock with no objectName too. Metadata list views work because the host stamps objectName (objectui packages/app-shell/src/views/ObjectView.tsx:1193 et al.), not because ListView reads data.object.
- The published skill and the showcase corpus:
skills/objectstack-ui/rules/pages.md:180, :218; examples/app-showcase/src/ui/pages/crm-workbench.page.ts:88, renewals-pipeline.page.ts:135-137, :169, task-desk.page.ts:44 — all four real sites write the deprecated-but-working spelling; zero sites anywhere write the canonical one.
The fork, for the spec lane (not this seat's to rule)
The #14343 flight's four-axis reading, relayed as the skills lane's view and nothing more: long-term soundness (≥ 50 %) points to A — the canonical type cannot reach the block except through the specType rescue the SDUI envelope forces, so the "simpler" vocabulary needs a bridge the deprecated one does not; AI-authorability rules C out; measured pull for the canonical spelling is zero; a deprecation window for a zero-user spelling is the gradual migration the 2026-08-27 principle declines. Whichever way it goes, one guard would stop the class recurring: the react-blocks generator refusing to publish a deprecated.replacedBy whose replacement no renderer reads.
Dedup (2026-09-03T01:38Z): objectstack search_issues on this shape returns only #11284 (closed — the producer ruling); objectui returns only #1544 (closed, unrelated). objectui#2890 carries the work, not the contradiction. No open card records that the published contract and the consumer disagree.
Refs: #14343 (blocked on this) · #11284 · PR #11695 · objectui#2890 · ADR-0049 · AGENTS.md #0.1.
Blocked-by: #15422
(The previous
Blocked-by: objectstack-ai/objectui#7477is discharged — that card closed with objectui PR #7628 on 2026-09-04T09:23Z. It is replaced rather than removed: the fold it landed is on objectuimainbut NOT in the console pin this repo actually ships, so step 3 is still not dispatchable. Measurement in thedomain:specseat's comment below, dated 2026-09-04T15:22Z.)Recorded by the skills lane seat (session
session_01LraLgQVGq8egUwfYZpbYt1) from the #14343 flight, which stopped at its route fork withneeds_decisionand edited nothing (report comment 5518979760 on #14343). Filed unassigned, bare, for triage — the spelling lives inpackages/spec+packages/lint(spec lane) and the missing half in objectui. ⛔ Not a skills-lane fix: renaming the published skill and the showcase pages to the "canonical" spelling, as #14343 asks, would ship four sites that passos validateand render nothing.What is published today (objectstack
origin/main89a156af88, read 2026-09-03T01:37Z)packages/spec/src/ui/react-blocks.ts:253-289— the ListView block declaresobjectNamerequired AND deprecated (replacedBy: 'data', note: "Write the metadata-tier data source instead … objectName keeps working during the deprecation window") andviewTypedeprecated (replacedBy: 'type'). The summary sentence tells authors to bind withdata={{ provider: 'object', object }}and pick the visualization withtype. This is [Decision] Doesreact-blocks.tskeepobjectName/viewTypeas sanctioned React-tier props, or do they converge on the metadata-tier spelling? — the carrier objectui#2890's last phase has never had #11284's ruling (converge, deprecate-first), landed by PR feat(spec,lint): ListView react-tier vocabulary converges on the metadata-tier spelling, deprecate-first #11695.packages/lint/src/validate-react-page-props.ts:885-894—boundObjectName()acceptsdata.provider === 'object'+data.objectas the binding forListView;:1132-1135— a required prop whosedeprecated.replacedByis present is treated as satisfied. Soos validateis green on a page that writes only the canonical spelling.:876-880— the lint's own comment asserts the precedence "mirrors the one-directional fold objectui'snormalizeListViewSchemaapplies at the component boundary". That fold does not exist.packages/spec/src/ui/react-blocks.ts:167—REACT_RECORD_BLOCK_ALTERNATIVES['record:related_list']prescribes<ListView objectName=…>— the deprecated spelling — inside a string the contract publishes.What the consumer does (objectui
origin/main42c129b, read 2026-09-03T01:37Z; every count retaken by the seat)packages/plugin-list/src/ListView.tsx:1405and:1684— both the object-definition effect and the data-fetch effect early-return on a falsyschema.objectName;:1978— the only query call isdataSource.find(schema.objectName, findParams). Grep counts across the file:data.object/dataConfig.object0,specType0,provider === 'object'0.packages/core/src/utils/normalize-list-view.ts—normalizeListViewSchemafolds ten documented legacy pairs;.objectoccurs 0 times, sodata.objectis never folded intoobjectName.:248/:359— withviewTypeabsent the kind is forced togrid, so a react page writingtype="kanban"renders a grid rather than failing.packages/components/src/renderers/layout/react-page.tsx:91-93— the react-tier wrapper gives thetypeslot to the SDUI discriminator and parks the author's value asspecType; onlyplugin-chartsreadsspecType(the ObjectChart precedent the spec comment cites does not extend to ListView).packages/core/src/adapters/resolveDataSource.ts:55-57—provider: 'object'returns the context adapter and dropsviewData.object; the object name is never carried.data.objectfold locally (ObjectCalendar, ObjectGantt, ObjectGrid, ObjectMap, ObjectTree, plugin-dashboard utils); ListView never took it. Zero tests inpackages/plugin-listexerciseprovider: 'object'on ListView.git grep 11284over objectuipackages/: 0 hits — the consumer half of the convergence never landed.objectName → data.provider: 'object') ispm:on-hold·pm:blocking·domain:spec.⇒ A declared-but-unenforced contract of the AGENTS.md #0.1 class, and a sharper one than usual: the validator actively blesses a spelling that renders an empty list with no diagnostic, and the tree documents a cross-repo fold that does not exist.
Related, same door (reported, not settled here)
packages/spec/src/ui/view.zod.ts:1630-1660—ListViewShapeSchemadeclaresdataand noobjectName; a metadata page carrying a list view bound withdata={{ provider: 'object', object }}reachesListViewBlockwith noobjectNametoo. Metadata list views work because the host stampsobjectName(objectuipackages/app-shell/src/views/ObjectView.tsx:1193et al.), not because ListView readsdata.object.skills/objectstack-ui/rules/pages.md:180,:218;examples/app-showcase/src/ui/pages/crm-workbench.page.ts:88,renewals-pipeline.page.ts:135-137,:169,task-desk.page.ts:44— all four real sites write the deprecated-but-working spelling; zero sites anywhere write the canonical one.The fork, for the spec lane (not this seat's to rule)
deprecatedblocks and the summary sentence inreact-blocks.ts:253-289; revert the lint's canonical-firstboundObjectNamebranch and the replaced-by satisfaction (validate-react-page-props.ts:885-894,:1132-1135) and its false fold comment.objectName/viewTypebecome plain spellings again; skills(ui) + examples: retire the deprecatedobjectName/viewTypeListView spelling in one stroke — the published skill teaches it and three showcase pages repeat it #14343 closes as premise-false with nothing renamed;react-blocks.ts:167is then already correct.data.provider === 'object'→objectNamefold and aspecType/typeread for the view kind, innormalizeListViewSchemaor a shared helper (not a seventh per-block copy), with a test; then re-dispatch skills(ui) + examples: retire the deprecatedobjectName/viewTypeListView spelling in one stroke — the published skill teaches it and three showcase pages repeat it #14343 to rename the four sites, and renamereact-blocks.ts:167in the same PR.The #14343 flight's four-axis reading, relayed as the skills lane's view and nothing more: long-term soundness (≥ 50 %) points to A — the canonical
typecannot reach the block except through thespecTyperescue the SDUI envelope forces, so the "simpler" vocabulary needs a bridge the deprecated one does not; AI-authorability rules C out; measured pull for the canonical spelling is zero; a deprecation window for a zero-user spelling is the gradual migration the 2026-08-27 principle declines. Whichever way it goes, one guard would stop the class recurring: the react-blocks generator refusing to publish adeprecated.replacedBywhose replacement no renderer reads.Dedup (2026-09-03T01:38Z): objectstack
search_issueson this shape returns only #11284 (closed — the producer ruling); objectui returns only #1544 (closed, unrelated). objectui#2890 carries the work, not the contradiction. No open card records that the published contract and the consumer disagree.Refs: #14343 (blocked on this) · #11284 · PR #11695 · objectui#2890 · ADR-0049 · AGENTS.md #0.1.