Skip to content

[#18682 v1 切出] UI 谓词三缝(visibleWhen / readonlyWhen / requiredWhen)在关联字段不可读时 fail-open —— 父卡裁定的「不可读即响亮报错、⛔ 绝不静默为真」在这三缝上今天做不到 #19727

Description

@os-justin

本卡承 #18682 v1 切出的那一半:visibleWhen / readonlyWhen / requiredWhen 三条 UI 谓词缝。父卡 #18682 留的是 checkPredicate(校验规则)那一条缝 —— 它是四缝里唯一 fail-closed、因而唯一今天就能兑现父卡权限语义的一条。

Path: P3 | 那条路第 3 步「验证响亮拒绝错的、放行对的」 | UI 谓词三缝遇到不可读的关联字段时静默放行

出处:一次实测,⛔ 不是推断

domain:spec seat 5(座位贴 #19357)在 #18682 的施工轮上派出的测量,读于 origin/main = fb7b74691f7d192430f6b3b457a858dc442ad0e0。施工轮报告见 #18682 评论 5775939494,本席的裁决见 5776007340(Q2 = A:v1 只做一条缝,三缝切到本卡)。

缺陷

#18682 的卡面(维护者裁决 batch #148 item 1 letter B)写明权限语义:

关联字段在执行用户自己的读权限下读取;一个用户读不到的字段求值为缺失 → 谓词响亮报错,⛔ 绝不静默为真。

实测:四条缝里只有一条做得到。

缝 遇到 No such key 这类故障时
checkPredicate(rule-validator.ts:2713) fail-closed —— 返回 unevaluableRuleError,拒绝写入(#4649)
evaluateOptionVisibility(rule-validator.ts:2150) fail-open —— logger?.warn 之后 continue; // fail-open

⇒ 在 visibleWhen / readonlyWhen / requiredWhen 上,一个不可读的关联字段产出的正是父卡明文禁止的那种静默不执行。文件自己的 docblock 把代价写得很直白:一条 fail-open 的 requiredWhen「ACCEPTS a record that should have been rejected」。

⚠️ 本卡的第一件事多半是一次裁定,⛔ 不是一次施工

把这三缝翻成 fail-closed 会反转三条有意为之的裁决:#4889 · #4953 · #6457。按规矩这要它自己的 ADR 或一次修订,并且会改变已存储谓词今天的判决。⇒ 接手的人第一步是把这件事摆进决策通道,⛔ 不是直接动刀。

三条路,⛔ 本卡不选、不排序:

  1. 翻成 fail-closed(仅限这一故障类) —— 只对「关联字段不可读」这一类故障 fail-closed,其余保持原样。⚠️ 未量:这一类能不能与其它故障类干净地分开。
  2. 保持 fail-open,把权限保证的范围写明 —— 诚实且最小,但要改的那句话在维护者裁决正文里,⇒ 归维护者。
  3. 三缝各自分开裁 —— requiredWhen 的代价(放行本该拒的记录)与 visibleWhen 的代价(多显示一个控件)不同量级,未必该同一个答案。⚠️ 未量:分开处理的实现代价。

⛔ 本卡不主张的事

  • ⛔ 不主张动 checkPredicate —— 它已经是 fail-closed,且是父卡 v1 的落点。
  • ⛔ 不主张在父卡里顺手做掉本卡 —— 父卡 v1 已按本席裁决明确排除这三缝。

查重词

visibleWhen fail-open unreadable field · evaluateOptionVisibility continue fail-open · requiredWhen accepts a record that should have been rejected · UI predicate permission guarantee · relationship traversal UI seams

出处链

#18682(父卡,v1 保留 checkPredicate 一缝)· #4649(checkPredicate 的 fail-closed)· #4889 · #4953 · #6457(三缝 fail-open 的既有裁决)· #18318 / 裁决 5716041368


Generated by Claude Code

Activity

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions