Skip to content

[Decision] Declare renderCellEditor and schema-level cellClassName on DataTableSchema? — the two live undeclared keys the #6459 census measured #6882

Description

@os-sam

Filed by the domain:ui execution seat (PM session session_013hfmP9hoMd3dJwTh85J4yB, R28), executing the 2026-08-29 ruling's own closing clause on #6459:

Any contract gap the census reveals that needs a @object-ui/types decision (a key data-table really reads but DataTableSchema doesn't declare, or vice versa) comes back to the decision inbox as its own small card rather than being decided in-lane — the #6424 family precedent.

⛔ This seat is not deciding it. packages/types is a published surface, this widens the accept set, so it is clause-② and the human floor.

The measurement (#6459 census, on main a04d7c65, AST pass)

Writers pass 47 distinct schema-level keys into dataTableSchema; DataTableSchema declares 73 named members over its chain, excluding the [key: string]: any at base.ts:382. The difference in the "passed but not declared" direction is exactly two, both with live readers:

key live reader consequence of staying undeclared
renderCellEditor data-table.tsx, called through its own (schema as any) cast to hand cell editing to the returned widget cell editing falls back to the built-in text/number/date inputs
schema-level cellClassName data-table.tsx, destructured and folded into every body cell's className the grid's row-density styling never reaches the cells

both are in-use capabilities that are simply not declared. Not speculative keys.

⚠️ Two corrections to the 2026-08-29 ruling's own text, forced by this census:

  • its step-1 suspect list is stale: four of the five keys it named — borderless (:657), disableInnerScroll (:666), selectionResetKey (:905), singleClickEdit (:921) — are declared today, leaving only renderCellEditor;
  • and it never named schema-level cellClassName, which the census adds.

⭐ Stability check, so this is not a snapshot: the same instrument re-run at PR #6637's merge commit f241a4df gives a byte-identical direction-A set (keys 47→47, declared 72→73, the sole addition being bind from #6574). The set has not moved.

Options

what cost
A Declare both keys on DataTableSchema + document them; data-table.tsx's (schema as any) cast at :2269 can then be dropped widens a published type face ⇒ clause-②, contract-review tier; one types change + docs
B Keep the seam-level hold introduced by PR #6637 — the two keys stay as ObjectGridDataTableSchemaHolds inside plugin-grid zero cost, but a published renderer keeps reading undeclared keys through a cast, and authors get no completion or checking for either key

四维分析

① 实际业务需求。 两个键今天都在生产路径上被读,且各自缺失都有可感知后果:renderCellEditor 缺失 ⇒ 单元格编辑退回内置输入;cellClassName 缺失 ⇒ 行高密度样式到不了单元格。⇒ A 不是新增能力,是把既有行为说成真话⚠️ 置信缺口如实标注:仓内读者已实测,外部作者面未测 —— 不知道外部作者今天是否已在写这两个键;若已在写,他们正在无声地依赖未声明面。

② 项目长远合理性。 declared ≠ enforced 正是本仓反复在关的那一类,而 B 让它继续存在于已发布渲染器上 —— 全仓最不该留这种债的位置。而且那个 (schema as any) cast 本身就是 A 的直接收益:它存在的唯一理由就是这两个键没被声明。

③ 防 AI 写错(最吃重)。 B 之下,AI 写这两个键得不到任何信号 —— 拼错即静默失效,而 (schema as any) cast 正是把错误藏起来的那道门。A 让作者在编写期得到检查。⇒ 强烈指向 A。

④ 创业阶段不扩散。 A 不扩散需求(能力已存在、已在跑),成本是一次声明 + 文档;B 零成本,但把债留在发布面上。

四棱读数

指向
实际业务需求 A(既有行为,非新增)
项目长远合理性 A(关掉发布面上的 declared≠enforced)
防 AI 写错 A(编写期检查 vs 静默失效)
创业阶段不扩散 A(不扩散,成本为一次声明)

四棱同向指向 A。但这不进代裁通道 —— 它落在人工地板(已发布类型面 + clause-② 加宽接受集),置信门第②条不成立。四棱同向只说明方向清楚,不构成放行。

裁后执行(你不用管)

  • A ⇒ 立 pm:queue 工卡:在 DataTableSchema 上声明两键 + 文档 + 撤 data-table.tsx:2269 的 cast;标 Clause-②,派发档位取 CONTRACT_REVIEW_TIER
  • B ⇒ 本卡关 completed(现状即裁定),并在 plugin-grid 的 seam 注释里记明这是被裁定保留的形态。

Dedupe

Repo-scoped REST listing of 253 open issues plus local grep. Zero hits for a cellClassName declaration card; control renderCellEditor hit (#6459 and #6881) in the same read, so the zero is a measurement. Nearest neighbour #6881 checked and not a duplicate — that is the opposite direction (toolbar declared and unread).

Refs: #6459 (the census) · PR #6637 (the typing half, merged) · #6424 (the family precedent the ruling names) · #6881

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions