Evaluations

Only the harness
changes.

Six coding harnesses, the same tasks, the same model and the same frozen price list. Anything that differs between the rows is the harness, because nothing else was allowed to move. This is an early suite, and it measures cost and behaviour far better than it measures skill.

Unlike the research page, which reads other people's published studies, these are measurements taken in this repository against this base. The runner, the tasks and the price list are in evals/, and every figure below is redrawn from harness-eval.json by one command.

Summary

01

The suite was built to find which harness solves more. For a long time it could not answer that, because nearly everything passed. Three rounds of harder tasks changed nothing. Adding more harnesses finally produced a difference. The more useful question turned out to be simpler: what each harness costs before the model does anything.

Measured
Fixed overhead varies several-fold. Before a single instruction is read, the lightest harness sends characters of tool schema and system prompt on every call. The heaviest sends .
Measured
The gap does not close on bigger work. Cheapest to dearest is on the smallest tasks and on the longest, so the premium is closer to a multiplier than a one-off toll.
Measured
Most of the tool surface goes unused. Averaged over the run, the heaviest harness sends tool definitions per attempt and makes calls.
Measured
Solve rate separates slightly. Most harnesses pass nearly everything. One of them fails more often. Treat that as a note about that harness.

Harness overhead is charged on every model call. A longer task means more calls, not cheaper ones. A lighter harness stays cheaper as work grows.

How it is measured

02

Each attempt runs one harness against one task in a disposable home directory, with a fresh copy of the task's workspace and the model pointed at a logging proxy. The proxy records every request and response, so token counts and tool calls are observed directly. A task checker then grades the resulting workspace.

  • One model throughout. Every harness runs the same model, so a difference in the table is a difference in how the harness uses it.
  • One price list, frozen. Costs are recomputed from recorded usage against a dated price file, so a provider's pricing change cannot silently rewrite an old result.
  • Graded, not pass or fail. Each task returns a score from 0 to 1, because a boolean verdict throws away the difference between a near miss and no attempt.
  • Tiers 1 to 3 are scored on effort as well as correctness. Those tasks are small. Across 182 attempts every score was 0 or 1, so the score alone showed almost nothing. What varied was the work to get there: 2 tool calls on one attempt, 9 on another for the same result. The score is correctness times an effort term. The reference is the fewest calls any harness used on a passing attempt. A wrong answer scores zero. Beating the reference caps at 1.000.
  • Scope is checked separately. Every workspace is content-hashed before and after. A harness that edits files the task did not put in scope is recorded as out of scope whether or not it passed.

Attempts that never started are excluded. Harnesses run side by side, and that can stop one launching before its first model call. Such an attempt never ran the task, so it is not counted as a loss. Dropped attempts are left out of every average and counted separately as launchFailures in the data file.

HarnessSolvedScoreCost/attemptPrompt tokOutput tokCache hitCallsIn scope
Pi34/370.864$0.0038112,6813,62592%8.737/37
SpecPi35/370.878$0.0042134,8593,98893%9.637/37
SpecPi + Jev35/370.895$0.0046153,0774,40794%10.037/37
OpenCode31/370.804$0.0043143,8303,09490%9.537/37
Codex CLI30/370.742$0.0067242,0317,93197%10.834/37
Oh My Pi35/370.891$0.0070257,7834,67091%11.037/37
DeepSeek Harness35/370.833$0.0078281,6767,05693%14.437/37

Did it solve the task?

03

This is the figure the suite was built for. For most of its life it showed almost nothing. Every harness passed almost everything. It is still worth publishing. The flat result is itself a finding, and it has finally started to move.

Tasks solved0%25%50%75%100%Tier 1 · smokePi100% 8/8SpecPi100% 8/8SpecPi + Jev100% 8/8OpenCode100% 8/8Codex CLI75% 6/8Oh My Pi100% 8/8DeepSeek Harness100% 8/8Tier 2 · editsPi100% 16/16SpecPi100% 16/16SpecPi + Jev100% 16/16OpenCode100% 16/16Codex CLI75% 12/16Oh My Pi100% 16/16DeepSeek Harness100% 16/16Tier 3 · repairPi100% 2/2SpecPi100% 2/2SpecPi + Jev100% 2/2OpenCode0% 0/2Codex CLI100% 2/2Oh My Pi100% 2/2DeepSeek Harness100% 2/2Tier 4 · ultimatePi40% 2/5SpecPi60% 3/5SpecPi + Jev60% 3/5OpenCode20% 1/5Codex CLI80% 4/5Oh My Pi60% 3/5DeepSeek Harness80% 4/5Tier 5 · disciplinePi100% 6/6SpecPi100% 6/6SpecPi + Jev100% 6/6OpenCode100% 6/6Codex CLI100% 6/6Oh My Pi100% 6/6DeepSeek Harness83% 5/6Share of attempts passing the task checker
Share of attempts passing the checker, by tier. Attempts that failed to start are left out, because they never ran the task.

Three rounds of harder tasks were written to force a difference. The puzzles looked hard: a wire format inferred from fixtures, an interlocking cache policy, a log far larger than the context window. Every harness solved them on the first or second turn. A capable model solves that kind of problem on its own. The surrounding harness barely matters there. Harder puzzles did not help.

Adding harnesses did. One of the six now fails a clear share of even the smallest tasks, and it does so across tiers. That says something about that harness on this model. The others stay bunched near the top, where this metric cannot tell them apart.

Treat a failure as one observation. With a handful of attempts per task, one loss and a real weakness look the same. The number of attempts behind every figure is in the data file. Where a harness fails, read that attempt itself instead of the rate.

What a harness costs before it starts

04

Every model call carries the harness's tool definitions and system instructions. That payload is fixed, it is sent again on each request, and it is the clearest difference between the rows.

Characters sent on every model call, before any work happens016,00032,00048,00064,000Pi · 4 tools5,522SpecPi · 8 tools13,799SpecPi + Jev · 8 tools13,799OpenCode · 10 tools38,097Codex CLI · 9 tools38,148Oh My Pi · 11 tools62,612DeepSeek Harness · 25 tools31,750Tool schemas (solid) plus system instructions (dimmed)
Characters on the first model call, split into tool schema and system instructions. OpenCode is absent because its prompt never crosses the proxy; inventing a number for it would be worse than leaving the row out.

The gap is almost entirely tool schema, not prose. A harness that ships twenty-five tools pays for twenty-five tool descriptions on every request, whether or not the task could use any of them. That cost is multiplied by the number of turns and reduced, but not removed, by prompt caching.

Prompt tokens per attempt, all tiers075,000150,000225,000300,000Pi112,681SpecPi134,859SpecPi + Jev153,077OpenCode143,830Codex CLI242,031Oh My Pi257,783DeepSeek Harness281,676Mean prompt tokens, cache rereads included
Mean prompt tokens per attempt across all tiers, cache rereads included. The ordering follows the schema chart above.

Where the overhead actually lands

05

You might expect a fixed per-call cost to matter less on large tasks. The per-tier spend shows otherwise. A longer task means more calls, and the overhead is charged on each one. The extra cost grows with the work instead of fading into it.

Model spend per attempt$0.000$0.007$0.015$0.022$0.030Tier 1 · smokePi$0.0005SpecPi$0.0009SpecPi + Jev$0.0008OpenCode$0.0014Codex CLI$0.0006Oh My Pi$0.0029DeepSeek Harness$0.0016Tier 2 · editsPi$0.0005SpecPi$0.0009SpecPi + Jev$0.0009OpenCode$0.0015Codex CLI$0.0008Oh My Pi$0.0031DeepSeek Harness$0.0019Tier 3 · repairPi$0.0148SpecPi$0.0124SpecPi + Jev$0.0145OpenCode$0.0119Codex CLI$0.0226Oh My Pi$0.0164DeepSeek Harness$0.0231Tier 4 · ultimatePi$0.0117SpecPi$0.0152SpecPi + Jev$0.0159OpenCode$0.0125Codex CLI$0.0276Oh My Pi$0.0185DeepSeek Harness$0.0249Tier 5 · disciplinePi$0.0069SpecPi$0.0053SpecPi + Jev$0.0067OpenCode$0.0064Codex CLI$0.0078Oh My Pi$0.0099DeepSeek Harness$0.0124US dollars per attempt · same model, same tasks, same frozen price list
Mean model spend per attempt, by tier. Tiers 1 and 2 are small edits and short repairs; tier 3 is a long repair chain across 1,200 modules. The session-mint cost the evaluation itself incurs is excluded and reported separately in the data file.

Cost and the parts that make it up

Cost alone does not say much. The parts below are kept separate because each answers a different question. Tool calls and turns show how much work it took to reach a result the checker accepted. Tool errors and repeated calls show whether the harness recovered or kept repeating the failure. Cache hit rate and context growth show what it carries on every request after that. Fresh tokens drive most of the bill: about 94% of prompt tokens here are cache reads priced at a fiftieth of fresh input. What a harness adds to the prefix each turn matters more than the request total.

HarnessScoreTool callsTurnsTool errorsRepeated callsCache hitContext growth / turnCompactionsScore per 100 calls
Pi0.8648.77.27.6%392%709010.0
SpecPi0.8789.68.66.8%493%62809.2
SpecPi + Jev0.89510.09.06.0%994%59009.0
OpenCode0.8049.56.81.4%290%78508.4
Codex CLI0.74210.89.512.3%1097%71406.9
Oh My Pi0.89111.08.73.7%291%61508.1
DeepSeek Harness0.83314.410.92.2%1193%804375.8

Every harness here was measured through the logging proxy, so context figures cover all of them. A harness measured natively would report its own token counts and skip the proxy. Its context growth would show as not measured. Repeated calls count a tool run again with identical arguments after it already answered. Compactions are the harness dropping context to make room. Only one harness here needed to.

Why the failures failed

A pass rate shows how often a harness finished. It does not show what went wrong in the rest: a timeout, a wrong solution, or a failing call repeated until the budget ran out. Each points to a different fix. The table below groups every failed attempt in this run, using a typed classifier over data each attempt already recorded: checker notes, exit code, stderr tail, duration, the most repeated tool, and which injected faults were met.

Every verdict went through the same confidence gate a live session would use. Answers below that bar are published as ungated instead of being forced into the nearest category. More than half landed there. A report file records what a harness did, not what it meant to do. For most failures that is not enough to name the cause. That gap is why --keep-transcripts exists: it saves the per-request shape of an attempt beside its report, so classification can improve without re-running anything. Ungated means the classifier did not commit. Unknown means it committed to "cannot tell from what was recorded".

Failure modeAttemptsShareHarnessesMeaning
ungated1458%codex, dsh, omp, opencode, pi, specpi-default, specpi-jevNo verdict cleared the gate
misread-requirement521%codexProduced output that misses a stated requirement
unknown313%dsh, omp, specpi-defaultNot determinable from what was recorded
timeout28%piExceeded the wall-clock limit
HarnessTier 1Tier 2Tier 3Tier 4Tier 5
Pi1.00×1.00×1.24×1.00×1.29×
SpecPi1.82×1.83×1.04×1.30×1.00×
SpecPi + Jev1.65×1.79×1.22×1.36×1.25×
OpenCode2.99×3.00×1.00×1.07×1.20×
Codex CLI1.20×1.69×1.90×2.36×1.47×
Oh My Pi6.23×6.24×1.38×1.58×1.85×
DeepSeek Harness3.47×3.79×1.94×2.13×2.32×

Every figure is relative to the cheapest harness in that tier. Read across a row and most stay close to where they started: a harness costing twice the lightest on smoke tasks still costs about twice as much on the long one. The ratios shift a little. Nothing converges.

Two rows move more. Both get more expensive on the long task. That fits the task: a harness that takes more turns pays its per-call overhead more times there.

Bottom line. A lighter harness costs less on small work and still costs less on large work. An earlier version of this page reached the opposite conclusion from fewer harnesses and shorter tasks. The larger run overturns it.

The tool surface

06

The proxy counts tool definitions sent and tool calls actually made. They differ by a lot, in every harness.

Tool definitions offered against tool calls actually made065130195260Pioffered28.9invoked8.7SpecPioffered68.8invoked9.6SpecPi + Jevoffered72.2invoked10.0OpenCodeoffered67.6invoked9.5Codex CLIoffered85.4invoked10.8Oh My Pioffered95.7invoked11.0DeepSeek Harnessoffered248.0invoked14.4Per attempt: definitions sent (solid) and calls invoked (dimmed)
Definitions offered against calls invoked, per attempt, averaged over every tier. Native harnesses are absent: the proxy never sees their tool list.

Every harness here offers far more than it uses, which is expected. A tool has to be offered before the model can decide it is not needed. What matters is the ratio, because the unused definitions are paid for on every call. This measurement is the reason the accounting was rewritten mid-run: an earlier version of the proxy counted offers and labelled them calls, which made the busiest harness look like the most productive one.

A second opinion

07

Everything above is this repository grading its own suite, and a suite cannot mark its own homework. So the same harnesses were run against Terminal-Bench 2.0 — somebody else's tasks, written without reference to anything here. Seven tasks, four attempts each, one model, through the same endpoint. Pi with no harness at all is included as the floor, because SpecPi, SpecPi + Jev and Oh My Pi are all Pi underneath, and without it there is nothing to measure what they add against.

Solve rate separates here in a way it never did on the tier suite: Codex passes 26 of 28 and the DeepSeek Harness passes 19. But the finding worth the section is the one that survives the small sample, and it is about overhead rather than skill.

* Cache hit and cost come from a separate clean-session run of the same harnesses, six attempts each; the callout below says why. Every other column is the full run, twenty-eight attempts per harness.

HarnessSolvedPrompt tokOutput tokCache hit *Cost/attempt *Tool callsRequestsTok/requestAgent sec
Pi (base)22/28304,2238,88697%$0.011816.915.419,718141
SpecPi22/28283,2465,93495%$0.012616.916.517,129133
SpecPi + Jev22/28209,2016,05597%$0.009516.015.513,528150
Oh My Pi23/28555,53011,24797%$0.008020.017.431,875204
Codex26/28334,70410,10498%$0.007117.315.821,155119
OpenCode22/28260,7292,20694%$0.006215.614.717,763327
DeepSeek Harness19/28505,22114,49595%$0.0145not recoverable22.422,526190

The harnesses agree almost exactly on how much work a task takes. Tool calls per attempt run from 15.6 to 20.0 across the six that can be counted — a spread of under a third, on tasks where prompt tokens differ by nearly three to one. Whatever separates these rows, it is not that one harness does more.

Tool calls and model requests per attempt06131925Pi (base)tool calls16.9requests15.4SpecPitool calls16.9requests16.5SpecPi + Jevtool calls16.0requests15.5Oh My Pitool calls20.0requests17.4Codextool calls17.3requests15.8OpenCodetool calls15.6requests14.7DeepSeek Harnesstool callsnot recoverablerequests22.4Solid is tool calls, pale is model requests. DSH prints prose, so its calls cannot be counted.
Tool calls against model requests, per attempt. The DeepSeek Harness prints prose rather than a structured trajectory, so its calls cannot be recovered; its requests were counted at a proxy and are real.

What differs is the size of each call. Dividing the requests out leaves the context a harness spends to ask one question, and that is where the rows come apart: the heaviest sends more than twice what the lightest does, on every call, for the same number of calls.

Prompt tokens per model request0k9k18k26k35kPi (base)19,718SpecPi17,129SpecPi + Jev13,528Oh My Pi31,875Codex21,155OpenCode17,763DeepSeek Harness22,526Context sent per request, with the number of requests divided out.
Prompt tokens per model request, cache reads included.
Prompt tokens per attempt0k150k300k450k600kPi (base)304,223SpecPi283,246SpecPi + Jev209,201Oh My Pi555,530Codex334,704OpenCode260,729DeepSeek Harness505,221Mean prompt tokens per attempt, cache reads included. Lower is lighter.
The same overhead compounded over a whole attempt.

The tool mix says where the difference comes from. Codex routes nearly everything through a single command tool; Oh My Pi spreads the same work across five, and pays for all five on every call.

HarnessDistinct toolsShare of calls
Pi (base)4bash 90%, write 6%, read 3%, edit 1%
SpecPi5bash 88%, write 7%, edit 3%, read 2%, request_capability 0%
SpecPi + Jev5bash 85%, write 9%, edit 4%, read 2%, request_capability 1%
Oh My Pi10bash 64%, read 11%, write 7%, eval 5%, edit 5%, hub 4%, +4 more
Codex2exec_command 95%, write_stdin 5%
OpenCode6bash 75%, write 10%, webfetch 7%, todowrite 3%, edit 3%, read 2%
DeepSeek Harnessnot recoverable

The cache and cost columns come from a second run, because the first measured them wrongly. Every trial in the first run was pointed at one OpenCode session id, and that endpoint caches prompt prefixes per session. As distinct conversations piled into a single id the earlier prefixes were evicted: across both sittings the median share of requests whose cached prefix failed to grow was 0% for the first twenty-five trials on a session, then 24%, 30% and 38% as the count climbed. Every harness degraded, and the ones that looked worst were the ones that ran latest. Those two columns were measuring run position.

Re-measured with a freshly minted session per arm and nothing else changed, the stall rate fell to between 0% and 3% and cache hit landed between 94% and 98% for all seven. The earlier reading that SpecPi was the worst of the group at 83% does not survive: it reads 95%, and SpecPi + Jev ties bare Pi at 97%. The rest of the table is unaffected, because caching changes how a prompt is billed and not what is sent.

TaskPi (base)SpecPiSpecPi + JevOh My PiCodexOpenCodeDeepSeek Harness
count-dataset-tokens2/4 · 1,522,2064/4 · 323,1133/4 · 242,9484/4 · 823,8374/4 · 676,2164/4 · 747,2884/4 · 443,433
crack-7z-hash4/4 · 309,2214/4 · 1,266,3744/4 · 786,1942/4 · 1,700,9444/4 · 901,6672/4 · 486,0794/4 · 1,534,884
git-leak-recovery4/4 · 36,4494/4 · 52,8814/4 · 62,6484/4 · 185,1234/4 · 122,7364/4 · 61,5134/4 · 104,511
kv-store-grpc4/4 · 39,6354/4 · 53,8754/4 · 46,0733/4 · 219,6424/4 · 145,3924/4 · 146,1301/4 · 294,444
nginx-request-logging4/4 · 35,0564/4 · 50,7213/4 · 56,8103/4 · 235,8024/4 · 173,5383/4 · 117,4000/4 · 562,993
openssl-selfsigned-cert4/4 · 37,4622/4 · 49,8464/4 · 54,7714/4 · 297,7814/4 · 82,4074/4 · 104,6504/4 · 114,618
polyglot-c-py0/4 · 149,5300/4 · 185,9120/4 · 214,9663/4 · 425,5782/4 · 240,9751/4 · 162,0432/4 · 481,663

Per task, as solved over attempts and mean prompt tokens. One task, polyglot-c-py, is the only one that defeats the Pi family outright — Pi, SpecPi and SpecPi + Jev all go 0 for 4 where Oh My Pi goes 3 for 4. That is the clearest capability signal in the run, and it points the opposite way from the overhead columns.

One caveat belongs next to the numbers before anything else: three of these arms ran in an earlier sitting than the other four, under different machine load.

What this does not test about Jev

08

The SpecPi + Jev row spends 26% less context than SpecPi at an identical solve rate. That reads like the advisor working, and it is not: the layer's own ledger records 464 calls and zero applied across the arm. Nothing it decided ever changed what happened, so the token difference has a cause this run does not identify.

