Skip to content

classifyError 的 type/runtime 两支仍按文案分类,而 cel-js 把作者源码嵌进 message —— 字段名叫 parse_status 的记录,求值期故障被答成 kind: 'parse' #6223

Description

@baozhoutao

范围外发现,出自 #6133 / PR #6202 的词表审计。按 Prime Directive #10 记录,不指派。

#6133 的关系

#6133 修的是 parse 期:PR #6202ParseError 改成按错误类判定,那一支不再读文案。但 classifyErrortype / runtime 两支刻意保留了原关键词表(理由见 PR #6202:cel-js 的 TypeChecker 按阶段而非按故障选错误类,整体结构化会迁移既有判定,需要单独定价)。

本单据记录的是:那两支上,#6133 的根因原封不动地还在,并且有一个具体的、今天就能踩到的表现。

事实(origin/main + PR #6202 之后的分类器,实测)

cel-js 的 formatErrorWithHighlight(lib/errors.js)把出错那一行源码拼进 message,求值期错误也不例外。于是关键词匹配的是作者可控的文本。同一个 no such overload 求值故障,只因字段名不同:

record.status > 1         EvaluationError -> kind = 'runtime'   ✅
record.parse_status > 1   EvaluationError -> kind = 'parse'     ❌
record.syntax_mode > 1    EvaluationError -> kind = 'parse'     ❌
record.unexpected_at > 1  EvaluationError -> kind = 'parse'     ❌

四条的首行文案完全一样(no such overload: dyn string > int),差别只在 message 尾部回显的源码行。

复现(仓库根):

import { Environment } from '@marcbachmann/cel-js';
const env = new Environment({ unlistedVariablesAreDyn: true, enableOptionalTypes: true });
try { env.evaluate('record.parse_status > 1', { record: { parse_status: 'open' } }); }
catch (e) { console.log(e.name, JSON.stringify(e.message)); }

为什么这条比 #6133 那格更别扭

kind 会原样进作者可见面(objectql rule-validator / cel-faultrestreason,位置见 #6133)。#6133 是"语法错被答成运行期错" —— 指错方向;这条是反向:表达式语法完全正确、在数据上求值失败,却被告知 parse,即"你的表达式写错了"。作者会去检查一个没有问题的表达式。ADR-0032 D1d 同样不满足。

type 一支同理:字段名叫 type(极常见)的记录,求值期故障会落 /type/ 判成 kind: 'type'。这一格危害小些(typeruntime 都指向求值期),但成因是同一个。

未量化 / 未主张

建议方向(供 triage,不代裁)

沿 PR #6202 的同一条路走完:EvaluationError -> runtimeTypeError -> type,再用一张按 code(不是按文案)的小表把 unknown_variable 这类"声明类故障"挑回 type。收益是关键词表可以整个删掉,classifyError 不再有任何一支读作者可控的文本;代价是要为 18 个 evaluation code 各定一次价,并钉 fixture。

关联

#6133 / PR #6202(发现出处与已修的 parse 一支)。#6132(cel-to-filter 第三入口,另有一套 reason: 'parse-error' 词表)。ADR-0032 D1d。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions