Repository navigation
fix(chat): keep metadata recovery after handled native tool errors - #8448
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: model_agent; GPT-6; OpenAI; self_reported
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
使用个人管家的用户,在旧回复的委派格式被拒绝后等待原服务自动补办。旧版把已结束的中间工具失败误判为容量未知;新版允许现有 worker 继续一次受限格式修复。现有 discovery/reply worker 自动取得原请求、完成一次格式修复并返回真实委派回执,原答复保留且业务未重放。本改动不执行接收者业务,也不证明历史业务已经完成或真实服务已经采用。真实服务的安装采用与历史原消息的实际回传仍需独立验收。一次工具失败已经被模型处理完毕,用户仍一直等不到原委派继续,这个停顿有明确的现场与旧版反例;需要修复容量证据的判断,而非要求用户重新发送任务。
改动思路 / Approach
复用既有原生终态规则,消除容量观察与结果读取对同一终态的重复判断。本 PR 只修正原生容量观察及其正负向和原 worker 回归,不新增状态、入口或恢复权限。原生适配器负责读取稳定轨迹和额度,Core 的类型化规则继续检查原受众、授权、停止、队列与次数。容量观察自身只调用读取 RPC。对照不修改、另建重试分支和复用现有规则三种方式,最后一种直接修正已证实的卡点,且不增加运行成本或另一套状态。
具体改动 / Changes
规范:docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md,spec_revision cffb53fe46ea57bae5394cd633bf98f71af93d3a。按原规范的三个实质条件映射:native-settled-terminal 已实现,使用同一执行身份、稳定轨迹和普通最终答案;one-format-review 已实现,现有 worker 只生成一次相关格式修复并保留原答复;unknown-keeps-pending 已实现,未知终态、新输入、停止或撤权仍不能产生委派。
关键代码讲解
_step_allows_completed_turn 已有的判定允许已结束的中间工具失败,但最终答案本身必须成功结束,可见原生错误仍拒绝。此 PR 直接复用它,没有另增枚举或可写状态。
metadata_review_capacity 只替换了中间步骤的判断。前后轨迹一致、非空且相同的执行身份、普通最终答案和新鲜额度读取都保留。该函数返回的是容量证据,不能代替原请求的授权和无重复效果证明。
test_completed_invalid_metadata_uses_one_original_format_review 的新增用例经过真实 discovery、四槽回复执行器、Core 队列和回执读回;原生模型与消息服务是合成边界。它断言原 Turn、事件、正文和收件人保留,并拒绝把格式修复写成业务重放。
对主干的风险 / Risks
最强反例是未结束的工具或可见原生错误被误当成正常完成。定向矩阵覆盖 RUNNING、GENERATING、WAITING、缺失状态、混合执行身份、错误最终步骤和缺少正常停止标记;它们都保持等待,且观察器没有生成或取消调用。相关完整回归还覆盖 source 变化、停止、撤权、未知发送、崩溃恢复和额度等待。本改动增加的是正确的正例,不替换这些独立门禁。
基线反例还证明:旧规则会接受步骤均为 DONE、但存在用户可见原生错误的轨迹;共用终态规则会拒绝它。这是按原规范修正的另一项有意行为差异,不将“拒绝更严格”本身当成兼容性证明。
PASS:677 related tests passed in 837.75s; final worker-completion fence is covered by the final paired head rerun.。同一最终合成夹具在旧生产条件下得到 5 failed, 8 passed in 23.50s,固定 head 得到 13 passed in 8.57s。standard premerge 的 6 项直接检查和 2 项 catalog 检查通过。最初 vocabulary 检查因新工作目录缺少 TypeScript 依赖而失败,补齐依赖后在相同代码树重跑通过;未改预算或删除检查。按当前 Goal 策略未查询 CI。
我的整体评价 / Verdict
没有阻塞性发现。long_horizon improved:已结束的工具失败不再把后续恢复永久卡在容量未知。user_experience improved:原服务可沿原消息继续,无须重复输入任务。复用既有原生终态规则,消除容量观察与结果读取对同一终态的重复判断。本 PR 只修正原生容量观察及其正负向和原 worker 回归,不新增状态、入口或恢复权限。未修改渲染界面;容量观察和原 worker 使用原有消息呈现。真实安装与历史业务完成不属于源码回归的证明范围。当前是可独立验收的修复增量,真实服务采用和历史回传仍须分开读回;不以测试通过冒充接收者业务完成。
English verdict: APPROVE — head 380095f; no blocking findings. Shared native terminal semantics and original-worker regressions pass; deployment and historical business completion require separate acceptance.
原生会话已经正常生成最终答案时,一次已处理的工具失败仍会让容量观测返回未知状态,导致旧请求的元数据格式修复持续等待。
容量观测改为复用现有的 completed-turn 终态规则:允许已经结束的中间工具失败,拒绝带用户可见原生错误的轨迹,继续要求同一执行身份、正常最终答案和稳定的原生轨迹。原消息、授权、停止、队列、格式修复次数与未知效果的检查保持各自原有职责。
新增回归覆盖中间步骤的成功、失败、取消、清理与未决状态,以及可见错误、执行身份混合和异常最终答案;一项集成回归通过现有 discovery/reply worker 验证原消息只补格式修复、保留原答复并且不重放业务。
验证:677 项相关测试通过,最终 head 的 13 项定向检查通过;同一合成夹具在旧生产条件下为 5 失败、8 通过。standard premerge 的 6 项直接检查与 2 项 catalog 检查通过;首轮缺少 TypeScript 依赖的失败保留,补齐后重跑通过。按当前策略未查询 CI。