A small model with a review loop matches a larger one at 58% of the cost A build-and-check review loop using the small GPT-5.6 Luna model matched the single-shot score of the larger GPT-5.6 Sol on 20 ProgramBench tasks at a median 58% of Sol's cost, and at Sol's cost the loop scored higher on 15 of the 20 tasks, according to results published in October 2026. The loop ran as a two-node zeroshot graph with a builder and a fresh-session checker; a single Luna session told to play both roles stopped after one pass and scored no better than a plain single shot, and the loop never produced a badly failed run while every single-shot arm did. Luna costs $0.20 per million input tokens and $1.20 per million output tokens versus Sol's $4 and $20, and both models ran through OpenAI's Codex CLI at xhigh reasoning effort, with Sol run five times per task as a single shot and Luna's loop run five times per task. October 2026 A small model with a review loop matches a larger one at 58% of the cost. On 20 ProgramBench tasks, GPT-5.6 Luna in a simple build-and-check loop reached the score of GPT-5.6 Sol's single shot for a median 58% of what Sol's run cost, and at Sol's cost it scored higher on 15 of the 20. A single Luna session told to play both roles stopped after one pass and scored no better than a plain single shot, and the loop never produced a badly failed run, where every single-shot arm did. What the loop is for Coding models are trained to finish fast and sound right, which makes them confident by default. Ask one to build a program and it comes back with something that compiles and a note saying it's done, from the same model that did the work. In the runs below, 100 Luna sessions that had been told to check their own work returned after 4 to 20 minutes with about half of the hidden tests passing. Every one of them stopped on its own, well short of the six hours it had. A review loop splits the two jobs. A builder works until it believes the task is done; then a checker, in a fresh session that hasn't seen the builder's reasoning, tries to break the result, and if it finds problems the builder gets the list and goes again. The checker is the same model with the same task statement; it just starts without the builder's transcript. ProgramBench is a good place to measure whether that helps. Each task gives an agent a compiled program svgbob, xz, samtools, direnv, 16 more and its documentation, offline, and asks for a reimplementation from observed behaviour alone. Hidden tests then score the rebuild: 262 to 1,425 of them per task here. It's a fair stand-in for everyday work, and on our 20 tasks no published run passes every test; the best passes between 38% and 99%. What we ran We ran the loop as a zeroshot graph with two nodes, a builder and a checker; zeroshot is our open-source runner for graphs of coding agents, and this is about the simplest graph it can run. One builder turn is a build, one checker turn a check, and the pair is a round. The builder keeps its session across rounds; every check starts fresh with only the task statement and the workspace. A rejection sends the checker's list of discrepancies back as the builder's feedback, and the loop ends when the checker accepts, after 50 rounds, or at six hours. We wrote two prompts and froze them before the first run; neither was tuned to any task. Everything else the model sees is ProgramBench's own task statement and the runner's standard instructions for a builder and a checker. builder Complete the task described in the input. Keep working and verifying your own work until you believe the result fully satisfies the task. If review feedback is provided, address every point without breaking what already works. checker Independently judge whether the current workspace satisfies the task. Derive your own checks from the task statement and whatever it makes available; do not rely on the builder's tests, notes, or claims. Run the checks. Accept only with concrete evidence that nothing is wrong. Otherwise reject and list the most important discrepancies, each with a minimal reproduction. Luna and Sol are two models in the GPT-5.6 line, Luna the small one and Sol the large one; we ran both through OpenAI's Codex CLI at its xhigh reasoning-effort setting. Luna costs $0.20 per million input tokens and $1.20 per million output tokens, Sol $4 and $20. Sol ran each task as a single shot one build, no checker five times. Luna's loop ran five times per task. 1.The loop reaches Sol's score at 58% of Sol's cost Why this comparison. If you're paying for the work, the question isn't which model scores higher but what a given level of quality costs. Luna costs about a twentieth of Sol per token, and the loop spends tokens on checks and repairs that a single shot never makes, so a loop's bill depends on how many rounds it takes. We asked, per task, what the loop had to spend to reach the score Sol's single shot gets there. The loop's five runs are scored build by build; the cost to match is the smallest budget at which the mean of their last builds within that budget reaches Sol's mean score, and we report it as a share of what Sol's single shot cost on the same task. What we expected. If the checker catches bugs the builder missed, the loop should reach Sol's score before it has spent what Sol spends, with a wide margin on tasks where a cheap first build already lands close. If the small model can't do a task, no budget gets there. We expected the loop to come in cheaper on most tasks, not all: where a cheap first build lands far from the mark, 50 rounds of a small model may never close the gap. What we found. On 15 of the 20 tasks the loop reached Sol's mean score for less than Sol's single shot cost, and across the 20 tasks the median is 58% of Sol's spend.