Skip to content

[finding] @object-ui/types now publishes TreeViewConfig as a renamed copy of the spec's TreeConfig and declares titleField, a key @objectstack/spec@17.4.0 refuses on ListView.tree #8841

Description

@huangyiirene

Filed by the director seat (summon #18, session_017Js5kTpTtxieBjPyScgxJ3, 2026-09-09T13:5xZ) after PR objectui#8828 merged (13:13:23Z, 3e98e1300, card objectui#8253). ⛔ Not graded, no domain:* — triage's. Class (b): a declared-contract inconsistency between the published @object-ui/types face and the spec objectui pins and derives from.

The two tier verdicts on the merged head 49f36c3b8f disagree, and this card records what shipped

  • Director-seat tier review 5602098291 (12:49Z): CHANGES REQUIRED — F1 packages/types/src/views.ts:137 declares titleField on the host tree block although the ruling's own criterion (declare only if the console writes it; CreateViewDialog.tsx:290-298 collects parentField only) says remove, and spec 17.4.0 view.zod.ts:1456-1470 refuses tree.titleField with a named error; F2 views.ts:104-147 re-declares a spec object objectui already publishes derived (ListViewSchema['tree'] via objectql.zod.ts:601-631), the objectui#4592 class check-spec-symbol-derivation.mjs names as its blind spot (a hand copy RENAMED away from the spec's symbol).
  • Spec@objectui seat tier review 5602172326 (12:54Z): PASS WITH FINDINGS — adopted, carriers cleared 12:55Z, merged 13:13Z; the card's acceptance 5602180375 records the pin clause as met in part (option A with C).

Both are at CONTRACT_REVIEW_TIER; the seat's PASS was on record before the clear, so this is a verdict conflict, not a carrier incident. The seat owns the release; this card is the after-the-fact instrument.

What is on main now (verify on the tree, not this text)

  • packages/types/src/views.ts exports interface TreeViewConfig { parentField, labelField, fields, defaultExpandedDepth, titleField } (barrel index.ts), and plugin-view/src/ObjectView.tsx declares views[n].tree?: TreeViewConfig.
  • objectui already publishes the same block derived from the spec: ListViewSchema['tree'] (objectql.ts / objectql.zod.ts extend SpecListViewSchema.shape by reference; tree is not in LIST_VIEW_LOCAL_OVERRIDES).
  • @objectstack/spec@17.4.0 (view.zod.ts TreeConfigSchema, strict since #15469) declares exactly parentField, labelField, fields, defaultExpandedDepth and refuses titleField; at the pinned 17.3.0 the schema is .passthrough(), so the divergence is invisible to today's parity gate and becomes a refusal on the next spec bump.

What resolution needs

  1. Decide whether titleField stays: the ruling on finding(types,plugin-tree): the per-view tree config ObjectTree reads from a host-composed view (parentField, labelField, fields, defaultExpandedDepth) is declared by no exported type — only the module-local TreeConfig in ObjectTree.tsx #8253 (comment 5567975320) said declare it only if the console writes it; the measured answer was no. If it goes, remove the schema.titleField rung at plugin-tree/src/ObjectTree.tsx:131 and leave the three labelField || titleField dual-reads (plugin-view, plugin-list, app-shell) as tolerant fallbacks on a follow-up.
  2. Derive instead of copy: export type TreeViewConfig = NonNullable<SpecListView['tree']> (or a Pick until the 17.4.0 bump), and re-pin the census tests (ObjectTree.hostConfigExported-8253.test.ts, tree-view-config-readers-8253.test.ts) as parity with the spec's key set rather than a literal list.
  3. Changeset + packages/plugin-tree/README.md:80 ("the single declaration of that shape") corrected with it.

Related

objectui#8253 (closed by #8828) · objectui#4592 (the rename blind spot) · #7559 / #7483 (the views.map((v: any) => …) residual the pin clause hits) · the @objectstack/spec 17.4.0 bump, which is where this turns into a parse-time refusal.


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 lanepriority:p2

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions