Repository navigation
fix(chat): retain native image reads in interrupted answer review - #8206
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 (host observation unavailable)
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
APPROVE:没有发现阻断问题。结论针对 9c4ac1cf77706dc2352ced247fea8b3698fd48ce 的完整差异;这是一次可独立采用的补答修复,不能据此宣布全部历史业务完成。
动机 / Motivation
管家在原问题处理中读过图片、随后服务重启时,用户可能只收到失败通知。
旧版把已知的图片读取条目当作未知清单,拒绝已有的受限补答;新版让原回复 worker 在原有资格检查通过后补回答案。
同一组冻结输入在旧版复现两处图片补答失败,在本 head 通过;原 worker、Core 队列及 Lark 回传的合成旅程只产生一次受限补答。
本改动不重跑业务、不替用户补做旧素材,也不把合成回传当成所有历史消息已完成。
历史素材的未知效果、原执行者后台证明和真实业务完成仍分别保留,须由原 Bot 及原接收 Agent 沿原会话补齐。
改动思路 / Approach
原生条目分类属于已有 Codex provider;将同一组被动条目集中在此处,避免三个读回分支漂移,Core 继续独占恢复资格和队列预留。
当前 PR 只修复重启后的图片补答分类,并为原有完成工作读回保留行为;不增加状态、协议、CLI、模型路线或执行者。
不修会留下可复现的漏答;只在第三份字面量里添值虽更短,却继续保留三个分类来源。这里共享一个已有 provider 内的不可变集合,仍保留两类读回函数:完成工作需要原执行者的后台及效果证明,重启补答只可进入受限的只读复核。二者的授权和效果条件没有合并。原回复 worker 读取原问题和原生清单,Core 核验来源、本人、grant、Stop 与额度后预留同一 review-1;派发前再次核验摘要,最后由原 worker 回传。
| 同一冻结输入 | 基线 3a0c960 | 本 head 9c4ac1c |
|---|---|---|
| 中断前读图,随后补答 | 两处正向用例失败 | 单元及原 worker 回传通过 |
| 已完成工作后出现已关联读图 | 已通过 | 保持通过 |
| 未知图片类型、只有图片无效果、后台/信号/失败效果 | 保持拒绝 | 保持拒绝 |
这张表是已执行对照;没有新增用户确认、复制问题、导航或配置步骤。完整合成旅程覆盖实际 Core、store、队列和回复 worker;原生模型及 Lark 网络端为测试替身。
具体改动 / Changes
验收依据是改动前已接受的 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md,spec_revision 3a0c9608cc068cebcdeadf45217be8b5e4196341,其中“A steward answer interrupted by service restart”定义这次既有恢复边界。新增 RFC 说明接受图片的原因,并不是用新文案反过来证明实现。
关键代码讲解
_READ_ONLY_ITEM_TYPES集中四个已有原生被动类型。imageView只表示读图,不计入业务效果个数,也不提供业务已成功的证据。这个值原先已在完成工作读回中使用;没有新 Core 词汇或公开协议。interrupted_result_readback在原来遗漏的分支复用该集合。仍要求唯一原用户、至少一个终态效果、没有最终答复、全部 Turn 终态及重复全量读取一致。图片路径等完整元数据进入摘要,变化、重复、外国 Turn 和未知类型仍拒绝。对应 restart-stable-inventory:implemented,冻结正反例和完整 Chat 回归验证。completed_work_readback的原 Turn 与已关联后续 Turn 只做等价替换。信号、超时、失败文件/MCP、后台和冷读取缺少原执行者证明仍阻断续办。基线已支持后续图片,最初“后续图片也失效”的假设被实测否定,未算作新修复。
未改动的 _checked_answer_review 在执行前复查原来源和清单,且 execute_turn 拒绝 proposals、委派和 unfinished_work 等业务动作。对应 restart-no-business-replay:implemented。原回复路径对原失败 Turn、失败通知和实际产物字节的保留,以及同一预留的未知入队响应采用,对应 restart-original-return:implemented。原 worker 的图片变体使用生产分类函数,不以固定“可以恢复”的 mock 代替它。
对主干的风险 / Risks
最强反例是误把带效果的未知条目当成被动读取,从而重复执行业务。实际差异只有已知 imageView,没有通配匹配;图片不满足终态效果计数,未知 futureImageView、图片变化、只有图片没有效果、原消息改变及 Stop 均维持拒绝。原 worker 回归还覆盖清单变化、禁止复核动作和丢失入队确认,保留旧失败与产物,重复对账不再次发送。
PASS:相同冻结八例在基线为 2 FAIL / 6 PASS,本 head 8 PASS;三份测试文件 SHA 在签名 head 再次核对一致。PASS:三个相关模块 628 项,与八例重叠,不相加。PASS:精确 head 的 standard premerge 6 直接 + 11 选中检查、Ruff、编译、双语、公开边界及可维护性,无提高预算。全局 runtime check 另有两个外部 canonical Goal 不可用,其失败保留,未冒称总检查通过;六个文件的公开扫描独立通过。按当前策略不查询或等待远端 CI。
语义与 CI 对齐
candidate_decision 为 reuse_existing:复用 provider 原生 DTO 分类;Core 枚举、资格、持久化、队列和账户路线均未改。自动语义清单对 frozenset 载体不覆盖,零条目不能证明没有语义影响;本次以完整差异、三个调用分支、基线/本 head 对照及语义词汇检查完成该范围的判断。没有新 feature flag 或 default-off 声明,也没有自动加载的指令变化。直接回退此集合改动可恢复旧分类,不需要删历史、重置预算或重新派发。
我的整体评价 / Verdict
long_horizon:improved,原问题可沿原队列取得一次有用答案,消除了已知图片引发的长期阻塞,同时保留未知效果的恢复所有者。user_experience:improved,已有意图与授权下增加零轮必要交互,原回话就是答案入口。所检查的 codex_adapter.py、原回复 worker 与 Core 仅改变原生条目分类,没有修改任何渲染界面或消息布局。真实历史问题的后续模型答案与业务完成尚未在本 PR 验证。
共享原有 provider 分类是合比例的最小修复;不需要兼容分支、迁移或新执行器。仍须由安装者正常采用,并由原 Bot 核验历史问题的真实答案和回传;原执行者后台效果证明缺失的材料不能因此放行。Reviewer 的主机执行身份探测不可用,以上身份是 self_reported,不冒充运行时证明或独立人类审批。
English verdict: APPROVE for the bounded native-image answer-recovery correction at 9c4ac1c; live historical business completion remains unverified.
A native
imageViewbefore a service restart was treated as an unknown item, so the existing restricted answer review could not return the original question’s answer. Reuse the passive Codex item classification already accepted by completed-work readback, while preserving full inventory digests, original-source checks, terminal effects, the one-review queue reservation and the no-business-replay boundary.The related refactor shares only the existing provider-local DTO kinds; there is no new Core vocabulary, setting, executor, account route or visible UI. Both RFC translations describe the boundary.
Validation:
Unknown native items, changed images, foreign or duplicate items, live work, original signal/timeout failures and missing original-worker background proof remain held. Synthetic providers establish the implemented path; live historical business completion still requires its own original-source result and readback.