# R2.4.5 任务报告

## 目标

快速缓解客户错误 #17440（request ID `e5c08dde-9e60-4a14-9458-5574cec00b65`），只使用 YAML-first 通用临时不可调度模板和受控 runtime CRUD，不修改 Sub2API 源码、账号容量、优先级、代理或凭据。

## 根因证据

- 原生 trace 显示请求先由账号 27（`https://sub.yjxm1221.top plus 0.025`）返回 400，精确短语 `Input must be a list` 已命中既有 400 规则并触发第一次 failover。
- 第二跳账号 31（`https://sub2.pokexiao.com plus 0.03`）等待约 60.6 秒后返回 504；响应 detail 仍为 `Input must be a list`。
- 第二次 failover 已进入，但选号时客户 context 已取消，最终 `reason=failover-attempted-no-candidate`。因此客户可见 504 的直接原因是第二跳耗尽请求时间窗，而不是首跳 400 未切号。
- 账号 31 在此前 30 分钟有 75 次尝试、8 次失败、失败率 10.67%，该窗口唯一客户错误就是本请求；2 小时窗口质量仍为 B，故不据单次事件调整长期容量或优先级。

## 配置调优

owning YAML：`config/platform-infra/sub2api-codex-pool.yaml`。

在通用模板 `codex-upstream-failover` 的精确 504 规则中加入关键词 `input must be a list`，冷却时间保持 1 分钟。该规则只匹配实际 504 与稳定短语，不泛化到其他 4xx/5xx，也不涉及 auth 错误。

通过显式 selector `19,27,28,29,30,31,32,33,34` 对 9 个非 `lyon9801` OpenAI 账号执行：

1. 批量 dry-run：selected=9、changed=9、failed=0。
2. 批量 confirm：selected=9、succeeded=9、failed=0。
3. 回读账号 31 和 27：504 规则均包含 `input must be a list`，模板匹配正常。
4. 回读 `lyon9801`：临时不可调度仍为 disabled、0 条规则，例外未被改变。

## 下发后观察

下发后的近期 10 分钟原生 Ops 窗口：

- 请求 88；
- 客户错误 0，错误率 0.00%；
- failover 8 次，8 次均恢复成功；
- select failed 0；
- 临时不可调度命中 4 次；
- 当前排队 0。

该窗口尚未出现新的“504 + Input must be a list”样本，因此只能证明配置已实际生效且未见副作用，不能把短窗口零错误宣称为长期因果验证。

## 边界与剩余风险

本次规则会在同类 504 首次发生后短时摘除对应账号，减少连续客户请求重复命中；它无法挽救已经在第二跳耗尽 context 的当前请求。若同类首次错误仍频繁穿透，下一步应从 Sub2API 源码能力解决 failover 时间预算/每跳超时，而不是继续扩大关键词或盲目降低全池并发。
