Skip to content

[BUG][P2] Workflow 应检测不受控 Subflow 递归并提供深度边界 #273

Closed

Description

@Aias00

已确认问题

Subflow 执行直接解析指定版本并递归进入 executeSteps,没有循环引用检查或调用深度边界。一个合法结构的自引用定义能通过发布,并在执行时以 JVM StackOverflowError 结束。

代码:

最小复现场景与证据

var definition = new WorkflowDefinition("cycle", "1", List.of(
    new WorkflowStep.Subflow("self", "cycle", "1")));
var registry = new WorkflowRegistry();
registry.publish(definition);
var agent = WorkflowAgent.builder(definition).registry(registry).build();

在有效 AgentExecutionContext 中调用 agent,假模型和外部服务均不需要。实际 Future 的根因是 java.lang.StackOverflowError。

交付与验收

  • 对已可解析的固定版本引用进行循环检查,或在执行时维护调用链并阻止不受控递归;合法前向发布策略需明确。
  • 对过深但无环的 Subflow 链也提供明确边界,以领域错误结束,不依赖 JVM 栈耗尽。
  • 若支持有意递归,必须有显式有界策略;不能仅无条件禁止所有跨步骤复用同一子流程。
  • 覆盖直接自引用、跨定义/版本的间接环、深层无环、顺序/并行多次合法复用、取消及错误诊断。
  • 错误能定位定义版本和引用链,保持 Workflow 执行独立,不转交 Graph/Loop 解决。

关联

关联 #197、#199;此处不是 DSL Loop 的 maxIterations 边界问题。

验证基线与变更约束

审阅基线:Core b34835354b27f1f320ea8438edf2e9d170e69c84 / Extensions cb2635ab2fc338e8aade28a132a15f48b4e655fc。以下为离线 stub、独立 Java 探针或候选工件编译验证的结果,不代表真实模型、外部服务或生产环境验收。

修复保持独立 ReAct/Workflow 不依赖 Graph/Loop,不向 Core 引入供应商 SDK。优先修正现有契约的执行行为;确需改变公开 API、配置或定义格式时,说明较小替代方案、收益、消费者影响、目标版本与迁移方式。不得以跳过测试或删除能力换取通过。

Activity

  1. konlue commented on Nov 8, 2026

    @konlue
    Contributor

    您好,我想认领 #273。

    方案(双层防线)

    • 发布期:WorkflowRegistry.publish 以「待发布定义 + 已发布定义」为引用图做 DFS 环检测(节点 id@version,同 id 不同 version 不算环),发现环直接拒绝发布并给出闭合链(a@1 -> b@2 -> a@1);引用未发布的定义是合法前向引用,不阻塞发布,执行期解析不到走既有 "workflow version is not published" 失败。
    • 执行期:run 携带 subflow 调用链(id@version,跨挂起/恢复延续,parallel 分支各自拷贝)——进入链上已有的 subflow 抛携带引用链的 WorkflowSubflowRecursionException,链达到配置深度上限同样以领域错误结束(诊断链从根定义起含每一层),不再依赖 JVM 栈耗尽。默认上限 16,Builder.subflowMaxDepth(int) 显式可配。
    • 合法复用不受限:链是"当前调用路径"而非全局已用集合,顺序/并行复用同一 subflow 都合法。不支持有意递归的 DSL 标志(调用链上成环即拒);不动 DSL Loop 的 maxIterations。

    测试

    新增 WorkflowSubflowBoundaryTest 8 用例:发布期自引用拒绝、跨定义间接环拒绝(含前向发布一步)、前向引用发布成功 + 执行期 not published、深层无环链(20 层)领域错误而非 StackOverflowError、subflowMaxDepth 配置生效、顺序复用、并行复用、subflow 内取消正常终止。实现前 4F 红,实现后 workflow-core 46/46 绿。

  2. added 2 commits that reference this issue on Nov 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions