Skip to content

validateExpression 把方言处方 trailer(「predicates are bare CEL…」)逐字节复用到越界类错误上 —— 教作者改方言,改了必然回退(全部 ~10 个表达式槽位) #7073

Description

@os-project-manager

出自 #6833 的测量派发(会话 session_01AZgRyPVwi1jLb1mNNuUQ9o,座位贴 #6018);该单前提被证伪关单,本卡是其测量中幸存的真缺陷,由座位按 dev 的 needs_decision 建议转立。未认领、未定级(定级归分诊)。

缺陷(实测,origin/main 2c7e62d5f)

packages/formula/src/validate.tsvalidateExpression,celEngine.compile 失败分支:

errors.push({
  source,
  message:
    `invalid CEL ${role}: ${compiled.error.message}` +
    (hint ? ` — ${hint}` : ` — ${role}s are bare CEL (e.g. \`record.rating >= 4\`).`),
});

trailer 不区分失败类别。对一条语法完美、可下推、只是超出平台预算的 CEL(如 80 项合取,Exceeded maxAstNodes (256)),作者收到的完整消息是:

invalid CEL predicate: Exceeded maxAstNodes (256) — predicates are bare CEL (e.g. record.rating >= 4).

前半句(来自 parseCelToAstWithReason 的 reason-carrying 消息)是对的;后半句教作者去检查方言——他改方言不可能修好,只会回退。对 AI 作者尤其危险:模型会服从最后一句处方。

影响面

validateExpression 是 ADR-0032 的共享验证器,覆盖全部 ~10 个表达式槽位(build / 元数据注册 / validate_expression 工具),不只 sharingRules[].condition。一处修好,全槽位受益。

与既有工作的关系

顺带折入:cel-pushdown-limits.ts docblock 的完备性缺口(建议只修文字)

其 docblock 称「Nothing else needs to move at GA. In particular @objectstack/lint's two enforceability gates need no edit … cannot drift from it」。对它点名的两个门成立,但不完备:第三个门 validateStackExpressions 覆盖同一 sharingRules[].condition 字段且 mode-agnostic(validateExpression 从不读 GA 开关)——宽限窗口内 lint 严于运行时。#6833 的测量判定该分歧良性且 GA 时自愈(收紧方向,安全侧),放松 lint 去追运行时反而会制造 #6833 担心的那个缺陷。故建议:行为不动,只补 docblock 那句「nothing else」的完备性

查重

validateExpression bounds message / expression-invalid over-budget / CEL bounds trailer 标题扫描:开放单零命中(#6833 的 dev 与座位各查一遍)。#6778/#6831 已关/已合并,是先例不是重复。

出处

#6833 线程载有完整测量表(两个 GA 开关位置 × 五类输入的「谁报什么」对照)。

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