# 02 — 调度决策纯函数 + 派生子 Run

**What to build:** 给定一个活动的静态计划和"当前活动时钟位置"，一个纯函数能算出此刻应派生哪些子 Run（以及活动是否已到窗口终点）。据此实际派生普通 Run——每个子 Run 复用现有单次评测的执行路径、带上活动归属，跑完后其结果照常入库。这一票让"活动能真的按计划生出评测"成立，但不含自动循环（由测试或手动推进时钟驱动）。

**Blocked by:** 01（需要活动持久化与 campaign_id 归属字段）。

**Status:** ready-for-agent

- [ ] 纯函数：输入活动计划 + 活动时钟位置（由真实经过时间 × time_scale 映射到窗口偏移），输出"到点应派生的计划条目"与"是否已达窗口终点"；不触碰任何判定/报告口径
- [ ] time_scale 只影响"何时到点"，正式线 1.0=真实墙钟、开发线可压缩；判定与结果口径与倍速无关
- [ ] 据纯函数结果派生普通 Run：复用现有评测执行入口（existing_run 路径），子 Run 携带 campaign_id，triggered_by 体现活动来源
- [ ] 幂等：同一计划条目在同一到点不重复派生（推进进度可追踪）
- [ ] 纯函数单元测试（仿 test_orphan_runs 的纯 db_session 风格）：注入不同时钟/倍速覆盖"未到点/到点/多条同时到点/已达终点"矩阵
- [ ] 集成测试：手动推进时钟驱动一个压缩倍速活动，断言派生出的子 Run 数量、归属、场景与计划一致；子 Run 跑完后结果与 summary 正常入库
