Files
cc-web/.planning/title-history-locator/progress.md

55 lines
6.5 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-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;随后按项目规则复查运行会话并处理此前未完成的服务重启。