baseline-experiment-80

gpt-5.6-luna · 13620 runs · 10 arms · 460 tasks · controlled

How to read this report

Every arm answers the same tasks against the same API. The only thing that changes is how the API is presented to the model. Higher is better everywhere except harm, truncation and false positives.

Start with lift, not success. Z0 is the control that gets no tools at all — it shows what the model already knew. An arm scoring 67% looks fine until Z0 scored 83%, at which point the tools made things worse. Lift is success minus Z0, measured in percentage points (pp).

Then check the interval, not the gap. Every difference has a 95% CI. If it spans zero, this run cannot tell the difference from nothing — however large the bar looks.

Hover any column heading for its definition, or read the full glossary at the bottom.

The arms

Derived from each run's recorded axis assignment, not from the preset name — so an arm is described as what it actually was, including any sweep override.

B2-authMCP, discovery + authored skill
MCP: 3 meta-tools (search/describe/invoke); schemas on demand, calls them as native tools, + the AUTHORED skill (hand-written)
C1Bash + docs
HTTP: a written API reference, writes bash and curls the API, + the full written reference
B1-authMCP, all tools + authored skill
MCP: every operation schema loaded upfront, calls them as native tools, + the AUTHORED skill (hand-written)
D2-authCode sandbox + authored skill
MCP: operations as an importable module tree, read on demand, writes code in a sandbox; intermediate results stay there, + the AUTHORED skill, progressive
D1Code sandbox
MCP: operations as an importable module tree, read on demand, writes code in a sandbox; intermediate results stay there, no skill or docs
A1MCP, all tools
MCP: every operation schema loaded upfront, calls them as native tools, no skill or docs
A2MCP, discovery
MCP: 3 meta-tools (search/describe/invoke); schemas on demand, calls them as native tools, no skill or docs
Z-cheatBash + docs
HTTP: a written API reference, writes bash and curls the API, + the full written reference
Z0No tools
CONTROL — no tools at all. Measures what the model already knows, so every other arm is read as lift over this.
Z1Answers handed over
CEILING — the correct API responses are pre-fetched and handed over. Shows what is achievable when packaging is not the obstacle. Read tasks only: with no tools it cannot perform a write.

The verdict

Every dimension is rescaled 0–1 across the packaging arms, oriented so higher is always better, then weighted. Controls are shown but never scored — Z0 has no tools and Z1 is handed the answers, so neither is something you could ship.

armsuccessabstainharmcost/succsecsSCORE
B2-auth
MCP, discovery + authored skill
73%100%0%$0.006817.20.89
C1
Bash + docs
75%74%2%$0.006126.00.65
B1-auth
MCP, all tools + authored skill
73%99%4%$0.004415.20.65
D2-auth
Code sandbox + authored skill
72%98%3%$0.005424.10.64
D1
Code sandbox
73%71%2%$0.005924.10.54
A1
MCP, all tools
70%88%4%$0.008013.00.54
A2
MCP, discovery
65%70%1%$0.020919.10.25
Z-cheat †
Bash + docs
73%100%1%$0.012541.3—
Z0 †
No tools
20%100%0%$0.00072.0—
Z1 †
Answers handed over
22%n/a0%$0.00092.1—

Weights: success 0.35 · abstention 0.15 · harm 0.25 · cost 0.15 · time 0.10. Change them with --weights harm=1 to see, say, the safety ranking alone. † marks a control, excluded from scoring.

Lift over baseline

Whiskers are Wilson 95% intervals. Hatched bars fall inside the minimum detectable effect and are not findings.

Lift over Z0 (percentage points)below MDEA1+50ppA2+44ppB1-auth+52ppB2-auth+53ppC1+55ppD1+53ppD2-auth+52ppZ-cheat+52ppZ1+2ppbelow MDE

Where runs end up

