2.0 · Explore evidence
An AI security engine is a model inside a harness.
Deterministic SAST and AI review covered different ground; what an AI engine reported depended on its harness as much as on its model; and coverage and cost were only loosely related.
Headline evidence · Attacker-Reachable Vulnerability Recall
Close at the top. Different ground covered.
- Snyk Code 82.4% (89 of 108) and Claude Code /security-review with Opus 5 xhigh 79.3% (85 of 108): they disagree on 28 vulnerabilities, 16 to 12, too few to tell them apart.
- Together they match 101 of 108, the same as all seven endpoint-aware configurations combined: a ceiling across configurations, not one tool's result.
- DeepSec is scored with localized recall, a different evidence requirement, and is shown separately.
In this study neither engine was sufficient alone. A vulnerability class an engine does not report is a real miss here, because every reference vulnerability is attacker-reachable.
Dataset 2.0.0 · Snyk VulnBench 2.0 · 108 reference vulnerabilities · one run per configuration and application · Source: published 2.0 paper
| Configuration | Attacker-Reachable Vulnerability Recall (macro, matched) | 95% interval | Precision against the reference set (lower bound) | Matched at the exact line |
|---|---|---|---|---|
| Snyk Code | 82.4% (89 of 108) | 74.0–90.5% | 20.9% | 85 |
| Claude Code /security-review · Opus 5 xhigh | 79.3% (85 of 108) | 71.6–86.7% | 74.6% | 79 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | 75.2% (80 of 108) | 68.2–82.3% | 82.5% | 74 |
| Claude Code /security-review · Sonnet 5 xhigh | 67.0% (73 of 108) | 57.7–76.2% | 74.5% | 55 |
| Codex Security · GPT-5.6 Luna | 41.2% (45 of 108) | 26.6–56.5% | 20.8% | 15 |
| Codex Security · GPT-5.6 Terra | 30.1% (35 of 108) | 19.1–41.9% | 15.8% | 6 |
| Codex Security · GPT-5.6 Sol | 29.2% (34 of 108) | 18.1–41.1% | 12.7% | 2 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
| Configuration | Localized recall (macro, matched) | 95% interval | Precision against the reference set (lower bound) |
|---|---|---|---|
| DeepSec · Opus 5 xhigh | 37.5% (37 of 108) | 22.6–53.2% | 7.1% |
| DeepSec · GPT-5.6 Sol xhigh | 2.5% (1 of 108) | 0.0–7.5% | 10.0% |
View exact values
| Application | Endpoint-aware configurations: matched | DeepSec: localized matches | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Application | Language family | Frameworks | Reference vulnerabilities | Cross-file | Snyk Code | Claude Code /security-review · Opus 5 xhigh | Claude Code /security-review · Opus 5 medium + Snyk MCP | Claude Code /security-review · Sonnet 5 xhigh | Codex Security · GPT-5.6 Luna | Codex Security · GPT-5.6 Terra | Codex Security · GPT-5.6 Sol | DeepSec · Opus 5 xhigh | DeepSec · GPT-5.6 Sol xhigh |
| ardanservice | Go | chi, sqlx, goth | 5 | 5 | 5 | 4 | 4 | 2 | 5 | 2 | 1 | 3 | 0 |
| blanq | JS/TS | nuxt, vue, drizzle | 7 | 0 | 5 | 5 | 5 | 4 | 2 | 2 | 3 | 3 | 0 |
| boilwater | JS/TS | express | 4 | 3 | 4 | 3 | 3 | 3 | 1 | 1 | 2 | 4 | 0 |
| coffeeshop | Java | spring-boot, thymeleaf, spring-security | 5 | 2 | 4 | 3 | 3 | 3 | 1 | 1 | 1 | 3 | 0 |
| conduit | Python | flask | 6 | 4 | 4 | 6 | 6 | 5 | 2 | 2 | 2 | 0 | 0 |
| flask-bones | Python | flask | 10 | 4 | 8 | 7 | 6 | 6 | 1 | 3 | 1 | 0 | 0 |
| go-sample | Go | httprouter | 5 | 3 | 5 | 5 | 5 | 5 | 0 | 0 | 0 | 0 | 0 |
| gobase | Go | gin | 5 | 5 | 5 | 5 | 4 | 5 | 3 | 3 | 4 | 4 | 0 |
| goxygen | Go | vue | 6 | 4 | 6 | 5 | 5 | 5 | 5 | 5 | 5 | 0 | 0 |
| halloween | JS/TS | express | 3 | 1 | 2 | 2 | 2 | 1 | 1 | 1 | 0 | 0 | 0 |
| iguana | Python | django | 6 | 4 | 4 | 3 | 3 | 2 | 2 | 1 | 1 | 0 | 0 |
| keystonebank | JS/TS | express, vue | 4 | 1 | 4 | 2 | 2 | 3 | 1 | 0 | 0 | 2 | 0 |
| lastsaas | Go | gorilla-mux, react | 5 | 4 | 3 | 4 | 3 | 2 | 0 | 3 | 1 | 1 | 0 |
| pygmy | Python | flask, django | 5 | 4 | 5 | 5 | 5 | 4 | 5 | 1 | 1 | 2 | 0 |
| robs-awesome | Python | fastapi | 7 | 5 | 7 | 7 | 6 | 6 | 6 | 5 | 4 | 5 | 0 |
| saas-starter-kit | Go | — | 6 | 4 | 6 | 6 | 5 | 6 | 0 | 0 | 3 | 0 | 0 |
| saas-starter-lite | JS/TS | nestjs, angular | 6 | 3 | 3 | 4 | 4 | 4 | 5 | 4 | 4 | 5 | 0 |
| sassyreg | JS/TS | react | 2 | 0 | 1 | 2 | 2 | 1 | 0 | 0 | 0 | 2 | 1 |
| slingshot | JS/TS | react, redux, webpack | 4 | 2 | 4 | 3 | 3 | 3 | 3 | 0 | 0 | 0 | 0 |
| vinyl-marketplace | Java | spring-boot | 7 | 4 | 4 | 4 | 4 | 3 | 2 | 1 | 1 | 3 | 0 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Class | Reference vulnerabilities | Snyk Code | Claude Code /security-review · Opus 5 xhigh | Claude Code /security-review · Opus 5 medium + Snyk MCP | Claude Code /security-review · Sonnet 5 xhigh | Codex Security · GPT-5.6 Luna | Codex Security · GPT-5.6 Terra | Codex Security · GPT-5.6 Sol |
|---|---|---|---|---|---|---|---|---|
| code injection | 4 | 3 | 4 | 4 | 4 | 4 | 2 | 2 |
| command injection | 13 | 10 | 12 | 12 | 10 | 6 | 6 | 6 |
| IDOR | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
| improper type validation | 2 | 2 | 1 | 1 | 0 | 0 | 0 | 0 |
| insecure deserialization | 5 | 5 | 5 | 5 | 5 | 3 | 4 | 3 |
| mass assignment | 2 | 0 | 2 | 2 | 2 | 1 | 1 | 0 |
| open redirect | 11 | 11 | 5 | 1 | 4 | 5 | 5 | 4 |
| path traversal | 16 | 16 | 14 | 14 | 13 | 7 | 3 | 4 |
| prototype pollution | 6 | 6 | 4 | 4 | 2 | 1 | 0 | 0 |
| ReDoS | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| SQL injection | 13 | 11 | 12 | 12 | 11 | 5 | 2 | 2 |
| SSRF | 9 | 8 | 9 | 9 | 6 | 6 | 6 | 6 |
| template injection | 4 | 3 | 3 | 3 | 3 | 1 | 1 | 1 |
| cross-site scripting | 19 | 13 | 13 | 13 | 12 | 6 | 5 | 6 |
Main runs; endpoint-aware configurations; most classes are small.
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
01 · Complementarity
SAST and AI review cover different ground
Snyk Code matched 82.4% (89 of 108) and Claude Code /security-review with Opus 5 xhigh 79.3% (85 of 108). They disagree on 28 vulnerabilities, 16 matched only by Snyk Code and 12 only by Opus 5 xhigh; a corpus of this size cannot separate them.
Together they match 101 of 108, as many as all seven endpoint-aware configurations combined. The best pair without SAST, Opus 5 xhigh with Codex Security GPT-5.6 Terra, reaches 89 (93 under many-to-one credit).
Snyk Code adds 16 vulnerabilities to Opus 5 xhigh, only 3 of them cross-file, led by open redirect (6). Opus 5 xhigh adds 12 to Snyk Code, 7 of them cross-file, including the authorization classes.
Snyk Code is the only one of the seven endpoint-aware configurations with unique coverage: 10 vulnerabilities in six classes (5 under many-to-one credit).
Outside the reference set, in this run, AI configurations found at least seven real vulnerabilities in scored classes that the reference set did not contain and Snyk Code did not report.
Interpret with care: A union across configurations is a ceiling, not one tool's result. Combining the two also combines their queues: 539 findings for 101 matches.
View exact values
| Configuration | Attacker-Reachable Vulnerability Recall (macro, matched) | 95% interval | Precision against the reference set (lower bound) | Matched at the exact line |
|---|---|---|---|---|
| Snyk Code | 82.4% (89 of 108) | 74.0–90.5% | 20.9% | 85 |
| Claude Code /security-review · Opus 5 xhigh | 79.3% (85 of 108) | 71.6–86.7% | 74.6% | 79 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | 75.2% (80 of 108) | 68.2–82.3% | 82.5% | 74 |
| Claude Code /security-review · Sonnet 5 xhigh | 67.0% (73 of 108) | 57.7–76.2% | 74.5% | 55 |
| Codex Security · GPT-5.6 Luna | 41.2% (45 of 108) | 26.6–56.5% | 20.8% | 15 |
| Codex Security · GPT-5.6 Terra | 30.1% (35 of 108) | 19.1–41.9% | 15.8% | 6 |
| Codex Security · GPT-5.6 Sol | 29.2% (34 of 108) | 18.1–41.1% | 12.7% | 2 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Configuration | Localized recall (macro, matched) | 95% interval | Precision against the reference set (lower bound) |
|---|---|---|---|
| DeepSec · Opus 5 xhigh | 37.5% (37 of 108) | 22.6–53.2% | 7.1% |
| DeepSec · GPT-5.6 Sol xhigh | 2.5% (1 of 108) | 0.0–7.5% | 10.0% |
View exact values
| Step | Configuration | Vulnerabilities added at this step | Cumulative matched |
|---|---|---|---|
| 1 | Snyk Code | 89 | 89 |
| 2 | Claude Code /security-review · Opus 5 xhigh | 12 | 101 |
| 3 | Claude Code /security-review · Opus 5 medium + Snyk MCP | 0 | 101 |
| 4 | Claude Code /security-review · Sonnet 5 xhigh | 0 | 101 |
| 5 | Codex Security · GPT-5.6 Luna | 0 | 101 |
| 6 | Codex Security · GPT-5.6 Terra | 0 | 101 |
| 7 | Codex Security · GPT-5.6 Sol | 0 | 101 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Configuration A | Configuration B | Matched by either | B adds to A | A adds to B | Combined findings to triage |
|---|---|---|---|---|---|
| Snyk Code | Claude Code /security-review · Opus 5 xhigh | 101 | 12 | 16 | 539 |
| Snyk Code | Claude Code /security-review · Opus 5 medium + Snyk MCP | 100 | 11 | 20 | 522 |
| Snyk Code | Claude Code /security-review · Sonnet 5 xhigh | 99 | 10 | 26 | 523 |
| Snyk Code | Codex Security · GPT-5.6 Luna | 95 | 6 | 50 | 641 |
| Snyk Code | Codex Security · GPT-5.6 Terra | 94 | 5 | 59 | 646 |
| Snyk Code | Codex Security · GPT-5.6 Sol | 93 | 4 | 59 | 692 |
| Claude Code /security-review · Opus 5 xhigh | Codex Security · GPT-5.6 Terra | 89 | 4 | 54 | 335 |
| Claude Code /security-review · Opus 5 xhigh | Codex Security · GPT-5.6 Luna | 88 | 3 | 43 | 330 |
| Claude Code /security-review · Opus 5 xhigh | Codex Security · GPT-5.6 Sol | 88 | 3 | 54 | 381 |
| Claude Code /security-review · Opus 5 xhigh | Claude Code /security-review · Sonnet 5 xhigh | 87 | 2 | 14 | 212 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | Claude Code /security-review · Opus 5 xhigh | 85 | 5 | 0 | 211 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | Claude Code /security-review · Sonnet 5 xhigh | 85 | 5 | 12 | 195 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | Codex Security · GPT-5.6 Terra | 85 | 5 | 50 | 318 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | Codex Security · GPT-5.6 Luna | 84 | 4 | 39 | 313 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | Codex Security · GPT-5.6 Sol | 84 | 4 | 50 | 364 |
| Claude Code /security-review · Sonnet 5 xhigh | Codex Security · GPT-5.6 Luna | 78 | 5 | 33 | 314 |
| Claude Code /security-review · Sonnet 5 xhigh | Codex Security · GPT-5.6 Terra | 78 | 5 | 43 | 319 |
| Claude Code /security-review · Sonnet 5 xhigh | Codex Security · GPT-5.6 Sol | 77 | 4 | 43 | 365 |
| Codex Security · GPT-5.6 Luna | Codex Security · GPT-5.6 Sol | 55 | 10 | 21 | 483 |
| Codex Security · GPT-5.6 Luna | Codex Security · GPT-5.6 Terra | 54 | 9 | 19 | 437 |
| Codex Security · GPT-5.6 Terra | Codex Security · GPT-5.6 Sol | 41 | 6 | 7 | 488 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Combination | Vulnerabilities |
|---|---|
| Snyk Code; Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Opus 5 medium + Snyk MCP; Claude Code /security-review · Sonnet 5 xhigh; Codex Security (three configurations pooled) | 42 |
| Snyk Code; Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Opus 5 medium + Snyk MCP; Claude Code /security-review · Sonnet 5 xhigh | 17 |
| Snyk Code | 10 |
| No endpoint-aware configuration | 7 |
| Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Opus 5 medium + Snyk MCP; Claude Code /security-review · Sonnet 5 xhigh; Codex Security (three configurations pooled) | 7 |
| Snyk Code; Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Opus 5 medium + Snyk MCP | 7 |
| Snyk Code; Codex Security (three configurations pooled) | 4 |
| Snyk Code; Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Opus 5 medium + Snyk MCP; Codex Security (three configurations pooled) | 3 |
| Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Opus 5 medium + Snyk MCP; Claude Code /security-review · Sonnet 5 xhigh | 2 |
| Snyk Code; Claude Code /security-review · Opus 5 xhigh | 2 |
| Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Sonnet 5 xhigh | 1 |
| Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Opus 5 medium + Snyk MCP | 1 |
| Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Opus 5 medium + Snyk MCP; Codex Security (three configurations pooled) | 1 |
| Snyk Code; Claude Code /security-review · Sonnet 5 xhigh | 1 |
| Snyk Code; Claude Code /security-review · Sonnet 5 xhigh; Codex Security (three configurations pooled) | 1 |
| Snyk Code; Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Sonnet 5 xhigh | 1 |
| Snyk Code; Claude Code /security-review · Opus 5 xhigh; Claude Code /security-review · Sonnet 5 xhigh; Codex Security (three configurations pooled) | 1 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Configuration | Same-file matched | Cross-file matched | Same-file misses | Misses in classes the built-in review policy excludes or restricts | Misses in cross-site scripting |
|---|---|---|---|---|---|
| Snyk Code | 40 of 46 | 49 of 62 | 6 | 1 | 1 |
| Claude Code /security-review · Opus 5 xhigh | 32 of 46 | 53 of 62 | 14 | 8 | 3 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | 30 of 46 | 50 of 62 | 16 | 9 | 3 |
| Claude Code /security-review · Sonnet 5 xhigh | 27 of 46 | 46 of 62 | 19 | 11 | 4 |
| Codex Security · GPT-5.6 Luna | 14 of 46 | 31 of 62 | 32 | 11 | 9 |
| Codex Security · GPT-5.6 Terra | 14 of 46 | 21 of 62 | 32 | 11 | 8 |
| Codex Security · GPT-5.6 Sol | 12 of 46 | 22 of 62 | 34 | 12 | 7 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Configuration | Findings | Matched | Precision against the reference set (lower bound) |
|---|---|---|---|
| Snyk Code | 425 | 89 | 20.9% |
| Claude Code /security-review · Opus 5 xhigh | 114 | 85 | 74.6% |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | 97 | 80 | 82.5% |
| Claude Code /security-review · Sonnet 5 xhigh | 98 | 73 | 74.5% |
| Codex Security · GPT-5.6 Luna | 216 | 45 | 20.8% |
| Codex Security · GPT-5.6 Terra | 221 | 35 | 15.8% |
| Codex Security · GPT-5.6 Sol | 267 | 34 | 12.7% |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
02 · Harness policy
The harness decides what gets reported
Claude Code's /security-review excludes ReDoS and reports prototype pollution and open redirect only at extremely high confidence. On the 20 reference vulnerabilities in those classes, Snyk Code matched 18 and Opus 5 xhigh 9; on the 81 others (excluding 7 cross-site scripting vulnerabilities in React and Angular applications), Opus 5 xhigh matched 71 and Snyk Code 67.
In a supplementary run on 19 of the 20 applications, the same model at the same effort, without that policy, matched 16 of the 20.
Codex Security with GPT-5.6 Sol located 80 vulnerabilities at file level but 34 under the two-line rule, typically pointing above the dangerous call.
DeepSec's model-free scan stage queued a file from only 56 of the 108 flows before any model ran.
The model still matters inside a harness: under the same harness, effort and prompt, Opus 5 matched 14 vulnerabilities that Sonnet 5 missed, against 2 the other way.
Interpret with care: The policy reading rests on the policy text and one supplementary control run; harness and model cannot be fully separated by this design.
View exact values
| Configuration | Classes the built-in review policy excludes or restricts | XSS in React/Angular applications | All other vulns |
|---|---|---|---|
| Snyk Code | 18 of 20 | 4 of 7 | 67 of 81 |
| Claude Code /security-review · Opus 5 xhigh | 9 of 20 | 5 of 7 | 71 of 81 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | 5 of 20 | 5 of 7 | 70 of 81 |
| Claude Code /security-review · Sonnet 5 xhigh | 6 of 20 | 4 of 7 | 63 of 81 |
| Codex Security · GPT-5.6 Luna | 6 of 20 | 3 of 7 | 36 of 81 |
| Codex Security · GPT-5.6 Terra | 5 of 20 | 1 of 7 | 29 of 81 |
| Codex Security · GPT-5.6 Sol | 4 of 20 | 1 of 7 | 29 of 81 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Configuration | Class | Credited | Reported anywhere in the application |
|---|---|---|---|
| Snyk Code | open redirect | 11 of 11 | 11 of 11 |
| Snyk Code | prototype pollution | 6 of 6 | 6 of 6 |
| Snyk Code | ReDoS | 1 of 3 | 2 of 3 |
| Claude Code /security-review · Opus 5 xhigh | open redirect | 5 of 11 | 6 of 11 |
| Claude Code /security-review · Opus 5 xhigh | prototype pollution | 4 of 6 | 6 of 6 |
| Claude Code /security-review · Opus 5 xhigh | ReDoS | 0 of 3 | 0 of 3 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | open redirect | 1 of 11 | 2 of 11 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | prototype pollution | 4 of 6 | 6 of 6 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | ReDoS | 0 of 3 | 0 of 3 |
| Claude Code /security-review · Sonnet 5 xhigh | open redirect | 4 of 11 | 5 of 11 |
| Claude Code /security-review · Sonnet 5 xhigh | prototype pollution | 2 of 6 | 3 of 6 |
| Claude Code /security-review · Sonnet 5 xhigh | ReDoS | 0 of 3 | 0 of 3 |
| Codex Security · GPT-5.6 Luna | open redirect | 5 of 11 | 10 of 11 |
| Codex Security · GPT-5.6 Luna | prototype pollution | 1 of 6 | 3 of 6 |
| Codex Security · GPT-5.6 Luna | ReDoS | 0 of 3 | 0 of 3 |
| Codex Security · GPT-5.6 Terra | open redirect | 5 of 11 | 10 of 11 |
| Codex Security · GPT-5.6 Terra | prototype pollution | 0 of 6 | 1 of 6 |
| Codex Security · GPT-5.6 Terra | ReDoS | 0 of 3 | 3 of 3 |
| Codex Security · GPT-5.6 Sol | open redirect | 4 of 11 | 10 of 11 |
| Codex Security · GPT-5.6 Sol | prototype pollution | 0 of 6 | 6 of 6 |
| Codex Security · GPT-5.6 Sol | ReDoS | 0 of 3 | 1 of 3 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Subset | Supplementary prompt-swap control (Opus 5 xhigh, default audit prompt) | Main run: Claude Code /security-review · Opus 5 xhigh, same applications |
|---|---|---|
| Classes the built-in review policy excludes or restricts | 16 of 20 | 9 of 20 |
| All other non-React/Angular | 71 of 78 | 69 of 78 |
| Open redirect | 9 of 11 | 5 of 11 |
| Prototype pollution | 5 of 6 | 4 of 6 |
| ReDoS | 2 of 3 | 0 of 3 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
policy_control_supplementary.csvpolicy_control_supplementary.meta.json
View exact values
| Offset | Missed curated sinks | |
|---|---|---|
| Offset in lines | Reported location is a curated source | Reported location is not a curated source |
| ≤−21 | 0 | 1 |
| −20…−11 | 1 | 8 |
| −10…−6 | 9 | 15 |
| −5…−3 | 6 | 15 |
| ≥+3 | 0 | 2 |
Offset: Reported line minus curated sink line; negative = above the sink.
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Configuration | Line tolerance | |||||||
|---|---|---|---|---|---|---|---|---|
| Configuration | Exact line | ±1 lines | ±2 lines (used for results) | ±3 lines | ±5 lines | ±10 lines | ±20 lines | Any line in the right file |
| Snyk Code | 85 | 88 | 89 | 89 | 89 | 89 | 89 | 89 |
| Claude Code /security-review · Opus 5 xhigh | 79 | 84 | 85 | 86 | 86 | 86 | 86 | 89 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | 74 | 79 | 80 | 81 | 81 | 81 | 81 | 84 |
| Claude Code /security-review · Sonnet 5 xhigh | 55 | 71 | 73 | 75 | 75 | 76 | 77 | 76 |
| Codex Security · GPT-5.6 Luna | 15 | 32 | 45 | 50 | 55 | 61 | 64 | 66 |
| Codex Security · GPT-5.6 Terra | 6 | 20 | 35 | 39 | 47 | 63 | 66 | 69 |
| Codex Security · GPT-5.6 Sol | 2 | 18 | 34 | 43 | 54 | 71 | 77 | 80 |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Stage | Vulnerabilities |
|---|---|
| Reference vulnerabilities | 108 |
| A flow file among the scan stage's candidates | 56 of 108 |
| The sink file among the candidates (vulnerabilities with a labeled sink) | 44 of 107 |
| Localized match, Opus 5 xhigh backend | 37 of 56 |
| Localized match, GPT-5.6 Sol backend | 1 of 56 |
Localized recall is DeepSec's primary metric and is not comparable with Attacker-Reachable Vulnerability Recall.
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Language family | Vulnerabilities |
|---|---|
| Go | 11 of 32 |
| JavaScript / TypeScript | 23 of 30 |
| Python | 10 of 34 |
| Java | 12 of 12 |
03 · Efficiency
Coverage and cost were only loosely related
Snyk Code scanned all 20 applications in 8 minutes; the comparable AI configurations took between 2.4 hours and 8.9 hours.
Within Codex Security, all at xhigh effort, GPT-5.6 Sol cost 35.0 times as much as GPT-5.6 Luna and matched 11 fewer vulnerabilities: a comparison of model tiers, not of reasoning effort. Within Claude Code /security-review, at the same xhigh effort and with the same prompt, Opus 5 cost 4.2 times as much as Sonnet 5 and matched 12 more.
Known cost per matched vulnerability ranged from $0.47 to $21.92.
Interpret with care: One run per configuration and application: every ratio is a single observation. Snyk Code has no per-scan model cost; its license cost is outside this study.
View exact values
| Configuration | Wall time, total | Wall time per matched vulnerability (s) | Cost status | Known cost, total (USD) | Known cost per matched vulnerability (USD) | Tokens per matched vulnerability (millions) | Findings per matched vulnerability |
|---|---|---|---|---|---|---|---|
| Snyk Code | 8 min | 5 | no per-scan model cost | — | — | — | 4.78 |
| Claude Code /security-review · Opus 5 xhigh | 5.6 h | 236 | known | 164.53 | 1.94 | 1.03 | 1.34 |
| Claude Code /security-review · Opus 5 medium + Snyk MCP | 2.4 h | 107 | known | 57.44 | 0.72 | 0.35 | 1.21 |
| Claude Code /security-review · Sonnet 5 xhigh | 3.1 h | 153 | known | 39.56 | 0.54 | 0.72 | 1.34 |
| Codex Security · GPT-5.6 Luna | 5.4 h | 433 | known | 21.32 | 0.47 | 24.08 | 4.8 |
| Codex Security · GPT-5.6 Terra | 4.9 h | 508 | known | 207.99 | 5.94 | 24.42 | 6.31 |
| Codex Security · GPT-5.6 Sol | 8.9 h | 942 | known | 745.17 | 21.92 | 42.11 | 7.85 |
One run per configuration and application: every ratio is a single observation. Snyk Code has no per-scan model cost; its license cost is outside this study.
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.
View exact values
| Configuration | Wall time, total | Wall time per matched vulnerability (s) | Cost status | Known cost, total (USD) | Known cost per matched vulnerability (USD) | Tokens per matched vulnerability (millions) |
|---|---|---|---|---|---|---|
| DeepSec · Opus 5 xhigh | 17.8 h | 1733 | known | 355.17 | 9.60 | 3.69 |
| DeepSec · GPT-5.6 Sol xhigh | 3.3 h | 11752 | unavailable | — | — | 12.99 |
Findings
Matches per reference vulnerability
| Reference vulnerability | Endpoint-aware configurations: matched | DeepSec: localized match | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Vulnerability | Application | Class | Language family | Cross-file | Snyk Code | Claude Code /security-review · Opus 5 xhigh | Claude Code /security-review · Opus 5 medium + Snyk MCP | Claude Code /security-review · Sonnet 5 xhigh | Codex Security · GPT-5.6 Luna | Codex Security · GPT-5.6 Terra | Codex Security · GPT-5.6 Sol | Endpoint-aware configurations that matched it | DeepSec · Opus 5 xhigh | DeepSec · GPT-5.6 Sol xhigh |
| app-project-ardanservice-command-injection-dnscheck-1 | ardanservice | command injection | Go | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | 6 | Yes | No |
| app-project-ardanservice-open-redirect-preferences-return-1 | ardanservice | open redirect | Go | Yes | Yes | No | No | No | Yes | No | No | 2 | Yes | No |
| app-project-ardanservice-path-traversal-audit-report-1 | ardanservice | path traversal | Go | Yes | Yes | Yes | Yes | Yes | Yes | No | No | 5 | No | No |
| app-project-ardanservice-sql-injection-department-search-1 | ardanservice | SQL injection | Go | Yes | Yes | Yes | Yes | No | Yes | No | No | 4 | Yes | No |
| app-project-ardanservice-ssrf-webhooktest-1 | ardanservice | SSRF | Go | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | 6 | No | No |
| app-project-blanq-prototype-pollution-display | blanq | prototype pollution | JS/TS | No | Yes | No | No | No | No | No | No | 1 | No | No |
| app-project-blanq-prototype-pollution-preferences | blanq | prototype pollution | JS/TS | No | Yes | Yes | Yes | No | No | No | No | 3 | No | No |
| app-project-blanq-redos-email-policy | blanq | ReDoS | JS/TS | No | No | No | No | No | No | No | No | 0 | No | No |
| app-project-blanq-ssrf-logo-preview | blanq | SSRF | JS/TS | No | No | Yes | Yes | Yes | Yes | Yes | Yes | 6 | Yes | No |
| app-project-blanq-xss-campaign | blanq | cross-site scripting | JS/TS | No | Yes | Yes | Yes | Yes | No | No | No | 4 | Yes | No |
| app-project-blanq-xss-referral | blanq | cross-site scripting | JS/TS | No | Yes | Yes | Yes | Yes | Yes | No | Yes | 6 | Yes | No |
| app-project-blanq-xss-tooltip | blanq | cross-site scripting | JS/TS | No | Yes | Yes | Yes | Yes | No | Yes | Yes | 6 | No | No |
| app-project-boilwater-command-injection-diagnostics | boilwater | command injection | JS/TS | Yes | Yes | Yes | Yes | Yes | No | No | Yes | 5 | Yes | No |
| app-project-boilwater-open-redirect-query | boilwater | open redirect | JS/TS | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | Yes | No |
| app-project-boilwater-open-redirect-referrer | boilwater | open redirect | JS/TS | No | Yes | No | No | No | No | No | No | 1 | Yes | No |
| app-project-boilwater-path-traversal-download | boilwater | path traversal | JS/TS | Yes | Yes | Yes | Yes | Yes | No | No | No | 4 | Yes | No |
| app-project-flask-bones-command-injection-diagnostics-1 | flask-bones | command injection | Python | Yes | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-flask-bones-command-injection-investigate-1 | flask-bones | command injection | Python | Yes | Yes | Yes | Yes | No | No | No | No | 3 | No | No |
| app-project-flask-bones-idor-user-delete-1 | flask-bones | IDOR | Python | No | No | Yes | No | Yes | No | No | No | 2 | No | No |
| app-project-flask-bones-insecure-deserialization-list-prefs-1 | flask-bones | insecure deserialization | Python | No | Yes | Yes | Yes | Yes | No | Yes | No | 5 | No | No |
| app-project-flask-bones-insecure-deserialization-register-draft-1 | flask-bones | insecure deserialization | Python | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-flask-bones-mass-assignment-user-edit-1 | flask-bones | mass assignment | Python | No | No | Yes | Yes | Yes | No | No | No | 3 | No | No |
| app-project-flask-bones-open-redirect-login-1 | flask-bones | open redirect | Python | No | Yes | No | No | No | No | Yes | No | 2 | No | No |
| app-project-flask-bones-open-redirect-verify-1 | flask-bones | open redirect | Python | No | Yes | No | No | No | No | No | No | 1 | No | No |
| app-project-flask-bones-path-traversal-export-1 | flask-bones | path traversal | Python | Yes | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-flask-bones-path-traversal-export-admin-1 | flask-bones | path traversal | Python | Yes | Yes | No | No | No | No | No | No | 1 | No | No |
| app-project-go-sample-sql-injection-attribute-search-1 | go-sample | SQL injection | Go | Yes | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-go-sample-sql-injection-jobs-list-orderby-1 | go-sample | SQL injection | Go | Yes | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-go-sample-sql-injection-product-search-1 | go-sample | SQL injection | Go | Yes | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-go-sample-xss-product-report-1 | go-sample | cross-site scripting | Go | No | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-go-sample-xss-search-preview-1 | go-sample | cross-site scripting | Go | No | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-gobase-command-injection-diagnostics-1 | gobase | command injection | Go | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | Yes | No |
| app-project-gobase-open-redirect-continue-1 | gobase | open redirect | Go | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | 6 | Yes | No |
| app-project-gobase-path-traversal-reports-1 | gobase | path traversal | Go | Yes | Yes | Yes | Yes | Yes | No | No | Yes | 5 | Yes | No |
| app-project-gobase-ssrf-branding-preview-1 | gobase | SSRF | Go | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | Yes | No |
| app-project-gobase-template-injection-preview-1 | gobase | template injection | Go | Yes | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-goxygen-command-injection-diagnostics-1 | goxygen | command injection | Go | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-goxygen-open-redirect-continue-1 | goxygen | open redirect | Go | Yes | Yes | No | No | Yes | Yes | Yes | Yes | 5 | No | No |
| app-project-goxygen-path-traversal-reports-1 | goxygen | path traversal | Go | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-goxygen-prototype-pollution-preferences-1 | goxygen | prototype pollution | Go | No | Yes | Yes | Yes | No | No | No | No | 3 | No | No |
| app-project-goxygen-ssrf-branding-preview-1 | goxygen | SSRF | Go | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-goxygen-xss-referral-banner-1 | goxygen | cross-site scripting | Go | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-iguana-code-injection-issue-filter | iguana | code injection | Python | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-iguana-command-injection-test-connection | iguana | command injection | Python | Yes | No | No | No | No | No | No | No | 0 | No | No |
| app-project-iguana-path-traversal-timelog-export | iguana | path traversal | Python | Yes | Yes | Yes | Yes | Yes | Yes | No | No | 5 | No | No |
| app-project-iguana-redos-search-operator | iguana | ReDoS | Python | Yes | No | No | No | No | No | No | No | 0 | No | No |
| app-project-iguana-redos-testpattern | iguana | ReDoS | Python | No | Yes | No | No | No | No | No | No | 1 | No | No |
| app-project-iguana-sql-injection-issue-search | iguana | SQL injection | Python | Yes | Yes | Yes | Yes | No | No | No | No | 3 | No | No |
| app-project-lastsaas-command-injection-dns-1 | lastsaas | command injection | Go | Yes | No | Yes | Yes | No | No | Yes | Yes | 4 | No | No |
| app-project-lastsaas-open-redirect-login-1 | lastsaas | open redirect | Go | No | Yes | Yes | No | No | No | No | No | 2 | Yes | No |
| app-project-lastsaas-path-traversal-media-1 | lastsaas | path traversal | Go | Yes | Yes | Yes | Yes | Yes | No | Yes | No | 5 | No | No |
| app-project-lastsaas-ssrf-remote-logo-1 | lastsaas | SSRF | Go | Yes | Yes | Yes | Yes | Yes | No | Yes | No | 5 | No | No |
| app-project-lastsaas-xss-custom-page-1 | lastsaas | cross-site scripting | Go | Yes | No | No | No | No | No | No | No | 0 | No | No |
| app-project-pygmy-code-injection-filter | pygmy | code injection | Python | No | Yes | Yes | Yes | Yes | Yes | No | No | 5 | No | No |
| app-project-pygmy-command-injection-click-lookup | pygmy | command injection | Python | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-pygmy-path-traversal-export | pygmy | path traversal | Python | Yes | Yes | Yes | Yes | Yes | Yes | No | No | 5 | Yes | No |
| app-project-pygmy-sql-injection-search | pygmy | SQL injection | Python | Yes | Yes | Yes | Yes | Yes | Yes | No | No | 5 | Yes | No |
| app-project-pygmy-ssrf-reachability-check | pygmy | SSRF | Python | Yes | Yes | Yes | Yes | No | Yes | No | No | 4 | No | No |
| app-project-robs-awesome-code-injection-reports-evaluate | robs-awesome | code injection | Python | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-robs-awesome-command-injection-dns-check | robs-awesome | command injection | Python | No | Yes | Yes | Yes | Yes | Yes | Yes | No | 6 | Yes | No |
| app-project-robs-awesome-insecure-deserialization-report-draft | robs-awesome | insecure deserialization | Python | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-robs-awesome-open-redirect-report-open | robs-awesome | open redirect | Python | Yes | Yes | Yes | No | No | No | No | No | 2 | Yes | No |
| app-project-robs-awesome-path-traversal-documents | robs-awesome | path traversal | Python | Yes | Yes | Yes | Yes | Yes | Yes | No | No | 5 | Yes | No |
| app-project-robs-awesome-sql-injection-reports | robs-awesome | SQL injection | Python | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | Yes | No |
| app-project-robs-awesome-ssrf-integrations-preview | robs-awesome | SSRF | Python | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | Yes | No |
| app-project-saas-starter-kit-command-injection-dns-check | saas-starter-kit | command injection | Go | Yes | Yes | Yes | Yes | Yes | No | No | Yes | 5 | No | No |
| app-project-saas-starter-kit-open-redirect-login-return-to | saas-starter-kit | open redirect | Go | Yes | Yes | Yes | No | Yes | No | No | No | 3 | No | No |
| app-project-saas-starter-kit-path-traversal-account-report-download | saas-starter-kit | path traversal | Go | Yes | Yes | Yes | Yes | Yes | No | No | Yes | 5 | No | No |
| app-project-saas-starter-kit-sqli-checklist-search | saas-starter-kit | SQL injection | Go | No | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-saas-starter-kit-ssrf-account-logo-preview | saas-starter-kit | SSRF | Go | Yes | Yes | Yes | Yes | Yes | No | No | Yes | 5 | No | No |
| app-project-saas-starter-kit-ssti-notification-preview | saas-starter-kit | template injection | Go | No | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app-project-saas-starter-lite-command-injection-export | saas-starter-lite | command injection | JS/TS | Yes | No | Yes | Yes | Yes | Yes | No | No | 4 | Yes | No |
| app-project-saas-starter-lite-open-redirect-continue | saas-starter-lite | open redirect | JS/TS | No | Yes | No | No | No | Yes | Yes | Yes | 4 | Yes | No |
| app-project-saas-starter-lite-sql-injection-export-search | saas-starter-lite | SQL injection | JS/TS | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | 6 | Yes | No |
| app-project-saas-starter-lite-ssti-invite-preview | saas-starter-lite | template injection | JS/TS | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| app-project-saas-starter-lite-xss-angular-render | saas-starter-lite | cross-site scripting | JS/TS | Yes | No | Yes | Yes | Yes | Yes | No | No | 4 | Yes | No |
| app-project-saas-starter-lite-xss-invite-response | saas-starter-lite | cross-site scripting | JS/TS | No | Yes | No | No | No | No | Yes | Yes | 3 | Yes | No |
| app-project-slingshot-prototype-pollution-display | slingshot | prototype pollution | JS/TS | No | Yes | No | No | No | No | No | No | 1 | No | No |
| app-project-slingshot-prototype-pollution-shared | slingshot | prototype pollution | JS/TS | No | Yes | Yes | Yes | Yes | Yes | No | No | 5 | No | No |
| app-project-slingshot-xss-campaign | slingshot | cross-site scripting | JS/TS | Yes | Yes | Yes | Yes | Yes | Yes | No | No | 5 | No | No |
| app-project-slingshot-xss-referral | slingshot | cross-site scripting | JS/TS | Yes | Yes | Yes | Yes | Yes | Yes | No | No | 5 | No | No |
| app1-path-traversal-statements-1 | keystonebank | path traversal | JS/TS | Yes | Yes | Yes | Yes | Yes | Yes | No | No | 5 | No | No |
| app1-prototype-pollution-memos-1 | keystonebank | prototype pollution | JS/TS | No | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| app1-sql-injection-finchat-1 | keystonebank | SQL injection | JS/TS | No | Yes | No | No | Yes | No | No | No | 2 | Yes | No |
| app1-xss-bank-profile-template-1 | keystonebank | cross-site scripting | JS/TS | No | Yes | No | No | No | No | No | No | 1 | Yes | No |
| coffeeshop-path-traversal-1 | coffeeshop | path traversal | Java | No | Yes | Yes | Yes | Yes | No | No | No | 4 | Yes | No |
| coffeeshop-sql-injection-1 | coffeeshop | SQL injection | Java | Yes | Yes | Yes | Yes | Yes | No | No | No | 4 | Yes | No |
| coffeeshop-template-injection-1 | coffeeshop | template injection | Java | Yes | No | No | No | No | No | No | No | 0 | No | No |
| coffeeshop-xss-1 | coffeeshop | cross-site scripting | Java | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | Yes | No |
| coffeeshop-xss-2 | coffeeshop | cross-site scripting | Java | No | Yes | No | No | No | No | No | No | 1 | No | No |
| conduit-v2-code-injection-filter | conduit | code injection | Python | No | No | Yes | Yes | Yes | Yes | No | No | 4 | No | No |
| conduit-v2-command-injection-pdf-export | conduit | command injection | Python | Yes | Yes | Yes | Yes | Yes | No | No | No | 4 | No | No |
| conduit-v2-insecure-deserialization-draft-resume | conduit | insecure deserialization | Python | No | Yes | Yes | Yes | Yes | No | Yes | Yes | 6 | No | No |
| conduit-v2-path-traversal-download | conduit | path traversal | Python | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | 7 | No | No |
| conduit-v2-sql-injection-search | conduit | SQL injection | Python | Yes | No | Yes | Yes | Yes | No | No | No | 3 | No | No |
| conduit-v2-ssrf-avatar-url | conduit | SSRF | Python | Yes | Yes | Yes | Yes | No | No | No | No | 3 | No | No |
| halloween-improper-type-validation-filter-1 | halloween | improper type validation | JS/TS | No | Yes | No | No | No | No | No | No | 1 | No | No |
| halloween-improper-type-validation-includes-1 | halloween | improper type validation | JS/TS | No | Yes | Yes | Yes | No | No | No | No | 3 | No | No |
| halloween-mass-assignment-1 | halloween | mass assignment | JS/TS | Yes | No | Yes | Yes | Yes | Yes | Yes | No | 5 | No | No |
| sassyapp-cross-site-scripting-1 | sassyreg | cross-site scripting | JS/TS | No | Yes | Yes | Yes | Yes | No | No | No | 4 | Yes | No |
| sassyapp-cross-site-scripting-2 | sassyreg | cross-site scripting | JS/TS | No | No | Yes | Yes | No | No | No | No | 2 | Yes | Yes |
| vinyl-marketplace-path-traversal-1 | vinyl-marketplace | path traversal | Java | No | Yes | Yes | Yes | No | No | No | No | 3 | Yes | No |
| vinyl-marketplace-path-traversal-2 | vinyl-marketplace | path traversal | Java | No | Yes | No | No | No | No | No | No | 1 | No | No |
| vinyl-marketplace-sql-injection-1 | vinyl-marketplace | SQL injection | Java | Yes | Yes | Yes | Yes | Yes | Yes | No | No | 5 | Yes | No |
| vinyl-marketplace-unsafe-deserialization-1 | vinyl-marketplace | insecure deserialization | Java | No | Yes | Yes | Yes | Yes | Yes | No | No | 5 | No | No |
| vinyl-marketplace-xss-1 | vinyl-marketplace | cross-site scripting | Java | Yes | No | No | No | No | No | No | No | 0 | No | No |
| vinyl-marketplace-xss-2 | vinyl-marketplace | cross-site scripting | Java | Yes | No | No | No | No | No | No | No | 0 | No | No |
| vinyl-marketplace-xss-3 | vinyl-marketplace | cross-site scripting | Java | Yes | No | Yes | Yes | Yes | No | Yes | Yes | 5 | Yes | No |
An empty cell means not applicable or unavailable as stated in `columns`; it never means zero.