Technical report

Repowise benchmark record / 2026.08

Benchmarks

Benchmarks

Every result Repowise publishes, with the population, control, statistical test, and raw evidence needed to challenge it.

The record includes the rows where we lead, the trade-offs, and the measurements we lose. Nothing here uses a private corpus or an LLM judge for retrieval grading.

Measured
August 2026
Compared field
CodeGraph, Graphify, Serena, code-review-graph, CodeScene, and controls
Evidence status
Public and reproducible

Results register

The scoreboard

Verdicts are scoped to the named test and field. A lead in one row does not transfer to an unmeasured capability.

QuestionMeasured fieldResultVerdict
Finding the right filesCodeGraph, Graphify, code-review-graph, cocoindex0.876 sealed-set coverage; 19 wins, 1 loss, 22 ties head to headLead
Work saved in a real agent loopFour competing tools and a bare-agent control31.6% fewer Codex output tokens; fewest tool calls in the fieldLead
Call-graph correctnessFive tools; compiler oracles on Go and TypeScriptNo measured tool that finds as much of the graph gets more of it rightLead
Code health predicts defectsCodeScene on the same files and future bug labelsLeads recall and effort-aware ranking; CodeScene retains the business-impact axisTrade-off
Full index build timeCodeGraph, Graphify, code-review-graph22x slower while building five intelligence layers instead of oneLoss
Documentation and PR reviewDeepWiki, Swimm, CodeRabbit, GreptileCapability comparisons exist; no controlled head-to-head result is publishedNot measured

Scroll sideways to inspect the complete scoreboard.

-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

How to read these results

Each result names the population, competing field, control, and statistical test that produced it. Retrieval uses a sealed test split with deterministic grading. Agent-loop comparisons use byte-identical prompts and freshly built indexes on the same pinned commit.

A headline number is only useful when the denominator and the failure conditions stay attached to it.

This report keeps precision beside coverage, files served beside retrieval, and tool adoption beside token reduction. It separates one-payload compression from work saved across a complete agent session. Rows that fail their own controls are retained in the raw record and excluded from the claim.

01

Pre-register

Commit the question and expected test before a scored run spends anything.

02

Seal a split

Keep the held-out instances untouched until the final measurement.

03

Prove each arm is alive

A dead server and a weak tool both produce a plausible zero.

04

Publish the losses

A trade-off remains in the record even when it weakens the headline.

Independent reruns explain why these controls matter. JetBrains measured 8.5% against a claimed 65% saving for Caveman, while RTK's claimed 60 to 90% became 7.6% more expensive at low reasoning effort. Greptile's 82% became 45% under Augment's rerun. Measuring one context payload is easy. Measuring the work across a complete agent loop is harder.

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.

Is the call graph correct?

A call graph can fail in two directions: miss calls that are real, or invent calls that are not. Precision measures how many emitted edges are real. Recall measures how much of the real graph was found. Either number is easy to game alone, so this report keeps them paired.

Across seven compiler-graded cells, no measured tool that finds as much of the graph as Repowise gets more of it right.

The answer keys come from the Go team's own call-graph implementation and the TypeScript compiler's resolution of call sites. Repowise does not control either oracle. The field contains five tools and 37,853 oracle edges.

7 of 7
Compiler-graded cells where no tool beats both our precision and recalln = 7 · Five repositories, Go and TypeScript, 37,853 oracle edges · 2026-08
84.8%
Correct Repowise call edges in the nine-language source auditn = 270 · 270 Repowise edges across 9 languages; 540 rows across both tools · 2026-08
35 of 35
Repositories where Repowise used the least memory to build the graphn = 35 · Five graph tools across 35 repositories; 175 cells · 2026-08

Compiler-graded call-graph quality

Precision / recall against call graphs generated by the Go and TypeScript toolchains. Both numbers must be read together.

Table view
Oracle cellRepowiseCodeGraphcodebase-memoryGraphifycode-review-graph
cobra / tests0.972 / 0.6840.929 / 0.7630.912 / 0.7430.971 / 0.4330.997 / 0.174
gitleaks / no tests0.976 / 0.9550.972 / 0.9200.934 / 0.9670.997 / 0.8860.759 / 0.026
gitleaks / tests0.974 / 0.9140.971 / 0.8950.922 / 0.9450.995 / 0.8320.800 / 0.032
syft / no tests0.943 / 0.5130.872 / 0.5080.635 / 0.5420.771 / 0.4470.968 / 0.201
syft / tests0.950 / 0.3220.864 / 0.3380.673 / 0.3610.802 / 0.2730.966 / 0.086
zod / no tests0.992 / 0.7030.729 / 0.3730.987 / 0.6940.825 / 0.2480.932 / 0.652
hono / no tests0.977 / 0.7310.805 / 0.6840.949 / 0.6860.980 / 0.6880.966 / 0.691

Scroll the table sideways to see every column.

Precision / recall in every cell. Five tools, seven cells, 37,853 oracle edges. No tool that finds as much of the graph as Repowise gets more of it right in any cell. Repowise does not lead recall in the five Go cells and is most precise outright in only one cell.

Fig. 2Precision / recall against compiler-produced answer keys. Repowise is on the Pareto frontier in every cell, but it does not draw the largest map in the five Go cells.

Source audit across nine languages

Compiler oracles cover Go and TypeScript. The wider audit uses the same seeded, stratified source-reading protocol on nine languages, with thirty rows per language per tool. Every graded call site and verdict is public.

Read our result in reverse too: roughly fifteen percent of the sampled Repowise edges were wrong. Four language cells separate from CodeGraph and five are ties. This is a two-tool comparison and does not transfer to the wider compiler field.

Source audit across nine languages

Thirty stratified call edges per language per tool, read from source with imports and enclosing scope open.

ToolCorrect / n95% CI
repowise229 / 270 = 84.8%80.0–88.6
CodeGraph 1.5.0154 / 270 = 57.0%51.1–62.8

Scroll the table sideways to see every column.

540 rows across nine languages. Four language cells separate and five are ties. This comparison covers Repowise and CodeGraph only; the compiler-oracle table above covers the five-tool field on Go and TypeScript.

Fig. 3The nine-language hand audit. Its breadth is wider than the compiler oracle, while its field is narrower: Repowise and CodeGraph only.

01Finding 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. 4File 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. 5Coverage 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.
0.876
File coverage, get_answer, on 42 sealed instancesn = 42 · p = 0.00004 · ContextBench, 42 sealed instances, Python and Go · 2026-08
0.742
File coverage, search_codebase, on 42 sealed instancesn = 42 · p = 0.021 · ContextBench, 42 sealed instances, Python and Go · 2026-08
8.2
Files served per question by search_codebasen = 42 · ContextBench, 42 sealed instances, Python and Go · 2026-08

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

02What 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. 6Output 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.

Table view
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. 7The 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.

Table view
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. 8The same six arms on a second harness. The tools did not change between these two runs. The agent's willingness to call them did.
-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
3.8
Tool calls to reach an answer, against a bare agent's 7.2n = 43 · Codex (gpt-5.6-sol) · django/django at a single pinned commit · 2026-08
37 of 44
Questions where the loop was leaner than the bare agent'sn = 44 · p = <0.0001 · Codex (gpt-5.6-sol) · django/django at a single pinned commit · 2026-08
-15.9%
Output tokens against a bare agent, on Claude Coden = 15 · p = 0.035 · Claude Code (claude-sonnet-5) · django/django at a single pinned commit · 2026-08

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

03Loading 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. 9Tokens 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.

04Command-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.

05Code 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. 10Against 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.

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
+0.10 AUC
Margin over ranking by recent churnn = 2,826 · p = <1e-9 · 21 repositories, 9 languages, 2,826 files · 2026-08
0.607
Effort-aware ranking (Popt) against CodeScene's 0.462n = 2,770 · p = 0.003 · 2,770 files scored by both tools at the same leakage-free commit · 2026-08
2.3x
Defects surfaced under a fixed 20%-of-lines review budget, against CodeScenen = 2,770 · p = 0.003 · 2,770 files scored by both tools at the same leakage-free commit · 2026-08

06What it costs to run

Two different clocks answer two different questions. Building only the call graph, Repowise has the lowest measured memory footprint and is roughly level on speed. Building the complete index, Repowise is the slowest tool in the field because it also mines git history, generates and embeds documentation, extracts decisions, and scores code health.

Call-graph construction cost

Graph construction only across the same 35 repositories. Three timed runs per cell after a discarded warmup; 175 cells and no failures.

ToolMedian buildMedian peak memoryFastest on
repowise2.77s75 MB14 of 35
CodeGraph3.65s757 MB16 of 35
codebase-memory-mcp6.21s1,113 MB5 of 35
code-review-graph9.97s361 MB0
Graphify12.23s860 MB0

Scroll the table sideways to see every column.

Memory is a clean sweep: Repowise is lowest on 35 of 35 repositories. Speed is level rather than a win; CodeGraph is fastest on 16 repositories and Repowise on 14. Repowise builds this arm in memory without serialization, while CodeGraph writes SQLite.

Fig. 11Call-graph construction only. Memory is a clean lead; build speed is level, with CodeGraph fastest on two more repositories.

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. 12Index 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 "22x slower" 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.

22x
How much slower we index than CodeGraph, like for liken = 1 · django/django at a single pinned commit · 2026-08
366.8s
Time to index django with prose generation offn = 1 · django/django at a single pinned commit · 2026-08
35 of 35
Repositories where Repowise used the least memory to build the graphn = 35 · Five graph tools across 35 repositories; 175 cells · 2026-08

Limits

What this does not show

Beyond the ones stated in each section:

  • Retrieval is Python and Go. The compiler graph benchmark covers Go and TypeScript, and the source audit covers nine languages. Scope does not transfer from one section to another.
  • 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.
  • Precision is one half of graph quality. Repowise leads no Go recall cell against the compiler oracle and loses cross-file coverage on part of the build corpus.
  • 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.
Reproduce it yourself

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 one repository. So does every raw run, kept permanently, including the invalidated ones with their invalidation notes attached.

repowise-bench
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.