5.2 KiB
5.2 KiB
Reflection: Agent Evolution Mode — 四阶段全流程
Date: 2026-06-03 | Severity: P0/P1 (multiple failures) | Recurrence: see individual patterns
Context
深度学习 ECC/Headroom/CodeGraph → 提取能力 → 增强 OpenClaw。4 Phase,16 模块,7,000 行,5h(预估 42.5h)。
Pattern Classes Extracted
PC-1: SQLite FK Constraint (P0) — Pattern Class: SQL FK/DELETE semantic
- Root Cause: INSERT OR REPLACE causes rowid change → FK breaks
- Fix: ON CONFLICT DO UPDATE preserves original rowid
- Future Trigger: any SQL schema modification, batch inserts with FK
PC-2: Heuristic False Positive (P1) — Pattern Class: single-signal detection
- Root Cause:
[2026-...prefix triggered JSON detection without valid parse - Fix: require 2+ signals (prefix + valid JSON.parse)
- Future Trigger: any heuristic/content-type detection logic
PC-3: Nested Structure Parsing (P1) — Pattern Class: protocol-level vs structural parsing
- Root Cause: parser relied on structured JSON nesting, failed on content arrays
- Fix: match "type":"tool_result" byte patterns instead of tree traversal
- Future Trigger: any nested data structure parsing
PC-4: Overly Aggressive Sampling (P2) — Pattern Class: lossy strategy without safety net
- Root Cause: TimeSeries strategy kept only anchor points (500→5), dropped errors
- Fix: include error/outlier detection alongside anchor selection
- Future Trigger: any sampling/compression strategy design
成功经验
1. "分析→设计→实现"三阶段分离
- 用 sub-agent 并行做源码分析(3 个 agent 同时跑,2-3 分钟完成 2,670 行分析)
- 分析完成后一次性设计 Evolution Plan,不做中间修改
- 实现阶段按优先级分 Phase,每个 Phase 内部模块间无依赖 → 可快速迭代
- 教训: 不要在分析阶段就开始设计,不要在设计中就开始编码
2. 先建 MVP,再扩展
- P0 三件套 (安全+压缩) 1.5h 上线,立即产生价值
- 验证了"Prompt Defense 不改代码"、"SmartCrusher 压缩率 60-95%"
- 后续 Phase 基于已验证的架构扩展
- 教训: 最小可验证单元 > 大而全的设计
3. 自给自足的依赖策略
@iarna/toml与 Node v26 不兼容 → 自写 230 行 TOML 解析器- 无 tree-sitter → 自写 8 语言正则解析器
- 无 Redis → SQLite WAL 共享后端
- 教训: 每个外部依赖都是风险点,自写核心无依赖模块反而更稳定
4. 测试驱动: 每个模块写完立即测
- 风险评分器: 7 个边界用例全覆盖
- SmartCrusher: 4 种策略各测一个场景
- Byte Surgery: 验证 SHA-256 前缀不变
- Budget: 验证 3K→9K→11K 的 ALLOW/WARN/BLOCK 阈值
- 教训: "写完再测" = 返工,"写完即测" = 一次通过
5. 演化思维: 模块可替换
- CCR Store: 接口统一,后端 InMemory/SQLite/Redis/Hybrid 可插拔
- CodeGraph: 正则提取器 → 可升级 tree-sitter
- 配置: TOML 解析器独立 → 可换完整 TOML 库
- 教训: 每个模块留升级路径,不锁死实现
失败经验
1. FK 约束错误: 32 个文件索引失败
- 原因:
INSERT OR REPLACE导致 file_id 变化,节点 FK 断裂 - 修复:
ON CONFLICT DO UPDATE保留原有 rowid - 教训: SQLite 的 REPLACE = DELETE + INSERT,不是 UPDATE。FK 约束下用 ON CONFLICT
2. 内容检测误判: 日志被识别为 JSON
- 原因:
[2026-06-03...以[开头触发了 JSON 检测 - 修复: 要求
[开头 + 有效的 JSON.parse - 教训: 启发式检测需要多重信号确认,单信号不可靠
3. Byte Surgery block 检测失败 (第一次)
- 原因: 解析器未处理嵌套 content 数组中的 tool_result
- 修复: 直接从字节流中匹配
"type":"tool_result"的 JSON 对象边界 - 教训: 协议级解析 > 结构化解析(后者依赖特定 JSON 结构)
4. TimeSeries 策略过于激进 (500→5)
- 原因: 仅靠锚点选择,未包含错误检测
- 修复: 在 planTimeSeries 中也加入 error/outlier 检测
- 教训: 每个策略的 fallback 必须先保证关键信息不丢失
设计的模式
Pattern 1: "阶段隔离"模式
分析阶段不写代码 → 设计阶段不改分析 → 实现阶段不改设计 每阶段输出物不可变,下一阶段只读
Pattern 2: "自包含模块"模式
每个模块:(1) 可独立运行 (2) 零外部依赖或可选依赖 (3) CLI + 库双接口
例子: risk-scorer.js 可 node risk-scorer.js '...' 也可 require('./risk-scorer')
Pattern 3: "策略分发"模式
检测 → 分析 → 推荐策略 → Plan → Execute → Mark SmartCrusher 5 策略、Router 4 策略、压缩 4 类型,都走同一模式
Pattern 4: "降级优先"模式
每个操作先尝试最优路径 → 失败则降级 → 保证不阻塞 CCR Store: Redis → SQLite → InMemory 压缩: lossless → SmartSample → passthrough 搜索: FTS5 → LIKE → 空结果(不报错)
下次改进
- 预检清单: 每个 Phase 开始前列出"容易踩的坑"(如 FK、编码、检测误判)
- 性能基准: 记录每个模块在大数据集下的性能(10万行 JSON、1万文件索引)
- 自动回归: 所有模块跑一次全量测试脚本