The Skill That Ignored Its Own Engine
🔍 The audit: Two files described our evolution loop. The skill's version and its dependency's version disagreed on paths, math, and method.
💥 The finding: The skill was hand-rolling scores and logs while the runner inside its own dependency already did all of it properly, one folder away.
🔧 The fix: v2.0.0 rebuilds /evo-loop as a thin controller. The engine thinks, the runner counts, the skill drives.
What is an evolution loop?
An evolution loop is an automated improvement cycle for AI tools: run a real task, score the output against fixed rules, propose one small change, test that change on benchmarks, and keep it only if it measurably wins. Then repeat until the scores stop climbing.
Ours is called Evo-Loop, and it evolves Claude Code skills: the instruction files that tell an AI coding agent how to work. It ships alongside a dependency called godmode-evolution, and that relationship is where this story starts.
↓
🎲 Pick a skill variant to run
↓
⚡ Execute the task with that variant
↓
📊 Score the output against fixed rules
↓
🧬 Propose one change, benchmark it, keep it only if it wins
↓
🔁 Repeat until the scores stop climbing
Two files described one loop
This week we audited the standalone skill, two full passes. The trigger words belong to /evo-loop, but its dependency ships its own loop protocol file, plus a runner: a small command line program that owns every number, path, and log format in the system.
So two documents described the same loop, and they disagreed on almost everything. When two maps describe one road, at most one of them is right.
Think of it like this: buying a car with satellite navigation built in, then taping a paper map over the screen. v1 of our skill was the paper map: hand-drawn directions sitting on top of a machine that could already navigate.
The evidence was already on disk
We did not have to guess which file was telling the truth. A real ten-iteration run had just finished, and its artifacts were still on disk.
Four clues, each one checkable. Click through them.
{"benchmark":"OS1","composite":0.9107,
"adjusted_composite":0.8952,
"first_loop_cap_applied":true}
Those two fields matter because they are anti-inflation caps: rules that stop a fresh variant from scoring too generously.
Only the runner computes them. Hand-written scores do not cap themselves.
Verdict: the runner had been mid-conversation with our loop the whole time. The skill was writing into the machine's files without ever reading its answers.
What v2.0.0 changes, side by side
The rebuild keeps the skill in the driver's seat and hands everything mechanical to the engine and runner. Here is the whole shift in one table.
| What | v1.1.2 (before) | v2.0.0 (now) |
|---|---|---|
| Scores | Hand-computed in prose | Runner computes them, caps included |
| Flag log | Hand-written | Runner-stamped, never touched by hand |
| Pass bars | One 0.70 bar for everything | Three distinct bars (below) |
| Variants | One per run | A pool, one sampled each round |
| Progress signal | Compared scores across different tasks | Same-task deltas and 5-run windows |
| Loop state | Saved to a path the runner never read | Skill-level file the runner owns |
| Final check | None | Held-out benchmarks the loop never trained on |
The three bars v1 collapsed into one
0.70 · Flag
Any single score below this gets flagged as evidence for what to fix next.
0.75 · Dimension pass
The pass mark for each scoring dimension on a run's scorecard.
0.85 · Composite pass
The overall pass mark. Below this, the variant is failing and a fix gets proposed at the next checkpoint.
Three different jobs, three different numbers, and they had been sitting in the runner's code all along. v1 used one 0.70 bar for all three jobs because it never asked.
Two more upgrades ride along. v2 keeps several skill variants alive and picks the one to run each round with a weighted draw that favors past winners without starving the rest.
And progress is only ever judged by re-running the same task later, never by comparing today's task with yesterday's different one. The second habit sounds obvious and is the single most common way self-improvement loops flatter themselves.
What the audit got wrong at first
Audits cut both ways, including at the auditor. Our first pass flagged the skill for saving data relative to whatever folder you run it from.
That turned out to be the engine's deliberate design, so the fix is a setup warning, not a rewrite.
And in one place the skill was right while the dependency was wrong: the engine's own docs pointed version archives at a folder the runner never uses. The real archives on disk proved it.
So the rebuild shipped with a patch to the dependency too, the same day, in the same commit.
Do
Believe the artifact. Runner-stamped logs, real state files, and archives on disk outrank any document describing them.
Don't
Assume the bigger, older component is the correct one. Both sides of a dependency can drift, and here both did.
How to audit a skill against its dependency
This generalizes to any tool built on top of another one. The recipe we used:
- List every hard claim the skill makes: paths, thresholds, file formats, commands.
- Find the same claims in the dependency's code, not its docs.
- Diff the two lists. Every mismatch is a bug in one of the two.
- Pull a real run's files and check which side the disk agrees with.
- Rebuild the weaker side as a thin layer over the stronger one.
- Version the change, archive the old files, and write down what you got wrong too.
Core insight: docs drift, disk does not. When prose and a log file disagree, the log is telling the truth.
It is the same lesson that keeps landing every time we point the audit gun at ourselves, from the tools that vanished underneath a skill to the quality loop that failed our own best work to the first full audit of the evolution engine. The system that grades your work has to be graded hardest of all.
Run the loop that listens to its engine
Evo-Loop 2.0 evolves your Claude Code skills with the math done by a runner that cannot flatter itself.
Get Evo-Loop See plans