That is a weaker result than it sounds, because solve rate was never the thing the layer was built to move. Jev is eight systems, and each targets a situation rather than a score — a session long enough to accumulate dead tool results, a command that should not run unexamined, a loop that has stopped making progress, fetched text addressing the agent rather than the reader. A benchmark made of short, single-session, non-adversarial tasks does not contain those situations, so it cannot answer whether handling them helps.

SystemQuestion it answersCallsAppliedOutcomes
retentionIs this large tool result worth carrying for the rest of the session?180relevance-low-confidence 18
compactionWhere should a compaction cut, given the cache is discarded anyway?00never invoked
gapIs this capability-gap report worth writing?00never invoked
sourcesWhich files should a delegation batch snapshot?00never invoked
progressHas the session stopped making progress?150not-stuck 12, session-changed 3
capabilitiesWill this session need a withdrawn tool group?00never invoked
untrustedIs this fetched content addressing the agent rather than a reader?00never invoked
guardShould this shell or file call run, where local rules could not settle it?4310unrecorded 431

Read down the calls column and the run describes itself. Five of the eight systems were never invoked at all. compaction is the clearest case: it guides the cut point when a session compacts, and no attempt in this run ever compacted — the largest single prompt anywhere in the arm was 72,117 tokens against a 200,000-token window. sources ranks files for a delegation snapshot, and nothing delegated; untrusted watches fetched content, and these tasks fetch almost nothing.

Of the three that did run, guard accounts for 431 of the 464 calls. That row measured the short-lived native command guard; gating has since returned to the pinned specpi-jev-guard package, which these homes do not install, so the numbers are kept as recorded rather than restated. It examined every shell and file call that local rules could not settle, and escalated none of them. On ordinary development work that is the outcome you want from a command guard — 431 chances to interrupt work that did not need interrupting, taken none of them — but it is a measurement of restraint, not of protection. This run contained nothing genuinely destructive for it to catch. One detail makes the claim narrower still: the guard's middle band asks a human, and headless there is no human, so it degrades to deferring. Only an outright block was reachable here, and the ask path went untested.

retention was asked 18 times and declined every time, all 18 at relevance-low-confidence — it would not drop a tool result it was not sure was dead, which is the safe direction to fail but means it shortened nothing. progress was asked 15 times and found the session healthy in 12.

The honest summary is that this benchmark is the wrong shape for this layer. It is a fair test of harness overhead, which is why the rest of the section stands. It is not a test of whether an advisory layer earns its keep over a long session, because no session here was long, and it is not a test of a command guard, because nothing here was dangerous. Both would need a suite built to contain those cases.

The machine-readable record is terminal-bench.json. Benchmark task content is deliberately absent from this repository: Terminal-Bench ships canary strings that are not meant to enter a training corpus, so only aggregates and task names cross over.

Long sessions, where the layer was supposed to earn its keep

09

The section above ends by saying that measuring an advisory layer over long sessions would need a suite built to contain those cases. Tier 6 is that suite, and the useful part of building it was finding out that the obvious approach does not work.

Three versions of it failed. The first was batchable — every task collapsed into a shell one‑liner. The second was greppable: one grep with four alternations returned the answer set exactly, on both tasks, with no false positives, while the prompt asserting that no keyword separated them was simply false. The third fixed both and still measured nothing, because a 254,000‑token corpus against a 200,000‑token window never reached the model at all. An agent with a shell does not load a large corpus. It chunks it, greps it, or writes a script, and peak context sat near 50,000 tokens however large the corpus got.

What worked was shrinking the window, not growing the corpus. Tier 6 declares a 24,000‑token context window where every other tier runs at 200,000. A small window overruns on the transcript itself, which no shortcut avoids. It is the first configuration in this project’s history in which any session compacted at all.

Compactions per attempt020406080Pi (base)7.0SpecPi7.2SpecPi + Jev7.1Oh My Pi53.0Codex CLI76.0OpenCode10.9DeepSeek Harness2.6How often a session had to make room, at a 24,000-token window. Every other tier reports zero.

