---
title: "AI Vulnerability Discovery: One Frontier Model or Three Specialists?"
description: "A reproducible benchmark design for the decision security teams actually face: spend the same research budget on repeated runs of one strong model, or on a diverse model team—and count only vulnerabilities that survive root-cause review, reproduction, and a fixed-version negative control."
date: 2026-08-24
author: Sevban Dönmez (@jankesec)
canonical: https://jankesec.com/posts/ai-vulnerability-discovery-benchmark/
---

## The benchmark question in 60 seconds

The expensive question is not which AI model can produce the most convincing security report.

It is which research configuration finds the largest set of **real, reproducible vulnerabilities**
before the same budget runs out.

Those are different questions. A model can write a precise explanation of a dead code path. It can
name the correct vulnerability class while missing the reachable entry point. It can also produce
twenty plausible candidates that transfer the real cost to a human reviewer. A leaderboard that
counts persuasive text rewards all three failure modes.

Recent work points to a more useful experiment. Aikido reports that it ran ten models against 32
recently disclosed vulnerabilities, three passes per case, with a frozen harness, no internet, and
a 30-turn limit. Its most important result is not the winning model name. It is the gap between a
single pass and the union of repeated passes: one reported result increased from 17 vulnerabilities
in its first pass to 28 across three passes. Different trajectories recovered bugs that earlier
trajectories missed.

But that leaves the practical decision unanswered:

> If three independent investigations are affordable, should all three use the same strongest
> model, or should three different models search the code in different ways?

This article specifies the benchmark I would run to answer that question. It does **not** present
unperformed results. The output here is the experiment contract: dataset, controls, scoring,
evidence standard, and the decision rules that turn measurements into a research-team design.

## The practical answer: choose by operating constraint

If I had to deploy one configuration from the published evidence today, I would start with
**DeepSeek V4 Flash 0731 in three independent runs**. Aikido reports that those three runs recovered
24 of 32 vulnerabilities for about $108. That is roughly **$4.50 per recovered case** inside this
specific benchmark—less than half the approximately $10.54 per case implied by three DeepSeek V4
Pro runs.

That recommendation has one condition: the pipeline must deduplicate and independently validate
candidates. Aikido observed that the cheaper, exploratory models also generated more false leads.
If human triage is the scarce resource, the nominal token saving can disappear.

| Operating priority | Model and run plan | Why I would choose it | Trade-off |
| --- | --- | --- | --- |
| Best published price-to-coverage | **DeepSeek V4 Flash 0731 × 3** | 24/32 pooled for about $108 | More candidate noise; requires a strong verifier |
| Maximum published coverage | **DeepSeek V4 Pro 0813 × 3** | Highest pooled result at 28/32 for about $295 | Only 10/32 were repeated in every run; more triage |
| Lowest open-model triage load | **Kimi K3 × 3** | 92.3% pooled precision, 25/32 coverage, median 12 turns | Did not match DeepSeek Pro's total coverage |
| Strong open-model first pass | **GLM-5.3** | Highest pass@1 recall among the tested open models; 25/32 pooled | Published cost per recovered case was $19.65 |
| Most repeatable behavior | **Grok 4.6 × 3** | 21 cases appeared in all three runs; 26/32 pooled | Premium cost for coverage that cheaper teams approached |
| Strongest single published pass | **Opus 5 × 1** | Best individual pass at 25/32; reports required less downstream cleanup | A single premium pass was reported in the roughly $450–$590 band |
| Clean reasoning reports | **Sol** | 25/32 pooled, 19 consistent; clear input-to-impact explanations | Premium price and lower pooled coverage than DeepSeek Pro |

My default operating route would therefore be:

1. Run **DeepSeek V4 Flash 0731** three times with clean state and identical limits.
2. Merge candidates by root cause, not by title or CWE label.
3. Require reproduction and a fixed-version negative control.
4. Escalate only high-risk or low-coverage components to **DeepSeek V4 Pro 0813**.
5. If reviewer time becomes the bottleneck, replace the broad first pass with **Kimi K3** rather
   than pretending that model-token cost is the whole cost.

This is a recommendation derived from Aikido's published measurements, not a universal model
ranking. The dataset, harness, prompt, provider routing, and prices can change the ordering. The
study is also vendor-operated rather than an independently reproducible public leaderboard, so I
would use these numbers to select a local bake-off—not as permanent procurement evidence.

