# 会话结束后插入转新对话计划 ## 目标 当 Codex App 的上一轮已经结束、但页面或服务端仍把本轮视为可插入时,表单答案和普通跟进消息都应自动按新一轮对话处理;失败卡片点击“重试”也应真正发送,不能继续被“仅允许插入原 turn”拦截。 ## 阶段 1. [completed] 复现并定位会话结束后的发送与失败重试链路 2. [completed] 补充结束会话后重试自动新开对话的回归用例 3. [completed] 修复前端失败项重试与后端旧轮结束竞态 4. [completed] 运行定向测试、语法检查和完整回归 5. [completed] 复核差异并清理临时跟踪文件 ## 验收标准 - 会话结束后点击失败卡片的“重试”会启动普通新 turn,答案只进入一次历史。 - 发送时本地运行态落后于 app-server 时,不再把用户答案永久留在“插入失败”。 - 仍在运行的 turn 继续走 `turn/steer`,expectedTurnId 不匹配等真实错误不被错误降级。 - 普通文本和带附件的表单答案均有回归覆盖,且定向测试、语法检查和完整回归通过。 ## 约束 - 保留工作区中其他会话历史改动,不覆盖现有任务目录或 CSV。 - 代码定位优先使用 `codebase-memory-mcp`;FastCtx 只用于读取、编辑和验证本地文件。 - 不重启服务,除非重启前确认除当前会话外没有其他 `running` 会话。 - 新增注释和文档使用简体中文。 ## 错误记录 | 错误 | 尝试 | 处理 | |---|---:|---| | 表单回归读取到旧轮 done,导致提前检查新输出 | 1 | 等待携带新答案助手消息的 done 后再验收历史 | ## 收尾记录 - 完整回归 `npm run regression` exit 0;定向回归与三个单测脚本、语法检查全部通过。 - 独立后端审查新增 `scripts/codexapp-steer-recovery-unit.js`(5 项通过),覆盖 ready 等待期间旧轮结束、completion 先到、保存失败与错误分类。 - 部署:重启前检查到除当前对话外仍有 running 会话(`826deaa0`、`2f1134fe`),按约束暂缓重启;待其结束后执行 `pm2 restart ccweb --update-env` 生效。 - 临时跟踪文件:本任务 CSV 已按 todo-list-csv 流程清理。