Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Evaluate skills: trigger testing, A/B benchmarks, structure validation, head-to-head bake-offs.
.claude/skills/notque-skill-eval/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 96% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 83% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 108% | 0% |
Measure and improve skill quality through empirical testing — because structure doesn't guarantee behavior, and measurement beats assumption. Also covers head-to-head bake-offs of two peer implementations of the same artifact (Mode F).
| Signal | Load These Files | Why | |---|---|---| | reading or writing eval artifacts: evals.json, grading.json, metrics.json, history.json | schemas.md | Loads detailed guidance from schemas.md. | | improving a skill via variant generation and blind A/B promotion | self-improve-loop.md | Loads detailed guidance from self-improve-loop.md. | | "bake-off", "head-to-head", "compare implementations", "grade two versions", "which persona skill is better" | bake-off-methodology.md | Loads the bake-off rubric, anti-rationalization gate, fold-filter, and worked persona example. |
Step 1: Identify the skill
bash# Validate skill structure first python3 -m scripts.skill_eval.quick_validate <path/to/skill>
This checks: SKILL.md exists, valid frontmatter, required fields (name, description), kebab-case naming, description under 1024 chars, no angle brackets.
Step 2: Choose evaluation mode based on user intent
| Intent | Mode | Script | |--------|------|--------| | "Test if description triggers correctly" | Trigger eval | run_eval.py | | "Optimize/improve the description through autoresearch" | Route to agent-comparison | optimize_loop.py | | "Compare skill vs no-skill output" | Output benchmark | Manual + aggregate_benchmark.py | | "Validate skill structure" | Quick validate | quick_validate.py | | "Self-improve skill" / "optimize skill" / "improve skill with A/B" | Self-improvement loop | references/self-improve-loop.md | | "Bake-off" / "head-to-head grade these two" / "compare X vs Y implementation" | Head-to-head bake-off | references/bake-off-methodology.md |
GATE: Skill path confirmed, mode selected.
Test whether a skill's description causes Claude to invoke it for the right queries.
Step 1: Create eval set (or use existing)
Create a JSON file with 8-20 test queries. Eval set quality matters — use realistic prompts with detail (file paths, context, casual phrasing), not abstract one-liners. Focus on edge cases where the skill competes with adjacent skills.
Example of good eval queries:
json[ {"query": "ok so my boss sent me this xlsx file (Q4 sales final FINAL v2.xlsx) and she wants profit margin as a percentage", "should_trigger": true}, {"query": "Format this data", "should_trigger": false} ]
Why: Real users write detailed, specific prompts. Abstract queries don't test real triggering behavior. Overfitting descriptions to abstract test cases bloats the description and fails on real usage.
Step 2: Run evaluation
bashpython3 -m scripts.skill_eval.run_eval \ --eval-set evals.json \ --skill-path <path/to/skill> \ --runs-per-query 3 \ --verbose
This spawns claude -p for each query, checking whether it invokes the skill. Runs each query 3 times for reliability. Output includes pass/fail per query with trigger rates. Default 30s timeout; increase with --timeout 60 if needed for complex queries.
Constraints applied:
GATE: Eval results available. Proceed to improvement if failures found.
Automated loop that tests, improves, and re-tests descriptions using Claude with extended thinking.
bashpython3 -m scripts.skill_eval.run_loop \ --eval-set evals.json \ --skill-path <path/to/skill> \ --max-iterations 5 \ --verbose
This will:
claude -p to propose improvements based on training failuresWhy 60/40 split: Improvements should help across many prompts, not just test cases. Training on failures, validating on holdout ensures generalization.
Why report HTML: Visual reports enable quick review of which queries improved, which regressed, and what the new description looks like.
GATE: Loop complete. Best description identified.
Compare skill quality by running prompts with and without the skill.
Step 1: Create test prompts — 2-3 realistic user prompts
Step 2: Run with-skill and without-skill in parallel subagents:
For each test prompt, spawn two agents:
Why baseline matters: Can't prove the skill adds value without a baseline. Maybe Claude handles it fine without the skill. The delta is what matters.
Step 3: Grade outputs
Spawn a grader subagent using agents/grader.md. It evaluates assertions against the outputs.
Step 4: Aggregate
bashpython3 -m scripts.skill_eval.aggregate_benchmark <workspace>/iteration-1 --skill-name <name>
Produces benchmark.json and benchmark.md with pass rates, timing, and token usage.
Step 5: Analyze (optional)
For blind comparison, use agents/comparator.md to judge outputs without knowing which skill produced them. Then use agents/analyzer.md to understand why the winner won.
GATE: Benchmark results available.
bashpython3 -m scripts.skill_eval.quick_validate <path/to/skill>
Checks: SKILL.md exists, valid frontmatter, required fields (name, description), kebab-case naming, description under 1024 chars, no angle brackets.
Automatically generate variants of a skill, A/B test them against the original, and promote winners. This is a closed-loop pipeline — baseline, hypothesize, generate, test, promote.
Read the full protocol: ${CLAUDE_SKILL_DIR}/references/self-improve-loop.md
The loop runs 5 phases: BASELINE (establish metrics with 3+ test cases), HYPOTHESIZE (2-3 single-variable changes), GENERATE VARIANTS (minimal diffs), BLIND A/B TEST (paired comparison via agents/comparator.md), PROMOTE OR KEEP (60%+ win rate required, no regressions). All outcomes — wins and losses — are recorded to the learning DB to prevent re-testing failed hypotheses.
GATE: Self-improvement protocol loaded from reference. Proceed through the 5 phases.
Score two peer implementations of the same artifact (e.g., a toolkit voice-profile skill vs an external peer voice profile) on a numeric rubric and declare a decisive winner. Use when the user says "bake-off", "head-to-head", "compare implementations", "grade these two", or "which X is better".
Read the full protocol: ${CLAUDE_SKILL_DIR}/references/bake-off-methodology.md
The protocol runs 5 phases: PREPARE (read both artifacts in full, pick a verifier that built neither side), RUBRIC (define 5–12 criteria scored 0–10, pre-state the loser-of-each-criterion before reading evidence), GRADE (every score cites a path/line range or quote; build the matrix; apply anti-rationalization gate), FOLD (filter loser-wins through docs/PHILOSOPHY.md before recommending any folds into the winner), REPORT (output to tmp/<topic>-bakeoff-report.md, gitignored).
The persona voice-profile bake-off (toolkit 86 vs external 74 across 11 criteria, 12-point margin) is the canonical worked example carried in the reference.
GATE: Bake-off protocol loaded from reference. Proceed through the 5 phases.
Step 1: Review results
For trigger eval / description optimization:
For output benchmark:
Step 2: Apply changes (with user confirmation)
If description optimization found a better description:
Constraint: Always show results before/after with metrics. This enables informed decisions.
GATE: Changes applied and validated, or user chose to keep original.
Cause: Skill path doesn't point to a valid skill directory Solution: Verify path contains a SKILL.md file. Skills must follow the skill-name/SKILL.md structure.
Cause: Claude CLI not available for trigger evaluation Solution: Install Claude Code CLI. Trigger eval requires claude -p to test skill invocation.
Cause: Outdated instructions or an old checkout still expects a direct SDK client Solution: Update to the current scripts. Description optimization now runs through claude -p.
Cause: Running eval from inside a Claude Code session blocks nested instances Solution: The scripts automatically strip the CLAUDECODE env var. If issues persist, run from a separate terminal.
Cause: Default 30s timeout too short for complex queries Solution: Increase with --timeout 60. Simple trigger queries should complete in <15s.
scripts/skill_eval/)run_eval.py — Trigger evaluation: tests description against query setrun_loop.py — Eval+improve loop: automated description optimizationimprove_description.py — Single-shot description improvement via Claude APIgenerate_report.py — HTML report from loop outputaggregate_benchmark.py — Benchmark aggregation from grading resultsquick_validate.py — Structural validation of SKILL.mdskills/meta/skill-eval/agents/)grader.md — Evaluates assertions against execution outputscomparator.md — Blind A/B comparison of two outputsanalyzer.md — Post-hoc analysis of why one version beat another${CLAUDE_SKILL_DIR}/references/schemas.md — JSON schemas for evals.json, grading.json, benchmark.json${CLAUDE_SKILL_DIR}/references/self-improve-loop.md — Self-improvement loop protocol: variant generation, blind A/B testing, promotion criteria${CLAUDE_SKILL_DIR}/references/bake-off-methodology.md — Head-to-head bake-off protocol: rubric construction, anti-rationalization gate, philosophy-filtered fold-list, worked persona example| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | pass→pass | 12,158 | 5,177 | -57% | 1 | 1 | 0% | 2,401 | 3,829 | +59% | 0 | 0 | — |
case-21 | pass→pass | 12,118 | 9,517 | -21% | 1 | 1 | 0% | 1,822 | 4,309 | +136% | 0 | 0 | — |
case-01 | fail→fail | 9,969 | 6,636 | -33% | 1 | 1 | 0% | 1,947 | 3,309 | +70% | 0 | 0 | — |
case-02 | fail→fail | 4,557 | 6,284 | +38% | 1 | 1 | 0% | 270 | 3,219 | +1092% | 0 | 0 | — |
case-03 | fail→fail | 3,727 | 5,276 | +42% | 1 | 1 | 0% | 213 | 3,107 | +1359% | 0 | 0 | — |
case-04 | fail→pass | 8,435 | 1,497 | -82% | 1 | 1 | 0% | 1,570 | 3,082 | +96% | 0 | 0 | — |
case-05 | fail→pass | 16,563 | 5,955 | -64% | 1 | 1 | 0% | 3,169 | 3,899 | +23% | 0 | 0 | — |
case-06 | fail→pass | 11,379 | 2,873 | -75% | 1 | 1 | 0% | 1,802 | 3,305 | +83% | 0 | 0 | — |
case-07 | fail→fail | 12,190 | 2,050 | -83% | 1 | 1 | 0% | 2,079 | 3,121 | +50% | 0 | 0 | — |
case-08 | fail→pass | 17,552 | 5,447 | -69% | 1 | 1 | 0% | 2,648 | 3,715 | +40% | 0 | 0 | — |
case-09 | pass→pass | 4,557 | 3,089 | -32% | 1 | 1 | 0% | 680 | 3,255 | +379% | 0 | 0 | — |
case-10 | fail→pass | 19,302 | 1,522 | -92% | 1 | 1 | 0% | 1,486 | 3,085 | +108% | 0 | 0 | — |
case-11 | fail→pass | 10,622 | 1,666 | -84% | 1 | 1 | 0% | 1,483 | 3,053 | +106% | 0 | 0 | — |
case-12 | fail→pass | 13,376 | 2,118 | -84% | 1 | 1 | 0% | 2,078 | 3,166 | +52% | 0 | 0 | — |
case-13 | fail→pass | 15,095 | 2,374 | -84% | 1 | 1 | 0% | 2,552 | 3,202 | +25% | 0 | 0 | — |
case-14 | pass→pass | 32,759 | 2,001 | -94% | 1 | 1 | 0% | 3,345 | 3,173 | -5% | 0 | 0 | — |
case-15 | pass→pass | 7,169 | 3,397 | -53% | 1 | 1 | 0% | 1,261 | 3,388 | +169% | 0 | 0 | — |
case-22 | pass→pass | 19,943 | 19,171 | -4% | 1 | 1 | 0% | 3,612 | 6,308 | +75% | 0 | 0 | — |
case-16 | fail→pass | 12,376 | 2,598 | -79% | 1 | 1 | 0% | 1,831 | 3,198 | +75% | 0 | 0 | — |
case-17 | fail→pass | 9,309 | 2,301 | -75% | 1 | 1 | 0% | 1,437 | 3,132 | +118% | 0 | 0 | — |
case-18 | fail→pass | 7,247 | 2,470 | -66% | 1 | 1 | 0% | 1,174 | 3,167 | +170% | 0 | 0 | — |
case-19 | pass→pass | 11,238 | 1,940 | -83% | 1 | 1 | 0% | 1,761 | 3,078 | +75% | 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 20 counted toward the lift figure. The other 2 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 +50 percentage points is the difference between those two pass rates over the 20 comparable cases.
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.