(Blocked-by: #15422 is discharged and removed, 2026-09-08T06:35Z. That card closed 2026-09-05T00:43Z with PR #15554, which moved .objectui-sha to a472b071. ⛔ Verified against the card's own one-line criterion rather than against its closure, because #15422 states in terms that "merged upstream and present in the pinned tree are two different readings": git grep -q "provider === 'object'" "$(git show origin/main:.objectui-sha)" -- packages/core/src/utils/normalize-list-view.ts exits 0, and the substantive fold is at :315 — dataConfig?.provider === 'object' && typeof dataConfig.object === 'string'. Negative control: the file is readable at that pin, 1 hit for normalizeListViewSchema. ⚠️ For whoever reuses that criterion — line :263 is a comment containing the same string, so the grep alone would exit 0 on the comment; only :315 actually satisfies it.
The earlier Blocked-by: objectstack-ai/objectui#7477 was discharged before that — closed with objectui PR #7628 on 2026-09-04T09:23Z — and was replaced by #15422 rather than removed, because the fold it landed was on objectui main but not yet in the console pin this repo ships.)
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.
(⚠️ For whoever reuses that criterion — line
Blocked-by: #15422is discharged and removed, 2026-09-08T06:35Z. That card closed 2026-09-05T00:43Z with PR #15554, which moved.objectui-shatoa472b071. ⛔ Verified against the card's own one-line criterion rather than against its closure, because #15422 states in terms that "merged upstream and present in the pinned tree are two different readings":git grep -q "provider === 'object'" "$(git show origin/main:.objectui-sha)" -- packages/core/src/utils/normalize-list-view.tsexits 0, and the substantive fold is at:315—dataConfig?.provider === 'object' && typeof dataConfig.object === 'string'. Negative control: the file is readable at that pin, 1 hit fornormalizeListViewSchema.:263is a comment containing the same string, so the grep alone would exit 0 on the comment; only:315actually satisfies it.The earlier
Blocked-by: objectstack-ai/objectui#7477was discharged before that — closed with objectui PR #7628 on 2026-09-04T09:23Z — and was replaced by #15422 rather than removed, because the fold it landed was on objectuimainbut not yet in the console pin this repo ships.)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.