# R2.21 任务报告

## 结果

- owning YAML：`config/platform-infra/sub2api-codex-pool.yaml`。
- 通用模板：`runtime.templates[codex-upstream-failover]`。
- HTTP 400 规则新增精确关键词：
  - `selected model is at capacity`
- 冷却时间保持 1 分钟。
- 未修改 Sub2API 源码、版本、外部哨兵、账号优先级、容量或分组。

## 下发范围

- 通过受控 `runtime apply --accounts ... --template codex-upstream-failover` 精准更新 9 个既有模板 API-key 账号：
  - `https://ai.whistlelads.com plus 0.03`，ID 28；
  - `https://api.lwylink.xyz plus 0.05`，ID 30；
  - `https://api.lwylink.xyz pro 0.1`，ID 29；
  - `https://api.recurdream.com plus 0.02`，ID 35；
  - `https://sub.yjxm1221.top plus 0.025`，ID 27；
  - `https://sub.yjxm1221.top pro 0.06`，ID 19；
  - `https://sub2.pokexiao.com plus 0.03`，ID 31；
  - `https://sub2.pokexiao.com pro 0.05`，ID 32；
  - `https://www.xiaobaishu.org plus 0.01`，ID 37。
- `lyon9801 0.0`，ID 15，保持 `TEMP_ENABLED=false`、0 条规则。
- 邮箱命名的非 API-key 账号保持 0 条规则。

## 验证

- 首次 dry-run：
  - `selected=9`；
  - `changed=9`；
  - 所有账号均为 `update`；
  - 没有写入。
- confirmed apply：
  - `writeSucceeded=9`；
  - `writeFailed=0`；
  - `reconciled=9`；
  - `mismatched=0`。
- 批量自动对账 dry-run：
  - `selected=9`；
  - `changed=0`；
  - 9 个账号全部 `noop`。
- 代表账号 ID 28 原生 runtime 回读：
  - 类型为 `apikey`；
  - `pool_mode=false`；
  - HTTP 400 关键词同时包含 `input must be a list` 和 `selected model is at capacity`；
  - `duration_minutes=1`。
- lyon ID 15 原生 runtime 回读确认仍未启用临时不可调度。

## 同步边界

- 整池 `codex-pool sync` dry-run 因当前主机缺少 YAML 引用的两个本地 Codex profile 文件而被受控 CLI 阻止，未产生运行面写入。
- 当前 9 个目标账号在原生 runtime 中均标记为 `runtime-manual`，因此按既有所有权规则使用精准 runtime CRUD 下发。
- owning YAML 已持久化同一通用模板；后续本地 profile 来源恢复后，正常 `sync` 会继续保持该规则。
