harness:health — Claude Code skill: dataset checks and auto-fixes
Audits an eval dataset for size, difficulty spread, dead examples, category coverage and splits, then fixes what it finds on its own.
npx skills add raphaelchristi/harness-evolver --skill health -a claude-codeWhat harness:health does
The skill runs dataset_health.py and writes the result to health_report.json. You get a health score out of ten, the example count, and a list of issues tagged by severity. Corrections listed in the report are applied without extra prompting.
Those corrections cover four cases. Examples get split 70/30 into train and held_out. A harness-testgen subagent writes harder examples when the set leans easy, or fills in production categories that are missing. Dead examples move to the retired split. Splits and retirement go through LangSmith, so the langsmith package and dataset access are needed.
A .evolver.json file has to be in the project first. Without it the skill points you at /harness:setup and stops. Tool location comes from EVOLVER_TOOLS, falling back to .evolver/tools; the Python interpreter comes from EVOLVER_PY, falling back to $HOME/.evolver/venv/bin/python, and to system python3 if that venv isn't there.
What it helps with
- audit a dataset before starting an evolve run
- spot dead examples the agent keeps failing
- catch a dataset skewed toward easy cases
- split examples into train and held_out
- fill production categories the dataset never covers
Example prompts for the agent
- Run
/harness:healthand check my dataset - Diagnose the dataset and show me
health_report.json - The dataset is too easy — rebalance it
How to install harness:health
1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill health -a claude-code2Manually: put the files in place
~/.claude/skills/health/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/health/
1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill health -a codex2Manually: put the files in place
.agents/skills/health/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill health -a cursor2Manually: put the files in place
.cursor/skills/health/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install raphaelchristi/harness-evolver health2Manually: put the files in place
.github/skills/health/SKILL.md1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill health -a gemini-cli2Platform CLI
gemini skills install https://github.com/raphaelchristi/harness-evolver --path skills/healthManually: put the files in place
.devin/skills/health/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill health -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about harness:health
How do I install harness:health in Claude Code?
Run npx skills add raphaelchristi/harness-evolver --skill health -a claude-code. The skill lands at ~/.claude/skills/health/SKILL.md.
What does harness:health do?
It scores dataset quality, lists the problems it finds, and applies fixes: splits, extra hard examples, missing category coverage, and retiring dead examples.
What does harness:health need to run?
A .evolver.json file in the project — without it the skill tells you to run /harness:setup first. Applying split changes also needs LangSmith dataset access.
Source text
SKILL.md · MIT
---
name: harness:health
description: "Use when the user wants to check dataset quality, diagnose eval issues, or before running evolve. Checks size, difficulty distribution, dead examples, coverage, and splits. Auto-corrects issues found."
allowed-tools: [Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion]
---
# /harness:health
Check eval dataset quality and auto-correct issues. Can be run independently or is invoked by `/harness:evolve` before the iteration loop.
## Prerequisites
`.evolver.json` must exist. If not, tell user to run `/harness:setup`.
## Resolve Tool Path and Python
```bash
TOOLS="${EVOLVER_TOOLS:-$([ -d ".evolver/tools" ] && echo ".evolver/tools" || echo "$HOME/.evolver/tools")}"
EVOLVER_PY="${EVOLVER_PY:-$([ -f "$HOME/.evolver/venv/bin/python" ] && echo "$HOME/.evolver/venv/bin/python" || echo "python3")}"
```
## 1. Run Health Diagnostic
```bash
$EVOLVER_PY $TOOLS/dataset_health.py \
--config .evolver.json \
--production-seed production_seed.json \
--output health_report.json 2>/dev/null
```
Print summary:
```bash
python3 -c "
import json, os
if os.path.exists('health_report.json'):
r = json.load(open('health_report.json'))
print(f'Dataset Health: {r[\"health_score\"]}/10 ({r[\"example_count\"]} examples)')
for issue in r.get('issues', []):
print(f' [{issue[\"severity\"]}] {issue[\"message\"]}')
if not r.get('issues'):
print(' No issues found.')
"
```
## 2. Auto-Correct Issues
If `health_report.json` has corrections, apply them automatically:
```bash
CORRECTIONS=$(python3 -c "
import json, os
if os.path.exists('health_report.json'):
r = json.load(open('health_report.json'))
for c in r.get('corrections', []):
print(c['action'])
" 2>/dev/null)
```
For each correction:
**If `create_splits`**: Assign 70/30 train/held_out splits:
```bash
$EVOLVER_PY -c "
from langsmith import Client
import json, random
client = Client()
config = json.load(open('.evolver.json'))
examples = list(client.list_examples(dataset_name=config['dataset']))
random.shuffle(examples)
sp = int(len(examples) * 0.7)
for ex in examples[:sp]:
client.update_example(ex.id, split='train')
for ex in examples[sp:]:
client.update_example(ex.id, split='held_out')
print(f'Assigned splits: {sp} train, {len(examples)-sp} held_out')
"
```
**If `generate_hard`**: Spawn testgen agent to generate hard examples:
```
Agent(
subagent_type: "harness-testgen",
description: "Generate hard examples to rebalance dataset",
prompt: "The dataset is skewed toward easy examples. Generate {count} HARD examples that the current agent is likely to fail on. Focus on edge cases, adversarial inputs, and complex multi-step queries. Read .evolver.json and production_seed.json for context."
)
```
**If `fill_coverage`**: Spawn testgen agent for missing categories:
```
Agent(
subagent_type: "harness-testgen",
description: "Generate examples for missing categories",
prompt: "The dataset is missing these production categories: {categories}. Generate 5 examples per missing category. Read .evolver.json and production_seed.json for context."
)
```
**If `retire_dead`**: Move dead examples to retired split:
```bash
$EVOLVER_PY -c "
from langsmith import Client
import json
client = Client()
report = json.load(open('health_report.json'))
dead_ids = report.get('dead_examples', {}).get('ids', [])
config = json.load(open('.evolver.json'))
examples = {str(e.id): e for e in client.list_examples(dataset_name=config['dataset'])}
retired = 0
for eid in dead_ids:
if eid in examples:
client.update_example(examples[eid].id, split='retired')
retired += 1
print(f'Retired {retired} dead examples')
"
```
After corrections, log what was done.
## 3. Report
Print final health status. If critical issues remain that couldn't be auto-corrected, warn the user.
© raphaelchristi · MIT · raphaelchristi/harness-evolver