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
Filed by the
domain:uiexecution seat (PM sessionsession_013hfmP9hoMd3dJwTh85J4yB, R28), executing the 2026-08-29 ruling's own closing clause on #6459:⛔ This seat is not deciding it.
packages/typesis a published surface, this widens the accept set, so it is clause-② and the human floor.The measurement (#6459 census, on
maina04d7c65, AST pass)Writers pass 47 distinct schema-level keys into
dataTableSchema;DataTableSchemadeclares 73 named members over its chain, excluding the[key: string]: anyatbase.ts:382. The difference in the "passed but not declared" direction is exactly two, both with live readers:renderCellEditordata-table.tsx, called through its own(schema as any)cast to hand cell editing to the returned widgetcellClassNamedata-table.tsx, destructured and folded into every body cell'sclassName⇒ both are in-use capabilities that are simply not declared. Not speculative keys.
borderless(:657),disableInnerScroll(:666),selectionResetKey(:905),singleClickEdit(:921) — are declared today, leaving onlyrenderCellEditor;cellClassName, which the census adds.⭐ Stability check, so this is not a snapshot: the same instrument re-run at PR #6637's merge commit
f241a4dfgives a byte-identical direction-A set (keys47→47, declared72→73, the sole addition beingbindfrom #6574). The set has not moved.Options
DataTableSchema+ document them;data-table.tsx's(schema as any)cast at:2269can then be droppedObjectGridDataTableSchemaHoldsinsideplugin-grid四维分析
① 实际业务需求。 两个键今天都在生产路径上被读,且各自缺失都有可感知后果:⚠️ 置信缺口如实标注:仓内读者已实测,外部作者面未测 —— 不知道外部作者今天是否已在写这两个键;若已在写,他们正在无声地依赖未声明面。
renderCellEditor缺失 ⇒ 单元格编辑退回内置输入;cellClassName缺失 ⇒ 行高密度样式到不了单元格。⇒ A 不是新增能力,是把既有行为说成真话。② 项目长远合理性。 declared ≠ enforced 正是本仓反复在关的那一类,而 B 让它继续存在于已发布渲染器上 —— 全仓最不该留这种债的位置。而且那个
(schema as any)cast 本身就是 A 的直接收益:它存在的唯一理由就是这两个键没被声明。③ 防 AI 写错(最吃重)。 B 之下,AI 写这两个键得不到任何信号 —— 拼错即静默失效,而
(schema as any)cast 正是把错误藏起来的那道门。A 让作者在编写期得到检查。⇒ 强烈指向 A。④ 创业阶段不扩散。 A 不扩散需求(能力已存在、已在跑),成本是一次声明 + 文档;B 零成本,但把债留在发布面上。
四棱读数
⇒ 四棱同向指向 A。 ⛔ 但这不进代裁通道 —— 它落在人工地板(已发布类型面 + clause-② 加宽接受集),置信门第②条不成立。四棱同向只说明方向清楚,不构成放行。
裁后执行(你不用管)
pm:queue工卡:在DataTableSchema上声明两键 + 文档 + 撤data-table.tsx:2269的 cast;标 Clause-②,派发档位取CONTRACT_REVIEW_TIER。plugin-grid的 seam 注释里记明这是被裁定保留的形态。Dedupe
Repo-scoped REST listing of 253 open issues plus local grep. Zero hits for a
cellClassNamedeclaration card; controlrenderCellEditorhit (#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 (toolbardeclared and unread).Refs: #6459 (the census) · PR #6637 (the typing half, merged) · #6424 (the family precedent the ruling names) · #6881