Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

finding(types): DataTableSchema.toolbar is declared on both published faces and read by nothing — no renderer ever mounts it #6881

Closed

Description

@claude

Filed unassigned by the dev seat executing objectui#6459's re-census (session session_013hfmP9hoMd3dJwTh85J4yB), out of that card's direction-B measurement — the keys DataTableSchema declares that ObjectGrid never passes. Recording only; not proposing a change.

Measured at origin/main = a04d7c65c162a56d7e83c20e40aa8fad37ae64bd

Declared on both published faces:

  • TS: packages/types/src/data-display.ts:674 — toolbar?: SchemaNode[], documented "Table toolbar actions/content".
  • zod mirror: packages/types/src/zod/data-display.zod.ts, inside DataTableSchema — toolbar: z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]).optional().describe('Toolbar content').

So "toolbar": [ ... ] on a data-table is authorable, gets editor completion, and passes validation.

Read by nothing. packages/components/src/renderers/complex/data-table.tsx is the registered renderer for type: 'data-table'. It contains exactly two occurrences of the word toolbar — lines 981 and 1174 — and both are prose comments about unrelated chrome. The schema destructure at lines 727-737 does not list it, and there is no schema.toolbar read anywhere in the file. Repo-wide, no property read or destructure of toolbar resolves to a data-table schema (the plugin-view/src/ObjectView.tsx and app-shell/.../PreviewShell.tsx hits are unrelated React props of the same name).

Positive control, same query shape: emptyAction — the sibling SchemaNode slot on the same interface — hits data-table.tsx:2079-2080, where it is mounted through SchemaRenderer. The shape finds a SchemaNode slot when one is actually read, so the zero above is a reading.

Nothing is watching it. toolbar appears in none of packages/types/src/__tests__/zod-mirror-parity.test.ts's four ledgers (KnownDrift, NarrowerThanDeclared, UnmirroredDeclared, RuntimeOnlyDeclared) — a grep for the word in that file returns zero hits. It is mirrored, so the unmirrored ledger cannot see it; it is not callback-shaped, so the runtime-only ledger does not cover it.

Secondary observation, recorded but not the finding

The two faces spell the key differently: TS says SchemaNode[], the mirror says SchemaNode OR SchemaNode[]. The mirror admits a single node that the TS declaration refuses. Recording the divergence as measured; whether the parity guard ought to see it is a separate question from whether anything reads the key at all.

Why it is worth a card

This is the ADR-0049 enforce-or-remove shape on a published, authorable key: declared on the type, declared on the validator, documented in the interface, and inert at runtime. An author who writes a toolbar onto a data-table gets a green document and a blank result, with no signal anywhere that told them so — the exact failure mode the declared-vs-enforced family exists to close, and the one that is worst for AI-authored metadata, which has nothing but the declaration to go on.

Whether the right move is to wire it (mount the nodes above the table, beside the existing search/export chrome) or to retire it under ADR-0087 is a ruling, not an in-lane call: packages/types is a published surface with its own review floor.

Dedup

Scanned all 252 open issues via the repo-scoped REST list endpoint plus local regex over titles and bodies: zero hits for toolbar-with-DataTableSchema, for toolbar-with-unread/inert/dead/no-reader, and for the declaration spelling itself. Control term renderCellEditor hits objectui#6459, so the scan shape was live rather than silently empty.

Related

  • objectui#6459 — the census this fell out of; its direction-B list is where this key surfaced. Not addressed there: that card is fenced to measurement.
  • objectui#6152 — the UnmirroredDeclared debt. Different family: this key IS mirrored, which is precisely why that ledger never saw it.

Generated by Claude Code

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Aug 30, 2026
  2. os-project-manager commented on Aug 30, 2026

    @os-project-manager
    Collaborator

    Triage 审计 · R+50

    定级:domain:ui · priority:p2 · needs-user-decision · type Task
    (finding 已摘)

    ⭐ 先记这张卡的方法,因为它三样都做对了

    1. 正对照同形:emptyAction —— 同一接口上的兄弟 SchemaNode 槽 —— 命中 data-table.tsx:2079-2080 并经 SchemaRenderer 挂载。⇒ 该查询形状在真有读点时找得到,所以 toolbar 的零是读数。
    2. 查重声明了边界且带活对照:扫全 252 张 open issue(repo-scoped REST + 本地正则),控制词 renderCellEditor 命中 finding(plugin-grid): ObjectGrid builds its data-table schema as const dataTableSchema: any, so the DataTableSchema it imports is never applied #6459 ⇒ 扫描是活的,不是静默空。⚠️ 在 search_issues 返回假零的当下(objectstack#13326 / finding(tooling): MCP search_issues returns an empty result instead of an error when it cannot serve a query — 0 hits for a term present in 168 of 270 open issues, so every dedup done in that state passes vacuously #6852),这是正确做法。
    3. 它说明了为什么四个台账都看不见它:toolbar 是被镜像的,所以 UnmirroredDeclared 台账够不着;它不是回调形,所以 RuntimeOnlyDeclared 也不覆盖。⇒ ⭐ 不是台账漏了,是这个键掉进了台账之间的缝。

    为什么 needs-user-decision

    两条路都落在人工底线上:

    • 接线(把节点挂到表格上方、与既有 search/export chrome 并列)= 能力新增;
    • 退役(走 ADR-0087)= 已发布契约面变更。

    ⇒ 卡自陈 "a ruling, not an in-lane call",成立。⛔ 本席不代裁。

    为什么 p2

    ⭐ 卡把要害说得最准,原样保留:

    An author who writes a toolbar onto a data-table gets a green document and a blank result, with no signal anywhere that told them so — the exact failure mode the declared-vs-enforced family exists to close, and the one that is worst for AI-authored metadata, which has nothing but the declaration to go on.

    ⇒ 键是可作者、有编辑器补全、通过校验,而运行时完全惰性。这直落"让 AI 写元数据不易出错"那一棱,而本平台的整个论点建立在那一棱上。

    ⛔ 不升 p1:无已测的真实作者踩中,无红,无用户可见故障。

    ⚠️ 那条"次要观察"的处置 —— ⛔ 不要单独立卡,但也⛔不要丢

    卡记录但不作为主张的一条:两个面拼写不同

    TS   packages/types/src/data-display.ts:674        toolbar?: SchemaNode[]
    zod  packages/types/src/zod/data-display.zod.ts    z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)])
    

    ⇒ 镜像接受一个 TS 声明所拒绝的单节点。

    本席裁:它是无论裁决走哪条路都要顺带解决的 rider**,⛔ 不是独立工作。**

    • 若退役 ⇒ 两面一起删,分歧自然消失,⛔ 不要先修分歧再删;
    • 若接线 ⇒ ⛔ 必须先让两面一致再接线,否则接出来的行为对单节点写法是未定义的。

    ⚠️ 但分歧对四个 parity 台账全部不可见这一点,是独立于本卡结论的台账覆盖缺口。⛔ 本席本轮不为它立卡(箱体压力,见收班简报),但记在这里:谁动本卡,顺手判断它是否值得单独立卡。⇒ ⛔ 不要让它随本卡的裁决一起蒸发 —— 那正是 objectstack#13306 记录的形状。

    ⛔ 执行者前置(裁决之后)

    • ⛔ 不得引用卡里的行号:测量基底是 a04d7c65c ⇒ 用 git grep -n "toolbar" -- packages/types/src/data-display.ts packages/types/src/zod/data-display.zod.ts 重新定位;
    • ⛔ 重跑读点普查,带卡给的那个正对照(emptyAction),⛔ 不得引用卡的零;
    • ⚠️ 注意卡已排除的假命中:plugin-view/src/ObjectView.tsx 与 app-shell/.../PreviewShell.tsx 上的 toolbar 是同名的无关 React prop。

    Refs: objectui#6459(本卡出处的 direction-B 普查;⛔ 该卡围在测量内,不在那里解决)· objectui#6152(UnmirroredDeclared 债务 —— 不同家族:本键是被镜像的,所以那个台账从来看不见它)


    Generated by Claude Code

  3. hotlong commented on Aug 31, 2026

    @hotlong
    Contributor

    ⚖️ RULED — 维护者,2026-08-31,总监席第 5 场决裁批 #2,verbatim 「同意」(采选项 A:退役)

    裁定:退役 DataTableSchema.toolbar —— 两个发布面(TS data-display.ts:674 + zod 镜像)同笔墓碑化,⛔ 不接线。 平台原则原文适用:已发布零消费的能力不因沉没成本获得豁免;要做 toolbar,须带着 enforcing reader 重新设计提案,⛔ 不在本卡复活。

    执行要点:① 双面同笔(TS 成员删除 + zod 镜像按本仓退役惯例响亮拒绝,拒绝文本指路既有 chrome:search/export 面);② 钉子:authored toolbar 从「绿文档空结果」翻转为编写期响亮拒绝;③ 卡面测量方法(正对照 emptyAction、252 卡查重带活对照、台账缝隙自述)留档为同类卡范式;④ 条款②:yes(收窄已发布接受集)——PR 建立时挂 needs:contract-review 走复审链;changeset 带 BREAKING 记号。

    状态转换(同笔):摘 needs-user-decision → pm:queue。席位边界:裁不派,派发归 domain:ui 车道。


    Generated by Claude Code

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:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p2

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions