skill-evolution
July 6, 2026 · View on GitHub
A Claude Code plugin that adds measured, GEPA-style evolution of learned skills — the companion half to UniM0cha/claude-self-improving-skills.
That plugin acquires and maintains learned skills (distills them from complex work, curates stale ones). What it does not do is record whether a skill actually worked or use that signal to improve the skill. This plugin adds exactly that missing axis — the reward signal at the heart of Nous Research's Hermes Agent self-evolution (DSPy + GEPA).
What it does
-
Outcome telemetry — a
Stophook records, per learned skill used in a session, whether the work that followed looked like a success or failure (a followingis_errortool result or a user correction ⇒ failure). Stored in~/.claude/self-improve/skill_outcomes.json. It is a pure recorder: emits no Stop decision, so it never interferes with the sibling plugin's distillation nudge, and fails safe to a no-op on any error. -
Reflective optimization —
/optimize-skill [name]runs a GEPA-style loop: gather the failure traces for a skill (the why) → generate 2–3 candidate rewrites → score each against a rubric built from the failures (LLM-as-judge) → pick the Pareto-best (quality first, size as tiebreak) → present a diff for human approval before applying. The apply passes through the sibling plugin's backup/validate/rollback hooks automatically. -
/evolution-status— ranks skills byuse × failure_rateso you can see which skill is worth evolving.
Install
/plugin marketplace add okdk7788/skill-evolution
/plugin install skill-evolution@skill-evolution
Headless / auto-mode:
claude plugin marketplace add okdk7788/skill-evolution
claude plugin install skill-evolution@skill-evolution
Pairs best with self-improving-skills installed alongside it (it reads that
plugin's skill_usage.json for the usage side of the ranking), but the outcome
telemetry and /optimize-skill work standalone too.
Commands
/evolution-status— outcome stats + optimization-candidate ranking/optimize-skill [name]— evolve a skill (auto-picks the top candidate if no name)
Design
- Never auto-commits. Mutation/evaluation/selection are automatic; the actual file rewrite is human-gated (Hermes' "never direct commit, always review").
- No data ⇒ no evolution. Without outcome traces,
/optimize-skillstops rather than guessing. - Coarse but honest attribution: a "did the segment end clean?" signal, not a proof of causation. Failure signals are only counted after the skill's use.
- Default engine is a dependency-free "Claude-as-optimizer" reflective loop.
A quantitative DSPy + GEPA engine (
intertwine/dspy-agent-skills) can be wired in as an opt-in (needs API keys + eval sets).
Layout
.claude-plugin/marketplace.json
plugins/skill-evolution/
.claude-plugin/plugin.json
hooks/ hooks.json + capture-outcome.sh (Stop)
scripts/ outcome_store.py · capture_outcome.py · evolution_report.py
commands/ optimize-skill.md · evolution-status.md
tests/ test_skill_evolution.py (15 cases, run: python3 -m pytest -q)
License
MIT