Available to paid subscribers
Agent A/B Lab
Kit files are in English.
Compare two agent setups on the same task and see whether the change helped, alongside failures and practical cost.
Python 3.9+, shell commands for your runners. Offline demo needs no API key.
- Run an offline comparison before connecting an agent.
- Try a complete first experiment with your own runner and one instruction change.
- Keep every pair and regression visible, including results that cannot name a direction.
Local Python kit | ZIP, guide and reports in English | Offline demo
View sample comparisonAvailable now to paid subscribers. One-off purchase opens later.
I'm a subscriber: claim itComing soon: one-off purchase.
Yearly: every kit included. Monthly: one new kit per billing cycle.
View full-size sample ↗Access, downloads and refund policy
Yearly: every available kit and bundle, unlimited downloads.
Monthly: one new standalone kit per billing cycle, no bundles. Re-downloads are free and do not use a new claim.
Monthly subscriptions started before February 28, 2026 keep all-access, including bundles and unlimited downloads.
Monthly access currently allows three downloads per kit. Need another? Contact joozio@hey.com.
Download access while subscribed. Keep the files you download.
Limits
Measures one task and one scorer, not general model quality.
- It can detect large, consistent differences, not subtle ones.
- It is not a sandbox: an agent can read acceptance cases elsewhere on your machine.
Missing or incompatible dollar data prevents a cheaper or equal-cost conclusion.
Inside the kit
- Run: paired runner, scorer and report tools
- Examples: broken repo, acceptance cases and offline demo agents
- Guide: eight chapters and pre-registration templates
How it works
You changed the worker model, turned skills on, added a plan step. The next few sessions felt better, so the change stayed. This kit replaces the feeling with a number, then spends most of its effort making sure the number is not a different kind of lie. Two agent configurations, given as plain shell commands, run against byte-identical copies of the same broken repo. The scorer lives outside the copy they can write to and is fingerprinted before every arm, again before scoring and again after it. Your two rival predictions, the arm commands, the seed, the sample size and the call thresholds are sealed before the first run, hashed into one seal, and re-verified every time the lab reads them: before every arm, around every scoring run, and before the report prints a byte of them. Any mismatch is a refusal with no reading. The arms alternate which goes first, every attempt is written to the ledger before its command is launched so a crash cannot erase it, a retry gets its own directory rather than replacing the failure and never inherits its place in the comparison, every acceptance case is evaluated by its own process of the submitted module, one that holds no expected value and no state of the lab's and that runs in a copy of the work tree taken outside the experiment, so it has nothing that would tell it the right answer and nowhere to read it from, and the report carries twenty four reasons it may refuse to name a direction at all. It never says winner. Ships with a broken repo, eleven held-out acceptance cases that repeat no visible test input, three canned solutions that prove the scorer catches both a shortcut and a regression, and an offline demo that produces a full report in about 20 seconds without an API key.
Built after a 14-night preregistered run of my own produced a clean looking winner that collapsed 150 fold and flipped direction once the instrument was corrected.
Latest update: 2026-09-13
v1.0.6 (2026-09-13). Buyer experience: mobile reports, practical cost summaries, an offline guide and a complete first experiment for your runner.
How the checks work: detail and full file inventory
Best for
- +Anyone about to make a setup change the default: a different worker model, skills on or off, a plan step, more or fewer subagents
- +People who already suspect their agent folklore is untested and want one re-checkable answer rather than a benchmark
- +Anybody who has watched an agent make the visible tests pass without fixing anything
Not for
- -Anyone wanting a general benchmark or a leaderboard: this measures one task with one scorer
- -Small differences. Eight pairs can see a large, consistent effect and nothing subtle
- -Sandboxing. The lab detects a compromised measurement, it does not contain an agent that has shell access
What you get
Package includes
- •START-HERE.html: install, first run, what a working result looks like, honest limits, FAQ
- •guide/01 to 08: what an A/B run answers, pre-registration, arm parity, the scorer, running pairs, reading the result, cost and usage, and a case study of a misleading instrument
- •lab/ablab.py: init, lock, run, score, report, verify, demo
- •lab/scorer.py, stats.py, refusals.py, usage.py, ledger.py, report.py, demo_agent.py
- •fixtures/broken-repo: a pricing module with two real bugs and a deliberately incomplete visible test suite
- •fixtures/acceptance: eleven held-out cases, six required and five regression, no input repeated from the visible suite
- •fixtures/solutions: good, cheat and regression, so you can see the scorer catch a shortcut and a broken regression
- •fixtures/usage: two sanitized real payloads from a live Claude Code and Codex CLI pair, with the normalised record each one must produce, checked by the self-test
- •templates/: the pre-registration form, an arms cookbook whose Claude Code and Codex CLI recipes were run end to end on 2026-09-11, the ledger schema
- •LICENSE.txt and CHANGELOG.md
FAQ
What does this lab not measure?
An agent can read the sealed acceptance cases elsewhere on your machine; this is not a sandbox.
Technical detail
One limit, stated plainly. The lab seals a copy of your acceptance cases inside the experiment directory, and your arm's command runs inside that same directory tree. The process that scores what your arm wrote holds no expected value, no tag and no state of the lab's, and it runs in a copy taken outside that tree, so it cannot forge a result and cannot walk to the sealed copy. An arm can, like any process on your machine, read a file. An arm that goes looking for the sealed copy and answers from it will score well and will not be refused, because this kit detects a compromised measurement rather than containing an agent that has shell access, and reading a file it was not stopped from reading is not something the instrument can see. If your arms are agents you do not fully trust, run them in a container or on a throwaway machine and keep the experiment directory off it. If they are your own configurations, which is what this kit is for, the thing it protects you from is the accident: the agent that edits the tests, the prediction you rewrote after the result, the retry that quietly replaced a failure. Those it catches, every time, and it refuses a verdict rather than averaging them in.
Which agents does it work with?
Any runner you can start from a shell: Claude Code, Codex CLI, aider, a bash script, your own loop. The lab hands it a fresh directory and reads what it left behind. Ready made command lines for Claude Code and Codex CLI are in templates/arms-cookbook.md, with flags checked against vendor docs on 2026-09-10.
Do I need an API key?
Not for the demo, the self-tests or the guide. The demo runs eight pairs of a fake offline agent and writes the same report your real runs produce. For a real comparison you need whatever your own runner needs.
How does it stop an agent from cheating the scorer?
It detects changes to the measurement, but does not prevent an agent with shell access from reading files outside its work copy.
Technical detail
Four ways, and only one of them is detection after the fact. The acceptance cases are never copied into the work directory: lock refuses a layout that puts them inside the fixture, and refuses a symlink, a hard link or a plain copy of them in there too. No case reuses an input the visible tests show. Each case is evaluated by its own process of the submitted module, which holds no expected value, no tag and no lab state at all, and which runs in a copy of the work tree taken outside the experiment and deleted when the last case ends: that process holds nothing that would tell it the right answer and can reach nothing that would, so a correct answer is the only way to a point, and a process that answers with anything else, or that leaves anything running behind it, is named and refused rather than believed. The lab also writes nothing down that would help: a failed case records what your code returned and never what the case wanted, and verify names any run artefact that carries a majority of the held-out answers. Everything else, the cases and the scorer and their fingerprints, is checked before every arm, again before scoring and again after it, with the score computed from the copy taken at lock time, and any movement refuses a verdict. That last part is detection, not containment: an agent with shell access can reach outside its work copy, and the kit says so plainly rather than selling you a sandbox it does not have.
Are eight pairs enough to conclude anything?
Eight pairs is sixteen runs. For a large, consistent difference, yes, and the report tells you how consistent it was across resamples. For a small one, no, and the report says cannot tell rather than picking a direction. Six complete pairs is the floor below which it refuses outright, and the pre-registration can raise that floor but never lower it. It also refuses until every pair of the sample size you sealed is complete, so stopping a batch early gets you a description rather than a direction. That refusal is most of what you are buying: a comparison that can come back empty is the only kind worth believing when it does not.
Can I compare cost, not just quality?
Only compatible dollar estimates support a cheaper or equal-cost conclusion.
Technical detail
Partly, and the kit is precise about the limits. Claude Code reports a per-run dollar estimate and tokens in its JSON output; Codex CLI reports tokens and no dollars. The lab parses both, and refuses every cheaper or equal-cost claim when either arm reported nothing or the two arms report different shapes. The dollar figures are client side estimates, which the report says next to them every time.
Can I use my own repository instead of the shipped fixture?
Yes. Point experiment.json at a clean copy of your repo and write your own cases file. Chapter 3 covers sizing the task and chapter 4 covers writing cases that can actually fail, including the part people skip: regression cases for the behaviour that already worked.