Repository navigation
fix(chat): recover untouched historical routing failures - #7186
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; runtime_reported; reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
详细中文评审
动机
个人私聊 Bot 的用户在上游路由故障后,原请求可能一直没有业务结果。
同一会话先有未开始的路由失败,随后另一个请求完成:旧逻辑仍搁置前者,新逻辑核实原消息、当前权限和零执行记录后由原队列接续。
用户无需额外重发或确认;原 worker 可以自动接续经核验尚未执行的请求,并保留原失败通知及原会话结果。
已执行、部分回答、中断或效果未知的请求继续保留;本 PR 不重放这些工作,也不替 Bot 完成业务。
上线后的自然自动接续和实际原私聊业务结果仍须独立核验;本评审不把夹具成功当作全部生产积压已完成。
评审 head:7e40bd7094bca8271197c6e3e3461b5dcbf5cbfc;base:5b94c82c6b737ccbaced9ded4f98587cdb2b1595。验收依据是修改前的 docs/reference/protocols/manager-evidence-and-continuity-v0.md,spec_revision 5b94c82c6b737ccbaced9ded4f98587cdb2b1595,具体检查 REC-1 原请求和当前权限、REC-2 未知效果不重放、REC-3 原身份幂等与崩溃恢复、REC-4 原受众和受保护权限。它们都沿现有调用路径验证;这次文档补充不作为自身正确性的独立证明。
改动思路
沿用既有 provider 读回与 Core 准入责任,只放行可证明尚未执行的请求;更小的单独文本修复仍会让历史请求搁置。
本次边界是路由执行前失败的自动接续;效果未知的业务、上线采用和自然原受众结果继续分别验收。
不做修改会让已确认未执行的请求长期搁置;只增加诊断文本匹配,仍不能越过历史读回对最新位置的要求。这里沿用原私聊回复 worker、原生记录读取和 Core 的准入,不增加专用调度器、消费者或状态库。完整枚举原生 Turn 和目标执行项,且两次终态观察一致,才返回已有格式的证据;原消息及权限还须在真正入队前重新核验。
| 原生事实 | 当前 head 的结果 |
|---|---|
| 历史路由失败,仅一个原始用户输入 | 原 worker 可按现有退避与最多三次的策略接续 |
| 最新路由失败,用户输入与原生压缩记录 | 保留现有允许路径 |
| 历史压缩、回答、工具、纠正、未知项、部分增量或活跃状态 | 不接续,保留原失败与待核对事项 |
具体改动
_routing_discovery_timeout 增加两条固定的 workspace routing discovery failed 原生诊断,与既有 timed-out 诊断共用错误归类。它要求 codexErrorInfo=other 和完整文本相等;额外前后缀、策略错误及未知文本没有被放开。旧字段中的 timeout 名称保留兼容含义,没有升级为一般重试授权。
failed_request_readback 从完整原生列表推导目标是否最新,并在返回前丢弃这个局部事实。历史失败只允许原始用户输入;压缩记录的例外仍只适用于最新失败。所有 Turn 必须终态,项目、管家、原 source、当前 grant、idle Session、响应增量和三次上限仍由原 Core 检查。原 failed Turn 不改写,新接续使用已有稳定身份和原 Session 队列。
两个测试文件分别覆盖原生分页、反序和晚到未知项,以及真正经过 stdio 读取的原 worker 闭环。后者没有直接注入“恢复成功”的证据:先制造原失败,再完成独立请求,经新的 worker 自动取证、接续、回传并重启复核;同时检查原失败通知和原 Turn 字节不变。文档同步用中英文说明新的默认行为和不能恢复的边界。
对主干的风险
最大风险是把已执行或已改变的请求再次执行。新增测试对历史压缩、工具、活跃 Turn、策略错误、原文变化和本地增量均要求不产生接续;原有测试继续覆盖撤销授权、来源不匹配、unknown effects、部分发送和崩溃。保留既有错误与回执,失败不会被伪装成业务完成。普通相同 worker 的最新失败规则、额度恢复、上下文迁移和原有私聊展示沿用原路径。
完整恢复回归 574 项通过;其中包含新增 14 个原 worker 场景,另有 71 项聚焦原生读回/诊断检查。把不可变 base 的读回恢复到同一个真实 worker 夹具,两种 Bot 都因原 Turn 未接续而失败;修复后这些场景通过。首次夹具因其合成 Codex home 不存在而失败,补建隔离目录后重验,未修改产品兜底或放宽断言。准确提交的标准 premerge 为 6 项直接检查和 14 项选定检查通过,Ruff、编译、RFC 配对及公开边界检查通过。按当前合同不查询 CI。
合成模型和消息 provider 不能证明生产业务质量;只读真实原生宿主观察只确认目标的零执行记录,没有启动模型或恢复线程。安装、原服务自然补办和原受众最终结果另行核验。没有 UI、持久格式、Core 决策或权限迁移;回滚这两个 provider 函数即可恢复旧资格判断。
我的整体评价
本次是可独立验收的恢复增量,当前 head 无阻塞发现,支持按既有授权合并。生产改动集中在两个既有函数,140 行增加中大部分属于验证和中英文约束说明;没有为一次失败建立新框架。原有回执格式和调用者保留是实际持久恢复兼容需要,局部 latest 标记由现有事实推导而不持久化,维护成本与问题相称。
沿用既有 provider 读回与 Core 准入责任,只放行可证明尚未执行的请求;更小的单独文本修复仍会让历史请求搁置。
本次边界是路由执行前失败的自动接续;效果未知的业务、上线采用和自然原受众结果继续分别验收。
本次只修改原生路由故障识别和执行记录读回;检查了既有私聊回传路径,没有修改页面、组件、布局或消息渲染。
未新增网页截图;安装后的真实业务内容与原受众结果另行验收。
这是默认自动恢复资格的明确改变,不能描述成纯观察或已清空全部积压。后续仍由原 Bot 执行业务,保留所有部分、失败和未知结果,直到原会话真实回传得到核验。
English verdict: APPROVE — 7e40bd7094bca8271197c6e3e3461b5dcbf5cbfc repairs exact routing-diagnostic recognition and historical user-only recovery through the original worker. Source/grant, no-effects, bounded-attempt, immutable failure and original-audience readback guards remain enforced. 574 recovery tests and committed-head 6+14 premerge checks passed; CI was not consulted. Production adoption and uncertain interrupted business work remain separately unverified.
A private Chat request could remain stranded after a routing discovery failure: the provider’s
workspace routing discovery faileddiagnostic was treated as a generic host gate, and a later completed request prevented the original worker from recovering an untouched earlier request.This recognizes the exact failure variants and allows historical routing recovery only when complete native readback proves exactly one original user item. Native compaction remains eligible only on the latest failure. The existing Core admission, source/grant revalidation, original Session queue, stable continuation identity, backoff and three-attempt limit remain the owners. Failed Turns and original notices are retained. Work with answer/tool/correction/unknown items, response deltas or interrupted effects stays pending.
验证 / Validation:
变更 / Change: 修复路由诊断漏识别及未开始的历史请求无法由原 worker 自动接续的问题;严格保留未知效果、原权限、失败历史和原受众送达核验边界。