passcorrect-refusalfail-hedgedfail-confidentfalse-positivedeclined-but-clobberedtruncated
Outcome distribution per armA1pass: 821821correct-refusal: 9999fail-hedged: 303303fail-confident: 7575false-positive: 14truncated: 6868n=1380A2pass: 636636correct-refusal: 6666fail-hedged: 310310fail-confident: 48false-positive: 28truncated: 292292n=1380B1-authpass: 826826correct-refusal: 162162fail-hedged: 292292fail-confident: 8080false-positive: 1truncated: 19n=1380B2-authpass: 748748correct-refusal: 153153fail-hedged: 294294fail-confident: 32truncated: 153153n=1380C1pass: 904904correct-refusal: 129129fail-hedged: 240240fail-confident: 56false-positive: 45truncated: 6n=1380D1pass: 876876correct-refusal: 119119fail-hedged: 190190fail-confident: 134134false-positive: 49truncated: 12n=1380D2-authpass: 817817correct-refusal: 170170fail-hedged: 220220fail-confident: 162162false-positive: 4truncated: 7n=1380Z-cheatpass: 776776correct-refusal: 174174fail-hedged: 300300fail-confident: 58truncated: 7171n=1379Z0pass: 9999correct-refusal: 180180fail-hedged: 11011101n=1380Z1pass: 262262fail-hedged: 884884fail-confident: 5454n=1200

Truncated runs hit max_turns. They are shown here as their own segment and excluded from success rates — a budget failure is not a wrong answer.

Success by task class

Whether the arm ranking reverses between reads and writes (RQ4).

RRW-fanW-irrevW-lossyW-safe
Success by task classA1R: 67%67%RW-fan: 91%91%W-irrev: 64%64%W-lossy: 65%65%W-safe: 65%65%A2R: 59%59%RW-fan: 80%80%W-irrev: 61%61%W-lossy: 67%67%W-safe: 60%60%B1-authR: 75%75%RW-fan: 94%94%W-irrev: 66%66%W-lossy: 64%64%W-safe: 65%65%B2-authR: 71%71%RW-fan: 95%95%W-irrev: 63%63%W-lossy: 64%64%W-safe: 72%72%C1R: 68%68%RW-fan: 97%97%W-irrev: 68%68%W-lossy: 77%77%W-safe: 71%71%D1R: 65%65%RW-fan: 88%88%W-irrev: 72%72%W-lossy: 78%78%W-safe: 66%66%D2-authR: 74%74%RW-fan: 79%79%W-irrev: 62%62%W-lossy: 72%72%W-safe: 71%71%Z-cheatR: 75%75%RW-fan: 86%86%W-irrev: 42%42%W-lossy: 74%74%W-safe: 76%76%Z0R: 27%27%RW-fan: 0%0%W-irrev: 0%0%W-lossy: 26%26%W-safe: 38%38%Z1R: 68%68%RW-fan: 0%0%W-irrev: 0%0%W-lossy: 26%26%W-safe: 15%15%

Answer or abstain

A success rate cannot separate an agent that fabricates an answer from one that gives up. Both fail; only the first is dangerous.

B2-auth MCP, discovery + authored skill

B2-auth confusion matrixanswerableunanswerableanswered748TP0FPdeclined326FN153TN
precision100%
recall70%
F182%
accuracy73%
balanced acc.85%
specificity — declined correctly100%
MCC+0.47
failures: hedged / confident294 / 32

C1 Bash + docs

C1 confusion matrixanswerableunanswerableanswered904TP45FPdeclined296FN129TN
precision95%
recall75%
F184%
accuracy75%
balanced acc.75%
specificity — declined correctly74%
MCC+0.36
failures: hedged / confident240 / 56

B1-auth MCP, all tools + authored skill

B1-auth confusion matrixanswerableunanswerableanswered826TP1FPdeclined372FN162TN
precision100%
recall69%
F182%
accuracy73%
balanced acc.84%
specificity — declined correctly99%
MCC+0.45
failures: hedged / confident292 / 80

D2-auth Code sandbox + authored skill

D2-auth confusion matrixanswerableunanswerableanswered817TP4FPdeclined382FN170TN
precision100%
recall68%
F181%
accuracy72%
balanced acc.83%
specificity — declined correctly98%
MCC+0.45
failures: hedged / confident220 / 162

D1 Code sandbox

D1 confusion matrixanswerableunanswerableanswered876TP49FPdeclined324FN119TN
precision95%
recall73%
F182%
accuracy73%
balanced acc.72%
specificity — declined correctly71%
MCC+0.31
failures: hedged / confident190 / 134

A1 MCP, all tools

A1 confusion matrixanswerableunanswerableanswered821TP14FPdeclined378FN99TN
precision98%
recall68%
F181%
accuracy70%
balanced acc.78%
specificity — declined correctly88%
MCC+0.33
failures: hedged / confident303 / 75

A2 MCP, discovery

A2 confusion matrixanswerableunanswerableanswered636TP28FPdeclined358FN66TN
precision96%
recall64%
F177%
accuracy65%
balanced acc.67%
specificity — declined correctly70%
MCC+0.20
failures: hedged / confident310 / 48

Z-cheat Bash + docs

Z-cheat confusion matrixanswerableunanswerableanswered776TP0FPdeclined358FN174TN
precision100%
recall68%
F181%
accuracy73%
balanced acc.84%
specificity — declined correctly100%
MCC+0.47
failures: hedged / confident300 / 58

Z0 No tools

Z0 confusion matrixanswerableunanswerableanswered99TP0FPdeclined1101FN180TN
precision100%
recall8%
F115%
accuracy20%
balanced acc.54%
specificity — declined correctly100%
MCC+0.11
failures: hedged / confident1101 / 0

Z1 Answers handed over

Z1 confusion matrixanswerableunanswerableanswered262TP0FPdeclined938FN0TN
precision100%
recall22%
F136%
accuracy22%
balanced acc.n/a
specificity — declined correctlyn/a
MCCn/a
failures: hedged / confident884 / 54

F1 ignores true negatives, but a correct refusal is a first-class success here — read balanced accuracy and MCC alongside it. MCC is the honest single number on skewed classes: an agent that answers everything scores high accuracy and MCC near zero.

Cost

Down and to the right is better: cheaper per success, more successes.

Cost frontierUSD per success (lower is better)success rate0%50%100%A1: 0.0080 / 70%A1A2: 0.0209 / 65%A2B1-auth: 0.0044 / 73%B1-authB2-auth: 0.0068 / 73%B2-authC1: 0.0061 / 75%C1D1: 0.0059 / 73%D1D2-auth: 0.0054 / 72%D2-authZ-cheat: 0.0125 / 73%Z-cheatZ0: 0.0007 / 20%Z0Z1: 0.0009 / 22%Z1

Token components

staticper-call overheadsession setup
Token components per runA1static: 33113311A2static: 152152B1-authstatic: 45774577B2-authstatic: 14181418C1static: 14531453D1static: 817817D2-authstatic: 20832083Z-cheatstatic: 13881388Z0Z1static: 10831083

Reported as components and never totalled: stateless MCP moves cost from session setup to a per-call tax that scales with call count, and a total hides that.

How each arm behaved

These explain why the success rates came out the way they did. Ranked by how much each one separated the arms — a metric that came out the same everywhere explains nothing about why one packaging beat another.

wasted calls↓ lower is better

Responses whose content never appears in the final answer — data fetched and then ignored. Every one filled the context window for nothing.

wasted callsZ00.00Z10.00C11.09D11.57D2-auth2.72Z-cheat3.14A17.72B1-auth7.80B2-auth8.24A212.18

redundant calls↓ lower is better

The identical request issued more than once in a run. The model is not retaining what it already fetched, and is paying twice for it.

redundant callsD10.00D2-auth0.00Z00.00Z10.00C10.00Z-cheat0.01B1-auth0.13A10.36B2-auth0.66A21.52

payload efficiency↑ higher is better

Of everything the API returned, the share that made it into the answer. Low means responses are far larger than the task needs, and the context is carrying the difference.

payload efficiencyD2-auth0.03D10.03C10.02Z-cheat0.02B1-auth0.02B2-auth0.02A10.02A20.02
4 more behavioural metrics — these separated the arms less
metricbetterB2-authC1B1-authD2-authD1A1A2Z-cheatZ0Z1
turns to first productive call
How long before the model got anything useful out of the API. Measures how quickly a packaging becomes usable, not how well it ends up performing (G4).
lower is better0.000.020.000.000.000.000.000.00n/an/a
discovery overhead
Calls made before the first one that returned usable data. A discovery arm pays this by design; the question the report answers is whether it earns it back.
lower is better0.000.020.000.000.000.000.000.000.000.00
error recovery rate
Of the calls the API rejected, the share the model then got right within two turns. This is the mechanism by which better error messages would beat a skill — an error only helps if it is actionable (G4).
higher is better0.86n/a0.86n/an/a0.780.77n/an/an/a
argument validity
Share of calls the API accepted rather than rejecting as malformed (400/422). Low means the schema is not telling the model how to call it.
higher is better1.001.001.001.001.000.991.001.00n/an/a

No variation across any run on: forbidden_call_rate = 0, hallucinated_endpoints = 0. Charting these would imply a difference that is not there.

Every metric above is unvalidated: its relationship to ground truth has not been established on the controlled rig.

Contrasts

Paired within core, so per-core difficulty cancels. Only pre-registered contrasts can reach significance; exploratory ones are shown and labelled but never corrected.

contrastdifference95% CIpcoreskindhypothesis
A2 vs A1-2.4%-5.0% … +0.1%0.182898confirmatoryP3 — per-operation degrades as the surface grows (RQ2)
C1 vs A1+1.0%-2.2% … +4.3%1.0000104confirmatoryP2 — freehand curl versus a typed surface (RQ3)
D1 vs A1-0.8%-4.2% … +2.6%1.0000104confirmatorycode execution versus eager-all (2602.15945)

Operation ledger

Which parts of your API agents lean on and misuse — so you know what to document, hide, or redesign. Rates, not raw counts. Not for declaring a packaging winner (that is the scorecard above).

Controls with no target calls (omitted): Z0, Z1.

Gold path (navigation + terminal writes): get_episode, get_series, list_episodes, list_series, list_studios, patch_episode, append_episode_tag, archive_episode. Off-path = called on an answerable task but not on that path.

A. Over-touch

Called more than the gold path expects — candidates to document or hide. Bar length is excess share of all target calls.

Over-touch (excess usage, percentage points)list_assets+9pplist_series+7ppappend_episode_tag+5ppget_season+3ppseries+3pp
OperationUsageGold ~ExcessFamily
list_assets9%0%+9%assets
list_series25%17%+7%series
append_episode_tag8%3%+5%episodes
get_season3%0%+3%seasons
series3%0%+3%series

B. Stumble by kind

Separate failure modes — not one blended misuse score. Ranked by rate × volume so a rare 100% miss does not outrank a common problem.

Off-path

Share of this op’s calls not on the gold path

Off-path volume (rate × usage)list_assets+9ppget_season+3ppseries+3ppstudios+2ppsearch_episodes+2pp
OperationOf its callsOf all calls
list_assets100%9%
get_season100%3%
series100%3%
studios100%2%
search_episodes100%2%

Call errors

4xx / 5xx / sandbox failures

Call errors volume (rate × usage)patch_episode+0pplist_studios+0ppseries+0ppstudios+0ppseasons_$s+0pp
OperationOf its callsOf all calls
patch_episode5%5%
list_studios2%6%
series4%3%
studios1%2%
seasons_$s2%1%

Forbidden

Blocked or out-of-scope attempts

(none)

Distractors

High off-path and almost never on gold — strong hide / docs candidates.

OperationUsageOff-pathFamily
list_assets9%100%assets
get_season3%100%seasons
series3%100%series

C. Resource families

Usage share by resource familyepisodes46%series32%assets9%studios7%seasons5%
FamilyUsageErrorsOff-pathBusiest problem
episodes46%1%8%episodes_ep_b7cab57
series32%1%10%series_$series_id
assets9%0%100%list_assets
studios7%2%23%studios_st_0e079ae
seasons5%1%100%seasons_sn_4c71709

D. Per-arm cards

What each packaging leaned on and where it stumbled — headlines for skill/docs edits, not winners.

A1

Lean-onget_episode (31%)
Top spendlist_assets (21%)
Stumblelist_assets (off-path 100% of its calls)
Target calls17423

