← All benchmarks

Bug-fix benchmark · 24 real bugs · 10 languages

Same model. Four harnesses.

Twenty-four real bugs from real open-source repositories — Go, Rust, C, C++, C#, Java, Python, Ruby, JavaScript, TypeScript. Every comparison here holds the model constant: Benzi, Claude Code and OpenCode all run Claude Sonnet 5; Benzi and DeepSeek's own harness both run DeepSeek v4-flash. Same issue text, same fresh checkout, same test suite. The only thing that changes is the harness driving the model.

Benzi>>Claude Code >DeepSeek Harness >>>>OpenCode

How that order is settled. Accuracy first, speed only as the tiebreak. Benzi, Claude Code and DeepSeek Harness each fixed 23 of the bugs they attempted; OpenCode fixed 6. Among the three that tie on accuracy, Benzi is 41% faster than Claude Code on the identical model, and Claude Code is in turn 16% faster than DeepSeek Harness in 24% fewer model calls — that last pair is the one ranking on this page where the two arms are not on the same model, so read it as harness-plus-model, not as a clean harness result.

Check the working. Every task's verbatim prompt, the upstream repository and the real commit that fixed each bug, and all 578 runs ever recorded — failures, superseded runs and the bugs we lose included — are on the full record.

VS Code Marketplace GitHub See every run

OpenCode is not in the race

It solved 6 of 24. On thirteen more it was still going when we stopped it, having already spent between 2.4× and 14.2× what Benzi needed to finish the same bug.

6 of 24
bugs solved
2.7× slower
than Benzi — on the six it solved
2.4× more
model calls than Benzi, same six
0 wins
it was never the fastest, on any bug

Those numbers are its best showing — measured only on the six bugs it actually fixed. Four more it finished with the wrong answer. Thirteen it never finished at all. Nothing here is an average dragged down by the failures; they are excluded entirely.

the six OpenCode solved
bugBenziClaude CodeOpenCodevs Benzivs Claude Code
mux44s / 5t61s / 8t346s / 51t7.8× slower5.7× slower
commons-cli84s / 14t67s / 9t137s / 24t1.6× slower2.0× slower
cJSON87s / 12t75s / 17t216s / 18t2.5× slower2.9× slower
dayjs91s / 11t164s / 17t222s / 31t2.5× slower1.4× slower
marked272s / 49t814s / 47t919s / 123t3.4× slower1.1× slower
scrapy358s / 31t400s / 40t685s / 40t1.9× slower1.7× slower
total937s / 122t1582s / 138t2526s / 287t2.7× slower1.6× slower

Benzi's KPI (Key Performance Indicator) — source lines read

Every harness opens more source as bugs get harder. The question is the slope. Each point is one bug; the 24 are laid out easiest to hardest, left to right.

Difficulty is Claude Code's turn count on that bug — a third-party yardstick, so no harness sets its own position on the axis. Lines read counts only what came back from file-read calls; grep and shell output are search, not reading. The figure beside each line is its slope: how many extra lines that harness opens per step of difficulty. Hover any point for the bug and its count.

source lines read · 24 bugs · lowest of the four marked
bug Benzi
Sonnet
Benzi
DeepSeek
Claude Code
Sonnet
DeepSeek Harness
DeepSeek
mux64643831,372
commons-cli39235456771
addressable1802402001,603
jsoup6117060616
yaml-cpp120383194461
cJSON17187105854
dayjs64336307610
gson7815880516
CsvHelper42390335805
semver3534685631,857
hashie153172300458
money6815726611,892
rich2555147361,421
fmt6043152641,097
sqlglot227115800777
scrapy3861,5801,2592,127
marked9058072,1674,091
http-parser4491,2011,2702,635
zod8411,4761,9563,608
quartznet4881,7071,8974,197
sqlparser6201,0071,2252,334
nlohmann/json3799291,7645,201
ts-pattern1,1301,2321,1391,910
nats-server9892,1492,5832,385
all 249,12516,40720,70443,598

Lines read counts only what came back from file-read calls; grep and shell output are search, not reading. The green figure in each row is the lowest of the four.

The same 24 bugs in the same order, with wall clock in place of lines read.

Wall clock is raw here — unlike the tables above, Benzi's per-repo index build is not subtracted, so these seconds run slightly higher than the warm figures quoted elsewhere on this page. Each point is that harness's most recent solved run for that bug; unsolved and unfinished runs are left out rather than plotted as fast. Benzi on Sonnet never solved http-parser and the DeepSeek harness never ran nats-server, so those two points are absent and neither enters its fit.

And the same again with dollars on the vertical axis.

Priced at the published per-token rates, same run selection as the chart above it. The two DeepSeek series run an order of magnitude cheaper than the two Sonnet ones, so at this scale they sit close to the baseline — the per-bug figures behind them are in the DeepSeek table further down. What the axis does show is the slope: Claude Code's cost climbs with difficulty faster than any other series here.

cost per fix · USD at list price · lowest of the four marked
bug Benzi
Sonnet
Benzi
DeepSeek
Claude Code
Sonnet
DeepSeek Harness
DeepSeek
mux$0.39$0.036$0.25$0.023
commons-cli$0.26$0.030$0.29$0.014
addressable$0.57$0.043$0.35$0.042
jsoup$0.23$0.025$0.30$0.051
yaml-cpp$0.25$0.068$0.37$0.024
cJSON$0.27$0.036$0.44$0.073
dayjs$0.21$0.038$0.55$0.040
gson$0.19$0.015$0.45$0.022
CsvHelper$0.25$0.038$0.58$0.042
semver$0.62$0.10$1.43$0.097
hashie$0.69$0.051$0.92$0.043
money$0.79$0.036$0.95$0.052
rich$0.33$0.11$1.30$0.053
fmt$0.54$0.14$1.12$0.071
sqlglot$0.62$0.033$1.23$0.059
scrapy$0.73$0.10$1.35$0.19
marked$1.08$0.20$3.59$0.13
http-parser$0.36$3.44$0.23
zod$1.53$0.13$2.47$0.33
quartznet$0.95$0.23$3.99$0.31
sqlparser$0.72$0.14$3.22$0.33
nlohmann/json$1.03$0.17$3.68$0.44
ts-pattern$3.74$0.31$4.33$0.053
nats-server$1.99$0.23$2.94
all 24$17.96$2.66$39.54$2.70

Priced at published per-token rates. The green figure in each row is the lowest of the four; the two DeepSeek columns are cheaper largely because that model costs roughly twenty times less per token. Blank cells are the two runs that never produced a fix.

Benzi vs Claude Code

This is the real comparison — two harnesses that both finish the job, on the same model. Benzi solves the same bugs in less time, for less money, having read less than half as much of the codebase.

41%
faster
2.0× cheaper
same model, same bugs
2.2× less
source code read
16 / 22
bugs fixed faster

Reading less is the mechanism, not a side effect. Claude Code opens 99 lines per read and takes big grabs; Benzi opens 43, because Benzi's Code Intelligence already knows which lines matter. Across the 22 timed bugs that is 16,851 lines against 7,525 — from almost exactly the same number of reads (171 against 174). Benzi does not look in fewer places. It looks in the same number of places and opens less of each one.

Every bug, both arms

Wall-clock and model calls per bug. Green means Benzi was faster.

Claude Sonnet 5 · 24 bugs
bugBenziClaude CodeOpenCodeBenzi waslines read
CC → Benzi
muxgo44s / 5t61s / 8t346s / 51t27% faster383 → 64
addressableruby66s / 13t56s / 10twrong answer18% slower200 → 180
yaml-cppc++69s / 15t92s / 11tunfinished24% faster194 → 120
hashieruby82s / 15t200s / 27tunfinished59% faster300 → 153
moneyruby84s / 24t140s / 30twrong answer40% faster661 → 681
commons-clijava84s / 14t67s / 9t137s / 24t25% slower456 → 39
cJSONc87s / 12t75s / 17t216s / 18t16% slower105 → 17
dayjsjs91s / 11t164s / 17t222s / 31t45% faster307 → 64
gsonjava93s / 6t134s / 18tunfinished30% faster80 → 38
CsvHelperc#95s / 15t105s / 20tunfinished9% faster335 → 42
jsoupjava99s / 14t80s / 10tunfinished23% slower60 → 50
richpython115s / 20t302s / 36tunfinished62% faster736 → 255
semverrust138s / 19t441s / 23tunfinished69% faster563 → 353
nlohmann/jsonc++185s / 33t504s / 84tunfinished63% faster1,764 → 379
fmtc++216s / 30t199s / 37tunfinished9% slower264 → 604
markedjs272s / 49t814s / 47t919s / 123t67% faster2,167 → 905
zodts292s / 53t438s / 58twrong answer33% faster1,956 → 731
quartznetc#321s / 29t560s / 61tunfinished43% faster1,897 → 488
scrapypython358s / 31t400s / 40t685s / 40t10% faster1,259 → 385
sqlparserrust376s / 33t1076s / 61tunfinished65% faster1,225 → 620
sqlglotpython479s / 23t310s / 39tunfinished54% slower800 → 227
ts-patternts647s / 83t1060s / 84twrong answer39% faster1,139 → 1,130
http-parsercnot solvedsolvedunfinished
nats-servergosolvednot solvednot run
22 timed bugs4294s / 547t7279s / 747t41% faster16,851 → 7,525

Two bugs carry no timing, for opposite reasons. http-parser resists both harnesses: across every run recorded, Claude Code fixes it 1 time in 4 and Benzi 0 in 4 on this model, so a single result there measures luck rather than speed — it is counted as a loss for Benzi. nats-server is the reverse: Benzi has solved it 4 times in 5 attempts and Claude Code 2 in 4, and on this run Benzi fixed it while Claude Code did not. A stopwatch cannot compare a fix against a run that never produced one, so it is reported as a solve rate and kept out of the average — which costs Benzi the win rather than banking it.

Against DeepSeek's own harness

DeepSeek shipped its own agent harness on 13 August 2026. It defaults to deepseek-v4-flash — the same model Benzi runs here — so the model is held constant and the harness is the only thing that differs. Run interleaved, one bug at a time, both arms back to back.

6%
faster, same model
24%
fewer model calls
2.9× less
source code read
23 / 23
solved, and so did they
DeepSeek v4-flash · 23 bugs · same model both sides
bugBenziDeepSeek HarnessBenzi was lines read
DSH → Benzi
muxgo89s / 12t75s / 13t1.2× slower1,372 → 64
moneyruby95s / 13t158s / 20t1.7× faster1,892 → 572
gsonjava114s / 11t99s / 20t1.2× slower516 → 158
hashieruby118s / 17t168s / 28t1.4× faster458 → 172
cJSONc119s / 22t268s / 41t2.3× faster854 → 187
addressableruby125s / 11t162s / 25t1.3× faster1,603 → 240
commons-clijava140s / 22t65s / 14t2.1× slower771 → 235
CsvHelperc#169s / 18t207s / 25t1.2× faster805 → 390
yaml-cppc++212s / 36t154s / 16t1.4× slower461 → 383
jsoupjava232s / 16t273s / 34t1.2× faster616 → 170
dayjsjs233s / 16t153s / 24t1.5× slower610 → 336
sqlglotpython268s / 21t265s / 37t1% slower777 → 115
richpython313s / 62t187s / 40t1.7× slower1,421 → 514
scrapypython428s / 33t689s / 84t1.6× faster2,127 → 1,580
semverrust436s / 19t322s / 33t1.4× slower1,857 → 468
fmtc++473s / 50t335s / 54t1.4× slower1,097 → 315
nlohmann/jsonc++494s / 52t1659s / 124t3.4× faster5,201 → 929
markedjs533s / 74t305s / 38t1.7× slower4,091 → 807
quartznetc#551s / 61t656s / 90t1.2× faster4,197 → 1,707
zodts583s / 49t715s / 98t1.2× faster3,608 → 1,476
ts-patternts767s / 70t225s / 26t3.4× slower1,910 → 1,232
http-parserc1000s / 65t598s / 79t1.7× slower2,635 → 1,201
sqlparserrust1471s / 54t1731s / 90t1.2× faster2,334 → 1,007
23 timed bugs8964s / 804t9470s / 1053t6% faster41,213 → 14,258

This is the closest race on the page, and the honest summary is a tie on the thing that matters: both harnesses fixed all 23. Six percent on wall-clock is inside the noise — Benzi wins 11 bugs and loses 12. What is not close is how much source each opened to get there: 41,213 lines against 14,258, and DeepSeek Harness read more on every single bug. A 24th bug, nats-server, is excluded because neither arm produced a result — Benzi failed it, and the harness run died in cleanup before it could be graded. Benzi's wall-clock here is warm; the per-run index build is subtracted, though at 168s across 23 bugs it barely moves the number (cold, Benzi is still 4% ahead). DeepSeek Harness was v0.1.0-rc.6, released the day these ran.

Benzi DeepSeek vs OpenCode DeepSeek

On DeepSeek v4-flash — a model roughly twenty times cheaper — OpenCode holds up far better than it does on Sonnet: it finishes nine of these ten instead of six of twenty-four. It still ships a fix that fails the tests, and it is still slower, still more model calls, still more expensive, still reads more of the codebase to get there.

2.8×
faster than OpenCode
3.2×
fewer model calls
2.3× cheaper
same model both sides
6.5× less
source code read
10 / 10
solved, vs OpenCode's 9
DeepSeek v4-flash · 10 bugs · same model both sides
bugBenziOpenCodeBenzi is lines read
OpenCode → Benzi
mux57s / 10t323s / 60t5.7× faster3407 → 109
addressable72s / 6t175s / 42t2.4× faster1696 → 166
yaml-cpp118s / 24t295s / 33t2.5× faster1751 → 190
jsoup140s / 14t634s / 127t4.5× faster1049 → 163
commons-cli76s / 15t359s / 56t4.7× faster2563 → 23
money157s / 16t93s / 29t — wrongsolved it652 → 222
CsvHelper101s / 16t245s / 41t2.4× faster701 → 355
cJSON125s / 23t179s / 43t1.4× faster1137 → 570
gson143s / 15t160s / 26t1.1× faster1137 → 355
dayjs267s / 22t664s / 43t2.5× faster1176 → 331
the 9 both solved1099s / 145t3033s / 471t2.8× faster14,617 → 2,262

The reading gap is even wider here: across the nine both harnesses solved, OpenCode pulled 14,617 lines of source and Benzi 2,262. Same model, same bugs — one of them reads the codebase to find the answer, the other looks it up.

Totals cover the nine bugs OpenCode actually fixed. On the tenth, money, it stopped after 93 seconds with the bug still there — averaging that in would credit it for a fast give-up and understate Benzi (2.5× instead of 2.8×). The same rule removes nats-server from the Sonnet table above, where Claude Code failed and Benzi did not, and it is why http-parser counts as a loss for Benzi: a run that never fixed the bug cannot tell you how long fixing it takes.

