Skip to content

[Desktop/Chat][P2] inbox 重连游标须识别服务重建后的序列重置 #81

Description

@jiayuqi7813

触发与范围

桌面聊天保持连接时,inbox 游标属于当前服务进程的内存 broker。服务重新创建 broker 后,seq 从 0 开始;客户端重连仍传旧 appliedSeq,snapshot 只取两者最大值且不处理 0。服务事件循环又按这个旧 after 过滤新 seq,后续侧栏更新可能持续被压住,直到新序列超过旧水位。

按 P2 重连恢复追踪。2026-09-30 的原 hook 和纯 InboxBroker 隔离验证已确认该合同不一致;没有真实重启、SSE/HTTP 请求、桌面 profile、审批或用户数据丢失。本项是 desktop-owned inbox adapter 的游标/连接范围恢复;内存 broker 与服务过滤代码作为最小合同依赖,不要求本轮修改 Web、后端或业务功能。

分层合成证据与保护对照

客户端 fixture 原样运行 useConversationThreads、inbox admission 与 attention helpers,使用内存 apiFetch/EventSource/定时器。较高水位后触发合成断线,原重连 URL 保留旧 after;新的低水位 snapshot 不重置它。向客户端 admission 单独送一个低 seq 合成 probe,该 probe 被判旧,待办不更新。

低 seq probe 是独立客户端逻辑探针,不是实际服务已发送的 frame。 原 handler 源码也会在投递前过滤这些 seq,因此不能从这份 fake EventSource 记录声称真实网络交付或端到端重启事故已复现。

生产端条件由另一 fixture 单独核验:按文件直接加载原纯 InboxBroker,源码只依赖 Python 标准库,未初始化应用/router/manager。旧 broker 形成较高游标,新建 broker 从 0 开始;相同旧 after 的原 events_after 不返回低于或等于旧水位的新事件,超过后才返回。原 handler 的完整 cursor/过滤源码另存为静态合同证据,没有调用该处理器。

保护对照:同一 broker 重连的新 seq 正常接受;fresh hook/after=0 正常接收新 broker 第一条事件;已关闭旧 EventSource 的迟到回调被原 guard 拒绝。完整合成行、broker 输出、hook 列表/回调、原函数与哈希仅存本地 ignored artifact。

根因与影响边界

broker seq/ring 在内存且没有 epoch 标识;客户端将 seq 当作跨服务实例连续的水位。低 snapshot 与旧 resume cursor 没有明确的重置/重取合同,服务和客户端两侧的旧值过滤共同压制新事件。

重连 snapshot 仍可显示当时的完整侧栏,因此问题不是必然白屏。影响是 snapshot 之后的待办、未读和运行状态更新可能缺失;真实持续时间、事件数量与桌面 UI 未测,不能声称消息永久丢失、数据被删除或工具错误执行。主聊天的持久事件序列属于另一合同,不能把 inbox 内存 seq 的结果推广到它。

桌面优化与验收

  • 将 inbox 游标绑定到已确认的服务/broker epoch 或等价的重置合同;新实例被确认后,重新建立适用的新游标与去重范围。
  • 当前合同若检测到新 snapshot 游标回退,应明确恢复/重取,并确保下一连接不继续传失效 after。保持同实例重复事件和旧连接回调的既有拒绝。
  • 同类双层 fixture 中,新 broker 的首条更新可在恢复后生效,无需积累到旧水位;同 broker 重连、重复事件、旧流回调对照继续正确。
  • 在可弃置桌面环境另做真实服务重启验收,仅用合成聊天;分别记录 producer、transport 和 consumer,避免把人工 frame 注入当实际网络证据。确认身份的要求继续由原服务认证合同独立执行。

去重与源码

#37、#38、#67 分别处理提示、停止竞争和决定投递;#78 为服务认证入口。本条为进程重建后的序列归属,既不是身份绕过,也不是旧 REST 覆盖新列表的快照 admission 根因。关联 Epic #31。

固定公开源码用于导航;本次原模块与静态合同均保存当前哈希:useConversation、conversationInbox、InboxBroker、conversation API 合同。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions