Filed unassigned from #6128 / PR #6248。本单只记录发现,不含修法承诺。
事实
validate-expressions.ts(ADR-0032)对每个它遍历到的谓词都跑 validateExpression,语法错误报 blocking error。但它的遍历面是 objects / flows / actions / sharingRules / hooks,从不走 views 与 pages。
走这个面的只有 validate-visibility-predicates.ts(ADR-0089 D3b + #6128 新增的裸标识符闸),而这三条规则都不判语法:PR #6248 的新规则明确在 parseCelToAst 返回 null 时保持沉默,理由是「不发明第二个语法判定」——与 validate-null-guards.ts 同一条政策。那条政策在它自己的调用点上是成立的,因为 validateExpression 就在同一批调用点上跑;在 view/page 面上它不成立:那里根本没有第二个判定,沉默就是没人报。
后果与 #5149 同型:语法不通过的谓词求值失败 → evalFieldPredicate 返回 fallback → 可见性的 fallback 是 true → 元素无条件渲染,与「没写谓词」在屏幕上一模一样。#5149 已落地的运行时 warn-once(objectui#3541)现在会把它喊出来,但那是运行时;构建期依然放行。
现成的样本形状
packages/spec/src/ui/view.test.ts:1126 / :1240 / :1245 / :1291 / :1373 的 fixture 就写着 'country === "USA"' / 'billing_country === "USA"' —— === 不是 CEL。这些是 schema 测试的 fixture(不是发货内容,schema 也不判表达式值),但它们正说明这个写法是作者会写出来的。
决定点(不是实现细节)
view/page 谓词的语法要不要判、判成 error 还是 warning,是一个「作者被允许写什么」的产品判断,不是接线缺口:
- 判 error:与其它面(validation rule / flow / action)一致 —— 那些面上语法错就是 blocking。坏谓词发不出去。
- 判 warning:爆炸半径更小,但这一族的教训恰恰是「静默不可以」,而 warning 在 CI 里通常也不拦。
- 不判:那就得写下来为什么这个面例外。
若采纳,落点就在 validate-visibility-predicates.ts 已有的 parseCelToAst 返回 null 那个分支上 —— 一处判断,配一条自纠措辞的消息。PR #6248 已在该分支写下这条缺口的注释,便于接手者定位。
Refs:#6128 / PR #6248(发现处)、#5149(同族的 fail-open 静默)、ADR-0032(其它面的语法判定)。
Filed unassigned from #6128 / PR #6248。本单只记录发现,不含修法承诺。
事实
validate-expressions.ts(ADR-0032)对每个它遍历到的谓词都跑validateExpression,语法错误报 blocking error。但它的遍历面是 objects / flows / actions / sharingRules / hooks,从不走views与pages。走这个面的只有
validate-visibility-predicates.ts(ADR-0089 D3b + #6128 新增的裸标识符闸),而这三条规则都不判语法:PR #6248 的新规则明确在parseCelToAst返回null时保持沉默,理由是「不发明第二个语法判定」——与validate-null-guards.ts同一条政策。那条政策在它自己的调用点上是成立的,因为validateExpression就在同一批调用点上跑;在 view/page 面上它不成立:那里根本没有第二个判定,沉默就是没人报。后果与 #5149 同型:语法不通过的谓词求值失败 →
evalFieldPredicate返回 fallback → 可见性的 fallback 是true→ 元素无条件渲染,与「没写谓词」在屏幕上一模一样。#5149 已落地的运行时 warn-once(objectui#3541)现在会把它喊出来,但那是运行时;构建期依然放行。现成的样本形状
packages/spec/src/ui/view.test.ts:1126/:1240/:1245/:1291/:1373的 fixture 就写着'country === "USA"'/'billing_country === "USA"'——===不是 CEL。这些是 schema 测试的 fixture(不是发货内容,schema 也不判表达式值),但它们正说明这个写法是作者会写出来的。决定点(不是实现细节)
view/page 谓词的语法要不要判、判成 error 还是 warning,是一个「作者被允许写什么」的产品判断,不是接线缺口:
若采纳,落点就在
validate-visibility-predicates.ts已有的parseCelToAst返回null那个分支上 —— 一处判断,配一条自纠措辞的消息。PR #6248 已在该分支写下这条缺口的注释,便于接手者定位。Refs:#6128 / PR #6248(发现处)、#5149(同族的 fail-open 静默)、ADR-0032(其它面的语法判定)。