2026-10-07 Findings

Same task, 10 runs: Codex CLI reported edits it never made in 3 of 100 runs

I gave Claude Code and Codex CLI the same 10 small coding tasks and ran each task 10 times per agent, 200 runs in all. Claude Code passed all 100. Codex CLI passed 96, and its 4 failures were all the same kind: it read the file, changed nothing, and exited cleanly within 10 seconds. In 3 of those 4 runs its last message said it had made the change. The overall pass rates are too close to call. How Codex failed is the part worth reading.

What I ran

This is the follow-up to a 60-run pilot, with 10 runs per task instead of 3, using rerun-bench, an evaluation tool I build. Each run starts from a fresh copy of the task's files, drives the agent's CLI headlessly, and is scored only by the task's own verifier script. What the agent says about its work is recorded but never scored.

The numbers

Pass rate with Wilson 95% intervalThe dot is the share of runs that passed; the bar is the 95% interval. The bars overlap.
Claude Codeclaude-opus-5-5
100% [96, 100]
Codex CLIgpt-6-luna
96% [90, 98]
Show as table
Pass rate with Wilson 95% interval
AgentPass rate95% low95% high
Claude Code100.0%96.3%100.0%
Codex CLI96.0%90.2%98.4%
Headline numbers for the 10-run set
MetricClaude CodeCodex
Runs passed100 of 10096 of 100
Pass rate, Wilson 95% interval100% [96, 100]96% [90, 98]
pass^10: all 10 runs pass100%70%
Flip rate: two runs of a task disagree0%8%
Tasks with both a pass and a fail0 of 103 of 10
Median wall time per run12.7 s16.8 s
Every run, by taskEach mark is one run, in the order they ran. Codex CLI has a fail on 3 tasks.
  • pass (verifier exited 0)
  • fail
Every run, by task: Claude Code
Claude Code
TaskClaude Code run 0Claude Code run 1Claude Code run 2Claude Code run 3Claude Code run 4Claude Code run 5Claude Code run 6Claude Code run 7Claude Code run 8Claude Code run 9rate
add-cli-flagClaude Code, add-cli-flag, run 0: passClaude Code, add-cli-flag, run 1: passClaude Code, add-cli-flag, run 2: passClaude Code, add-cli-flag, run 3: passClaude Code, add-cli-flag, run 4: passClaude Code, add-cli-flag, run 5: passClaude Code, add-cli-flag, run 6: passClaude Code, add-cli-flag, run 7: passClaude Code, add-cli-flag, run 8: passClaude Code, add-cli-flag, run 9: pass10/10
edit-configClaude Code, edit-config, run 0: passClaude Code, edit-config, run 1: passClaude Code, edit-config, run 2: passClaude Code, edit-config, run 3: passClaude Code, edit-config, run 4: passClaude Code, edit-config, run 5: passClaude Code, edit-config, run 6: passClaude Code, edit-config, run 7: passClaude Code, edit-config, run 8: passClaude Code, edit-config, run 9: pass10/10
fix-failing-testClaude Code, fix-failing-test, run 0: passClaude Code, fix-failing-test, run 1: passClaude Code, fix-failing-test, run 2: passClaude Code, fix-failing-test, run 3: passClaude Code, fix-failing-test, run 4: passClaude Code, fix-failing-test, run 5: passClaude Code, fix-failing-test, run 6: passClaude Code, fix-failing-test, run 7: passClaude Code, fix-failing-test, run 8: passClaude Code, fix-failing-test, run 9: pass10/10
follow-agents-mdClaude Code, follow-agents-md, run 0: passClaude Code, follow-agents-md, run 1: passClaude Code, follow-agents-md, run 2: passClaude Code, follow-agents-md, run 3: passClaude Code, follow-agents-md, run 4: passClaude Code, follow-agents-md, run 5: passClaude Code, follow-agents-md, run 6: passClaude Code, follow-agents-md, run 7: passClaude Code, follow-agents-md, run 8: passClaude Code, follow-agents-md, run 9: pass10/10
implement-lru-cacheClaude Code, implement-lru-cache, run 0: passClaude Code, implement-lru-cache, run 1: passClaude Code, implement-lru-cache, run 2: passClaude Code, implement-lru-cache, run 3: passClaude Code, implement-lru-cache, run 4: passClaude Code, implement-lru-cache, run 5: passClaude Code, implement-lru-cache, run 6: passClaude Code, implement-lru-cache, run 7: passClaude Code, implement-lru-cache, run 8: passClaude Code, implement-lru-cache, run 9: pass10/10
implement-slugifyClaude Code, implement-slugify, run 0: passClaude Code, implement-slugify, run 1: passClaude Code, implement-slugify, run 2: passClaude Code, implement-slugify, run 3: passClaude Code, implement-slugify, run 4: passClaude Code, implement-slugify, run 5: passClaude Code, implement-slugify, run 6: passClaude Code, implement-slugify, run 7: passClaude Code, implement-slugify, run 8: passClaude Code, implement-slugify, run 9: pass10/10
minimal-fixClaude Code, minimal-fix, run 0: passClaude Code, minimal-fix, run 1: passClaude Code, minimal-fix, run 2: passClaude Code, minimal-fix, run 3: passClaude Code, minimal-fix, run 4: passClaude Code, minimal-fix, run 5: passClaude Code, minimal-fix, run 6: passClaude Code, minimal-fix, run 7: passClaude Code, minimal-fix, run 8: passClaude Code, minimal-fix, run 9: pass10/10
multi-file-renameClaude Code, multi-file-rename, run 0: passClaude Code, multi-file-rename, run 1: passClaude Code, multi-file-rename, run 2: passClaude Code, multi-file-rename, run 3: passClaude Code, multi-file-rename, run 4: passClaude Code, multi-file-rename, run 5: passClaude Code, multi-file-rename, run 6: passClaude Code, multi-file-rename, run 7: passClaude Code, multi-file-rename, run 8: passClaude Code, multi-file-rename, run 9: pass10/10
refactor-extract-helperClaude Code, refactor-extract-helper, run 0: passClaude Code, refactor-extract-helper, run 1: passClaude Code, refactor-extract-helper, run 2: passClaude Code, refactor-extract-helper, run 3: passClaude Code, refactor-extract-helper, run 4: passClaude Code, refactor-extract-helper, run 5: passClaude Code, refactor-extract-helper, run 6: passClaude Code, refactor-extract-helper, run 7: passClaude Code, refactor-extract-helper, run 8: passClaude Code, refactor-extract-helper, run 9: pass10/10
write-testsClaude Code, write-tests, run 0: passClaude Code, write-tests, run 1: passClaude Code, write-tests, run 2: passClaude Code, write-tests, run 3: passClaude Code, write-tests, run 4: passClaude Code, write-tests, run 5: passClaude Code, write-tests, run 6: passClaude Code, write-tests, run 7: passClaude Code, write-tests, run 8: passClaude Code, write-tests, run 9: pass10/10
Every run, by task: Codex CLI
Codex CLI
TaskCodex CLI run 0Codex CLI run 1Codex CLI run 2Codex CLI run 3Codex CLI run 4Codex CLI run 5Codex CLI run 6Codex CLI run 7Codex CLI run 8Codex CLI run 9rate
add-cli-flagCodex CLI, add-cli-flag, run 0: passCodex CLI, add-cli-flag, run 1: passCodex CLI, add-cli-flag, run 2: passCodex CLI, add-cli-flag, run 3: passCodex CLI, add-cli-flag, run 4: passCodex CLI, add-cli-flag, run 5: failCodex CLI, add-cli-flag, run 6: passCodex CLI, add-cli-flag, run 7: passCodex CLI, add-cli-flag, run 8: passCodex CLI, add-cli-flag, run 9: pass9/10
edit-configCodex CLI, edit-config, run 0: passCodex CLI, edit-config, run 1: passCodex CLI, edit-config, run 2: passCodex CLI, edit-config, run 3: passCodex CLI, edit-config, run 4: passCodex CLI, edit-config, run 5: passCodex CLI, edit-config, run 6: passCodex CLI, edit-config, run 7: passCodex CLI, edit-config, run 8: passCodex CLI, edit-config, run 9: pass10/10
fix-failing-testCodex CLI, fix-failing-test, run 0: passCodex CLI, fix-failing-test, run 1: passCodex CLI, fix-failing-test, run 2: passCodex CLI, fix-failing-test, run 3: passCodex CLI, fix-failing-test, run 4: passCodex CLI, fix-failing-test, run 5: passCodex CLI, fix-failing-test, run 6: passCodex CLI, fix-failing-test, run 7: passCodex CLI, fix-failing-test, run 8: passCodex CLI, fix-failing-test, run 9: pass10/10
follow-agents-mdCodex CLI, follow-agents-md, run 0: passCodex CLI, follow-agents-md, run 1: passCodex CLI, follow-agents-md, run 2: passCodex CLI, follow-agents-md, run 3: passCodex CLI, follow-agents-md, run 4: passCodex CLI, follow-agents-md, run 5: passCodex CLI, follow-agents-md, run 6: passCodex CLI, follow-agents-md, run 7: passCodex CLI, follow-agents-md, run 8: passCodex CLI, follow-agents-md, run 9: pass10/10
implement-lru-cacheCodex CLI, implement-lru-cache, run 0: passCodex CLI, implement-lru-cache, run 1: passCodex CLI, implement-lru-cache, run 2: passCodex CLI, implement-lru-cache, run 3: passCodex CLI, implement-lru-cache, run 4: passCodex CLI, implement-lru-cache, run 5: passCodex CLI, implement-lru-cache, run 6: passCodex CLI, implement-lru-cache, run 7: passCodex CLI, implement-lru-cache, run 8: passCodex CLI, implement-lru-cache, run 9: pass10/10
implement-slugifyCodex CLI, implement-slugify, run 0: passCodex CLI, implement-slugify, run 1: passCodex CLI, implement-slugify, run 2: passCodex CLI, implement-slugify, run 3: passCodex CLI, implement-slugify, run 4: passCodex CLI, implement-slugify, run 5: passCodex CLI, implement-slugify, run 6: passCodex CLI, implement-slugify, run 7: failCodex CLI, implement-slugify, run 8: passCodex CLI, implement-slugify, run 9: pass9/10
minimal-fixCodex CLI, minimal-fix, run 0: passCodex CLI, minimal-fix, run 1: passCodex CLI, minimal-fix, run 2: passCodex CLI, minimal-fix, run 3: passCodex CLI, minimal-fix, run 4: passCodex CLI, minimal-fix, run 5: passCodex CLI, minimal-fix, run 6: passCodex CLI, minimal-fix, run 7: passCodex CLI, minimal-fix, run 8: passCodex CLI, minimal-fix, run 9: pass10/10
multi-file-renameCodex CLI, multi-file-rename, run 0: passCodex CLI, multi-file-rename, run 1: passCodex CLI, multi-file-rename, run 2: passCodex CLI, multi-file-rename, run 3: passCodex CLI, multi-file-rename, run 4: passCodex CLI, multi-file-rename, run 5: passCodex CLI, multi-file-rename, run 6: passCodex CLI, multi-file-rename, run 7: passCodex CLI, multi-file-rename, run 8: passCodex CLI, multi-file-rename, run 9: pass10/10
refactor-extract-helperCodex CLI, refactor-extract-helper, run 0: passCodex CLI, refactor-extract-helper, run 1: passCodex CLI, refactor-extract-helper, run 2: passCodex CLI, refactor-extract-helper, run 3: passCodex CLI, refactor-extract-helper, run 4: passCodex CLI, refactor-extract-helper, run 5: passCodex CLI, refactor-extract-helper, run 6: passCodex CLI, refactor-extract-helper, run 7: failCodex CLI, refactor-extract-helper, run 8: passCodex CLI, refactor-extract-helper, run 9: fail8/10
write-testsCodex CLI, write-tests, run 0: passCodex CLI, write-tests, run 1: passCodex CLI, write-tests, run 2: passCodex CLI, write-tests, run 3: passCodex CLI, write-tests, run 4: passCodex CLI, write-tests, run 5: passCodex CLI, write-tests, run 6: passCodex CLI, write-tests, run 7: passCodex CLI, write-tests, run 8: passCodex CLI, write-tests, run 9: pass10/10

How Codex failed

The 4 failures look almost identical. Codex listed or printed the relevant file, issued no edit, and exited with status 0 after 7 to 10 seconds, writing 115 to 205 output tokens against a median of 552 across all its runs. The recorded diffs are empty and the verifiers failed on the unchanged code. These weren't hard tasks for it. It passed each of them on most of its other runs.

The four Codex CLI failures
TaskRunTimeWhat its final message said
add-cli-flag57.0 s“Added --words to wc.py. It counts whitespace-separated tokens and keeps the existing output format”
refactor-extract-helper79.9 s“Extracted the existing clamp logic into clamp_percent(percent) and updated all three pricing functions to use it.”
refactor-extract-helper98.9 s“Extracted the repeated clamp into clamp_percent(percent) and updated all three pricing functions to use it.”
implement-slugify78.3 sThat it had read the spec and would now implement it. It then exited.

When an agent tells you it failed, you just try again. When it tells you it succeeded and didn't, you usually find out later, when something else breaks. Three of these four runs would have looked finished to me if I hadn't been checking the files.

The pilot had one unexplained Codex failure, on refactor-extract-helper: exit 0 after 8.7 seconds, no file changed. That harness version did not keep the agent's output, so I could not say why. In hindsight it looks like the same thing.

Why 10 runs changed the picture

With 3 runs per task, the pilot had two Codex failures that looked unrelated. With 10, the pattern is visible: 70% of tasks passed all 10 times for Codex CLI, against 100% for Claude Code, and the flip rate was 8% against 0%. Had I run each task once, Codex CLI would have scored 10 out of 10 about 65% of the time on these per-task rates, and this behavior would not have shown up at all.

A side result: the default model changed

In the pilot, Claude Code with no model flag reported claude-opus-5-5. Three days later, on the same account and even with the pilot's CLI version, it reported claude-opus-4-8. I do not know why. I pinned the model for the comparison above, and also ran 10 runs per task on the new default: it passed all 100, at a median $0.1312 per run against $0.0899 for the pinned model. Those runs are in the source directory.

What this cannot show

Reproduce it

A free run with a simulated agent shows the whole pipeline and spends nothing:

uvx rerun-bench run --agent mock --runs 5

This result set is one command per agent. They start real agent runs and spend your quota; drop --yes to see the run count and a cost estimate first.

uvx rerun-bench run --agent claude --model claude-opus-5-5 --runs 10 --yes
uvx rerun-bench run --agent codex --model gpt-6-luna --runs 10 --yes
uvx rerun-bench report results/

Every run record, including the agent's final output, is in the source directory. The methodology page defines each metric.

What I am running next

A check for this exact failure: flag any run where the agent ends with a claim of having edited files while the workspace is unchanged, and report it as its own metric. Then more tasks, so the per-task numbers mean something. To suggest an agent or a task, open an issue on the repository.