Skip to content

E02 — EvoBench, end to end

L06 described the mine → store → bench loop in the abstract. This is the same loop, run for real, with the actual test and its actual output — not a hypothetical. The full source is evobench/tests/test_integration.py.

The setup

A deliberately simple failure: a test suite that asserts 2 + 2 == 5.

_FAILING_SUITE = """
def test_adds_wrong():
    assert (2 + 2) == 5
"""

Step 1 — something fails, caught by VerifyLoop

test_file = tmp_path / "test_target.py"
test_file.write_text(_FAILING_SUITE)
result = run(f"{sys.executable} -m pytest -q {test_file}")
assert not result.ok

result is a real verifyloop.TestRunResult — parsed from an actual pytest subprocess run, not constructed by hand.

Step 2 — mine it, autonomously

suite = Suite(tmp_path / "suite.jsonl", tmp_path / "manifest.json")
observe(
    suite,
    task_id="arithmetic-regression-1",
    prompt="what is 2 + 2?",
    bad_output="5",
    run_result=result,
)

One call. No one wrote arithmetic-regression-1 as a benchmark task by hand — observe() derived it from the failure itself, including pulling AssertionError as the failure category from VerifyLoop's triage of result.

Step 3 — every model gets checked against it

buggy_model = MockAdapter("buggy-model", lambda _: "5")
fixed_model = MockAdapter("fixed-model", lambda _: "4")

results = BenchmarkRunner([buggy_model, fixed_model], suite.as_harnessbench_tasks()).run()
summaries = {s.model: s for s in summarize(results)}

assert summaries["buggy-model"].success_rate == 0.0
assert summaries["fixed-model"].success_rate == 1.0

suite.as_harnessbench_tasks() reconstructs a real harnessbench.Task from what was stored — the mined regression check ("5" not in output) actually discriminates between a model that would repeat the original bug and one that wouldn't.

Real output

$ pytest -v tests/test_integration.py
============================= test session starts ==============================
platform darwin -- Python 3.13.3, pytest-9.1.1, pluggy-1.7.0
collecting ... collected 1 item

tests/test_integration.py::test_a_real_failure_becomes_a_discriminating_regression_task PASSED [100%]

============================== 1 passed in 0.25s ===============================

What this actually demonstrates, and what it doesn't

It demonstrates that the loop is mechanically real: a failure caught by one package (VerifyLoop) becomes durable state in another (ReceiptLedger, via Suite) becomes a runnable task in a third (HarnessBench), with no manual step in between, and the resulting task genuinely tells two different model behaviors apart.

It does not demonstrate that pattern-matching on bad_output is a good regression check for every kind of failure — L04's "what's worth keeping in state" question applies here too: a literal-text check is cheap and unambiguous, but it would miss a model that reproduces the same bug phrased differently. That's the honest limitation flagged in EvoBench's own README, not glossed over here: richer mining (re-running the original reproduction automatically, rather than matching text) is the natural next step, not yet built.

Try it yourself

git clone https://github.com/Nitin13-git/evobench
cd evobench
pip install -e ".[dev]"
pytest -v tests/test_integration.py