# R1 任务报告

## 目标

把 Sub2API 上游故障调查从零散日志读取收敛为可复用的受控 CLI 能力，并用实际错误证据形成保守、可逆的账号级 runtime 调度缓解。

## 工具改进

- `runtime list|get` 补充 `proxyId`、并发上限、当前并发、`loadFactor` 和优先级，能够直接核对代理与调度事实。
- `runtime errors` 综合 `account_upstream_error`、`openai.forward_failed` 和 Sub2API Ops 上游错误记录，输出全池主因排名、账号主因、状态码、消息、模型、小时和流式分布；详细样本通过 `--full` 渐进披露。
- 错误分析显式区分 Ops 样本与 runtime 日志，不按时间或位置强行关联；缺少全部请求尝试分母时不计算错误率，缺少错误发生时并发历史时不把当前并发快照作为降并发依据。
- `runtime apply|delete` 仅修改显式指定账号的临时不可调度配置；无 `--confirm` 时为 dry-run，有 `--confirm` 时才写入，并回读模板匹配、代理、并发、状态和调度状态。

## 全池结论

- 最近观测窗口内主要错误是仅状态码上游失败、通用上游失败、过载和上游 API-key 校验失败；明确并发错误只占较小部分，降低全池并发量不应作为首要修复。
- 账号 27 的集中 HTTP 500 证据为 `Failed to validate API key`，指向上游网关 key 查询或依赖失败；账号 32 才有明确并发限制证据。
- context window、缺少 terminal event 和 `encrypted_content` 属于请求语义或流式续链问题，不应通过临时摘号模板泛化掩盖。
- Sub2API 仅能在响应尚未提交时通过临时不可调度触发换号；SSE 已向客户端写出后再缺少终止事件，不能透明切换账号。

## 配置与运行面应用

- owning YAML 的 `codex-upstream-failover` 模板收敛为 5 条实际观测规则：`429`、`500`、`502`、`503`、`524`，每条冷却 1 分钟。
- `500` 仅匹配实际证据中的 `failed to validate api key` 和 `do request failed`；可用性、过载和并发关键词按实际状态码分别配置。
- 通过 runtime CRUD 将模板显式应用到 9 个 API-key 手工账号；OAuth 账号 `lyon9801` 保持 `enabled=false`、零规则。
- 未改变账号凭据、代理、并发上限、优先级、长期 `status` 或 `schedulable`；原先已禁用或错误的账号保持原状。

## 验证

- 全池 runtime 回读确认 9 个 API-key 账号均为 5 条规则并匹配模板，OAuth 例外未变化。
- `bun --check scripts/src/platform-infra-sub2api-codex/runtime.ts` 通过。
- Bun 内置 YAML 解析确认规则状态码为 `429,500,502,503,524`，持续时间均为 1 分钟。
- `git diff --check` 通过。

## 后续边界

本次只能证明配置正确应用，不能立即证明错误率下降。后续应在独立的新时间窗口复核错误记录、切号证据和最终客户响应，并继续保持错误数量、请求分母和流式提交阶段的语义区分。
