# R2.1 任务报告

完整只读审计见 [UniDesk #1869](https://github.com/pikasTech/unidesk/issues/1869#issuecomment-4952486744)，执行任务为 qt_c4072b7278ed409f94dc271d69f39540。

## 需求与失效边界

- 架构已从 #891 的单一 24 小时 dry-run 演进为多 runner、全局 latest/history、Dashboard、cadence freshness 与 OTel；#1861 是执行到 record/index 断点的局部实证，不是唯一架构依据。
- 当前 monitorRoot 只是选择某个 sentinel 的 public root，不是中心聚合服务。
- 每 runner 私有 SQLite 在单实例可用，但跨 runner 必然产生多权威、fan-out、部分失败和不同 latest 语义。
- monitor-web 绑定当前 runner API，并对历史 run 发出 N+1 detail 请求；聚合留在 UI 会使 CLI、页面和服务看到不同事实。
- runner 服务同时持有执行、索引、查询和前端，已越过可维护边界。

## 必须满足

- 配置、Host PG role/database/export/Secret consumer、迁移与切换状态全部 YAML-first。
- 每 sentinel 只有一个 cadence/CronJob 调度权威，并明确区分业务 cadence 与 heartbeat。
- runner 负责 observe/analyze 与不可变 artifact；中心 Monitor 拥有全局 durable index/read model。
- global latest/history/finding/artifact locator 由同一中心 API 选择，CLI 与 monitor-web 共用。
- 复用 NC01 Host PG；一次性迁移可计数、校验、切换、回滚，完成后无永久双写、SQLite fallback 或第二索引。
- 近 3000 行 service 按执行、持久化、查询和 UI 边界拆分。

## 方案选择

拒绝 runner API fan-out 聚合与共享 runner/PVC/SQLite。采用中心 Monitor service + NC01 Host PG；runner 保留执行与 artifact owner，monitor-web 只读中心 API。artifact 文件是否迁移由 R2.2 冻结。
