Self-evolution bench — measure every rung, end to end¶
Script: bench/self_evolution.py
Each rung of the meta stack has its own module and its own tests; nothing showed that they compose. This bench runs the whole chain on one deterministic, offline arithmetic domain and reports every rung's measured number — the evidence that the chain works end to end, no model key:
python -m bench.self_evolution # human-readable per rung
python -m bench.self_evolution --json # machine-readable report
It exits 0 only when every rung ran and produced a measurement.
The stages¶
| Stage | What runs | What it reports |
|---|---|---|
| seed | two continuous_meta_run sessions (the second seeds from the first) |
verdicts, the adopted rule's parameter, the archive count |
| population | meta_population_run diversifies from the archive's rules |
islands, what was promoted, the archive count |
| exam | exam_archive re-judges adoptions with an independent oracle |
passed / flagged / demoted |
| portfolio | layers_from_archive + portfolio_report reallocate the next window |
the layers and their new budgets |
| harness | two algorithm ports compete; the archive is the leaderboard | each port's best reward, the routed winner, why |
| chain | chain_audit traces the newest adoption's evidence rings |
each ring's status and whether the adoption verifies |
Determinism and trust¶
The domain is a tiny capability-capped arithmetic task set: every run is offline (no model calls) and deterministic (fixed seeds), so the numbers are stable across machines — the temporary directories differ, the measurements do not. Small held-out warnings are silenced because the bench wants a tiny, fast domain.
A rung that raises is recorded as a failed stage (ok: false, with the
error) and the bench continues, so a broken rung is the measurement rather than
a crash. BenchReport.all_ok is true only when every stage is ok.
Extending it¶
The bench is written against the modules on main. New rungs can be added as
stages once they land — a joint multi-slot evolution stage and a self_improve
control-loop stage are the natural next two, so the bench keeps pace with the
stack it measures.