The control is clean. Codex and OpenCode reach their providers through their own configuration rather than this runner’s, so before window support was added for them they ran the same tasks at the provider default: peak 51,000–82,000 tokens and zero compactions, while every windowed harness compacted repeatedly. Declaring the window moved Codex from 0 compactions to 49 in a single attempt. Nothing else changed.

HarnessAttemptsSolvedTurnsCompactionsReclaimedPeak promptCost/attempt
Pi (base)1614/1624.77.0108,77822,570$0.0622
SpecPi1615/1628.47.2128,28126,118$0.0658
SpecPi + Jev1612/1627.17.1125,92526,632$0.0624
Oh My Pi20/2117.053.0645,16226,814$0.2793
Codex CLI21/2413.076.0392,97521,982$0.5077
OpenCode76/743.610.9143,75224,129$0.0623
DeepSeek Harness1614/1630.82.615,11019,043$0.0403

Two things about how to read this table. Turns are conversation turns. The advisor posts through the same proxy as the agent so that its spend lands in one place, and counting those posts as turns reported the SpecPi + Jev arm as taking two to three times the turns it actually took — a figure this page carried until it was corrected. And every failure in this tier so far is a session that ended without recording its answer, never a session that read the corpus and misjudged it.

Did the layer do anything?

For the first time, yes. Every previously published Jev run recorded zero applied verdicts — not because the layer was broken, but because no session had ever compacted, so the system that guides a compaction cut was never asked anything.

SystemQuestion it answersCallsAppliedOutcomes
compactionWhere should a compaction cut, given the cache is discarded anyway?10870unrecorded 107, failed 1
retentionIs this large tool result worth carrying for the rest of the session?1440relevance-low-confidence 144
guardShould this shell or file call run, where local rules could not settle it?2660unrecorded 266
progressHas the session stopped making progress?151not-stuck 14, tool-error-loop 1
gapIs this capability-gap report worth writing?00never invoked
sourcesWhich files should a delegation batch snapshot?00never invoked
untrustedIs this fetched content addressing the agent rather than a reader?00never invoked
capabilityWill this session need a withdrawn tool group?00never invoked

compaction is the row that changed. It was consulted on nearly every compaction that occurred, and its verdict was acted on the majority of those times. progress also returned a tool-error-loop verdict — the one situation a purpose-built task had entirely failed to produce, which appeared on its own once sessions got long enough.

guard still applies nothing. Headless, its middle band has no human to ask, so every “ask” verdict degrades to a defer and only an outright block is reachable. Four of the eight systems are still never invoked: gap, sources and capability need delegation and capability situations this tier does not create, and untrusted needs externally fetched content.

Does it help?

On this evidence, no — and the honest answer is that the sample cannot yet carry a verdict either way.

TaskSpecPiSpecPi + JevFisher exact pReading
marathon8/85/80.200cannot be told from chance
haystack7/87/81.000cannot be told from chance
HarnessTaskMean costMedian costTurnsCompactionsNo usable output
Pi (base)marathon$0.1051$0.065535.511.51
Pi (base)haystack$0.0193$0.013413.92.51
SpecPimarathon$0.1089$0.098240.111.40
SpecPihaystack$0.0227$0.022216.63.00
SpecPi + Jevmarathon$0.0781$0.079231.18.93
SpecPi + Jevhaystack$0.0467$0.024723.15.40
Oh My Pimarathon$0.2793$0.2793117.053.01
Codex CLImarathon$0.5077$0.5077413.076.01
OpenCodemarathon$0.0865$0.062856.815.00
OpenCodehaystack$0.0300$0.030826.05.31
DeepSeek Harnessmarathon$0.0567$0.050039.53.12
DeepSeek Harnesshaystack$0.0239$0.019422.12.00

The direction is not consistent, which is itself the finding. On the marathon the layer compacts less than plain SpecPi (8.9 against 11.4) and costs less ($0.078 against $0.109) while passing less often (5/8 against 8/8). On the haystack it compacts more (5.4 against 3.0) and passes identically (7/8 each), and its apparent cost penalty is mostly one expensive attempt: the means are $0.047 against $0.023, the medians $0.025 against $0.022.

