发现于 #5073 的实施(promote `userFilters.allowAddTab` 进 spec 契约)。**不阻塞 #5073**,那条的裁定与落地都成立;这是落地时实测到的、渲染器一侧的独立缺口。 ## 事实(实测,非阅读推断) `objectui/packages/plugin-list/src/UserFilters.tsx` 的 `TabFilters`:同一个 `return` 里,**预设 tab 按钮有 `onClick`,新增 tab 按钮没有**。 预设 tab(`:727` 起): ```tsx < button key={tabId} data-testid={`filter-tab-${tabId}`} onClick={() => handleTabChange(tabId)} … > {tab.label} < /button > ``` `allowAddTab` 渲染的那个(`:742` 起): ```tsx {allowAddTab && ( < button className="… hover:text-foreground hover:bg-muted shrink-0" data-testid="filter-tab-add" title="Add filter tab" > < Plus className="h-3.5 w-3.5" / > < /button > )} ``` 没有 `onClick`,组件里也没有任何 `onAddTab` / `addTab` 入参或回调(全仓 grep `filter-tab-add` / `onAddTab` 只命中这两行)。它带 hover 态和 `title="Add filter tab"`,**看起来完全可点**,点下去什么都不发生。 注意别与 `app-shell/src/views/metadata-admin/widgets.tsx:1431` 的 `addTab` 混淆 —— 那是 Studio **编辑期**的 tabs 编辑器(`data-testid="filter-mode-add-tab"`),与运行期渲染器的这个按钮无关。 ## 为什么现在值得立案 #5073 把 `allowAddTab` 提升进了 `packages/spec` 的 `UserFiltersSchema`,它因此进了 JSON Schema、Studio SchemaForm 和参考文档 —— **能力从此可被发现**,AI 作者会照着 schema 写它。 那条 PR 的 `.describe()` 已经刻意收窄到只承诺渲染入口: > Render an "add tab" affordance after the presets (tabs element). Page lists only — object views use `listViews` for named presets 这是按 PD#10 写的(不宣传运行时不交付的能力),所以契约本身没有说谎。但作者写 `allowAddTab: true` 的**意图**显然是「让终端用户能加 tab」,而交付的是一个死按钮 —— 一个可见、可 hover、有 tooltip 却无行为的控件,比没有这个按钮更糟:它把「没实现」伪装成「点了没反应的 bug」。 ## 需要裁定的是方向,不是补丁 - **A. 实现它** —— 给按钮接上回调,新增的 tab 是**会话级**的(与 `userFilters` 的既有语义一致:ADR-0047 说 end-user 的筛选选择 session-scoped、从不落成元数据),还是要写回 `sys_metadata`?后者会把渲染器变成元数据写入方,牵扯权限与 ADR-0047 的作用域承诺,不能顺手做。 - **B. 移除按钮**,并在 #5073 刚落地的 spec 声明上做对应处理(tombstone / 收窄 describe / 退役该键)—— 但该键在存量配置里是被写过的,退役要走 spec-property-retirement 那套。 两个方向都动到已发布契约,所以**立案不猜**,按 #5022 之后的规矩交给维护者。 ## 参考 - spec 侧声明:`packages/spec/src/ui/view.zod.ts` `UserFiltersSchema.allowAddTab`(#5073) - 渲染器:`objectui/packages/plugin-list/src/UserFilters.tsx:669`(prop)、`:182`(传入)、`:742`(渲染)
Activity
docs(spec): name the renderer-gap issue (#5236) in the JSDoc and ledg…
os-zhuang commentedon Aug 4, 2026
[决策]
allowAddTab死按钮往哪个方向收敛 —— 两轴分析与建议分诊升级(会话
session_01FTszibd6C8sUCCZnM4VcrL,v17 C 组工作集)。本单正文明示「立案不猜」,且两个方向都动已发布契约,过升级门槛,挂needs-user-decision。背景:#5073 裁决 A(2026-08-04 03:02Z)已把
allowAddTabpromote 进UserFiltersSchema并随 PR #5237 当日合入;.describe()当时刻意收窄为「仅承诺渲染入口」,因为按钮实测无 onClick。现状:objectui/packages/plugin-list/src/UserFilters.tsx(~:742)渲染的「新增 tab」按钮带 hover 态与 title,点击无任何反应,组件无onAddTab回调入参。作者写allowAddTab: true的意图显然是「用户能加 tab」,交付的是死按钮 —— 比没有按钮更糟(把「未实现」伪装成「点了没反应的 bug」)。可选方案:
sys_metadata—— 与 ADR-0047「end-user 筛选选择 session-scoped、从不落成元数据」一致。sys_metadata。牵动权限面(谁可写视图元数据)并打破 ADR-0047 的作用域承诺,涉及面远超本单。spec-property-retirement全流程。两轴分析:
userFilters.allowAddTab是 objectui 真读、spec 从未声明的活能力 —— promote 还是 reject?(挡住 #4001 批 18 的 UserFiltersSchema 收紧) #5073 裁决的另一半 —— promote 时的 describe 收窄本就是权宜,不是终态。B 是对一天前维护者裁决 A 的回摆,还要为一个存量配置已在写的键走完整退役流程,以「正确的拒绝」引导作者删掉在用能力 ——userFilters.allowAddTab是 objectui 真读、spec 从未声明的活能力 —— promote 还是 reject?(挡住 #4001 批 18 的 UserFiltersSchema 收紧) #5073 裁决原文已明确否定过这个形态。A2 打开元数据写入面,不是本单该背的范围。建议:A1。落地要点:TabFilters 接
handleAddTab(命名输入 + 快照当前筛选为新 tab,会话级);describe 升级;objectui 侧修复须赶在终版 console pin bump 之前合并。若裁 B:spec 退役半边按跨车道协议转 spec 车道,objectui 半边本会话执行。关联:#5073(裁决 A)、PR #5237、ADR-0047、objectui
UserFilters.tsx:742。已退出本轮派发队列,待裁决。Generated by Claude Code
xuyushun441-sys commentedon Aug 6, 2026
维护者裁决(2026-08-06,经 PM 会话
session_01MN3ao9kJEtD7PNAKwFVp96转达):A1 —— 实现,会话级。TabFilters接上新增 tab 回调:命名输入 + 快照当前筛选为新 tab,会话级(组件态/会话存储),⛔ 不落sys_metadata—— 与 ADR-0047「end-user 筛选选择 session-scoped、从不落成元数据」一致。UserFiltersSchema.allowAddTab的.describe()同步从「仅承诺渲染入口」升回真实语义 —— 该半边触packages/spec,按跨座位协议归 spec 车道;若与 objectui 半边拆单,objectui 半边可先行(渲染器不依赖 describe 文案)。target:v17时间窗:objectui 侧修复须赶在终版 console pin bump 之前合入。摘
needs-user-decision,回pm:queue,由 objectui 座位按正常批次派发。Generated by Claude Code
feat(spec)!: promote `userFilters.allowAddTab`,随后收紧 UserFiltersSchema (…
yinlianghui commentedon Aug 9, 2026
🔒 认领(objectui 分片 PM,session
session_01GTRjn8xBqp75dk7kFupVRt,v17 批次)claude/issue-os5236-addtab-session(objectui 仓)TabFilters接上新增 tab 回调 —— 命名输入 + 快照当前筛选为新 tab,会话级(组件态/会话存储),⛔ 不落sys_metadata(ADR-0047)。.describe()升级半边归 spec 车道,objectui 半边先行(裁决已确认渲染器不依赖 describe 文案);验收时由 PM 向 spec 车道立联动单。packages/plugin-list/src/UserFilters.tsx+ 测试。Generated by Claude Code