Skip to content

fix(chat): recover replies completed between queue observations - #8204

Merged
huangruiteng merged 5 commits into
mainfrom
codex/chat-source-continuation-20261106-173058
Nov 7, 2026
Merged

huangruiteng merged 5 commits into
mainfrom
codex/chat-source-continuation-20261106-173058

Conversation

@loopx-agent

@loopx-agent loopx-agent commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

排队回合可能已经完成,但页面错过事件流或过早读到空闲队列,正式答复仍未显示,用户只能重新打开会话。

当前实现同时覆盖队列变化与后续正文修订:从原 Session 读取历史;已有排队占位消息只接纳精确 Session/Turn 的答复;刷新后已没有占位消息时,现有紧凑索引观察也会将迟到的原生正文补入。初次历史与后续读取共用 TypeScript 消息投影,保留附件、回复上下文和流式去重,没有增加队列、轮询器或执行 authority。

测试提交 be9bec80fe89dfd76035ded1945250d8a741305b,基于 7f521ff4。这是原恢复提案的继续修复,没有关闭更广的聊天与采用验收。

验证

  • 同一真实 HTTP/store/native 协议路径的对照:基线 7f521ff4 显示0/2条已保存回复,首轮 167f1a45 偶尔显示1/2,重新打开均能看到2条。保留了这些失败;首轮绿色用例没有覆盖正文晚于队列清空的竞态。
  • 修复后3个独立隔离会话均自动显示2条 FIFO 回复,各一次;每个用例共3次 Turn POST,队列归零,未发送草稿保留,Stop只中断原回合。最后一次在本提交构建上执行,桌面与390px均可读。协议 peer 是合成宿主,使用真实 ChatHTTP、持久 store 与原生 subprocess。
  • 最终打包 attached-host-follow-up 通过,明确覆盖队列已空、历史已加载且占位/SSE已退出后,正式答复才到达的情况;不再导航或重发。生产源码相同的修复版本上,composer-session-admission 和 conversation-return-continuity 亦通过。
  • 历史 HTTP/store、Session/Turn隔离、流式保护、未知身份、幂等与输入恢复回归通过;最终键盘/队列 TS 8项通过。保留 Enter 排队、Shift+Enter 换行、Command+Enter 显式插入当前回合及闲置时普通发送、IME组合输入保护。
  • 118项真实IO/原生队列/steering及lost-response测试在 167f1a45 通过;此后生产后端未变,最终真实UI/后端联合用例补证集成。Dashboard/Chat构建、control-plane类型检查、配置内17文件strict mypy与必需Ruff通过。额外一行测试清理保留先提交副作用再抛超时的原行为。
  • 读取503的可见重试已验证;该history失败/恢复 owner未改变,故障截图沿用其已注明的合成客户端边界。
  • 精确质量回执 cqr_29103732f413a044ffa6:valid/pass,7文件,0 blocker/warning/advisory。最终标准 premerge:5项直接检查、8项选中检查,0失败、0人工hold。未查询或等待CI;独立评审和分支策略另行验收。

当前首屏

本提交打包UI、真实owning backend、隔离合成native peer;全部消息与工作区均为合成内容。正式结果与主输入框直接可见,未添加排队成功横幅。测试中的Stop仅用于结束合成宿主故意保持的原回合,不是正常队列完成所需的新操作。

Recovered native queue replies, 1440px

Recovered native queue replies and retained draft, 390px

历史读取503的原位重试(167f1a45客户端合成负例;该失败/恢复owner在本提交未变):

History read failure and retry, 390px

首轮 a4093af 的修改前后与读取失败证据

测试版本 a4093afc262d15fa04dacc0e3299c65a9223c8b7,提交源码打包的浏览器界面,真实 owning backend 配隔离合成 native peer。全部消息与附件为合成内容。布局沿现有界面;正式答复补回原对话,主输入框与恢复入口保留;390px 正文可读,页面无横向溢出。失败和重试仍直接可见。

修改前(3a0c9608):原回合结束、队列已消费,正式回复未显示。此图与后面的恢复验证使用不同合成轮次,未作像素布局比较。

Before: consumed queue without its saved replies

修改后,1440px:丢失队列事件流后,从原会话补回正文,未发送草稿保留。

After: recovered queue reply and retained draft, 1440px

修改后,390px:

After: recovered reply, 390px

390px 读取失败与重试入口(注入一次客户端 503;真实 owner 恢复后重试成功):

Queue read failure and recovery, 390px

边界与后续

已验证源码及打包浏览器;真实模型效果、物理macOS中文输入法、安装App、真实Codex宿主及外部会话双端采用仍沿已有验收继续。原始截图不作像素布局比较,旧版本图片保留其测试revision。未改真实用户会话,未安装、发布或合并;本提案不授予这些操作的权限。

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 loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:打包浏览器已验,真实安装及宿主/模型仍由既有维护者与运行时验收继续,未发明新任务。

关键代码讲解

  1. reconcileConversationReturns 只给已退出流式显示的排队助手占位行补正式正文,要求非空且精确相同的Turn,并保留未知身份、其它会话和正在输出的原文。
  2. reconcileConversationHistory 先复用上述元数据规则,再按Session/message去重并追加缺失正文。现有索引观察也调用它,故刷新后没有占位行的原生答案仍能进入原上下文,不必假造新的协作回执。
  3. 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.

@huangruiteng
huangruiteng merged commit ccea1cd into main Nov 7, 2026
29 of 46 checks passed
@huangruiteng
huangruiteng deleted the codex/chat-source-continuation-20261106-173058 branch November 7, 2026 07:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants