A separate, public repository measures Aletheore head-to-head against RepoWise, Graphify and the real PR reviewers: locating code, generated docs, PR review quality, and what a bare LLM gets wrong that a deterministic scanner gets right. Every retrieval number recomputes from raw results with no API key and no network; every PR-review number comes from real API runs with the actual production model.
PR review, 13 real pull requests, one judge for every tool
In the same range as the leading reviewers, after closing a precision gap of our own.
44 human-identified bugs across 13 real pull requests from sentry, grafana, cal.com and keycloak. Every tool's findings, ours and theirs, go through the same blinded judge (gpt-6-luna, told nothing about which tool wrote what), which scores both recall (how many of the 44 bugs a finding actually catches) and precision (how many findings are accurate, specific claims about the diff). Brackets are 95% intervals from resampling the 13 pull requests.
Recall: bugs actually caught, of 44
Aletheore Flash53.4%
Aletheore AIR51.1%
GitHub Copilot59.1%
GitLab Duo50.0%
Qodo22.7%
95% intervals from resampling the 13 pull requests are wide (about plus or minus 14 to 18 points): read this as "in the same range," not a ranked leaderboard. No difference between Aletheore and Copilot or GitLab here is statistically significant.
Precision: confirmed-accurate findings as a share of everything flagged
Qodo100%
GitLab Duo95.1%
Aletheore AIR93.3%
Aletheore Flash92.6%
GitHub Copilot89.6%
Aletheore Flash, before the fix71.5%
Precision rates land in the same range across most tools; the raw count of real, accurate issues surfaced does not. Qodo's near-100% precision comes from making far fewer findings in the first place (24 total, all accurate), a real trade-off, not a flaw either way.
Accurate findings per run, in absolute terms, not a rate
Aletheore Flash87.5
Aletheore AIR86.5
GitHub Copilot60.0
GitLab Duo39.0
Qodo24.0
Full PR review comparison with intervals
Tool
Golden bugs caught (of 44)
Recall (95% CI)
Precision (95% CI)
Accurate findings
Real findings
Confirmed false positives
Runs
Aletheore Flash, shared context
23.5
53.4% [39-68]
92.6% [86-96]
87.5
94.5
2.0
2
Aletheore AIR, shared context
22.5
51.1% [37-65]
93.3% [87-98]
86.5
92.5
0.5
2
GitHub Copilot
26.0
59.1% [40-76]
89.6% [82-98]
60.0
67
1
1
GitLab Duo
22.0
50.0% [38-63]
95.1% [85-100]
39.0
41
1
1
Qodo
10.0
22.7% [10-38]
100% [100-100]
24.0
24
0
1
Aletheore Flash, no shared context (before)
23.0
52.3% [39-66]
71.5% [63-82]
69.0
96.5
13.0
2
Aletheore AIR, no shared context (before)
22.0
50.0% [37-63]
79.7% [73-89]
73.7
92.3
10.3
3
Head to head, with intervals
Pairwise differences with 95% intervals
Comparison
Recall
Precision
Flash minus GitLab Duo
+3.3 pts [-12.9, +18.1]
-2.9 pts [-13.2, +9.6]
Flash minus Copilot
-5.3 pts [-26.5, +14.3]
+2.5 pts [-8.5, +12.0]
Flash minus Qodo
+30.5 pts [+22.2, +37.5]
-7.7 pts [-13.9, -3.5]
AIR (with verification) minus Flash
-2.1 pts [-9.6, +6.6]
+0.9 pts [-4.8, +7.1]
Only the Qodo row excludes zero on both measures: a real recall lead and a real precision deficit. Every other difference is inside the noise. The verification pass on AIR added little once shared context was on, at roughly five times the generation cost, and the product no longer runs it.
The same 13 pull requests through the full production call
The comparison above scores the diff-only generation path. We then ran the same 13 pull requests through the full call the hosted product makes (file contents, referenced symbols, deterministic checks, ranking and the grounding gate), on the code deployed on 2026-10-14, four times. Recall was 55.1% and precision 89.2%, with 3.5 confirmed false positives per run. Against the earlier run that is about 2 points higher on recall (95% interval -2.6 to +6.4) and about 3 points lower on precision (-8.5 to +3.1), neither distinguishable from zero. The two runs used different code and different numbers of trials, so read it as the same range, not a change. If you want one precision figure for the hosted product today, it is the 89%.
Flash Review, production call against the diff-only path
Tools not shown. CodeRabbit's terms bar publishing benchmark results about it without consent, Cursor's Bugbot terms allow it only alongside everything needed to replicate the test, and we removed Greptile's results because its terms restrict sharing the service's results with third parties without written authorization. We would add any of them if they agree.
On SWE-PRBench's published leaderboard, at or above the frontier-model cluster.
SWE-PRBench is an independent, published benchmark: 350 real merged pull requests with human-annotated ground truth, and a judge validated at kappa 0.75 against human agreement. We ran Aletheore's real review path on the published 100-task diff-only split with the paper's own unmodified harness, so the score sits directly beside its leaderboard.
Overall score on the published eval_100 split, diff-only (higher is better)
Aletheore, per-file0.174
Claude Haiku 4.50.153
Claude Sonnet 4.60.152
DeepSeek V30.150
Aletheore, bare mode0.149 to 0.169
Mistral Large 30.147
GPT-4o0.113
Bare-mode Aletheore (one call per diff) scored 0.149 to 0.169 depending only on which API route the judge used, statistically tied with Claude Sonnet 4.6, Claude Haiku 4.5, DeepSeek V3 and Mistral Large 3.
Turning on per-file completeness, the production paid-tier setting, moved the score to 0.174: recall from 16.8% to 22.3% for about two points of precision. A repeat judge pass on the identical output scored 0.170, a 0.4-point gap.
The model doing the work is GLM-5.3-Flash. Generation for all 100 tasks cost $0.055 in bare mode and $0.162 with per-file completeness (more calls). The other costs in the table are what the same 100 tasks would cost on those models at the bare-mode token volume.
*Competitor costs are priced at Aletheore's bare-mode token volume for the same 100 tasks; per-file mode makes more calls, which is why our own figure is higher there.
Dropping the raw file dump didn't cost review quality.
Flash Review can build its prompt with the full raw content of every changed file, or with Aletheore's own evidence alone (blast radius, referenced symbols, no file dump). Four experiments across three models asked whether that trade-off actually costs anything. The one that decided it: gpt-5.6-luna, the real production model, generating reviews under both arms; deepseek-v4-flash independently verifying every finding against the diff, three full repeats of a 50-case mixed-language corpus.
Verified-accept rate by arm, three runs
Run
Evidence only (compact)
+ full file content
Run 1
97.7% verified-accept (42/43)
85.7% (36/42)
Run 2
97.6% verified-accept (40/41)
90.5% (38/42)
Run 3
96.7% verified-accept (29/30)
100% (27/27), coverage artifact*
Read honestly, not cherry-picked: run 3's apparent 100% is not evidence that full context caught up. A transient network failure happened to strip out exactly the harder cases that produced its rejects and uncertains in the other two runs. Evidence-only never underperformed full context in any run.
How much smaller is the prompt, actually?
Prompt size and cost by arm
Evidence only (compact)
+ full file content
Compact is
Median context size (measured)
1,480 chars (~370 tok)
15,212 chars (~3,800 tok)
~10.3x smaller
Avg prompt tokens, real API (DeepSeek V4 Flash)
2,483
16,325
~6.6x smaller
Avg cost per review, same run
$0.0041
$0.0054
~24% cheaper
Read the last row honestly rather than expecting a 6 to 10 times price drop to match the token drop: on this model, completion tokens run 11k to 13k almost regardless of which arm generated the prompt, so the real dollar savings land at roughly a quarter, not a multiple. What the input-side reduction buys is headroom against a tight tokens-per-minute quota, such as a free-tier provider's 6,000 TPM.
Result: evidence-only shipped as Flash Review's production default, not an experiment behind a flag. Total cost for all three validation runs on the real production model: $0.9229.
Locating code, same questions, same ground truth
Every shared corpus, both systems, best RepoWise mode.
RepoWise searches its own generated wiki, so each corpus had one built for it first (init --coverage 1.0, deepseek-v4-flash, 1,341 pages, $1.85 total). The table shows RepoWise's best of semantic or full-text search per corpus, so it isn't beating a weaker mode by default.
5-0-2
wins, losses, ties on top-1
all 7 shared corpora
$0.00
to build a searchable index
against RepoWise's $1.85
93.3%
cross-language top-5 accuracy
up from 60.0% after a language pre-filter fix
Top-1 accuracy: Aletheore against RepoWise's best mode, all 7 shared corpora
gin (Go)80.0%RepoWise, best mode60.0%
serde (Rust)53.3%RepoWise, best mode13.3%
gson (Java)40.0%RepoWise, best mode26.7%
jekyll (Ruby)26.7%RepoWise, best mode13.3%
Slim (PHP)26.7%RepoWise, best mode26.7%
guzzle (PHP)20.0%RepoWise, best mode20.0%
zod (TypeScript)20.0%RepoWise, best mode13.3%
Top-1: 5 wins, 0 losses, 2 ties. Flask (measured separately, not one of the seven shared corpora): Aletheore 68.8% / 93.8% / 100% (top-1/3/5) against RepoWise semantic 28.1% / 56.2% / 56.2%. Where we lose: jekyll top-5, 46.7% against their 66.7%.
Locating code, top-1, by corpus
Corpus
Language
Aletheore
RepoWise semantic
RepoWise full-text
Winner
gin
Go
80.0%
60.0%
46.7%
Aletheore
serde
Rust
53.3%
6.7%
13.3%
Aletheore
gson
Java
40.0%
26.7%
0.0%
Aletheore
jekyll
Ruby
26.7%
13.3%
6.7%
Aletheore
Slim
PHP
26.7%
26.7%
20.0%
tie
guzzle
PHP
20.0%
13.3%
20.0%
tie
zod
TypeScript
20.0%
6.7%
13.3%
Aletheore
Both systems were also given vocabulary-phrased questions on the same wikis. RepoWise gains from this too, because its wiki pages name the symbols, and on jekyll it overtakes us outright: 80.0% to 66.7%. Across those ten cells we lead in seven, tie in two and lose one. RepoWise's --mode symbol returned 0.0% on every corpus and is excluded as a misapplied mode, not counted as a loss.
General against vocabulary phrasing
Corpus
Aletheore general
RepoWise general
Aletheore vocabulary
RepoWise vocabulary
Slim
26.7%
26.7%
73.3%
66.7%
gson
40.0%
26.7%
60.0%
46.7%
zod
20.0%
13.3%
60.0%
26.7%
guzzle
20.0%
20.0%
53.3%
53.3%
jekyll
26.7%
13.3%
66.7%
80.0%
Search latency, measured in-process for both tools: Aletheore 40.5 ms mean against RepoWise's 52.5 ms, reversed from an earlier 125 ms against 68 ms figure (see METHODOLOGY.md).
Aletheore 0.8.11 installed from PyPI, each corpus re-scanned and re-indexed from scratch with local nomic-embed-text (768-dim) embeddings, no API key. Two phrasing regimes are published per corpus: general deliberately avoids the project's own vocabulary, vocabulary uses it. Real users ask somewhere between the two. Every weak corpus moves 20 to 47 points on phrasing alone, larger than any ranking change in this programme.
Full retrieval matrix
Corpus
Regime
Top-1
Top-3
Top-5
MRR
n
location (Flask)
general
71.9%
93.8%
100.0%
0.832
32
gin
general
80.0%
100.0%
100.0%
0.878
15
serde
general
53.3%
66.7%
73.3%
0.617
15
Slim
general
26.7%
60.0%
66.7%
0.458
15
Slim
vocabulary
73.3%
80.0%
93.3%
0.797
15
guzzle
general
20.0%
53.3%
66.7%
0.374
15
guzzle
vocabulary
53.3%
93.3%
100.0%
0.728
15
jekyll
general
26.7%
33.3%
46.7%
0.337
15
jekyll
vocabulary
66.7%
86.7%
93.3%
0.778
15
zod
general
20.0%
40.0%
40.0%
0.289
15
zod
vocabulary
60.0%
73.3%
73.3%
0.667
15
gson
general
40.0%
66.7%
80.0%
0.544
15
gson
vocabulary
60.0%
86.7%
86.7%
0.749
15
axios
general
20.0%
46.7%
66.7%
0.407
15
axios
vocabulary
73.3%
93.3%
100.0%
0.850
15
jq
general
53.3%
66.7%
80.0%
0.648
15
jq
vocabulary
73.3%
100.0%
100.0%
0.867
15
fmt
general
40.0%
60.0%
86.7%
0.527
15
fmt
vocabulary
66.7%
93.3%
93.3%
0.789
15
AutoMapper
general
6.7%
20.0%
33.3%
0.177
15
AutoMapper
vocabulary
86.7%
100.0%
100.0%
0.933
15
thrift
general
6.7%
33.3%
53.3%
0.241
15
thrift
cross-language
53.3%
73.3%
93.3%
0.677
15
Code intelligence against Graphify
Ties or leads Graphify on all 15 questions, in fewer tokens.
Graphify is a tree-sitter code-knowledge-graph tool with its own benchmark on frappe/erpnext (about 1M lines). Rather than cite either tool's published numbers, we ran both ourselves under one shared agent loop and one anonymized judge, on the same pinned ERPNext commit: 15 independently authored questions, each run three times (baseline grep/read/list, plus Aletheore, plus Graphify), scored by a judge never told which tool produced which answer. New
Key-fact coverage on 15 ERPNext questions (mean of 30 samples)
baseline92.2%
+ Aletheore100.0%
+ Graphify93.3%
Tokens per query (mean of 15 samples, lower is better)
baseline11,839
+ Aletheore14,893
+ Graphify17,921
Aletheore ties or leads Graphify on every question once a ground-truth error found in pre-publication review was corrected.
Excluding the one question both tools timed out on, Aletheore answers for 36% fewer tokens than Graphify (9,803 against 15,296 mean).
The honest caveat: only 2 of 15 questions actually discriminate between conditions, so this is a real result on this question set, not a claim that generalizes past 15 questions on one corpus. Total real cost of the whole comparison: $0.19.
A blind LLM judge scores answers 0 to 3, each question graded twice with the two systems' positions swapped, an equal 12,000-character context budget, tool names scrubbed and three repeats per question. Re-measured across five languages on current code, full 12-question architecture set per corpus. New
Blind-judge score, 0 to 3, per corpus (higher is better)
flask (Python)1.96RepoWise1.75
axios (JavaScript)2.12RepoWise1.85
automapper (C#)2.08RepoWise1.78
fmt (C++)1.92RepoWise1.72
jq (C)1.93RepoWise1.76
Average2.00RepoWise1.77
We lead on average, not decisively. Most individual per-corpus gaps sit inside that corpus's own measured judge-repeat spread. The aggregate preference count across all 360 judged pairs is more telling: Aletheore 198 (55.0%), RepoWise 144 (40.0%), tie 18 (5.0%). This reverses an earlier loss (2.13 against 2.35) measured on different code with a different method.
Handed the same data, a bare LLM still cannot reproduce it.
For the parts of Aletheore that are not an LLM call at all (hotspots, ownership, dead code, computed from real git history and a real import graph), can a bare LLM reproduce the answer if it is simply handed the same data? On the same Flask corpus, given the exact git log slice and import statements the scanner consumes: New
Deterministic analysis against a bare LLM on the same Flask data
Aletheore
gpt-5.6-luna (bare)
gpt-5.6-terra (bare)
Hotspots (top 10 by commit count)
exact, every run
declined, asked for real code instead
0/10 counts correct, 4 fabricated entries
Ownership (top 8 by commit count)
exact
1/8 exact, mean error ~14.5, drops a real contributor
No LLM, no judge: exact matches against labeled ground truth.
Aletheore's fully deterministic scanners (secrets, vulnerabilities, dead code, licenses, database schema) and structural code search had no systematic accuracy measurement before this pass. Each ran the real production function against real, large open-source repos, not mocks. The synthetic pilot gives exact-match ground truth; the real-repo runs give a false-positive signal a pilot cannot, and they found real defects that were fixed. New
21,430 files across 20 real repos; 96 secrets and 231 vulnerability findings manually reviewed. 6 real product gaps found and fixed, all shipped with regression tests. Against RepoWise on secrets, same 20 repos: RepoWise misses 5 of 6 real credential formats, and every one of its 375 real-repo findings was noise, mostly Django's own test-suite fake passwords.
Dead code
Pilot
10/10 recall, 0/7 false positives.
Real repos
Flask reported all six of its real runtime dependencies as unused: a severe bug (the unused-dependency check read a graph field that structurally excludes external packages), found and fixed.
AST-pattern search
Pilot
All 12 existing unit tests pass.
Real repos
A reproducible tree-sitter segfault on large repos, on Python 3.12 as well as 3.14 (not 3.14-only as first documented). Fixed with batched subprocess isolation, verified 20/20 clean on both versions.
License detection
Pilot
46 pre-existing unit tests, all passing.
Real repos
3 real gaps found and fixed: BSD license bodies contain no "BSD" keyword at all, LICENSE.rst was not a recognized filename, and Maven license lookups never followed parent POM references.
SQL schema extraction
Pilot
Zero crashes across 5,378 real migration files in 9 real repos, raw SQL and ORM-native (Django, Rails, Alembic) conventions.
Real repos
8 real gaps found and fixed over two rounds; one alone, a Django FK field subclass Sentry uses 249 times, took Sentry's extracted relations from 8 to 235. RepoWise extracted zero foreign keys or indexes across 622 files.
What the hosted endpoint runs, and how we chose it.
Aletheore's hosted embedding endpoint serves Qwen3-Embedding-8B at 1024 dimensions (since 2026-10-13); it used to serve jina-embeddings-v2-base-code. This section has two measurements. The first, behind the switch, recomputes offline from committed rankings. The second, older one measured the Jina model and needs the hosted service (aletheore login and a paid plan) to re-run, so it does not carry the "no API key, no network" guarantee of the rest of the page.
Why Qwen3-Embedding-8B: level on quality, much faster
We tested nine configurations (eight hosted models and one query-instruction variant) against the production Jina model on the same code-search questions as the retrieval matrix: 257 questions used to choose, 90 held out. Qwen3-Embedding-8B is level with Jina on retrieval quality, not better: +0.008 MRR with a 95% interval of -0.019 to +0.035 on 332 questions for the shipped setting, and the same on the held-out questions. Asking for a 1024-dimension vector scores the same as the native 4096. Three of the other models (bge-m3, bge-base, Nemotron 1B) were clearly worse than Jina. What changed is operational: on one production host, bulk indexing ran about 7 times faster with one request at a time and up to about 17 times faster with four in parallel, and the CPU-bound sidecar can be retired. Embedding code now means sending code chunks to the provider; the privacy policy names it and the CLI says so before it uploads.
Embedders on 332 code-search questions
Configuration
MRR
MRR against Jina (95% interval)
Questions
Qwen3-8B at 1024 dimensions (shipped)
0.695
+0.008 [-0.019, +0.035]
332
Qwen3-8B at 4096 dimensions (native)
0.694
+0.007 [-0.020, +0.034]
332
Jina (previous production model)
0.687
baseline
332
Qwen3-0.6B
0.665
-0.022 [-0.049, +0.004]
332
Small effects on a small set: a 95% interval on MRR is about plus or minus 0.03, so differences under that are noise. The speed figures are for one host's CPU and vary with provider load; the raw runs, including one that did not scale, are published with the method and limitations.
Earlier measurement: local nomic against hosted jina
Mean: top-1 +5.0 points, MRR +0.049. 20 of 23 rows flat or better; 3 worse, all in Slim's vocabulary regime or zod. Thrift's cross-language row is the largest single gain (+20.0 points), the same regime the language pre-filter fix targeted.
▸All 23 corpus and regime rows: nomic against jina
Local nomic against hosted jina embeddings
Corpus
nomic top-1
jina top-1
Δ top-1
nomic MRR
jina MRR
flask (location)
71.9%
81.2%
+9.3pp
0.832
0.901
gin
80.0%
86.7%
+6.7pp
0.878
0.933
serde
53.3%
53.3%
+0.0pp
0.617
0.678
Slim (general)
26.7%
53.3%
+26.6pp
0.458
0.647
Slim (vocab)
73.3%
66.7%
-6.6pp
0.797
0.811
guzzle (general)
20.0%
20.0%
+0.0pp
0.374
0.458
guzzle (vocab)
53.3%
73.3%
+20.0pp
0.728
0.844
jekyll (general)
26.7%
26.7%
+0.0pp
0.337
0.382
jekyll (vocab)
66.7%
66.7%
+0.0pp
0.778
0.791
zod (general)
20.0%
13.3%
-6.7pp
0.289
0.237
zod (vocab)
60.0%
53.3%
-6.7pp
0.667
0.658
gson (general)
40.0%
46.7%
+6.7pp
0.544
0.569
gson (vocab)
60.0%
66.7%
+6.7pp
0.749
0.797
axios (general)
20.0%
20.0%
+0.0pp
0.407
0.420
axios (vocab)
73.3%
80.0%
+6.7pp
0.850
0.878
jq (general)
53.3%
53.3%
+0.0pp
0.648
0.728
jq (vocab)
73.3%
80.0%
+6.7pp
0.867
0.883
fmt (general)
40.0%
46.7%
+6.7pp
0.527
0.621
fmt (vocab)
66.7%
66.7%
+0.0pp
0.789
0.789
AutoMapper (general)
6.7%
13.3%
+6.6pp
0.177
0.243
AutoMapper (vocab)
86.7%
86.7%
+0.0pp
0.933
0.922
thrift (general)
6.7%
20.0%
+13.3pp
0.241
0.285
thrift (cross-language)
53.3%
73.3%
+20.0pp
0.677
0.822
Update, 2026-08-20: a later, independent hosted-jina measurement against the live service found a much steeper zod gap than the -6.7 points above (general top-1 20.0% to 0.0%, vocabulary 60.0% to 6.7%). Two decoy files that jina ranks above the true answer explain it: a 37-line smoke-test file that imports every zod build variant, and the roughly 30 locale files under packages/zod/src/.
Same evidence, fewer tokens
TOON against raw JSON, measured on this exact repo's own self-scan.
1,174,274
air.json tokens
619,575
air.toon tokens
47.2%
fewer tokens, same evidence, 53.8% smaller on disk
Every coding agent that reads this file pays less to do it. Measured with the o200k_base tokenizer on a fresh self-scan of this repository (2026-09-25 snapshot; 5,112,929 against 2,362,099 bytes). The absolute counts change as the repo grows.
Where we lose
Stated here rather than in a footnote.
!Five of eight corpora score below 35% top-1 under vocabulary-avoiding phrasing, though most of that gap is our question authoring, not the product. Every one recovers 20 to 47 points when asked in the project's own terms.
!AIRview writes a page for only 21 of 100 changed files on Flask's last 30 commits; the rest are served by a deterministic fallback, not the generated wiki this project is named for.
!"How does X work?" comprehension is close, not a clean win: 2.00 against 1.77 averaged across five languages, but most per-corpus gaps sit inside the judge's own noise.
!On SWE-PRBench our absolute recall (22.3%) and precision (20.5%) are low, as they are for every model; the score is above the published cluster by a margin close to our own run-to-run variance.
!The Graphify comparison rests on 15 questions on one corpus, of which only 2 discriminate between conditions.
!Our local setup was slower than Graphify's: scanning and indexing ERPNext took about 23 minutes against their about 1 minute. We found the real bottleneck (dead-code detection, 77% of scan time, not parsing) and fixed it in aletheore 0.9.5: 53.23 s against the old 236.02 s, verified against the installed release. Indexing (about 19 minutes, a separate I/O-bound step) is now the honest remaining gap.
!The PR-review comparison rests on 13 pull requests, so its intervals are wide and small differences between tools are noise. Our fix for cross-file false positives was developed while looking at these same pull requests and has not been checked on unseen ones. "Precision" counts any accurate, specific claim about the diff, so it measures accuracy of claims, not how important they are. The head-to-head runs the diff-only generation path; a separate four-run measurement of the production call scored 89.2% precision, and it too was developed while looking at these pull requests. The other tools' rows are single runs from before 2026-09-23.
Every number above is in a public repo, with the raw results.
418 questions across 12 corpora, a 50-case PR-review corpus, the SWE-PRBench run, the Graphify comparison and the scanner-accuracy suites: all reproducible, all checked against real Aletheore output, not a mockup.