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
- ⛔ "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.
- ⚠️
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.
- ⛔ 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.
- 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
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 thatNamedListViewdoes not declare at all.There are 17:
⇒ objectui is narrower than the protocol on all 17. Under the maintainer principle now in force, that is the direction that is actually forbidden:
(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 fromListViewShapeSchema(:1823, astrictObject), and it is already the declared value of bothViewSchema.listViews(ui/view.zod.ts:3801) andObjectSchema.listViews(data/object.zod.ts:2193). Sample rows:Controls: a nonexistent protocol name reads 0/0;
listViews65,ObjectListViewSchema19,ViewSchema127.NamedListViewreads 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:
Two of the 17 already have their own decided consequences recorded on objectui#7924:
data(read through anas anycast, declared nowhere — the protocol says declare it, which answers objectui#7928's open half) anduserActions/appearance(the canonical home of eight legacyshow*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.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'sobject-viewdoes with view kinds before declaring anything.tabsneeds care: two different keys share one word. The protocol declares a top-leveltabs: z.array(ViewTabSchema)on the list shape, whileObjectUserFiltersSchema's guidance atui/view.zod.ts:3690says "tabspresets are page-only" aboutuserFilters.tabs. The sweep did not resolve whether top-leveltabsis intended to survive the object-view narrowing. ⛔ Do not declaretabsuntil that is measured.The objectui side was measured at
d4733f27e4f9b19eb529e991a20a0a1d52ebf463, branchclaude/pm-dispatch-spec-i9kml2— ⛔ notorigin/main, and from a checkout that is shallow with a staleorigin/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 onorigin/mainbefore acting.Not measured
ObjectView.tsxwas not opened. NosafeParsewas executed againstObjectListViewSchema; strictness is read fromstrictObjectatui/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 asretiredKey(...)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