### What the published model results actually say

The source article does not expose every raw field for all ten tested models. The table below keeps
unknown cells unknown instead of reconstructing them from charts or marketing copy. “Pooled” means
the union of three runs; “consistent” means the same case was found in all three.

| Published model | First or best disclosed pass | Pooled across three | Consistent across three | Precision / investigation signal | Published cost signal |
| --- | ---: | ---: | ---: | --- | --- |
| DeepSeek V4 Pro 0813 | 17 first pass | **28/32** | 10/32 | Median 24 of 30 turns; many false leads | About **$295 for three runs** |
| DeepSeek V4 Flash 0731 | Not disclosed | 24/32 | Not disclosed | Cheap coverage with the same exploratory-noise caveat | About **$108 for three runs** |
| Qwen3.8-Max | 19 first pass | 26/32 | Not disclosed | Recalled older patched CVEs in 95/96 traces | Not disclosed |
| Kimi K3 | 17 first pass | 25/32 | Not disclosed | **92.3% pooled precision**; median 12 turns | Not disclosed |
| Grok 4.6 | 24 best pass | 26/32 | **21/32** | Most repeatable tested model | Premium band; exact line item not disclosed |
| Opus 5 | **25 best pass** | 26/32 | 19/32 | Persistent; cleaner downstream workload | Premium single-pass band |
| Sol | Not disclosed | 25/32 | 19/32 | About 2.74 candidates per investigation; clean reasoning | Premium single-pass band |
| GLM-5.3 | Highest open pass@1; count not disclosed | 25/32 | 18/32 | Median 23 turns; competitive precision | **$19.65 per recovered case** |

The most important row is still the run plan, not the logo. DeepSeek Pro moved from 17 cases on its
first pass to 28 across three. Qwen moved from 19 to 26, and Kimi from 17 to 25. For vulnerability
discovery, the published evidence supports several independent searches much more strongly than it
supports a one-shot “best model” purchase.

## Benchmark the research team, not the chat model

An AI vulnerability researcher is not just a model. It is a model inside a harness with a code
browser, search, build tools, a debugger, a budget, a prompt, and a verifier. Google Project Zero's
Naptime work demonstrated the size of this effect: a specialised, interactive tool environment
raised performance dramatically over a zero-shot model on CyberSecEval 2 tasks. Project Zero also
made the necessary caveat—substantial progress was still needed before these systems could have a
meaningful effect on daily vulnerability research.

That means a fair comparison changes one variable at a time. The first experiment measures model
diversity. The second, optional experiment measures role specialisation.

<figure class="diagram">
<svg viewBox="0 0 780 500" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="A controlled benchmark compares three independent runs of one model with one run each from three different models. Both tracks receive identical vulnerable repositories, tools, instructions, and budgets. Candidate reports pass through reproduction, root-cause review, and a fixed-version negative control before the verified union and overlap are measured.">
<defs><marker id="bench-team-a" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-accent" /></marker><marker id="bench-team-r" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" /></marker></defs>
<text x="4" y="20" class="dg-accent">THE CONTROLLED QUESTION</text><text x="204" y="20" class="dg-muted">SAME CASES · SAME HARNESS · SAME TOTAL BUDGET</text>
<rect x="0" y="54" width="780" height="66" rx="10" class="dg-box"/><text x="20" y="81" class="dg-label">Frozen input</text><text x="20" y="104" class="dg-mono">patched OSS snapshots · hidden ground truth · no internet · clean session per run</text>
<line x1="390" y1="122" x2="390" y2="151" class="dg-line-accent" marker-end="url(#bench-team-a)"/>
<rect x="0" y="156" width="370" height="154" rx="10" class="dg-box-accent"/><text x="20" y="184" class="dg-label">TRACK A · MONOCULTURE</text><text x="20" y="208" class="dg-muted">one strong model · three fresh trajectories</text>
<rect x="20" y="230" width="96" height="56" rx="8" class="dg-box"/><text x="68" y="255" text-anchor="middle" class="dg-label">A · run 1</text><text x="68" y="275" text-anchor="middle" class="dg-mono">same role</text>
<rect x="137" y="230" width="96" height="56" rx="8" class="dg-box"/><text x="185" y="255" text-anchor="middle" class="dg-label">A · run 2</text><text x="185" y="275" text-anchor="middle" class="dg-mono">fresh state</text>
<rect x="254" y="230" width="96" height="56" rx="8" class="dg-box"/><text x="302" y="255" text-anchor="middle" class="dg-label">A · run 3</text><text x="302" y="275" text-anchor="middle" class="dg-mono">fresh state</text>
<rect x="410" y="156" width="370" height="154" rx="10" class="dg-box-crit"/><text x="430" y="184" class="dg-label">TRACK B · DIVERSE TEAM</text><text x="430" y="208" class="dg-muted">three model families · identical researcher role</text>
<rect x="430" y="230" width="96" height="56" rx="8" class="dg-box"/><text x="478" y="255" text-anchor="middle" class="dg-label">A · run 1</text><text x="478" y="275" text-anchor="middle" class="dg-mono">model A</text>
<rect x="547" y="230" width="96" height="56" rx="8" class="dg-box"/><text x="595" y="255" text-anchor="middle" class="dg-label">B · run 1</text><text x="595" y="275" text-anchor="middle" class="dg-mono">model B</text>
<rect x="664" y="230" width="96" height="56" rx="8" class="dg-box"/><text x="712" y="255" text-anchor="middle" class="dg-label">C · run 1</text><text x="712" y="275" text-anchor="middle" class="dg-mono">model C</text>
<path d="M185 312 L185 344 L390 344" class="dg-line-accent"/><path d="M595 312 L595 344 L390 344" class="dg-line-crit"/><line x1="390" y1="344" x2="390" y2="369" class="dg-line-crit" marker-end="url(#bench-team-r)"/>
<rect x="100" y="374" width="580" height="68" rx="10" class="dg-box-crit"/><text x="390" y="401" text-anchor="middle" class="dg-label">INDEPENDENT EVIDENCE GATE</text><text x="390" y="426" text-anchor="middle" class="dg-mono">reachable path + trigger + root cause + fixed-version failure</text>
<line x1="390" y1="444" x2="390" y2="468" class="dg-line-accent" marker-end="url(#bench-team-a)"/>
<text x="390" y="493" text-anchor="middle" class="dg-accent">COMPARE VERIFIED UNION · OVERLAP · COST · TRIAGE</text>
</svg>
<figcaption>The first test isolates model diversity: Track B does not receive specialist prompts yet. Otherwise a better result could come from different instructions rather than different model behavior.</figcaption>
</figure>

### Track A — one model, three independent passes

Run the strongest candidate model three times. Each run starts with empty memory, the same system
prompt, the same repository snapshot, and the same tool permissions. Do not let run two see run
one's hypotheses. This measures the value of stochastic exploration within one model family.

### Track B — three models, one pass each

Choose three model families with credible code-navigation and tool-use capability. Give each the
same researcher role used in Track A. Keep the harness, repository, maximum turns, tool output,
and stopping conditions fixed. This isolates whether model diversity contributes findings that
same-model repetition does not.

Only after this comparison should a third track introduce specialisation—for example, one agent
for input-to-sink tracing, one for patch-guided variant analysis, and one for reproduction. Mixing
role specialisation into Track B from the beginning would make the headline attractive and the
conclusion scientifically weak.

## The dataset must resist recognition, not just memorisation

“Recently disclosed” is a useful filter, but it is not proof that a model has never seen the code,
advisory, pull request, or private evaluation data. A model that recognizes an old CVE may still
perform useful variant analysis, but that is a different capability from discovering a flaw from
source.

I would build 36 cases from patched open-source repositories and freeze them before the model
comparison begins. Each case contains both a vulnerable snapshot and a fixed snapshot, but the
agent sees only the vulnerable one. The evaluator keeps the patch, advisory, trigger, and expected
path hidden.

Use six balanced strata:

| Stratum | Cases | What it forces the agent to do |
| --- | ---: | --- |
| Memory safety | 6 | Follow sizes, lifetimes, sentinels, and state across functions |
| Injection and parsing | 6 | Reconstruct how attacker-controlled bytes reach an interpreter or parser |
| Authentication and authorization | 6 | Distinguish valid identity data from permission to perform an action |
| Path and archive handling | 6 | Reason about canonicalisation, extraction roots, and filesystem effects |
| Cross-module business logic | 6 | Join decisions spread across routes, services, and persistence layers |
| Patch-sibling variants | 6 | Start from a known fix pattern and locate an unfixed equivalent in a safe snapshot |

