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 开关位置 × 五类输入的「谁报什么」对照)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions