Files
FlowPilot/docs/错误重试分层策略.md
2026-05-21 07:21:34 +08:00

3.2 KiB
Raw Permalink Blame History

错误重试分层策略(步骤 4/8/9/自动运行)

本文档说明当前实现中的三层重试语义,避免把“当步重试 / 小循环重试 / 大循环重试”混在一起理解。

1. 第一层:当步重试(Step 内部)

定义:不离开当前步骤,在当前页面链路内恢复或替换资源。

典型位置:

  • flows/openai/background/steps/fetch-signup-code.js(步骤 4 页面恢复)
  • flows/openai/background/steps/fetch-login-code.js + background/verification-flow.js(步骤 8 邮箱轮询与重发)
  • background/phone-verification-flow.js(步骤 9 号码轮换、重发、回到 add-phone)

常见动作:

  • 点击 Try again 恢复 405/重试页;
  • 同一步内重新拉验证码;
  • 步骤 9 内直接换号(不立刻回步骤 7);
  • 同提供商/同国家内换价格档位或换号码。

2. 第二层:小循环重试(授权链路重开)

定义:当前轮次内回到授权链路起点(通常步骤 7),再走 7→8→9。

触发来源:

  • background.jsgetPostStep6AutoRestartDecision(...)
  • 步骤 8 检测到邮箱通信异常且当前链路连续重试超限;
  • 步骤 9 触发 PHONE_RESTART_STEP7 类错误(例如回调窗口过期/链路不可恢复)。

特点:

  • 还是同一“轮次”;
  • 不进入线程间隔(20 分钟);
  • 优先用于“流程状态错位/页面链路失效”类问题。

3. 第三层:大循环重试(自动运行 attempt/round

定义:由自动运行控制器决定是否进入下一次 attempt,或等待线程间隔后继续。

位置:

  • background/auto-run-controller.js

关键点:

  • autoRunSkipFailures=true 时,允许同轮多次 attempt
  • 某些错误会被视为“本轮直接失败并跳过剩余重试”;
  • 若配置了线程间隔,会出现“等待 N 分钟后第 x 次尝试”日志。

4. 错误分类优先级(当前实现)

  1. 先做当步恢复(能在步骤内闭环就不升级)
  2. 当步失败后,再判断是否走小循环(回步骤 7)
  3. 小循环仍失败,才交给大循环(attempt / round / 线程间隔)

5. 已落实的关键规则(与近期问题对应)

  • Failed to fetch / network error / fetch failed: 步骤 4/8/9 进入有上限的网络重试(当前默认 3 次,冷却 12 秒)。

  • Step 9: 5sim check activation failed: order not found: 归类为“号码失效”,在步骤 9 内立即换号(当步重试),不应直接触发线程间隔。

  • Route Error 405(手机号验证码页): 优先当步恢复;若落入 route-405 循环,步骤 9 内换号。

  • add-phone / phone-verification 页面状态: 表示流程已进入手机链路,自动运行层默认不再盲目回步骤 7,避免破坏当前链路。

6. 关于“第几轮尝试 + 暂停”含义

  • “第 x/y 轮第 n 次尝试”是自动运行控制器的外层 attempt 计数;
  • “线程间隔:等待 20 分钟...”表示已经升级到第三层(大循环);
  • 用户手动停止会中断当前计划;恢复时是否回到步骤 7,取决于当前页面状态与回调是否过期:
    • 回调未过期且仍在可恢复链路:优先当前链路继续;
    • 回调已过期或链路断裂:回步骤 7 重拉授权。