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