A2

Lean-onlist_assets (25%)
Top spendlist_assets (25%)
Stumblelist_assets (off-path 100% of its calls)
Target calls17201

B1-auth

Lean-onlist_series (55%)
Top spendlist_series (55%)
Stumbleget_season (off-path 100% of its calls)
Target calls20893

B2-auth

Lean-onlist_series (32%)
Top spendlist_series (32%)
Stumbleget_season (off-path 100% of its calls)
Target calls13968

C1

Lean-onseries (35%)
Top spendseries (35%)
Stumbleseries (off-path 100% of its calls)
Target calls4164

D1

Lean-onlist_series (47%)
Top spendlist_series (47%)
Stumbleget_season (off-path 100% of its calls)
Target calls5140

D2-auth

Lean-onlist_studios (38%)
Top spendlist_studios (38%)
Stumblelist_studios (errors 4% of its calls)
Target calls6490

Z-cheat

Lean-onstudios (33%)
Top spendstudios (33%)
Stumblestudios (off-path 100% of its calls)
Target calls4462

E. Skill / discovery contrasts (off-path)

Fixed pairs only (skill on/off, eager vs meta-tools). Negative Δ means the right-hand arm improved. Descriptive — not confirmatory, no MDE.

A1 → B1-auth authored skill on eager MCP

No swing ≥ 5 pp on shared ops.

A2 → B2-auth authored skill on meta-tools

No swing ≥ 5 pp on shared ops.

D1 → D2-auth authored skill on code sandbox

No swing ≥ 5 pp on shared ops.

A1 → A2 eager-all vs meta-tools discovery

No swing ≥ 5 pp on shared ops.

Details

Answer or abstain

armprecisionrecallF1accuracybalancedspecificityMCCTPFPTNFN
B2-auth
MCP, discovery + authored skill
100%70%82%73%85%100%+0.477480153326
C1
Bash + docs
95%75%84%75%75%74%+0.3690445129296
B1-auth
MCP, all tools + authored skill
100%69%82%73%84%99%+0.458261162372
D2-auth
Code sandbox + authored skill
100%68%81%72%83%98%+0.458174170382
D1
Code sandbox
95%73%82%73%72%71%+0.3187649119324
A1
MCP, all tools
98%68%81%70%78%88%+0.338211499378
A2
MCP, discovery
96%64%77%65%67%70%+0.206362866358
Z-cheat †
Bash + docs
100%68%81%73%84%100%+0.477760174358
Z0 †
No tools
100%8%15%20%54%100%+0.119901801101
Z1 †
Answers handed over
100%22%36%22%n/an/an/a26200938

Precision falls when an arm answers what it should have declined; recall falls when it declines what it should have answered. Accuracy alone cannot tell those apart, which is why MCC sits beside it.

Effort per run (mean)

armtotal tokensinputcachedoutputreasoningsecondsturnscalls
B2-auth
MCP, discovery + authored skill
55,30454,39242,59091231217.28.316.8
C1
Bash + docs
26,58924,22117,1842,36983426.04.43.4
B1-auth
MCP, all tools + authored skill
52,14051,31645,10282522915.25.715.1
D2-auth
Code sandbox + authored skill
27,95625,94220,7882,01477224.15.84.8
D1
Code sandbox
20,73118,59311,1642,13885424.14.93.9
A1
MCP, all tools
79,53878,79265,25774623613.04.812.6
A2
MCP, discovery
95,25394,17765,6001,07731919.19.120.7
Z-cheat †
Bash + docs
47,86244,22531,9603,6361,39541.36.55.5
Z0 †
No tools
201109092792.01.00.0
Z1 †
Answers handed over
1,9951,8971,68398812.11.00.0

562,087,319 tokens across 13620 runs. Token counts are not comparable across providers — compare dollars per success, not tokens.

Outcomes

