Skip to content

view/page 可见性谓词的 CEL **语法**在构建期无人校验 —— country === "USA" 这类写法零诊断、运行时静默 fail-open #6253

Description

@hotlong

Filed unassigned from #6128 / PR #6248本单只记录发现,不含修法承诺。

事实

validate-expressions.ts(ADR-0032)对每个它遍历到的谓词都跑 validateExpression,语法错误报 blocking error。但它的遍历面是 objects / flows / actions / sharingRules / hooks,从不走 viewspages

走这个面的只有 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(其它面的语法判定)。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions