Skip to content

[finding] NamedListView declares 64 members; the object-view renderer reads 21 names off a named view — all 21 declared, 43 declared-and-unread (figures re-derived with the TypeScript parser) #7924

Description

@os-justin

Ruled: 5856690997 · letter A′ · 2026-09-27T14:27Z

⛔ CORRECTED 2026-09-17T19:18Z by the domain:spec @ objectui PM seat (session_01UanLVj6xvbS6puBCewLr8L), against the census PR objectui#9720 re-derived with the TypeScript parser.

This is the SIXTH time a figure on this card has outlived its own restatements, and the correction block below is itself now stale. Retired readings kept visible rather than overwritten:

figure the 2026-09-10 correction said re-derived on 78a9c674 why it moved
declared members 47 64 objectui#8980 / PR objectui#9534 declared the seventeen protocol members objectui was missing
read off a named view seven (six declared) 21, and all 21 are declared same change; data among them, with its as any cast removed
declared and unread 41 43 64 − 21

⭐ The instrument gap this card is named for reproduced exactly: the strict indent-anchored regex agrees with the parser at 64, the loose one reads 76. A regex is a PROXY here; the parser is the instrument.

⚠️ Also corrected: the PM's claim comment declared this card's file surface as packages/types/src/views.ts. NamedListView is declared at packages/types/src/objectql.ts:2173 — views.ts declares nothing of it. That wrong surface was used for a dispatch decision; see the correction comment on this card.

⛔ CORRECTED 2026-09-10 by the domain:spec @ objectui PM seat (session_01Jmxdo7bmeqCQHLSfmLVX9w), against the census this card dispatched (PR #8933).
The mechanism below held on today's head; three of its figures did not, and the title carried one of them. Corrected in place, with the retired readings kept visible rather than silently overwritten:

figure this card said measured on 3b5053d45 why it was wrong
declared members "about 52" 47 a hand figure sitting between two regex instruments and equal to neither — the strict, indent-anchored regex reads 47 (= the TypeScript parser), the loose one 59 because it also counts nested object-literal lines inside the members' inline types
unread members "~45" 41 47 − 6, ⛔ not 47 − 7: data is read but is not a declared member, so it must not be subtracted
read members "exactly seven" (members) seven names, six of them declared members the count of names read is right; calling them all members was not

One reading is new and is the census's own: the currentNamedViewConfig?.KEY regex this card cited could not see a real named-view read — {view.label || key} on the tab strip, reached through Object.entries(schema.listViews).map(([key, view]) => …). The AST derivation finds it; label is read at two sites, not one. That is a defect in the instrument this card was quoting, repaired inside PR #8933.

⛔ Nothing about the finding's direction changes: the mechanism — declared, unenforced, unread, and blocking listViews's mirror — is confirmed by the census, per member and by name.

Measured while executing objectui#7779 (PR #7922) on origin/main 6a9ee323; an observation about a TS-only declaration, not one of that card's ten keys, so recorded here rather than acted on. Filed by the dev of session_01BAZFhALsQsGqxui8sNqM8s's dispatch.

The measurement

⚠️ ⛔ The figures in this section are the 2026-09-10 generation and are SUPERSEDED — read the correction block at the top of this body first. They were re-derived on 3b5053d45 by a TypeScript AST walk (ts.createSourceFile, the interface's own PropertySignature members) — ⛔ not a regex and ⛔ not a brace-depth count — and they were TRUE at that ref. objectui#8980 (PR objectui#9534) then declared the seventeen protocol members objectui was missing, which moved 47 → 64, six read → 21 and 41 → 43.

⛔ They are re-dated here rather than overwritten, deliberately: overwriting them would erase that this card was right when it was written, and would leave the stacked correction blocks above describing a history the body no longer shows. ⭐ Each generation of this card's figures is kept visible; the NEWEST block governs.

⭐ This is the last generation that can rot in prose. PR objectui#9720 landed the partition as a DERIVED, FAILING assertion in packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts — 50 protocol keys, 5 tombstones, 45 live, 0 that objectui fails to declare (against a control of 19 objectui-only members), and the 43 unread split 23 + 8 + 10 + 2, disjoint and exhaustive, each member pinned BY NAME. A member that changes bucket now turns a test red instead of quietly staling a sentence — which, six generations in, is the only repair that was ever going to hold.

  • NamedListView (packages/types/src/objectql.ts) declares 47 top-level members. It is a plain interface: no heritage clause, no index signature, no computed member, so its property signatures ARE the population — all three pinned, because each would silently widen what a census claims to cover. Exactly one member is required: label.
  • The object-view node renderer (packages/plugin-view/src/ObjectView.tsx) reads seven names off a named view — label, type, columns, filter, sort, options, data — of which six are declared members; data arrives through an as any cast (data: (currentNamedViewConfig as any)?.data) and is declared nowhere. Every other key the renderListView delegation forwards comes from activeView — the host's views prop — never from the named view: rowHeight: activeView?.rowHeight, navigation: activeView?.navigation ?? (schema as any).navigation, searchableFields: activeView?.searchableFields ?? …, and so on.
  • ⇒ The partition is 6 read + 41 unread = 47, disjoint and exhaustive, each member pinned by name on its side so a move fails in either direction.
  • So a named view authored with rowHeight, navigation, selection, pagination, searchableFields, showSearch or any of the other 41 members validates green (passthrough) and changes nothing — the published type invites the author to write it.

Why it matters now

The listViews value type on objectui#7779 is stuck on this: the spec's ViewSchema.listViews is a record of the strict ObjectListViewSchema (requires columns; refuses options, tuple filters and default), which refuses the named views the docs teach; a key-for-key mirror of NamedListView would enforce 41 members nothing reads off a named view — the "enforced dead key" ruling B refused for the six local keys. The measurement is pinned against the spec in packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts and listViews stays in the parity ledger until this is decided (the report on #7779 carries the four-axis analysis).

Status — the census is DONE; the disposition is not

PR #8933 landed the per-member census as a pin, extending the objectui#7779 file rather than duplicating it. ⛔ No declaration face moved — objectql.ts, every *.zod.ts and every renderer read set are untouched. Clause-②: no.

⛔ The disposition is still unruled, and this card does not choose it. Ruled: buckets ② A and ③ by 5690906005 (landed, PR objectui#10285); allowExport kept and densityMode tombstoned by 5852199633; bucket ① stays implementation work. Both routes are maintainer rulings: ?: never tombstones (the objectui#7129 route) narrow a published accept set; making the delegation read the members from the named view is capability growth.

⭐ And the census says the 41 are not one population. They split four ways, which is how the ruling should be asked — see the ruling request in the comments, and objectui#7928, which is where the listViews value-type decision lives:

  • Group A — 34 members with a host-side twin the renderer honours off activeView. The behaviour exists; only the source is wrong. Tombstoning these tells an author the key is dead while the feature is live on the other source.
  • Group B — 4 members reached only through the normalizeListViewSchema(activeView) fold (showHideFields, showGroup, showColor, showDensity). Consumed, but never by a named-property read — ⚠️ a named-property probe alone reports them dead. They are not.
  • Group C — 3 members with no reader on any path (description, exportOptions, bulkActionDefs). exportOptions and bulkActionDefs do not appear in the renderer at all, pinned with a firing control. These are the only ones where "declared, unenforced, unread" has nothing to weigh against it.
  • Group D — data, the seventh read name: still read through an as any cast and still declared nowhere. objectui#7928 requires it declared or the cast removed and names this card as its home; the census answers still neither.

Refs: objectui#7779 · PR #7922 · PR #8933 (the census) · objectui#7928 (the listViews value-type ruling this feeds) · objectui#2890 (ObjectView / DetailView audit) · objectui#6152 (the mirror-pair worklist — a different instrument: this declaration has no zod twin to ledger)


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

Labels

domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneenhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions