🏠 ESL - Engineering Software Lab SWE-sweep agent benchmark: the harness is the king
ESL AGENT BENCHMARK · SWE-SWEEP · 01

The Harness Is the King

Amp vs Claude Code on Meta Superintelligence Labs' SWE-sweep bug benchmark, same model on both arms, plus a Parasoft C++test control

4/60 vs 2/60
Reference bugs resolved. Identical model (claude-opus-5-5) in both arms. Only the agent harness differs.
6.7%
Amp's score on this 60-bug subsample. The best official SWE-sweep leaderboard entry: 4.7% at $7,230 per full run.
Daniel Liezrowice
Daniel Liezrowice CTO, ESL - Engineering Software Lab

Embedded software consultancy, Parasoft and Perforce partner in Israel for over 20 years. We benchmark agents with the same evidence discipline we use for safety-critical code.

linkedin.com/in/liezrowice
All numbers in this deck come from logged runs with real patches, session logs and Docker verifier outputs: public results page · harness repository
THE BENCHMARK · 02

What is SWE-sweep?

Meta Superintelligence Labs: can agents autonomously find and fix bugs in large codebases?

  • 100 real repositories, 4,100 confirmed bugs. Built from issue–pull request pairs; each repo snapshot is a commit where the maximum number of bugs coexist.
  • Open-ended task. The agent gets the repository at a fixed base commit and one broad instruction: find and fix as many bugs as you can. No issue text, no filenames, no line ranges, no hints.
  • Brutal scoring. Every candidate fix runs against hidden fail-to-pass tests from the upstream PR, plus the repository's whole existing test suite. One regression zeroes the repo's reward.
  • ICLR 2026 preprint by Lieret, Ma, Wei, Yang, Press and colleagues at Meta Superintelligence Labs, Harvard, UW and Stanford.
issue + PR pairs ──► find commit where many bugs coexist ──► repo snapshot at base commit │ │ ▼ ▼ hidden fail-to-pass tests agent explores, no hints, fixes bugs (from the upstream fix) outputs one patch for the whole repo │ │ ▼ ▼ regression gate: original test suite must still pass ──► reward = bugs resolved / 4100
Paper and leaderboard: swesweep.com · Source: github.com/facebookresearch/swe-sweep
THE BENCHMARK · 03

How a bug is scored

Two test sets per bug, and a gate that punishes collateral damage

Verdict of one of our 24 verifier runs: the JSON the SWE-sweep grader emits per repo (5 reference bugs each)
{
  "reward": 0.2,            # fraction of the 5 reference bugs resolved
  "n_resolved": 1.0,        # all hidden fail-to-pass tests pass
  "visible_ok": 1.0,        # the repo's original test suite still passes
  "n_regressions": 0.0,     # any value > 0 zeroes the whole reward
  "agent_patch_applied": 1.0,
  "agent_build_ok": 1.0,
  "grader_failed": 0.0
}
  • A bug counts only if every hidden test for it passes and the untouched upstream test suite still passes.
  • The agent is explicitly told to avoid regressions. Breaking existing behavior on one line can erase a correct fix elsewhere in the same repo.
  • This is why a plausible-looking 400-line patch can score exactly 0.
THE BENCHMARK · 04

The official leaderboard

Ten entries, all running the minimal mini-SWE-agent scaffold (captured from swesweep.com, Oct 21, 2026)

RankModelAgentScoreTotal cost
1GPT-5.6 Sol (xhigh)mini-SWE-agent4.7%$7,230
2GPT-5.6 Luna (xhigh)mini-SWE-agent2.5%$224
3GPT-5.6 Terra (xhigh)mini-SWE-agent1.5%$357
4GPT-5.6 Luna (high)mini-SWE-agent1.4%$28
5Opus 5 (xhigh)mini-SWE-agent1.3%$5,363
6Kimi K3mini-SWE-agent0.6%$2,451
7GPT-5.6 Lunamini-SWE-agent0.5%$4
8GPT-5.4 Mini (high)mini-SWE-agent0.5%$122
9GPT-5.4 Minimini-SWE-agent0.2%$5
10Gemini 3.5 Flash Litemini-SWE-agent0.1%$6
Print screen of swesweep.com captured October 21, 2026 (leaderboard section)
SWE-sweep leaderboard: 10 entries, all mini-SWE-agent, best 4.7% at $7,230
Most entries sit at 0.1 to 2.5%. The best model in the world on this benchmark resolves fewer than 5 bugs per 100. Full live board: swesweep.com
THE BENCHMARK · 05

What the authors say about harnesses

From the official SWE-sweep FAQ: does the scaffold matter?

“Why mini-swe-agent? Could other scaffolds/multi-agents achieve higher performance? Our paper has an ablation with Claude Code and Codex. Neither seems to significantly outperform mini-swe-agent (to the contrary, mini-swe-agent is even quite a bit better than Codex).” SWE-sweep FAQ, swesweep.com, accessed October 21, 2026
  • The benchmark's own authors found harness choice does not separate the big scaffolds at their resolution: Claude Code, Codex and mini-swe-agent land in the same band.
  • That is exactly the question we set out to test at ESL, but head to head, same model, production harnesses, with the SWE-sweep verifier as the referee.
  • And note rank 5: Opus 5 (xhigh) in the mini-swe-agent harness scores 1.3%, while the same Opus-class model in Amp's harness scored multiples of that in our runs.
PRIOR WORK · 06

Academic context: the harness debate

This benchmark is one data point in a 2026 research conversation

“The bottleneck of autonomy is not only the reasoning ability of the base model, but also the reliability of the system that connects model outputs to long-horizon actions and persistent states.” Code as Agent Harness: A Survey, arXiv:2605.18747 (UIUC · Meta · Stanford, 2026), Section 1
ResultSourceEffect of the harness alone
Harness vs model splitKaggle, The New SDLC with Vibe Coding, Fig. 790% harness / 10% model
Agent-Computer Interface ablationSWE-agent, NeurIPS 20243.8% → 12.5%, no new weights
Harness-only performance gapMeta-Harness (Stanford / MIT)6×
Same model, different scaffold cost swingSentient, ICML 2026~40×
Weak model + strong scaffold beats strong modelConfucius CCA52.7 vs 52.0

Citation for SWE-sweep: Lieret et al., 2026. SWE-sweep: Can Agents Autonomously Find and Fix Bugs? Preprint. Full BibTeX on swesweep.com.

OUR EXPERIMENT · 07

The question: same model, different harness

If two production agent harnesses run the identical LLM, does the harness decide the outcome?

  • Arm 1: Amp (default mode), headless, one prompt per repo.
  • Arm 2: Claude Code (headless defaults), identical prompt.
  • Identical model: claude-opus-5-5 on both arms. The harness is the only variable.
  • 12 repositories across C, C++, C#, F#, Java, Python and Rust: libexpat, click, gson, roslyn, z3, tokio, hdf5, proj, black, rxjava, fsharp, syn.
  • 5 frozen reference bugs per repo = 60 scored tasks.
  • 60-minute cap per agent-repo session, enforced by the harness.
  • Official SWE-sweep Docker verifiers score every patch. No self-grading anywhere.
prompt.md: both arms received exactly this, plus the repo checkout
You are given a repository that contains
bugs. Find as many bugs as you can and
fix them. Output your changes as a
unified diff.

You will not be told how many bugs
there are, where they are, or what
kind of bugs they are.
Harness, logs and patches: github.com/zuwasi/mini-swe-sweep
OUR EXPERIMENT · 08

The harness we built around both agents

Cheating is impossible by construction: the agents never see the tests

run_agent.sh (core): identical treatment for both CLIs, wall-clock cap, patch capture
# timeout 3600s -> exit 124 means the 1h cap expired; still a complete measurement
cd "$REPO" && timeout 3600 "$AGENT_CLI" < prompt.md > session.log
git diff > "patches/${AGENT}__${REPO}.diff"
echo "[$AGENT/$REPO] exit=$? duration=${SECONDS}s diff_lines=$(wc -l < ...)"
eval.sh: the patch is replayed into the official SWE-sweep task image and graded
# per bug: run hidden fail-to-pass tests + the repo's original suite
run_verifier "$TASK_DIR" --patch "patches/${AGENT}__${REPO}.diff"
cat .../verifier/reward.json   # n_resolved, n_regressions, visible_ok
  • Patches, session logs and reward JSONs are kept for every one of the 24 agent-repo runs (plus the earlier cost-tier run).
  • exit=1 rows on the results page are Claude Code hitting its own plan spend cap; those patches were still graded by the verifier.
RESULTS · 09

Final scoreboard: Amp 4/60, Claude Code 2/60

Same model (claude-opus-5-5), same prompt, same 60-minute cap, official SWE-sweep verifiers

Amp: 4/60 (6.7%)
Resolved in 4 of 12 repos: click, gson, proj, rxjava. All 12 sessions finished inside the cap.
Claude Code: 2/60 (3.3%)
Resolved in 2 of 12 repos: tokio, rxjava. Three sessions ended at the plan spend cap; patches still graded.
4.7%
Best official SWE-sweep entry (GPT-5.6 Sol, mini-swe-agent, $7,230). Our Amp result is above it on this subsample.
RepoLanguageAmpClaude CodeNotes
clickPython1/50/5Amp: binary-mode config write + stdin stream API
gsonJava1/50/5
projC++1/50/5Amp used 58 of 60 minutes
rxjavaJava1/51/5Both fixed the FlowableCreate null re-entry bug
tokioRust0/51/5Claude: macro arg list + saturating_add
roslynC#0/50/5Amp: 1 hidden-test regression zeroed the reward
fsharpC#0/50/5Claude: 1 regression in an earlier round
z3C++0/50/5Amp: 399-line patch, looked right, scored 0
libexpat, hdf5, black, synC, C++, Py, Rust0/5 each0/5 eachHard behavioral bugs, neither harness landed them
RESULTS · 10

Where this lands on the leaderboard

Our subsample scores mapped next to the official full-run entries (directional: 60 bugs, not 4,100)

EntryModelAgentScoreCost
ESL benchmark (this deck)claude-opus-5-5Amp (default)6.7%est $28-48
Official rank 1GPT-5.6 Sol (xhigh)mini-SWE-agent4.7%$7,230
ESL benchmark (this deck)claude-opus-5-5Claude Code (headless)3.3%est $13-24
Official rank 2GPT-5.6 Luna (xhigh)mini-SWE-agent2.5%$224
Official rank 5Opus 5 (xhigh)mini-SWE-agent1.3%$5,363
  • Each resolved bug is worth 1.67 points on our 60-bug subsample, so 4-vs-2 is a real gap but not statistical proof. It is directional, and it matches the prior quantum-kernel benchmark (slide 16).
  • Our runs used a 1-hour cap per repo; official entries ran the full 100-repo benchmark. The comparison is a placement, not a record claim.
  • Opus-class model + mini-swe-agent officially scores 1.3%. The same model class in Amp's harness scored 5× that here.
BUG CASE FILES · 11

What the agents got right: click (Python)

Amp, 80-line patch, scored 1/5: two Python 3 API bugs in the bundled examples

patches/amp__click.diff (extract). The config example wrote bytes to a file opened for text, and used a removed private helper.
--- a/examples/aliases/aliases.py
+++ b/examples/aliases/aliases.py
@@ -27,7 +27,7 @@ class Config:
         parser.add_section("aliases")
         for key, value in self.aliases.items():
             parser.set("aliases", key, value)
-        with open(filename, "wb") as file:
+        with open(filename, "w") as file:      # configparser.write needs text mode
             parser.write(file)

--- a/examples/imagepipe/imagepipe.py
+++ b/examples/imagepipe/imagepipe.py
@@ -89,7 +89,7 @@ def open_cmd(images):
             if image == "-":
-                img = Image.open(click.get_binary_stdin())
+                img = Image.open(click.get_binary_stream("stdin"))
  • Small, surgical, exactly at the failing lines. The hidden tests passed and the original suite stayed green.
  • This is the harness discipline pattern we see across all four Amp wins: locate, minimally fix, stop.
BUG CASE FILES · 12

Claude Code's wins: tokio (Rust)

A real, minimal, correct fix. The harness found it; the model wrote it.

patches/claude__tokio.diff (extract). Missing macro argument name and an overflow in size_hint.
--- a/tokio-macros/src/entry.rs
+++ b/tokio-macros/src/entry.rs
@@ -303,7 +303,7 @@ fn build_config(
-                    "flavor" | "worker_threads" | "start_paused" => {
+                    "flavor" | "worker_threads" | "start_paused" | "crate" => {
                         format!("The `{}` attribute requires an argument.", name)

--- a/tokio-stream/src/stream_map.rs
+++ b/tokio-stream/src/stream_map.rs
@@ -578,15 +578,15 @@ where
-        let mut ret = (0, Some(0));
+        let mut ret: (usize, Option) = (0, Some(0));
             for (_, stream) in &self.entries {
-            ret.0 += hint.0;
+            ret.0 = ret.0.saturating_add(hint.0);
  • Two latent bugs in one patch: the macro's requires-argument list was missing "crate", and size_hint could overflow on huge stream maps.
  • 553 diff lines total, scored 1/5 on the hidden tests with a clean regression gate.
BUG CASE FILES · 13

Claude Code's wins: rxjava (Java)

The original code called onError(null) recursively, re-entering the null branch forever

patches/claude__rxjava.diff (extract). The one-line behavioral fix that static analysis could not name.
--- a/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java
+++ b/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java
@@ -619,7 +619,7 @@ public final class FlowableCreate extends Flowable {
             if (e == null) {
-                onError(new NullPointerException(
+                e = new NullPointerException(      # assign, do not recurse with null
                     "onError called with null. Null values are generally not allowed in 2.x operators and sources."));
             }
             error = e;
  • The bug: onError(e) with e == null builds a NullPointerException and passes it back through onError(null), recursing instead of storing it.
  • The fix assigns the exception instead of recursing. One line, judged by hidden behavioral tests. This is the exact bug class where the Parasoft control found zero coverage (slide 19).
BUG CASE FILES · 14

What the agents failed: z3 (C++), 399 lines, scored 0

Amp burned the full hour, produced a plausible 399-line patch, and every hidden test still failed

patches/amp__z3.diff (extract). Correct-looking API mapping fixes for sequence operators.
--- a/src/api/api_ast.cpp
+++ b/src/api/api_ast.cpp
@@ -1326,6 +1326,7 @@ extern "C" {
             case OP_SEQ_INDEX: return Z3_OP_SEQ_INDEX;
+            case OP_SEQ_LAST_INDEX: return Z3_OP_SEQ_LAST_INDEX;
             case OP_SEQ_TO_RE: return Z3_OP_SEQ_TO_RE;
@@ -1345,7 +1346,7 @@ extern "C" {
-            case _OP_REGEXP_FULL_CHAR: return Z3_OP_RE_FULL_SET;
+            case _OP_REGEXP_FULL_CHAR: return Z3_OP_RE_FULL_CHAR_SET;
  • exit code 124: the 1-hour cap expired mid-exploration. The bug surface (string theory solver internals) needed longer-horizon search than either arm got.
  • Claude Code wrote 1,006 diff lines on z3 and also scored 0. On these behavioral solver bugs, more output is not more resolution.
  • Failure mode: exploring a 100k-line C++ codebase without a falsifiable hypothesis per edit. The hidden tests never got a chance to pass.
BUG CASE FILES · 15

The regression gate: roslyn (C#), zeroed

One resolved bug, one broken existing test, reward 0.0

patches/amp__roslyn.diff (extract). The fix swapped the synthesized hash-function names for Span and ReadOnlySpan patterns.
--- a/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/
+++ b/LocalRewriter.DecisionDagRewriter.cs
@@ -924,8 +924,8 @@ private void EnsureStringHashFunction(...)
                     StringPatternInput.String => ...SynthesizedStringHashFunctionName,
-                    StringPatternInput.SpanChar => ...SynthesizedReadOnlySpanHashFunctionName,
-                    StringPatternInput.ReadOnlySpanChar => ...SynthesizedSpanHashFunctionName,
+                    StringPatternInput.SpanChar => ...SynthesizedSpanHashFunctionName,
+                    ...
verifier/reward.json for amp/roslyn: the gate in action
{ "reward": 0.0, "n_resolved": 0.0, "visible_ok": 0.0, "n_regressions": 1.0 }
  • SWE-sweep scores the patch, not the intention. A fix that passes hidden tests but breaks the existing suite earns nothing.
  • The same gate zeroed a Claude Code roslyn diff with 22 regressions in our earlier cost-tier run.
  • Lesson for production agent use: always run the agent inside a regression-gated loop. Both harnesses needed the fence.
PRIOR ESL STUDY · 16

Before this: the quantum-compiler kernels said the same thing

Our earlier head-to-head on 4 from-scratch C++ quantum-optimization problems, graded by hidden tests

TaskAmp (rush)Claude Code + Fable 5 (effort max)Cost ratio
Qubit routing (NP-complete)1.0000.88962×
GRAPE pulse control1.0001.00033×
Magic-state scheduling1.0001.00022×
JSON parser control1.0001.00042×
All 41.000, $1.930.972, $75.4039×
  • A fast, cheap agent beat the era's #1 model on the one task that needed real algorithmic depth, at 39× lower cost and 24× faster per iteration.
  • Different benchmark, different model class, same conclusion: the loop around the model decides.
CONTROL STUDY · 17

The Parasoft C++test control

Before crediting agents, we asked: can classic static analysis find these bugs at all?

  • Tool: Parasoft C++test Professional 2025.2.0, licensed, run on 6 C/C++ SWE-sweep repos: libexpat, jerryscript, hdf5, proj, z3, tarantool.
  • Five configurations: Recommended Rules, Flow Analysis Standard, Flow Analysis Aggressive, MISRA C 2025, MISRA C++ 2023.
  • ~500,000 findings in total across the configurations.
  • Ground truth: the SWE-sweep oracle patches. A finding "hits" a bug only if its line falls on a base-side line that the upstream fix actually changed.
ConfigFindings (6 repos)Character
Recommended Rules8,206Curated built-in rule set
Flow Analysis Standard9,032Dataflow, path-sensitive
Flow Analysis Aggressive11,884Dataflow, deeper paths
MISRA C 2025252,683Style / standard compliance
MISRA C++ 2023220,807Style / standard compliance
CONTROL STUDY · 18

Parasoft result: 0 to 0.3% overlap with the real bugs

Findings landing on lines the upstream fix changed

RepoFixed linesRecommendedFA StdFA AggrMISRA C 2025MISRA C++ 2023
z32483 (0.1%)2 (0.1%)2 (0.1%)20 (0.05%)18 (0.03%)
tarantool1,3392 (0.2%)6 (0.3%)6 (0.2%)213 (0.27%)193 (0.32%)
libexpat279 (3 CVEs)003 (1.1%)~2.5% (baseline ~4%)~2.5%
jerryscriptdensity 18.7%-14.2%16.7%11.4%-
  • Wherever we can compute a fair baseline, the hit rate sits at or below the random density of changed lines in the file. The apparent jerryscript overlap is explained by line density, not detection.
  • MISRA "hits" are style-rule violations that coincidentally touch changed regions; the MISRA configs flag 79,364 findings in tarantool alone.
Full method and per-config data: github.com/zuwasi/swe-sweep-parasoft-cpptest
CONTROL STUDY · 19

Why static analysis is not relevant to SWE-sweep

And why it is still not the loser of this story

Different question, different tool

  • SWE-sweep scores behavioral regressions: a null re-entry in an RxJava operator, a swapped hash-function name in a C# compiler backend, an overflow in a Rust size_hint. Each needs semantics, intent, and a failing test to reason from.
  • Static analysis checks patterns and invariants reachable from syntax and dataflow. It cannot know that ret.0 += hint.0 is wrong here but right everywhere else.
  • Look at the rxjava fix on slide 13: one line, judged by hidden behavioral tests. No rule in ~500,000 findings describes that contract.

Complementary, not competing

  • For safety-critical work (ESL's home turf: MISRA, CERT, AUTOSAR), C++test is exactly the right tool and we deploy it daily.
  • For "find the bugs nobody reported yet", the agent loop wins, and the published direct-LLM baseline in the same study (no agent loop) resolves only 0 to 20% per repo.
  • The pipeline we recommend to clients: static analysis for the rule book, agents for the behavior, hidden tests as the referee.
This control study is why the agent results mean something: the SWE-sweep bugs are genuinely hard, and no cheaper classical instrument detects them.
ANALYSIS · 20

Why the harness is the king

The same weights, two different products, two different outcomes

┌──────────────────────────────────────────────┐ │ coding agent product │ │ ┌────────────┐ ┌───────────┐ ┌───────────┐ │ │ │ UI / CLI │ │ orchestr. │ │ context + │ │ │ │ 5% │ │ 15% │ │ index 15% │ │ │ └────────────┘ └───────────┘ └───────────┘ │ │ ┌────────────┐ ┌───────────┐ ┌───────────┐ │ │ │ tools + │ │ verify │ │ memory + │ │ │ │ shell 20% │ │ 20% │ │ guard 10% │ │ │ └────────────┘ └───────────┘ └───────────┘ │ │ ┌──────────────────────────────────────┐ │ │ │ LLM core: 15% │ │ │ └──────────────────────────────────────┘ │ └──────────────────────────────────────────────┘
  • The model is the engine. The harness is the car. Nobody commutes to work on an engine.
  • In our SWE-sweep runs the deciding harness behaviors were: repo-wide context management, when to stop exploring and edit, patch-size discipline, and running the visible test suite before declaring victory.
  • The models are converging. The scaffolding is diverging. That is where evaluators, buyers and builders should look.
CONCLUSION · 21

The winner: Amp

On this benchmark, with the model held constant, the harness with the better loop won. Twice.

  • 2× the resolved bugs on identical weights: 4/60 (6.7%) vs Claude Code's 2/60 (3.3%), same model, same prompt, same cap, same verifier.
  • Above the state of the art: 6.7% on our subsample vs 4.7% for the best official full-run entry, which cost $7,230.
  • Cleaner cost profile: Amp completed every session inside the cap and produced minimal, targeted diffs; Claude Code needed larger patches for fewer wins and lost three sessions to its own spend limit.
  • Consistent with our prior study: on the quantum-compiler kernels, Amp solved 4/4 where max-effort Claude Code stopped at 3/4, at 39× lower cost.
  • The compliment that matters: Amp's context handling, tool execution and verification loop turn the same engine into measurably more working software. The harness is the product, and Amp built a better one.
CONCLUSION · 22

Honest limitations

A benchmark you can trust names its own boundaries first

  • n = 60, one seed. One bug equals 1.67 points, so 4-vs-2 is directional evidence, not a statistical proof. It aligns with two independent studies pointing the same way.
  • Subsample: 5 frozen reference bugs per repo, not the full 4,100. Our percentages are placement estimates against official full runs.
  • Quota endings: three Claude Code sessions ended at the plan spend cap. Their patches were graded by the real verifier, but those sessions had less effective exploration time.
  • Costs are estimates from measured wall time, not vendor invoices; token-level attribution is not exposed by either CLI.
  • Both harnesses are good. Claude Code resolved bugs Amp missed (tokio). This is a ranking on one benchmark slice, not a verdict for all workloads. Run candidates on your own code.
CONCLUSION · 23

What to do Monday

Buy the harness, not the leaderboard

  • Stop shopping for the biggest model. The same model scored 1.3%, 3.3% or 6.7% depending on the loop you put around it.
  • Evaluate harnesses on your repos: context management, tool execution, verify loops, spend discipline, regression fences.
  • Keep static analysis for the rule book and compliance; keep agents for behavioral bugs; keep hidden tests as the only referee.
  • Budget the plan limit, not just the tokens: quota interruptions cost us five Claude batch attempts before we stabilized the protocol.
ArtifactLink
Public results page (per-run data)zuwasi.github.io/Public-html-pages/mini-swe-sweep
Benchmark harness, patches, verifier outputsgithub.com/zuwasi/mini-swe-sweep
Parasoft C++test control studygithub.com/zuwasi/swe-sweep-parasoft-cpptest
SWE-sweep benchmark and paperswesweep.com · facebookresearch/swe-sweep
Prior ESL studyThe Harness Beats the Model
THANK YOU · 24

ESL - Engineering Software Lab

Embedded software consultancy · optimizing and migrating embedded projects · AI-augmented SDLC with evidence

ESL
Daniel Liezrowice
Daniel Liezrowice CTO, ESL

Benchmarks, migration proofs and security assessments with executable evidence. Parasoft and Perforce partner in Israel for over 20 years.

linkedin.com/in/liezrowice · eswlab.com
The model is the engine. The harness is the car. On SWE-sweep, Amp drove further.
1 / 24
← Swipe to navigate →