Archived
fix(activity-registry): 配方静态审补 card/say 的表达式扫描(评审 Important)
card.title / card.ask / card.standard / card.basis[].v 与 say.text 全是 AutoExpr, 合法地可以含 lookup —— 原实现只核了 gateLedgers,这几处从没被 walkExpr 走过, 卡面上的一处笔误因此能一声不响地装进来,只在这一步第一次真跑起来时才现形。 补齐四处 walkExpr 调用 + 新增 say 分支;顺带核实 walkExpr 对 when/then/else 这类 嵌套结构确实递归到底(title 的测试用例特意嵌了一层 when/then 验证)。 同批把名不副实的「each / lookup 的地址同样要在声明里」拆开:该用例改名只测 each, 另加一条真的在 project.fields 里放 lookup 节点的用例(评审 Minor)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
@@ -462,6 +462,19 @@ export function autoRecipeFindings(manifest: ActivityManifest): StaticAuditFindi
|
||||
if (action.as === 'decide' && (action.options ?? []).length === 0) {
|
||||
out.push({ code: 'schema-invalid', severity: 'error', message: '决策卡一个选项都没有', at: where });
|
||||
}
|
||||
/*
|
||||
* **`title`/`ask`/`standard`/`basis[].v` 都是 AutoExpr,合法地可以含 lookup**
|
||||
* (2026-08-29 评审补,原实现只核了 `gateLedgers`,这四处从没被 `walkExpr` 走过 ——
|
||||
* 卡面上的一处笔误因此能一声不响地装进来,只在这一步第一次真跑起来时才现形)。
|
||||
*/
|
||||
walkExpr(action.title, where);
|
||||
if (action.ask !== undefined) walkExpr(action.ask, where);
|
||||
if (action.standard !== undefined) walkExpr(action.standard, where);
|
||||
for (const b of action.basis ?? []) walkExpr(b.v, where);
|
||||
}
|
||||
/* `say.text` 同样是 AutoExpr,同一个理由要核(2026-08-29 评审补) */
|
||||
if (action.kind === 'say') {
|
||||
walkExpr(action.text, where);
|
||||
}
|
||||
if (action.kind === 'submit' && (step.acceptanceChecklist ?? []).length === 0) {
|
||||
out.push({
|
||||
|
||||
Reference in New Issue
Block a user