# 03 — 耐久调度回路 + 重启恢复 + 取消

**What to build:** 平台自带一个耐久调度循环，无需外部驱动即可让一个"进行中"的活动按其（可压缩的）窗口自动推进到终点：到点派生子 Run、窗口走完把活动置为"已完成"。服务重启后，调度从数据库恢复所有未完成活动、继续推进且不重复派生。用户可中途取消进行中的活动，已完成的子 Run 结果保留。

**Blocked by:** 02（需要调度决策纯函数与派生能力）。

**Status:** ready-for-agent

- [ ] 调度循环挂在 Web 应用 lifespan：启动时加载所有"进行中"活动并推进，关闭时优雅停止；循环是薄壳，决策仍走 02 的纯函数
- [ ] 活动进度（窗口起止、已派生/已完成到哪）为库中权威状态，进程内不持有权威态
- [ ] 重启恢复：进程重启后据库续跑未完成活动，不重复派生已到点条目；沿用 mark_orphans_failed 思路处理重启时正在跑的子 Run
- [ ] 窗口走完活动状态转"已完成"；派生/执行异常不拖垮整个活动（单条失败可跳过并记录）
- [ ] 取消：`POST /api/campaigns/{id}/cancel` 将进行中活动置"已取消"、停止后续派生，已完成子 Run 保留
- [ ] `GET /api/campaigns/{id}` 详情反映实时进度（当前窗口位置、已派生/已完成子 Run 数、状态）
- [ ] 集成测试：压缩倍速活动端到端自动跑完并置"已完成"；模拟重启（进行中活动 + 部分子 Run）后恢复续跑，断言不重复派生、不丢进度；取消后不再派生
