Benchmark
A small, v0 pilot run against a public corpus — 25 mature open-source libraries with no known issue, 11 intentionally-vulnerable training apps, and 20 mature, deployed open-source web applications. Published with every caveat we found, not just the numbers that look good.
False-critical rate, libraries
0%
0 of 25 clean repos, both tiers
Small sample: n=25, exact 95% CI 0–13.8%. Libraries only — applications are measured separately below. A point estimate, not a guarantee.
Verdict-level recall, Deep tier
100%
11 of 11 vulnerable apps verdicted unsafe
Verdict-level, not finding-level — parity with a union of three open-source scanners, not detection superiority. 91.7% under strict pre-registration.
Secret false-critical rate, applications
0%
0 of 20 deployed apps, free deterministic tier
Down from a raw 35% via general precision rules, never per-repo allowlists — but the rules were tuned on these same 20 apps, so this is in-sample. Held-out validation is an open v1 item.
Application clean-pass, Deep tier
80%
16 of 20 deployed apps passed green
Model false-critical rate 0% — no critical on model opinion alone. All 4 not-green verdicts were adjudicated over-escalated on dependency drift; root causes since fixed, re-run outstanding.
Free vs. Deep Verification
NittiM ships two tiers. The free scan runs only deterministic checks — a secret scanner and a dependency-CVE lookup — no model in the verdict path. Deep Verification adds Claude Opus reasoning across the full audit framework, including the semantic vulnerabilities (SQL injection, authorization bypass, SSRF, logic flaws) that have no committed secret or vulnerable dependency to point at.
| Tier | False-critical rate | Recall |
|---|---|---|
| Free — deterministic scan | 0% (0 of 25) | 63.6% (7 of 11) |
| Deep Verification — Opus | 0% (0 of 25) | 100% (11 of 11) |
Free-tier mean hard-evidence findings per vulnerable app: 4.27. The free tier missed 4 of 11 apps — digininja/DVWA, juice-shop/juice-shop, stamparm/DSVW, OWASP/Vulnerable-Web-Application — because none of them had a committed production secret or a runtime high/critical CVE for the scanners to find. This is the precise gap Deep Verification exists to close, not a defect in the free tier.
Score separation, Deep tier
On the Deep tier, the readiness/safety score (0–100, higher is safer) separates the two populations clearly: a mean of 89.3 on clean libraries versus 30.3 on intentionally-vulnerable apps. The two populations are maximally contrasted by construction — audited libraries against deliberately broken training apps — so this gap describes the corpus, not how well NittiM discriminates a real app with two or three embedded issues from clean code, which this benchmark does not yet measure.
Applications — 20 mature, deployed web apps
The library numbers above answer the wrong question for most readers: NittiM audits applications, not libraries. This axis measures both tiers against 20 mature, widely-deployed open-source web apps (Ghost, Strapi, n8n, cal.com, Gitea, Mattermost, Discourse, Mastodon, Metabase, and others) across Node, Go, Python, Ruby, PHP, Elixir, and Clojure stacks. A deployed app ships a real dependency tree, so unlike a library, a not-green verdict here is not automatically a false alarm— every one was independently adjudicated against the OSV database and the repo's real lockfile before being counted.
| Metric | Result |
|---|---|
| Secret false-critical rate (free tier) | 0% (0 of 20) |
| Real runtime-CVE catches (true positives, reported separately) | 3 of 20 |
| Clean-pass rate (Deep tier, Opus) | 80% (16 of 20) |
| Criticals on model opinion alone (Deep tier) | 0% — zero across all 20 |
The unflattering number, published on purpose: of the five dependency findings that drove the 4 not-green verdicts, 2 were sound, 2 overstated, and 1 flatly false (a critical raised against an already-patched version because the scanner read the declared range instead of the installed lockfile version). The model never invented a critical — the failure mode was a deterministic layer escalating ordinary dependency drift too aggressively. Both root causes are fixed; the table reports the run as measured, before those fixes.
Application-axis caveats
Same rule as everywhere on this page: the qualifier ships with the number.
Mature apps are a lower bound, not the target class
One flatly false critical — found, disclosed, fixed at the source
Over-escalation was the real failure mode — since retuned
Single pass per app — verdict variance unmeasured
The adjudicator shares a model family with the system under test
Read this before the numbers above
This is a v0 pilot on a small, hand-built corpus. Every limitation we found is listed here, next to the numbers it qualifies — not in a footnote.
Small sample — point estimate, not a tight bound
Library FCR and application FCR are different measurements
Recall is verdict-level, not finding-level
The juice-shop-ctf disclosure
The juice-shop-ctf entry, both ways
Confidence interval, not a point claim
The full corpus, selection predicates, protocol, and methodology are public: github.com/ilanwolberger/fis-benchmark. See Data & Trust for what NittiM stores, or go back to the home page.