5.5 KiB
5.5 KiB
Codex rollout 历史合并修复计划
目标
让 cc-web 持久化消息成为当前会话的权威顺序;Codex native rollout 仅补充更早历史,按 turn 聚合助手输出,并通过稳定消息标识完成历史合并与前端去重。
合并契约
- 持久化快照中去掉
ccwebPersistenceNotice后的消息保持原有顺序,是当前会话的权威尾部;native 只能补充快照之前的消息。 - 快照压缩时保存
historySnapshotBaseIndex(cc-web 逻辑消息索引)与historySnapshotCount;只按首条稳定 ID 别名或完整时间戳和内容摘要确认 native 边界,禁止用数值基线直接切 native。 - 合并顺序固定为:native 更早消息 → cc-web 持久化消息 → 当前运行中的消息;相同稳定 ID 只保留 cc-web 消息,ID 冲突且内容不一致时以持久化消息为准并记录告警。
- native 缺失、解析异常、边界无法确认或合并结果不能证明快照尾部完整时,返回 cc-web 快照,不把未经确认的 native 消息插入当前视图。
session_info、resume_session_result、session_history_chunk均调用同一解析结果;分页只对该结果切片。
稳定标识契约
- 消息已有
id始终保留;新增用户消息保留clientMessageId,缺失时生成并持久化 UUID。 - Codex App 助手消息:使用
codexAppTurnKey,其输入为 session/thread/turn 的稳定字段;旧消息缺失时从对应运行状态或时间戳生成一次并保存。 - native rollout 助手消息:使用
nativeTurnKey,由 threadId + turnId/turn_context 组成;同一 turn 跨刷新保持一致。 - 跨对话回传:保留
replyToRequestId(兼容crossConversation.replyRequestId),同时生成reply:<requestId>作为稳定消息 ID;来源元数据始终保留。 - 其他历史消息按
message:<role>:<timestamp>:<sha256(content)>降级,避免数组下标去重;ID 冲突时以权威来源和较完整内容决胜。
Turn 聚合契约
- 以
turn_id、turn_context.turn_id、turn_context.id或 session/thread 上下文组成 turn key;缺失时使用相邻事件窗口的稳定 fallback key。 - 同一 turn 内按 rollout 文件顺序合并文本片段、工具调用与工具结果;只有遇到新 turn、下一条真实用户消息、turn 完成/失败事件或文件结束才 flush。
- tool call/result 绑定同一调用 ID;空 turn 不产出气泡;跨对话内部 user 回传不作为普通 user 消息插入。
前端契约
- 服务端先输出规范化消息序列;前端渲染层按
message.id/messageId/nativeTurnKey/codexAppTurnKey/replyToRequestId形成稳定键。 renderMessages、分页 prepend、reconcileRenderedSessionMessages均按稳定键去重,索引仅用于定位/排序兼容;同键内容更新应替换原 DOM,不追加新气泡。- 实时消息与历史消息竞态时,以服务端规范化消息为准,保留当前用户消息与对应助手回复邻接关系;跨对话回传显示来源标识,角色保持 assistant。
可验收测试矩阵
- 历史合并:无 native、无快照、完全重叠、native 仅更早、快照尾部用户消息、native 异常/边界不明回退快照;断言顺序、长度、稳定 ID。
- rollout 聚合:同一 turn 多个 message/tool/result 仅一条 assistant;下一用户消息 flush;turn 完成/失败 flush;内部回传不生成 user 气泡。
- 稳定 ID:重复加载/刷新/分页 ID 不变;clientMessageId、codexAppTurnKey、replyToRequestId 去重;冲突以持久化消息为准。
- 前端回归:session_info/resume/history chunk 重复到达不追加;实时流与历史同时到达不拆泡;来源标识和当前生成消息同时可见。
- 浏览器实测:重载运行会话时用户原问题、架构回复、子对话来源标识、当前生成消息均按逻辑顺序可见。
步骤
- [complete] 盘点服务端、rollout、持久化与前端消息链路
- [complete] 设计并实现稳定消息标识与 native 历史合并
- [complete] 聚合 Codex rollout 的同一轮助手输出
- [complete] 调整前端规范化历史渲染与稳定 ID 去重
- [complete] 增加历史合并和 rollout 聚合回归测试
- [complete] 运行静态检查、单测和浏览器/集成验证并收尾
约束与决策
- 保留工作区已有未提交改动,不覆盖
lib/ccweb-mcp-server.js与scripts/ccweb-message-reply-unit.js。 - 不把未确认的 native 消息插入当前 cc-web 快照;合并失败时返回快照。
- 回传消息保留来源标识,不能伪装成普通用户气泡。
- 所有可观测失败记录简短告警,不阻断当前会话展示。
错误记录
| 错误 | 尝试 | 处理 |
|---|
2026-09-21 反馈修订
- [complete] 收紧历史边界并补齐解析、前端稳定标识
- [complete] 补齐结构化快照元数据及安全迁移入口
- [complete] 运行历史、重连回归与必要浏览器验证
- [complete] 检查旧会话迁移条件及服务重启条件
- [complete] 重建 CentOS 7 发布包并烟测
- [complete] 提交全部修改并推送
修订约束:不以 historySnapshotBaseIndex 直接切 native;只确认快照首条的可靠边界,不要求尚未进入 rollout 的最近消息也匹配。ID 别名优先,完整时间戳与内容摘要次之;未确认则只保留快照。目标旧会话只在 idle 且原文件未变化时备份和原子迁移。用户要求不再审计,本轮仅做实现与必要回归。update_plan 工具当前未提供,以本计划和 CSV 同步跟踪。