# R2.14 任务报告

## 复盘结论

用户观察到的总耗时约 44 分钟，真正的 PK01 apply 与健康验收不足 1 分钟。主要时间消耗来自流程和工具，而不是 Sub2API 升级本身。

- 前置准备约 18 分钟：主代理重复读取多份 skill/reference、检查 worktree、建立 MDTODO、分别执行 status、plan 和 apply dry-run。单一 tag 变更没有命中最短路径。
- 镜像预拉与排障约 10 分钟：`image-prepull --confirm` 虽返回本地 async job，但 job 内仍使用默认 60 秒 SSH capture。冷镜像三次被 60 秒中断，输出只显示 failed；直到 Docker 分层缓存续传后第四次才在 7 秒内完成。
- 实际发布不足 1 分钟：apply job 约 34 秒，status、validate、public health 和 Responses smoke 均在数秒内完成。
- PR 与收口约 15 分钟：PR #2227 被另一个 CI/CD 任务按错误编号误合并，随后 #2229 回退；主代理必须从最新 master 重建 #2232、重复 review/merge、同步主 worktree并清理两个分支。

直接可核对的 GitHub 时间段是首个升级提交 17:53:58 UTC+2 到最终 PR #2232 合并 18:19:42 UTC+2，共 25 分 44 秒；其余约 18 分钟发生在首个提交前的上下文、worktree、MDTODO 和分散预检阶段。

## 工具改进

- 新增 `platform-infra sub2api rollout`：
  - dry-run 并行获取当前镜像、目标镜像、镜像 presence、plan 和 apply dry-run；
  - confirm 默认创建 async job，顺序执行预拉与 apply，并行执行 status、validate 和 smoke；
  - 内置运行镜像与 YAML desired image 对账；
  - 输出 prepull、apply、verify 和 total 分阶段耗时。
- 修复 `image-prepull` 长任务预算：
  - 使用 `defaults.rollout.imagePrepullTimeoutSeconds`；
  - 当前 YAML 为 240 秒；
  - 不再被默认 60 秒 SSH capture 误杀。
- 新增只读 `platform-infra sub2api smoke`：
  - 复用已存在且 public URL 匹配的 `~/.codex` 消费配置；
  - 固定 `stream:false`、`store:false`；
  - 只输出 request ID、HTTP、响应状态和耗时，不输出 key 或响应正文。
- 新增 YAML 参数：
  - `imagePrepullTimeoutSeconds: 240`；
  - `smokeTimeoutSeconds: 120`；
  - `smokeMaxOutputTokens: 16`。

## Skill 与流程改进

后续版本升级固定为以下交互：

1. 只修改目标 target tag。
2. 执行一次 `rollout --dry-run`。
3. 推送 source truth，创建 draft PR，并按 PR number、head branch、head SHA 精确回读身份。
4. 执行一次 `rollout --confirm`。
5. 执行返回的唯一 `job status` 命令观察终态。
6. 把终态与阶段耗时写入同一 PR，标记 ready 后 guarded merge。

禁止再通过“最新 PR”、列表顺序或相邻编号推断 PR；禁止在 rollout 已提供证据时固定重复 status、plan、image-prepull、apply dry-run、validate、health 和 smoke。

## 验证

- `bun --check`：`rollout.ts`、`options.ts` 通过。
- `quick_validate.py .agents/skills/unidesk-sub2api`：通过。
- `sub2api rollout --target PK01 --dry-run`：约 3.3 秒，current/desired 均为 `0.1.156`，四阶段 ok，mutation=false。
- `sub2api smoke --target PK01`：约 6 秒，HTTP 200，response status completed，未打印 Secret 或正文。
- `sub2api plan --target PK01`：policy ok。
- 未执行 `rollout --confirm`，因此本次工具验证未重启或修改 PK01 运行面。

## 预期效果

热缓存升级预期在 5 分钟内完成，人工工具调用从十余次降为 3 次：dry-run、confirm、job status。冷镜像可在 YAML 声明的 240 秒预拉预算内完成；若仍超时，rollout 会明确失败 stage 和阶段耗时，不再盲目重复整套流程。
