The numbers — release two
UNCONFIRMED (35c298d). This comparison ran in September 2026 under two-uid isolation, which has since been retired. Its reading (Engine 16 of 24, Baseline 2 of 24, engine
78ab87d) stands as evidence for that condition only. Nothing is built on it until it is re-derived on the confinement harness (decision ledger, entries "C0" and "C4"). The Engine is now pinned at9aecfb5. On the confinement harness, a pre-registered comparison on the same task, with a delivery endpoint, engine23a0ef6and a 48,000-token budget, holds: Engine 22 of 36, Baseline 10 of 36 (docs/results/2026-10-06-rrg-delivery.md). It is a separate claim and does not clear this one.
What was compared
| Baseline | Engine | |
|---|---|---|
| agent | bare Pi 0.85.1 | Pi 0.85.1 with /implement, satyrn-engine 78ab87d |
| model | Ornith 1.5 9B, MLX 8-bit, served by oMLX | the same |
| sampling, context, per-turn cap | temperature 0.6, top-p 0.95, top-k 20; 262,144; 16,000 | the same |
| task prompt | the task's R1-plan text (R2 for depth-3) | the same text, inside the Engine's contract |
| budget | 48,000 output tokens, 72 turns, 4,800 s backstop | the same, stopped by the harness alone |
| isolation | model runs as a second user with no view of grader material | the same |
One machine, arms interleaved three cells at a time on the same nights (2026-09-19 14:37 to 2026-09-20 10:01). 108 cells, 0 infrastructure failures, 0 wall-clock timeouts, 0 replaced cells. A delivered pass is a cell that stopped by itself with a patch the hidden test suite passes; running out of budget, a rejected patch and a failing patch all count as not delivered.
The claim, and the test that decides it
On medium-build tasks,
/implementdelivers a passing candidate within the task's budget more often than bare Pi, on Ornith 1.5 9B, and stops when the developer's tests are green.
Primary, pre-registered: selfhost-run-record-gate, 24 cells per arm (two
records of 12, read together), one-sided Fisher exact test at 0.05.
| reading | Baseline | Engine | p |
|---|---|---|---|
| delivered pass, as graded | 2 of 24 | 16 of 24 | 0.000029 |
| pre-registered sensitivity: stray non-source files stripped, both arms | 3 of 24 | 17 of 24 | 0.000044 |
| part A alone (reported, not tested) | 2 of 12 | 8 of 12 | |
| part B alone (reported, not tested) | 0 of 12 | 8 of 12 |
The win rule is met. What the Engine changed is delivery, not ability: 21
of Baseline's 24 cells ran out of budget, and at least 18 of those 21 held a
tree that passes the hidden suite. Bare Pi builds the change, keeps working
(coverage runs, lint, provenance, commits, re-verification) and never hands
it over. The Engine's 8 non-deliveries: 6 out of budget, 1 with no patch, 1
with a patch rejected for a stray record.json.
Where it did not help, and what it costs
| task | kind | Baseline delivered | Engine delivered | one-sided p |
|---|---|---|---|---|
selfhost-docs-linter |
medium build, secondary, n = 12 | 7 of 12 | 8 of 12 | 0.50 |
agentclinic-repair-depth-3 (R2) |
small repair, floor, n = 6 | 6 of 6 | 6 of 6 | |
selfhost-guard-prefixes |
small build, floor, n = 6 | 4 of 6 | 4 of 6 | |
selfhost-review-script |
small build, floor, n = 6 | 2 of 6 | 5 of 6 | 0.12, not tested |
- The effect was shown on one of two medium-build tasks. On docs-linter bare Pi finishes by itself often enough that the Engine adds nothing measurable at n = 12; the record said in advance it was underpowered.
- The declared floor-parity secondary fails. On tasks both arms pass, the Engine costs more, not the same:
| floor task | Baseline, median per delivered pass | Engine |
|---|---|---|
| depth-3 | 5,682 tokens, 13 turns, 3 min | 8,066 tokens, 16 turns, 5 min |
| guard-prefixes | 8,042 tokens, 14 turns, 5 min | 18,740 tokens, 24 turns, 15 min |
| review-script | 6,682 tokens, 24 turns, 5 min | 10,737 tokens, 17 turns, 11 min |
The Engine's self-test runs and guard messages are real overhead, and on
a ten-turn fix they do not pay for themselves. /implement is for a
build, not a small repair.
3. Large builds are not claimed. In the census, 18 of 18 Baseline cells on
the two large tasks reached no passing state; the Engine refuses requests
above the medium class with an advisory (at most 2 non-test files and 10
produced symbols). Of guards 1 to 3, the loop breaker and symbol preservation
never fired and scope refusal fired five times in 36 cells; none is claimed.
Cost on the primary task
| per cell, median (range) | Baseline | Engine |
|---|---|---|
| turns | 73 (39 to 73) | 52 (25 to 72) |
| output tokens | 40,108 (26,596 to 48,125) | 39,125 (24,684 to 48,743) |
| minutes, three cells sharing the GPU | 43 (26 to 50) | 44 (23 to 57) |
| tool calls | 72 | 51 |
| per delivered pass | Baseline | Engine |
|---|---|---|
| machine time | 8.5 cell-hours | 1.1 cell-hours |
| output tokens | about 473,000 | about 58,000 |
| delivered inside 32,000 tokens and 48 turns | 1 | 7 |
An attempt is not faster with the Engine; a usable result is about eight times cheaper, because most attempts end in one.
How the Engine behaved (Engine arm only)
| run-record-gate, 24 cells | docs-linter, 12 cells | |
|---|---|---|
| cells steered at own-green | 20 | 11 |
| steered twice or more | 5 | 0 |
| median turns from first steer to stop (range) | 5 (2 to 25) | 2 (1 to 11) |
| stopped within three turns of the first steer | 7 of 17 | 7 of 9 |
| steered and delivered a pass | 16 | 8 |
| runaway resumes, followed by a tool call | 1, 1 | 1, 1 |
| test runs detected in bash output | 52 | 28 |
| scope refusals | 4 | 1 |
| receipts with the live budget counter intact | all | all |
The steer is a brake, not a stop: models read it and often do a few more
turns of forbidden finishing work (full-suite runs, just recipes) before
stopping. It is a nudge by design; release one's cell 511653 fixed its last
failing case five turns after its own suite went green.
Pass state at the 32,000-token / 48-turn line, harvested (secondary; the raw tree at the crossing on both arms, or the final verdict for a cell that never crossed; always read with its exclusion column):
| task | Baseline, passing at the line | excluded | Engine | excluded |
|---|---|---|---|---|
| run-record-gate, parts A and B | 16 of 18 | 6 | 22 of 24 | 0 |
| docs-linter | 11 of 12 | 0 | 9 of 11 | 1 |
Both arms mostly hold a passing tree at the line; this reading cannot show a finishing remedy working and is not the claim. The excluded cells are trees the grader refuses for a stray non-source file, six of seven on Baseline.
Disclosures
- The Engine's own messages are the product and differ between arms by
design: the contract prompt, compact self-test results with pytest's
Elines, the finish-on-green steer, the runaway resume, the fenced bounded-command note (first bash result and timeouts only), and the note appended when the Engine detects a test run in bash output and runs its own self-test. Task text, tools available, model, sampling and budgets are identical. - Route to this claim. Release one ended in a stated negative
(
docs/superpowers/specs/2026-09-15-release-one-outcome.md). Release two ran a 45-cell Baseline census first, then three route proofs (one void), a 12-cell pilot and this comparison. Route-proof and pilot cells are excluded from every count above. The claim's reading (delivered within the budget, not within 32,000 tokens) was chosen on 2026-09-19 after the route proofs and before the pilot and the comparison; the input sheet isevidence/2026-09-19-r0-inputs/README.md. - One model, one machine, tasks cut from this project's own history. The hidden suites are in this repository from the day it is published, so later models may have seen them.
- Known instrument gap: for Engine cells stopped at the budget, the harvested tree is read from the wrong worktree, so "held a passing tree" is unavailable for those six cells. It touches no count on this page.
Recompute
cd satyrn-evals
G=$HOME/satyrn-comparison-grades; R=records/2026-09-21-comparison; N=$HOME/satyrn-runs/2026-09-21-comparison
uv run satyrn-evals grade-sensitivity $N-selfhost-run-record-gate-a --record $R-selfhost-run-record-gate-a.json \
--combine $N-selfhost-run-record-gate-b --record2 $R-selfhost-run-record-gate-b.json --grade-root $G
uv run satyrn-evals grade-line $N-selfhost-docs-linter --record $R-selfhost-docs-linter.json --grade-root $G
How the claim was measured
Release two was pre-registered on 2026-09-19 and read once, when complete. A
45-cell Baseline census ran first to classify where bare Pi actually fails,
then three route proofs (one void), a 12-cell pilot, and the comparison. The
primary reading is a one-sided Fisher exact test on selfhost-run-record-gate
at 24 cells per arm.
The instrument gaps, stated
The harness grades only retained evidence, and its own gaps are disclosed above: the wrong-worktree read for budget-stopped Engine cells, the one-model one-machine caveat, and the route that led to the claim.
See also the stated negative and lessons for what release one got wrong before the harness was fixed.