Repository navigation
fix(chat): recover replies completed between queue observations - #8204
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
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 · OpenAI gpt-6.1-sol · runtime_reported · max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
未发现当前提交的阻塞性问题。旧版本实际失败已保留,并据此补齐了迟到正文的读取路径;这是可用的恢复增量,不能据此关闭安装及采用验收。审阅提交:be9bec80fe89dfd76035ded1945250d8a741305b,基线:7f521ff4505fa916a98a7401032922189eef414a。
动机 / Motivation
在运行中的会话继续发送消息的用户,会遇到排队结果暂时不可见的问题。原回合结束后,两条排队请求可能已经完成,但页面错过事件流且没有看到活动回合变化,只能重新打开会话才能看到答复。本次验证中,两条原会话答复在队列消费后自动出现,各一次,未发送草稿保留,未增加 Turn 提交。本 PR 不证明真实模型效果、物理中文输入法、安装态或跨端采用,也不授予合并或安装权限。真实宿主与安装态、物理 macOS 中文输入法及外部会话双端采用仍沿已有验收继续。这项修复的价值在于让已经完成的工作留在原对话中可读,避免用户把显示迟到误判为请求未执行,从而反复重新打开或重新发送。
改动思路 / Approach
把结果补入原有历史读取路径,比再增加一个轮询器或前端队列更小,也保留同一会话的身份、附件和流式去重。本 PR 只补齐队列消费和迟到正文的只读投影;原生执行、权限和安装采用仍由既有 owner 负责。持久队列清空并不证明最后一条正文已经进入当次快照,所以只在队列变化时刷新一次仍有缺口。本次继续复用既有紧凑索引和修订观察:它读取原 Session 的正式消息,沿与初次历史相同的合并规则补正文。没有新增轮询周期、执行驱动或手动同步状态;真实源身份仍由现有后端确认,观察失败仍归原读取恢复入口。
具体改动 / Changes
规范是 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md,spec_revision 7f521ff4505fa916a98a7401032922189eef414a,以其接受矩阵为审阅依据,未用本补丁重写验收标准。
| criterion_id | 当前处理 |
|---|---|
| Acceptance | implemented:保持同一请求重试及单执行者,后端未改;真实IO回归及最终3次原始提交读回支撑。 |
| Scope | implemented:原 Session/Turn/message 身份合并,迟到或另一会话不能取得当前流控制。 |
| Stream | implemented:保留pending流式行,按源身份去重,重复读回不增加答案。 |
| Correction/stop | implemented:原生ledger只有一次指向原回合的中断,后续两轮完成;键位与队列TS回归通过。 |
| Result | implemented:旧7f显示0/2、167偶尔1/2,修复后3个独立原生用例均自动2/2,新增迟到正文回归通过。 |
| Packaging | deferred:打包浏览器已验,真实安装及宿主/模型仍由既有维护者与运行时验收继续,未发明新任务。 |
关键代码讲解
reconcileConversationReturns只给已退出流式显示的排队助手占位行补正式正文,要求非空且精确相同的Turn,并保留未知身份、其它会话和正在输出的原文。reconcileConversationHistory先复用上述元数据规则,再按Session/message去重并追加缺失正文。现有索引观察也调用它,故刷新后没有占位行的原生答案仍能进入原上下文,不必假造新的协作回执。conversationHistoryMessage合并原先两处消息构造,保存实际源身份、附件、回复上下文和角色。队列观察回调仍只刷新现有history;当前活动Turn的恢复和控制没有交给这份本地投影。
全量差异是7文件、125增45删;4个生产TS文件与3个验证文件,无新模块、协议版本或迁移。Python测试只去掉未使用绑定,原副作用调用与随后抛超时均保留。内部回调随同一前端部署,不能据此声称新增了持久兼容模式。
对主干的风险 / Risks
最强反例是队列已空、后端保存2条答复、页面仍只有1条。167的绿色用例没有排除它,故没有继承批准。匹配的真实HTTP/store/native测试保留了旧0/2及1/2失败;修复后3个新隔离Session均为2/2、原始3次Turn提交、仅一次原回合中断、草稿保留。最终打包回归进一步让队列和历史先空闲,再写入答案,不依赖占位行、SSE或后续导航。
PASS:最终构建、8项键盘/队列TS、历史与输入/回传回归、必需Ruff、类型检查、配置内strict mypy;118项后端回归来自167,此后生产后端无差异,最终联合用例补证集成。精确CQR为cqr_29103732f413a044ffa6 valid;premerge为5项直接及8项选中检查、0失败。客户端503重试沿用未变的读取owner和已注明版本的合成负例。未查询或等待CI,也未从未知CI推断通过。
语义与 CI 对齐
本修复复用现有类型和语义owner;新增的是本地读取投影,不是第二个队列authority。没有opt-in/default-off声称,因而不虚构关闭态开关;非排队、未知源及实时流分支仍受原有精确身份保护。没有新权限、模型默认、调度、配额或自动加载Agent指令,恢复只读原记录,不重放业务。
我的整体评价 / Verdict
交付判断是justified_increment,long_horizon与user_experience均为improved:已接受工作可以持续返回原对话,普通任务没有增加说明、选择或确认轮次;未主张完整成本或注意力指标提升。桌面与390px中,两条完成答复和主输入框均直接可见;失败状态保留原位重试,长消息沿既有展开入口读取。真实模型、物理 macOS 中文输入法、安装 App 和外部会话双端采用尚未验证。代码规模与缺口相称;局部投影共享比增加新状态和观察器更直接。当前结论是作者账户的COMMENTED回退,仍需独立审阅及各自合并/安装权限,不能替代真实模型或安装采用结果。
English verdict: APPROVE — The bounded original-conversation recovery is verified at this head; broader host and installation acceptance remains open.
排队回合可能已经完成,但页面错过事件流或过早读到空闲队列,正式答复仍未显示,用户只能重新打开会话。
当前实现同时覆盖队列变化与后续正文修订:从原 Session 读取历史;已有排队占位消息只接纳精确 Session/Turn 的答复;刷新后已没有占位消息时,现有紧凑索引观察也会将迟到的原生正文补入。初次历史与后续读取共用 TypeScript 消息投影,保留附件、回复上下文和流式去重,没有增加队列、轮询器或执行 authority。
测试提交
be9bec80fe89dfd76035ded1945250d8a741305b,基于7f521ff4。这是原恢复提案的继续修复,没有关闭更广的聊天与采用验收。验证
7f521ff4显示0/2条已保存回复,首轮167f1a45偶尔显示1/2,重新打开均能看到2条。保留了这些失败;首轮绿色用例没有覆盖正文晚于队列清空的竞态。attached-host-follow-up通过,明确覆盖队列已空、历史已加载且占位/SSE已退出后,正式答复才到达的情况;不再导航或重发。生产源码相同的修复版本上,composer-session-admission和conversation-return-continuity亦通过。167f1a45通过;此后生产后端未变,最终真实UI/后端联合用例补证集成。Dashboard/Chat构建、control-plane类型检查、配置内17文件strict mypy与必需Ruff通过。额外一行测试清理保留先提交副作用再抛超时的原行为。cqr_29103732f413a044ffa6:valid/pass,7文件,0 blocker/warning/advisory。最终标准 premerge:5项直接检查、8项选中检查,0失败、0人工hold。未查询或等待CI;独立评审和分支策略另行验收。当前首屏
本提交打包UI、真实owning backend、隔离合成native peer;全部消息与工作区均为合成内容。正式结果与主输入框直接可见,未添加排队成功横幅。测试中的Stop仅用于结束合成宿主故意保持的原回合,不是正常队列完成所需的新操作。
历史读取503的原位重试(
167f1a45客户端合成负例;该失败/恢复owner在本提交未变):首轮 a4093af 的修改前后与读取失败证据
测试版本
a4093afc262d15fa04dacc0e3299c65a9223c8b7,提交源码打包的浏览器界面,真实 owning backend 配隔离合成 native peer。全部消息与附件为合成内容。布局沿现有界面;正式答复补回原对话,主输入框与恢复入口保留;390px 正文可读,页面无横向溢出。失败和重试仍直接可见。修改前(
3a0c9608):原回合结束、队列已消费,正式回复未显示。此图与后面的恢复验证使用不同合成轮次,未作像素布局比较。修改后,1440px:丢失队列事件流后,从原会话补回正文,未发送草稿保留。
修改后,390px:
390px 读取失败与重试入口(注入一次客户端 503;真实 owner 恢复后重试成功):
边界与后续
已验证源码及打包浏览器;真实模型效果、物理macOS中文输入法、安装App、真实Codex宿主及外部会话双端采用仍沿已有验收继续。原始截图不作像素布局比较,旧版本图片保留其测试revision。未改真实用户会话,未安装、发布或合并;本提案不授予这些操作的权限。