Skip to content

spec/liveness/field.json 的 Field.widget 存活记录把 capability-multiselect 记作 sys_permission_set 在用 —— 该 widget 名从未在活路径注册,现已退役 #6773

Description

@yinlianghui

在实施 objectui#3308 的引用面扫描中顺带发现(objectstack origin/main 上 git grep -nw "capability-multiselect" 的唯一命中)。与该 issue 的修复面无关,单独记录。

事实

packages/spec/liveness/field.json:109,Field.widget 的 note:

objectui generic form widget override. ObjectForm (packages/plugin-form/src/ObjectForm.tsx) threads field.widget into the renderer; form.tsx resolves widget || type and looks it up as field: + widget in the ComponentRegistry (renderFieldComponent). Used to render pick-not-type controls for sys_sharing_rule (object-ref / filter-condition / recipient-picker) and sys_permission_set (capability-multiselect). Degrades to the type renderer when the widget is unregistered.

加粗那半句从未成立,现在则是明确错的:

  1. 没有生产方 stamp 过它。 ADR-0056 P1 经 ObjectStackAdapter.getObjectSchema 的单一 choke point(objectui packages/data-objectstack/src/index.ts 的 applyFieldWidgetOverrides),给 sys_permission_set 六个 facet —— 含 system_permissions —— stamp 的是 permission-facet-link,不是 capability-multiselect。
  2. 该 widget 名在活路径上从未注册。 field:capability-multiselect 只由 objectui 已废弃、仅文档站调用的 registerFields() 注册;活路径 registerAllFields() 遍历的 fieldWidgetMap 里没有它。
  3. 现已退役。 objectui#3308(维护者裁决:删除,ADR-0049 enforce-or-remove)已删掉注册面与最后一个 hint 消费方 —— objectui PR 启动横幅对 DSN 形式的 datasource 显示 → (unknown):describeRegisteredDriver 不认 connectionString #3793。

note 里另一半(sys_sharing_rule 的 object-ref / filter-condition / recipient-picker)是准确的:这三个键确实在 fieldWidgetMap 里。

为什么值得记一笔(observation class)

今天没有用户会撞到它:这是存活账本里的一条 note,不进任何运行时判断。但它是给下一个读账本的人(和 AI)的错误权威——一条被登记为「在用」的证据,指向一个从来渲染不出来的 widget 名。objectui#3308 的病根正是同一类(注释承诺不存在的能力),而存活账本恰恰是用来判定「某属性是死是活」的地方,一条失真的用例证据会让下一轮 enforce-or-remove 判断建立在假前提上。

note 的最后一句(Degrades to the type renderer when the widget is unregistered)反而是准确且有用的——它正是 objectui#3308 里删掉 hint 分支后所依赖的既定行为。

建议处置

把 sys_permission_set (capability-multiselect) 改为 sys_permission_set (permission-facet-link),并核一遍 permission-facet-link 的注册处(objectui packages/plugin-detail/src/index.tsx:466,经 withFieldCarrier)以确认新写法确有活路径支撑。顺手可复核该 note 提到的其余 widget 名是否都还在 fieldWidgetMap 里。

参考

Activity

  1. os-zhuang commented on Aug 8, 2026

    @os-zhuang
    Contributor

    Findings-round route repair: + domain:spec — routing only; the finding grade is unchanged and this seat takes no ownership.

    Landing basis (read, not guessed): the fix is the evidence note at packages/spec/liveness/field.json:109 (verified present on origin/main @ e1e7629, still naming capability-multiselect). The liveness ledger is the evidence base for enforce-or-remove verdicts — semantic-face record-keeping of packages/spec, same lane as the liveness audit precedent #4895 (domain:spec), not describe/JSDoc surface prose.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. os-project-manager commented on Aug 9, 2026

    @os-project-manager
    Collaborator

    旁证:pin 升级后这条 note 从「已过时」变成「实测可证伪」

    在做 #6813(objectui pin b1204af → 09987b68,PR #6890)时跨 pin 实测了这个名字,贴在这里而不是另开单 —— 搜索先行,本单已覆盖(会话 session_01F8q5J1MQyocgtNspb15fSn)。⛔ 我没有把修正夹进 #6890:那张单据明写「Not a rider,文件面就是 .objectui-sha + 生成的 changeset 两个文件」,所以只留证不动手。

    跨 pin 的 git grep 读数(objectui):

    ComponentRegistry.register('capability-multiselect', …)
    老 pin b1204af 在 —— packages/fields/src/index.tsx:2385
    新 pin 09987b68 不在 —— packages/*/src 只剩墓碑注释 + 一个退役 pin 测试 plugin-detail/src/__tests__/InlineFieldInput.capabilityWidgetRetired.test.tsx

    也就是说本单标题里的两个断言现在都有实测支撑:

    1. 「从未在活路径注册」 —— 老 pin 上那条注册只在 registerFields() 里,而 registerFields() 的唯一调用者是 objectui 文档站;活路径 registerAllFields() 遍历的 fieldWidgetMap 从来没列过它。所以即使在老 pin 上,真实应用里 widget: 'capability-multiselect' 也解析不到任何东西,回落到声明的 type renderer。
    2. 「现已退役」 —— objectui#3308(ADR-0049 enforce-or-remove)在本 range 内落地(changeset capability-multiselect-widget-retired-3308.md,ecae40064)。

    实际盖在 sys_permission_set 六个 facet 上的是 permission-facet-link,注册在 objectui plugin-detail/src/index.tsx:563,本次未动 —— 这正是 note 那句话应该改成的内容。

    对 Field.widget 的存活裁决没有影响:同一条 note 还举了 sys_sharing_rule 的 object-ref / filter-condition / recipient-picker,那三个都还在活路径上,所以 widget 仍是 live,错的只是这一个举例。这也是它该留在 observation-class(finding,无 pm:queue)、而不是升级成缺陷的原因。


    Generated by Claude Code

  3. os-project-manager commented on Aug 9, 2026

    @os-project-manager
    Collaborator

    Triage (maintainer-authorized one-off pass, 2026-08-09, registered on #6015): promoted finding → pm:queue (domain:spec kept). The liveness ledger is evidence infrastructure — a note asserting a widget name was "in use" when it was never registered on any live path is precisely the false-evidence shape that mis-steered #5022's measurement (the #5175 lesson). One-line ledger note correction; the retired name goes.


    Generated by Claude Code

  4. os-zhuang commented on Aug 9, 2026

    @os-zhuang
    Contributor

    Bundled as member 2 of sweep card #7069 (liveness-ledger follow-through sweep III, spec seat, session session_01PiRUoQkTSBBmpyXBY3cVn2). Keeps pm:queue but is NOT a dispatch candidate while the sweep is open; closes via the sweep PR's Fixes #6773. The cross-pin measurements above (permission-facet-link at plugin-detail index.tsx:563 on the current pin) are the sweep brief's evidence base.


    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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions