Skip to content

finding(types): NamedListView declares none of 17 members the protocol declares live on the same surface — objectui is NARROWER than the spec, the direction the principle forbids #8980

Description

@os-warren

Found by the protocol sweep while working objectui#7924; no card on the board owns this, which is why it is filed rather than folded in.

The finding

objectui#7924 measured NamedListView's declared-but-unread members — 41 of 47. That is one direction. Nobody has measured the other: members the protocol declares live on this surface that NamedListView does not declare at all.

There are 17:

appearance  calendar  chart  data  fieldOrder  gallery  gantt  grouping  kanban
map  name  pageName  rowColor  tabs  timeline  tree  userActions

⇒ objectui is narrower than the protocol on all 17. Under the maintainer principle now in force, that is the direction that is actually forbidden:

我们的项目以 objectstack 协议为准,文档应该以实际实现为准。协议不正确的应该先修改协议。

(source, and a route it overturned: objectui#8934 5617613810.)

Where they are declared

Protocol read at objectstack eabdd66f45f402eba0f8404a8a9de4a501fc83a6 (spec 17.3.0).

The value type of a named list view is ObjectListViewSchema (packages/spec/src/ui/view.zod.ts:3711-3720), built from ListViewShapeSchema (:1823, a strictObject), and it is already the declared value of both ViewSchema.listViews (ui/view.zod.ts:3801) and ObjectSchema.listViews (data/object.zod.ts:2193). Sample rows:

ui/view.zod.ts:1852   data: ViewDataSchema.optional().describe('Data source configuration (defaults to "object" provider)'),
ui/view.zod.ts:2048   userActions: UserActionsConfigSchema.optional()…
ui/view.zod.ts:2051   appearance: …

Controls: a nonexistent protocol name reads 0/0; listViews 65, ObjectListViewSchema 19, ViewSchema 127. NamedListView reads 0 in the protocol — correctly, it is objectui's own name.

Why this is not a duplicate of objectui#7924

Different direction, different remedy, and #7924's remedies do not reach it:

objectui#7924 this card
measures declared in objectui, unread by the renderer declared in the protocol, undeclared in objectui
objectui is possibly wider than it needs to be narrower than the protocol
the principle constrains which of them may be retired names this as the forbidden state

Two of the 17 already have their own decided consequences recorded on objectui#7924: data (read through an as any cast, declared nowhere — the protocol says declare it, which answers objectui#7928's open half) and userActions / appearance (the canonical home of eight legacy show* spellings objectui#7924 wants to retire — retiring them without adding these two containers leaves objectui narrower on seven live toggles). This card is the remaining thirteen plus the general question.

⚠️ What is NOT settled here, and must not be assumed

  1. ⛔ "Narrower than the protocol" is not automatically "declare all 17." Several are view-kind keys — calendar chart gallery gantt kanban map timeline tree — and whether a named list view in objectui is even the surface that should carry them is a real design question, not a transcription exercise. Measure what objectui's object-view does with view kinds before declaring anything.
  2. ⚠️ tabs needs care: two different keys share one word. The protocol declares a top-level tabs: z.array(ViewTabSchema) on the list shape, while ObjectUserFiltersSchema's guidance at ui/view.zod.ts:3690 says "tabs presets are page-only" about userFilters.tabs. The sweep did not resolve whether top-level tabs is intended to survive the object-view narrowing. ⛔ Do not declare tabs until that is measured.
  3. ⛔ Declaring a key you do not read recreates objectui#7924's defect in the opposite direction. Anything declared here needs a read site or an explicit, recorded reason for declaring ahead of one.
  4. If the conclusion for any of the 17 is that the protocol is wrong to declare it on this surface, that is an objectstack spec card first — ⛔ never a local omission defended after the fact.

⚠️ Sampling caveat

The objectui side was measured at d4733f27e4f9b19eb529e991a20a0a1d52ebf463, branch claude/pm-dispatch-spec-i9kml2 — ⛔ not origin/main, and from a checkout that is shallow with a stale origin/main. The member count (47) independently reproduces objectui#7924's census figure, which is evidence the interface has not moved, ⛔ but not proof. Re-sample on origin/main before acting.

Not measured

ObjectView.tsx was not opened. No safeParse was executed against ObjectListViewSchema; strictness is read from strictObject at ui/view.zod.ts:1823, and it was not verified that .omit().extend().superRefine() preserves strict unknown-key behaviour in zod 4. The five protocol tombstones (bordered performance responsive striped virtualScroll) were noted as retiredKey(...) but their prescriptions were not read.

Refs objectui#7924 · objectui#7928 · objectui#4631 (the standing card about nothing reconciling the declared surfaces).


Generated by Claude Code

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

    Labels

    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepackage: typespriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions