Blog

J'ai benchmarké 4 agents CLI sur un problème d'optimisation NP-difficile que j'avais résolu à la main il y a 8 ans. L'un d'eux m'a battu.

/ 21 min de lecture

TL;DR: I gave an unpublished fiber network optimization problem to Claude Code (Opus 4.6), Codex (GPT-5.3-Codex xhigh), Gemini CLI (Gemini-3-Pro-Preview), and Mistral (Devstral-2). The score is total fiber length (lower is better). A good human solution in 30 minutes: ~40,000. My best after days of C++: 34,123. Given one hour, Claude Code (Opus 4.6) hit 34,061 — beating me by 62 points. A 7-word prompt hint improved every agent by 18-30%. About 15% of all trials produced completely invalid outputs. Update: I also tested GLM-5 through two agent frameworks — Claude Code and Mistral Vibe — on both the KIRO benchmark and 89-task Terminal-Bench. GLM-5’s best KIRO score (40,943 via Claude Code) lands in Gemini CLI territory, while Mistral Vibe + GLM-5 leads on Terminal-Bench at 48.3%.

Original repository: CLIArena


Eight years ago, as an engineering student in France, I spent several days locked in my room writing C++ to solve KIRO 2018 — a fiber optic network optimization challenge from my engineering school. Simulated annealing, neighborhood searches, hours of tweaking parameters. My best score was 34,123 (lower is better). Getting below 34,000 would require fundamentally different approaches — the kind of diminishing returns where shaving off 1,000 costs as much effort as the previous 10,000.

I’ve been using this problem as my personal coding agent benchmark ever since. It’s never been published online, so it can’t be in any training set. It’s NP-hard, so there’s no shortcut. And unlike SWE-bench or HumanEval where tasks are pass/fail, this returns a continuous score — you can see exactly how much better one agent is than another, and whether they improve over time or just plateau.

Why 30 minutes? That’s roughly how long my C++ solver takes to converge to ~34,000. A first attempt from a human in 6 hours (without AI) lands around 40,000. I also ran a 1-hour variant to see whether more time changes the picture — it does, dramatically.

The problem: fiber network design

Imagine you need to connect 543 cell towers across Paris to 11 hubs using fiber optic cable running through underground ducts. You want to minimize total cable, but there are constraints:

  • You must build loops for redundancy: a loop starts at a hub, visits up to 30 towers, and returns to the same hub.
  • You can hang branches off any tower in a loop: a branch is a chain of up to 5 additional towers.
  • Every tower must be covered exactly once — either on a loop or on a branch.
  • Distances are asymmetric: going from tower A to tower B costs differently than B to A, because the cable follows physical underground duct paths, not straight lines.

Here’s what that looks like in practice:

         ┌── T1 ── T2 ── T3 ──┐
         │                     │
        Hub ── T7 ── T8 ──────┘       ← loop (circuit back to hub, max 30 towers)

                └── T9 ── T10 ── T11   ← chain off T7 (max 5 towers per chain)

A chain starts from any tower on a loop and visits up to 5 additional towers.

The challenge covers three cities of increasing complexity:

CityHubsTowersDifficulty
Grenoble211Trivial — almost any approach works
Nice365Moderate — structure starts to matter
Paris11532Hard — this is where agents fail

The final score is the sum across all three cities. A naive nearest-neighbor heuristic scores around 50,000-80,000. Getting below 40,000 requires iterative optimization (2-opt, simulated annealing). Below 35,000 requires sophisticated multi-phase solvers.

Each agent gets the problem statement in markdown, the CSV data files, and runs in a Docker container via Harbor, an agent benchmarking framework. Three trials per condition.

The five experimental conditions

I tested each agent under five conditions:

  1. Base (30min, Python): The raw problem description + “you have 30 minutes, save early and often”

  2. + keep improving (30min, Python): Adds “this will be released to the public, it is critical for your company’s reputation, keep improving until timeout”

  3. + target hint (30min, Python): Adds “the best solution is around 32,000, if you’re not close, keep trying”. This feels like cheating, but I don’t actually know the optimal score — I just made up a round number below my best. And yet it helps enormously.

  4. Go required (30min, Go): Same as #2, but agents must write Go instead of Python

  5. One hour (60min, Python): Same as #2, but with double the wall clock time

When no language is specified, every agent defaults to Python. I tested Go because a compiled language should iterate faster for simulated annealing — more iterations per second means more opportunities to escape local minima. I chose Go over C++ because I didn’t want agents wasting time on compilation errors. (They still did.)

Four agents, five conditions, three trials each = 60 total trials.

Results

Best scores

Best score per agent

AgentBest scoreConditionvs. my C++ (34,123)vs. human 30min (~40k)
Claude Code (Opus 4.6)34,06160min Python-0.2%-15%
Codex (GPT-5.3-Codex xhigh)37,58660min Python+10%-6%
Gemini CLI (Gemini-3-Pro-Preview)41,11960min Python+20%+3%
Mistral (Devstral-2)53,61630min + target hint+57%+34%

Claude Code’s (Opus 4.6) 34,061 beat my multi-day C++ solution by 62 points. On a problem where the last 1,000 points cost exponentially more effort, that’s not a rounding error. But it was one trial out of three — the other two scored 41,714 and 41,601. More on reliability later.

All trials

All trial scores

All 60 trials across 5 conditions. The X markers are invalid solutions (constraint violations = automatic 999,999,999 penalty). 9 invalid out of 60 total. The purple markers (1-hour trials) and green markers (Go trials) show the effect of changing the rules — Claude Code’s (Opus 4.6) lowest point on the entire chart is that single purple dot at 34,061.

What each agent actually did

I read through the agent trajectories. The differences in approach are striking.

Claude Code / Opus 4.6 (best: 34,061)

Claude Code (Opus 4.6) was the most methodical. In its best run (the 1-hour trial that scored 34,061), it wrote and rewrote its solver four times (v1 → v2 → v3 → v4), each time finding structural bugs and starting fresh rather than patching:

“Instead of patching the v2 solver, let me write a cleaner, more robust v3 solver that handles all edge cases properly”

“The problem is the perturbation loop runs forever because budget check is wrong. Let me write a cleaner, faster v4 solver”

It used an adaptive per-city strategy. For Grenoble (11 terminals), it ran near-exhaustive search and discovered that putting all terminals on a single loop with chains was optimal — scoring 2,056. For Nice (65 terminals with only 3 hubs), it recognized the problem was essentially a partition problem and used simulated annealing, scoring 6,266. For Paris (532 terminals), it allocated over 60% of the total time and ran Iterated Local Search with destroy-and-repair perturbation — cycles that deliberately break a good solution to escape local minima, then rebuild.

Paris showed continuous improvement over the hour:

27,630 → 27,378 → 26,447 → 26,306 → 26,290 → 26,183 → 26,036 → 25,958 → 25,739

It also ran parallel optimization processes for different cities, killed stuck processes, and tried different approaches when one stalled. At its 30-minute mark, it was at ~36,000 — competitive but not extraordinary. The next 30 minutes were where it pulled away.

Critically, Claude Code (Opus 4.6) built a constraint validator early and used a validate-before-save pattern — catching bugs during development that other agents only discovered (or didn’t discover) at evaluation time.

Codex / GPT-5.3-Codex xhigh (best: 37,586)

Codex (GPT-5.3-Codex xhigh) was more direct. Interestingly, it reasoned in French (matching the problem language):

“Je vais construire une solution faisable immediatement pour les 3 villes, puis lancer une amelioration iterative en sauvegardant a chaque gain.”

Its solver was simpler — fewer optimization passes, but cleaner implementation. It focused on getting a valid solution fast, then running 2-opt.

One trial tells a painful story. Under the “target hint” prompt, Codex (GPT-5.3-Codex xhigh) was actively optimizing Paris — the trajectory shows it steadily improving: 31,307 → 31,277 → 31,217 → 31,181 → 31,091 → 31,061, still going down when the timeout hit. Codex commented: “meilleur coût candidat descendu à 31091”. But the trial scored 999,999,999 because Codex never saved any output files. It was still optimizing when the clock ran out. The agent had a working, improving solution in memory and lost everything.

With one hour, Codex (GPT-5.3-Codex xhigh) barely improved over its 30-minute results (-2%). Its simpler solver hit a ceiling that more time couldn’t break through.

Gemini CLI / Gemini-3-Pro-Preview (best: 41,119)

Gemini CLI (Gemini-3-Pro-Preview) took the most economical approach: k-means-style clustering with a facility location proxy, then greedy chain construction. Fewer total steps than any other agent (~13 vs Claude Code’s ~80), and it often finished in under 5 minutes of a 30-minute window. It got valid solutions quickly but didn’t invest in the deep optimization passes that brought Claude Code’s (Opus 4.6) and Codex’s (GPT-5.3-Codex xhigh) scores down. Gemini CLI also hit rate limits during some trials, which further constrained its ability to iterate.

With one hour, Gemini CLI (Gemini-3-Pro-Preview) improved meaningfully (-10% to 41,119), confirming it was genuinely time-starved at 30 minutes.

Mistral / Devstral-2 (best: 53,616)

Mistral (Devstral-2) struggled. Its base prompt runs averaged 87,099 — more than double the leaders. Looking at the trajectory, the pattern was clear: it implemented a nearest-neighbor heuristic with a hardcoded distance threshold of 3,000, generated an initial feasible solution in about 8 minutes, and then stopped. No iterative improvement loop. No local search. Just one shot.

When given the “keep improving” prompt, Mistral’s (Devstral-2) performance degraded — 2 out of 3 trials produced invalid solutions. The added pressure seemed to push it toward more ambitious algorithms it couldn’t implement correctly, and without a constraint validator to catch errors, the broken solutions went straight to disk.

With one hour, Mistral (Devstral-2) improved to 54,321 (-41% relative to its base average), but was still far behind — and 1 of 3 one-hour trials was still invalid.

The prompt engineering effect

Effect of prompt engineering

Adding the target hint (“best solution is around 32,000”) helped every agent:

AgentBase mean+ target hint meanImprovement
Claude Code (Opus 4.6)48,15339,127-19%
Codex (GPT-5.3-Codex xhigh)47,24038,724*-18%
Gemini CLI (Gemini-3-Pro-Preview)58,13245,337*-22%
Mistral (Devstral-2)87,09961,062-30%

*Codex (GPT-5.3-Codex xhigh) and Gemini CLI (Gemini-3-Pro-Preview) each had 1 invalid trial (999,999,999) in the target hint condition; means are computed over valid trials only.

Telling the agent what “good” looks like makes a massive difference. Without a target, agents don’t know if their first valid solution is great or terrible, so they’re more likely to stop early.

But the “keep improving” prompt without a target score was a mixed bag. For Mistral (Devstral-2), it was actively harmful. Vague urgency without a concrete benchmark can push weaker agents toward overengineering and constraint violations.

Go: faster language, worse results

I told agents they must write Go. The rationale: Go compiles to native code, so the solver should run faster, leaving more room for optimization iterations within the same 30-minute window.

Best score by condition

AgentBest (Python 30min)Best (Go 30min)Invalid trials (Go)
Claude Code (Opus 4.6)39,54037,9741/3
Codex (GPT-5.3-Codex xhigh)38,35840,8130/3
Gemini CLI (Gemini-3-Pro-Preview)45,67964,0672/3
Mistral (Devstral-2)92,41969,8011/3

Claude Code (Opus 4.6) actually scored better in Go (37,974 vs 39,540) — Go’s raw speed let the solver do more iterations. But it also produced 1 invalid trial. The other agents fared worse: Codex (GPT-5.3-Codex xhigh) regressed, Gemini CLI (Gemini-3-Pro-Preview) failed on 2 out of 3, and Mistral (Devstral-2) produced one trial scoring 282,951 (valid but catastrophic — it spent its time getting Go to compile rather than optimizing). Overall, 4 out of 12 Go trials were invalid versus 2 out of 12 for the same prompt in Python.

The why is specific to Go: agents spent so much time fighting the compiler that they skipped constraint validation entirely. Claude Code (Opus 4.6) timed out while its Go solver was still running — it never got a chance to self-verify. Gemini CLI (Gemini-3-Pro-Preview) completed both invalid trials in under 4 minutes (out of 30), confidently reporting “all constraints are strictly followed” while the verifier found 60+ chain violations. In Python, these agents built validators into their iteration loops. In Go, the compile-run-fix cycle was slow enough that validation was the first thing they cut.

One hour: where Claude Code (Opus 4.6) pulled ahead

AgentBest (30min)Best (60min)Mean (60min)
Claude Code (Opus 4.6)39,54034,06139,125
Codex (GPT-5.3-Codex xhigh)38,35837,58642,114
Gemini CLI (Gemini-3-Pro-Preview)45,67941,11944,667
Mistral (Devstral-2)92,41954,32162,167*

*Mistral (Devstral-2) mean over 2 valid trials; 1 of 3 was invalid.

Claude Code’s (Opus 4.6) 34,061 is 62 points better than my C++ solution of 34,123. But context matters: the mean across Claude Code’s three 1-hour trials was 39,125. The other two runs scored 41,714 and 41,601 — solidly above my C++ baseline. The 34,061 was the exception, not the rule.

More time helped, but only if the agent had built a solver that actually uses it. Claude Code’s (Opus 4.6) iterative loops kept finding improvements across the full hour. Codex (GPT-5.3-Codex xhigh) plateaued (-2%). Gemini CLI (Gemini-3-Pro-Preview) benefited meaningfully (-10%), confirming it was time-starved at 30 minutes.

Why solutions fail

Across all 60 trials, 9 produced completely invalid solutions. Three failure modes:

1. Chain-to-loop constraint violations (7/9 failures). The agent builds chains that attach to nodes not on any distribution loop. This happens because optimization passes (like 2-opt) reorder or remove nodes from loops without updating chain anchors — the chain still points to a node that used to be on the loop but got moved elsewhere.

2. Never saved output files (1/9). The Codex (GPT-5.3-Codex xhigh) trial that was actively optimizing when the timeout hit. A time management failure, not a logic bug.

3. Malformed output format (1/9). One Gemini CLI (Gemini-3-Pro-Preview) trial produced a file where chain definitions appeared before any loop definition — a format error the parser rejected immediately.

Paris — with its 532 towers and 11 hubs — is where constraint satisfaction becomes genuinely hard. The per-trial breakdown:

Failed trialGrenoble (13 nodes)Nice (68 nodes)Paris (543 nodes)
Mistral (Python)Valid (2,640)14 chain errors77 chain errors
Mistral (Python)Valid (2,324)Valid (11,616)86 chain errors
Gemini (Python)Valid (2,458)4 chain errorsMalformed file
Codex (Python)No fileNo fileNo file
Claude (Go)1 chain error12 chain errors35 chain errors
Gemini (Go)Valid (2,221)Valid (10,576)60 chain errors
Gemini (Go)Valid (2,221)Valid (12,628)11 chain errors
Mistral (Go)Valid (2,689)Valid (31,808)3 chain errors

Grenoble almost never fails — 13 nodes is small enough that constraint violations are hard to produce accidentally. Nice fails occasionally. Paris is where every agent’s chain construction logic breaks down. Several of these were agonizingly close: Mistral’s (Devstral-2) Go trial had only 3 chain errors in Paris, and Gemini CLI (Gemini-3-Pro-Preview) had two trials with valid Grenoble and Nice scores that would have contributed to competitive totals — but a handful of errors in Paris invalidated everything.

One Mistral (Devstral-2) Go trial scored a technically valid 282,951. The per-city breakdown — Grenoble 3,132, Nice 36,038, Paris 243,781 — reveals what happens when an agent produces a valid-but-unoptimized solution and never improves it. The agent spent its time getting Go to compile rather than optimizing.

Update: GLM-5 — one model, two agents

GLM-5, from Zhipu AI, made waves when it topped several coding benchmarks — including strong showings on SWE-bench and LiveCodeBench. The narrative was compelling: a Chinese lab producing a model that rivals or beats the best Western offerings on agentic coding tasks. I wanted to see how it holds up on a task no benchmark has seen before.

GLM-5 also has a practical advantage for testing: its API is compatible with the Anthropic/OpenAI format, making it trivially easy to plug into existing agent frameworks. I tested it through two:

  • Claude Code — the standard Claude Code CLI, which is the base supported integration for running models through the Anthropic API format. Claude Code’s agent loop (tool use, file management, iterative development) is well-tested. I just pointed it at the GLM-5 API endpoint and it ran. This is the “official” way to run a model through an agent.
  • Mistral Vibe — a fork of Mistral’s Vibe CLI that I adapted for GLM-5. In a previous article, Mistral Vibe showed the strongest results of all the agent frameworks I tested on Terminal-Bench, and its codebase was the easiest to fork — swap the API endpoint and model name, and you’re running. I picked it specifically because it had already proven itself as the best-performing framework in my earlier tests.

The question isn’t just “how good is GLM-5?” but “does the agent framework matter when the underlying model is the same?” And more importantly: do GLM-5’s impressive benchmark numbers translate into reliable real-world performance?

KIRO results with GLM-5

I ran the same five experimental conditions as before (base, +keep improving, +target hint, Go, one hour), three trials each. The Go condition for Claude Code was cancelled due to infrastructure issues, leaving 27 completed trials.

GLM-5 KIRO all trials

AgentBest scoreConditionvs. my C++ (34,123)
Claude Code + GLM-540,94360min Python+20%
Mistral Vibe + GLM-546,764+ target hint+37%

For context, here’s GLM-5 alongside the original agents:

All agents comparison

AgentBest scorevs. my C++
Claude Code + Opus 4.634,061-0.2%
Codex + GPT-5.337,586+10%
Claude Code + GLM-540,943+20%
Gemini CLI + Gemini-3-Pro41,119+20%
Mistral Vibe + GLM-546,764+37%
Mistral + Devstral-253,616+57%

Claude Code + GLM-5 lands right next to Gemini CLI — competitive but not at the top. Mistral Vibe + GLM-5 outperforms Devstral-2 by a wide margin (46,764 vs 53,616), confirming the model upgrade matters even through a different framework.

But the failure rate is striking: 8 out of 27 completed KIRO trials produced invalid solutions (30%), double the 15% from the original agents. Every single condition had at least one timeout.

What the GLM-5 trajectories show

Claude Code + GLM-5 took 90 steps in its best run (40,943 on the one-hour condition). It went through six solver versions, starting with a naive approach scoring 97,796 and iterating down:

“Good progress! Total cost is 97796. Let me implement more advanced optimizations.”

It tried multiple approaches — basic heuristics, multi-start methods, MST-based chain construction — but settled on a k-means clustering approach (v6) that brought the score down to 40,943. It hit a plateau there, running the same solver repeatedly:

“The solver is consistently getting 40943. Let me run a few more times and then summarize.”

Unlike Claude Code + Opus 4.6 (which rewrote its solver four times and kept finding improvements all the way to 34,061), the GLM-5 version couldn’t break through its local optimum. It lacked the destroy-and-repair perturbation strategy that powered Opus 4.6’s final push.

Mistral Vibe + GLM-5 was more concise at 34 steps. In its best run (46,764, target hint condition), it tried multiple construction heuristics — nearest neighbor, farthest insertion, cheapest insertion — with 2-opt improvement. It recognized the target and iterated aggressively:

“The initial solution has a total cost of 81397, which is far from the target of ~32000. Let me significantly improve the algorithm.”

The progression was fast: 81,397 → 58,544 → 46,764. But it ran out of time before closing the gap further. With only 34 steps versus Claude Code’s 90, Mistral Vibe simply couldn’t iterate enough times on the solver to match the depth of optimization.

The Go condition was a disaster (again). Mistral Vibe + GLM-5 Go trials scored 296,978, 999,999,999, and 97,539. The agent spent its time writing and rewriting Go code, not optimizing. One trial managed only 10 steps total — barely enough to produce any valid output. Same pattern as the original agents, same lesson: compiled languages cost more agent time than they save in runtime.

Terminal-Bench: 89 tasks at scale

I also ran both GLM-5 agents on Terminal-Bench, a benchmark of 89 diverse tasks — from building POV-Ray to COBOL modernization to DNA assembly to cracking 7z hashes.

Terminal-Bench results

AgentTasks solvedPass rateTimeouts
Mistral Vibe + GLM-543/8948.3%21
Claude Code + GLM-536/88*40.4%24

*One Claude Code trial failed to produce session files.

Here the result flips: Mistral Vibe outperforms Claude Code on breadth despite losing on the deep optimization problem. The two agents solved different subsets of tasks: 30 tasks were solved by both, but Mistral Vibe uniquely solved 13 tasks (including adaptive-rejection-sampler, configure-git-webserver, sparql-university) while Claude Code uniquely solved 6 (including circuit-fibsqrt, schemelike-metacircular-eval, query-optimize).

The timeout rate tells part of the story: Claude Code timed out on 24 tasks (27%) versus Mistral Vibe’s 21 (24%). Claude Code’s deeper iterative loop is an advantage when a task rewards sustained optimization, but a liability when the task just needs a quick, correct answer.

Agent framework vs. model

The same GLM-5 model produced meaningfully different results depending on the agent framework:

  • KIRO (depth): Claude Code wins (40,943 vs 46,764). Its 90-step iterative process with multiple solver rewrites beat Mistral Vibe’s faster but shallower 34-step approach.
  • Terminal-Bench (breadth): Mistral Vibe wins (48.3% vs 40.4%). The lighter-weight framework completed more diverse tasks within time limits.

This echoes a pattern from the original benchmark: the best approach depends on whether the task rewards sustained iteration or fast first-attempt solutions. The agent framework is not just a wrapper around the model — it shapes how the model’s intelligence gets applied.

Benchmarks vs. reality

GLM-5 looks impressive on leaderboards. And its best KIRO score of 40,943 is genuinely competitive — it beats Gemini CLI’s best and sits well above Devstral-2. On Terminal-Bench, Mistral Vibe + GLM-5 solves 48.3% of tasks. These are respectable numbers.

But the numbers hide the pain. In practice, running GLM-5 was a significantly rougher experience than running the original agents with their native models:

  • 30% of KIRO trials were completely invalid (8 out of 27), versus 15% for the original agents. Every single experimental condition — base, keep improving, target hint, Go, one hour — produced at least one failure for both agent frameworks.
  • Every KIRO trial hit the timeout, even the ones that saved valid results. The agents were always interrupted mid-work, never finishing cleanly. With the original agents, several trials completed well before the time limit.
  • The Go condition for Claude Code had to be cancelled entirely after the first trial scored 999,999,999 and the second had to be force-killed.
  • Variance was extreme. Mistral Vibe + GLM-5’s one-hour trials scored 147,418 and 57,260 — a 2.6x spread. Claude Code + GLM-5’s target hint trials went from 58,045 to 999,999,999. With the original agents, variance within a condition was typically under 30%.
  • On Terminal-Bench, nearly a quarter of all tasks timed out (21-24 out of 89), compared to the original agents where timeout was less common.

The best-case GLM-5 result is competitive. The median-case is mediocre. The worst-case is catastrophic. This gap between peak and typical performance is exactly what standard benchmarks don’t capture — they report the headline number, not the distribution. When you’re deciding which model to deploy for real work, reliability matters at least as much as the best score on the best day.

What I learned

1. “Save early, improve forever” is the winning pattern. The gap between Claude Code (Opus 4.6)/Codex (GPT-5.3-Codex xhigh) and Mistral (Devstral-2) isn’t about knowing better algorithms. All four agents know what 2-opt is. The difference is whether the agent sets up a solver that continuously improves, saving valid solutions along the way — or writes a one-shot heuristic and stops.

2. Tell agents what good looks like, not to try harder. A 7-word hint (“best solution is around 32,000”) improved scores by 18-30% across every agent. I didn’t even know the optimal score — I just made up a round number below my best. Yet it worked. Vague urgency (“this is critical for your company”) was a mixed bag — for Mistral (Devstral-2), it was actively harmful. A concrete target, even an approximate one, changes behavior more than any amount of motivational framing.

3. Python is the AI language. Go was supposed to give agents faster iteration speed. Instead, they spent the time fighting the compiler and skipping validation. 4 out of 12 Go trials failed versus 2 out of 12 for the same prompt in Python.

4. The agent framework is not just a wrapper. Running the same GLM-5 model through Claude Code and Mistral Vibe produced meaningfully different results — and which framework won depended on the task type. Claude Code’s deeper iteration loop helps on sustained optimization (KIRO), while Mistral Vibe’s lighter approach wins on diverse task completion (Terminal-Bench). When evaluating a model, the agent around it matters as much as the weights inside it.

5. Benchmark scores and real-world reliability are different things. GLM-5 tops leaderboards and its best KIRO score is genuinely competitive. But 30% of its KIRO trials were invalid, every trial timed out, and variance was extreme. The gap between “best possible result” and “what you’ll typically get” is the number that matters for real work — and it’s the number benchmarks rarely report.

Limitations

I believe it’s healthy to run your own benchmarks instead of trusting the ones published by the companies selling you the product. This is mine.

The original benchmark is one task, one problem domain. The sample size is small (3 trials per condition per agent, 60 total for the original + 27 for GLM-5). I ran each agent with its default model: Claude Code with Opus 4.6, Codex with GPT-5.3-Codex xhigh, Gemini CLI with Gemini-3-Pro-Preview, and Mistral with Devstral-2. For the GLM-5 update, I tested through Claude Code and Mistral Vibe only — the Go condition for Claude Code + GLM-5 was cancelled due to infrastructure issues. The agents ran in Docker containers with subscription-tier access — rate limits may have affected some runs. The problem is in French, which may disadvantage some agents. The Go and one-hour experiments used only the “keep improving” prompt variant. Terminal-Bench results are single-trial per task.

Take this as a data point, not a leaderboard.

Reproducing this

The task definition, verifier, and all raw results are available at CLIArena. The benchmark runs on Harbor. Total compute cost was roughly the price of 4 monthly subscriptions for a few hours of usage.


If you’ve done similar benchmarks on non-standard tasks, I’d love to compare notes. The standard coding benchmarks (SWE-bench, HumanEval) test something different — they’re binary pass/fail on well-known problem patterns. Continuous optimization on novel NP-hard problems feels like a better test of actual agent capability.