73 lines
3.1 KiB
Markdown
73 lines
3.1 KiB
Markdown
# 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 | 计划阶段原为中文编号列表;已改为检查脚本可识别的标准阶段标题与状态字段 |
|
||
|
||
## 计划审查
|
||
|
||
- 独立计划审查代理已通过,无阻断性问题。
|
||
- 执行时显式记录测试命令、预计修改位置和重启前运行会话检查结果。
|