<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Spark Bench</title><description>What one DGX Spark on a desk can and cannot be trusted to do, measured honestly.</description><link>https://rakish.com/</link><language>en-us</language><item><title>My Local-LLM Code Review Benchmark Was 73% Ghosts</title><link>https://rakish.com/articles/local-llm-code-review-benchmark-73-percent-ghosts/</link><guid isPermaLink="true">https://rakish.com/articles/local-llm-code-review-benchmark-73-percent-ghosts/</guid><description>I benchmarked local LLMs as code reviewers on a DGX Spark, then audited the ground truth: 73 of 99 bugs were fixed before any reviewer saw them. What survived.</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I keep one DGX Spark on a desk at home for my own projects, and I wanted
something simple: a code review gate that runs on it, costs $0 per invocation, and
catches real bugs before a paid frontier reviewer ever sees the PR. Local
models are free once the hardware exists, so the only question left was
whether they are actually any good at reviewing code, and the only answer I
trust is one measured on my own code.&lt;/p&gt;
&lt;p&gt;Over a few weeks, my Claude Code sessions and I benchmarked two local models
against a golden set of seven real pull requests from one repo, the private
monorepo behind this lab. (A six-repo set built from bugs that actually shipped
comes later this week.) We ran well
over a thousand review completions, found a result exciting enough to almost
publish, and then audited our own measurement and watched most of it
collapse. Total API spend for the entire program: under $10, nearly all of
it on a frontier model used as a &lt;em&gt;judge&lt;/em&gt; rather than a reviewer.&lt;/p&gt;
&lt;p&gt;This is the story of the collapse, because the collapse is the useful part.
Most of it had one cause: 73 of the 99 bugs in our ground truth were ghosts,
already fixed inside their own pull requests before any reviewer of the
final diff could have seen them. The single transferable lesson: &lt;strong&gt;your
benchmark&apos;s ground truth deserves more scrutiny than your model, and it will
not get it unless you schedule it.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The stack&lt;/h2&gt;
&lt;p&gt;Everything below runs on &lt;strong&gt;one NVIDIA DGX Spark&lt;/strong&gt; (GB10, the ARM/Grace
desktop box, 128 GB unified memory), with both models resident
simultaneously under &lt;strong&gt;vLLM&lt;/strong&gt; behind OpenAI-compatible endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qwen3.8-27B, NVFP4-quantized, served at 262K context: the careful model,
our &quot;eyes.&quot; Slow (~11 tok/s decode), strongest local review signal.&lt;/li&gt;
&lt;li&gt;Nemotron-3.5-Lightning-30B-A3B, also NVFP4: the fast model, our &quot;hands.&quot;
~7× the decode speed, near-perfect structured output and tool-calling.&lt;/li&gt;
&lt;li&gt;semgrep as the deterministic floor, with repo-specific rules for our known
historical bug classes.&lt;/li&gt;
&lt;li&gt;Claude Sonnet 4.6 over the API as the judge, used only to adjudicate eval
results, at cents per decision. Every number below was judged by 4.6; the
pinned-basis column was re-judged with Sonnet 5 before publication (appendix,
&quot;Judge vintage check&quot;).&lt;/li&gt;
&lt;li&gt;CodeRabbit as the paid ceiling: it reviews every PR after the local gate
has had its shot.&lt;/li&gt;
&lt;li&gt;The gate itself is a small Python CLI (&lt;code&gt;von review&lt;/code&gt;) that assembles the
diff, fans out finder seeds, and runs a verifier pass. Thin plumbing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No cluster, no cloud GPUs, no fine-tuning. The point of the program was to
find out what this exact commodity setup can and cannot be trusted to do.&lt;/p&gt;
&lt;h2&gt;The instrument&lt;/h2&gt;
&lt;p&gt;The gate under test is a three-tier pre-push pipeline: a deterministic
semgrep floor, a recall-first &quot;bug hunter&quot; finder sampled across seeds, and
a skeptical verifier that reads the actual file and tries to refute each
finding.&lt;/p&gt;
&lt;p&gt;The instrument is a golden set: 8 real merged PRs, ground truth derived from
what a frontier reviewer plus human curation actually flagged. Every
configuration change to the gate has to beat its predecessor on this set
before it ships. We call the rule &lt;em&gt;eval-before-rewiring&lt;/em&gt;, and it is the only
reason the rest of this story is measurement instead of vibes. It is also,
as you&apos;ll see, not enough on its own.&lt;/p&gt;
&lt;h2&gt;Act 1: The instrument was lying (the first time)&lt;/h2&gt;
&lt;p&gt;The first overnight sweep compared prompt and sampling variants across both
models, including a Qwen arm with thinking mode enabled, which we expected
to win. It scored best (11 true positives vs 4 for every other arm), and we
almost wrote it up as &quot;reasoning helps.&quot;&lt;/p&gt;
&lt;p&gt;Then we looked at the completions. &lt;strong&gt;Zero of 96 contained any thinking
markup.&lt;/strong&gt; The arm that &quot;won with reasoning&quot; had never reasoned at all.&lt;/p&gt;
&lt;p&gt;The mechanism is worth knowing if you run local models: our harness requests
strict JSON via &lt;code&gt;response_format: json_schema&lt;/code&gt;. Under vLLM&apos;s guided
decoding, with no reasoning parser configured server-side, the grammar
clamps generation from the first token. The model is structurally incapable
of writing into its think block: the request says &quot;think carefully,&quot; and the
decoder says &quot;your next token is &lt;code&gt;{&lt;/code&gt;.&quot; The chat template had injected its
highest-effort reasoning instruction and pre-opened a think tag that could
never be used.&lt;/p&gt;
&lt;p&gt;So the sweep hadn&apos;t measured thinking. It had measured the instruction to
think, with no thinking behind it. Pure framing. And on the strict scorer,
that framing alone took recall from 0.058 to 0.164, at no latency cost.&lt;/p&gt;
&lt;h2&gt;Act 2: Real thinking lost at every effort level&lt;/h2&gt;
&lt;p&gt;The obvious objection: fine, framing beats &lt;em&gt;suppressed&lt;/em&gt; thinking, but surely
actual thinking beats both? We unclamped it and ran the full sweep: three
effort levels, 96 runs each, 21.5 hours of wall clock, telemetry verifying
the model genuinely reasoned this time.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;arm (strict scorer)&lt;/th&gt;
&lt;th&gt;true positives&lt;/th&gt;
&lt;th&gt;recall&lt;/th&gt;
&lt;th&gt;wall clock&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;framing only (no reasoning tokens)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;11&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.164&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1.4h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true thinking, low effort&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;0.043&lt;/td&gt;
&lt;td&gt;4.7h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true thinking, medium&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0.014&lt;/td&gt;
&lt;td&gt;6.6h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true thinking, xhigh&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0.014&lt;/td&gt;
&lt;td&gt;10.1h&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The failure mode was visible in the transcripts: the model would spend
thousands of reasoning tokens correctly enumerating candidate issues, then
&lt;em&gt;dismiss them&lt;/em&gt;. &quot;Not severe enough to block.&quot; Verdict: pass, zero findings.
For a recall-first task, deliberation bought conservatism, not coverage.&lt;/p&gt;
&lt;p&gt;We were now sitting on a tidy, counterintuitive headline: framing beats
thinking. Hold that thought, because the next two acts are about what
happened when we tried to make that number trustworthy.&lt;/p&gt;
&lt;h2&gt;Act 3: The judge that agreed with us&lt;/h2&gt;
&lt;p&gt;Strict matchers (exact-ish file/line/category matching) are reproducible and
free, but they undercount: a finding that describes the right bug with
drifted line numbers scores zero. So we added the standard fix, a frontier
model as &lt;em&gt;matching judge&lt;/em&gt;: given ground truth and a reviewer&apos;s findings for
the same PR, decide which findings describe the same underlying problem.
Eighty-eight judge calls, thirty-five cents.&lt;/p&gt;
&lt;p&gt;The calibrated numbers were glorious. The framing arm&apos;s true recall came
back as 0.667 against 0.400 for the best alternative. It was the only arm
credited with a critical catch. We drafted the article. An earlier version
of this very piece stated those numbers as findings.&lt;/p&gt;
&lt;p&gt;Then we did the thing that saved us, mostly by luck: we audited a sample of
the judge&apos;s match decisions by hand before publishing.&lt;/p&gt;
&lt;p&gt;Three out of fourteen sampled matches were real. The judge was
theme-matching: a dead-code nit &quot;matched&quot; a sync-state bug because both
lived in the same file; a finding that talked itself out of its own claim
(&quot;not a bug, drop this&quot;) still got credit for the bug it had retracted. We
tightened the rubric. The tightened judge theme-matched too, just more
politely. What finally held was a two-stage protocol: a mapper proposes
matches, and a second adversarial pass must &lt;em&gt;confirm each one&lt;/em&gt; by
articulating the shared failure mode, with every decision persisted for
audit. Under the confirmed judge, run twice for repeatability, the results
were identical both times.&lt;/p&gt;
&lt;h2&gt;Act 4: The golden set was haunted&lt;/h2&gt;
&lt;p&gt;The confirmed judge collapsed the numbers, but auditing &lt;em&gt;why&lt;/em&gt; it collapsed
them exposed the deeper defect, and this one was in the ground truth itself.&lt;/p&gt;
&lt;p&gt;Our golden set was built from a frontier reviewer&apos;s comments on real PRs.
Those comments were made against intermediate commits. Authors then &lt;em&gt;fixed&lt;/em&gt;
most of those bugs inside the same PR, before merge. Our benchmark replayed
each PR as one diff, base to final head, and asked reviewers to find the
bugs. &lt;strong&gt;73 of the 99 located ground-truth items, including both criticals,
were fixed within their own PRs, absent from the code any reviewer ever
saw.&lt;/strong&gt; We had been grading models on their ability to find ghosts, and the
lenient judge had been happy to certify sightings.&lt;/p&gt;
&lt;p&gt;Corrected, on the findable basis (bugs actually present in the reviewed
code): the celebrated framing arm caught 1 of 7. The best competing arm
caught 0. The production three-seed deep configuration, the one we actually
ship, caught 4 of 7 (0.571 findable recall). Those are the honest numbers,
and they are the &lt;em&gt;only&lt;/em&gt; numbers from this program I&apos;d repeat at a dinner
table.&lt;/p&gt;
&lt;p&gt;The fix shipped as golden set v2: every ground-truth item is now pinned to
the commit state its evidence was made against, findability is verified
deterministically (the item&apos;s location must exist in the pinned diff), and
a second ground-truth tier was mined from &lt;em&gt;post-merge reality&lt;/em&gt;: bugs that
actually shipped and later needed fixing, including one that silently
corrupted 191 production database rows. Bugs reality found, as a separate
scoring basis no judge can inflate.&lt;/p&gt;
&lt;h2&gt;Act 5: The headline fails replication&lt;/h2&gt;
&lt;p&gt;One question remained for the original finding: framing beat thinking on
one model family, measured by a lenient judge. Does the effect survive the
honest instrument, and does it transfer?&lt;/p&gt;
&lt;p&gt;We ran the replication: five arms, 480 completions: framing on Nemotron,
no framing on Nemotron, thinking-JSON on Nemotron, and two framing dose
variants on Qwen (posture tag alone vs full framing words at low effort).
Under the confirmed judge, across all five arms: &lt;strong&gt;one confirmed catch,
total.&lt;/strong&gt; On Nemotron, the unframed arm out-ranked both framed arms even on
the strict scorer. The dose question dissolved: nothing survived
confirmation to dose.&lt;/p&gt;
&lt;p&gt;So the honest epitaph for our own headline: framing-beats-thinking was a
within-family ranking artifact, measured against haunted ground truth by a
lenient judge. What actually separates configurations is none of the prompt
cosmetics: it&apos;s single-prompt review (noise-level, all arms, both families)
versus the multi-seed deep finder with a verifier behind it (0.571 findable
recall, the only local configuration with signal).&lt;/p&gt;
&lt;p&gt;One more check closed the program. We re-ran the three arms against the
review-time pinned diffs, where 14 of the 15 ground-truth items are findable
instead of 7. The deep finder caught 8 of 14, the same 0.571, and this time
both of the correctness-critical items, which had been ghosts at the final
head. Framing alone caught 4 of 14 with no criticals; the fast model&apos;s card
configuration caught nothing on any basis. (Re-judged with Sonnet 5 before
publication: deep 9 of 14, framing 1 to 2 of 14, criticals and ranking
unchanged; the appendix has the per-item reasons.)&lt;/p&gt;
&lt;h2&gt;Interlude: build vs. adopt, measured on the same instrument&lt;/h2&gt;
&lt;p&gt;Mid-program we tried to replace our home-built gate with
alibaba/open-code-review, a polished precision-first agent, and separately
tried distilling its per-language rule docs into our finder prompt as a
checklist. Both tests ran on the pre-audit instrument, so the absolute
numbers carry that era&apos;s caveat, but both decisions survive it. The agent&apos;s
precision bet is real and its context appetite is not local-servable (~471K
input tokens to review one file); its recall came in at a fifth of ours on
the same judge, a gap no re-audit direction can flip. The checklist made our
finder worse on every axis and destabilized it into spray blowouts and
empty collapses. Borrowed wisdom carries its design philosophy with it, and
each verdict cost about a day because the instrument already existed.&lt;/p&gt;
&lt;h2&gt;What runs today, and the honest ceiling&lt;/h2&gt;
&lt;p&gt;The shipped gate: semgrep floor on every push, deep multi-seed finder for
significant pushes, verifier on top, frontier reviewer after. The deep pass
runs in about six minutes on the box, at $0 marginal. On the audited basis
it catches a bit over half of the findable known bugs, with spray-level
per-run precision (this feeds a verifier and a human, not a dashboard). The
deterministic layer stays the only tier with veto power, because the local
verifier over-refutes: it has talked itself out of real block-severity bugs.&lt;/p&gt;
&lt;p&gt;The local tier does not replace frontier review, and the audited numbers
say it plainer than the optimistic ones ever could. What it does is cheap,
early, and on-premises triage, with a measured boundary instead of a vibe.&lt;/p&gt;
&lt;h2&gt;The playbook&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Verify your instrument before your subject.&lt;/strong&gt; Guided decoding silently
disabled thinking and we nearly published &quot;reasoning helps.&quot; Check raw
completions, not scores alone; probe one completion by hand before
batching any new model mode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit your judge, then audit your ground truth.&lt;/strong&gt; Our first judge
inflated recall 10×; our ground truth was 73% ghosts. Both audits
together cost under two days and less than $5, and they were worth more
than every sweep combined. An adversarial confirmation pass (the judge
must articulate the shared failure mode, decisions persisted) is cheap
to build and repeatable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pin ground truth to the code state its evidence saw.&lt;/strong&gt; Review comments
are made against intermediate commits; replaying final diffs manufactures
ghosts. If an item&apos;s location isn&apos;t in the pinned diff, it isn&apos;t
findable, and it doesn&apos;t belong in the denominator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distrust results that flatter your setup, in proportion to the
flattery.&lt;/strong&gt; Every instrument error in this program pushed the same
direction: toward the conclusion we wanted. Ghosts inflate recall,
lenient judges inflate recall, theme-matching inflates recall. Honest
instruments mostly make your numbers worse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strict matchers rank, judges calibrate, and neither is trustworthy
unverified.&lt;/strong&gt; The strict scorer&apos;s celebrated ranking also failed to
replicate. Treat small strict-basis deltas as noise, and never make an
adopt/reject call on an unaudited instrument.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep the golden set alive, and audit it on a schedule.&lt;/strong&gt; Every decision
in this program cost about a day and single-digit dollars because the
harness already existed. But the harness is only an asset while its
ground truth is honest; ours went a full month before anyone checked.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The gate this produced reviews every significant push on my repos, on my
own hardware, for free. It catches about half of what&apos;s actually there, we
know that number is real because we tried very hard to kill it, and that
combination beats every prettier number this program ever produced.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This is Spark Bench: what one DGX Spark on a desk can and cannot be trusted
to do, measured honestly. Next: the gate above runs on two local models that
share one 128 GB box with everything else my coding agents need, and the
config that makes that fit is the next article. The 47 bugs that actually
shipped, and how the same gate scores against them, follow later this week.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Appendix: the numbers behind the story&lt;/h2&gt;
&lt;p&gt;The three measurements that changed the verdict, side by side. Union recall
means &quot;caught by at least one of the arm&apos;s runs&quot;; the findable basis counts
only ground-truth items that exist in the diff the reviewer actually saw.
All three columns score the same seven pull requests (an eighth, PR 144,
exceeds the models&apos; context window on every basis and is excluded from
every arm). Two of the seven carry no ground-truth items and count only
toward precision; the 14 findable items sit on the other five. Qwen3.8-27B NVFP4 and Nemotron-3.5-Lightning-30B-A3B NVFP4,
vLLM 0.27.1, 2026-08 to 2026-09.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;arm&lt;/th&gt;
&lt;th&gt;lenient judge, final-head diffs (Aug 28)&lt;/th&gt;
&lt;th&gt;confirmed judge, final-head diffs (Sep 13)&lt;/th&gt;
&lt;th&gt;confirmed judge, pinned diffs (Sep 14)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;single prompt, framing (q38)&lt;/td&gt;
&lt;td&gt;0.667&lt;/td&gt;
&lt;td&gt;0.143 findable (1 of 7)&lt;/td&gt;
&lt;td&gt;0.286 findable (4 of 14)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;single prompt, card sampling (Nemotron)&lt;/td&gt;
&lt;td&gt;0.400&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deep: 3 seeds + verifier (production)&lt;/td&gt;
&lt;td&gt;reported as 1.0&lt;/td&gt;
&lt;td&gt;0.571 findable (4 of 7)&lt;/td&gt;
&lt;td&gt;0.571 findable (8 of 14), both criticals&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Judge vintage check (Sep 14, Sonnet 5)&lt;/h3&gt;
&lt;p&gt;The judge of record for this article is Sonnet 4.6, because the audit in Act
3 is an audit of that judge&apos;s decisions. Sonnet 5 shipped before publication,
so the pinned-basis column was re-judged with it on identical inputs: same
finder output, same ground truth, same mapper and confirmation prompts. Claude
5 models refuse a fixed temperature, so the re-judge ran twice.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;arm, pinned diffs&lt;/th&gt;
&lt;th&gt;Sonnet 4.6&lt;/th&gt;
&lt;th&gt;Sonnet 5, pass 1&lt;/th&gt;
&lt;th&gt;Sonnet 5, pass 2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;single prompt, framing (q38)&lt;/td&gt;
&lt;td&gt;4 of 14&lt;/td&gt;
&lt;td&gt;2 of 14&lt;/td&gt;
&lt;td&gt;1 of 14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;single prompt, card sampling (Nemotron)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deep: 3 seeds + verifier&lt;/td&gt;
&lt;td&gt;8 of 14, 2 of 2 criticals&lt;/td&gt;
&lt;td&gt;9 of 14, 2 of 2&lt;/td&gt;
&lt;td&gt;9 of 14, 2 of 2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every disagreement was read by hand. The deep arm&apos;s extra item is a PR 42
finding that names the same missing CLI validation as the ground-truth item
with a differently worded consequence; 4.6&apos;s verifier rejected it on the
wording, Sonnet 5 confirmed it, and I agree with Sonnet 5. The framing arm&apos;s
lost items all come from its tests angle, which states a defect in the form
&quot;this path has no guard and no test covers it&quot;; Sonnet 5 reads those as
coverage findings, which the rubric excludes, and dropped one more of them on
its second pass than its first. Whether &quot;no guard, add a test&quot; counts as
finding the bug is a rubric call, and the honest statement is that the
framing arm found between 1 and 4 of 14 depending on it. What does not move
under either judge: the ranking (deep, then framing, then card sampling),
zero criticals for the single-prompt arms, and both criticals for the deep
arm. The judge default in the harness is Sonnet 5 from this date forward,
and every scorecard now records which model judged it.&lt;/p&gt;
&lt;p&gt;What pinning did to the ground truth itself:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;basis&lt;/th&gt;
&lt;th&gt;located items&lt;/th&gt;
&lt;th&gt;findable&lt;/th&gt;
&lt;th&gt;ghosts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;final-head diffs&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;review-time pinned diffs&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The confirmed-judge protocol, in four sentences. A mapper call proposes
finding-to-ground-truth matches over the full text of both sides (the first
judge saw 280 characters of each, which is how it missed self-retractions).
A second, adversarial call then takes each proposed pair alone and must
articulate the shared failure mode before it may confirm; its default is no.
Only confirmed pairs count, and every decision is persisted with its
rationale so the audit can be repeated. Repeated twice on the same inputs, it
produced the same matches both times.&lt;/p&gt;
&lt;p&gt;What is not published: the pinned diffs and the raw review outputs, because
both are the source code of the repositories under review. The specs, the
harness, and every aggregate above are the reproducible part.&lt;/p&gt;
</content:encoded></item></channel></rss>