Skip to content

console validation 预览样例的 condition 语义写反了(spec 里 condition 为 TRUE 表示校验失败),另带两个会被静默剥掉的键 #3276

Description

@xuyushun441-sys

objectui#3266 在修 apps/console/src/preview-samples.tsvalidation 样例(只改了 events 枚举)时顺手核到的,不在那个 PR 的 scope 内,单独记这里。

1. condition 语义写反(主要问题)

ScriptValidationSchema.condition 的契约是:

condition: ExpressionInputSchema.describe('Predicate (CEL). **If TRUE, validation fails.** e.g. P\record.amount < 0`')`

而样例是:

validation: {
  name: 'amount_positive',
  message: 'Order amount must be greater than zero.',
  condition: 'amount > 0',}

按契约,这条规则会在金额为正时判定失败 —— 和它的 name / message 正好相反。正确写法是 condition: 'amount <= 0'

这个错误不会被 objectui#3257 建的守卫抓到(它只问「能不能 parse」,语义是对是反 schema 管不着),但危害恰恰更大:样例是设计器画廊里给作者(多数情况下是模型)照抄的那份范例,照抄出来的规则会静默地把合法记录拦下、把非法记录放行。spec 自己的 docstring 举的例子就是 P\record.amount < 0``,即「不合法的情形」,方向和样例相反。

2. 两个会被静默剥掉的键

ValidationSchema 不是 .strict(),所以下面两个键 parse 能过、但在解析结果里根本不存在:

  • expression: 'amount > 0' —— ScriptValidationSchema 只有 condition,没有 expression;
  • object: 'sales_order' —— 校验规则挂在 object 的 validations[] 上,宿主对象就是它的作用域,规则自身不带 object

(顺带:skill 样例的 type: 'prompt' 同理 —— SkillSchema 没有 type 键,只有 surface,该值被静默剥掉。)

这类键的问题在 objectui#3266 正文里已有定性:守卫的强度取决于 spec 的严格度,非 .strict() 的 schema 会把未知键悄悄剥掉而不是报错,所以守卫对它们照样绿。样例里留着一个「写了等于没写」的键,教的还是错的写法。

建议

  1. condition: 'amount > 0''amount <= 0';
  2. 删掉 expressionobject(以及 skilltype);
  3. 如果希望这类语义错误将来能被机器发现,那是另一件事(需要的是规则语义的断言而非 schema 校验),不建议塞进 preview-samples-spec-valid.test.ts —— 那个守卫的职责是「能不能发布」,别把它变成什么都装的筐。

相关

⚠️ 未指派 —— Prime Directive #10 记录性建单。

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions