diff --git a/docs/design/08-classify-outcome-optimization.md b/docs/design/08-classify-outcome-optimization.md index 6086879..606ed02 100644 --- a/docs/design/08-classify-outcome-optimization.md +++ b/docs/design/08-classify-outcome-optimization.md @@ -100,7 +100,9 @@ TCP 握手只能检测进程端口是否监听,无法检测 Gateway **业务 | A6 | status=error + stderr 含 auth 关键字 | auth_failed | ❌ | 标 failed + 原因写黑板 | | A7 | status=error + stderr 含 compact 关键字 | compact_interrupted | ✅ | retry + cooldown 60s(等 compact 完成) | | A8 | status=error + stderr 含 network 关键字 | gateway_unreachable | ✅ | retry + cooldown 60s | -| A9 | status=error + stderr 含 rate_limit 关键字 | api_error | ✅ | retry + cooldown 60s | +| A9 | status=error + stderr 含 rate_limit 关键字 | api_error | ✅* | release counter + 推回 pending + api_retry_count 上限 | + +> *A9 是特殊路径:不走统一 `_do_retry` 续杯,而是 release counter + 推回 pending + 独立 api_retry_count 计数器(达 max_retries 标 failed)。保留此路径是因为 api_error 有独立的计数器逻辑,与 retry_count 互不干扰。 | A10 | status=error + stderr 含 lock 关键字 | lock_conflict | ✅ | retry + cooldown 60s | | A11 | status=error(其他) | agent_error | ❌ | 标 failed + 原因写黑板 | @@ -144,13 +146,11 @@ TCP 握手只能检测进程端口是否监听,无法检测 Gateway **业务 - **当前代码 A7 compact_failed 仍为不可恢复(should_retry=False)**,暂不改动 - 等 A7 实施时一并处理 -#### A8/A9/A10: 暂时性错误(可恢复,改为 retry) -- 原逻辑:release counter + 推回 pending → 等 ticker 重新分配 -- 新逻辑:counter 已在手里,直接 retry 更快 -- 各自设 cooldown 避免高频轮询: - - A8 network: 60s - - A9 rate_limit: 60s - - A10 lock: 60s +#### A9: api_error(特殊路径,release counter + push pending) +- 原逻辑和新逻辑一致:release counter + 推回 pending + cooldown +- 有独立的 `api_retry_count` 计数器,达 max_retries(3) 标 failed +- 不走统一 `_do_retry` 续杯,因为 api_error 需要独立的计数器逻辑 +- cooldown 由 counter 默认 cooldown 控制(与 crashed 相同) #### A11: agent_error(不可恢复) - status=error 但 stderr 不匹配任何已知关键字 @@ -286,8 +286,8 @@ stderr_preview 和 exit_signal 写 metadata 的方案暂缓,本轮不实施。 | test_A3_fallback_exhausted | fallback_count=2 → failed | | test_A7_compact_retry | status=error + compact → retry + 60s cooldown | | test_A8_network_retry | status=error + network → retry + 60s cooldown | -| test_A9_rate_limit_retry | status=error + rate_limit → retry + 60s cooldown | -| test_A10_lock_retry | status=error + lock → retry + 10s cooldown | +| test_A9_api_error_push_pending | status=error + rate_limit → push pending + api_retry_count | +| test_A10_lock_retry | status=error + lock → retry + 60s cooldown | | test_A11_agent_error_reason | status=error + 未知 stderr → failed + reason | | test_A6_auth_failed_reason | status=error + auth → failed + reason | | test_stderr_recorded | metadata 包含 stderr_preview |