Benchmarks

Measured. Not claimed.

Six coding sessions, from an 8-turn fix to a 120-turn audit, replayed through Dulus, six other agent harnesses and a naive control on byte-identical transcripts, with one tokenizer and one price table. Dulus came first under all five weightings, and cost less in all 42 head-to-head matchups.

Arena
1.0.0
Run
2026-10-18 06:07 UTC
Commit
097aa216dc
Wall clock
7.2 s
  • $25.63

    for all six sessions

    Claude Code, the next cheapest, costs $48.00 for the same work. Dulus costs 46.6% less.

  • 9

    cache-prefix breaks

    Claude Code: 74. GitHub Copilot: 220. Every break bills tokens already sent at full price again.

  • 0

    context overflows

    Its largest prompt was 139.8k tokens of a 200k window, in sessions up to 120 turns long. GitHub Copilot overflowed on 222 turns.

How to read every number on this page

  • Measured

    Dulus. The arena runs Dulus’s own context code on the transcript: the lookback window and the two-layer compaction.

  • Modelled

    The other six. Each product’s context policy is replayed as a behaviour — grow, window, or summarise at a threshold — on the byte-identical transcript. It is not their source code.

  • Same instrument

    Everyone. One tokenizer and one price table, cache-read discount included. The scenarios are synthetic, calibrated to real agent work.

01 · The bill

Same six sessions. The smallest bill.

What all six sessions cost each harness, priced from one table with the cache-read discount included. Dulus: $25.63. Claude Code, the next cheapest: $48.00.

Fig. 01 Session cost and billed prompt tokens, summed over the six scenarios
Harness Session cost Billed prompt tokens
DulusMeasured $25.63 18.52M tokens
Claude CodeModelled $48.00 32.13M tokens
Codex CLIModelled $49.38 31.59M tokens
CursorModelled $50.75 30.23M tokens
ClineModelled $53.65 27.86M tokens
AiderModelled $92.49 243.97M tokens
GitHub Copilot agent modeModelled $373.53 71.71M tokens
Naive loopControl $719.29 243.97M tokens
  • The scale stops at $100. The two longer bars are cut, and their value is printed.
  • Aider’s figure is an upper bound: its real repo map is token-budgeted, which the modelled shape doesn’t credit.
  • The naive loop is the control: the full transcript on every turn, no cache, no trimming.

02 · The window

Under the line. Every turn.

A prompt bigger than the model’s window doesn’t run slowly: it fails. Across all six scenarios, Dulus never sent one. Its largest prompt was 139.8k tokens, of a 200k window.

Fig. 02 Prompt size on every turn of the Marathon audit: 120 turns on claude-sonnet-4-6, with its 200k window
  • Dulus
  • Claude Code
  • GitHub Copilot
  • Naive loop and Aider
  • 200k model window

The Marathon audit, per harness
HarnessLargest promptCutsTurns over the window
Dulus134,11230
Claude Code182,719170
GitHub Copilot289,280108105
Naive loop and Aider2,357,3830110

The gold dots mark Dulus’s 3 cuts: turns where the cached head of the prompt was rewritten and billed again at full price. Its smaller dips are the uncached tail changing size, while the cached head keeps growing. Claude Code cut 17 times, at every sharp drop in its line. The naive loop never cuts: it crosses the window at turn 11 and leaves the chart at turn 16, and Aider’s modelled curve is the same line.

Fig. 03 All six scenarios: the largest prompt each harness sent, and how many of the 288 turns went over the window
Harness Largest prompt, against a 200k window Turns over the window
Dulus139,8050 over the window
Claude Code183,4051 over the window
Codex CLI183,1921 over the window
Cursor182,9941 over the window
Cline182,4991 over the window
GitHub Copilot604,731222 over the window
Aider2,357,383240 over the window
Naive loop2,357,383240 over the window

The one overflow each for Claude Code, Codex CLI, Cursor and Cline came in the cheap-model session, where deepseek-chat has a 64k window: each crossed it at turn 20. Dulus peaked there at 41,151 tokens.

03 · The cache

The cache holds.

A provider bills the cached part of a prompt at a steep discount, but only while the start of the prompt stays exactly the same. Rewrite that head and every token in it is billed at full price again. Over 288 turns, Dulus rewrote it 9 times.

Fig. 04 Cache-prefix breaks, summed over the six scenarios. One square, one break.
  • Dulus9
  • Claude Code74
  • Codex CLI79
  • Cursor88
  • Cline102
  • GitHub Copilot220
  • Aider, naive loop0They never trim, so they never break the prefix. They overflow the window on 240 turns instead.

Not the highest hit rate. The lowest bill.

Claude Code’s modelled policy serves 62.2% of its prompt tokens from the cache, on average; Dulus, 61.2%. Claude Code re-sends more, and more of what it re-sends hits. Dulus keeps its cache intact while sending far less, so it pays least.

Prompt-cache hit ratio, mean

Dulus61.2%

Claude Code62.2%

Prompt tokens sent, all six sessions

Dulus18.52M

Claude Code32.13M

On a real bill

One account · real usage

70.4%

cache hit rate, October 12–18, 2026

155.7M input tokens that week

October 12 alone

  • 82.1M cached
  • 40.3M uncached

Our own account, building with Dulus, as the model provider’s usage dashboard reports it. Real sessions on one account: a different instrument from the arena, so the two hit rates don’t compare.

04 · How it works

Four mechanisms. All in the Windows app.

No setting to find, nothing to install. This is how the agent in the Windows app handles context out of the box.

  1. A cache that holds

    The lookback window is anchored with hysteresis: it grows for a while instead of sliding every turn. It cuts the head only when the hidden part is at least twice the kept window, a cache-payoff gate; below that, the whole archive goes out and the cache absorbs it. Earlier images and reasoning stay where they were, so they never force a rewrite.

    9

    prefix breaks in 288 turns. The others that trim: 74 to 220.

    hidden ≥ 2 × kept cut the head

    otherwise send it all; the cache absorbs it

  2. Lookback and Loopback

    Only the last 20 user turns go to the API by default, and you can set anywhere from 2 to 250. The cut falls on user-turn boundaries, so every tool call stays paired with its result. The whole conversation stays on your machine, and the agent searches it itself with its Loopback tool: status, show, head, search.

    The trade, said plainly: the model sees 28.0% of old history verbatim, against 46.1% for Claude Code. Loopback is how it gets the rest back. Dulus is the only harness in the arena whose agent can re-read dropped history: measured for Dulus, estimated as absent for the other six.

    20

    user turns sent, by default. From 2 to 250.

  3. A Python console for the model

    The Python tool is a persistent kernel: variables, imports and data survive between calls. So the model keeps big data in the kernel’s memory instead of the conversation, and only the slice it prints enters the context. An infinite loop or a crash kills the kernel, never Dulus, and it restarts on the next call.

    20,000

    characters per stream at most, capped at the source. Timeout: 30 s by default, up to 300 s.

    >>> runs = load("ci/") stays in the kernel

    >>> failing(runs)[:3] only this reaches the context

  4. MemPalace

    Memory is markdown, filed in a palace of halls that you can open and edit. The essentials, short_memory and the gold memories, load at the start of every session, on every surface. The agent saves what it learns and searches the palace with its own memory tools.

    Every session

    the essentials load first: short_memory and the gold memories.

    • soul
    • facts
    • events
    • discoveries
    • preferences
    • advice
Fig. 05 The context toolkit across the field, with the evidence behind every cell
Capability Dulus Claude Code Codex CLI Cursor Cline Aider GitHub Copilot
Context compaction YesMeasured YesVendor-public YesVendor-public YesEstimated YesVendor-public NoEstimated No data
Sliding history window YesMeasured NoEstimated NoEstimated No data YesEstimated NoEstimated YesEstimated
Cache-aware truncation gate YesMeasured NoEstimated NoEstimated No data No data NoEstimated No data
Agent can re-read dropped history YesMeasured NoEstimated NoEstimated NoEstimated NoEstimated NoEstimated NoEstimated

Dulus’s four are measured. Most cells for the other products are estimates, and are marked that way: read them as the arena’s best guess, not a finding. The arena tracks 21 capabilities in all; these four are the ones this page is about, and the dossier lists every one.

05 · Head to head

42 matchups. 42 cheaper.

Every scenario against every challenger. Each cell is the challenger’s cost divided by Dulus’s on the same scenario, with a 95% interval from a paired bootstrap over per-turn costs. Above 1, Dulus is cheaper. All 42 intervals sit above it.

Fig. 06 Challenger cost ÷ Dulus cost, by scenario. Each cell: the ratio, then its 95% interval.
Scenario Claude Code Codex CLI Cursor Cline Aider GitHub Copilot Naive loop
Quick fix8 turns · claude-sonnet-4-6 1.113×1.047–1.208 1.113×1.047–1.208 1.113×1.047–1.208 1.113×1.047–1.208 1.113×1.047–1.208 1.113×1.047–1.208 3.063×2.056–4.533
Feature build30 turns · claude-sonnet-4-6 1.298×1.187–1.425 1.296×1.186–1.422 1.307×1.154–1.529 1.336×1.139–1.573 1.646×1.520–1.774 8.936×6.762–11.161 9.215×7.640–10.828
Deep refactor60 turns · claude-sonnet-4-6 1.664×1.440–1.938 1.732×1.482–2.023 1.733×1.499–1.996 1.937×1.641–2.243 3.102×2.757–3.500 15.019×13.171–17.020 22.595×19.205–26.522
Marathon audit120 turns · claude-sonnet-4-6 1.465×1.336–1.613 1.488×1.363–1.632 1.448×1.329–1.590 1.492×1.348–1.640 4.893×4.432–5.384 15.115×13.966–16.355 41.446×36.801–46.413
Retrieval-heavy40 turns · claude-sonnet-4-6 2.974×2.533–3.441 3.085×2.624–3.542 3.367×2.922–3.825 3.537×3.112–4.022 2.637×2.312–2.997 15.522×12.538–18.566 17.944×14.696–21.538
Feature build on a cheap model30 turns · deepseek-chat 2.446×2.024–2.889 2.491×2.077–2.913 2.531×2.140–2.960 2.601×2.217–3.016 3.183×2.674–3.777 9.166×6.811–11.782 10.177×8.144–12.514
  • 1.11×

    The closest: the 8-turn quick fix. None of the six products has trimmed yet, so they share one ratio, and Dulus still costs less.

  • 15.5×

    The widest against a product: GitHub Copilot, on retrieval-heavy.

  • 41×

    Against the naive loop, on the 120-turn marathon audit.

Retrieval-heavy is built to be hard on sliding windows, Dulus’s included: nearly every turn drags in a large retrieval blob that the model may need again later.

06 · Any weighting

Weigh it any way. Still first.

What counts as best depends on what you weigh. So the arena re-scores every harness under five published profiles, from someone paying the bill to someone who needs the agent never to forget the plan. Dulus placed first under all five.

Fig. 07 Scores from 0 to 1 under each weight profile
  1. Neutral

    Every metric counts the same.

    Dulus 0.847

    Runner-up Cursor 0.760

  2. Cost-first

    Someone paying the bill.

    Dulus 0.931

    Runner-up Claude Code 0.856

  3. Fidelity-first

    Someone who needs the agent not to forget the plan.

    Dulus 0.764

    Runner-up Cursor 0.757

  4. Capability-first

    Someone shopping for features.

    Dulus 0.934

    Runner-up Cline 0.690

  5. Arena default

    The catalogue’s own weights.

    Dulus 0.909

    Runner-up Cursor 0.824

The closest call is fidelity-first, which puts the most weight on keeping history and showing it verbatim: Dulus 0.764, Cursor 0.757.

All 40 scores, with ranks
HarnessNeutralCost-firstFidelity-firstCapability-firstArena default
Dulus0.847 #10.931 #10.764 #10.934 #10.909 #1
Claude Code0.752 #30.856 #20.751 #30.590 #40.810 #4
Codex CLI0.748 #50.851 #30.748 #50.589 #50.806 #5
Cursor0.760 #20.849 #40.757 #20.683 #30.824 #2
Cline0.748 #40.836 #50.749 #40.690 #20.818 #3
Aider0.586 #60.628 #60.687 #60.487 #60.526 #6
GitHub Copilot0.489 #70.469 #70.595 #70.487 #70.488 #7
Naive loop0.333 #80.158 #80.556 #80.171 #80.235 #8

07 · Method

How it was measured. And what wasn’t.

The Dulus Benchmark Arena builds one transcript per scenario from a fixed seed, runs it through each harness’s context policy, and prices every turn the same way. Here is exactly what that means, and where it stops.

  • Measured

    Dulus, and the control

    The arena runs Dulus’s own context code: it snips old tool results, strips stale injections and applies the lookback window, with the window’s anchor kept across turns so the cache-payoff gate and the hysteresis are really exercised. The one stand-in is the summary card, a fixed-size surrogate, because writing it would need a live model call. The naive control is the arena’s own reference loop.

  • Modelled

    The other six

    Each product’s context policy is a behavioural shape: grow, window, or summarise at a threshold. It is replayed on the same transcript, and it is not that product’s source code. Where the shape is generous to a competitor, the arena says so.

  • Claimed

    Capabilities

    Every capability carries its tier and a citation. Several rows were corrected upward for competitors against this project’s own older marketing, and an unknown is recorded as unknown, never scored as zero.

Fig. 08 The field, and how much each row can be trusted
HarnessContext policyEvidence quality
DulusMeasuredLookback window and two-layer compactionEvidence quality 92%
Claude CodeModelledFull context, late auto-compactEvidence quality 40%
Codex CLIModelledFull context, late compactionEvidence quality 37%
CursorModelledEditor-scoped context, mid-window summarisationEvidence quality 41%
ClineModelledVisible context bar, truncate on pressureEvidence quality 40%
AiderModelledRepo map and full chat historyEvidence quality 44%
GitHub Copilot agent modeModelledBounded turn window, retrieval-assembledEvidence quality 43%
Naive loopMeasuredFull transcript, no cache, no trimmingEvidence quality 100%

Evidence quality is the mean strength of the evidence behind a harness’s rows, from measured at the top to unknown at zero. It is never scored; it tells you how much to trust the rest.

Six scenarios

  • Quick fix8 turnsRead a file, spot a bug, patch it, run the tests.
  • Feature build30 turnsGrep, read several modules, write code, run tests, iterate: the median real session.
  • Deep refactor60 turnsMany files, large diffs, repeated full-file reads.
  • Marathon audit120 turnsLong-horizon work, like a security sweep or a migration.
  • Retrieval-heavy40 turnsNearly every turn drags in a large retrieval blob.
  • Feature build on a cheap model30 turnsThe same feature build, routed to a low-cost model.

The first five run on claude-sonnet-4-6 with a 200k window; the last on deepseek-chat, with 64k.

One instrument

Tokens
compaction.estimate_tokens, an estimate: characters ÷ 2.8, plus 4 per message, plus 10%.
Prices
providers.calc_cost, with the cache-read discount.
Intervals
Paired bootstrap over per-turn costs, 95%. An interval that touches parity counts as no difference, not a win.
Weights
Five published profiles. Rank stability is the share that agree on first place.

Caveats, in full

  1. The other six are models of a strategy. Not the products’ code. The cost curves compare strategies; they don’t measure shipped software.
  2. Their rows rest on weaker evidence. Evidence quality is 37–44% for the six products and 92% for Dulus, so their rows deserve less weight than the arithmetic implies.
  3. One input matters most. Claude Code’s compaction threshold is the most sensitive number in the arena.
  4. Aider’s cost is an upper bound. Its repo map is token-budgeted in a way the modelled shape doesn’t credit.
  5. Token counts are estimates. The same estimate for everyone, so comparisons are fair; absolute counts are approximate.
  6. The scenarios are synthetic. Shaped like real agent work, not sampled from it.
  7. Nothing here measures output quality. The arena measures what a session costs and what the model can still see, not whether the code it writes is good.
  8. Dulus shows the model less. 28.0% of old history verbatim on the wire, against 46.1% for Claude Code. Loopback is the mitigation, and it sits on a different axis.
  9. The capability list comes from the arena’s authors, who also make Dulus. Capability coverage feeds every profile, so read the capability-first ranking with that in mind.

Provenance tiers, strongest first

Measured
Computed by running code in the Dulus repository.
Documented
Taken from a primary source, read directly.
Vendor-public
A vendor’s published figure.
Repo-doc
A claim from this project’s own docs: self-reported.
Estimated
Modelled from a stated assumption, not measured.
No data
Not found. Skipped by the scorer, never counted as zero.

The full dossier

Every chart, every matchup, every caveat.

28 pages: the method, all twelve charts, the 42 matchups with their intervals, the full capability record and the caveats.

Arena
1.0.0
Run
2026-10-18 06:07 UTC
Commit
097aa216dc
Test suite
4,105 tests in 256 files
Download the full dossier (PDF)

PDF · 28 pages · 1.75 MB

Six sessions measured. The seventh is yours.

Get the Windows app. The lookback window, the cache gate, Loopback, the Python console and MemPalace come with it.

esc

Actions