Skip to main content
skill CX Codex

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.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add raphaelchristi/harness-evolver --skill health -a claude-code
Open on GitHub

What 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:health and 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-code

2Manually: put the files in place

~/.claude/skills/health/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/health/

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

Similar skills

All skills for Agent setup: memory, context, orchestration →

From the same set3

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor