Files
cc-web/.trellis/tasks/10-10-snapshot-history-pagination/research/completion-regression-result.md
shiyue 69b6db0f5b 修复完整会话历史与长气泡交互并更新 CentOS 7 发布包
提交当前工作区全部源码、回归脚本、任务记录及重新构建的 Bun baseline 发布包。发布单文件 MCP 初始化及前端资源一致性验证通过。
2026-10-10 23:40:16 +08:00

5.2 KiB
Raw Blame History

完成/恢复生产路径专项回归结果

日期:2026-10-10。负责范围:handleProcessComplete / recoverProcesses / Codex App 运行态 / 保存失败分支的生产函数行为回归,不改生产实现。

新增脚本

scripts/history-runtime-completion-unit.js:从 server.js 按函数边界抽取真实完成、恢复与失败分支函数,配真实 lib/session-history-store.js、真实 lib/agent-runtime.js 事件解析和临时目录执行;不复制实现、不读写真实会话、不启动外部进程。已注册进 scripts/regression.js 的 assertHistoryRecallContract 专项列表。

原有 13 项覆盖:

  • CLI 纯文本完成回合保持字符串内容形状,重开可读(防止 [object Object] 形状回归)。
  • CLI 混合内容块(含图片块)与 130 条纯工具调用完整归档。
  • CLI 完成保存失败时保留运行目录与 output.jsonl,done 标记 historySaved=false;存储恢复后由 recoverProcesses 恰好补齐一次。
  • CLI 清理失败时重复恢复按 runKey 去重,不重复入库。
  • Codex App 完整 turn 运行态先于预览保存(60 万字符正文与工具调用不裁剪),恢复恰好入库一次。
  • Codex App 会话暂不可读时保留 _history/_turns、run 目录与预览状态,恢复后恰好入库一次。
  • Codex App 损坏运行态文件保留,不误入库。
  • Codex App 完成路径 saveSession 失败时先保留完整运行态,恢复后恰好一条正文且不补中断提示。
  • 初次用户消息保存失败时不创建运行目录、不改写磁盘会话。
  • 跨会话回传保存失败保留 ready 重试机会,重试恰好一个气泡;崩溃重试按处理标记去重。
  • 子会话冲刷保存失败保留队列与有界重试标记,存储恢复后提交。
  • 任务看板元数据适配器按 ID 重读完整档案,只提交元数据,不接受截断对象覆盖 650 条历史。
  • Codex App steer 保存失败不调用 turn/steer。

新增两个完成入口读取失败回归(共 15 项):

  • CLI handleProcessComplete 的 loadSession 返回 null 时,真实完整归档保持原文,真实 run 目录与 output.jsonl 保留;应发送 session_load_failed、done.historySaved=false。恢复读取后,真实 recoverProcesses 恰好入库一次,成功提交后才清理。
  • Codex App handleCodexAppTurnComplete 的 loadSession 返回 null 时,真实完整归档保持原文,_history/_turns、运行态预览与输出文件保留;最新完整 turn 保持正文、工具和 completed 状态。恢复读取后,真实 recoverCodexAppTurnState 恰好入库一次,不误补中断提示。

两个用例通过损坏真实档案文件制造读取不可用(loadSession 收敛为 null):完成阶段断言归档未被重写、运行态保留;恢复阶段写回原档案后由同一存储实例补交;没有用 saveSession=false 替代读取故障,也不依赖跨 harness 桩函数。

验证结果

  • 原有 13 项在此前实现上通过;新增读取失败用例的修复前运行为 13 项通过、2 项失败,分别真实复现 CLI 运行目录被删除和 Codex App 完整 turn 被删除。日志 /tmp/ccweb-completion-load-null-before.txt。
  • 旧实现对照:timeout 60s node scripts/history-runtime-completion-unit.js --baseline-head,新增两个用例分别在 CLI 运行目录保留断言和 Codex App 运行目录保留断言上失败;它们进入真实完成函数后才失败,不依赖缺少新函数或新 writer 返回值复现。对照日志 /tmp/ccweb-completion-load-null-head.txt;当前共 15 项失败,预期失败清单包含新增两项。
  • 修复后 15 项最终结果:主线程改为“真实损坏档案 → 完成保护 → 修复档案 → 同实例恢复补交”后复跑 timeout 60s node scripts/history-runtime-completion-unit.js,15/15 通过(2026-10-10,日志 /tmp/completion-unit-fixed.txt)。
  • 最终全量回归:npm run regression,Regression checks passed(19:52:25→19:53:59),日志 /tmp/cc-web-regression-final-verify.log;运行前后 server.js、public/app.js、scripts/regression.js、scripts/mock-codex-app-server.js、lib/session-history-store.js、lib/agent-runtime.js、lib/codex-app-runtime.js 的 sha256 一致。
  • 此前全量回归:npm run regression,Regression checks passed;当次运行前后 server.js md5 均为 94fe21059863b9b1c7088c14d4743ed2,日志 /tmp/cc-web-regression-completion-2.log。共享源码后来继续变化,此结果不能代替最终树验收。
  • git diff --check、node --check 通过。

说明:首次全量回归(日志 /tmp/cc-web-regression-completion.log)在 scripts/regression.js:9622 出现 steer 超时,当时存在并发验收和共享源码修改;后续串行重跑曾通过。现有证据只支持“steer 时序失败”,没有充分证据把诱因归结为并发负载,也不能以一次复跑通过排除其他时序缺陷。

边界

以上均为临时目录与夹具验证;未读取或修改用户在另一客户端看到的真实会话,未重启生产服务,未部署。不能据此声称那 45 条旧消息已经找回。