Files
gpt-load/internal/subscription
tbphp 16be863ea5 fix(subscription): 允许手动刷新恢复异常订阅凭据 (#580)
* fix(subscription): 允许手动刷新恢复异常订阅凭据

订阅凭据刷新遇到网络故障后落入 outcome_unknown,此后所有刷新入口
全部关闭,重启也不恢复,只能重新连接账号或重新导入。

新增 RefreshForManualRecovery 作为唯一允许恢复异常认证状态的入口,
仅由管理面「刷新凭据」使用;数据面自动刷新、模型发现与额度观测继续
沿用原有门禁。放开后原代码「只有 ready 能进入刷新」的前提失效,同步
修正三处连带问题:

- 临时失败与启动失败不再无条件写回 ready,改为写回进锁时的原状态,
  避免一次 503 把状态未知的凭据洗白并放回调度
- 残留 refreshing 归一为 outcome_unknown 再参与恢复,避免界面长期
  显示正在刷新
- 版本复用分支增加认证状态与运行时一致性确认,版本变大不再单独作为
  刷新成功的依据

调度排除、状态展示、失败分类与额度同步入口均保持不变。

Closes #571

* fix(subscription): 修正手动恢复的运行时确认与错误归属

Review 发现放开人工恢复后遗留两处边界:

- ensureRuntimeMatchesDurableSecret 依赖 ReconcileGroup 修复运行时,
  但后者只比较持久化配置,不含 auth_state。运行时版本已是最新、仅
  认证状态落后时会被判定为无需变更并返回成功,账号实际仍不可调度。
  改为先定向同步认证状态,并在返回成功前重新确认版本与状态一致
- 失败分支把用于持久化的历史错误码直接用于 API evidence,异常账号
  重试遇到网络失败时会报告旧的认证问题,残留 refreshing 的
  refresh_interrupted 还会落到需要重新授权的兜底映射。持久化继续
  沿用原状态与原错误码,evidence 改为依据本次失败分类生成

新增两个用例:版本相同仅认证状态落后时经真实 ReconcileGroup 修复;
原状态明确失效或残留 refreshing 时本次网络失败报告为结果未知。
2026-09-07 09:49:55 +08:00
..