Learnabolic

skill that gives AI agents self-improvement

Your 👍 is the gradient.

Watch it learn → GitHub

No API key. No model. ~150 lines of math.

live sim · gen 0 · fitness —

§ 02 · the problem

learnabolicp. 02 / 12

§ 03 · the idea

The LLM proposes, statistics disposes.

agent
gate
RejectPromote

kept 0 · n = 0

learnabolicp. 03 / 12

§ 04 · any score

If you can measure it, or rate it, learnabolic can use it to improve your agent.

goals.md
- thumbs (w=1): 0..1 higher
- quality (w=1): 0..10 higher target 8
- speed (w=0.3): 0..2000 lower target 500
- tests (w=0.5): auto higher
- conversion (w=1): 0..10 higher target 4
learnabolicp. 04 / 12

§ 05 · the four instruments

Counting, not judging.

Thompson

Bets on promising candidates without starving the rest.

Q-direction

Learns where to push: tighten, prune, explore…

SPRT ratchet
RejectPromote

Keeps a change only when the evidence says so. Then never slips back.

CUSUM

Notices when it's stuck, then explores.

Why no LLM judge? Judges drift, flatter and cost tokens. Counting doesn't.

learnabolicp. 05 / 12

§ 06 · goals steer

Goals steer; humans own the North Star.

GoalsetpointScoresensorGaperrorDirectioncontrollerSmall editactuator
learnabolicp. 06 / 12

§ 07 · live lab

Watch it learn, live.

Pick two: Correct, Fast, Cheap. Then watch it learn your taste.

Open the full Lab →

learnabolicp. 07 / 12

§ 08 · portable brains

A brain is just a SKILL.md.

learned/sim/SKILL.md
---
name: sim
description: Correct, Fast, Cheap, learned in the Learnabolic Lab.
---
# Coding habits

Strength 0–1: how often the agent does it.

- Write a failing test first (0.00)
- Read the whole file before editing (0.80)
- Reuse existing helpers (0.86)
- Answer in one pass, skip re-checks (0.65)
- Keep diffs small (0.90)
- Run the full test suite after each change (0.00)

```learnabolic
{
  "version": 1,
  "generation": 15,
  "q": {
    "correct|flat": {
      "tighten": -0.025210390978246677,
      "emphasize-weakest-kr": -1.1091207952387683,
      "add-example": -1.0645384726967049,
      "explore": -0.982775643811597,
      "reorder": -1.0641952393127705,
      "prune": -0.9308111040422842
    },
    "cheap|flat": {
      "reorder": 0.032225360000000036,
      "emphasize-weakest-kr": 0.71245,
      "prune": 0.6944916666666667
    },
    "cheap|up": {
      "emphasize-weakest-kr": 1.1748835466666667,
      "add-example": 0.7455333333333333
    },
    "correct|up": {
      "tighten": 0.26,
      "prune": -0.4193918852993734,
      "add-example": -0.6080166121583175,
      "reorder": 0.0002642267989333702,
      "emphasize-weakest-kr": 0.20865139337578326
    },
    "correct|down": {
      "explore": 0.07474889337578339,
      "reorder": -0.16130464764556363,
      "tighten": 0.2262
    }
  },
  "fitnessHistory": [
    0.4185510699338983,
    0.4185510699338983,
    0.4185510699338983,
    0.45532911077564897,
    0.45109968371782677,
    0.5018051015800572,
    0.5266047328662946,
    0.5612413968448526,
    0.5669307372621828,
    0.557596907934775,
    0.5585242915724078,
    0.6092103185292265,
    0.6092103185292265,
    0.6174896901796522,
    0.6162652688199115,
    0.6138004345546706,
    0.6136325305840912,
    0.6106750113707854,
    0.6198476205184079,
    0.6180247546058769,
    0.6255667654796718,
    0.6181568701494322,
    0.6215617878817765,
    0.619442200916749,
    0.607366959403693,
    0.6411773383895388,
    0.6359955905763048,
    0.6379649423819049,
    0.6386553534693458,
    0.6319588084946842,
    0.6329792371079757,
    0.6355738064204125,
    0.6441623791654043,
    0.6342062666545438,
    0.631232542246862,
    0.6362995909343356,
    0.6362995909343356,
    0.6335094530591927,
    0.6336436805565426,
    0.640184509563759,
    0.6406878297946912,
    0.6382962556595023,
    0.6344966209934009,
    0.6344966209934009,
    0.6223205991350939,
    0.6259578231945959,
    0.624484599802904,
    0.6211752227754676,
    0.6279557349626201,
    0.6274239766174715,
    0.6496465854163999,
    0.6516629148912165,
    0.6499306901356137,
    0.6422274596899268,
    0.6407615429200538,
    0.6389557298861409,
    0.6442408077179567,
    0.6459147492824876,
    0.64841378815384,
    0.6491813703265527,
    0.5994536694873139,
    0.6368341073170858,
    0.6401019241396293,
    0.637838009538097,
    0.6520293641285502,
    0.6439441601857132,
    0.6438240474467677,
    0.6438240474467677,
    0.6466825113699703,
    0.6512035790895015,
    0.6512078356774467,
    0.6458368213654477,
    0.627979660364941,
    0.6425688866957622,
    0.6373025465780262,
    0.6365413416518353,
    0.6346643904156101,
    0.6392552349591598,
    0.6499623191539247,
    0.6475799983748709,
    0.6482736137896145,
    0.6481647795950469,
    0.6449799291120413,
    0.6490772212601349,
    0.64643596073202,
    0.64643596073202,
    0.6452874961604277,
    0.6426935572176797,
    0.6529444391477058
  ],
  "lineage": [
    {
      "id": "v0",
      "parent": null,
      "direction": null,
      "generation": 0
    },
    {
      "id": "v6",
      "parent": "v0",
      "direction": "emphasize-weakest-kr",
      "generation": 1
    },
    {
      "id": "v9",
      "parent": "v6",
      "direction": "emphasize-weakest-kr",
      "generation": 2
    },
    {
      "id": "v12",
      "parent": "v9",
      "direction": "reorder",
      "generation": 3
    },
    {
      "id": "v14",
      "parent": "v12",
      "direction": "add-example",
      "generation": 4
    },
    {
      "id": "v17",
      "parent": "v14",
      "direction": "emphasize-weakest-kr",
      "generation": 5
    },
    {
      "id": "v21",
      "parent": "v17",
      "direction": "emphasize-weakest-kr",
      "generation": 6
    },
    {
      "id": "v26",
      "parent": "v21",
      "direction": "prune",
      "generation": 7
    },
    {
      "id": "v41",
      "parent": "v26",
      "direction": "reorder",
      "generation": 8
    },
    {
      "id": "v45",
      "parent": "v41",
      "direction": "explore",
      "generation": 9
    },
    {
      "id": "v56",
      "parent": "v45",
      "direction": "tighten",
      "generation": 10
    },
    {
      "id": "v61",
      "parent": "v56",
      "direction": "tighten",
      "generation": 11
    },
    {
      "id": "v73",
      "parent": "v61",
      "direction": "explore",
      "generation": 12
    },
    {
      "id": "v85",
      "parent": "v73",
      "direction": "tighten",
      "generation": 13
    },
    {
      "id": "v88",
      "parent": "v85",
      "direction": "tighten",
      "generation": 14
    },
    {
      "id": "v120",
      "parent": "v88",
      "direction": "tighten",
      "generation": 15
    }
  ],
  "ledger": [
    {"t":"2026-10-03T14:53:21.057Z","event":"reject","variant":"v94","direction":"emphasize-weakest-kr","s":null,"decision":"reject","fitness":0.6520293641285502},
    {"t":"2026-10-03T14:53:21.058Z","event":"reject","variant":"v95","direction":"tighten","s":null,"decision":"reject","fitness":0.6439441601857132},
    {"t":"2026-10-03T14:53:21.058Z","event":"reject","variant":"v96","direction":"add-example","s":null,"decision":"reject","fitness":0.6438240474467677},
    {"t":"2026-10-03T14:53:21.058Z","event":"propose","variant":"v97","direction":"add-example","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.058Z","event":"propose","variant":"v98","direction":"add-example","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.058Z","event":"reject","variant":"v99","direction":"reorder","s":null,"decision":"reject","fitness":0.6438240474467677},
    {"t":"2026-10-03T14:53:21.059Z","event":"reject","variant":"v97","direction":"add-example","s":null,"decision":"reject","fitness":0.6466825113699703},
    {"t":"2026-10-03T14:53:21.060Z","event":"reject","variant":"v98","direction":"add-example","s":null,"decision":"reject","fitness":0.6512035790895015},
    {"t":"2026-10-03T14:53:21.060Z","event":"propose","variant":"v100","direction":"prune","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.060Z","event":"propose","variant":"v101","direction":"emphasize-weakest-kr","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.060Z","event":"propose","variant":"v102","direction":"emphasize-weakest-kr","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.061Z","event":"reject","variant":"v100","direction":"prune","s":null,"decision":"reject","fitness":0.6512078356774467},
    {"t":"2026-10-03T14:53:21.061Z","event":"reject","variant":"v101","direction":"emphasize-weakest-kr","s":null,"decision":"reject","fitness":0.6458368213654477},
    {"t":"2026-10-03T14:53:21.061Z","event":"reject","variant":"v102","direction":"emphasize-weakest-kr","s":null,"decision":"reject","fitness":0.627979660364941},
    {"t":"2026-10-03T14:53:21.062Z","event":"propose","variant":"v103","direction":"reorder","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.062Z","event":"propose","variant":"v104","direction":"emphasize-weakest-kr","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.062Z","event":"propose","variant":"v105","direction":"reorder","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.062Z","event":"reject","variant":"v104","direction":"emphasize-weakest-kr","s":null,"decision":"reject","fitness":0.6425688866957622},
    {"t":"2026-10-03T14:53:21.063Z","event":"reject","variant":"v105","direction":"reorder","s":null,"decision":"reject","fitness":0.6373025465780262},
    {"t":"2026-10-03T14:53:21.063Z","event":"reject","variant":"v103","direction":"reorder","s":null,"decision":"reject","fitness":0.6365413416518353},
    {"t":"2026-10-03T14:53:21.064Z","event":"propose","variant":"v106","direction":"add-example","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.064Z","event":"propose","variant":"v107","direction":"add-example","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.064Z","event":"propose","variant":"v108","direction":"reorder","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.064Z","event":"reject","variant":"v106","direction":"add-example","s":null,"decision":"reject","fitness":0.6346643904156101},
    {"t":"2026-10-03T14:53:21.064Z","event":"reject","variant":"v108","direction":"reorder","s":null,"decision":"reject","fitness":0.6392552349591598},
    {"t":"2026-10-03T14:53:21.065Z","event":"reject","variant":"v107","direction":"add-example","s":null,"decision":"reject","fitness":0.6499623191539247},
    {"t":"2026-10-03T14:53:21.065Z","event":"propose","variant":"v109","direction":"explore","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.065Z","event":"propose","variant":"v110","direction":"reorder","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.065Z","event":"propose","variant":"v111","direction":"prune","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.066Z","event":"reject","variant":"v110","direction":"reorder","s":null,"decision":"reject","fitness":0.6475799983748709},
    {"t":"2026-10-03T14:53:21.066Z","event":"reject","variant":"v109","direction":"explore","s":null,"decision":"reject","fitness":0.6482736137896145},
    {"t":"2026-10-03T14:53:21.067Z","event":"reject","variant":"v111","direction":"prune","s":null,"decision":"reject","fitness":0.6481647795950469},
    {"t":"2026-10-03T14:53:21.067Z","event":"propose","variant":"v112","direction":"emphasize-weakest-kr","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.067Z","event":"propose","variant":"v113","direction":"tighten","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.067Z","event":"propose","variant":"v114","direction":"emphasize-weakest-kr","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.067Z","event":"reject","variant":"v113","direction":"tighten","s":null,"decision":"reject","fitness":0.6449799291120413},
    {"t":"2026-10-03T14:53:21.068Z","event":"reject","variant":"v112","direction":"emphasize-weakest-kr","s":null,"decision":"reject","fitness":0.6490772212601349},
    {"t":"2026-10-03T14:53:21.068Z","event":"reject","variant":"v114","direction":"emphasize-weakest-kr","s":null,"decision":"reject","fitness":0.64643596073202},
    {"t":"2026-10-03T14:53:21.068Z","event":"propose","variant":"v115","direction":"explore","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.068Z","event":"propose","variant":"v116","direction":"prune","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.068Z","event":"reject","variant":"v117","direction":"reorder","s":null,"decision":"reject","fitness":0.64643596073202},
    {"t":"2026-10-03T14:53:21.069Z","event":"reject","variant":"v115","direction":"explore","s":null,"decision":"reject","fitness":0.6452874961604277},
    {"t":"2026-10-03T14:53:21.069Z","event":"reject","variant":"v116","direction":"prune","s":null,"decision":"reject","fitness":0.6426935572176797},
    {"t":"2026-10-03T14:53:21.070Z","event":"propose","variant":"v118","direction":"add-example","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.070Z","event":"propose","variant":"v119","direction":"prune","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.070Z","event":"propose","variant":"v120","direction":"tighten","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.076Z","event":"promote","variant":"v120","direction":"tighten","s":null,"decision":"promote","fitness":0.6529444391477058},
    {"t":"2026-10-03T14:53:21.077Z","event":"propose","variant":"v121","direction":"tighten","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.077Z","event":"propose","variant":"v122","direction":"tighten","s":null,"decision":null,"fitness":null},
    {"t":"2026-10-03T14:53:21.077Z","event":"propose","variant":"v123","direction":"emphasize-weakest-kr","s":null,"decision":null,"fitness":null}
  ],
  "envId": "sim",
  "policy": "# Coding habits\n\nStrength 0–1: how often the agent does it.\n\n- Write a failing test first (0.00)\n- Read the whole file before editing (0.80)\n- Reuse existing helpers (0.86)\n- Answer in one pass, skip re-checks (0.65)\n- Keep diffs small (0.90)\n- Run the full test suite after each change (0.00)\n"
}
```
  1. cli export
  2. push to GitHub
  3. npx skills add you/your-brain

It keeps learning from where you left off.

learnabolicp. 08 / 12

§ 09 · use it in 60 seconds

Install. Tell your agent. Score things.

  1. “tell your agent: track my commit-message skill with learnabolic”
  2. score things: 👍, 0–10, ms, tests passed
zsh — learnabolic
USE .learnabolic/commit-message/variants/v0.md
PROPOSE tighten: write .learnabolic/commit-message/variants/v1.md as a small edit of v0 (weakest KR: quality), then run: node .claude/skills/learnabolic/scripts/cli.mjs propose commit-message v1 --direction tighten
OK v0 (champion) s=0.75
OK v1 (tighten) is now challenging v0
PROMOTED v3 (fitness 0.47 → 0.75)
PROMOTED v6 (fitness 0.76 → 0.96)
learnabolicp. 09 / 12

§ 10 · coming next

More worlds to learn in.

envs/touchdown

coming soon

Touchdown

A model that never sees the game writes a lander autopilot, and learns from scores alone.

Follow on GitHub →
envs/autoresearch

coming soon

Ratcheted autoresearch

Karpathy's overnight loop, with noise-aware keeps and a learned research taste.

Follow on GitHub →
learnabolicp. 10 / 12

§ 11 · inspirations and credits

Standing on good shoulders.

Built at Sundai X Copenhagen, October 2026. Theme: reinforcement learning for agents.

learnabolicp. 11 / 12

§ 12 · learnabolic

GitHub · MIT · Made with care by Age van der Mei.