本卡承 #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 或一次修订,并且会改变已存储谓词今天的判决。⇒ 接手的人第一步是把这件事摆进决策通道,⛔ 不是直接动刀。
三条路,⛔ 本卡不选、不排序:
- 翻成 fail-closed(仅限这一故障类) —— 只对「关联字段不可读」这一类故障 fail-closed,其余保持原样。⚠️ 未量:这一类能不能与其它故障类干净地分开。
- 保持 fail-open,把权限保证的范围写明 —— 诚实且最小,但要改的那句话在维护者裁决正文里,⇒ 归维护者。
- 三缝各自分开裁 ——
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
本卡承 #18682 v1 切出的那一半:
visibleWhen/readonlyWhen/requiredWhen三条 UI 谓词缝。父卡 #18682 留的是checkPredicate(校验规则)那一条缝 —— 它是四缝里唯一 fail-closed、因而唯一今天就能兑现父卡权限语义的一条。Path: P3 | 那条路第 3 步「验证响亮拒绝错的、放行对的」 | UI 谓词三缝遇到不可读的关联字段时静默放行
出处:一次实测,⛔ 不是推断
domain:specseat 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)unevaluableRuleError,拒绝写入(#4649)evaluateOptionVisibility(rule-validator.ts:2150)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 或一次修订,并且会改变已存储谓词今天的判决。⇒ 接手的人第一步是把这件事摆进决策通道,⛔ 不是直接动刀。
三条路,⛔ 本卡不选、不排序:
requiredWhen的代价(放行本该拒的记录)与visibleWhen的代价(多显示一个控件)不同量级,未必该同一个答案。⛔ 本卡不主张的事
checkPredicate—— 它已经是 fail-closed,且是父卡 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 / 裁决 5716041368Generated by Claude Code