fix: stabilize session list and Codex imports

This commit is contained in:
shiyue
2026-07-30 18:06:39 +08:00
parent 21b10e3eb4
commit cc600bdf31
13 changed files with 1247 additions and 42 deletions

View File

@@ -0,0 +1,90 @@
# 进度记录:侧栏标题刷新风暴
## 会话2026-07-30
### 阶段 1确认索引与侧栏更新链路
- **状态:** complete
- **开始时间:** 2026-07-30 15:25 +08:00
- 已完成:
- 阅读用户截图并记录视觉现象。
- 扫描并启用 `planning-with-files``todo-list-csv` 技能。
- 执行会话恢复检查,未发现未同步上下文。
- 完成 Trellis 会话初始化检查,发现当前任务仍指向一项旧主题任务。
- 将用户关于“不要按猜测调查”的约束写入调研记录。
- 计划文档通过独立子代理审查。
- 确认 `home-cc-web` 代码索引就绪,初步定位 `renderSessionList`
- 读取 `renderSessionList` 完整源码并追踪入站调用,确认每次调用都会清空并重建整个列表。
- 核验 `handleServerMessage``session_list``session_message` 均会无条件全量重建侧栏,流式文本事件不会直接重建。
- 追踪服务端列表发布链路:完整列表无去重/节流,且子代理状态更新是广播入口之一。
- 建立子代理更新闭环:每个 child 增量都会无条件广播完整 `session_list`,前端随后整段替换侧栏。
- 确认 child 增量每次都会改写父会话 `updated`,所以完整载荷去重不足;现有测试也未覆盖节点身份稳定性。
### 阶段 2复现并定位高频重绘根因
- **状态:** complete
- **开始时间:** 2026-07-30T07:35:21.137Z
- 下一步:
- 已通过代码调用链确认子代理与普通消息均可能触发全量替换。
- 已确认服务运行指标正常,排除服务进程阻塞。
### 阶段 3回归测试与修复
- **状态:** complete
- **开始时间:** 2026-07-30T07:43:47.002Z
- 已完成:
- 创建独立 Trellis 任务、PRD、根因研究文件及 implement/check 上下文。
- 新增 DOM 级失败回归,旧实现按预期失败于“仅 updated 变化仍清空列表”。
- 新增结构签名缓存和相对时间原位刷新,实现节点身份与点击监听器稳定。
- 新增服务端失败回归,旧实现缺少 child 更新合并并会逐次保存、逐次广播完整列表。
- 同一父会话 250ms 内复用待保存快照,尾随冲刷前重读最新会话;最终态立即保存。
- 合并 child 引起的完整列表广播,同时保留每次局部工具卡 WebSocket 更新。
### 阶段 4验证与交付
- **状态:** complete
- **开始时间:** 2026-07-30T08:10:22.442Z
- 已完成:
- 定向侧栏刷新回归通过。
- 侧栏折叠、会话工具提示、子代理卡片路由回归通过。
- `public/app.js``scripts/regression.js` 语法检查通过。
- `git diff --check` 通过。
- 完整 `npm run regression` 在 60 秒超时约束内通过。
- 服务端 child 更新合并定向回归通过,既有子代理卡片路由回归通过。
- 用户重启后暴露 `oldSessionCollapseKey` 漏解构;新增历史会话折叠分支回归先复现同一 ReferenceError再补回字段。
- 更新前端静态资源缓存版本;从运行中的 HTTP 服务确认新 index 与修复后的 app.js 已生效。
- 修正后定向回归、语法检查、diff 检查与 60 秒完整回归再次通过。
- 最终独立 diff 审查通过确认签名提交时机、sibling child 保留、缓存版本号和未定义变量均无阻塞问题。
- 重启后的运行态观察ccweb 同一 PID 在线CPU 约 0.6%,连续 HTTP 200 约 0.95.8ms;未读取敏感环境配置。
- 下一步:
- 无;服务端后续重启需先确认除当前对话外没有其他 running 对话。
- 创建文件:
- `.planning/sidebar-title-refresh-storm/task_plan.md`
- `.planning/sidebar-title-refresh-storm/findings.md`
- `.planning/sidebar-title-refresh-storm/progress.md`
## 测试结果
| 测试 | 预期 | 实际 | 状态 |
|---|---|---|---|
| 失败回归(修复前) | 仅 updated 变化不应再次清空 | 缺少结构签名/旧实现再次清空 | 预期失败 |
| 服务端失败回归(修复前) | child 突发合并保存与完整列表广播 | 缺少 `isFinalCcwebMcpChildStatus` 及批处理实现 | 预期失败 |
| 侧栏刷新定向回归 | 节点稳定且真实结构变化重建 | 通过 | ✓ |
| child 更新合并回归 | 3 次局部推送、1 次保存、1 次完整列表广播,最终态立即落盘 | 通过 | ✓ |
| 历史会话折叠失败回归 | 隐藏会话存在时应保留折叠键并正常渲染 | 修复前复现同一 ReferenceError修复后通过 | ✓ |
| 部分渲染失败恢复回归 | 首轮异常后再次渲染必须重建完整置顶/项目 DOM | 修复前失败;签名延后提交后通过 | ✓ |
| 共享 spawnToolId sibling 回归 | 同一工具下多个 child 最终状态都落盘 | 修复前第一个 sibling 丢失;按 threadId 去重后通过 | ✓ |
| 相关定向回归 | 折叠、提示、子代理路由无回退 | 通过 | ✓ |
| JS 语法与 diff 检查 | `server.js``public/app.js``scripts/regression.js` 无语法/空白错误 | 通过 | ✓ |
| 完整 regression | 全量回归通过 | Regression checks passed | ✓ |
## 错误日志
| 时间 | 错误 | 次数 | 处理 |
|---|---|---:|---|
| 2026-07-30T07:49:41.008Z | 误用执行单元等待接口 | 6 | 切换到 `collaboration.wait_agent`;实现任务未受影响 |
| 2026-07-30T07:49:41.008Z | 错误日志补丁再次因动态时间上下文不匹配 | 1 | 改为匹配稳定表头追加 |
| 2026-07-30T07:44:54.498Z | full-history fork 不能同时覆盖为 worker 角色 | 1 | 改用 `fork_turns: none`,通过磁盘 PRD 和 JSONL 注入完整上下文 |
| 2026-07-30T07:46:30.649Z | Default 模式下 `request_user_input` 不可用 | 1 | 不需要用户输入,停止调用并继续实现 |
| 2026-07-30T07:46:30.649Z | 错误日志补丁的动态时间上下文不匹配 | 1 | 读取稳定尾部后重新追加,未重复原失败补丁 |
| 2026-07-30T16:45:00+08:00 | `renderSessionList` 漏解构 `oldSessionCollapseKey`,用户重启后前台 ReferenceError | 1 | 新增实际隐藏会话分支回归复现,补回解构并更新缓存版本,完整回归通过 |