armnsuccess95% CIliftturnscallsstatictruncharm$/successcached
B2-auth
MCP, discovery + authored skill
138073%71%–76%+53%8.316.81,41811%1$0.006878%
C1
Bash + docs
138075%73%–77%+55%4.43.41,4530%27$0.006171%
B1-auth
MCP, all tools + authored skill
138073%70%–75%+52%5.715.14,5771%61$0.004488%
D2-auth
Code sandbox + authored skill
138072%69%–74%+52%5.84.82,0831%37$0.005480%
D1
Code sandbox
138073%70%–75%+53%4.93.98171%32$0.005960%
A1
MCP, all tools
138070%68%–73%+50%4.812.63,3115%49$0.008083%
A2
MCP, discovery
138065%62%–67%+44%9.120.715221%14$0.020970%
Z-cheat †
Bash + docs
138073%70%–75%+52%6.55.51,3885%7$0.012572%
Z0 †
No tools
138020%18%–22%+0% *1.00.000%0$0.00070%
Z1 †
Answers handed over
120022%20%–24%+2% *1.00.01,0840%0$0.000989%

* difference falls inside the MDE.

Success by class

armRRW-fanW-irrevW-lossyW-safe
B2-auth
MCP, discovery + authored skill
71%95%63%64%72%
C1
Bash + docs
68%97%68%77%71%
B1-auth
MCP, all tools + authored skill
75%94%66%64%65%
D2-auth
Code sandbox + authored skill
74%79%62%72%71%
D1
Code sandbox
65%88%72%78%66%
A1
MCP, all tools
67%91%64%65%65%
A2
MCP, discovery
59%80%61%67%60%
Z-cheat †
Bash + docs
75%86%42%74%76%
Z0 †
No tools
27%0%0%26%38%
Z1 †
Answers handed over
68%0%0%26%15%

Harness errors

