Benchmarks

Every number we publish, with its conditions.

Sample size beside every mean, the tool that produced it, the harness it ran on, and a link to the raw data. Including the rows where we lose, because in this category the number worth having is not the biggest one, it is the one that survives someone else running it.

Measured
August 2026
Compared against
CodeGraph 1.5.0, Graphify 0.9.31, Serena 1.6.2.dev0, code-review-graph 2.3.7, CodeScene
Raw data
repowise-bench
-31.6%
Output tokens against a bare agent, on Codexn = 43 · p = <0.0001 · Codex (gpt-5.6-sol) · django/django at a single pinned commit · 2026-08
0.876
File coverage, get_answer, on 42 sealed instancesn = 42 · p = 0.00004 · ContextBench, 42 sealed instances, Python and Go · 2026-08
0.74
ROC AUC predicting which files get bug-fixed over the next six monthsn = 2,826 · 21 repositories, 9 languages, 2,826 files · 2026-08
22x
How much slower we index than CodeGraph, like for liken = 1 · django/django at a single pinned commit · 2026-08
On this page

Why this page is built this way

In July 2026, JetBrains took two popular token-saving tools and reran their headline claims on real agent work. Caveman advertised a 65% saving and measured 8.5%. RTK advertised 60 to 90% and came back 7.6% more expensiveat low reasoning effort. Greptile's 82% became 45%under Augment's rerun.

Three independent collapses is not bad luck. In this category the advertised number and the reran number are routinely different numbers, and they are different for a reason worth understanding before reading anything below.

Measuring one context load is easy. Measuring an agent loop is hard.

You can show that your representation of a file is smaller than the file. That is a real measurement and it is the one almost everybody publishes. It is also not the question anyone actually has, which is whether an agent given your tool finishes the job having done less work. Agents re-read, backtrack, re-plan and re-explore. A compression that looks like 90% on one payload routinely nets out near zero across a real session, and can go negative when the agent has to work harder to recover what you compressed away.

This page publishes both numbers and labels which is which. Section 3 is the one-payload figure. Section 2 is the agent-loop figure, and it is deliberately the smaller one.

Two honest measurements of the same tool. Measuring one payload, get_context uses 35.6x fewer tokens than reading every changed file (n = 30 · pallets/flask, 30 most recent non-merge commits · 2026-08). Measuring one agent session instead, output tokens fall by 31.6% against a bare agent (n = 43 · p = <0.0001 · Codex (gpt-5.6-sol) · django/django at a single pinned commit · 2026-08). Both are real and neither substitutes for the other.

One payload, not a session. It says our representation of a commit is smaller than the commit. Whether an agent finishes faster is a different question, and its answer is the more modest 31.6%. One repository, one commit, one prompt, and single-session questions of four to seven turns. Not a universal saving.

Fig. 1The same tool, the same codebase, two measurements. One counts the bytes in a single payload. The other counts what an agent wrote to reach an answer across a whole session. Both are correct, and only the second is a claim about work saved.

1. Finding the right files

Before a tool can save an agent any work, it has to point at the right code. This section measures only that. Grading is deterministic and no LLM judge is involved anywhere in the number, which makes it the most reproducible result on the page: ContextBench ships gold file spans, and a tool either returns them or it does not.

Every figure below comes from instances this work has never seen. The 112 instances were split 70 / 42 by instance id, pinned before any of it started, and the 42 were kept sealed until the final measurement.

Finding the right files

File coverage on 42 ContextBench instances pinned before any of this work started and kept sealed until the final measurement. Grading is deterministic and no LLM judge is involved.

ToolFile coveragePrecisionFiles served
repowise (get_answer)0.8760.08719.2
repowise (search_codebase)0.7420.1688.2
CodeGraph0.6100.09314.0
Graphify0.5460.03334.5
code-review-graph0.4450.2405.4

Scroll the table sideways to see every column.

n = 42 sealed instances. Head to head against CodeGraph, get_answer wins 19, loses 1, ties 22, sign test p = 0.00004. The pooled 112-instance figure would be 0.835 and is deliberately not quoted: averaging the halves loses the only number that matters, which is how the tool does on instances it has never seen.

Fig. 2File coverage on the 42 sealed instances. Precision and files served are reported beside coverage because a tool that returns everything scores well on coverage alone.

These are two different tools with two different profiles, and we would rather say so than average them into one claim. get_answer finds the most, from a list of about 19 files. search_codebase finds fewer but is the most efficient per file served, and if you are paying by the token that is the row to read.

File coverage against files served per question, on 42 sealed ContextBench instances. repowise (get_answer): 0.876 file coverage from 19.2 files served per question. repowise (search_codebase): 0.742 file coverage from 8.2 files served per question. CodeGraph: 0.61 file coverage from 14 files served per question. Graphify: 0.546 file coverage from 34.5 files served per question. code-review-graph: 0.445 file coverage from 5.4 files served per question.
File coverage vs files served, 42 sealed ContextBench instances
ToolFile coverageFiles served
repowise (get_answer)0.87619.2
repowise (search_codebase)0.7428.2
CodeGraph0.61014.0
Graphify0.54634.5
code-review-graph0.4455.4

n = 42 sealed instances. Head to head against CodeGraph, get_answer wins 19, loses 1, ties 22, sign test p = 0.00004. The pooled 112-instance figure would be 0.835 and is deliberately not quoted: averaging the halves loses the only number that matters, which is how the tool does on instances it has never seen.

Fig. 3Coverage against files served. The tradeoff is invisible in a single column: search_codebase sits highest on coverage-per-file while get_answer sits highest on raw coverage, and Graphify buys its coverage by returning roughly four times as many files as anyone else.

How this number moved, and why it is not benchmark tuning

We first ran this and came last, at 0.228. We published that. The cause turned out to be a bug: a query-time gate was discarding most candidates before ranking ever happened. Fixing that path is what moved the number, and it is a fix any user of the tool gets rather than a change shaped around these questions.

The check on that claim is the split, and it points the right way. Our score on the sealed half we never saw, 0.876, is higher than our score on the half we tuned against, 0.810. Overfitting makes the unseen half score worse.

And CodeGraph, which nobody tuned against either half, scores 0.6093 and 0.6095 on the two halves. Three decimal places apart. So the halves are equally hard and the gap is about the tool rather than about the questions.

We do not quote a pooled 112-instance figure, though it is easy to compute and would read 0.835. Averaging the halves loses the only number that matters, which is how the tool does on instances it has never seen.

Every arm builds its own index of every instance's repository at that instance's own base commit. Roughly 78 machine-hours for 1,129 graded cells. How we measured · raw data

2. What changes in a real agent loop

This is the section modelled on the JetBrains reruns, and the one we would ask a skeptic to read first. Six arms: repowise, four competing tools, and a bare agent with no tools at all. Every arm got a byte-identical prompt, its full advertised tool surface, and a freshly built index on the same pinned commit. The bare-agent control was verified free of any local hooks, so it is a real control rather than a contaminated one.

Two things have to be true for a tool to be worth mounting. The agent has to actually call it, and the loop has to get leaner when it does. We ran this on two agent harnesses, because the answer turned out to depend on the harness as much as on the tools.

Output tokens per arm on the Codex agent-loop run, against a bare agent (control) of 1,828 tokens. repowise: 1,250 output tokens. CodeGraph: 1,383 output tokens. Serena: 1,550 output tokens. Graphify: 1,658 output tokens. code-review-graph: 1,710 output tokens.
Output tokens per arm, Codex agent-loop run
ToolOutput tokensvs bare agent
repowise1,250-31.6%
CodeGraph1,383-24.4%
Serena1,550-14.8%
Graphify1,658-8.9%
code-review-graph1,710-6.0%
bare agent (control)1,828baseline

Codex (gpt-5.6-sol) on django/django at one pinned commit. Correcting for testing five tools at once, three reductions are solid and two are marginal. 5 of the 48 questions are missing from every arm equally because the run hit an API usage cap, so the figures are over the 43 questions all six arms completed; because all arms lost the same 5, the paired comparisons are unaffected.

Fig. 4Output tokens per question on Codex, against the bare-agent baseline. Output tokens are what the agent itself writes to reach an answer: its reasoning, its tool calls, its final reply. Lower means it went in a straighter line.

What changes in a real agent loop, on Codex

Every question in django's question set, six arms, byte-identical prompts, each tool's full advertised surface, and a freshly built index on the same pinned commit. Every tool was called on every question, so this is like for like.

ToolAgent used itOutput tokensvs bare agentTool callsLeaner onp
repowise44 / 441,250-31.6%3.837 of 44<0.0001
CodeGraph44 / 441,383-24.4%4.037 of 44<0.0001
Serena43 / 431,550-14.8%10.135 of 43<0.0001
Graphify43 / 431,658-8.9%7.431 of 430.003
code-review-graph43 / 431,710-6.0%7.226 of 430.046
bare agent (control)0 / 441,828baseline7.2n/an/a

Scroll the table sideways to see every column.

