$npx -y skills add tigerless-labs/autoharnessA self-learning skill layer for Claude Code — distills skills from your real sessions, updates them as you work, and prunes the ones that stop getting used. No daemon, no benchmark.
| 1 | <h1 align="center">autoharness</h1> |
| 2 | |
| 3 | <p align="center"> |
| 4 | <img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Ftigerless-labs%2Fautoharness%2Fmain%2F.claude-plugin%2Fplugin.json&query=%24.version&label=release&prefix=v&color=brightgreen" alt="release" /> |
| 5 | <img src="https://img.shields.io/badge/python-3.11%2B-blue.svg" alt="python" /> |
| 6 | <img src="https://img.shields.io/badge/platform-Linux%20%7C%20macOS-lightgrey.svg" alt="platform" /> |
| 7 | <img src="https://img.shields.io/badge/license-MIT-yellow.svg" alt="license MIT" /> |
| 8 | </p> |
| 9 | |
| 10 | **autoharness is a self-learning skill layer for Claude Code.** It **learns** skills from your real |
| 11 | sessions, **merges** same-scenario ones instead of stacking near-duplicates, **updates** them in use, |
| 12 | and **prunes** any that stop getting used — so the layer **stays clean on its own**, **touching only |
| 13 | the skills it wrote itself**. |
| 14 | |
| 15 | Same model, different harness — 42% → 78% on CORE-Bench ([HAL](https://arxiv.org/abs/2510.11977)). |
| 16 | The harness does much of the work (swyx's **Big Model vs Big Harness**), yet it's still rebuilt by |
| 17 | hand every model generation. autoharness bets one slice of it — the skill layer — can maintain itself. |
| 18 | |
| 19 | | | | |
| 20 | |---|---| |
| 21 | | **Learns from real work** | Each episode is distilled into a skill from the session you were already having — no separate data-collection or replay loop. | |
| 22 | | **Groups, doesn't just pile up** | A new episode doesn't always add a skill — the reflector compares it against what's there and folds same-scenario skills into one, so the layer consolidates by category instead of accreting near-duplicates. | |
| 23 | | **Validated in use, not on a benchmark** | A skill survives by being adhered to in later turns (usage rate), not a held-out score. No oracle on the active path, and no tokens spent on a dedicated eval. | |
| 24 | | **Only its own skills** | Touches only the skills it generated through this plugin — everything else, whether you wrote it or installed it, is left completely alone. | |
| 25 | | **Evidence kept for later** | Every create/update logs its scenario and decision to a per-skill ledger — the raw material to build a benchmark from real usage if you ever want one. | |
| 26 | |
| 27 | ## Install |
| 28 | |
| 29 | **Requires `python3` on your PATH** — autoharness runs entirely as Python (zero third-party |
| 30 | dependencies); its hooks and MCP server won't fire without it. |
| 31 | |
| 32 | ``` |
| 33 | /plugin marketplace add tigerless-labs/autoharness |
| 34 | /plugin install autoharness@autoharness |
| 35 | ``` |
| 36 | |
| 37 | Run `/reload-plugins` (or restart Claude Code), then check it's live: |
| 38 | |
| 39 | ``` |
| 40 | /plugin # autoharness@autoharness — enabled |
| 41 | /mcp # stage_skill — connected |
| 42 | ``` |
| 43 | |
| 44 | Zero config. It now watches your sessions and lands learned skills into `.claude/skills/` in the |
| 45 | background. Cadence and lifecycle thresholds are tunable — see [Configuration](#configuration). |
| 46 | |
| 47 | ### Update |
| 48 | |
| 49 | ``` |
| 50 | /plugin marketplace update autoharness # pull the latest release |
| 51 | /plugin update autoharness # update the installed copy |
| 52 | /reload-plugins # apply in the running session |
| 53 | ``` |
| 54 | |
| 55 | `/reload-plugins` re-arms the hooks and the MCP server in place; restarting Claude Code works too. |
| 56 | The installed copy is cached by the version in `plugin.json`; releases always bump it, which is |
| 57 | what makes the update take effect. |
| 58 | |
| 59 | ### Uninstall |
| 60 | |
| 61 | ``` |
| 62 | claude plugin uninstall autoharness@autoharness # stops the hooks + MCP server |
| 63 | claude plugin marketplace remove autoharness # optional — also drops the install source |
| 64 | ``` |
| 65 | |
| 66 | Uninstalling only stops it from running — the skills it landed and its own state live **outside** the |
| 67 | plugin and stay on disk. To clear those too, delete its state dir (`~/.claude/autoharness/` global, |
| 68 | `<repo>/.claude/autoharness/` per project) and the self-authored skills under `.claude/skills/` (each |
| 69 | carries a `self-authored` ledger marker, so they're easy to tell from yours). Your own skills are |
| 70 | never touched. |
| 71 | |
| 72 | ## Configuration |
| 73 | |
| 74 | Every knob is an `AUTOHARNESS_*` environment variable with a built-in default — nothing to |
| 75 | configure unless you want to change the pace. |
| 76 | |
| 77 | | Variable | Default | What it does | |
| 78 | |---|---|---| |
| 79 | | `AUTOHARNESS_REFLECT_EVERY_N` | `10` | Reflection cadence: a background reflection run fires every N host turns, and each run receives that full N-turn window. Lower = learns faster, spawns more child sessions. | |
| 80 | | `AUTOHARNESS_DIGEST_EXCHANGES` | `20` | How many exchanges *before* the episode window are compressed into the reflector's prior-context digest (text + tool names only). | |
| 81 | | `AUTOHARNESS_MATURITY_PROJECT` | `100` | Probation gate, project layer: after this many requests have arrived in its layer since a skill landed, it faces graduation review — never used across the whole probation → archived; used at least once → graduates into the mature pool. Until then it's recalled as usual but can't be archived. | |
| 82 | | `AUTOHARNESS_MATURITY_GLOBAL` | `300` | Same gate for the global layer — higher because a global skill loads in every project. | |