{"id":22941,"date":"2010-01-25T05:11:44","date_gmt":"2010-01-25T05:11:44","guid":{"rendered":"https:\/\/scannn.com\/tigerless-labs-autoharness-autoharness-a-self-learning-skill-layer-for-claude-code-distills-skills-from-your-real-sessions-updates-them-as-you-work-and-prunes-the-ones-that-stop\/"},"modified":"2010-01-25T05:11:44","modified_gmt":"2010-01-25T05:11:44","slug":"tigerless-labs-autoharness-autoharness-a-self-learning-skill-layer-for-claude-code-distills-skills-from-your-real-sessions-updates-them-as-you-work-and-prunes-the-ones-that-stop","status":"publish","type":"post","link":"https:\/\/scannn.com\/lv\/tigerless-labs-autoharness-autoharness-a-self-learning-skill-layer-for-claude-code-distills-skills-from-your-real-sessions-updates-them-as-you-work-and-prunes-the-ones-that-stop\/","title":{"rendered":"tigerless-labs\/autoharness: Autoharness \u2014 a self-learning skill layer for Claude Code \u2014 distills skills from your real sessions, updates them as you work, and prunes the ones that stop getting used. No daemon, no benchmark. \u00b7 GitHub"},"content":{"rendered":"\n<div id=\"\">\n<p align=\"center\" dir=\"auto\"><strong>Self-Learning Skills for Claude Code<\/strong><\/p>\n<p align=\"center\" dir=\"auto\">\n  <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/5a5b81ccad8b975dd56fbc9947b3e57fe678bfe9ec2feb5302161ac094bffecc\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f6a736f6e3f75726c3d68747470732533412532462532467261772e67697468756275736572636f6e74656e742e636f6d25324674696765726c6573732d6c6162732532466175746f6861726e6573732532466d61696e2532462e636c617564652d706c7567696e253246706c7567696e2e6a736f6e2671756572793d2532342e76657273696f6e266c6162656c3d72656c65617365267072656669783d7626636f6c6f723d627269676874677265656e\"><\/a> <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/b53facf22983aa2d774dc86c7382e9d08096b26bd96bc2d83e6885a50bacea85\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31312532422d626c75652e737667\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/b53facf22983aa2d774dc86c7382e9d08096b26bd96bc2d83e6885a50bacea85\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31312532422d626c75652e737667\" alt=\"python\" data-canonical-src=\"https:\/\/img.shields.io\/badge\/python-3.11%2B-blue.svg\" style=\"max-width: 100%;\"\/><\/a> <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/3a15cbf23d1eb6ace887e94d623cbfe2a9fc218c232e0d0b9c027f9887c5023c\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d4c696e75782532302537432532306d61634f532d6c69676874677265792e737667\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/3a15cbf23d1eb6ace887e94d623cbfe2a9fc218c232e0d0b9c027f9887c5023c\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d4c696e75782532302537432532306d61634f532d6c69676874677265792e737667\" alt=\"platform\" data-canonical-src=\"https:\/\/img.shields.io\/badge\/platform-Linux%20%7C%20macOS-lightgrey.svg\" style=\"max-width: 100%;\"\/><\/a> <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/07a7d0169027aac6d7a0bfa8964dfef5fbc40d5a2075cabb3d8bc67e17be3451\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d79656c6c6f772e737667\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/07a7d0169027aac6d7a0bfa8964dfef5fbc40d5a2075cabb3d8bc67e17be3451\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d79656c6c6f772e737667\" alt=\"license MIT\" data-canonical-src=\"https:\/\/img.shields.io\/badge\/license-MIT-yellow.svg\" style=\"max-width: 100%;\"\/><\/a>\n<\/p>\n<p dir=\"auto\"><strong>autoharness is a self-learning skill layer for Claude Code.<\/strong> It <strong>learns<\/strong> skills from your real<br \/>\nsessions, <strong>merges<\/strong> same-scenario ones instead of stacking near-duplicates, <strong>updates<\/strong> them in use,<br \/>\nand <strong>prunes<\/strong> any that stop getting used \u2014 so the layer <strong>stays clean on its own<\/strong>, <strong>touching only<br \/>\nthe skills it wrote itself<\/strong>.<\/p>\n<p dir=\"auto\">Same model, different harness \u2014 42% \u2192 78% on CORE-Bench (<a href=\"https:\/\/arxiv.org\/abs\/2510.11977\" rel=\"nofollow\">HAL<\/a>).<br \/>\nThe harness does much of the work (swyx&#8217;s <strong>Big Model vs Big Harness<\/strong>), yet it&#8217;s still rebuilt by<br \/>\nhand every model generation. autoharness bets one slice of it \u2014 the skill layer \u2014 can maintain itself.<\/p>\n<p><markdown-accessiblity-table><\/p>\n<table>\n<thead>\n<tr>\n<th\/>\n<th\/>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Learns from real work<\/strong><\/td>\n<td>Each episode is distilled into a skill from the session you were already having \u2014 no separate data-collection or replay loop.<\/td>\n<\/tr>\n<tr>\n<td><strong>Groups, doesn&#8217;t just pile up<\/strong><\/td>\n<td>A new episode doesn&#8217;t always add a skill \u2014 the reflector compares it against what&#8217;s there and folds same-scenario skills into one, so the layer consolidates by category instead of accreting near-duplicates.<\/td>\n<\/tr>\n<tr>\n<td><strong>Validated in use, not on a benchmark<\/strong><\/td>\n<td>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.<\/td>\n<\/tr>\n<tr>\n<td><strong>Only its own skills<\/strong><\/td>\n<td>Touches only the skills it generated through this plugin \u2014 everything else, whether you wrote it or installed it, is left completely alone.<\/td>\n<\/tr>\n<tr>\n<td><strong>Evidence kept for later<\/strong><\/td>\n<td>Every create\/update logs its scenario and decision to a per-skill ledger \u2014 the raw material to build a benchmark from real usage if you ever want one.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/markdown-accessiblity-table><\/p>\n<p dir=\"auto\"><strong>Requires <code>python3<\/code> on your PATH<\/strong> \u2014 autoharness runs entirely as Python (zero third-party<br \/>\ndependencies); its hooks and MCP server won&#8217;t fire without it.<\/p>\n<p dir=\"auto\">Type these in the Claude Code input box.<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\/plugin marketplace add tigerless-labs\/autoharness&#10;\/plugin install autoharness@autoharness\">\n<pre class=\"notranslate\"><code>\/plugin marketplace add tigerless-labs\/autoharness\n\/plugin install autoharness@autoharness\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">Then run <code>\/reload-plugins<\/code> (or restart Claude Code).<\/p>\n<p dir=\"auto\">Zero config. It now watches your sessions and lands learned skills into <code>.claude\/skills\/<\/code> in the<br \/>\nbackground. Cadence and lifecycle thresholds are tunable \u2014 see <a href=\"#configuration\">Configuration<\/a>.<\/p>\n<p dir=\"auto\">Update from a terminal \u2014 refresh the catalog, then update with the <strong>full <code>plugin@marketplace<\/code><br \/>\nid<\/strong>, then restart:<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"claude plugin marketplace update autoharness       &#10;claude plugin update autoharness@autoharness\">\n<pre class=\"notranslate\"><code>claude plugin marketplace update autoharness       \nclaude plugin update autoharness@autoharness\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">Then <strong>restart Claude Code<\/strong> to apply \u2014 a version bump is a fresh cached copy, not a hot reload.<\/p>\n<p dir=\"auto\">The refresh is first on purpose: without it, <code>update<\/code> checks a stale local catalog and may report<br \/>\n<code>already at the latest version<\/code> when a newer release actually shipped.<\/p>\n<p dir=\"auto\">Third-party marketplaces have auto-update <strong>off<\/strong> by default. To make future releases hands-off,<br \/>\nenable it once: <code>\/plugin<\/code> \u2192 <strong>Marketplaces<\/strong> \u2192 <strong>autoharness<\/strong> \u2192 <strong>Enable auto-update<\/strong>. The<br \/>\ninstalled copy is cached by the <code>version<\/code> in <code>plugin.json<\/code>; a release reaches users only when that<br \/>\nfield is bumped.<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"claude plugin uninstall autoharness@autoharness     &#10;claude plugin marketplace remove autoharness       \">\n<pre class=\"notranslate\"><code>claude plugin uninstall autoharness@autoharness     \nclaude plugin marketplace remove autoharness       \n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">Uninstalling only stops it from running \u2014 the skills it landed and its own state live <strong>outside<\/strong> the<br \/>\nplugin and stay on disk. To clear those too, delete its state dir (<code>~\/.claude\/autoharness\/<\/code> global,<br \/>\n<code>&lt;repo&gt;\/.claude\/autoharness\/<\/code> per project) and the self-authored skills under <code>.claude\/skills\/<\/code> (each<br \/>\ncarries a <code>self-authored<\/code> ledger marker, so they&#8217;re easy to tell from yours). Your own skills are<br \/>\nnever touched.<\/p>\n<p dir=\"auto\">Every knob is an <code>AUTOHARNESS_*<\/code> environment variable with a built-in default \u2014 nothing to<br \/>\nconfigure unless you want to change the pace.<\/p>\n<p><markdown-accessiblity-table><\/p>\n<table>\n<thead>\n<tr>\n<th>Variable<\/th>\n<th>Default<\/th>\n<th>What it does<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>AUTOHARNESS_REFLECT_EVERY_N<\/code><\/td>\n<td><code>10<\/code><\/td>\n<td>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.<\/td>\n<\/tr>\n<tr>\n<td><code>AUTOHARNESS_DIGEST_EXCHANGES<\/code><\/td>\n<td><code>20<\/code><\/td>\n<td>How many exchanges <em>before<\/em> the episode window are compressed into the reflector&#8217;s prior-context digest (text + tool names only).<\/td>\n<\/tr>\n<tr>\n<td><code>AUTOHARNESS_MATURITY_PROJECT<\/code><\/td>\n<td><code>100<\/code><\/td>\n<td>Probation gate, project layer: after this many requests have arrived in its layer since a skill landed, it faces graduation review \u2014 never used across the whole probation \u2192 archived; used at least once \u2192 graduates into the mature pool. Until then it&#8217;s recalled as usual but can&#8217;t be archived.<\/td>\n<\/tr>\n<tr>\n<td><code>AUTOHARNESS_MATURITY_GLOBAL<\/code><\/td>\n<td><code>300<\/code><\/td>\n<td>Same gate for the global layer \u2014 higher because a global skill loads in every project.<\/td>\n<\/tr>\n<tr>\n<td><code>AUTOHARNESS_CAPACITY_PROJECT<\/code><\/td>\n<td><code>50<\/code><\/td>\n<td>Cap on <em>mature<\/em> skills in the project layer. For graduates, capacity contention is the only death: nothing is archived until the mature pool exceeds this, then the lowest usage rates go first.<\/td>\n<\/tr>\n<tr>\n<td><code>AUTOHARNESS_CAPACITY_GLOBAL<\/code><\/td>\n<td><code>20<\/code><\/td>\n<td>Same cap for the global layer \u2014 smaller because its blast radius is every project.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/markdown-accessiblity-table><\/p>\n<p dir=\"auto\">Set them in the environment Claude Code launches with \u2014 either the shell<br \/>\n(<code>export AUTOHARNESS_REFLECT_EVERY_N=3<\/code>) or the <code>env<\/code> map in <code>.claude\/settings.json<\/code>:<\/p>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{ &quot;env&quot;: { &quot;AUTOHARNESS_REFLECT_EVERY_N&quot;: &quot;3&quot; } }\">\n<pre>{ <span class=\"pl-ent\">\"env\"<\/span>: { <span class=\"pl-ent\">\"AUTOHARNESS_REFLECT_EVERY_N\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>3<span class=\"pl-pds\">\"<\/span><\/span> } }<\/pre>\n<\/div>\n<p dir=\"auto\">Hooks read the environment on every event, so a change applies from the next session. The defaults<br \/>\nare deliberate placeholders pending empirical calibration (tracked under <code>experiments\/<\/code>); size caps<br \/>\non captured windows and staged skill bodies are fixed constants, not env knobs.<\/p>\n<p dir=\"auto\">A learning pipeline runs beside the host and stays off its recall path \u2014 symbols are plain native<br \/>\nskills, recalled by the host&#8217;s own name-and-description mechanism as if a human had written them.<\/p>\n<p align=\"center\" dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/tigerless-labs\/autoharness\/blob\/main\/docs\/assets\/pipeline.svg\"><img decoding=\"async\" src=\"https:\/\/github.com\/tigerless-labs\/autoharness\/raw\/main\/docs\/assets\/pipeline.svg\" alt=\"autoharness pipeline: host \u2192 CAP \u2192 REF \u2192 promoter \u2192 .claude\/skills \u2192 host, with MNG and LED beside\" width=\"760\" style=\"max-width: 100%;\"\/><\/a><\/p>\n<p dir=\"auto\"><sub>Diagram source: <a href=\"https:\/\/github.com\/tigerless-labs\/autoharness\/blob\/main\/docs\/assets\/pipeline.mmd\"><code>docs\/assets\/pipeline.mmd<\/code><\/a> \u2014 re-render to <code>pipeline.svg<\/code> after editing.<\/sub><\/p>\n<p><markdown-accessiblity-table><\/p>\n<table>\n<thead>\n<tr>\n<th>Component<\/th>\n<th>Role<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>CAP<\/strong> \u00b7 capture<\/td>\n<td>Hook-driven dumb pipe: grabs each turn (user input, agent output, tool I\/O), redacts at egress, points back at the host log instead of copying it.<\/td>\n<\/tr>\n<tr>\n<td><strong>REF<\/strong> \u00b7 reflect<\/td>\n<td>At an episode boundary, receives the current episode window in full detail (the last N turns, tool I\/O included) plus a compressed digest of the exchanges before it (text and tool names only), reads the existing skill index, and decides add \/ merge \/ patch \/ drop a support file \/ delete \u2014 emits an intent (body, delta, or path, plus reason and evidence). Proposes only; no write tools.<\/td>\n<\/tr>\n<tr>\n<td><strong>promoter<\/strong> \u00b7 validate\u00b7store<\/td>\n<td>The only writer. Lints the intent in memory (safety, structure, ledger, completeness, self-authored-only) and on pass does an atomic rename into the live skill directory.<\/td>\n<\/tr>\n<tr>\n<td><strong>MNG<\/strong> \u00b7 lifecycle<\/td>\n<td>Daemon-free: recomputed lazily at session start, once per session. Ranks symbols by usage rate \u2014 uses over the requests that arrived since the symbol was created, so the measure is opportunity-relative and a closed laptop doesn&#8217;t age anyone out (the wall-clock replacement). A use is counted whenever the host consumes the skill: a Skill-tool invocation or a read of any file in the skill&#8217;s directory (measured to be the dominant path). New symbols sit in probation until they&#8217;ve had a fair sample of requests: recalled as usual, but neither counted against the cap nor evictable. At maturity, graduation review: zero use across the whole probation \u2192 archived, never enters the pool. For graduates, capacity contention is the only death \u2014 nothing is archived until a layer&#8217;s mature pool exceeds its cap, then the lowest rates go first. Archives, never deletes: an archived symbol is a directory moved out of recall, and moving it back revives it.<\/td>\n<\/tr>\n<tr>\n<td><strong>LED<\/strong> \u00b7 ledger<\/td>\n<td>Per-symbol append-only sidecar: why each symbol was born or changed, with evidence and a reflection watermark. Kept out of the skill body so recall stays clean.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/markdown-accessiblity-table><\/p>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">Walkthrough: watching it learn<\/h2>\n<p><a id=\"user-content-walkthrough-watching-it-learn\" class=\"anchor\" aria-label=\"Permalink: Walkthrough: watching it learn\" href=\"#walkthrough-watching-it-learn\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<p dir=\"auto\">Everything autoharness does lands on disk as plain files \u2014 a demo is just opening them in the<br \/>\nright order. For a fast-paced run, speed up the loop first (see <a href=\"#configuration\">Configuration<\/a>):<\/p>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{ &quot;env&quot;: { &quot;AUTOHARNESS_REFLECT_EVERY_N&quot;: &quot;1&quot;,&#10;           &quot;AUTOHARNESS_MATURITY_PROJECT&quot;: &quot;5&quot;,&#10;           &quot;AUTOHARNESS_CAPACITY_PROJECT&quot;: &quot;2&quot; } }\">\n<pre>{ <span class=\"pl-ent\">\"env\"<\/span>: { <span class=\"pl-ent\">\"AUTOHARNESS_REFLECT_EVERY_N\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>1<span class=\"pl-pds\">\"<\/span><\/span>,\n           <span class=\"pl-ent\">\"AUTOHARNESS_MATURITY_PROJECT\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>5<span class=\"pl-pds\">\"<\/span><\/span>,\n           <span class=\"pl-ent\">\"AUTOHARNESS_CAPACITY_PROJECT\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>2<span class=\"pl-pds\">\"<\/span><\/span> } }<\/pre>\n<\/div>\n<p dir=\"auto\"><strong>1 \u00b7 The pipeline running.<\/strong> Work a few normal turns on anything non-trivial (debug something,<br \/>\nfigure out a workflow). Every Nth turn a background reflection fires \u2014 nothing blocks your session.<br \/>\nIts bookkeeping is visible in the state dir:<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"ls .claude\/autoharness\/        # per project \u2014 ~\/.claude\/autoharness\/ for the global layer&#10;  requests                     # layer request counter (MNG's denominator)&#10;  session-&lt;id&gt;                 # per-session turn count toward the next reflection&#10;  offset-&lt;id&gt;                  # byte watermark: where the last captured window ended&#10;  intents\/                     # queued skill proposals awaiting the promoter\">\n<pre class=\"notranslate\"><code>ls .claude\/autoharness\/        # per project \u2014 ~\/.claude\/autoharness\/ for the global layer\n  requests                     # layer request counter (MNG's denominator)\n  session-&lt;id&gt;                 # per-session turn count toward the next reflection\n  offset-&lt;id&gt;                  # byte watermark: where the last captured window ended\n  intents\/                     # queued skill proposals awaiting the promoter\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\"><strong>2 \u00b7 A skill is born.<\/strong> After a reflection lands, a new folder appears under <code>.claude\/skills\/<\/code><br \/>\n(project) or <code>~\/.claude\/skills\/<\/code> (global \u2014 for techniques that aren&#8217;t repo-specific). Use <code>ls -la<\/code>:<br \/>\nthe interesting files are hidden.<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\".claude\/skills\/&lt;name&gt;\/&#10;  SKILL.md                     # the skill itself \u2014 plain native format, nothing proprietary&#10;  .ledger.jsonl                # LED: why it was born \/ changed (append-only)&#10;  .sidecar.json                # lifecycle counters MNG reads&#10;  references\/evidence-*.md     # the transcript slice that justified each ledger entry&#10;  scripts\/ templates\/ ...      # optional support files the reflector attached\">\n<pre class=\"notranslate\"><code>.claude\/skills\/&lt;name&gt;\/\n  SKILL.md                     # the skill itself \u2014 plain native format, nothing proprietary\n  .ledger.jsonl                # LED: why it was born \/ changed (append-only)\n  .sidecar.json                # lifecycle counters MNG reads\n  references\/evidence-*.md     # the transcript slice that justified each ledger entry\n  scripts\/ templates\/ ...      # optional support files the reflector attached\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\"><strong>3 \u00b7 LED \u2014 the paper trail.<\/strong> <code>cat .ledger.jsonl<\/code> \u2014 one JSON line per lifecycle event:<\/p>\n<div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{&quot;action&quot;: &quot;create&quot;, &quot;reason&quot;: &quot;User asked about the correct command to update a plugin ...&quot;, &quot;evidence&quot;: &quot;references\/evidence-21cd22cc.md&quot;}&#10;{&quot;action&quot;: &quot;patch&quot;,  &quot;reason&quot;: &quot;User discovered \/reload-plugins is required in-session ...&quot;,  &quot;evidence&quot;: &quot;references\/evidence-1a4ec51d.md&quot;}\">\n<pre>{<span class=\"pl-ent\">\"action\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>create<span class=\"pl-pds\">\"<\/span><\/span>, <span class=\"pl-ent\">\"reason\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>User asked about the correct command to update a plugin ...<span class=\"pl-pds\">\"<\/span><\/span>, <span class=\"pl-ent\">\"evidence\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>references\/evidence-21cd22cc.md<span class=\"pl-pds\">\"<\/span><\/span>}\n{<span class=\"pl-ent\">\"action\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>patch<span class=\"pl-pds\">\"<\/span><\/span>,  <span class=\"pl-ent\">\"reason\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>User discovered \/reload-plugins is required in-session ...<span class=\"pl-pds\">\"<\/span><\/span>,  <span class=\"pl-ent\">\"evidence\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>references\/evidence-1a4ec51d.md<span class=\"pl-pds\">\"<\/span><\/span>}<\/pre>\n<\/div>\n<p dir=\"auto\"><code>action<\/code> + <code>reason<\/code> + <code>evidence<\/code> \u2014 and the evidence file is a real, redacted slice of the session<br \/>\nthat taught it, materialized by the promoter (content-addressed, so the model never names files).<br \/>\nThis is the &#8220;evidence kept for later&#8221; from the table above.<\/p>\n<p dir=\"auto\"><strong>4 \u00b7 An update, not a duplicate.<\/strong> Hit the same scenario again with a correction (&#8220;that&#8217;s missing<br \/>\na step&#8221;) and let the next reflection run. The skill layer does <strong>not<\/strong> grow a near-duplicate:<br \/>\nthe existing skill&#8217;s <code>SKILL.md<\/code> changes and its ledger appends a <code>patch<\/code>\/<code>update<\/code> line \u2014 the<br \/>\ntwo-line ledger above is a real example. <code>git diff<\/code> on a project-layer skill shows the edit.<\/p>\n<p dir=\"auto\"><strong>5 \u00b7 Recall is the host&#8217;s, untouched.<\/strong> Landed skills load like hand-written ones \u2014 same<br \/>\nname-and-description recall, no autoharness code on that path. When one is used \u2014 invoked as a<br \/>\nskill or read from its directory \u2014 <code>calls<\/code> in its <code>.sidecar.json<\/code> ticks up: that adherence count<br \/>\nis the validation signal.<\/p>\n<p dir=\"auto\"><strong>6 \u00b7 Retirement is an archive, not a delete.<\/strong> Two paths out, both a folder move to<br \/>\n<code>.claude\/skills\/.archive\/&lt;name&gt;\/<\/code> \u2014 ledger, evidence and all, out of recall. A skill never used<br \/>\nacross its whole probation is archived at graduation review; after graduation, once a layer&#8217;s<br \/>\nmature pool exceeds capacity the lowest-usage-rate skills go. Moving the folder back revives it,<br \/>\nhistory intact. With the shrunk knobs above this fires within one session; at defaults it takes<br \/>\nhundreds of turns.<\/p>\n<p dir=\"auto\"><strong>7 \u00b7 Yours are never touched.<\/strong> Every autoharness-authored skill carries the ledger marker;<br \/>\nanything without it \u2014 skills you wrote or installed \u2014 is invisible to the promoter and MNG.<\/p>\n<p dir=\"auto\">A self-learning skill layer can be validated against a held-out benchmark, or against its own use.<br \/>\nautoharness takes the second \u2014 cheaper, and it works on a live host doing open-ended work where no<br \/>\nbenchmark exists.<\/p>\n<p><markdown-accessiblity-table><\/p>\n<table>\n<thead>\n<tr>\n<th\/>\n<th>Grow unbounded<\/th>\n<th>Offline-gated self-edit<br \/>(<a href=\"https:\/\/arxiv.org\/abs\/2606.09498\" rel=\"nofollow\">Self-Harness<\/a>)<\/th>\n<th>Timer + daemon<br \/>(<a href=\"https:\/\/github.com\/NousResearch\/hermes-agent\">hermes-agent<\/a>)<\/th>\n<th>autoharness<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Bounds the skill layer<\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Validation signal<\/td>\n<td>None<\/td>\n<td>Held-out benchmark score<\/td>\n<td>Wall-clock inactivity<\/td>\n<td>Adherence in use<\/td>\n<\/tr>\n<tr>\n<td>Needs a benchmark \/ oracle<\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td>Needs a resident daemon<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<td>No<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/markdown-accessiblity-table><\/p>\n<p dir=\"auto\"><a href=\"https:\/\/github.com\/NousResearch\/hermes-agent\">NousResearch\/hermes-agent<\/a> \u2014 studying its<br \/>\nauto-skill-creation and memory-consolidation design helped sharpen autoharness&#8217;s adherence-based,<br \/>\ndaemon-free take.<\/p>\n<p dir=\"auto\">Built by Tigerless Labs.<\/p>\n<p dir=\"auto\"><a href=\"https:\/\/github.com\/tigerless-labs\/autoharness\/blob\/main\/LICENSE\">MIT<\/a><\/p>\n<\/div>\n<p><a href=\"https:\/\/github.com\/tigerless-labs\/autoharness?utm_source=tldrinfosec\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Self-Learning Skills for Claude Code autoharness is a self-learning skill layer for Claude Code. It learns skills from your real sessions, merges same-scenario ones instead of stacking near-duplicates, updates them in use, and prunes any that stop getting used \u2014 so the layer stays clean on its own, touching only the skills it wrote itself. [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":22942,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143],"tags":[],"class_list":["post-22941","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai"],"_links":{"self":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/22941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/comments?post=22941"}],"version-history":[{"count":0,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/22941\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media\/22942"}],"wp:attachment":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media?parent=22941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/categories?post=22941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/tags?post=22941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}