Lightweight evaluator and optimizer for agent skills, built around the core question:
Does this skill add meaningful value beyond what the base model already knows?
The system implements the matrix from docs/2026-02-17-plan.md and docs/2026-02-17-context.md with an explicit split between:
- selection effects (routing quality)
- execution effects (content value vs sham)
- end-to-end effects (real net gain with cost/latency)
This project is intentionally minimal and practical for expensive agent runs.
- Uses a fixed condition matrix:
baseline,selector,oracle_real,oracle_sham,forced_negative,auto_real - Uses sham/placebo control to separate meaningful content from token-load effects
- Produces a strict verdict:
helpful,helpful_routing_limited,neutral,harmful - Optimizes in phases (metadata first, then body) with local mutations by default and optional GEPA backend
misefor tool/task orchestrationuvfor Python env/dependenciesrufffor lint/format
mise run setup
mise run lint
mise run testsrc/skills_evaluator/models.py: schemas for skills, tasks, rows, metrics, verdictssrc/skills_evaluator/skill_artifact.py: load/write SKILL artifactssrc/skills_evaluator/linting.py: lightweight skill lint checkssrc/skills_evaluator/placebo.py: sham skill generationsrc/skills_evaluator/harness.py: harness interfaces + heuristic/replay harnessessrc/skills_evaluator/evaluator.py: matrix execution + aggregationsrc/skills_evaluator/metrics.py: derived effects and classification logicsrc/skills_evaluator/optimize.py: practical optimizer loop (local + optional GEPA)src/skills_evaluator/reporting.py: markdown report generationsrc/skills_evaluator/cli.py: CLI commands
Keep eval assets under the skill directory:
my-skill/
├── SKILL.md
├── references/
└── evals/
├── tasks.yaml
└── ...
evaluateandoptimizedefault toevals/tasks.yamlunder--skill-dir--tasks-filestill works as an explicit override- files under
evals/are ignored when loading skill support files, so they do not bloat skill context
Use the included sample skill and tasks:
uv run skills-evaluator evaluate \
--skill-dir examples/skills/sample-code-review \
--report-file outputs/report.md \
--json-file outputs/eval.jsonGenerate placebo control skill:
uv run skills-evaluator make-placebo \
--skill-dir examples/skills/sample-code-review \
--out-dir outputs/placebo-skillRun local optimizer loop:
uv run skills-evaluator optimize \
--skill-dir examples/skills/sample-code-review \
--out-dir outputs/optimized-skill \
--report-file outputs/optimized-report.md \
--backend localYou can switch optimizer backend to gepa.
uv run skills-evaluator optimize \
--skill-dir examples/skills/sample-code-review \
--out-dir outputs/optimized-skill \
--report-file outputs/optimized-report.md \
--backend gepa \
--gepa-reflection-model openai/gpt-5.1Override the default dataset location when needed:
uv run skills-evaluator evaluate \
--skill-dir skills/markit \
--tasks-file outputs/custom-tasks.yaml \
--report-file outputs/markit-report.mdIf GEPA/model setup fails, the optimizer automatically falls back to local mutations.
skills-evaluator lint-skillskills-evaluator make-placeboskills-evaluator evaluateskills-evaluator optimize
- Claude skill best practices (concise metadata, progressive disclosure, token trade-offs): https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices
- DSPy ReAct and GEPA APIs: https://dspy.ai/api/modules/ReAct/ https://dspy.ai/api/optimizers/GEPA/overview/
- GEPA
optimize_anythingevaluator + ASI pattern: https://gepa-ai.github.io/gepa/blog/2026/02/18/introducing-optimize-anything/ https://gepa-ai.github.io/gepa/api/optimize_anything/Evaluator/ - SkillsBench findings (curated skills can help; some tasks regress; focused skills often outperform broad docs): https://arxiv.org/abs/2602.12670
- Accuracy+cost and holdout discipline for agent evaluation: https://arxiv.org/abs/2407.01502