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

6.5 KiB
Raw Blame History

标题历史定位时间线:进度

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