Skip to content

bug(service-automation): flow 节点类型校验跑在插件贡献的执行器注册之前 —— 每个 ADR-0019 approval flow 都被误报「will fail at execution time」 #4771

Description

@os-zhuang

TL;DR

pnpm dev(showcase)每次启动报 8 条「这些 flow 运行时会失败」,全是误报。校验在 ApprovalsServicePlugin 注册 approval 节点执行器之前 0.8 秒就跑完了。

告警措辞是断言式的,会直接把人送去查一个不存在的 bug(本 issue 的作者就被送去查了一轮)。

现场

WARN Flow 'showcase_expense_signoff' references node type(s) with no registered executor
     or descriptor: approval. They will fail at execution time unless a plugin registers
     them. Registered types: start, end, decision, assignment, loop, parallel, try_catch,
     get_record, create_record, update_record, delete_record, screen, script, http,
     connector_action, notify, wait, subflow, map

×8:showcase_expense_signoffshowcase_committee_quorumshowcase_budget_approvalshowcase_invoice_signoffshowcase_one_task_signoffshowcase_closure_signoffshowcase_dynamic_approvalshowcase_approver_bindings

证据:是时序,不是缺失

--log-level info 跑一次:

事件 时刻
flow 校验告警 showcase_expense_signoff 04:28:05.302
ApprovalsServicePlugin: service registered 04:28:06.105

0.8 秒

而且 ApprovalsServicePlugin 的兜底日志 —— approvals-plugin.ts:283

} catch {
  ctx.logger.info('ApprovalsServicePlugin: no automation engine — approval node not registered');
}

—— 在整份 info 级日志里 一次都没出现grep -c = 0)。说明 ctx.getService('automation') 拿到了引擎,registerApprovalNode(...) 确实跑了,approval 最终是注册上的,flow 运行时是好的。

相关代码:packages/plugins/plugin-approvals/src/approvals-plugin.ts:272-285packages/plugins/plugin-approvals/src/approval-node.ts:92

为什么值得修,而不是当噪音

  1. 措辞是断言不是猜测。"They will fail at execution time" 对一个恰好会在 0.8 秒后被注册的类型来说是假的。ADR-0018 明确允许插件在运行时通过 registerNodeExecutor(type) 扩展词汇表 —— 那么一个在扩展完成前拍板的校验器,就是在校验一个还没成型的世界。
  2. 它掩盖真问题。真正没人提供 approval 的部署(没装 approvals 插件)会得到一模一样的 8 条告警。现在这条信号的信噪比是 0,没人能用它区分两种情况。
  3. 它是 showcase 冷启 24 条告警里的 8 条,占三分之一。

修法(择一)

  1. 把校验推迟到所有插件 start() 完成之后kernel:ready)—— 那时词汇表才是完整的。这是最贴合 ADR-0018 的做法。
  2. 保留早期校验但降级为 debug/info,在 kernel:ready 再跑一次权威校验,只有那一次才 warn。

倾向 1。另外顺带看一下 approvals-plugin.ts:283 那个 catch —— 它把"没有 automation 引擎导致 approval 节点没注册"记成 info,而 dev 默认日志级别是 warn,也就是真的降级发生时你反而看不见。这个 catch 至少该是 warn

复现

rm -rf examples/app-showcase/.objectstack && pnpm dev

想看时序:objectstack dev --seed-admin --log-level info,对比 WARN Flow '...'ApprovalsServicePlugin: service registered 的时间戳。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions