Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when testing Ralph's hat collection presets, validating preset configurations, or auditing the preset library for bugs and UX issues.
.claude/skills/mikeyobrien-evaluate-presets/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 125% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 83% | 0% |
Systematically test all hat collection presets using shell scripts. Direct CLI invocation—no meta-orchestration complexity.
Evaluate a single preset:
bash./tools/evaluate-preset.sh tdd-red-green claude
Evaluate all presets:
bash./tools/evaluate-all-presets.sh claude
Arguments:
.yml extension)claude or kiro, defaults to claude)IMPORTANT: When invoking these scripts via the Bash tool, use these settings:
timeout: 600000 (10 minutes max) and run_in_background: truetimeout: 600000 (10 minutes max) and run_in_background: trueSince preset evaluations can run for hours (especially the full suite), always run in background mode and use the TaskOutput tool to check progress periodically.
Example invocation pattern:
Bash tool with:
command: "./tools/evaluate-preset.sh tdd-red-green claude"
timeout: 600000
run_in_background: trueAfter launching, use TaskOutput with block: false to check status without waiting for completion.
evaluate-preset.shtools/preset-test-tasks.yml (if yq available)--record-session for metrics captureOutput structure:
.eval/
├── logs/<preset>/<timestamp>/
│ ├── output.log # Full stdout/stderr
│ ├── session.jsonl # Recorded session
│ ├── metrics.json # Extracted metrics
│ ├── environment.json # Runtime environment
│ └── merged-config.yml # Config used
└── logs/<preset>/latest -> <timestamp>evaluate-all-presets.shRuns all 12 presets sequentially and generates a summary:
.eval/results/<suite-id>/
├── SUMMARY.md # Markdown report
├── <preset>.json # Per-preset metrics
└── latest -> <suite-id>| Preset | Test Task | |--------|-----------| | tdd-red-green | Add is_palindrome() function | | adversarial-review | Review user input handler for security | | socratic-learning | Understand HatRegistry | | spec-driven | Specify and implement StringUtils::truncate() | | mob-programming | Implement a Stack data structure | | scientific-method | Debug failing mock test assertion | | code-archaeology | Understand history of config.rs | | performance-optimization | Profile hat matching | | api-design | Design a Cache trait | | documentation-first | Document RateLimiter | | incident-response | Respond to "tests failing in CI" | | migration-safety | Plan v1 to v2 config migration |
Exit codes from evaluate-preset.sh:
0 — Success (LOOP_COMPLETE reached)124 — Timeout (preset hung or took too long)output.log)Metrics in metrics.json:
iterations — How many event loop cycleshats_activated — Which hats were triggeredevents_published — Total events emittedcompleted — Whether completion promise was reachedCritical: Validate that hats get fresh context per Tenet #1 ("Fresh Context Is Reliability").
Each hat should execute in its own iteration:
Iter 1: Ralph → publishes starting event → STOPS
Iter 2: Hat A → does work → publishes next event → STOPS
Iter 3: Hat B → does work → publishes next event → STOPS
Iter 4: Hat C → does work → LOOP_COMPLETEBAD: Multiple hat personas in one iteration:
Iter 2: Ralph does Blue Team + Red Team + Fixer work
^^^ All in one bloated context!1. Count iterations vs events in session.jsonl:
bash# Count iterations grep -c "_meta.loop_start\|ITERATION" .eval/logs/<preset>/latest/output.log # Count events published grep -c "bus.publish" .eval/logs/<preset>/latest/session.jsonl
Expected: iterations ≈ events published (one event per iteration) Bad sign: 2-3 iterations but 5+ events (all work in single iteration)
2. Check for same-iteration hat switching in output.log:
bashgrep -E "ITERATION|Now I need to perform|Let me put on|I'll switch to" \ .eval/logs/<preset>/latest/output.log
Red flag: Hat-switching phrases WITHOUT an ITERATION separator between them.
3. Check event timestamps in session.jsonl:
bashcat .eval/logs/<preset>/latest/session.jsonl | jq -r '.ts'
Red flag: Multiple events with identical timestamps (published in same iteration).
| Pattern | Diagnosis | Action | |---------|-----------|--------| | iterations ≈ events | ✅ Good | Hat routing working | | iterations << events | ⚠️ Same-iteration switching | Check prompt has STOP instruction | | iterations >> events | ⚠️ Recovery loops | Agent not publishing required events | | 0 events | ❌ Broken | Events not being read from JSONL |
If hat routing is broken:
hatless_ralph.rs:HatInfo include instructions field?## HATS section?build_prompt(context) using the context parameter?## PENDING EVENTS section?After evaluation, delegate fixes to subagents:
Read .eval/results/latest/SUMMARY.md and identify:
❌ FAIL → Create code tasks for fixes⏱️ TIMEOUT → Investigate infinite loops⚠️ PARTIAL → Check for edge casesFor each issue, spawn a Task agent:
"Use /code-task-generator to create a task for fixing: [issue from evaluation]
Output to: .ralph/tasks/preset-fixes/"For each created task:
"Use /code-assist to implement: .ralph/tasks/preset-fixes/[task-file].code-task.md
Mode: auto"bash./tools/evaluate-preset.sh <fixed-preset> claude
brew install yqtools/evaluate-preset.sh — Single preset evaluationtools/evaluate-all-presets.sh — Full suite evaluationtools/preset-test-tasks.yml — Test task definitionstools/preset-evaluation-findings.md — Manual findings docpresets/ — The preset collection being evaluated| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | fail→fail | 5,113 | 3,893 | -24% | 1 | 1 | 0% | 1,051 | 2,658 | +153% | 0 | 0 | — |
case-07 | pass→pass | 7,488 | 2,646 | -65% | 1 | 1 | 0% | 1,456 | 2,433 | +67% | 0 | 0 | — |
case-08 | pass→pass | 12,114 | 5,343 | -56% | 1 | 1 | 0% | 2,623 | 2,996 | +14% | 0 | 0 | — |
case-11 | fail→pass | 9,009 | 1,947 | -78% | 1 | 1 | 0% | 1,520 | 2,302 | +51% | 0 | 0 | — |
case-12 | pass→pass | 18,854 | 2,091 | -89% | 1 | 1 | 0% | 1,510 | 2,210 | +46% | 0 | 0 | — |
case-09 | fail→pass | 9,200 | 1,301 | -86% | 1 | 1 | 0% | 1,560 | 2,152 | +38% | 0 | 0 | — |
case-13 | fail→pass | 5,672 | 1,598 | -72% | 1 | 1 | 0% | 938 | 2,112 | +125% | 0 | 0 | — |
case-14 | fail→fail | 10,013 | 5,644 | -44% | 1 | 1 | 0% | 1,744 | 2,257 | +29% | 0 | 0 | — |
case-10 | pass→pass | 5,199 | 1,193 | -77% | 1 | 1 | 0% | 831 | 2,110 | +154% | 0 | 0 | — |
case-15 | fail→pass | 4,041 | 1,817 | -55% | 1 | 1 | 0% | 852 | 2,295 | +169% | 0 | 0 | — |
case-01 | fail→fail | 14,255 | 6,256 | -56% | 1 | 1 | 0% | 1,519 | 2,232 | +47% | 0 | 0 | — |
case-02 | fail→pass | 11,548 | 3,168 | -73% | 1 | 1 | 0% | 1,322 | 2,425 | +83% | 0 | 0 | — |
case-03 | fail→fail | 4,760 | 4,553 | -4% | 1 | 1 | 0% | 334 | 2,149 | +543% | 0 | 0 | — |
case-04 | pass→pass | 7,455 | 5,841 | -22% | 1 | 1 | 0% | 1,209 | 2,923 | +142% | 0 | 0 | — |
case-05 | fail→pass | 10,805 | 3,122 | -71% | 1 | 1 | 0% | 1,933 | 2,497 | +29% | 0 | 0 | — |
case-16 | fail→pass | 7,102 | 3,063 | -57% | 1 | 1 | 0% | 1,232 | 2,121 | +72% | 0 | 0 | — |
case-17 | fail→pass | 11,310 | 1,766 | -84% | 1 | 1 | 0% | 1,897 | 2,212 | +17% | 0 | 0 | — |
case-18 | fail→pass | 10,794 | 4,025 | -63% | 1 | 1 | 0% | 1,799 | 2,604 | +45% | 0 | 0 | — |
case-19 | fail→pass | 9,086 | 1,753 | -81% | 1 | 1 | 0% | 1,673 | 2,192 | +31% | 0 | 0 | — |
case-20 | fail→fail | 25,446 | 4,759 | -81% | 1 | 1 | 0% | 1,109 | 2,190 | +97% | 0 | 0 | — |
case-21 | pass→fail | 11,695 | 5,321 | -55% | 1 | 1 | 0% | 2,454 | 2,132 | -13% | 0 | 0 | — |
case-22 | pass→fail | 7,418 | 3,480 | -53% | 1 | 1 | 0% | 1,388 | 2,059 | +48% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 19 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.