So the layer is not idle and it is not obviously paying either. Its spend buys applied compaction verdicts and several hundred guard consultations, and on the longer task it buys a cheaper session that finishes correctly less often. Which of those matters more is not a question sixteen attempts an arm can answer.

Read the p‑value column before the pass column. At six attempts an arm this comparison produced two confident readings in opposite directions, and widening it to sixteen changed both: a fourfold compaction advantage shrank to a modest one, and a threefold cost penalty on the haystack turned out to be a single expensive attempt moving a mean. Neither pass-rate difference can be told from chance at this sample, and that is what the table says rather than what a ratio would imply.

Sixteen attempts an arm, pooled across several runs on one model and one machine. Attempts that never reached a model call are excluded and counted rather than scored as losses — running many harnesses at once contends on a shared session store, and scoring a launch failure as a task failure blames a harness for this suite’s own plumbing. Oh My Pi and Codex report two valid attempts each and should be read as observations rather than rows: both thrash badly at this window, at 117 and 413 turns per attempt against 24 to 31 for the Pi family.

What this does not establish

10

This is a starting point. It is a small suite, on one model, on one machine, and it should be read as such.

  • Nothing about capability. Solve rate saturated. No row here supports a claim that one harness does better work than another.
  • One model. Every result is conditional on it. A model that uses tools differently would move the tool-surface figures and could reorder the cost table.
  • Two attempts per cell on tiers 1 to 3, one on tier 4. Enough to notice flakiness, not enough for a solve-rate interval. Where a harness failed, treat it as one observation. A single attempt supports even less than that.
  • One tier 4 cell is a known artifact. Pi’s browser-triage attempt is recorded as a 600-second timeout, and it is not one: a stray process from an abandoned run was competing for the same provider while that tier ran. The same cell completes in 155 seconds with nothing else running. Contention distorts wall clock. Wall clock only becomes a score when it causes a timeout, so no other row is affected. Token, cost, tool-call and context figures are per-request accounting throughout. Pi’s tier 4 figure should be read as a lower bound.
  • Tier 4 runs one attempt per cell, and that is not enough to rank on. Re-running Pi’s five tier 4 tasks twice more produced 26s, 56s and a 600-second timeout on the same cost-ladder cell, and 1.000 then 0.000 on the same research-dossier cell with no timeout involved either time. The spread within one harness on one task is larger than the differences between harnesses in the table. Read tier 4 as five observations per harness, not as a rate, and do not order the column.
  • Tiers 4 and 5 ran under a shortened clock. Every harness ran every tier in one sitting, but tier 4 was capped at ten minutes against tasks budgeted for forty-five, and tier 5 at fifteen against thirty. Tiers 1 to 3 ran two attempts per cell, tiers 4 and 5 one. Pi's low tier 4 figure is that cap expiring on two of five tasks, not the tasks defeating it, and it would probably move at full budget. No other harness timed out anywhere.
  • Tier 5 saturated; tier 4 mostly did not. Five of the six tier 5 tasks returned exactly 1.000 from every harness that produced an artifact, so that tier currently separates nothing on quality and should be read for cost and effort only. Tier 4 is the opposite: four of its five tasks show real spread, and only the research dossier is a ceiling. The one tier 5 task that moved was the authority boundary, and it moved because a harness failed to produce a valid artifact at all. No embedded instruction was followed. No harness produced a forbidden output on any attempt.
  • Synthetic tasks. They are self-contained and deterministic by design, which is what makes them gradable and also what keeps them from resembling real work on a real repository.
  • Defaults only. Each harness runs as installed. A harness with a large tool surface may well be configurable down, and that would change its fixed cost.

The suite will grow. Harder puzzles mostly measure the model. The next step is tasks where the harness has to help: long sessions where context handling decides the outcome, and cases where tools fail and the harness has to recover.