# 组合子图、批量、等待与恢复

## When to use

当 graph 需要复用子流程、处理集合、等待时间或外部事件，或在进程重启后继续时使用本任务。如果整个短流程安全重跑的成本更低，应停止引入持久化。

## Inspect first

- 找到现有 graph identity、business key、子图注册位置和集合边界。
- 列出每个等待的 correlation key 与事件 idempotency key。
- 区分“恢复一次执行”与“重复一次外部副作用”。
- 按需阅读第 [10](/zh-CN/v/0.9.8-RC1/10-reuse-with-subgraphs)、[11](/zh-CN/v/0.9.8-RC1/11-batch-and-iteration)、[12](/zh-CN/v/0.9.8-RC1/12-waiting-for-the-world)、[13](/zh-CN/v/0.9.8-RC1/13-durable-execution) 章。

## Required inputs

取得父图可见的子图结果、集合规模与顺序要求、等待超时、关联身份、重复事件策略、重启要求、持久化所有者和允许的副作用恢复语义。

## Implementation path

1. 只有子流程具备稳定输入输出边界时才使用子图，并隐藏其内部节点输出。
2. 根据顺序、限流和副作用约束选择串行或并行集合执行。
3. 直接信号或时间使用 `wait`；外部业务事件关联使用 `await`。
4. 用稳定业务数据绑定执行身份和 correlation key。
5. 只持久化必须跨进程保存的执行、checkpoint、wait、work item 和 graph definition。
6. 分别证明挂起、事件投递、恢复、重复投递、超时和冷恢复。

## MUST / SHOULD / MAY

- **MUST** 使用稳定业务身份完成关联与恢复。
- **MUST** 让重复投递无害，或明确拒绝重复事件。
- **MUST** 把已保存 checkpoint 与外部副作用视为两个事实。
- **SHOULD** 默认隔离子图 scope，只有明确需要且经过审查时才暴露父作用域。
- **SHOULD** 按下游容量限制集合并行度。
- **MAY** 在测试中使用内存 store；不得把它写成重启证据。

## Failure patterns

- 把子图输出当扁平值：读取子图声明的聚合结果，不泄漏内部节点。
- 用 execution id 作为外部 webhook 合同：改用稳定业务 correlation key。
- 崩溃恢复后重复扣款：在副作用边界加入 idempotency key 或 reconciliation。
- 用同一个 engine 声称持久恢复：以共享持久状态创建第二个 engine/runtime 实例。

## Validation

依次运行聚焦的挂起/恢复、重复事件和新 engine 冷恢复测试，然后运行目标模块测试。持久化证据和外部副作用证据必须分别报告。

## Evidence

- [组合与子图](/zh-CN/v/0.9.8-RC1/10-reuse-with-subgraphs)
- [等待与关联](/zh-CN/v/0.9.8-RC1/12-waiting-for-the-world)
- [持久执行](/zh-CN/v/0.9.8-RC1/13-durable-execution)
- [副作用与幂等参考](/agent/zh-CN/v/0.9.8-RC1/reference/effects-and-idempotency.md)
