Comparative report · Benchmark v3.1RealVuln BenchmarkPublic data

The RealVuln Benchmark Comparative Report

Python and TypeScript/JavaScript stratum

Prepared for security and risk leadership in regulated financial institutions.

Download the report (PDF, 15 pp.) ↓ Read online
AuthorsJohn Pellew · john@kolega.aiFaizan Raza · faizan@kolega.ai
Issued23 October 2026Kolega Labs
DataRealVuln v3.1.0, generated 11 Sep 2026140 repositories · 35 scanner runsGT sha256:0754363…5d23585
Companion briefingRings of Risk
—

Executive summary

This report asks one question, and it is narrower than a product comparison: if an autonomous adversary can chain several small, individually unremarkable flaws into a working attack path, how many of those flaws would your current scanning have surfaced at all? Every flaw a scanner misses is a link an agent can use.

RealVuln answers that question with measurements on real application code rather than synthetic test cases. Version 3.1 covers 140 repositories, 66 in Python and 74 in TypeScript/JavaScript, holding 4,138 scored vulnerabilities and 280 false-positive traps. 35 configurations across three categories scanned them. All artifacts, ground truth and scoring code are public.

84.4F3 (strict), security-specialized · Kolega DevSec Max, 90.2% recall
79.5Best general-purpose LLM · GPT Daybreak Blue, 81.8% recall
10.0Best rule-based SAST · Semgrep, 9.9% recall
0/232Broken-access-control findings detected by Semgrep
  1. 1

    The tiers are far apart. On the like-for-like two-language stratum, the security-specialized scanner leads at F3 84.4, the best general-purpose LLM reaches 79.5 and the best rule-based tool reaches 10.0. The Python stratum alone gives the same order: 86.4 / 80.0 / 23.1.

  2. 2

    Rule-based tools go blind where chaining happens. Semgrep detected 0 of 232 broken-access-control/IDOR findings and 0 of 173 missing-authentication findings. SonarQube also scored 0%. Rowan reached 6.0% and 3.7%. These are the families an agentic attacker composes into a path.

  3. 3

    The median scanner misses seven of every ten access-control flaws. Across all 35 runs, median recall on broken access control is 29.7% and on missing authentication 38.2%. The distribution is wide, from 0% to 87.9%, so a vendor’s category label tells you little.

  4. 4

    Scale breaks detection. Provisional large-application results show aggregate recall falling from 80.55% on small Python applications to 1.77% on five systems between 263k and 816k lines, and 0.00% on three of them. On five large Java systems the same configuration matched 3 of 295 entries (1.02%), and 0 of 47 on the largest, at over 1M lines.

  5. 5

    Cost is not the constraint. The strongest general-purpose LLMs complete the full 741,034-line corpus for $74–$140 per 100,000 lines, and a complete sweep costs $548–$1,041 in API spend. Spending more does not buy detection: the most expensive run in the benchmark scores 52.1.

  6. 6

    Validation is the only real fix. Every coverage claim in an RFP or audit pack should be reproduced on repositories of your own size before you rely on it. If a tool cannot demonstrate recall on a 600,000-line system, it has not demonstrated coverage of your estate.

§1

Method, and what this benchmark does not claim

RealVuln runs each scanner against the same pinned commits of real applications and matches the findings to hand-labeled ground truth. A match requires agreement on three fields: file path (normalized, exact), CWE (present in the entry’s accepted-CWE list) and line number (within ten lines of the labeled range). Each ground-truth entry can be matched once. Findings left over are false positives; vulnerabilities left over are false negatives. A scanner that reports an attack chain rather than a single location may declare alternative locations, and it gets credit for each distinct vulnerability the chain genuinely identifies.

Table 1Corpus composition, RealVuln v3.1.0
StratumReposLines of codeScored vulnsFP traps
Python66133,7821,902—
TypeScript / JavaScript74607,2522,236—
Total140741,0344,138280

False-positive traps are counted at corpus level.

The corpus holds two kinds of target. Fifty repositories are teaching and CTF applications, written by humans and vulnerable on purpose. The other ninety are company-style applications generated by named coding models (Claude Opus 4.7, GPT-5.5, Kimi K2.6 and others) and then seeded with reviewed vulnerabilities. That second kind matters most to institutions now shipping AI-assisted software. The corpus covers eighteen CWE families.

Scoring

The primary metric is F3 (strict), the harmonic mean of precision and recall with β = 3, scaled to 100. That weighting puts recall nine times above precision. The asymmetry is deliberate and fits a bank: a false positive costs an analyst a few minutes, while a missed vulnerability can cost a breach.

Strict aggregation counts any repository a scanner failed to finish as if it had reported nothing, so an unreliable tool cannot hide behind a partial run. F1 and F2 are published alongside F3, so anyone can re-test the conclusions under a different weighting.

Disclosure: read this before citing the numbers

Kolega Labs wrote this benchmark, and one of the scanners it evaluates, Kolega DevSec Max, is our own product. That is the same conflict of interest we criticize in vendor-run benchmarks, and it should temper how you read our first-place result.

Disclosure is the only mitigation we can offer. Every ground-truth label, every raw scanner output, the matching code, the scoring pipeline and the interactive dashboard are public, so the result can be reproduced or falsified without asking us. We have also reported results where a competitor outperforms DevSec Max (§3), and results that are unflattering to the benchmark’s own corpus (§5).

§2

Results on the like-for-like stratum

Thirty-five scanner runs are recorded in v3.1. Ten completed both language strata, and only those ten support a direct comparison. The rest ran on Python alone and appear on the Python leaderboard. Table 2 and Figure 1 show the comparable set.

Table 2Comparable leaderboard, both strata (140 repositories), ranked by F3 strict
ScannerCategoryF3RecallPrecisionMissedRepos$/100k LOC
Kolega DevSec Max v0.1.0SEC-SPEC84.490.2%53.2%405140/1402.39
GPT Daybreak BlueGEN LLM79.581.8%64.0%755140/14073.90
GPT-5.6 SolGEN LLM74.776.9%59.3%955140/14075.60
GLM-5.3GEN LLM54.655.9%44.9%1,823136/14014.80
GPT-6 AstraGEN LLM52.153.1%44.7%1,941140/140140.40
DeepSeek V4.1 FlashGEN LLM50.950.7%52.3%2,039140/1400.00
Claude Sonnet 5GEN LLM43.342.5%52.6%2,380140/14017.60
DeepSeek V4 FlashGEN LLM41.840.7%56.3%2,455140/1400.50
DeepSeek V4 ProGEN LLM38.036.4%60.9%2,630140/1402.00
SemgrepRULE SAST10.09.9%11.5%3,728140/140—

Rule-based tools are licensed rather than metered per token, so their figures are not comparable on this axis. Cost is list-price API spend for the scored run, not total cost of ownership.

Figure 1F3 (strict) across the 140-repository, two-language corpus
Kolega DevSec Max84.4
GPT Daybreak Blue79.5
GPT-5.6 Sol74.7
GLM-5.354.6
GPT-6 Astra52.1
DeepSeek V4.1 Flash50.9
Claude Sonnet 543.3
DeepSeek V4 Flash41.8
DeepSeek V4 Pro38.0
Semgrep10.0
Security-specializedGeneral-purpose LLM / rule-based SAST
Recall is weighted nine times above precision. The gap between the top of the general-purpose tier and the rule-based tier is 69.5 points, and the gap between the two leaders is 4.9.

Reading the table

The ranking is less informative than the detail behind it. At the top of the general-purpose tier, Daybreak Blue’s 81.8% recall and 64.0% precision would have counted as a good result for a specialist tool two years ago. The claim that large models cannot reason about real code no longer holds. Within that same tier, recall runs from 81.8% down to 36.4%, so saying “we use an AI scanner” describes capabilities that differ by a factor of two. Rule-based tools sit apart from that scale. Semgrep’s 9.9% recall means it reported one vulnerability for every ten labeled ones in the corpus.

Reliability is a separate axis. Incomplete runs are common among frontier models. GLM-5.3 finished 136 of 140 repositories, and outside the comparable set several configurations finished only the Python stratum. Strict scoring counts an unfinished repository against the scanner, which is the right treatment for a regulated environment: a scan that intermittently fails to complete is not a control anyone can attest to.

§3

Where coverage disappears

Aggregate scores hide the shape of the failure. Figure 2 breaks recall out by vulnerability family for three archetypes: the best rule-based tool, the best general-purpose LLM and the security-specialized leader. The shortfall is not spread evenly. It concentrates on the families an attacker chains together.

Figure 2Recall by vulnerability family, all 140 repositories
SemgrepDaybreak BlueDevSec MaxFamilies an adversary composes into a path
Broken access control / IDOR
0.0%
87.9%
66.4%
Missing authentication / authorization
0.0%
72.3%
74.0%
SQL injection
30.5%
90.3%
100.0%
Cross-site scripting
20.4%
81.6%
85.0%
Command / OS injection
55.1%
96.3%
94.9%
Path traversal
35.6%
91.3%
97.1%
Insecure deserialization
41.7%
93.8%
95.8%
Server-side request forgery
5.4%
82.8%
98.9%
Hardcoded credentials
4.6%
65.3%
75.5%
Sensitive data exposure
0.0%
80.8%
94.0%
Semgrep detects none of either highlighted family. Full family counts and per-scanner values are in Table 3.
Table 3Recall by family (n = labeled vulnerabilities), selected scanners, all repositories
FamilynSemgrepDaybreakDevSec Max
Broken access control / IDOR2320.0%87.9%66.4%
Missing authentication / authorization1730.0%72.3%74.0%
SQL injection15430.5%90.3%100.0%
Cross-site scripting20620.4%81.6%85.0%
Command / OS injection13655.1%96.3%94.9%
Path traversal10435.6%91.3%97.1%
Insecure deserialization4841.7%93.8%95.8%
Server-side request forgery935.4%82.8%98.9%
Hardcoded credentials2164.6%65.3%75.5%
Sensitive data exposure3490.0%80.8%94.0%

Bold marks the leading value per family. Highlighted rows are the families an adversary composes into a path.

Rule-based detection is confined to syntactic pattern matches. It keeps partial recall on command injection (55.1%), where the pattern is a recognizable call, and falls to zero on authorization, where the flaw is a missing check spread across files. A missing check has no text to match. It is a property of the call path.

The families where rule-based coverage is zero are also the ones that make chaining cheap. An access-control gap needs no memory-corruption primitive to be useful. Put it next to an SSRF (5.4% rule-based recall) or a deserialization flaw and you have a path from the perimeter to a data layer without a single exotic exploit. That is the composition an autonomous agent performs routinely, and it is what the Rings of Risk argument is about.

No scanner dominates every family, ours included. Daybreak Blue beats DevSec Max on the flagship access-control family by 21.5 points (87.9% against 66.4%). DevSec Max leads on SSRF, sensitive data exposure, path traversal and SQL injection, and it leads on overall recall through breadth rather than through superiority in any one class. A reader looking for a single winner is looking for the wrong conclusion. The useful question is which failure modes your estate can absorb.

§4

The two language strata behave differently

TypeScript/JavaScript is the harder stratum, though not for the usual reason. The TS/JS corpus is 4.5 times the size of the Python corpus (607,252 lines against 133,782) but carries only 18% more vulnerabilities, 2,236 against 1,902. Density is therefore about a quarter as high. Precision falls for that reason alone, since a scanner’s false positives land in far more clean code.

Table 4Recall by stratum for scanners that completed both
ScannerPy F3Py recallTS/JS F3TS/JS recallΔ F3
Kolega DevSec Max86.488.8%82.791.5%−3.7
GPT Daybreak Blue80.080.5%79.282.8%−0.8
GPT-5.6 Sol77.878.7%72.175.4%−5.7
GLM-5.363.363.8%47.449.3%−15.9
Claude Sonnet 552.851.5%35.334.8%−17.5
DeepSeek V4 Flash51.749.9%33.532.8%−18.2
DeepSeek V4 Pro50.248.3%27.526.3%−22.7
Semgrep7.47.0%12.212.3%+4.8

Δ F3 is TS/JS minus Python, derived from the published values.

The leaders hold their position. DevSec Max moves from 86.4 to 82.7 (−3.7 points), Daybreak Blue from 80.0 to 79.2 (−0.8) and Sol from 77.8 to 72.1 (−5.7). The middle of the field falls by 16 to 23 points: GLM-5.3 by 15.9, Claude Sonnet 5 by 17.5, DeepSeek V4 Flash by 18.2 and DeepSeek V4 Pro by 22.7. For a technology-selection decision, that asymmetry is the most useful signal in the report. A scanner that is adequate on small Python applications is not adequate on a large TypeScript estate, and the degradation is much steeper in the middle of the market than at the top.

Semgrep is the exception. Its recall rises slightly on TS/JS, from 7.0% to 12.3%, though it still tops out at twelve percent.

§5

Scale and the repository-size gap

Every number so far comes from repositories that are small by enterprise standards. The Python applications cluster below 5,550 lines, and the corpus was designed to stay tractable for language models and for hand-labeling. A bank’s core systems are not tractable. The provisional evidence says this is where general-purpose detection fails almost completely.

Figure 3Provisional: F3 against application size, Python
Kolega DevSec Max Codex + Daybreak Blue (points measured, line fitted) Projected
0204060801001k5k10k50k100k1M10M8084231202868887826860Application size (non-test lines of code, log scale)F3 score (0–100)
Detection by a leading general-purpose configuration falls from 84 at 5,000 lines to 23 at 10,000, 12 at 50,000 and 0 at 100,000. The security-specialized configuration degrades far more slowly and is projected to hold near 60 at enterprise scale. Points are measured; the grey line is a fitted curve. Provisional research result, outside the official benchmark and dashboard; see the caveat below.
Table 5Provisional large-application results (GPT Daybreak Blue via Codex), outside the scored benchmark
SystemWhat it doesLang.Size (LOC)GTMatchedRecall
MarbleBuild-automation serverJava100–250k3600.00%
PewterIoT device-management platformJava250–500k8000.00%
BasaltIdentity and access management serverJava>500k8422.38%
QuartzBusiness-process automation engineJava>500k4812.08%
RidgeEnterprise content-management platformJava>1M4700.00%
SlateHeadless e-commerce platformPython250–500k7622.63%
TalusNetwork infrastructure-management toolPython250–500k14485.56%
HarborWorkflow-orchestration platformPython>500k4800.00%
UmberBusiness-management (ERP) suitePython>500k17500.00%
ValeApplication error-monitoring platformPython>500k12200.00%

Applications are pseudonymised, following the Rings of Risk naming. Names, versions and vulnerability identifiers are withheld to respect coordinated vulnerability disclosure; each system is described by what it does, and size is given as a coarse band of non-test lines of code.

80.55%recall across the smaller Python applications
1.77%across the five large Python systems
1.02%Java: 3 of 295 entries
6 / 10large systems that returned nothing at all
§6

What this means for a regulated bank

Five operational conclusions follow, ordered by the point at which they create exposure.

  1. 1

    A clean scan history is not evidence of a clean estate. Semgrep-class tooling missed 3,728 of 4,138 labeled vulnerabilities (90.1%), including every access-control and missing-authentication finding in the corpus. If your assurance file holds years of clean rule-based scan results, do not conclude that the estate is clean. Conclude that the instrument was blind to the flaw classes that matter most.

  2. 2

    The backlog understates the exposure it purports to describe. Remediation runs on a queue, and a queue can only hold what was detected. If roughly nine in ten issues never enter it, the queue is a register of the subset your tooling could see, not a register of your vulnerabilities. The distinction becomes material when a regulator, an auditor or an insurer asks you to demonstrate that the register is complete. Documented exposure you have not scheduled is harder to defend than exposure you have not yet looked for.

  3. 3

    Prioritize by chainability, not by scanner severity. The families that compose into an agent-executable path (broken access control, missing authorization, SSRF, deserialization) are exactly where syntactic detection returns zero. A backlog ordered by scanner severity, produced by a tool that is blind in those families, will systematically under-prioritize the flaws an autonomous attacker would use first.

  4. 4

    Validate vendors at your scale, on your code. The benchmark’s strongest general-purpose configuration returns 0% to 5.56% recall on systems above 260,000 lines. Test any vendor claim of enterprise coverage on a repository of that size before accepting it. A demonstration on a deliberately vulnerable 800-line sample says nothing about a core banking platform. Ask for recall on a system comparable to yours, with the ground truth open to inspection.

  5. 5

    Measure remediation closure, not remediation intent. Detection is half the loop. The capability that finds a chain can run it again after the fix, and re-running the attack path is the only evidence that closure is real. Without post-remediation verification, a control is a process control, not a security control.

§7

Limitations and threats to validity

Any evaluation has limits. These are ours, and they matter for how far the results should be pushed.

We are a vendor in our own benchmarkKolega Labs wrote RealVuln and fields the leading scanner. We disclosed that conflict above. The only mitigations are full release of the data and code, and our reporting of results where competitors outperform us.
Scope is two languages, one target classVersion 3.1 covers Python and TypeScript/JavaScript only. The scored corpus is made of intentionally vulnerable and seeded applications: high density by construction, not production code with its realistic sparsity. Java and Go appear only in the provisional size study. Nothing here supports conclusions about memory-unsafe languages.
Ground truth is hand-labeledHand-labeling involves judgment. The accepted-CWE lists and the published evidence for each entry are designed to make disagreement possible, not to prevent it. Community challenges are welcome through the issue tracker.
LLM results are non-deterministicScanners built on language models produce different output from run to run, and several completed fewer than 140 repositories. Read single-run results with that uncertainty in mind. Strict scoring penalizes incomplete runs, but it cannot remove run-to-run variance.
Cost is API spend, not total cost of ownershipCost figures reflect list prices at the time of the run. They exclude integration, triage labor and licensing for rule-based tools, and they are not comparable between categories.
What is measured is detectionThe benchmark scores whether a scanner finds a labeled vulnerability in the right place with the right classification. It does not measure exploitability, business impact or the quality of a remediation recommendation.
ContaminationSome corpus repositories are public and may sit in model training data. The 280 false-positive traps are the main control against memorization inflating recall.
§8

Reproducing this

Every figure here comes from the released v3.1.0 dataset. The manifest locks the ground-truth content hash, the commit SHA of all 140 repositories and the default prompt hash, so a rerun can be checked against this document instead of taken on trust.

ReleaseRealVuln 3.1.0, data generated 11 September 2026
Ground-truth hashsha256:0754363572503562e692414f826aad6f135f254851b8d12f70148bd235d23585
Default prompt hashsha256:3481f1432c23
Scanning modeAgentic (tool-use loop) with a shared prompt and structured JSON output
MetricF3 = 10·P·R / (9P + R), strict micro-averaged, scaled to 100

Sources

  1. [1]RealVuln benchmark and live dashboard: realvuln.com
  2. [2]Repository, ground truth, scanner outputs, scoring pipeline: github.com/kolega-ai/Real-Vuln-Benchmark
  3. [3]Methodology paper: RealVuln: Benchmarking Rule-Based, General-Purpose LLM, and Security-Specialized Scanners on Real-World Code, arXiv:2604.13764.
  4. [4]Large-application results: The repository-size gap: our first provisional large-app results, RealVuln Journal, Issue 20, 30 September 2026.
  5. [5]Language-stratum analysis: The Python-to-TypeScript drop, RealVuln Journal.

Disclaimer. This report is provided for information. It is not legal, regulatory or investment advice. Benchmark results describe how named scanner configurations performed on a specific published corpus at a specific time. They do not predict performance on any institution’s estate. Kolega Labs develops one of the scanners evaluated and wrote the benchmark, so readers should weight the corresponding results accordingly and are encouraged to reproduce or challenge them. All product names belong to their respective owners.

Take the numbers to your next vendor review.

15 pages: the full leaderboard, recall by vulnerability family, the language-stratum drop, provisional large-application results and how to reproduce every figure.

Companion documents
Rings of RiskResearch paper →Continuous Architectural Resilience FrameworkFramework →Autonomous Agentic Red TeamingTechnical whitepaper →