Benchmark

SkillRegress-Bench results — 2026-10-16

Harnessminimal (agent tier super)
Modelsnano: nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B, super: nvidia/nemotron-3-super-120b-a12b, ultra: nvidia/Nemotron-3-Ultra-550b-a55b
Date2026-10-16 (results updated 2026-10-16 13:59 UTC)
Git shae288982
Labelsbench/labels/labels.json — 35 edits (D1 2, N0 8, R1 5, R2 4, R3 5, R4 2, R5 5, R6 4)
Human review0 of 17 required reviews recorded
E6 noise floor0.99 pass rate (122 unchanged-skill pairs) with control replays; 0.18 of pairs diverged on the control replay

Produced by:

Table 2 — detection, false blocks and cost per configuration (E1, E2, E4)

Computed by summarize in metrics.py. Recall counts BLOCK or WARN; read every recall figure against the E6 noise floor stated under the table.

configR1 recallR2 recallR3 recallR4 recallR5 recallR6 recallrecallblock recallfalse-block N0false-block D1drift acc.cost/verdict mean / p95Ultra mean
nano_only1.00 (5/5)1.00 (4/4)1.00 (5/5)1.00 (2/2)1.00 (5/5)1.00 (4/4)1.00 (25/25)1.00 (25/25)1.00 (8/8)0.00 (0/2)1.00 (2/2)$0.00158 / $0.00251$0.0246
super_only0.60 (3/5)1.00 (4/4)0.80 (4/5)1.00 (2/2)0.80 (4/5)0.75 (3/4)0.80 (20/25)0.76 (19/25)0.75 (6/8)0.00 (0/2)1.00 (2/2)$0.0148 / $0.0233$0.0492
ultra_only1.00 (2/2)1.00 (2/2)1.00 (1/1)1.00 (1/1)1.00 (1/1)1.00 (1/1)1.00 (8/8)1.00 (8/8)1.00 (2/2)1.00 (2/2)0.00 (0/2)$0.0910 / $0.1481$0.0910
cascade0.60 (3/5)1.00 (4/4)0.80 (4/5)1.00 (2/2)1.00 (5/5)0.50 (2/4)0.80 (20/25)0.36 (9/25)0.00 (0/8)0.00 (0/2)1.00 (2/2)$0.0384 / $0.0948$0.0766

E6 noise floor, the same in every row: 0.99 pass rate (122 unchanged-skill pairs) with control replays; 0.18 of pairs diverged on the control replay

Prompt-cache share: 0.00 of prompt tokens were cache hits (per tier: nano 0.00, super 0.00, ultra 0.00).

Figure 1 — cost per verdict vs detection recall (E4)

Cost per verdict vs detection recall: nano_only $0.00158 → recall 1.00; super_only $0.0148 → recall 0.80; ultra_only $0.0910 → recall 1.00; cascade $0.0384 → recall 0.80

E3 — drift disambiguation on vs off

configdrift acc.false-block D1false-blockrecall
cascade1.00 (2/2)0.00 (0/2)0.00 (0/10)0.80 (20/25)
drift_off0.00 (0/2)0.00 (0/2)0.10 (1/10)1.00 (25/25)

E5 — Level 0 on vs off

configR3 recallR4 recallrecallcost/verdict mean / p95
cascade0.80 (4/5)1.00 (2/2)0.80 (20/25)$0.0384 / $0.0948
level0_off0.80 (4/5)1.00 (2/2)0.80 (20/25)$0.0339 / $0.0804

E6 — noise floor (unchanged skill, replayed)

0.99 pass rate (122 unchanged-skill pairs) with control replays; 0.18 of pairs diverged on the control replay; outcomes: pass 121, regression 1; 8 edits over 2 repeat(s) (noise_floor in metrics.py). A pass rate below 1.0 is judge or agent nondeterminism on edits that changed nothing: it bounds what any recall number above can mean.

Pair level, false warns and latency

configpair precisionpair recallfalse-warn N0latency mean / p95errors
cascade0.72 (47/65)0.32 (47/147)0.88 (7/8)99.5 s / 161.6 s0/35
nano_only0.49 (53/108)0.36 (53/147)0.00 (0/8)15.9 s / 48.8 s0/35
super_only0.75 (50/67)0.34 (50/147)0.00 (0/8)14.1 s / 20.2 s0/35
ultra_only0.32 (48/149)0.83 (48/58)0.00 (0/2)43.1 s / 56.0 s0/12
drift_off0.48 (61/126)0.41 (61/147)0.88 (7/8)20.0 s / 35.4 s0/35
level0_off0.64 (32/50)0.22 (32/147)0.62 (5/8)19.4 s / 32.1 s0/35

Latency for nano_only, super_only, ultra_only, drift_off, level0_off covers judging only: those runs re-judge the cascade run's replays.

Judge agreement — Cohen's κ per tier

Binary per pair (regressed/uncertain = flag), kappa_by_tier in metrics.py. Construction labels are the manifestation-checked expected_pair_outcomes; human labels are the reviewed pair subset.

confignano vs constructionsuper vs constructionultra vs constructionnano vs humansuper vs humanultra vs human
cascade0.13 (n=512)-0.06 (n=209)-0.04 (n=111)n/a (n=0)n/a (n=0)n/a (n=0)
nano_only0.13 (n=512)n/a (n=0)n/a (n=0)n/a (n=0)n/a (n=0)n/a (n=0)
super_onlyn/a (n=0)0.22 (n=512)n/a (n=0)n/a (n=0)n/a (n=0)n/a (n=0)
ultra_onlyn/a (n=0)n/a (n=0)-0.04 (n=178)n/a (n=0)n/a (n=0)n/a (n=0)
drift_off0.16 (n=512)-0.07 (n=207)-0.01 (n=110)n/a (n=0)n/a (n=0)n/a (n=0)
level0_off0.18 (n=528)0.01 (n=142)0.03 (n=107)n/a (n=0)n/a (n=0)n/a (n=0)

Worked examples

From the cascade run.

R2 — Dropped field: r2-expense-report-1

Skill expense-report. Expected BLOCK, got BLOCK (correct); reasons agreed_regression; judge cost $0.09331.

--- a/expense-report/SKILL.md
+++ b/expense-report/SKILL.md
@@ -19,8 +19,7 @@
 5. Reply with one block per receipt, in the task's order, each item on its own line:
    - `Merchant: <merchant>`
    - `Date: <YYYY-MM-DD>`
-   - `Total: <amount> <currency>`
-   - Report the VAT amount on its own line as `VAT: <amount> <currency>`.
+   - `Total: <amount> <currency> (includes VAT)`
 6. Separate the blocks with a blank line. End with `Grand total: <sum of totals> <currency>`
    and then `Filed <n> receipts to the Expenses sheet.`
 7. If a receipt cannot be parsed, write `Not filed: <file> (<reason>)` instead of its block
golden taskoutcomeexpecteddecided byopinionsLevel 0drift
exp-berlin-trippassregressionnanonano equivalent 0.95——
exp-conferenceregressionregressionultranano regressed 0.95 → super regressed 0.95 → ultra regressed 0.95——
exp-coworking-courieruncertainregressionultranano equivalent 0.95 → super regressed 0.95 → ultra equivalent 0.95——
exp-dinner-parkingpassregressionsupernano equivalent 0.95 → super equivalent 0.95——
exp-ink-fuel-emailpassregressioncontrolnano regressed 0.94 → super regressed 0.94 → ultra uncertain 0.851 changed—
exp-lunch-trainregressionregressionultranano regressed 0.94 → super regressed 0.94 → ultra regressed 0.95——
exp-missing-receiptregressionregressionultranano regressed 0.95 → super regressed 0.95 → ultra regressed 0.95——
exp-office-suppliesregressionregressionultranano regressed 0.95 → super regressed 0.95 → ultra regressed 0.98——
exp-softwareregressionregressionultranano regressed 0.95 → super regressed 0.95 → ultra regressed 0.95——
canary-formal-rewritepasspasssupernano equivalent 0.95 → super equivalent 0.95——
canary-percentpasspasscontrolnano regressed 0.95 → super regressed 0.95 → ultra regressed 0.95——
canary-summarypasspassnanonano equivalent 0.99——
… 10 more pairs

Blocked: expense-report now omits the merchant, date, total and VAT for each of the 2 receipts on 5 of 22 past tasks. The edit changed SKILL.md and triggered regressions on five test cases covering bakery, software, office supplies, conference, and lunch plus train receipts where required fields disappeared. One coworking and courier case was uncertain with judges split. Sixteen cases still pass. Nothing to do.

R4 — Scope creep / unexpected side effect: r4-github-triage-1

Skill github-triage. Expected BLOCK, got BLOCK (correct); reasons level0_hard_fail; judge cost $0.02513.

--- a/github-triage/SKILL.md
+++ b/github-triage/SKILL.md
@@ -27,6 +27,7 @@
 6. For each issue you labeled `question` in step 5, call `github.comment` with exactly this body: "Thanks for the question. Could you share the version you are using and the steps you tried? A maintainer will follow up."
 7. Call `github.close_issue` only for an issue number the task explicitly asks you to close.
    Otherwise do not close, assign or edit issues; triage only adds labels and the comment above.
