Skill-Eval
by @jensen-srp
Autonomous engine that systematically evaluates and ranks agent skills across models using rubric grading, error taxonomy, and improvement feedback loops.
clawhub install skill-evalπ About This Skill
Skill-Eval v0.4.0: Self-Evolving Skill Evaluation Engine
An autonomous evaluation system for agent skills from ClawHub and other registries. Produces HuggingFace model-card style reports and a ranked leaderboard.
Informed by:
Architecture
skill_eval/
VERSION -- engine semver
SKILL-EVAL.md -- this file (the brain)
knowledge/
lessons.md -- accumulated eval wisdom
eval-patterns.md -- reusable test/assertion templates
failures.md -- failure mode catalog
skill-profiles/.md -- per-skill learned context
references/ -- source articles and frameworks
improve/ -- skill-improvement engine knowledge (NEW v0.4.0)
lessons.md -- improvement-specific lessons learned
patterns.md -- proven improvement patterns by category
failures.md -- improvement failure modes
skill-cards/ -- output: one .md per evaluation
leaderboard/
index.html -- interactive HTML leaderboard
scripts/
generate_skill_card.py -- skill card generator
generate_leaderboard.py -- leaderboard builder
evals/
skill-registry.json -- skills to evaluate
.json -- per-skill eval config
workspaces/ -- per-skill eval workspaces
Evaluation Philosophy
What makes a skill valuable?
A skill is valuable if and only if it makes the agent produce measurably better results than the agent would produce without it. "Better" means:
1. Higher quality output β more correct, more complete, better structured 2. More reliable behavior β consistent results across varied prompts 3. Appropriate trade-offs β any overhead in time/tokens is justified by quality gain
A skill that produces identical results to baseline but costs 3x more tokens is a net negative. A skill that improves quality dramatically but takes 2x longer is likely worth it.
Two types of skills (Anthropic framework)
1. Capability uplift β teaches the agent something it can't do well on its own. These may become unnecessary as models improve. Evals detect when that happens. 2. Encoded preference β sequences steps according to a specific process. More durable, but must be evaluated for fidelity to the intended workflow.
Understanding which type a skill is affects how we design assertions.
Multi-Model Support (v0.4.0)
Skills should work across models, not just the one used to test them. The engine supports configuring different models for different roles.
Model Roles
There are three distinct model roles in the evaluation pipeline:
1. Execution Model β The model that runs the skill (with-skill) and the baseline (without-skill). This is the model the skill is being tested ON. 2. Judge Model β The model that grades rubric-based assertions (Layer 2 quality assessment). Should ideally be different from the execution model to avoid self-grading bias. 3. Improvement Model β The model that rewrites low-scoring skills in Phase 10. Can differ from execution model to bring diverse improvement strategies.
Configuration
Model configuration lives in evals/models.json:
{
"execution_models": [
"anthropic/claude-opus-4-6",
"openai/gpt-4.1",
"google/gemini-2.5-pro"
],
"judge_model": "anthropic/claude-opus-4-6",
"improvement_model": "anthropic/claude-opus-4-6",
"default_execution_model": "anthropic/claude-opus-4-6"
}
Execution Modes
Per-Skill Model Override
Individual eval configs (evals/) can override the global model config:
{
"skill_slug": "explain-code",
"models": {
"execution": ["anthropic/claude-opus-4-6", "openai/gpt-4.1"],
"judge": "google/gemini-2.5-pro"
},
"evals": [...]
}
If models is omitted, the global evals/models.json config is used.
Skill Card Multi-Model Output
When a skill is evaluated across multiple models, the skill card includes:
Leaderboard Multi-Model Display
The leaderboard shows the aggregate score by default, with expandable per-model details. Skills that show consistent value across models rank higher than skills that only help one model.
Model Availability
Not all models may be available in every environment. The engine handles this gracefully:
default_execution_model as judgeEvaluation Flow
Phase 1: Pre-flight Analysis
Before generating test cases, understand the skill:
1. Read SKILL.md β understand claims, dependencies, target use cases
2. Classify the skill β capability uplift or encoded preference? What category?
3. Dependency check β required CLI tools, API keys, env vars. Log any that are missing.
- Dependency-gated skills: If a skill requires paid APIs or credentials that aren't available, mark it as dependency-gated in evals/ and the benchmark. Do not run the eval -- it will produce environment failures, not skill-quality signals. Re-evaluate after credential provisioning.
- Dependency matrix: For data-fetch or finance skills, document the full dependency matrix (API key, freshness source, fallback behavior) before proceeding.
- Phantom tooling check: If a skill references scripts, CLIs, or tools that don't actually exist in the skill package (e.g. documented scrape_reviews.py with no actual file), flag as phantom-tooling in the skill card. The skill's framework/template value can still be evaluated, but users should know the tooling is vaporware. (Learned from review-summarizer eval, Batch 3.)
- Marketing claims check: If a skill claims specific metrics ("7.8x faster", "85% reduction") without evidence, note as unsubstantiated-claims in the skill card. Do not use the skill's self-reported numbers in scoring. (Learned from debug-checklist eval, Batch 3.)
- Phantom tooling check: verify that scripts/binaries referenced by SKILL.md actually exist in the skill folder. If missing, mark phantom-tooling: true and split evaluation into (a) framework/template value and (b) operational tooling value.
4. Read knowledge base β check knowledge/lessons.md, eval-patterns.md, failures.md for relevant patterns
5. Check for prior evaluations β has this skill been evaluated before? Load knowledge/skill-profiles/
Phase 2: Test Case Design
Design 2-3 test prompts following OpenAI's four-category framework:
Success categories to check:
Prompt design principles:
Assertion design (two layers):
*Layer 1: Deterministic checks*
*Layer 2: Rubric-based quality assessment*
Assertion anti-patterns (from lessons learned):
Output-floor assertions (from failure modes):
Category-specific assertion patterns:
keyword_absent assertions for each banned word. These are deterministic, easy to verify, and produce maximum delta. (Learned from Batch 3 -- article-writer scored 10/10 with 100% delta, the first perfect score.)phantom-tooling when scripts are missing.Save test cases to evals/.
Phase 3: Execution
For each test case, determine the execution model(s) from the eval config or evals/models.json.
Single-model mode (default): Spawn two subagents simultaneously on the same execution model:
With-skill subagent:
[Model: ]
Read the skill at /SKILL.md and follow its instructions.
Task:
Save all outputs to: /iteration-//with_skill/outputs/
Without-skill (baseline) subagent:
[Model: ]
Complete this task using only your built-in capabilities. Do NOT read any SKILL.md.
Task:
Save all outputs to: /iteration-//without_skill/outputs/
Cross-model mode: When multiple execution models are configured, run the full with/without pair for EACH model. Organize outputs by model:
/iteration-///with_skill/outputs/
/iteration-///without_skill/outputs/
Capture timing data (tokens, duration, model used) from completion events into timing.json.
Phase 4: Grading
Grade each run against assertions. Two approaches:
Programmatic grading (preferred for deterministic checks):
LLM-based grading (for qualitative assessments):
evals/models.json or per-skill override), NOT the execution model{"text": "...", "passed": bool, "evidence": "..."}judge_model in grading output for attributionSave to grading.json:
{
"expectations": [
{"text": "assertion text", "passed": true, "evidence": "why this passed/failed"}
],
"summary": {"passed": N, "failed": N, "total": N, "pass_rate": 0.X}
}
Phase 5: Benchmark Aggregation
Create benchmark.json with:
dependency-gated so it doesn't pollute rankings with environment failures.phantom-tooling and report separate judgments for framework quality vs operational readiness.Phase 6: Skill Card Generation
python scripts/generate_skill_card.py \
--workspace workspaces//iteration- \
--skill-name "" \
--skill-slug "" \
--eval-model "claude-opus-4-6" \
--output skill-cards/-v.md
Each card includes:
Phase 7: Leaderboard Update
python scripts/generate_leaderboard.py \
--cards-dir skill-cards \
--output leaderboard/index.html
Phase 8: Learning (Self-Evolution)
After each evaluation batch, update the knowledge base:
1. lessons.md β What worked? What didn't? New patterns discovered?
2. eval-patterns.md β New assertion templates for this skill category?
3. failures.md β New failure modes found?
4. skill-profiles/
Key questions for the learning step:
Phase 9: Absorb Knowledge into SKILL-EVAL.md
This is the critical closing step. Without it, the engine documents lessons but doesn't actually evolve.
After updating the knowledge files, review them and fold actionable improvements back into this document:
1. failures.md -> Phases 1-5 β Each new failure mode should produce a concrete change to the relevant phase (pre-flight gates, assertion templates, scoring adjustments, benchmark annotations). 2. lessons.md -> Phase 2 β Proven discriminating assertion patterns should be added to the assertion design guidance, not just noted in lessons. 3. eval-patterns.md -> Phase 2 β New category-specific patterns should be reflected in the assertion guidance for that category. 4. Verify absorption β After updating, re-read the knowledge files and confirm every actionable item has a corresponding change in SKILL-EVAL.md. If something was noted but not absorbed, either absorb it or document why it was deferred.
When enough knowledge accumulates, bump VERSION. The version bump signals that the methodology itself has changed, not just the knowledge base.
The loop: eval -> knowledge -> SKILL-EVAL.md -> better evals. If knowledge doesn't flow back up, the engine isn't self-evolving.
Phase 10: Skill Improve (Self-Evolving Improvement Engine)
Trigger: Score < 7 (verdict = "Conditional", "Marginal", or "Not Recommended"), AND the skill is not dependency-gated.
The Skill Improvement Engine is itself a self-evolving system with its own knowledge base, learned patterns, and failure catalog. It gets better at improving skills over time.
#### Improvement Engine Knowledge Base
Located at knowledge/improve/:
lessons.md β What improvement strategies worked? What didn't? Which root causes are hardest to fix?patterns.md β Proven improvement patterns by skill category (e.g., "for reference-manual skills, delete 70%+ content and add MUST/ALWAYS/NEVER mandates")failures.md β Improvement failure modes: cases where improvement was attempted but didn't produce meaningful score gains, with root cause analysisBefore improving any skill, read all three files. The improvement engine should never repeat a failed strategy or miss a proven pattern.
#### Improvement Process
1. Read the improvement knowledge base:
- knowledge/improve/lessons.md β proven strategies, anti-patterns
- knowledge/improve/patterns.md β category-specific improvement playbooks
- knowledge/improve/failures.md β what NOT to try, and why
- Also read eval knowledge: knowledge/lessons.md, eval-patterns.md, failures.md
2. Read the eval data:
- Failed assertions from benchmark.json (what the skill got wrong)
- Baseline output comparison (what the model does well without the skill)
- Skill profile from knowledge/skill-profiles/
- Category patterns from knowledge/eval-patterns.md
3. Diagnose root causes (check against known patterns):
- Is the skill too vague? (Doesn't specify enough to change model behavior)
- Is the skill redundant? (Teaches things the model already knows)
- Is the skill too heavy? (Adds overhead without proportional quality gain)
- Is the skill missing structure? (No clear output format, no enforceable conventions)
- Is there phantom tooling? (References tools that don't exist)
- Is it a reference manual? (200+ lines of educational content)
- Is it a library-as-skill? (Contains code instead of instructions)
- Cross-reference diagnosis against knowledge/improve/patterns.md for category-matched strategies
4. Select improvement strategy from knowledge base:
- Match the diagnosed root cause to a proven pattern in knowledge/improve/patterns.md
- If no matching pattern exists, design a new strategy and document rationale
- If a similar improvement previously failed (per knowledge/improve/failures.md), try a different approach or document why this case is different
5. Rewrite SKILL.md:
- Apply the selected strategy
- Default formula: Remove > Add (delete 60-80% first, then add behavioral mandates)
- Add specific, enforceable conventions (banned words, required sections, output schemas)
- Remove redundant content the model already handles
- Add "quick mode" vs "full framework" routing if overhead is the issue
- Replace phantom tooling references with actual inline instructions
- Keep what works, fix what doesn't
- Save as skills-under-test/
6. Update assertions to match improved skill: - Add new assertions that test the behavioral mandates added in the rewrite - Keep existing assertions that test baseline capabilities - Save updated assertions alongside original for comparison - This prevents the assertion-skill mismatch failure mode
7. Document changes:
- Write a changelog in skills-under-test/
- List what was changed and why, tied back to specific failed assertions
- Record which improvement pattern/strategy was applied
What NOT to improve:
dependency-gated skills (problem is environment, not skill quality)Model selection for improvement: Use the configured improvement_model from evals/models.json. Different models may bring different improvement perspectives -- a model that didn't write the original skill may see blind spots the original author (or model) missed.
Phase 11: Re-Eval Improved Skills
Run the exact same eval config (evals/) against the improved SKILL.md, with updated assertions where applicable.
1. Execute with SKILL-improved.md instead of original SKILL.md
2. Save outputs to workspaces/
3. Grade with the same assertions (plus any new assertions added in Phase 10 step 6)
4. Generate a comparison card in skill-cards/:
- Original score vs improved score
- Per-assertion delta (which failures were fixed?)
- What changed in the SKILL.md and what effect it had
- Which improvement strategy was used (from knowledge/improve/patterns.md)
5. Update leaderboard with improved scores (mark as "improved" variant)
Success criteria:
If improvement fails (score doesn't meaningfully improve):
improvement-attempted in registryPhase 12: Improvement Engine Learning (Self-Evolution)
This is the critical step that makes the improvement engine self-evolving.
After each improvement batch (Phase 10-11), update the improvement knowledge base:
1. Update knowledge/improve/lessons.md:
- What improvement strategies worked? By how much did scores increase?
- What strategies failed? Why?
- Any new root cause patterns discovered?
- Any model-specific insights? (Does GPT-4.1 improve skills differently than Claude?)
2. Update knowledge/improve/patterns.md:
- For each successful improvement, extract the reusable pattern
- Structure: Category -> Root Cause -> Strategy -> Expected Gain
- Example: Reference Manual -> Redundant content -> Delete 70%, add MUST/ALWAYS/NEVER -> +1.5 to +2.0 points
- Track success rate per pattern (how often does this strategy work?)
3. Update knowledge/improve/failures.md:
- Document each failed improvement attempt
- Root cause analysis: why didn't the strategy work?
- Was the skill fundamentally limited, or was the strategy wrong?
- Add "do not attempt" markers for known dead ends
4. Absorb into Phase 10: - Review the improvement knowledge files - Fold proven patterns back into the Phase 10 process guidance - Update the diagnosis checklist with new root causes - Update strategy selection with new proven patterns - This is the improvement engine's equivalent of Phase 9 (absorb into SKILL-EVAL.md)
The improvement loop: improve -> re-eval -> learn -> better improvements. If improvement lessons don't flow back, the improvement engine is static.
Latest absorbed changes (Batch 3, 2026-03-09)
Absorbed changes (Full Re-Eval + Skill Improve, v0.3.0, 2026-03-09)
Absorbed changes (v0.4.0, 2026-03-10)
evals/models.json config with three model roles: execution, judge, improvement. Skills can now be evaluated across multiple models for cross-model consistency. Per-skill model overrides supported in eval configs.knowledge/improve/ with lessons.md, patterns.md, and failures.md. Before improving any skill, the engine reads its learned patterns, selects a strategy, and documents results. After each improvement batch, Phase 12 updates the improvement knowledge base -- the improvement engine evolves independently from the eval engine.Scoring System
Overall Score: 0-10
| Component | Points | Criteria | |-----------|--------|----------| | Quality | 0-5 | Based on with-skill pass rate | | Value-add | 0-3 | Delta between with-skill and without-skill pass rates | | Efficiency | 0-2 | Time/token overhead relative to baseline |
| Score | Verdict | Meaning | |-------|---------|---------| | 7-10 | Recommended | Clear value over baseline | | 5-6.9 | Conditional | Some value with trade-offs | | 3-4.9 | Marginal | Overhead without proportional improvement | | 0-2.9 | Not Recommended | Baseline is comparable or better |
Versioning
VERSION (semver)evals/.json are versioned implicitly through gitBatch Evaluation
1. Read evals/skill-registry.json and evals/models.json
2. Process skills sequentially (or small batches)
3. For each: pre-flight -> test -> execute (per model) -> grade (with judge model) -> card -> leaderboard
4. After batch: run eval learning step (Phase 8-9)
5. Skill-improve pass: for any skill scoring < 7, run Phase 10-11 (improve + re-eval)
6. Improvement learning step: run Phase 12 (improvement engine self-evolution)
7. Final absorption: absorb both eval and improvement lessons into SKILL-EVAL.md
8. Update leaderboard with both original and improved scores, per-model breakdowns
βοΈ Configuration
Model configuration lives in evals/models.json:
{
"execution_models": [
"anthropic/claude-opus-4-6",
"openai/gpt-4.1",
"google/gemini-2.5-pro"
],
"judge_model": "anthropic/claude-opus-4-6",
"improvement_model": "anthropic/claude-opus-4-6",
"default_execution_model": "anthropic/claude-opus-4-6"
}
Execution Modes
Per-Skill Model Override
Individual eval configs (evals/) can override the global model config:
{
"skill_slug": "explain-code",
"models": {
"execution": ["anthropic/claude-opus-4-6", "openai/gpt-4.1"],
"judge": "google/gemini-2.5-pro"
},
"evals": [...]
}
If models is omitted, the global evals/models.json config is used.
Skill Card Multi-Model Output
When a skill is evaluated across multiple models, the skill card includes:
Leaderboard Multi-Model Display
The leaderboard shows the aggregate score by default, with expandable per-model details. Skills that show consistent value across models rank higher than skills that only help one model.
Model Availability
Not all models may be available in every environment. The engine handles this gracefully:
default_execution_model as judge