Project-level scope matters. CyberSecEval 2 provides generated exploitation tasks that reduce
memorisation and make automated scoring possible. SEC-bench packages real vulnerabilities in
containerised, reproducible environments. CVE-Bench focuses on exploitation of real web
application CVEs in sandboxes. VulnGym adds project-level code and human-reviewed semantic paths
from reachable entry point to critical operation. Together they show why a single function marked
“vulnerable” is too small a unit for this experiment: real discovery includes locating the path.

<figure class="diagram">
<svg viewBox="0 0 780 520" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="A benchmark case is assembled from a vulnerable repository snapshot, a hidden fixed snapshot, a hidden trigger, and a human-reviewed semantic path. The agent receives only the vulnerable repository and bounded tools. The evaluator uses the hidden artifacts to reject memorized labels, unreachable reports, and failures that also occur on the fixed version.">
<defs><marker id="bench-case-a" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-accent" /></marker><marker id="bench-case-r" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" /></marker></defs>
<text x="4" y="20" class="dg-accent">ANATOMY OF ONE CASE</text><text x="184" y="20" class="dg-muted">SEPARATE WHAT THE AGENT SEES FROM WHAT PROVES THE ANSWER</text>
<text x="4" y="55" class="dg-muted">VISIBLE TO THE AGENT</text>
<rect x="0" y="72" width="240" height="112" rx="10" class="dg-box-accent"/><text x="20" y="101" class="dg-label">Vulnerable snapshot</text><text x="20" y="127" class="dg-mono">full repository · exact commit</text><text x="20" y="153" class="dg-mono">dependencies pinned · network off</text><text x="20" y="176" class="dg-accent">NO ADVISORY OR PATCH</text>
<rect x="270" y="72" width="240" height="112" rx="10" class="dg-box"/><text x="290" y="101" class="dg-label">Bounded research tools</text><text x="290" y="127" class="dg-mono">search · build · test · debugger</text><text x="290" y="153" class="dg-mono">turn · time · output ceilings</text><text x="290" y="176" class="dg-muted">EVERY ACTION LOGGED</text>
<rect x="540" y="72" width="240" height="112" rx="10" class="dg-box"/><text x="560" y="101" class="dg-label">Neutral task</text><text x="560" y="127" class="dg-mono">find and substantiate security</text><text x="560" y="153" class="dg-mono">defects in the supplied source</text><text x="560" y="176" class="dg-muted">NO CWE OR FILE HINT</text>
<line x1="120" y1="186" x2="120" y2="224" class="dg-line-accent" marker-end="url(#bench-case-a)"/><line x1="390" y1="186" x2="390" y2="224" class="dg-line-accent" marker-end="url(#bench-case-a)"/><line x1="660" y1="186" x2="660" y2="224" class="dg-line-accent" marker-end="url(#bench-case-a)"/>
<rect x="110" y="228" width="560" height="72" rx="10" class="dg-box-accent"/><text x="390" y="257" text-anchor="middle" class="dg-label">CANDIDATE REPORT + TRACE</text><text x="390" y="282" text-anchor="middle" class="dg-mono">claimed input · code path · missing control · impact · reproduction</text>
<text x="4" y="344" class="dg-muted">HIDDEN FROM THE AGENT</text>
<rect x="0" y="362" width="180" height="96" rx="10" class="dg-box-crit"/><text x="18" y="389" class="dg-label">Known trigger</text><text x="18" y="415" class="dg-mono">deterministic oracle</text><text x="18" y="441" class="dg-crit">REPRODUCES</text>
<rect x="200" y="362" width="180" height="96" rx="10" class="dg-box-crit"/><text x="218" y="389" class="dg-label">Fixed snapshot</text><text x="218" y="415" class="dg-mono">same test · one fix</text><text x="218" y="441" class="dg-crit">MUST FAIL</text>
<rect x="400" y="362" width="180" height="96" rx="10" class="dg-box-crit"/><text x="418" y="389" class="dg-label">Semantic path</text><text x="418" y="415" class="dg-mono">entry → operation</text><text x="418" y="441" class="dg-crit">ROOT CAUSE MATCH</text>
<rect x="600" y="362" width="180" height="96" rx="10" class="dg-box-crit"/><text x="618" y="389" class="dg-label">Blind reviewers</text><text x="618" y="415" class="dg-mono">model identity hidden</text><text x="618" y="441" class="dg-crit">ADJUDICATE</text>
<path d="M90 460 L90 485 L390 485" class="dg-line-crit"/><path d="M290 460 L290 485 L390 485" class="dg-line-crit"/><path d="M490 460 L490 485 L390 485" class="dg-line-crit"/><path d="M690 460 L690 485 L390 485" class="dg-line-crit"/>
<text x="390" y="514" text-anchor="middle" class="dg-accent">ACCEPT ONLY WHEN ALL FOUR ORACLES AGREE</text>
</svg>
<figcaption>The vulnerable repository is the task; the fixed snapshot, trigger, semantic path, and reviewer decision are the scoring system. Keeping them separate reduces label memorisation and self-grading.</figcaption>
</figure>

### Add two contamination controls

First, include **decoy cases**: repositories from the same projects where a famous historical bug
is already fixed. A model that reports the old CVE by recognition should lose precision, not gain
credit. Aikido observed one model repeatedly spending investigation time on older, already patched
issues; a benchmark should measure that behavior explicitly.

Second, create **sibling variants** in a private, non-production fork. Preserve the original
security mistake but change names, layout, and irrelevant syntax. The variant must be reviewed and
triggerable, but it must never be deployed or submitted as a claim against the upstream project.
This tests reasoning transfer without turning unknown public software into an evaluation target.

## Freeze the harness or admit that you are testing the harness

Every run receives the same capabilities:

```yaml
case:
  repository: isolated-vulnerable-snapshot
  internet: false
  advisory_visible: false
  fixed_version_visible: false

researcher:
  fresh_session: true
  max_turns: 30
  max_wall_minutes: 45
  tools: [read, search, build, test, debugger]
  write_scope: sandbox-only

output:
  required: [entry_point, root_cause, reachable_path, impact, reproduction]
  candidates_without_reproduction: triage_only
```

The exact numbers are less important than recording them. Model APIs differ in context caching,
reasoning controls, tool schemas, and price. Therefore publish two scoreboards:

1. **Equal-work scoreboard** — the same turn, wall-time, and tool limits. This asks which team does
   more research within the same operational envelope.
2. **Equal-spend scoreboard** — the same maximum provider cost, including cached tokens and tool
   calls. This asks what a security team can buy for a fixed budget.

Do not silently increase one model's context, provide a better code index to another, or retry only
the model you expect to win. If a model cannot operate the frozen tool interface reliably, that is
an operational result. Project Naptime excluded models whose multi-step tool use could not be made
reliable; the same limitation should be visible here rather than hidden as a prompt failure.

## A finding must cross four gates

Recall is meaningless until “found” has a strict definition. The benchmark must not ask another
model whether a report sounds correct and call that ground truth.

<figure class="diagram">
<svg viewBox="0 0 780 470" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="A candidate vulnerability moves through four gates: correct security decision, reachable attacker-controlled path, deterministic reproduction, and failure of the same trigger on the fixed snapshot. Candidates that fail a gate are classified as wrong root cause, unreachable, unproven, or non-specific instead of being counted as findings.">
<defs><marker id="bench-gate-a" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-accent" /></marker><marker id="bench-gate-r" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" /></marker></defs>
<text x="4" y="20" class="dg-accent">CANDIDATE → FINDING</text><text x="184" y="20" class="dg-muted">A FOUR-GATE EVIDENCE STATE MACHINE</text>
<rect x="0" y="62" width="168" height="112" rx="10" class="dg-box"/><text x="18" y="91" class="dg-label">1 · Root cause</text><text x="18" y="117" class="dg-mono">missing or broken</text><text x="18" y="140" class="dg-mono">security decision</text><text x="18" y="164" class="dg-accent">MATCH?</text>
<line x1="170" y1="118" x2="196" y2="118" class="dg-line-accent" marker-end="url(#bench-gate-a)"/>
<rect x="200" y="62" width="168" height="112" rx="10" class="dg-box"/><text x="218" y="91" class="dg-label">2 · Reachability</text><text x="218" y="117" class="dg-mono">controlled input to</text><text x="218" y="140" class="dg-mono">critical operation</text><text x="218" y="164" class="dg-accent">TRACE?</text>
<line x1="370" y1="118" x2="396" y2="118" class="dg-line-accent" marker-end="url(#bench-gate-a)"/>
<rect x="400" y="62" width="168" height="112" rx="10" class="dg-box"/><text x="418" y="91" class="dg-label">3 · Reproduce</text><text x="418" y="117" class="dg-mono">bounded trigger</text><text x="418" y="140" class="dg-mono">observable effect</text><text x="418" y="164" class="dg-accent">REPEAT?</text>
<line x1="570" y1="118" x2="596" y2="118" class="dg-line-crit" marker-end="url(#bench-gate-r)"/>
<rect x="600" y="62" width="180" height="112" rx="10" class="dg-box-crit"/><text x="618" y="91" class="dg-label">4 · Negative test</text><text x="618" y="117" class="dg-mono">same trigger against</text><text x="618" y="140" class="dg-mono">fixed snapshot</text><text x="618" y="164" class="dg-crit">NOW FAILS?</text>
<line x1="84" y1="176" x2="84" y2="226" class="dg-line dg-dash"/><line x1="284" y1="176" x2="284" y2="226" class="dg-line dg-dash"/><line x1="484" y1="176" x2="484" y2="226" class="dg-line dg-dash"/><line x1="690" y1="176" x2="690" y2="226" class="dg-line dg-dash"/>
<rect x="0" y="230" width="168" height="62" rx="8" class="dg-box-crit"/><text x="84" y="255" text-anchor="middle" class="dg-label">Wrong theory</text><text x="84" y="279" text-anchor="middle" class="dg-mono">0 finding credit</text>
<rect x="200" y="230" width="168" height="62" rx="8" class="dg-box-crit"/><text x="284" y="255" text-anchor="middle" class="dg-label">Unreachable</text><text x="284" y="279" text-anchor="middle" class="dg-mono">precision penalty</text>
<rect x="400" y="230" width="168" height="62" rx="8" class="dg-box-crit"/><text x="484" y="255" text-anchor="middle" class="dg-label">Unproven</text><text x="484" y="279" text-anchor="middle" class="dg-mono">triage candidate</text>
<rect x="600" y="230" width="180" height="62" rx="8" class="dg-box-crit"/><text x="690" y="255" text-anchor="middle" class="dg-label">Non-specific</text><text x="690" y="279" text-anchor="middle" class="dg-mono">test is invalid</text>
<rect x="110" y="344" width="560" height="76" rx="10" class="dg-box-accent"/><text x="390" y="374" text-anchor="middle" class="dg-label">VERIFIED FINDING</text><text x="390" y="400" text-anchor="middle" class="dg-mono">all gates pass · reviewers agree · evidence bundle preserved</text>
<line x1="690" y1="294" x2="690" y2="320" class="dg-line-crit"/><path d="M690 320 L390 320 L390 340" class="dg-line-accent" marker-end="url(#bench-gate-a)"/>
<text x="390" y="455" text-anchor="middle" class="dg-muted">A fluent report cannot skip a gate.</text>
</svg>
<figcaption>A candidate is useful operational data, but it becomes a benchmark finding only when the claimed cause, reachable path, reproduction, and fixed-version comparison agree.</figcaption>
</figure>

The fixed-version test is decisive. If the same trigger still “proves” the issue after the known
fix, the oracle is measuring a crash, error message, or generic behavior—not the vulnerability.
For business-logic cases, the equivalent is a state transition: the unauthorized action occurs in
the vulnerable snapshot and is denied in the fixed snapshot while the authorized control still
succeeds.

Blind two-person review should resolve semantic matches. Reviewers see the report and evidence but
not the model or track. Disagreements remain unresolved until the trigger or ground truth is
improved. An LLM judge can cluster duplicates or help route candidates; it cannot be the final
authority over the same kind of output being evaluated.

## The scoreboard needs more than recall

For each track, report these measurements together:

| Metric | Calculation | Why it matters |
| --- | --- | --- |
| Verified union recall | unique ground-truth cases found by any run / all cases | Measures total coverage purchased by the team |
| Precision | accepted candidates / all submitted candidates | Exposes the human cost hidden behind aggressive exploration |
| Consistency | cases found in all three runs / cases found by any run | Separates dependable behavior from lucky discovery |
| Unique contribution | findings produced by only one model or run | Shows whether diversity adds genuinely new coverage |
| Pairwise overlap | intersection / union for each pair | Makes monoculture and complementary search visible |
| Cost per verified finding | model, compute, and tool cost / accepted findings | Connects capability to an operating budget |
| Triage minutes per finding | reviewer time / accepted findings | Prevents cheap tokens from disguising expensive noise |
| Evidence completeness | findings passing all four gates without human repair | Measures whether the output is usable, not just suggestive |
| Time to first verified finding | elapsed run and review time | Matters when the workflow is incident- or release-bound |

