The Lessons Library
Run 4 showed the tool library inherits capability but nothing inherits caution — the same crash kept getting rediscovered by unrelated children. If recurring crashes are distilled into short lessons and injected into every future prompt, will crashes drop further?
Same as Run 4, plus a second inheritance channel: whenever the same normalized crash kills two or more children, one model call distills it into a one-line lesson, which then gets injected into every subsequent mutation prompt — no verification step of any kind.
A lessons channel added alongside the tools channel — beliefs, not just capabilities, now pass from generation to generation.
Coverage, best Elo, tool count, lesson count, and — critically — the crash count broken into the first and second halves of the run, to see whether the lessons were actually helping.
Coverage came in at 58.3%, best Elo 1049, 8 tools, 3 lessons written — and 50 smoke crashes over the run, more than any prior arm. Both coverage and champion strength landed below Run 4 (58.3% vs 66.7%; 1049 vs 1066).
The crash rate went up after the colony wrote its own rules — 19 crashes in generations 1–50, rising to 31 in generations 51–100, right after all three lessons existed. Worse, one of those lessons was flatly wrong. The model distilled this from a real string of deaths:
"Always verify state.arena?.walls is an array before looping."
That schema is incorrect — walls actually live at state.walls, not state.arena.walls. The colony inherited a subtly wrong map of its own world, obeyed it in every generation after, and the dominant crash signature shifted to exactly the family that false belief produces. Late-run corpses even carried "safety guard" comment headers in their own code — bots following the commandment straight into new deaths.
The structural cause traces to an asymmetry my own theory should have predicted: tools are extracted from winners, so they pass through a fitness filter before they're inherited. Lessons were written by the distiller and canonized without ever being tested against reality. One channel had a reality check. The other didn't, and it accumulated a superstition, exactly as you'd expect an untested belief to do.
The three lessons canonized, for the record: never reference lib outside act; always verify state.arena?.walls (the false one); define helpers inside act or pass data in as arguments.
The false law, from the run's own lessons ledger. Crashes went 19 to 31 after it existed.
Put lessons through the same filter as everything else. Before canonizing a belief, A/B test it — generate some children with it and some without, and keep it only if the crash rate actually drops. Selection pressure on beliefs, not just on genes and tools.
147 API calls · $0.16–$0.20 (gpt-oss-120b via Groq).
Series through Run 5: 815 calls · $3.56–$4.27. Call counts are exact, straight from each run's metrics file. Costs are a range rather than a figure because the provider bills cached input tokens at half price and does not report the cached fraction in the API response, only in the console dashboard, so the upper bound prices every input token as uncached and the lower bound prices all of them as cache hits. A sampled dashboard minute showed 68% of input tokens were cache hits, which puts the truth nearer the bottom of each range. Token counts are measured exactly from Run 8 onward; earlier runs additionally reconstruct tokens from Run 8b's measured per-call profile (3,642 in / 1,348 out), because the usage field was discarded before it was ever written down. A bound is not a measurement and a reconstruction is neither, so both are labelled.
Raw receipts — every archive, lessons ledger, metrics file, and match replay: github.com/godfreystorm/ratchet-lab