Why that counts as a loss. money is graded against OpenCode even though it was the quickest run in the row, because the suite still fails afterwards and this benchmark settles order on correctness first, with speed only as the tiebreak. The same ordering is why OpenCode's slow runs are not left to run out: once one passes twice the slower of the other two arms on the same bug it is stopped and recorded as unfinished — not a failure, but not a completion either, and kept out of every average. A harness that is behind on accuracy and on time, model calls and cost at once has already answered the question the run was asking.

The tasks, with their prompts

The exact text handed to every agent, unedited.

mux go

task id mux_hostport_vars repo gorilla/mux fix commit 98cb6bf42e buggy parent 948bec34b5
files the real fix touched regexp.go
graded on TestHostMatcher regression suite
solved Benzi 26/30 · Claude Code 8/8 · Codex CLI 4/8 · OpenCode 3/3 · Aider 2/2 · DeepSeek Harness 1/1
gorilla/mux's Host() route matcher lets you omit the port from a host pattern (e.g. Host("{subdomain}.example.com")), and such a route should still match requests whose Host header includes a port, ignoring the port entirely. Route matching itself already does this correctly. But when a route matches and mux extracts the named variables from the host into the request's variables map, it does not ignore the port the same way -- so for a wildcard-port host pattern, the extracted variables are wrong or missing whenever the incoming request's Host header includes a port. Fix variable extraction so it treats the port the same way route matching does, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

commons-cli java

task id commonscli_npe repo apache/commons-cli fix commit 57c08d0d16 buggy parent 4384414639
files the real fix touched src/main/java/org/apache/commons/cli/CommandLine.java
graded on BugsTest regression suite
solved Benzi 22/22 · Claude Code 7/7 · OpenCode 2/2 · Codex CLI 2/2 · DeepSeek Harness 2/2
commons-cli throws a NullPointerException when an option name of null is passed to CommandLine's option lookup. For example `commandLine.getOptionValue((String) null, "default")` should return the supplied default ("default"), and `commandLine.getOptionValue((String) null, null)` should return null -- but instead a null option name blows up with an NPE while resolving the option. Make a null option name resolve to no option (returning null / the default) rather than throwing, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

addressable ruby

task id addressable_template_nonstring repo sporkmonger/addressable fix commit c00d58b084 buggy parent bcaf766b0a
files the real fix touched lib/addressable/template.rb
graded on spec/addressable/template_spec.rb regression suite
solved Benzi 23/23 · Claude Code 7/7 · Codex CLI 3/3 · OpenCode 1/2 · DeepSeek Harness 1/1
Addressable::Template#expand crashes with a NoMethodError ("undefined method 'to_str' for an instance of Symbol") when expanding an RFC 6570 URI template with a composite (Hash or Array) variable whose leaf values aren't strings -- for example a Hash key that's a Symbol, or an Array of Integers. Fix template expansion so non-string leaf values in composite variables are stringified correctly instead of crashing, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

jsoup java

task id jsoup_negative_nth_child repo jhy/jsoup fix commit 62674f903b buggy parent d5acae96d5
files the real fix touched src/main/java/org/jsoup/select/QueryParser.java, CHANGES.md
graded on SelectorTest regression suite
solved Benzi 19/19 · Claude Code 4/4 · Codex CLI 2/3 · OpenCode 1/2 · DeepSeek Harness 1/1
jsoup's CSS selector engine mis-parses an :nth-child argument whose step has a minus sign but no digit, such as ":nth-child(-n+2)". The leading minus is dropped, so the step is treated as +1 rather than -1 and the selector matches the wrong elements. Parsing the document "<p>1</p> <p>2</p> <p>3</p> <p>4</p>", the query "p:nth-child(-n+2)" should select exactly the first two paragraphs (own text "1" and "2"), which is what the equivalent explicit-digit form "p:nth-child(-1n+2)" already returns -- but the digit-less form returns more elements than that. Consequently a combined query like "p:nth-child(n+2):nth-child(-n+2)", which should narrow to just "2", is also wrong. The same argument parsing is shared by :nth-last-child, :nth-of-type and :nth-last-of-type, so those are affected too. All the other argument forms must keep working exactly as they do now: the positive digit-less step "p:nth-child(n+2)" (selecting "2", "3", "4"), explicit-digit steps such as "p:nth-child(2n+2)" (selecting "2", "4") and "p:nth-child(-1n+2)", plain numeric offsets, the "odd" and "even" keywords, and the SelectorParseException raised for genuinely unparseable arguments. Please fix it and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

yaml-cpp c++

task id yamlcpp_base64 repo jbeder/yaml-cpp fix commit 80ea0028c7 buggy parent 2e6383d272
files the real fix touched src/binary.cpp
graded on yaml-cpp-tests regression suite yaml-cpp-tests
solved Benzi 16/18 · Claude Code 7/7 · Codex CLI 2/2 · OpenCode 1/1 · DeepSeek Harness 1/1
yaml-cpp's base64 decoder (YAML::DecodeBase64) does not reject malformed input. A base64 string whose length is not a valid multiple (i.e. truncated -- leftover characters that don't complete a 4-character group) should be treated as invalid and decode to an EMPTY result, but instead it silently decodes the partial input and returns garbage bytes. Make DecodeBase64 return an empty vector when the input is truncated / has an invalid number of base64 characters, and keep valid base64 decoding correct. Keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

cJSON c

task id cjson_null_deref repo DaveGamble/cJSON fix commit b2890c8d76 buggy parent a3f3d6c784
files the real fix touched cJSON.c
graded on misc_tests regression suite misc_tests
solved Benzi 17/18 · Claude Code 5/5 · OpenCode 2/2 · Codex CLI 1/2 · DeepSeek Harness 1/1
cJSON_SetNumberHelper(object, number) dereferences `object` immediately without checking for NULL first, so calling it with a NULL object pointer crashes instead of failing gracefully. It should check for a NULL object at entry and return NAN in that case, consistent with how other cJSON setter functions handle NULL. Fix it and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

dayjs js

task id dayjs_duration_round repo iamkun/dayjs fix commit a9d7d0398d buggy parent 5f3f8786c7
files the real fix touched src/plugin/duration/index.js
graded on test/plugin/duration.test.js regression suite test/plugin/duration.test.js
solved Benzi 18/18 · Claude Code 6/6 · OpenCode 2/2 · Codex CLI 2/2 · DeepSeek Harness 1/1
dayjs's duration formatting produces sub-second values polluted with floating-point noise. For example dayjs.duration(-2812).toISOString() returns '-PT2.8120000000000003S' instead of '-PT2.812S', and dayjs.duration(3121632.27382247).toISOString() returns 'PT52M1.6320000000000001S' instead of 'PT52M1.632S'. The sub-second component of the ISO string is not rounded to millisecond precision. Fix the duration ISO serialization so sub-second values are rounded to at most millisecond precision, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

gson java

task id gson_duplicate_key_null repo google/gson fix commit f4d371d29c buggy parent 27d9ba1eee
files the real fix touched gson/src/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java
graded on MapTest,MapAsArrayTypeAdapterTest regression suite MapTest,MapAsArrayTypeAdapterTest
solved Benzi 22/22 · Claude Code 5/5 · Codex CLI 2/2 · OpenCode 1/1 · DeepSeek Harness 1/1
Gson's Map deserializer detects duplicate JSON object keys by checking whether Map.put(key, value) returns a non-null previous value -- but put() legitimately returns null when the key's FIRST occurrence had a null value, so {"a":null,"a":1} silently deserializes to {a=1} instead of throwing JsonSyntaxException. Fix the duplicate-key check (at both the plain-object call site and the enableComplexMapKeySerialization array-of-entries call site) so it correctly detects a repeated key regardless of the first value, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

CsvHelper c#

task id csvhelper_nullable repo JoshClose/CsvHelper fix commit 9a7f093463 buggy parent 8599e80f2a
files the real fix touched src/CsvHelper/TypeConversion/TypeConverter.cs
graded on FullyQualifiedName~TypeConverter1Tests regression suite FullyQualifiedName~TypeConverter1Tests
solved Benzi 21/21 · Claude Code 5/5 · Codex CLI 2/2 · OpenCode 1/1 · DeepSeek Harness 1/1
A custom type converter that derives from CsvHelper's generic TypeConverter<T> base, where T is a nullable value type (for example a converter for bool?), throws System.InvalidCastException when it is asked to convert a null value to a string. Writing a null nullable value should serialize normally to an empty string, not blow up. Fix the generic converter so converting a null of a nullable type to string works, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

semver rust

task id semver_prerelease repo dtolnay/semver fix commit 5742fc2f58 buggy parent 5742fc2f58
files the real fix touched src/eval.rs
graded on regression suite
solved Benzi 7/10 · Claude Code 3/3 · Codex CLI 2/2 · DeepSeek Harness 1/1
semver's VersionReq matching wrongly accepts a prerelease of an excluded upper bound. For example the requirement `>=1.2.0-0, <1.2` should NOT match the version `1.2.0-alpha.1`: the `<1.2` bound excludes every 1.2.0 release, and that must include 1.2.0's prereleases -- but it is currently reported as matching. More generally, a `<I.J` bound must not match `I.J.0` prereleases. Fix the version-requirement matching so a `<` (and `<=`) bound correctly excludes prereleases of its boundary, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

hashie ruby

task id hashie_deep_merge_dup repo hashie/hashie fix commit 4f014e7fed buggy parent 641bafcb44
files the real fix touched lib/hashie/extensions/deep_merge.rb, lib/hashie/utils.rb
graded on spec/hashie/extensions/deep_merge_spec.rb regression suite spec/hashie/extensions/deep_merge_spec.rb
solved Benzi 8/8 · Claude Code 3/3 · Codex CLI 2/2 · DeepSeek Harness 1/1
Hashie::Extensions::DeepMerge#deep_merge uses a shallow dup before merging, so nested hash values inside the receiver are still shared references with the original -- mutating the 'merged' result silently corrupts the original hash's nested structures too. Fix deep_merge so it produces a true deep copy (nested hashes included) without raising on Ruby values that can't be dup'd (Symbol, true/false, nil, Integer, Rational, Complex, Method, ...), and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

money ruby

task id money_divide_by_zero repo RubyMoney/money fix commit f8582eb85c buggy parent b751843df2
files the real fix touched lib/money/money/arithmetic.rb, CHANGELOG.md
graded on spec/money/arithmetic_spec.rb regression suite
solved Benzi 16/20 · Codex CLI 3/7 · Claude Code 4/4 · OpenCode 0/2 · DeepSeek Harness 1/1
Money's division and divmod operations don't guard against a zero divisor, so dividing by zero produces nonsense instead of failing cleanly. Money.new(100, 'USD') / Money.new(0, 'USD') raises nothing at all and yields an infinite amount; Money.new(100, 'USD') / 0 (and / 0.0, / BigDecimal('0')) blows up with an unrelated "ArgumentError: must be initialized with a finite value" thrown from deep inside Money's own constructor; and Money.new(100, 'USD').divmod(Money.new(0, 'USD')) / Money.new(100, 'USD').divmod(0) leak BigDecimal's low-level "divided by 0" error instead of anything meaningful about money. All of these should fail fast with a ZeroDivisionError raised by Money itself: the message must be "divided by Money(0)" when the divisor is a zero-valued Money, and "divided by zero" when the divisor is a plain numeric zero (Integer, Float or BigDecimal). Division and modulo by non-zero values must behave exactly as before. Please fix it and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

rich python

task id rich_softwrap_style_newline repo Textualize/rich fix commit 39ee57dfe7 buggy parent 05ff970926
files the real fix touched rich/console.py
graded on tests/test_text.py::test_soft_wrap_styled regression suite tests
solved Benzi 6/6 · Claude Code 2/2 · Codex CLI 2/2 · DeepSeek Harness 1/1
When Console.print() is given a style AND soft_wrap=True, the style is wrongly applied to the line break itself, so the background colour bleeds past the end of the printed text instead of being reset at the end of the line. For example, with `console = Console(color_system="standard", width=80, force_terminal=True)` then `console.print("soft wrap is on", style="blue on white", soft_wrap=True)` followed by `console.print("Next line")` emits '\x1b[34;47msoft wrap is on\x1b[0m\x1b[34;47m\n\x1b[0mNext line\n' -- the styling sequence is re-opened around the newline and only reset afterwards. The expected output is '\x1b[34;47msoft wrap is on\x1b[0m\nNext line\n': the style must be closed BEFORE the newline, so soft-wrapped styled output does not paint the newline or leak its background into what follows. Note that the non-soft-wrap path already gets this right; only the soft-wrap path is affected. Fix it and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

fmt c++

task id fmt_4839 repo fmtlib/fmt fix commit 7852fc384c buggy parent d45179c1e7
files the real fix touched include/fmt/format.h
graded on format-test regression suite format-test
solved Benzi 15/18 · Claude Code 6/7 · Codex CLI 2/2 · DeepSeek Harness 1/1
fmt mishandles out-of-range integers formatted with the 'c' presentation type. `fmt::format("{:c}", 256)`, a negative value like `fmt::format("{:c}", -1)`, and other values outside a single character's range are silently mistranslated instead of being rejected. The 'c' type treats character values as unsigned, so the representable range is [0, 255]; anything outside it (negative, or > 255) should raise a clear "character value out of range" error, while in-range values (e.g. 200, 255) must still format to the corresponding character. Please fix it and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

sqlglot python

task id sqlglot_7920 repo tobymao/sqlglot fix commit c368c5eb2d buggy parent c4020942
files the real fix touched sqlglot/generators/duckdb.py
graded on tests/dialects/test_bigquery.py regression suite tests/dialects
solved Benzi 14/17 · Codex CLI 2/5 · Claude Code 4/4 · DeepSeek Harness 1/1
Transpiling BigQuery's ARRAY_CONCAT_AGG to DuckDB produces wrong SQL when the aggregate has an ORDER BY or a LIMIT inside it. For example `SELECT ARRAY_CONCAT_AGG(arr ORDER BY y) FROM ...` and `SELECT ARRAY_CONCAT_AGG(arr LIMIT 2) FROM ...` do not round-trip correctly to the duckdb dialect. LIMIT inside ARRAY_CONCAT_AGG has no DuckDB equivalent and should be reported as unsupported rather than silently mistranslated. Please fix the transpilation and make sure the existing test suite still passes. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

scrapy python

task id scrapy_proxy_auth_leak repo scrapy/scrapy fix commit fada8be1db buggy parent b7824db573
files the real fix touched scrapy/core/downloader/handlers/_base_streaming.py, scrapy/core/downloader/handlers/_httpx.py
graded on tests/test_downloader_handler_httpx.py::TestMitmProxy::test_proxy_redirect regression suite tests/test_downloader_handler_httpx.py::TestMitmProxy
solved Benzi 10/14 · Claude Code 4/4 · Codex CLI 2/2 · OpenCode 1/1 · DeepSeek Harness 1/1
BaseStreamingDownloadHandler extracts proxy credentials from the request by popping the Proxy-Authorization header off of request.headers, which mutates the shared Request object in place. When a request is redirected, Scrapy builds the new request from the original's headers -- but the header is already gone by then, so the redirected request goes out through the proxy with no Proxy-Authorization at all and the proxy rejects it. Fix proxy credential extraction so it reads the header without mutating the request, while still making sure Proxy-Authorization is never forwarded to the destination server itself, and keep the existing proxy test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

marked js

task id marked_lexer_linebreaks repo markedjs/marked fix commit a9696e2898 buggy parent 6aacd133e4
files the real fix touched src/Lexer.js, src/Tokenizer.js
graded on test/unit/Lexer-spec.js test/unit/marked-spec.js regression suite test/unit/Lexer-spec.js test/unit/marked-spec.js
solved Benzi 7/7 · Claude Code 4/4 · OpenCode 1/1 · DeepSeek Harness 1/1
Markdown lists are sometimes misclassified as 'loose' (rendering with <p> tags inside <li>) when they shouldn't be, and single trailing newlines inside tokens are silently dropped instead of being retained in the token stream. The Lexer's line-accumulation logic and the Tokenizer's list-parsing logic each track newlines independently and disagree about how many consecutive line breaks should mark a list as loose vs. tight. Trace how the Lexer accumulates raw text between tokens and how the Tokenizer counts line breaks per list item, then fix both so a single newline is preserved but only multiple consecutive line breaks trigger loose-list formatting, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

http-parser c

task id httpparser_line_folding repo nodejs/http-parser fix commit 76f0f1690f buggy parent 5d9c382172
files the real fix touched http_parser.c
graded on regression suite
solved Benzi 3/8 · Claude Code 1/4 · DeepSeek Harness 1/1
The HTTP header-value parser mishandles a header whose value is empty on the field's own line and only appears on an RFC-2616 line-folding continuation line (e.g. "Connection:\r\n close\r\n"). When the parser hits the CR of the empty first line, it prematurely resets its internal header state and fires the value callback before it knows a continuation line follows. This means 'interesting' headers (Connection, Content-Length, Transfer-Encoding) whose real value only arrives via a fold are never recognized as such -- e.g. 'Connection: close' split this way fails to set the close flag, so keep-alive stays on when it must be off. Fix the state machine so it looks ahead before deciding a header value is complete, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

zod ts

task id zod_pipe_payload_flag repo colinhacks/zod fix commit c2be4f8190 buggy parent 1cab69383f
files the real fix touched packages/zod/src/v4/core/schemas.ts, packages/zod/src/v4/classic/schemas.ts
graded on packages/zod/src/v4/classic/tests/catch.test.ts packages/zod/src/v4/classic/tests/preprocess.test.ts regression suite packages/zod/src/v4/classic/tests/catch.test.ts packages/zod/src/v4/classic/tests/preprocess.test.ts
solved Benzi 10/13 · Claude Code 2/5 · Codex CLI 2/2 · OpenCode 0/1 · DeepSeek Harness 1/1
Zod's internal ParsePayload carries a caught/fallback flag so an outer .optional() knows to override a recovered value with undefined when the original input was undefined. This flag isn't propagated correctly through pipe boundaries (.pipe(), used internally by .transform() and .preprocess()): the pipe result handler builds a fresh payload for the right side of a pipe without carrying the flag forward, so a chain like z.string().catch('X').pipe(z.string()).optional().parse(undefined) wrongly returns 'X' instead of undefined. Separately, z.object({ a: z.preprocess(fn, T) }).parse({}) -- a preprocess function meant to fill in a value for a missing key -- throws an 'expected nonoptional' error instead of running fn with undefined. Fix both, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

quartznet c#

task id quartznet_misfire_reschedule repo quartznet/quartznet fix commit 417a5b20ce buggy parent bac5084d1b
files the real fix touched src/Quartz/Impl/Triggers/AbstractTrigger.cs, src/Quartz/Impl/Triggers/SimpleTriggerImpl.cs, src/Quartz/Impl/Triggers/CronTriggerImpl.cs, src/Quartz/Impl/Triggers/CalendarIntervalTriggerImpl.cs, src/Quartz/Impl/Triggers/DailyTimeIntervalTriggerImpl.cs, src/Quartz/Impl/Triggers/RecurrenceTriggerImpl.cs, src/Quartz/Impl/AdoJobStore/JobStoreSupport.cs, src/Quartz/Simpl/RAMJobStore.cs, src/Quartz/SPI/IOperableTrigger.cs
graded on FullyQualifiedName~RescheduleNextWithExistingCount_PastStartTime_DoesNotFireImmediately regression suite FullyQualifiedName~RescheduleNextWithExistingCount_PastStartTime_DoesNotFireImmediately
solved Benzi 9/9 · Claude Code 4/4 · DeepSeek Harness 1/1 · Codex CLI 1/1
Since v3.17, triggers using the DoNothing/RescheduleNextWith* misfire-handling instructions compute the rescheduled fire time using a time shifted back by the misfire threshold, instead of the actual current time. This means a trigger with a past StartAt and e.g. WithMisfireHandlingInstructionNextWithExistingCount can fire immediately at scheduler startup instead of waiting for its next legitimately scheduled occurrence, because the computed fire time can land inside the misfire-threshold window. Fix this across all trigger implementations and the job stores that call their misfire-handling methods, restoring the 'does not want to be fired now' semantics, while guarding against infinite loops when a calendar excludes all future times, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

sqlparser-rs rust

task id sqlparser_exponential_backtrack repo apache/datafusion-sqlparser-rs fix commit fd5c1633a8 buggy parent b3760221fa
files the real fix touched src/parser/mod.rs
graded on regression suite
solved Benzi 7/8 · Claude Code 4/5 · DeepSeek Harness 1/1
Parsing deeply-nested parenthesized table factors, e.g. SELECT 1 FROM ((((... with many levels of nesting, causes catastrophic (exponential) parse time instead of failing or succeeding quickly. In parse_table_factor, a speculative attempt to parse a derived table fails and backtracks, but the nested-join fallback path then recurses back into parse_table_factor over the same remaining paren chain and retries the identical speculative parse -- doubling work at every nesting level. Find and fix the root cause so parsing such a chain completes in bounded time, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

nlohmann-json c++

task id nlohmannjson_diagnostic_offsets repo nlohmann/json fix commit bacdabd176 buggy parent d5647e6a3b
files the real fix touched include/nlohmann/detail/input/lexer.hpp, include/nlohmann/detail/input/json_sax.hpp
graded on test-diagnostic-positions_cpp11 regression suite test-diagnostic-positions_cpp11
solved Benzi 11/11 · Claude Code 5/5 · Codex CLI 2/2 · DeepSeek Harness 1/1
nlohmann::json's diagnostic-positions feature (JSON_DIAGNOSTIC_POSITIONS) lets a parsed value report start_pos()/end_pos() -- byte offsets into the original source. For strings, the start offset is currently derived by subtracting the PARSED string's length from the end offset. This is wrong whenever the string contains escape sequences (\n, \t, \", \\, etc.): the source token is longer than the decoded value, so the computed start lands inside the string instead of at the opening quote. Fix it so start_pos()/end_pos() are correct for any mix of escapes and plain/multi-byte UTF-8 content, across both the DOM and streaming/callback SAX parser paths, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

ts-pattern ts

task id tspattern_ismatching repo gvergnaud/ts-pattern fix commit 470e7b9096 buggy parent 1520b57b07
files the real fix touched src/is-matching.ts
graded on tests/is-matching.test.ts regression suite tests/is-matching.test.ts
solved Benzi 8/8 · Claude Code 2/3 · OpenCode 0/1 · DeepSeek Harness 1/1
ts-pattern's isMatching(pattern, value), the two-argument form of its type-guard helper, fails to type-check for almost any pattern that isn't a plain object pattern -- array patterns (P.array(P.number)), primitive patterns (P.number, P.boolean), literal patterns (1, 'oops'), and union/intersection patterns all throw a compile error, even though the equivalent curried form isMatching(pattern)(value) works fine. Fix the type signature so non-object patterns type-check correctly in the two-argument form too, while still preserving the original object-pattern behavior (matching against objects with extra unknown properties), and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

nats-server go

task id natsserver_oversized_publish_raft repo nats-io/nats-server fix commit dce0b028b5 buggy parent a0f553bbcf
files the real fix touched server/filestore.go, server/jetstream_batching.go, server/stream.go
graded on TestJetStreamRejectLargePublishes|TestJetStreamClusterRejectLargePublishesBeforeProposal regression suite
solved Benzi 4/6 · Claude Code 2/4
JetStream file-storage streams must reject a publish whose message exceeds the file store's max on-disk record size with a 'message too large' error, and the stream must stay healthy afterward. The size check only exists deep in the file store's low-level write path, guarded on a single-server (R1) stream by a later consistency-check gate -- but that gate is explicitly disabled for clustered/replicated (R3) streams. So for a replicated stream, an oversized publish sails past every pre-check, gets proposed to and committed by the Raft group, and only then does each replica discover -- while applying the already-committed entry -- that the file store refuses to write it, leaving the stream unable to accept further publishes. Fix this so an oversized message is rejected BEFORE it ever reaches Raft, on both the single-server and clustered pre-proposal paths, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.

dry-schema rubynot on the summary

task id dryschema_maybe_hash_array repo dry-rb/dry-schema fix commit 31e76cb796 buggy parent e33c59236b
files the real fix touched lib/dry/schema/key_validator.rb
graded on spec/integration/schema/unexpected_keys_spec.rb regression suite spec/integration/schema/unexpected_keys_spec.rb
solved Claude Code 0/1 · Benzi 0/1
In dry-schema, when config.validate_keys = true is enabled, a schema containing required(:locations).array(:hash) { required(:feedback_location).maybe(:hash) { ... } } incorrectly raises an "is not allowed" unexpected-key error when feedback_location is nil inside an array element. Since the field is declared maybe(:hash), nil should be accepted without error. Fix the key validator so nil values for optional nested hashes inside arrays aren't flagged as unexpected keys, and keep the existing test suite passing. The repository is at the current working directory. Find and fix the bug. Do not modify any test files.