# 标题历史定位时间线:进度 ## 2026-07-27 - 已读取 `planning-with-files` 与 `todo-list-csv` 技能全文。 - 已运行 session catchup;未发现需要接管的未同步计划。 - 已检查 Trellis 工作流、当前任务与工作区状态;为避免干扰并行工作,采用独立 scoped planning 目录。 - 已确认用户给出的核心交互:标题历史进入定位列表,但标题项不可点击。 - 用户补充日期时间线:按天显示横线气泡,只显示日期,不显示时分秒;同样为只读节点。 - 第一次独立计划审查要求明确时区、横线气泡形态与跨天边界;已按“浏览器用户本地时区 + 本地 23:59/00:01 回归”修订。 - `home-cc-web` 代码索引已确认 ready;Trellis 相关规范目前未提供额外项目约束。 - 第二次独立计划审查已通过;阶段 1 完成,进入前后端链路定位。 - codebase-memory 已定位 `setCurrentConversationTitle()`、`handleRenameSession()`、`buildUserOutlineItems()`、`updateUserOutlinePanel()` 及现有 `assertSetTitleMcpContract()` 回归入口。 - 初步数据设计:会话新增标题事件数组;事件包含标题、时间戳和调用时消息索引,前端与用户消息按索引合并;日期从用户消息时间派生。 - 已确认 session_info、snapshot cache、实时 session_renamed 和分批历史渲染都需要同步标题历史;定位节点可复用既有 agent divider 的横线视觉。 - 阶段 2 完成:确定使用 `titleHistory[{ title, changedAt, messageIndex }]`;`messageIndex` 表示事件发生前已持久化的消息数量,时间戳负责日期与异常回退。 - 进入阶段 3:先补纯函数、静态契约与 MCP 集成失败回归,再写实现。 - 并行后端审计完成并与本地结论一致;明确拒绝把未生效/手动/系统标题写入本次定位时间线。 - 已新增 `title-history-outline` 专项回归和全量集成断言;首次运行在缺少 `normalizeTitleHistory` 处按预期失败(exit 1)。 - 阶段 3 完成,进入后端标题事件持久化与 session_info/实时事件传输实现。 - 后端已实现事件清洗、最近 100 条裁剪、仅 changed 追加、session_info 恢复与实时 `titleEvent` 推送;专项回归已越过后端断言并按预期停在缺少前端 helper。 - 阶段 4 完成,进入定位列表标题/日期时间线与样式实现。 - 前端已实现浏览器本地日期格式化、消息/标题稳定合并、只读 DOM、横线日期气泡、实时事件刷新与 snapshot cache 恢复。 - `node --check`(server/app/regression)和 `title-history-outline` 专项回归通过;阶段 5 完成,进入全量集成验证。 - 全量 `npm run regression` 通过并输出 `Regression checks passed.`;再次运行语法检查与 `git diff --check` 均为 exit 0。 - 运行会话 MCP 查询超时;本机降级检查发现除当前 `91b7...` 外,另有 `745d...` 会话于 15:38 收到用户消息且常驻服务高负载,无法证明无其他 running 会话,因此未重启 ccweb。 - codebase-memory 变更影响检测 transport closed;此前函数级检索结果和本地全量回归有效,已记录但不重复失败调用。 - 阶段 6 完成,进入最终代码审查与临时跟踪清理。 - 最终 diff 审查确认:标题/日期输出均转义,只有消息节点使用按钮与 `data-target`;旧会话默认空历史;MCP unchanged/invalid/manual-lock 均不产生伪事件;缓存版本已同步。 - 最终状态:7 个阶段全部完成;保留 scoped planning 记录,删除本任务 TODO CSV。服务重启因另一条活跃会话被明确暂缓。 - 下一步:审查计划,并通过 codebase-memory 定位前后端链路。 ## 2026-07-29 - 用户确认落地“标题作为章节标题,显示在触发用户消息上方”的调整。 - 已读取 `planning-with-files` 与 `todo-list-csv` 技能全文,运行 session catchup 并恢复上轮上下文。 - 已建立“调整标题定位锚点”六步计划及同名 TODO CSV;保留其他任务的 active plan 与未跟踪 CSV。 - codebase-memory 索引状态为 ready(4176 nodes / 8942 edges),已定位 `setCurrentConversationTitle()`、`normalizeTitleHistory()`、`buildUserOutlineTimelineItems()` 和 `updateUserOutlinePanel()`。 - 根因确认:后端保存调用时消息总数,前端以 `messageIndex * 2 - 1` 排序,导致标题位于触发用户消息之后。 - 设计确定:新增 `anchorMessageIndex`,保留 `messageIndex` 原语义;旧事件回退到事件之前最近的用户消息,日期继承锚点消息时间。 - 首轮独立计划审查未通过:要求明确锚点字段契约、实时/缓存/重载传输路径及对应回归。 - 已补充 `anchorMessageIndex` 的零基索引、合法范围、与 `messageIndex` 的优先级、锚点不可见降级规则,以及实时和重载一致性验收;等待复审。 - 第二轮独立计划审查已通过;阶段 1 完成,进入标题前置、旧历史、跨午夜及实时/重载传输失败回归编写。 - 已补充专项纯函数与 MCP 集成断言;首次专项回归在“后端应保留合法触发消息锚点”处按预期失败(exit 1)。 - 阶段 2 完成,进入后端 `anchorMessageIndex` 归一化、生成、实时返回与重载持久化实现。 - 后端已生成最近用户消息零基锚点,并在 normalizer 中仅保留合法整数且早于事件位置的锚点。 - 专项回归已越过后端断言,在“标题应位于触发用户消息之前”处按预期失败;阶段 3 完成,进入前端排序实现。 - 前端 normalizer 已保留合法 `anchorMessageIndex`;时间线优先精确锚点,旧历史/不可见锚点回退到事件前最近可见用户消息,并继承锚点日期。 - `title-history-outline` 专项回归通过;阶段 4 完成,进入语法检查与专项复核。 - `node --check`(server/app/regression)与专项回归复核均通过;阶段 5 完成,进入全量回归和最终差异审查。 - 最终收紧异常索引边界后,重新运行三项语法检查和 `title-history-outline` 专项回归,全部通过。 - 最终全量 `npm run regression` 在 60 秒超时约束内完成,exit 0,输出 `Regression checks passed.`;`git diff --check` 通过。 - codebase-memory 最终影响检测 transport closed,未重复调用;本地函数级 diff 确认本次只涉及标题锚点、前端排序及对应回归,其他在途工作区改动保持原样。 - 阶段 6 完成,准备清理本次临时 TODO CSV;随后按项目规则复查运行会话并处理此前未完成的服务重启。