Do not collapse these into one magic score. A high-recall team may be right for a quarterly source
audit and wrong for a pull-request gate. A consistent model with clean evidence may belong in the
fast lane, while exploratory models run asynchronously against high-risk components.

The most revealing visual is an overlap map, not a bar chart. If Track B finds the same 22 cases
three times, model diversity added little. If it finds 27 cases but eleven come from only one model,
that model is not necessarily “best”; it may be a specialist for a particular code or flaw class.
Break unique contribution down by stratum before changing the production team.

## Turn results into a routing policy

<figure class="diagram">
<svg viewBox="0 0 780 500" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="A decision map converts benchmark outcomes into an AI research workflow. Stable high-precision findings go to a primary model, categories with measured unique contributions go to specialist models, noisy candidates go to a deterministic verifier, and every accepted issue requires human root-cause review before reporting.">
<defs><marker id="bench-route-a" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-accent" /></marker><marker id="bench-route-r" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" /></marker></defs>
<text x="4" y="20" class="dg-accent">FROM LEADERBOARD TO TEAM DESIGN</text><text x="278" y="20" class="dg-muted">ROUTE BY MEASURED BEHAVIOR</text>
<rect x="230" y="54" width="320" height="72" rx="10" class="dg-box-accent"/><text x="390" y="83" text-anchor="middle" class="dg-label">Frozen benchmark results</text><text x="390" y="107" text-anchor="middle" class="dg-mono">coverage · overlap · precision · cost · strata</text>
<path d="M390 128 L390 158 L122 158 L122 184" class="dg-line-accent" marker-end="url(#bench-route-a)"/><path d="M390 128 L390 184" class="dg-line-accent" marker-end="url(#bench-route-a)"/><path d="M390 158 L658 158 L658 184" class="dg-line-accent" marker-end="url(#bench-route-a)"/>
<rect x="0" y="188" width="244" height="116" rx="10" class="dg-box"/><text x="20" y="217" class="dg-label">Primary researcher</text><text x="20" y="243" class="dg-mono">high precision · repeatable</text><text x="20" y="267" class="dg-mono">broad first pass</text><text x="20" y="292" class="dg-accent">DEFAULT QUEUE</text>
<rect x="268" y="188" width="244" height="116" rx="10" class="dg-box-crit"/><text x="288" y="217" class="dg-label">Measured specialists</text><text x="288" y="243" class="dg-mono">unique category coverage</text><text x="288" y="267" class="dg-mono">variant · auth · memory</text><text x="288" y="292" class="dg-crit">TARGETED SECOND PASS</text>
<rect x="536" y="188" width="244" height="116" rx="10" class="dg-box"/><text x="556" y="217" class="dg-label">Repetition lane</text><text x="556" y="243" class="dg-mono">same model · fresh state</text><text x="556" y="267" class="dg-mono">when pass diversity pays</text><text x="556" y="292" class="dg-accent">DEPTH ON HIGH RISK</text>
<path d="M122 306 L122 346 L390 346" class="dg-line-accent"/><path d="M390 306 L390 346" class="dg-line-crit"/><path d="M658 306 L658 346 L390 346" class="dg-line-accent"/>
<line x1="390" y1="346" x2="390" y2="370" class="dg-line-crit" marker-end="url(#bench-route-r)"/>
<rect x="110" y="374" width="560" height="62" rx="10" class="dg-box-crit"/><text x="390" y="400" text-anchor="middle" class="dg-label">DETERMINISTIC VALIDATION + BLIND HUMAN REVIEW</text><text x="390" y="424" text-anchor="middle" class="dg-mono">deduplicate · reproduce · compare fix · accept or reject</text>
<line x1="390" y1="438" x2="390" y2="460" class="dg-line-accent" marker-end="url(#bench-route-a)"/>
<text x="390" y="488" text-anchor="middle" class="dg-accent">REPORT EVIDENCE, NOT MODEL CONFIDENCE</text>
</svg>
<figcaption>The benchmark should produce a routing policy. A model earns a specialist role only through repeatable unique contribution in a named vulnerability stratum.</figcaption>
</figure>

Three outcomes are possible:

- **Track A wins on coverage and cost.** Use repeated passes of one model, but keep sessions
  independent. Diversity inside that model is sufficient for this dataset.
- **Track B wins through unique contributions.** Route code by the categories in which each model
  added verified findings. Do not send every repository to every model forever.
- **Coverage is similar but precision differs.** Put the clean model in the synchronous workflow
  and run noisy explorers offline behind stronger reproduction and triage gates.

The specialist team is therefore an outcome, not an assumption. A model becomes the “authorization
specialist” only if it repeatedly contributes verified authorization findings that the others miss.
Marketing descriptions, model size, and one memorable success do not assign the role.

## What this benchmark still cannot prove

Thirty-six known cases do not prove that the winning configuration will discover unknown
vulnerabilities in a new product. Historical CVEs provide ground truth, but they also reward
patterns represented in public code and disclosures. Private sibling variants reduce that problem;
they do not eliminate it.

The test also does not measure whether an organization can safely operate autonomous agents against
live production. All execution here stays inside isolated vulnerable snapshots. Repository access,
data retention, model-provider terms, secret handling, and disclosure processes remain separate
security decisions.

Finally, a benchmark result decays. Models, provider routing, prices, context windows, and harnesses
change. Pin the model identifier and configuration, preserve raw trajectories, hash the dataset,
and date the result. Re-run the holdout when any of those inputs changes. A model name without a
snapshot and harness version is not a reproducible measurement.

## Evidence matrix

| Claim | Evidence required | Negative control | What is not enough |
| --- | --- | --- | --- |
| A track found a vulnerability | Correct root cause, reachable path, deterministic trigger, reviewer agreement | Same trigger fails on the fixed snapshot while an authorized control succeeds | A CWE label, suspicious line, or persuasive report |
| Repetition improves coverage | Same model and harness, fresh sessions, additional unique verified cases across runs | Duplicate reports are merged before recall is calculated | Counting three descriptions of one bug as three findings |
| Model diversity adds value | Unique verified findings attributable to different model families under identical instructions | Repeat Track A with the same number of independent trajectories | Comparing one run with three runs |
| A model is a useful specialist | Repeatable unique contribution in a named vulnerability stratum | Evaluate the same role on an unseen holdout stratum | One exceptional anecdote |
| One track is cheaper | Provider, compute, tool, and reviewer costs captured per run | Publish equal-work and equal-spend views | Token price alone |
| The dataset limits memorisation | Temporal holdout, patched decoys, hidden patches, and private reviewed sibling variants | Known fixed CVEs must not receive credit | Calling a CVE “recent” |
| A report is production-usable | Complete four-gate evidence bundle without reviewer repair | Reviewer can independently replay the bundle | Model confidence or an LLM-judge score |

## My conclusion

I would not hire one model or three models from a leaderboard. I would hire a measured research
pipeline.

Start with the clean comparison: **A + A + A** against **A + B + C**, identical harness, identical
cases, identical limits. Count only findings that survive root-cause review, reproduction, and the
fixed-version test. Publish union coverage beside precision, overlap, triage time, and cost. Then
promote models into specialist roles only where the holdout data shows a repeatable contribution.

The likely advantage of AI in vulnerability research is not that one model becomes an infallible
auditor. It is that several bounded investigations can explore different hypotheses cheaply, while
a deterministic evidence layer keeps only what can be proven. The exploration may be probabilistic.
The definition of a vulnerability must not be.

## Sources reviewed

- [Aikido: We burned 11.7bn tokens to find the best cyber AI model](https://www.aikido.dev/blog/ai-model-benchmarks-aug-21-2026)
- [Google Project Zero: Project Naptime](https://projectzero.google/2024/06/project-naptime.html)
- [Google Project Zero: From Naptime to Big Sleep](https://projectzero.google/2024/10/from-naptime-to-big-sleep.html)
- [CyberSecEval 2 paper and open evaluation design](https://arxiv.org/abs/2404.13161)
- [SEC-bench: reproducible real-world software security tasks](https://github.com/SEC-bench/SEC-bench)
- [CVE-Bench: sandboxed real-world web vulnerability exploitation](https://arxiv.org/abs/2503.17332)
- [VulnGym: project-level vulnerability hunting with semantic evidence paths](https://github.com/Tencent/VulnGym)