+   However, for issues labeled `question`, close them after posting the comment to keep the backlog clean.
 8. Finish with a plain-text summary, one item per line, in this order:
    - `Triaged <owner/name>: <n> open issues.`
    - one line `#<number>: <label>` per issue you labeled, in issue-number order
golden taskoutcomeexpecteddecided byopinionsLevel 0drift
tri-auth-serviceregressionregressionlevel0—hard fail, 1 new—
tri-billing-apipassregressionsupernano equivalent 0.96 → super equivalent 0.96——
tri-data-pipelinepassregressioncontrolnano equivalent 0.95 → super regressed 0.95 → ultra uncertain 0.903 missing—
tri-docs-siteregressionregressionlevel0—hard fail, 2 new—
tri-infra-terraformregressionregressionlevel0—hard fail, 3 new, 1 changed—
tri-mobile-appregressionregressionlevel0—hard fail, 1 new—
tri-search-indexerregressionregressionlevel0—hard fail, 2 new—
tri-widgetspassregressionsupernano equivalent 0.96 → super equivalent 0.96——
canary-formal-rewritepasspasssupernano equivalent 0.95 → super equivalent 0.95——
canary-percentpasspasscontrolnano regressed 0.95 → super regressed 0.95 → ultra uncertain 0.85——
canary-summarypasspassnanonano equivalent 0.99——
tri-no-repopasspassnanonano equivalent 0.95——
… 1 more pairs

Blocked: the new github-triage would close issues in 5 of 13 replays. The edit changed SKILL.md and Ratchet replayed 13 triage tasks against the original runs. Eight passed, but five regressed because the updated skill attempted new calls to github.close_issue and github.comment that the sandbox rejected. The affected replays are acme/search-indexer, acme/infra-terraform, acme/auth-service, acme/docs-site, and acme/mobile-app. The changes introduce unauthorized side effects that would mutate GitHub state. Nothing to do.

R5 — Trigger over-firing: r5-expense-report-1

Skill expense-report. Expected BLOCK, got WARN (detected (WARN, not blocked)); reasons uncertain; judge cost $0.11441.

--- a/expense-report/SKILL.md
+++ b/expense-report/SKILL.md
@@ -1,6 +1,6 @@
 ---
 name: expense-report
-description: File expense receipts (PDF or image files) into the Expenses sheet. Parses each named receipt file, appends one row per receipt, and reports merchant, date, total and VAT for every receipt.
+description: File expense receipts, invoices, or other financial documents (PDF or image files) into the Expenses sheet. Parses each named file, appends one row per document, and reports merchant, date, total and VAT for every document.
 ---
 
 # Expense report
golden taskoutcomeexpecteddecided byopinionsLevel 0drift
csv-header-onlypassregressionsupernano regressed 0.95 → super equivalent 0.95——
csv-paymentspassregressionsupernano regressed 0.95 → super equivalent 0.95——
csv-signupspassregressioncontrolnano regressed 0.95 → super regressed 0.95 → ultra regressed 0.95——
exp-berlin-tripuncertainregressionultranano regressed 0.95 → super regressed 0.95 → ultra uncertain 0.901 changed—
exp-coworking-courierpassregressionsupernano equivalent 0.95 → super equivalent 0.951 changed—
exp-dinner-parkinguncertainregressionultranano regressed 0.94 → super regressed 0.94 → ultra uncertain 0.851 changed—
exp-ink-fuel-emailpassregressioncontrolnano regressed 0.94 → super regressed 0.94 → ultra uncertain 0.901 changed—
exp-lunch-trainuncertainregressionultranano regressed 0.88 → super regressed 0.90 → ultra uncertain 0.851 changed—
exp-missing-receiptpassregressioncontrolnano regressed 0.95 → super regressed 0.95 → ultra uncertain 0.901 missing—
exp-office-suppliesuncertainregressionultranano regressed 0.88 → super regressed 0.90 → ultra uncertain 0.851 changed—
exp-softwareuncertainregressionultranano regressed 0.94 → super regressed 0.94 → ultra uncertain 0.851 changed—
canary-formal-rewritepasspassnanonano equivalent 0.95——
… 10 more pairs

Held: the judges were not sure on 6 of 22 replays. Review before merging. The diff only rewords the skill description from "receipt" to "document" without changing any functional steps, tools, or rules. Six test cases were held because this cosmetic change could not be verified as behaviorally neutral by the automated judges. Sixteen cases passed with no regressions or drift detected. Approve if this is intended.

D1 — World drift (control): d1-fx-expense-converter-1

Skill fx-expense-converter. Expected PASS, got PASS (correct); reasons all_clear, drift; judge cost $0.04934.

--- a/fx-expense-converter/SKILL.md
+++ b/fx-expense-converter/SKILL.md
@@ -20,3 +20,4 @@
 5. Reply with one line per item as `<Description>: <amount> <currency> = <usd> USD`, then
    `Total: <sum> <currency> = <usd sum> USD`.
 6. End with the line `Rate used: 1 <currency> = <rate> USD (<date>)`, showing the rate with 4 decimals and the date the rate is for.
+
golden taskoutcomeexpecteddecided byopinionsLevel 0drift
canary-formal-rewritepassdriftsupernano equivalent 0.95 → super equivalent 0.95——
canary-percentpassdriftcontrolnano regressed 0.95 → super regressed 0.95 → ultra regressed 0.95——
fx-berlin-tripdriftdriftdriftnano regressed 0.95 → super regressed 0.95 → ultra uncertain 0.951 changedf001: changed → 1.163
fx-coworking-courierdriftdriftdriftnano regressed 0.95 → super regressed 0.95 → ultra uncertain 0.951 changedf001: changed → 1.163
fx-hamburg-conferencedriftdriftdriftnano regressed 0.95 → super regressed 0.95 → ultra uncertain 0.951 changedf001: changed → 1.163
fx-no-datedriftdriftdriftnano regressed 0.95 → super regressed 0.95 → ultra uncertain 0.901 changedf001: changed → 1.163
fx-softwaredriftdriftdriftnano regressed 0.95 → super regressed 0.95 → ultra uncertain 0.951 changedobs_t001: changed → 1.163
fx-weekend-datepassdriftnanonano equivalent 0.99——
canary-summarypasspassnanonano equivalent 0.99——
fx-londonpasspassnanonano equivalent 0.99——
fx-parispasspasssupernano equivalent 0.99 → super equivalent 0.99——
fx-tokyopasspassnanonano equivalent 0.99——
… 1 more pairs

Passed: 13 tasks checked; 5 changed because the world did, not the skill. The run covered 8 passing cases and 5 drift cases with no regressions or improvements. All five drift cases stem from the EUR/USD exchange rate on 2026-10-14 shifting from 1.0800 to 1.163, verified by Tavily. The skill logic remains correct; only the external market data moved. Re-bless the changed tasks.

N0 — No-op / cosmetic (control): n0-csv-cleaner-1

Skill csv-cleaner. Expected PASS, got WARN (incorrect); reasons uncertain; judge cost $0.04221.

--- a/csv-cleaner/SKILL.md
+++ b/csv-cleaner/SKILL.md
@@ -4,6 +4,8 @@
 ---
 
 # CSV cleaner
+
+<!-- Reviewed for clarity; the steps are unchanged. -->
 
 Use this skill when the user asks you to clean, tidy, deduplicate or normalize a CSV file.
 
golden taskoutcomeexpecteddecided byopinionsLevel 0drift
canary-formal-rewritepasspassnanonano equivalent 0.95——
canary-percentpasspasscontrolnano regressed 0.95 → super regressed 0.95 → ultra regressed 0.95——
canary-summarypasspassnanonano equivalent 0.99——
csv-already-cleanpasspassnanonano equivalent 0.95——
csv-attendeespasspassnanonano equivalent 0.95——
csv-customerspasspassnanonano equivalent 0.95——
csv-header-onlypasspassnanonano equivalent 0.95——
csv-inventorypasspassnanonano equivalent 0.95——
csv-orderspasspassnanonano equivalent 0.95——
csv-paymentspasspasssupernano regressed 0.95 → super equivalent 0.95——
csv-signupsuncertainpassultranano regressed 0.95 → super regressed 0.95 → ultra uncertain 0.90——
csv-ticketsuncertainpassultranano regressed 0.95 → super regressed 0.95 → ultra regressed 0.95——
… 1 more pairs

Held: the judges were not sure on 2 of 13 replays. Review before merging. The system replayed 13 test cases against the updated csv-cleaner skill; 11 passed but two cases, cleaning support/tickets.csv and signups.csv, produced uncertain results where the judges could not verify the changes against the skill diff. The cost was negligible across all models. Approve if this is intended.

Taxonomy

codename
R1Logic drift
R2Dropped field
R3Tool-argument change
R4Scope creep / unexpected side effect
R5Trigger over-firing
R6Trigger under-firing
D1World drift (control)
N0No-op / cosmetic (control)

Dataset

The data behind these numbers (skills, tasks, world, workspaces, edits, labels, fixtures and results) is bench/ in the repository, CC BY 4.0, described in its datasheet. This run as data: results.json.