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

46 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 完成/恢复生产路径专项回归结果
日期: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 条旧消息已经找回。