Skip to content

[finding] The #11284 convergence shipped only its producer half: the react-blocks contract deprecates objectName / viewType on ListView in favour of data={{ provider: 'object', object }} / type, and the lint blesses that spelling — but objectui's ListView reads neither, so the canonical spelling validates green and renders an empty list #14791

Description

@os-litant

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.tsnormalizeListViewSchema 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-57provider: '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-1660ListViewShapeSchema 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.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions