When Codex took over a bug Claude Code had already found, a Friday hand-off used a median of 21% fewer tokens than starting Codex over, and Codex explored half as much before its first edit. We ran 14 tasks, 6 of them in Express, the most used Node web framework. Every fix passed the project’s own tests.
What did it measure?
Claude Code first found and explained a bug, changing nothing. Then Codex fixed it three ways, each in its own fresh copy, with one message from the person: a Friday hand-off with a one-line note, a fresh Codex session with the task restated, and a fresh Codex session with Claude Code’s whole answer pasted in.
Everything was measured from Friday’s session log, not the tools’ own claims, and checked by running the project’s own tests in the folder Codex worked in.
What held, against starting over?
- Tokens: fewer in 13 of 14 tasks, a median of 21% (about 49,000 per hand-off), and 592,827 in total. In Express alone, fewer in 6 of 6.
- Exploring before the first edit: a median of 2 steps against 4, fewer in 14 of 14.
- First edit sooner in 12 of 14, and finished sooner in 11 of 14, by a median of about 7 seconds. In Express alone the finish times were even, so we make no speed claim.
- Fixed: 14 of 14 every way. In Express, all 1,288 of its tests passed after every fix.
What did not hold?
Pasting Claude Code’s whole answer into Codex by hand did about as well: the same tokens and the same exploring, and in Express it finished faster. So we make no claim against a careful copy and paste. What a hand-off gives you is that handover, with what was asked, what was found, which files were read and what was run, in one click, every time.
Why do fewer tokens matter?
Coding agents on Claude and ChatGPT plans stop you at a usage limit rather than billing per token. Codex hit our own plan’s limit twice during this benchmark. As an estimate from the median, 21% fewer tokens per hand-off is about a quarter more hand-offs before you reach your limit.
Express: the results
| Median, Codex’s fixing run | Friday hand-off | Fresh, task restated | Fresh, answer pasted |
|---|---|---|---|
| Fixed (all 1,288 tests pass) | 6 of 6 | 6 of 6 | 6 of 6 |
| Total tokens | about 182k | about 234k | about 182k |
| Steps before first edit | 2 | 4 | 2 |
| Time to first edit | 29s | 32s | 28s |
| Wall time | 58s | 59s | 49s |
| Task and repetition | Hand-off: wall, first edit, steps | Restated: wall, first edit, steps | Pasted: wall, first edit, steps |
|---|---|---|---|
| cookie-maxage 1 | 64s, 36s, 2 | 60s, 32s, 4 | 50s, 27s, 2 |
| proxy-protocol 1 | 52s, 28s, 2 | 59s, 39s, 4 | 48s, 26s, 2 |
| merge-params 1 | 58s, 27s, 2 | 61s, 32s, 4 | 48s, 30s, 2 |
| query-parser 1 | 58s, 28s, 2 | 55s, 32s, 4 | 46s, 23s, 2 |
| charset 1 | 55s, 29s, 2 | 61s, 34s, 5 | 58s, 32s, 2 |
| cookie-maxage 2 | 65s, 37s, 3 | 52s, 30s, 4 | 58s, 34s, 3 |
Small library: the results
| Median, Codex’s fixing run | Friday hand-off | Fresh, task restated | Fresh, answer pasted |
|---|---|---|---|
| Fixed (all tests pass) | 8 of 8 | 8 of 8 | 8 of 8 |
| Steps before first edit | 1.5 | 4 | 2 |
| Time to first edit | 35s | 56s | 44s |
| Wall time | 46s | 64s | 54s |
| Task and repetition | Hand-off: wall, first edit, steps | Restated: wall, first edit, steps | Pasted: wall, first edit, steps |
|---|---|---|---|
| slug 1 | 92s, 75s, 2 | 102s, 89s, 6 | 50s, 40s, 5 |
| query 1 | 40s, 30s, 2 | 47s, 37s, 4 | 57s, 46s, 2 |
| date 1 | 60s, 46s, 2 | 82s, 74s, 4 | 76s, 64s, 2 |
| limiter 1 | 92s, 79s, 1 | 105s, 95s, 3 | 67s, 61s, 1 |
| cart 2 | 34s, 21s, 1 | 72s, 64s, 4 | 51s, 43s, 2 |
| slug 2 | 52s, 40s, 2 | 55s, 48s, 5 | 78s, 62s, 4 |
| date 2 | 37s, 31s, 1 | 46s, 36s, 4 | 33s, 27s, 2 |
| limiter 2 | 28s, 22s, 1 | 36s, 26s, 3 | 26s, 20s, 2 |
Tokens and every other field are in the raw data: Express and small library.
How was it set up?
- When: 13 and 14 October 2026, on one Windows 11 laptop (Intel Core i7-1255U, 16 GB RAM).
- Tools: Claude Code 2.1.251 on Sonnet, and Codex CLI 0.159.3 on gpt-6.1-sol, signed in to our own accounts, run through Friday in Auto mode, with Friday’s second review and decision log off.
- Express 4.21.2: 4,050 lines of core and 1,288 tests. Five one-line bugs planted in its core: cookies, proxy headers, nested routers, the query parser and charsets. The failing test often points away from the cause.
- Small library: 96 lines of JavaScript and 5 tests, with five one-line bugs, each in a different file from its failing test.
- Each task ran twice, every run in its own fresh copy of the code.
What was set aside?
Codex’s plan limit refused runs twice. A task’s three ways are compared together, so a task where any was refused is set aside whole, not counted as a failure: 4 tasks in Express’s second repetition and 2 in the small library. Two runs that failed to start were rerun. One check was corrected: a fix that also added tests was first marked failed, though every test passed.
What are the limits?
- 14 tasks, one-line bugs, one machine and one account.
- Claude Code handing to Codex only.
- The saving should grow with longer investigations, where there is more to re-read. That is a hypothesis we have not measured yet.
- Cursor background agents and Codex cloud were not run. They need their own cloud products, which this setup could not drive fairly.