名称: evaluate-presets
描述: 用于测试 Ralph 的帽子集合预设、验证预设配置,或审计预设库中的错误和用户体验问题。
使用 Shell 脚本系统性地测试所有帽子集合预设。直接通过 CLI 调用,无需复杂的元编排。
评估单个预设:
./tools/evaluate-preset.sh tdd-red-green claude
评估所有预设:
./tools/evaluate-all-presets.sh claude
参数说明:
- 第一个参数:预设名称(不带 .yml 扩展名)
- 第二个参数:后端(claude 或 kiro,默认为 claude)
重要提示: 通过 Bash 工具调用这些脚本时,请使用以下设置:
timeout: 600000(最长 10 分钟)和 run_in_background: truetimeout: 600000(最长 10 分钟)和 run_in_background: true由于预设评估可能运行数小时(尤其是完整套件),请务必在后台模式下运行,并使用 TaskOutput 工具定期检查进度。
调用模式示例:
使用 Bash 工具,设置:
command: "./tools/evaluate-preset.sh tdd-red-green claude"
timeout: 600000
run_in_background: true
启动后,使用 TaskOutput 并设置 block: false 来检查状态,而无需等待完成。
evaluate-preset.shtools/preset-test-tasks.yml 加载测试任务(如果 yq 可用)--record-session 以捕获指标输出结构:
.eval/
├── logs/<预设名称>/<时间戳>/
│ ├── output.log # 完整的 stdout/stderr
│ ├── session.jsonl # 录制的会话
│ ├── metrics.json # 提取的指标
│ ├── environment.json # 运行时环境
│ └── merged-config.yml # 使用的配置
└── logs/<预设名称>/latest -> <时间戳>
evaluate-all-presets.sh顺序运行所有 12 个预设并生成摘要:
.eval/results/<套件ID>/
├── SUMMARY.md # Markdown 报告
├── <预设名称>.json # 每个预设的指标
└── latest -> <套件ID>
| 预设 | 测试任务 |
|---|---|
tdd-red-green |
添加 is_palindrome() 函数 |
adversarial-review |
审查用户输入处理程序的安全性 |
socratic-learning |
理解 HatRegistry |
spec-driven |
指定并实现 StringUtils::truncate() |
mob-programming |
实现 Stack 数据结构 |
scientific-method |
调试失败的模拟测试断言 |
code-archaeology |
理解 config.rs 的历史 |
performance-optimization |
分析帽子匹配性能 |
api-design |
设计 Cache trait |
documentation-first |
为 RateLimiter 编写文档 |
incident-response |
响应“CI 中测试失败”事件 |
migration-safety |
规划 v1 到 v2 配置迁移 |
evaluate-preset.sh 的退出码:
- 0 — 成功(达到 LOOP_COMPLETE)
- 124 — 超时(预设挂起或耗时过长)
- 其他 — 失败(检查 output.log)
metrics.json 中的指标:
- iterations — 事件循环的周期数
- hats_activated — 触发了哪些帽子
- events_published — 发出的事件总数
- completed — 是否达到完成承诺
关键点: 根据原则 #1(“新鲜上下文即可靠性”),验证每个帽子是否获得新鲜上下文。
每个帽子应在自己的迭代中执行:
迭代 1: Ralph → 发布起始事件 → 停止
迭代 2: 帽子 A → 执行工作 → 发布下一个事件 → 停止
迭代 3: 帽子 B → 执行工作 → 发布下一个事件 → 停止
迭代 4: 帽子 C → 执行工作 → 循环完成
不良情况: 单个迭代中出现多个帽子角色:
迭代 2: Ralph 执行蓝队 + 红队 + 修复者工作
^^^ 全部在一个臃肿的上下文中!
1. 在 session.jsonl 中统计迭代次数与事件数:
# 统计迭代次数
grep -c "_meta.loop_start\|ITERATION" .eval/logs/<预设名称>/latest/output.log
# 统计发布的事件数
grep -c "bus.publish" .eval/logs/<预设名称>/latest/session.jsonl
预期: 迭代次数 ≈ 发布的事件数(每次迭代一个事件)
不良迹象: 2-3 次迭代但有 5+ 个事件(所有工作都在单个迭代中)
2. 在 output.log 中检查同迭代帽子切换:
grep -E "ITERATION|Now I need to perform|Let me put on|I'll switch to" \
.eval/logs/<预设名称>/latest/output.log
危险信号: 帽子切换短语之间没有 ITERATION 分隔符。
3. 检查 session.jsonl 中的事件时间戳:
cat .eval/logs/<预设名称>/latest/session.jsonl | jq -r '.ts'
危险信号: 多个事件具有相同的时间戳(在同一迭代中发布)。
| 模式 | 诊断 | 措施 |
|---|---|---|
| 迭代次数 ≈ 事件数 | ✅ 良好 | 帽子路由正常工作 |
| 迭代次数 << 事件数 | ⚠️ 同迭代切换 | 检查提示词是否包含 STOP 指令 |
| 迭代次数 >> 事件数 | ⚠️ 恢复循环 | Agent 未发布所需事件 |
| 0 个事件 | ❌ 故障 | 未从 JSONL 读取事件 |
如果帽子路由损坏:
检查 hatless_ralph.rs 中的工作流提示词:
检查帽子指令传播:
HatInfo 是否包含 instructions 字段?## HATS 部分呈现?检查事件上下文:
build_prompt(context) 是否使用了 context 参数?## PENDING EVENTS 部分?评估后,将修复任务委派给子代理:
阅读 .eval/results/latest/SUMMARY.md 并识别:
- ❌ 失败 → 创建代码任务进行修复
- ⏱️ 超时 → 调查无限循环
- ⚠️ 部分完成 → 检查边界情况
针对每个问题,生成一个 Task agent:
"使用 /code-task-generator 为以下问题创建修复任务:[来自评估的问题]
输出到:tasks/preset-fixes/"
针对每个创建的任务:
"使用 /code-assist 实现:tasks/preset-fixes/[任务文件].code-task.md
模式:自动"
./tools/evaluate-preset.sh <已修复的预设> claude
brew install yqtools/evaluate-preset.sh — 单个预设评估tools/evaluate-all-presets.sh — 完整套件评估tools/preset-test-tasks.yml — 测试任务定义tools/preset-evaluation-findings.md — 手动发现文档presets/ — 正在评估的预设集合