Which agents repair real vulnerabilities?
Every agent runs the same corpus and is graded by the same verifier: a repair passes only if the vulnerability no longer triggers and the software still works. Scores are pass rates over scored attempts, with 95% intervals clustered by codebase. How we test.
The weakness class matters more than the model: agents repair Out-of-bounds Read at 57.2% and Use of Uninitialized Resource at 22.2% — the point estimates differ 2.6×. Their intervals overlap at the edges, so read this as a large gap whose exact size this corpus does not pin down.
By weakness class
| Weakness | Repair rate | Rate | 95% interval | Attempts |
|---|---|---|---|---|
| CWE-125Out-of-bounds Read | 57.2% | 43.9–66.4 | 1101 | |
| CWE-787Out-of-bounds Write | 55.5% | 40.3–73.0 | 247 | |
| CWE-416Use After Free | 31.7% | 13.2–57.5 | 186 | |
| CWE-908Use of Uninitialized Resource | 22.2% | 8.0–50.6 | 126 | |
| CWE-415Double Free | 53.5% | 0.0–80.0 | 43 | |
| CWE-1284Improper Validation of Specified Quantity in Input | 44.8% | 0.0–86.7 | 29 | |
| CWE-843Access of Resource Using Incompatible Type ('Type Confusion') | 34.5% | 0.0–66.7 | 29 | |
| CWE-476NULL Pointer Dereference | 24.1% | 14.3–33.3 | 29 | |
| CWE-475 | 40.0% | — | 151 codebase | |
| CWE-562 | 26.7% | — | 151 codebase |
A dash means no interval: the class comes from a single codebase, or carries too few attempts for a bootstrap to say anything. The point estimate stands; there is nothing to generalise from. Rows sharing a rank are tied — their intervals overlap.
By model
| Rank | Agent | Model | Outcomes | Rate | 95% interval | Attempts |
|---|---|---|---|---|---|---|
| 1= | codex | gpt-5.2 | 62.7% | 51.9–71.5 | 126 | |
| 1= | cursor | opus-4.6 | 62.5% | 50.7–71.9 | 128 | |
| 1= | claude | claude-opus-4-6 | 61.6% | 48.9–71.3 | 125 | |
| 1= | gemini31 | gemini-3.1-pro-preview | 58.7% | 44.0–71.2 | 109 | |
| 1= | opencode | gemini-3.1-pro-preview | 54.9% | 42.9–66.7 | 122 | |
| 1= | cursor | gpt-5.2 | 51.6% | 38.1–63.6 | 122 | |
| 1= | opencode | gpt-5.2 | 51.6% | 39.5–63.1 | 122 | |
| 1= | cursor | gpt-5.3-codex | 50.4% | 36.2–61.2 | 127 | |
| 1= | codex | gpt-5.2-codex | 49.2% | 35.9–59.8 | 128 | |
| 1= | opencode | claude-opus-4-6 | 47.5% | 32.0–59.7 | 122 | |
| 1= | claude | claude-opus-4-5 | 45.7% | 33.1–55.5 | 127 | |
| 1= | cursor | composer-1.5 | 45.2% | 32.5–58.0 | 126 | |
| 1= | gemini | gemini-3-pro-preview | 43.0% | 32.8–52.1 | 128 | |
| 2= | opencode | gpt-5.2-codex | 37.8% | 25.0–48.7 | 127 | |
| 2= | opencode | claude-opus-4-5 | 36.8% | 25.0–48.5 | 125 |
Bars show repaired / not repaired / did not build. Intervals overlap across most of this table: treat close ranks as a tie.
What this does not measure
These results score the repair stage only. Whether an agent can locate a weakness on its own, or trigger it, is measured in the environment estate but is not published here — those stages read as finding and exploit, not as a zero. A permanent held-out slice never appears in any published number, so a model cannot be tuned against this page.
Corpus cve-bench-136 · run February 2026 · 1,864 scored evaluations · /benchmarks.json