Codex (gpt-5.6-sol) on django/django at one pinned commit. Correcting for testing five tools at once, three reductions are solid and two are marginal. 5 of the 48 questions are missing from every arm equally because the run hit an API usage cap, so the figures are over the 43 questions all six arms completed; because all arms lost the same 5, the paired comparisons are unaffected.

Fig. 5The full Codex run. Every tool was called on every question here, so this is a like-for-like comparison between tools rather than between agents that ignored them.

repowise leaves the agent with the least work to do, and gets there in the fewest steps: 3.8 tool calls against the bare agent's 7.2, and 3.0 files opened instead of 7.2. One answered question replacing roughly six greps, visible directly in the call counts rather than inferred.

Correcting for testing five tools at once, three reductions are solid and two are marginal. CodeGraph is a genuine second at -24.4%, and the honest reading is that we lead a field in which more than one tool works, not that we are the only one that does. Serena is the interesting counter-case: it writes less than the bare agent while calling tools 42% more often. Busier, not leaner.

The second proof point, on Claude Code

The same six arms, the same servers and the same indexes, on a different agent harness. The result depends on the harness as much as on the tools.

ToolTools advertisedSchema cost (chars)Agent used itOutput tokensvs bare agentp
repowise1017,56115 / 152,420-15.9%0.035
CodeGraph11,56713 / 152,540-11.7%0.302
Serena2929,0504 / 152,551-11.3%1.000
code-review-graph3028,1180 / 152,768-3.8%0.302
Graphify105,4823 / 152,8780.0%1.000
bare agent (control)00n/a2,877baselinen/a

Scroll the table sideways to see every column.

Claude Code (claude-sonnet-5), 15 questions. Treat the "agent used it" column as unstable, including our own 15 of 15: rerunning the same setup on later days returned 4 of 15 and then 3 of 15 for us, and 2 of 14 for CodeGraph. It is a property of the pairing of tool and harness on a given day, not of the tool. No quality or cost figure may be compared across the two harnesses, which were graded by different judges.

Fig. 6The same six arms on a second harness. The tools did not change between these two runs. The agent's willingness to call them did.

The column that is not a fact about any tool

Under Claude Code most of these tools were barely called at all. code-review-graph never once, Graphify three times in fifteen. Nothing was different about the servers, the questions or the indexes between the two runs. Claude Code loads MCP tool schemas on demand, so the agent has to go looking before it can call anything, and frequently never does.

Treat that column as unstable, including our own 15 of 15.

Rerunning the same setup on later days returned 15 of 15, then 4 of 15, then 3 of 15 for us, and 2 of 14 for CodeGraph. Whether an agent calls a codebase server at all depends more on the harness than on the server. We used Sonnet here, and Sonnet reaches for MCP tools noticeably less than Codex does under an identical setup, so harness and model cannot be separated by this design. We plan to rerun this half on Opus and will add the result when we have it.

One thing this run does not show: it is a work-saved result, not a quality result. A blind judge scored every tool in the field, ours included, a fraction below the bare agent, in a range of 0.04 to 0.25 points on a 10-point scale. None of those differences is statistically distinguishable from zero, and all of them are smaller than the 0.69 points by which this benchmark moves when we rerun it unchanged. Ours is at the low end of that band, we are watching it, and we will say so if it turns into a real effect.

Why this section reports tokens and not dollars

Dollar cost per question is the number every tool in this category wants to quote, and it is close to meaningless as a measure of a tool. Here is the control that convinced us, run in our own harness.

A tool that did nothing came out 43% cheaper than the bare agent.

Under Claude Code, code-review-graph never called its server across all 15 questions. It is behaviourally identical to the bare agent, carrying an extra 28,118 characters of tool schema that should make it cost more. Measured on dollars, it produced a best-in-class saving.

The cause is prompt caching. Cached tokens bill at a fraction of fresh ones, so whichever arm happens to run first pays to warm the cache and every arm after it reads it cheaply. In our run the correlation between an arm's position in the cycle and its dollar cost was -0.487. That is not a property of any tool. It is a property of the schedule.

Output tokens are immune to this. They are never cached, and their correlation with run position is +0.010, which is nothing. So that is what we report. It is a smaller and less impressive number than the dollar figure would have been, and it is the one that survives. If you see a token-savings claim in this category that does not say whether it controls for cache state and arm ordering, this is the first thing to ask about.

Where the saving is largest

The effect is not uniform. repowise saves more on questions that require touching more of the codebase. Splitting the question set at the median by how much work the bare agent needed, the harder half saved 34.3%against the easier half's 27.2%, more than twice as many tokens per question, and the correlation between how much work a question demands and how much we save is +0.379. The mechanism is that pre-computed structure replaces exploration, and harder questions contain more exploration to replace.

Two honest limits on that. The median split was chosen after seeing the data, so it is post-hoc and weaker evidence than the pre-registered comparisons. And every question here is answered in a single session of roughly four to seven turns: we have not measured a long multi-hour task such as designing a feature across many files, and we will not imply a number for one.

About 13 hours of machine time and roughly $44 of API spend. Around a third of those runs are proof-of-life checks rather than headline numbers. How we measured · raw data

3. Loading one commit's context, the easy number

This is the measurement almost every tool in this category publishes, and we are labelling it as such. It is a real measurement. It is not section 2, and it should not be read as though it were.

Loading one commit's context

The measurement almost every tool in this category publishes, labelled as such. Counted with deterministic tiktoken over the 30 most recent non-merge commits of pallets/flask.

StrategyTokens per commit
naive, full contents of every changed file13,984
git diff only1,408
get_context393

Scroll the table sideways to see every column.

35.6x fewer than naive pooled, 29.3x as a mean of per-commit ratios, and 3.6x pooled against git diff. This is one payload, not a session. It says our representation of a commit is smaller than the commit; it does not say an agent finishes faster.

Fig. 7Tokens to load one commit's context, over the 30 most recent non-merge commits of pallets/flask, counted with deterministic tiktoken.

Lead with the pooled figure. Pooled is sum-of-tokens over sum-of-tokens, so it weights each commit by the tokens actually at stake. A mean of per-commit ratios does not: a one-line commit where get_context returns 40 tokens contributes a huge ratio that counts equally against a commit saving a hundred thousand. That is exactly how a 35x becomes a 209x in a press release, and it is why the pooled number is the one we print first.

4. Command-output compression

repowise distill compresses command output before the agent reads it: errors first, exit code preserved, every omission recoverable through an inline marker. A pytest run with 11 failures compresses 61% with all 11 failure lines kept, and a 30-commit diff compresses 86%.

Two commands in the same set saved 0%, because distill never inflates output that is already compact. Reduction is also not comprehension: the bytes removed are measured, and the evidence they were safe to remove is narrower, being preserved failure lines plus CI-asserted fixtures.

5. Code health predicts defects

A health score is worth something only if the files it flags are the files that break. Scores are taken at a historical commit, bug fixes are counted over the following six months, and nothing after the scoring commit feeds the score. Across 21 repositories, 9 languages and 2,826 files that gives an ROC AUC of 0.74, reaching 0.90 on individual repos. It survives controlling for file size, so it is not simply flagging the big files, and it beats recent churn by +0.10 AUC.

Code health against CodeScene

Both tools scored the same 2,770 files at the same leakage-free commit against the same defect labels. Paired tests throughout.

Paired testrepowiseCodeScenep
Recall at a 20%-of-lines review budget0.1730.0740.003
Effort-aware ranking (Popt)0.6070.4620.003
Defect density, size-normalized (Alert:Healthy)2.18x0.56x0.003
Discrimination (ROC AUC)0.7310.7050.054, marginal
Precision at a 20%-of-lines review budget0.5800.6360.64, a tie

Scroll the table sideways to see every column.

CodeScene's precision lead is not statistically significant, but the behaviour behind it is worth having: it flags about 27 files where we flag 132. That is a more conservative threshold, trading recall for a short list a team will actually work through, and it is a deliberate design choice rather than a weaker model. Our AUC edge is marginal, not significant at 0.05.

Fig. 8Against CodeScene, the closest commercial product and the only other vendor in this category with a published empirical defect study. Both tools scored the same files at the same leakage-free commit against the same labels.

Where CodeScene is ahead, it is a real choice rather than a weaker model. Its nominal precision lead is not statistically significant, but the behaviour behind it is worth having: it flags about 27 files where we flag 132. That is a more conservative threshold, trading recall for a short list a team will actually work through. If what you want is a handful of files to fix this quarter rather than the ranking that catches the most defects, that operating point is the better one.

6. Indexing time, the row we lose

We are the slowest indexer in the field, on every repo we measured, and it is not close. The reason is not an optimisation we forgot: the tools we are measured against build a call graph, and in the same pass we also mine git history, generate and embed documentation, extract decision records and score code health.

Indexing time, the row we lose

We are the slowest indexer in the field, on every repo we measured, and it is not close. Measured on django/django.

ToolIndex timeWhat it builds
CodeGraph16.4scall graph
code-review-graph44.8scall graph
Graphify141.5scall graph, communities
repowise (--no-prose)366.8sgraph, git history, decisions, code health
repowise (default, prose on)1,058sall of the above plus generated documentation

Scroll the table sideways to see every column.

22x CodeGraph like for like, and 135x with prose on, which is what a default repowise init actually costs you. Both numbers ship. The reason is not an optimisation we forgot: in that same run repowise built 36,485 graph nodes, mined history across 2,630 files, rendered and embedded 3,392 wiki pages, extracted decision records and produced 5,317 health findings. It is also a one-time cost, since updates after the first index are incremental.

Fig. 9Index build time on django/django. In that same run repowise built 36,485 graph nodes, mined history across 2,630 files, rendered and embedded 3,392 wiki pages, and produced 5,317 health findings.

So "22xslower" and "the index contains categorically more" are both true, and neither one cancels the other.

If all you want is a call graph, CodeGraph builds one in 16 seconds and you should use it. The comparison that would be dishonest is quoting the ratio without the column beside it, which is why the column is there. It is also a one-time cost: updates after the first index are incremental.

Limits

Beyond the ones stated in each section:

  • Python and Go only. No TypeScript or JavaScript row appears anywhere on this page. That was a scope choice made for instance density in the benchmark corpus, not a statement about language support.
  • Section 2 is one repository at one commit, which is in every model's training data.
  • Nothing here measures a long engineering task. Every question is a single session of roughly four to seven turns.
  • Two capability rows are not measured at all: documentation generation against DeepWiki, Google Code Wiki and Swimm, and PR review against CodeRabbit and Greptile. We would rather say "not measured" than let a checkmark do a number's job.

The full methodology, the pre-registration files with their commit timestamps, the arm-parity rules, the statistical tests, and the list of measurement traps that produced wrong numbers before we caught them all live in repowise-bench. That repository also holds every raw run, kept permanently, including the invalidated ones with their invalidation notes attached.

FREQUENTLY ASKED

Questions, answered

Did you tune against this benchmark and then publish the result?

The 112 ContextBench instances were split 70 development / 42 sealed by instance id, pinned and committed before any of the work started, and the sealed half was touched once at publication. The check that makes that claim falsifiable is CodeGraph, which nobody tuned against either half and which scores 0.6093 on one and 0.6095 on the other. The two halves are equally hard, and our own score is higher on the half we never saw. Overfitting produces the opposite pattern.

Why do you not quote a pooled figure across all 112 instances?

It is easy to compute and it would read 0.835, which is better than the number we do quote. Averaging the halves destroys the only property that matters, which is how the tool does on instances it has never seen. The development half appears on this page only as a check on the sealed number, never as the result.

Why do you report output tokens instead of dollars per question?

Because dollars measure the schedule rather than the tool. In our own run, code-review-graph never called its server across 15 questions and still measured 43% cheaper than the bare agent, purely because of where it sat in the prompt-cache cycle. The correlation between an arm's position in the run and its dollar cost was -0.487. For output tokens, which are never cached, that correlation is +0.010.

Is the agent saving the same as the token-reduction figure?

No, and the gap between them is the most important thing on this page. Loading one commit's context costs 35.6x fewer tokens than reading every changed file, which measures one payload. Across a real agent loop the reduction is 31.6% on Codex and 15.9% on Claude Code. Both are real measurements of different things, and only the second answers the question a reader usually has.

Where does repowise lose?

Indexing time, on every repository we measured. We are 22x slower than CodeGraph like for like, and 135x slower with documentation generation on, which is what a default install actually costs. CodeScene is also ahead of us on nominal precision in the code-health comparison. Both rows are on this page rather than in a footnote.

Do agents actually call these tools?

That turns out to depend more on the harness than on the tool. Under Codex every tool in the field was called on every question. Under Claude Code with Sonnet, code-review-graph was called zero times across 15 questions despite advertising 30 tools over an embedded 40,904-node graph. Our own adoption on identical reruns went from 15 of 15 to 4 of 15 to 3 of 15 with nothing changed on anyone's side. Treat every adoption figure on this page, including ours, as valid only with its harness and its date attached.

Can I reproduce this?

Yes. The harnesses, the pre-registration files with their commit timestamps, the arm-parity rules, the statistical tests, and every raw run including the invalidated ones with their invalidation notes are in the repowise-bench repository. Nothing on this page is measured on a private corpus.

Which tool versions were measured?

CodeGraph 1.5.0, Graphify 0.9.31, Serena 1.6.2.dev0, code-review-graph 2.3.7, measured in August 2026. Getting each competitor set up correctly was most of the work: code-review-graph needs three steps that are not in its README, each of which produces a clean and plausible zero when missed, and Serena needs an explicit project activation before it answers anything. A tool scoring zero because we configured it wrong is not a result.

Run the same measurements on your own repo.