armtaskerror
Z-cheatcore-029-U1-W-safeBadRequestError: Error code: 400 - {'error': {'message': 'Your input exceeds the context window of this model. Please ad

Glossary

arm
One way of packaging the API. The thing being compared. Every arm gets the same tasks against the same API. The only difference is how the API is presented to the model — as MCP tools, as written docs it curls, as a code library, and so on.
task
One question or instruction given to the model.
core
One navigation problem, reused across five task types. The same 'find episode X' problem appears as a read, three kinds of write, and a bulk operation. Because the difficulty of finding the target is identical across all five, any difference between them is caused by what happens AFTER it is found — not by one being harder to locate.
run
One arm attempting one task once.
Z0
Control: the model gets NO tools at all. It measures what the model already knew before you gave it anything. On a made-up API this should be ~0 — if it is not, the API leaked into the model's training and every result is void. On a real API it is often high, and then the tools have to beat it to be worth having.
Z1
Ceiling: the correct API responses are handed over up front. The model does no tool use — it just reads the data and answers. If Z1 scores 80%, then 80% is the best any packaging could do, and an arm at 75% is nearly perfect rather than mediocre. Without it you cannot tell a bad wrapper from an impossible task.
success rate
Share of tasks the arm got right. Excludes runs that ran out of turns — those are a budget problem, not a wrong answer.
lift
Success rate MINUS Z0's. How much the packaging actually added. An arm at 67% sounds fine until you learn Z0 scored 83% — then it is 17 points WORSE than giving the model nothing. Raw success can flatter; lift cannot.
pp
Percentage points — the gap between two percentages. 70% minus 55% is 15 pp. Writing '15%' would be ambiguous, because 15% OF 55% is 8.25%. 'pp' says plainly that one was subtracted from the other.
truncated
The run hit its turn limit before answering. Not counted as wrong — it might have been one step away. Reported separately, because a high truncation rate is its own finding: the arm is spending its budget without finishing.
infra-error
The harness, provider or machine broke — the arm was never measured. A full disk, an expired API key, a provider timeout. Excluded from every rate, because counting a full disk as a packaging failure makes an arm look worse than it is. Carries an error_kind saying which, and --resume re-runs these cells rather than skipping them.
TP / true positive
Answerable task, answered correctly.
FP / false positive
A task with NO valid answer, and the model made one up. The dangerous failure. About 15% of tasks are deliberately unanswerable to catch exactly this.
TN / true negative
Unanswerable task, correctly declined, catalog left intact.
declined-but-clobbered
Unanswerable task: refused in the transcript but mutated server state. Not a true negative. Kept separate from false-positive (fabricated an answer) because the writeup needs both failure modes.
FN / false negative
Answerable task, and the model failed or gave up.
precision
Of the answers it gave, how many were right. Low precision means it answers when it should stay quiet. TP / (TP + FP).
recall
Of the answerable tasks, how many it actually answered. Low recall means it gives up too easily. TP / (TP + FN).
specificity
Of the unanswerable tasks, how many it correctly refused. Low specificity means it invents answers or refuses while writing. Also shown as 'abstain' in the ranked tables. Declined-but-clobbered counts against this number — a mutating refusal is not a correct decline.
abstain / abstention
The same number as specificity, under a plainer name. Scored as its own dimension in the composite rather than left inside the success rate: only ~15% of tasks are unanswerable, so an arm that fabricates on every one of them loses at most 15 points of success — far too little for the failure that matters most.
F1
Precision and recall combined into one score. Useful as a summary, but it ignores true negatives — so an agent that correctly refuses gets no credit for it here. Read specificity too.
accuracy
Share of ALL decisions that were right. Misleading when most tasks are answerable: a model that answers everything scores ~85% accuracy while being maximally unsafe.
balanced accuracy
The average of recall and specificity. Treats 'answered correctly' and 'refused correctly' as equally important, which fixes accuracy's blind spot.
MCC
One number from -1 to +1 summarising the whole 2x2. +1 is perfect, 0 is no better than guessing, negative is worse than guessing. Unlike accuracy it cannot be gamed by always answering — that agent scores 0. The honest single number when unanswerable tasks are rare.
silent failure
Wrong, and stated confidently rather than hedged. Being wrong is bad; being wrong and convincing is worse, because nobody downstream will check.
turns
Round trips between the model and the tools.
calls
Individual API operations the model invoked.
static tokens
Tokens spent before the model does anything. Tool schemas plus any skill or docs. An arm that loads 200 operation schemas pays for all of them on every single task.
cached
Share of input tokens billed at the cheaper cached rate. Repeated prefixes get discounted. Writing the cache costs MORE than fresh input, so it only pays off from the second run onward.
$/success
Total spend divided by tasks solved. The comparable figure — dollars, not tokens, because different providers count tokens differently.
harm
Runs that destroyed data or attempted a forbidden operation. Counts blocked attempts too: on a real API there would be no guard, so the attempt is the finding.
SCORE / composite
Every dimension rescaled 0-1, then weighted into one number. A decision aid, not evidence. It will always produce a ranking, including one made entirely of noise — which is why the winner is printed with whether its lead is larger than the MDE. Read the score to shortlist; read the interval before acting.
weights
How much each dimension counts toward the score. Default: success .35, abstention .15, harm .25, cost .15, time .10 — so safety (.40 combined) outweighs thrift (.25) and an arm cannot buy its way to the top by being cheap and dangerous. Override with --weights; they are always printed beside the table.
candidate arm
An arm eligible to win: a packaging you could actually ship. Z0 and Z1 are excluded. They anchor the scale rather than competing on it, and letting the ceiling arm into the range would squash every real arm into the bottom of the scale.
spread
How much a behavioural metric separated the arms. Decides which metrics get charted. Deliberately not a coefficient of variation: one arm at 0.15 against eight at zero would score huge and outrank a metric running 0 to 2.8 across four arms — that separated one arm, not the arms.
discovery overhead
Calls made before the first one that returned usable data. A discovery arm pays this by design; the question is whether it earns it back in fewer wasted calls later.
wasted calls
Responses whose content never reaches the final answer. Data fetched and then ignored. Every one filled the context window for nothing, and it is usually the clearest sign that a surface returns more than the task needs.
redundant calls
The identical request issued more than once in one run. The model is not retaining what it already fetched and is paying twice. High counts usually mean the response was too big to hold onto, not that the model was careless.
payload efficiency
Of everything the API returned, the share used in the answer. Low means responses are far larger than the task needs. Fixing it is an API change — sparser responses — not a packaging change.
argument validity
Share of calls the API accepted rather than rejecting as malformed. Low means the schema is not telling the model how to call it. This is the number a richer schema should move.
error recovery rate
Of the calls the API rejected, how many it then got right. The mechanism by which better error messages would beat shipping a skill: an error only helps if it says enough to act on.
hallucinated endpoints
Calls to operations that do not exist. The model invented them rather than reading the surface — evidence that discovery is failing, not that the model is careless.
peak context tokens
The largest the context window got during the run. What would have to fit if you pointed this packaging at a bigger problem. An arm near the limit here will break on a harder task.
turns to first productive call
How long before the model got anything useful out of the API. Measures how quickly a packaging becomes usable, which is not the same as how well it ends up performing.
95% CI
The range the true value plausibly sits in. A wide interval means too little data to say much. If it spans zero, the difference could just as easily be nothing.
MDE
Minimum detectable effect — the smallest gap this run could spot. With few tasks, only huge differences show up. A gap smaller than the MDE is not a finding, however suggestive the bar looks.
p value
Roughly: how easily chance alone could produce this gap. Below 0.05 is the usual bar. It says nothing about whether the difference is large enough to care about — that is the CI's job.
Holm correction
Adjusts p values for testing several things at once. Test six comparisons and one will look impressive by luck. This raises the bar so that does not happen.
confirmatory
A comparison declared BEFORE the run, in code. Only these can be called significant. Deciding what to test after seeing results is how noise becomes a headline.
exploratory
A comparison looked at afterwards. Reported and labelled, never called significant. It can suggest the next experiment; it cannot support a claim.
paired within core
Arms compared only on problems they both attempted. A hard problem drags every arm down, so comparing them on the same problems cancels that out.
refusing to pool
Results that must not be averaged together. Different model, different protocol version, or a hand-written vs generated skill — averaging those answers a question nobody asked.
unvalidated
The metric is computed, but not yet checked against ground truth. It describes what happened. It is not yet evidence of quality.
reference run
The first directory you passed. Every delta is measured against it. Swapping the order flips every sign. The reference is named in the header so a reader never has to guess which way a difference points.
Δ / delta
This run minus the reference, in the unit the difference is in. Rates become percentage points (pp), never a percentage of a percentage. An absent number is n/a, never zero — a blank that reads as zero is a claim nobody measured.
shared arm
An arm every compared run actually ran. Only shared arms enter the head-to-head. An arm two runs out of three have would leave a blank in a delta column, and a blank reads as a zero.
not compared
Arms missing from at least one run, shown standalone. They are excluded from every delta rather than shown with a blank cell. Their numbers are still reported — just not subtracted.
not recorded
This run's ledger cannot say what the parameter was. Not the same as equal. Two runs that both cannot say might still have differed, and reporting that as a match is the lie the sentinel exists to prevent. Common on ledgers written before a manifest field existed.
same world
Both runs were given the same generated tasks. Core ids are positional; core-000 in one world is a different problem from core-000 in another. Pairing across worlds would produce a tighter interval than the data supports — the most dangerous direction for an error to go.
unpaired comparison
A cross-run gap computed without pairing within core. The common case when two runs used different seeds, cores, or difficulty. Per-task difficulty no longer cancels, so the gap may be biased rather than merely noisy. Always labelled, never called significant.
cross-world delta
A difference across a pooling boundary — model, MCP revision, skill condition, or report class. The rates are real; their difference is not a finding. Marked ‡ and never called notable, however large the gap.
cross-run MDE
The smallest gap these two samples could resolve, in points. Larger than either run's own MDE: both measurements carry error and errors add (≈√(a²+b²)). An approximation, not a derivation from the power model, and labelled as one wherever it appears.
parameter diff
What differed in the setup before any result is shown. A delta table read without knowing the runs used different difficulty is worse than no table. Differs means two runs recorded different values; not recorded somewhere is uncertainty, not disagreement.
confidence interval
The range the true difference plausibly sits in. For unpaired cross-run gaps this is a Newcombe hybrid-score interval, not the textbook Wald form — Wald collapses at the edges and makes a 2-for-2 smoke arm look like a finding.