3.1 KiB
3.1 KiB
ccweb 未路由通知阻塞修复计划
目标
修复 Codex App 子线程通知在进程恢复后无法路由、反复同步扫描全部会话文件并占满 Node.js 主线程的问题,恢复 ccweb HTTP 可用性并防止复发。
阶段
Phase 1:建立任务上下文并固化根因与验收标准
Status: complete
Phase 2:补充可复现的失败回归测试
Status: complete
Phase 3:实现线程路由索引与恢复逻辑
Status: complete
Phase 4:限制未路由通知的磁盘扫描与日志风暴
Status: complete
Phase 5:运行定向回归测试并修正问题
Status: complete
Phase 6:执行完整回归与静态检查
Status: complete
Phase 7:审查变更与运行风险
Status: complete
Phase 8:安全重启并验证本地/外部访问
Status: complete
验收标准
- 恢复后,父线程及子线程通知均能通过内存索引命中,不对每个 delta 同步扫描全部会话 JSON。
- 未知 threadId 的高频通知采用有界、缓存或节流策略,不造成日志风暴和单核持续 100%。
- 回归测试覆盖恢复态子线程路由、未知线程负缓存/节流和现有通知路由行为。
- 定向回归、完整回归和语法检查通过。
- 重启前确认除当前会话外没有其他 running 会话;满足条件才重启。
- 重启后本地 8002 健康响应,CPU 回落且日志不再持续刷未路由通知。
决策
- 不通过增大 Node.js 堆上限掩盖问题。
- 优先建立 O(1) threadId 路由索引,并在恢复
codexapp-state.json时重建子线程映射。 - 为真正未知的通知增加负缓存/节流,避免重复全量磁盘扫描与逐条日志。
- 保留用户已有未提交改动,不覆盖无关文件。
错误记录
| 错误 | 尝试 | 处理 |
|---|---|---|
strace 附加进程被系统拒绝 |
1 | 改用实时 CPU、HTTP 探针、日志频率和代码调用链交叉定位 |
codebase-memory search_graph 返回 Transport closed |
1 | 索引状态此前为 ready,但运行时传输关闭;按项目降级规则改用已确认的 qualified_name 与 rg/sed 精确读取 |
| 更新计划文件时上下文定位失败 | 1 | 重新读取当前文件结构后使用更精确的补丁上下文 |
| 首个实现代理在检索阶段长时间无补丁 | 1 | 中止该轮后复用同一代理,禁止 MCP,提供精确状态形状并收敛为本地 TDD 补丁任务 |
| 第二轮实现代理写入补丁后未及时结束回报 | 1 | 中止代理并由主线程接管语法、定向与完整回归验证 |
| 首次读取运行中 app-server 的本地 MCP token 使用了错误环境变量名 | 1 | 只列出环境变量键名确认实际为 CC_WEB_CODEX_APP_MCP_TOKEN,未输出 token 值,并成功完成会话状态检查 |
planning-with-files 完成检查首次报告 0/0 phases |
1 | 计划阶段原为中文编号列表;已改为检查脚本可识别的标准阶段标题与状态字段 |
计划审查
- 独立计划审查代理已通过,无阻断性问题。
- 执行时显式记录测试命令、预计修改位置和重启前运行会话检查结果。