# 01 — 活动持久化 + 创建/查询 API

**What to build:** 用户能通过 API 创建一个「评估活动」：提交一个绑定单个评测对象的静态活动计划（窗口长度、time_scale、若干"在窗口某偏移时刻对某场景跑几次"的计划条目），活动被持久化、状态为"计划中"，并能按 id 查询取回完整活动。为后续调度与聚合打好数据地基。

**Blocked by:** 无 — 可立即开始。

**Status:** ready-for-agent

- [ ] 新增评估活动持久化：窗口长度、状态（计划中/进行中/已完成/已取消/失败）、time_scale（默认 1.0）、静态计划（JSON 存取，仿现有 cases）、目标对象、时间戳
- [ ] 评测运行增加可空的活动归属字段（campaign_id）；非活动派生的手动 Run 该字段为空；不破坏现有 Run 的创建/查询/更新
- [ ] 新增活动仓储，沿用现有仓储的 to_db/from_db 映射与 Session 管理约定
- [ ] Alembic batch mode 迁移（SQLite），沿用现有迁移链与 render_as_batch 约定；全新库经 init_db 的 create_all 亦能建出新表与新列
- [ ] `POST /api/campaigns` 校验并创建活动（计划非空、对象存在、窗口/倍速合法），返回活动 id 与初始状态
- [ ] `GET /api/campaigns` 列表、`GET /api/campaigns/{id}` 详情（含计划与状态）
- [ ] 活动通过率等汇总口径为空占位，待后续票填充；本票不含调度与派生
- [ ] API 集成测试（httpx AsyncClient 同现有 runs 测法）：创建→取回一致、非法计划/不存在对象报错、campaign_id 迁移后既有 Run 不受影响
