Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build a repeatable eval loop that grades agent output with an LLM judge, so prompt/skill changes get scored against a baseline instead of eyeballed. Reuses loopkit's verifier subagent as the grader — do not build a new one.
.claude/skills/archive228-eval-harness/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -35% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 25% | 0% |
Every prompt tweak in a long-running agent looks like an improvement in the moment. The only way to know is a graded run against fixed inputs. Loopkit already ships .claude/agents/verifier.md — that is your grader. Do not rebuild it.
inputs.jsonl → runner → outputs.jsonl → verifier (per row) → verdicts.jsonl → diff vs baselineEach stage writes to disk. No stage holds the whole run in context.
One JSON object per row: {"id": "case-01", "input": "...", "expected": "..."}.
inputs-v2.jsonl) when you change it. Never edit in place — you lose the baseline.A dumb loop: for each row, call the model with the current prompt/skill, capture output, write {"id": ..., "output": ...} to outputs.jsonl. No grading here — just capture.
If the runner is smart it will bias the eval. Keep it dumb.
Fan out one subagent per row (see subagent-fanout). Each gets:
.claude/agents/verifier.md.Verifier returns strict JSON: {"pass": bool, "why": "..."}. Collect into verdicts.jsonl.
Two runs of the same eval on two prompt versions → compare pass rates per case. What matters:
A change that raises the mean but adds regressions is usually a loss — the new failures are cases you already knew worked.
verdicts.jsonl to git.The verifier is already yours. The harness is 100 lines of glue around it.
Other measured skills in the registry, with their headline benchmark lift.