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

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions