Benchmarked, not just claimed

We publish the rows we lose, too.

A separate, public repository measures Aletheore head-to-head against RepoWise — locating code, generated docs, PR review quality, and what a bare LLM gets wrong that a deterministic scanner gets right. Every retrieval number below 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.

Reproduce it yourself
git clone https://github.com/Aletheore/aletheore-benchmarks
cd aletheore-benchmarks
python scripts/score_fallback_judge.py

Locating code, head-to-head against RepoWise

5–0–2
wins–losses–ties on top-1,
all 7 shared corpora
$0.00
to build a searchable index,
vs. RepoWise's $1.85
93.3%
cross-language top-5
accuracy

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 below shows RepoWise's best of semantic or full-text search per corpus, so it isn't beating a weaker mode by default.

Locating code, top-1: Aletheore vs. RepoWise (best mode)

Same questions, same ground truth, all 7 shared corpora

CorpusLanguageAletheoreRepoWise semanticRepoWise full-textWinner
ginGo80.0%60.0%46.7%✅ Aletheore
serdeRust53.3%6.7%13.3%✅ Aletheore
gsonJava40.0%26.7%0.0%✅ Aletheore
jekyllRuby26.7%13.3%6.7%✅ Aletheore
SlimPHP26.7%26.7%20.0%🟰 tie
guzzlePHP20.0%13.3%20.0%🟰 tie
zodTypeScript20.0%6.7%13.3%✅ Aletheore

Top-1: 5 wins, 0 losses, 2 ties. Our weakest languages still match or beat them. Flask (measured separately, not one of the seven shared corpora above): 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% — see "Where we lose" below.

Both systems were also given vocabulary-phrased questions on the same wikis. RepoWise gains from this too — its wiki pages name the symbols — and on jekyll it overtakes us outright:

CorpusAletheore generalRepoWise generalAletheore vocabularyRepoWise vocabulary
Slim26.7%26.7%73.3%66.7%
gson40.0%26.7%60.0%46.7%
zod20.0%13.3%60.0%26.7%
guzzle20.0%20.0%53.3%53.3%
jekyll26.7%13.3%66.7%80.0%

Across those ten cells we lead in seven, tie in two, and lose one — jekyll's vocabulary regime, where RepoWise's wiki naming its own symbols overtakes us 80.0% to 66.7%. One thing this deliberately doesn't claim: RepoWise's --mode symbol returned 0.0% on every corpus and is excluded as a misapplied mode, not counted as a loss. Search latency, measured in-process for both tools (previously only Aletheore's had a committed script for this — RepoWise's own number was CLI-subprocess time, which pays a real but unrelated Python-import cost each call): Aletheore 40.5ms mean against RepoWise's 52.5ms, reversed from an earlier 125ms-vs-68ms figure — see METHODOLOGY.md.

AletheoreRepoWise
Indexing cost, 7 corpora$0.00$1.85
Per corpus$0.00$0.09 – $0.47
What it costs money fornothing — local nomic-embed-textLLM generation of 1,341 wiki pages
Typical setup timeseconds to ~1 min per corpusminutes per corpus
Full retrieval matrix — top-1 / top-3 / top-5 / MRR, all 12 corpora, 23 regime rows

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 where available: general deliberately avoids the project's own vocabulary, vocabulary uses it — real users ask somewhere between the two, so a language's true figure is bracketed by both rather than given by either. Every weak corpus moves 20-47 points on phrasing alone, larger than any ranking change in this programme.

Top-1, general phrasing, by corpus — the spread the average hides

Go and Python are strong; Java, Ruby, PHP, and TypeScript are not — and the weak corpora were measured last

CorpusRegimeTop-1Top-3Top-5MRRn
location (Flask)general71.9%93.8%100.0%0.83232
gingeneral80.0%100.0%100.0%0.87815
serdegeneral53.3%66.7%73.3%0.61715
Slimgeneral26.7%60.0%66.7%0.45815
Slimvocabulary73.3%80.0%93.3%0.79715
guzzlegeneral20.0%53.3%66.7%0.37415
guzzlevocabulary53.3%93.3%100.0%0.72815
jekyllgeneral26.7%33.3%46.7%0.33715
jekyllvocabulary66.7%86.7%93.3%0.77815
zodgeneral20.0%40.0%40.0%0.28915
zodvocabulary60.0%73.3%73.3%0.66715
gsongeneral40.0%66.7%80.0%0.54415
gsonvocabulary60.0%86.7%86.7%0.74915
axiosgeneral20.0%46.7%66.7%0.40715
axiosvocabulary73.3%93.3%100.0%0.85015
jqgeneral53.3%66.7%80.0%0.64815
jqvocabulary73.3%100.0%100.0%0.86715
fmtgeneral40.0%60.0%86.7%0.52715
fmtvocabulary66.7%93.3%93.3%0.78915
AutoMappergeneral6.7%20.0%33.3%0.17715
AutoMappervocabulary86.7%100.0%100.0%0.93315
thriftgeneral6.7%33.3%53.3%0.24115
thriftcross-language53.3%73.3%93.3%0.67715

All 11 supported languages are measured here, across 12 single-language corpora plus apache/thrift — the first genuinely polyglot corpus (eight languages, none above a third of the modules), which implements the same protocol separately in each language and tests whether retrieval can tell one language's implementation from another's. A 0.8.10→0.8.11 fix added a language pre-filter that raised thrift's cross-language top-5 from 60.0% to 93.3% — the one defect found here that good phrasing does not explain, since the cross-language questions already use full vocabulary. Full methodology, including two ranking fixes that were built and rejected on measurement, in METHODOLOGY.md.

Hosted embeddings: jina vs. local nomic — full 23-row comparison

This one doesn't carry the same "no API key, no network" guarantee as the rest of this page — it measures Aletheore's hosted embedding endpoint (jina-embeddings-v2-base-code, requires aletheore login and a paid plan) against the same 13 corpora, 23 corpus/regime pairs, and questions as the table above, with only the embedder changed from local nomic-embed-text (768-dim) to hosted jina (768-dim).

Corpusnomic top-1jina top-1Δ top-1nomic MRRjina MRR
flask (location)71.9%81.2%+9.3pp0.8320.901
gin80.0%86.7%+6.7pp0.8780.933
serde53.3%53.3%+0.0pp0.6170.678
Slim (general)26.7%53.3%+26.6pp0.4580.647
Slim (vocab)73.3%66.7%-6.6pp0.7970.811
guzzle (general)20.0%20.0%+0.0pp0.3740.458
guzzle (vocab)53.3%73.3%+20.0pp0.7280.844
jekyll (general)26.7%26.7%+0.0pp0.3370.382
jekyll (vocab)66.7%66.7%+0.0pp0.7780.791
zod (general)20.0%13.3%-6.7pp0.2890.237
zod (vocab)60.0%53.3%-6.7pp0.6670.658
gson (general)40.0%46.7%+6.7pp0.5440.569
gson (vocab)60.0%66.7%+6.7pp0.7490.797
axios (general)20.0%20.0%+0.0pp0.4070.420
axios (vocab)73.3%80.0%+6.7pp0.8500.878
jq (general)53.3%53.3%+0.0pp0.6480.728
jq (vocab)73.3%80.0%+6.7pp0.8670.883
fmt (general)40.0%46.7%+6.7pp0.5270.621
fmt (vocab)66.7%66.7%+0.0pp0.7890.789
AutoMapper (general)6.7%13.3%+6.6pp0.1770.243
AutoMapper (vocab)86.7%86.7%+0.0pp0.9330.922
thrift (general)6.7%20.0%+13.3pp0.2410.285
thrift (cross-language)53.3%73.3%+20.0pp0.6770.822

Mean: top-1 +5.0pp, MRR +0.049. 20 of 23 rows flat or better; 3 worse, all in either Slim's vocabulary regime or zod. Thrift's cross-language row is the largest single gain — the same regime the language pre-filter fix targeted, so hosted jina extends that gain rather than eroding it. Checked directly rather than left as a footnote: zod's regression traces to near-duplicate crowding between its parallel classic and mini API variants, not a scanner bug — both embedders hit the same 6/15 top-5 rate on zod's general questions, they just disagree on which two they miss.

Update, 2026-08-20: a later, independent hosted-jina measurement against today's live service (not this section's dev checkout) found a much steeper zod gap than the -6.7pp above — general top-1 20.0% → 0.0%, vocabulary 60.0% → 6.7%. Reading the raw ranked files (not just the score) found two concrete decoy files jina ranks above the true answer that nomic does not: packages/resolution/src/index.ts, a 37-line smoke-test file that literally imports every zod build variant in one place (zod, zod/mini, zod/v3, zod/v4, zod/v4-mini, plus a locale file), giving it lexical overlap with nearly the entire module surface despite being semantically irrelevant to any single one of them — it shows up as a false top-3 hit on 4 of 15 general questions; and the ~30 locale files under packages/zod/src/v4/locales/, each importing the same core types ($ZodStringFormats, errors, util) as the real implementation files they're competing against, because every locale wires up the same error-message keys. Neither is a broken pipeline — both are plausible, on-topic, wrong answers, the same near-duplicate-crowding category above, just a sharper instance of it. Why this measurement's gap is so much larger than the -6.7pp already published above is not yet resolved — the two were measured against different deployments, so infrastructure drift between them hasn't been ruled out. Full account in METHODOLOGY.md.

Answering from a file — fallback vs. RepoWise get_context: blind pairwise judge, 0-3, three repeats, both systems' positions swapped each grading. On the seven files where both return substantive material, Aletheore's file fallback scores 2.857 against RepoWise's 2.000 — a +0.857 gap, identical in all three repeats. A further 15 files (YAML, TOML, RST, lockfiles) are reported as coverage, not score: RepoWise returns "empty or non-symbol file" or "Target not found" for all fifteen, which is it declaring those files out of scope, not losing on quality — pooling those zeros into the headline would overstate the gap, so they're kept separate instead.

PR review · shipped, not hypothetical

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.

RunEvidence only (compact)+ full file content
Run 197.7% verified-accept (42/43)85.7% (36/42)
Run 297.6% verified-accept (40/41)90.5% (38/42)
Run 396.7% verified-accept (29/30)100% (27/27) — coverage artifact*

*Read honestly, not cherry-picked: run 3's apparent 100% isn't evidence 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. Full writeup, including an earlier weaker-model run where the compact approach's real recall win came with a real cost — the highest false-positive rate of the arms tested — in pr_review/README.md.

How much smaller is the prompt, actually?

Evidence only (compact)+ full file contentCompact 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,48316,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-10x price drop to match the token drop: on this model, completion tokens run 11k-13k almost regardless of which arm generated the prompt — reasoning-mode verbosity, a model-level trait unrelated to context strategy — so the real dollar savings land at roughly a quarter, not a multiple. What the ~6-10x input-side reduction actually buys is headroom against a tight tokens-per-minute quota (e.g. a free-tier provider's 6,000 TPM) — the difference between a review fitting in one call and not fitting at all.

Result: evidence-only shipped as Flash Review's actual production default, not an experiment behind a flag. Total cost for all three validation runs on the real production model, real API pricing: $0.9229.

Head-to-head against PR-Agent · a real, named competitor

Same model, same corpus, production code.

A different question from the compact-vs-context experiments above: how does Aletheore's actual hosted product compare against a real, named, external competitor (Qodo's PR-Agent), held to the same model, so the result isolates review methodology rather than which vendor has the bigger model budget? Both tools on gpt-5.6-luna, 24-case corpus, production Aletheore deployed at commit 35e18f8.

0
false positives, both Aletheore tiers
vs. PR-Agent's 8
2.5x
Aletheore's real recall vs. PR-Agent's,
on identical footing
4.4x
faster per case, Aletheore Flash
vs. PR-Agent (15.9s vs. 69.3s)
ToolHitPartialMissFalse Positives
Aletheore AIR (Luna + DeepSeek verify)15140
Aletheore Flash (Luna only, no verify)15050
PR-Agent / Qodo (Luna)60148

AIR and Flash tie on total recall (15/20 each) despite Flash never calling the verification model, consistent with verification being a precision mechanism, not a recall lever. Both Aletheore tiers hold a clean false-positive record on the 4 clean diffs, not explained by proposing fewer findings overall (it doesn't cost recall, see the hit numbers above). This reverses an earlier, unintentionally unfair run (free-tier Aletheore vs. PR-Agent's own pricier default model) that had shown the opposite, documented as superseded, not discarded. Disclosed limitations (no blind-judge pass this cycle, AIR measured via direct invocation rather than a live webhook) and the full setup in pr_review/README.md, Experiment 5.

Deterministic analysis vs. bare LLM

Can a bare LLM reproduce the scanner's answer, given the same data?

Not "Aletheore vs. RepoWise" — for the parts of Aletheore that aren't an LLM call at all (hotspots, ownership, dead code, computed from real git history and a real import graph), what happens if a model is simply handed the same data and asked the same question? On the flask corpus, given the exact git log slice and import statements the scanner itself consumes:

AletheoreBare LLM (gpt-5.6-luna)Bare LLM (gpt-5.6-terra)
Hotspots (top 10)exact, every rundeclined — asked for real code instead0/10 correct, 4 fabricated
Ownership (top 8)exact1/8 exact, drops a contributor4/8 exact, still fabricates a person
Dead code2/2, zero false positives48 flagged, 4.2% precision49 flagged, 4.1% precision

Full methodology, including a real bug this testing surfaced, in DETERMINISTIC_VS_LLM.md.

Dead-code detection · Kotlin and Swift, vs. RepoWise

Swift: a clean win. Kotlin: an exact match.

A different axis from "how does X work?" above: which files does each tool correctly leave alone as real, reachable code? Measured file-level (RepoWise also flags unused-export symbols; Aletheore's dead-code module doesn't attempt that granularity, so symbol-level findings are excluded from both sides).

RepoFilesRepoWise false positivesAletheore false positives
vapor/penny-bot (Swift)16860 (36%)0
vapor/api-template (Swift)106 (60%)0
android/architecture-samples (Kotlin)26877, same 7 files

RepoWise's Swift support doesn't understand whole-module imports: a Swift import Foo names a compiled target, not a file, so files referenced only from outside Swift's import syntax (a Lambda handler invoked by the AWS runtime) look completely unreachable to it. Getting Aletheore to 0 on Swift, and Kotlin from an initial 31 down to an exact 7-vs-7 match with RepoWise, took five real fixes to Aletheore's own scanner, found by re-running this comparison rather than trusting an earlier pass: same-target and same-package implicit visibility, a manifest string-interpolation parsing bug, and two missing import-resolution cases (top-level Kotlin functions and constants). Full writeup and the fix history in LANGUAGE_COVERAGE.md.

Head-to-head against Graphify · on their own primary-source corpus

We ran their benchmark, not just ours.

Graphify publishes its own primary-source benchmark on ERPNext — a real ~1M-LOC Python codebase, and the exact same corpus their own BENCHMARKS.md uses. Rather than cite either tool's own numbers, we cloned ERPNext ourselves, ran both tools ourselves under one shared agent loop and one anonymized judge, and published what actually happened. A widely-circulated "70%/71.5x token reduction" figure attributed to Graphify doesn't appear anywhere in their own repository — we don't use it here.

100%
coverage, tied with Graphify
once a bad ground-truth fact we caught was fixed
−36%
tokens per query vs. Graphify,
the real, robust win
$0.19
total real cost of the run,
45 harness + 90 judge calls
baseline (grep/read/list)+ Aletheore+ Graphify
Coverage (30 samples)92.2%100.0%93.3%
Tokens/query, excl. one MAX_TURNS timeout9,1579,80315,296

A pre-publish review caught and fixed two real problems before this shipped: one question's ground truth was factually wrong (all three tools had answered it correctly and were wrongly capped), and the raw coverage gap was driven almost entirely by one question where baseline and Graphify both hit their turn limit without converging — a real, specific result, not a distributed lead. Only 2 of 15 questions discriminate between Aletheore and Graphify at all once the ground truth is fixed — honestly, that's a tie on quality. The number that holds up consistently, not as an artifact of one question, is token cost: Aletheore answers for 36% fewer tokens than Graphify. Full writeup, raw results, and the corrections themselves, in graphify_comparison/README.md.

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-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 — averaged across five languages (Python, JavaScript, C#, C++, C) AIRview scores 2.00 against RepoWise's 1.77 on a blind 0-3 judge, but most individual per-corpus gaps sit inside that run's own measured judge noise, so read this as "roughly at parity, leaning ahead," not a decisive lead. This reverses an earlier 2.13-vs-2.35 loss, on different code and a different measurement method — see AIRVIEW_GAP.md for the full history, including a real fix that shipped but sat undetected in the benchmark for months.
⚠️ Our local setup was slower than Graphify's — scanning and indexing ERPNext took ~23 minutes against their ~1 minute. We found the real bottleneck (dead-code detection, 77% of scan time, not parsing) and fixed it: shipped in aletheore 0.9.5, verified live against the installed PyPI release at 53.23s vs the old 236.02s - 4.4x faster, real and confirmed. Indexing (~19min, a separate I/O-bound step) is now the honest remaining gap, not scan.

The point

Every number above is in a public repo, with the raw results.

418 questions across 12 corpora and 11 languages, a 50-case PR-review corpus, and the deterministic-vs-LLM writeup — all reproducible, all checked against real Aletheore output, not a mockup.