Repository navigation
fix(chat): allow verified history reads to finish - #8103
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
…ad-deadline-20261105T081042007 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)
未发现阻塞本改动的缺陷。主干已有一项无关 canary 失败,下面保留其归因与独立验收;完整 premerge gate 没有被标成通过。
动机 / Motivation
打开原会话并继续发消息的 App/Chat 用户遇到了一个真实的恢复失败。当历史页或读完后的来源复核耗时超过 5 秒但仍有效时,旧版会把原历史丢为不可用;当前版本允许 30 秒内完成并恢复输入。同样的 5.2 秒慢响应能展示完整历史与完整报告,输入区恢复可用。
本 PR 不承诺消除服务端延迟,也不声明历史消息业务全部完成或管家已通过持续稳定性验收。服务端时延、初始来源发现与队列观察各自保留原责任边界,持续稳定性继续由既有维护工作验收。这是一项可独立采用和回滚的恢复增量,用户无需重建会话、重发已有上下文或增加一次确认。
改动思路 / Approach
截止时间属于现有前端读取适配层;完整历史、来源授权和取消仍复用原所有者,没有增加状态或并行恢复机制。本 PR 的边界是有效慢历史的只读恢复;后端性能、业务补执行与最终回传分别沿既有所有者继续。原会话身份、来源权限、完整消息前缀与分页摘要仍由原来的 Core 与读取适配层核验。等待更久不能替代这些核验,尤其不能在读完后省略 fresh source 检查。
最强反对理由是:延长超时不能解决后端慢,也会延长服务失效时的等待。这里有独立证据支持这个有限边界:只延长历史页的对照仍在末尾来源复核处失败;统一历史链路后,真实原会话才可完整读回。提前取消继续生效,写入和执行路径没有接到新的恢复逻辑。
具体改动 / Changes
没有独立书面规格;本 PR 中的可复现故障与三条验收要求是评审依据,未编造 RFC 条目。审查版本为 5efb043e3d8809dd4e9fac137a3984197d8578db,当前 base 为 aa82591fb0a129f3ea9cc5e67343e742899c7ccd,整个 diff 为三个文件、+64/-6;新增回归复用已有 HTTP/SQLite/Core harness,未引入第二套存储或消费者。
关键代码讲解
fetchChatSessionHistory(L1058) 把页读取截止时间改为共享的 30 秒,同时保留调用方 AbortSignal。原 Session/Turn、每页偏移、完整前缀摘要及重复消息检查仍逐项执行,部分结果不能成为完整快照。原消息展开和队列输入读取都沿用这个函数;队列编辑调用方的显式短截止时间继续优先。fetchChatHistory(L1210) 在读取前与发布前继续查询原来源,并统一使用历史读取的截止时间。只修分页不足以修复这条路径;这次补上末尾复核的实际慢响应回归。既有历史 hook 继续决定失败后的重试和输入可用性,没有新授权或重放路径。
已检查 bound、managed、直接原 Turn 及队列编辑读取等现有调用,接受的消息内容、分页顺序、拒绝与撤权语义都保持原契约。默认变化明确为历史读取 5 秒到 30 秒;初始绑定发现、队列观察和显式调用方短截止时间维持原边界。
对主干的风险 / Risks
PASS:当前精确版本的 Chat bundle、类型检查、原会话真实 HTTP 回归及完整历史回归通过。5.2 秒历史页、5.2 秒读完后的来源复核均保留完整消息;50ms 调用方取消仍拒绝。旧主干数据所有者在相同新增测试下丢失历史,得到 actual [] 与 expected 两条原消息的断言失败,因此测试并非只复述新实现。
PASS:拒绝已撤权、已关闭、失效来源、旧服务忽略选择器以及游标/前缀冲突;读取不创建替代 Session 或 Turn。打包界面在相同慢响应下恢复完整报告和可输入状态,截图使用合成数据,公开附件也已独立读回。
FAIL(独立归因):标准 premerge 的五项直接检查通过,catalog 为四项通过、一项失败。todo-readmodel-boundary-smoke.py 在不可变 base 与当前 head 都因 loopx.status.open_todo_items 缺失失败,相关源码逐字相同,本 PR 不改变其因果路径。该失败未被删除或改限额;当前历史、来源和取消不变量已有独立通过证据。按当前评审策略,它不构成本 PR 的实现阻塞,合并资格仍单独检查。CI 按 Goal 的 wait_for_ci=false 未查询、未等待,也未推断远端状态。
剩余风险是读取失效时可能等待至 30 秒,以及服务端时延本身仍未达成持续验收。原超时与重试 UI 保留,超过上限继续显示失败,不把延长等待说成性能提升或整个管家修复完成。
我的整体评价 / Verdict
结论为 justified_increment:这条恢复路径已通过真实调用边界和前后反例验证;长期工作维持原会话、原承诺和原执行者,用户体验在有效慢响应场景得到改善。改动复用现有读取所有者,没有加入新的权威状态、协议或默认启用开关,规模与已验证故障相称。
已检查 14 条中英混合合成历史的失败首屏与恢复首屏,并读完代表性长报告;恢复后内容与输入成为可用的主要交互区域。未新增窄屏布局验收;本次没有改动响应式规则、样式或折叠交互。持续运行稳定性及安装后状态不由这些截图证明。完整 premerge 的既有失败继续保留,服务端与原业务后续仍按原责任边界验收。未观察到需要本 PR 立即再拆分或新增机制的理由。
English verdict: APPROVE 5efb043. Valid slow original-history reads recover with fresh source checks and caller cancellation preserved. Focused real-path regressions pass; an independently reproduced unchanged base canary failure and separate merge readiness remain disclosed.
Goal And Delivered Outcome
原会话恢复给历史分页及读完后的 fresh source 复核设置了 5 秒交互时限。忙碌服务的有效慢响应因此被判成读取失败,完整历史无法展示,页面持续恢复并禁止发送。现在这条只读恢复链路统一使用每次 30 秒截止时间。
main。Author Declaration
76cc8d0d6515691105538863340e89f00551e05c。fetchChatSessionHistoryfetchChatHistorySelf-check:已读完整 diff、既有分页/来源契约及相关调用;没有扩大写入、执行、存储或权限语义。
Scope And Continuation
本次完成历史恢复截止时间的一致性修复。它复用现有只读路径,兼容 bound 与 managed Session;后端读取时延与持续稳定性继续沿既有维护工作验收。该边界可独立验证和回滚,不声明整体性能提升。
Validation
5efb043e3d8809dd4e9fac137a3984197d8578db,已合入最新队列修复作为依赖后重新验证。tsc --noEmit、Python 编译、diff hygiene、RFC mirror 检查smoke:bound-conversation:真实 HTTP/SQLite/Core,延迟历史页、延迟末尾来源复核、提前取消和 steward fallback 原身份smoke:conversation-history:完整分页、来源/前缀冲突、晚到修订、缺失快照恢复与零读取侧写入/Turntodo-readmodel-boundary-smoke.py因已有loopx.status.open_todo_items缺失失败,基线同样失败,相关实现不在本 diff 中。完整 gate 未标为通过Coverage:30 秒为每个读取请求的上限;更长服务故障仍应可见。没有把单次实机恢复、合成延迟回归或安装前验证作为持续稳定性验收。预合并诊断的既有失败保留,不通过修改测试/策略消除。
Frontend / Visual Evidence
UI impact: changed(恢复失败与可继续输入的既有状态);布局、样式与响应式规则沿用现有实现。
Before:旧 5 秒恢复实现,打包界面、真实隔离 HTTP/SQLite 后端、14 条中英混合合成历史、1440×1000。该恢复逻辑在当前 base 中保持相同。
After:
5efb043e3d8809dd4e9fac137a3984197d8578db的打包界面与同一类真实隔离后端,5.2 秒延迟后完整报告可读,输入区可继续发送;截图中的草稿仅用于检查按钮,未发送。1440×1000。Attention/craft:对话和完整报告仍为主要阅读区;错误与重试入口保持可见,没有增加字段、提示段落或卡片。已读完代表性长报告,并检查失败与恢复状态。窄屏布局未变;未声明新增响应式覆盖。临时预览随测试后端结束而关闭。
Type of Change
LoopX Area
Technical Direction
Operator surface and IM integration:保持原会话与原业务执行所有者,修复只读恢复。
Shared-authority RFC fixture impact
N/A:未迁移控制面或变更 shared authority、provider routing、持久化协议。
Boundary Checklist