The audytx Terraform scanner benchmark
Two tracks, three measured numbers, every figure pinned to a committed artifact. Audited precision on real-world Terraform, recall graded against hand-authored ground truth, and the metric other IaC benchmarks skip — how correctly audytx suppresses, with a rationale, the findings context proves benign.
Headline numbers
Three measured results, each carrying its confidence interval and the audit that produced it.
57,004 kept findings across 398 scanned repositories, engine 1.12.2 — from two complementary tracks, described next.
One benchmark story, two tracks
Precision and recall answer different questions, so they come from two complementary harnesses and are reported separately.
Track 1 — per-finding ground-truth science
The in-repo benchmark/ harness: recall manifests hand-map each
known vulnerability to the check that should catch it, and an audited sample
grades individual findings tp/fp/unclear against primary sources. It doubles
as an offline regression gate — identical inputs, byte-identical scorecard.
Track 2 — end-to-end product harness
The public audytx-testbed runs the live GitHub App across hundreds of real corpora — the source of the corpus-breadth data below and of the head-to-head tables on /comparison. This page is the per-finding science behind the same engine.
Recall — graded against hand-authored ground truth
Four deliberately-vulnerable corpora, each pinned to one immutable commit, with a hand-authored manifest mapping every code-unambiguous vulnerability to the check id(s) that cover it. The committed table below is the point-in-time record (engine 1.12.2, run 2026-07-13).
| Corpus | Pinned SHA | Ground-truth items | Recall | Benign-twin FPs | Suppression-correct | Gaps |
|---|---|---|---|---|---|---|
| kaimonkey | 3feb0bf1a5ab81a79f225407a5ed16db3acd59a4 | 13 | 100.0% | 0 | n/a | 0 |
| sadcloud | f538652921a7f3e8e25c0afaecad2d4382f8b21e | 16 | 100.0% | 0 | n/a | 2 |
| seeded | in-repo | 30 | 100.0% | 0 | 100.0% | 0 |
| terragoat | 729f8da62c6a85ce4af5ad3d123de97776d954c4 | 15 | 100.0% | 0 | n/a | 0 |
| Overall | — | 74 | 100.0% | 0 | 100.0% | 2 |
74 ground-truth items overall. Three metrics, each defined to resist gaming:
- Recall is computed over non-gap items only — the fraction of hand-authored vulnerabilities audytx reports as a kept finding. A finding audytx emits but context-suppresses does not count toward recall.
- Benign-twin false positives is a check-scoped count: each benign twin is a near-identical copy of a vulnerable resource with only the issue fixed, and the metric counts how often the paired check wrongly fires on the fixed resource. An unrelated hygiene check firing on the twin isn't counted; that's why every item declares which check ids own it.
- Suppression correctness is the moat metric: audytx must fire the naive finding and attach the reasoning that reclassifies it as benign. A scanner that stays silent scores the same as one that never had the check; audytx has to fire-then-justify. We haven't found another public IaC scanner recall benchmark that measures this third axis.
The 2 gaps are the published engine limitations SC-015 (public SQS resource policy) and SC-016 (public ECR resource policy) — audytx has no check for those classes today, so they are registered as gaps, disclosed here, and excluded from the recall denominator rather than hidden as silent misses. SC-015 and SC-016 are the only two, out of 74 ground-truth items.
Precision — audited on 398 real-world repositories
A precision number is only worth the audit trail behind it. This track sweeps a pinned corpus of real public AWS Terraform repositories, then hand-audits a fixed-seed stratified sample against primary sources.
Manifest sha256
d36b96086e41ea68d720d4fbe6a6b374406975681209dc5ec41e04cc17e07ab9,
retrieved 2026-07-12. The two fatal parses were cloudposse/terraform-aws-alb and
aws-ia/terraform-aws-iam-identity-center; the 3,804 suppressions are findings a
naive single-resource scanner would have reported as-is.
The audit is a fixed-seed stratified sample: seed 20260712, 100 kept findings and 40 suppressed findings drawn by a sha256-keyed selection over each finding family — no RNG, so the exact 140-item set is reproducible from the seed alone. Grades:
- Kept sample: 100 findings — tp=93, fp=3, unclear=4 → primary precision 96.9% (Wilson 95% 91.2%–98.9%), conservative 93.0%.
- Suppressed sample: 40 findings — correct=38, wrong=1, unclear=1 → suppression correctness 97.4% (Wilson 95% 86.8%–99.5%), conservative 95.0%.
The verdict taxonomy is tp / fp / unclear. An unclear is never forced to a
positive: the primary number counts it out of the denominator, and the conservative
number counts every unclear against audytx (93.0% and 95.0% are the floor if every
ambiguous case is a miss). Every audited fp and every wrong suppression is written up
with a root cause in the cross-version ledger
precision/results/register-history.md in the public harness, so a claimed precision
never rests on a defect we noticed but did not record.
Methodology — why the numbers are reproducible
The four reproducibility pillars both harnesses share.
Pinned-SHA fetch, never vendored
Every corpus is shallow-fetched at one immutable commit into a gitignored work dir — never copied into this repository. A run is fully reproducible from the pinned SHAs alone.
Byte-deterministic scoring
Stdlib-only scorers embed no timestamps and iterate every mapping in a fixed order, so identical inputs yield byte-identical output. The engine version is read from the SARIF driver; mixing versions is a hard error.
Wilson 95% intervals
Confidence bounds use the Wilson score interval (z=1.96), not naive proportions — it stays honest at small sample sizes and near the 100% edge where the normal approximation breaks.
Anti-gaming gates
The aggregator refuses to write unless the audited set is exactly the recomputed sample; a ground-truth item is never deleted to dodge a miss, a missing capability becomes a registered gap, and a suppressed hit never counts toward recall. The only way to move a number is to change the engine.
Wilson interval: Wilson, E. B. (1927), Probable Inference, the Law of Succession, and Statistical Inference, Journal of the American Statistical Association 22:209–212; z=1.96 for the 95% interval.
Corpus credibility
A precision number is only as trustworthy as the corpus behind it. The public audytx-testbed publishes a diversity report — an independent instrument — that quantifies how wide and how hard the corpus reaches.
Control coverage is measured with KICS purely as a neutral instrument — to size the
corpus, not as a scored competitor. The AWS universe is pinned to
hashicorp/terraform-provider-aws v6.52.0 (1,669 resource types), and the
provenance spread is 179 distinct upstream vendors, role-labeled 253 precision, 76
recall, and 2 custom.
The role labels are measured, not asserted: recall-role corpora average 19.66 HIGH+CRITICAL KICS findings per corpus, versus 3.02 for the precision-role corpora — the vulnerable fixtures really do light scanners up, and the clean modules really are the residual false-positive surface.
Where the corpus stops. IAM resources are 30.7% of the resource instances in the vulnerable corpora — above the ≤ 25% anti-monoculture target we set for ourselves, so the vulnerable fixtures still lean toward IAM. And only 21.45% of AWS resource types (358 of 1,669) have a deliberately-vulnerable fixture at all; 460 more types appear only in clean modules. That's why the recall claims on this page are scoped to the authored ground truth rather than the whole AWS surface. No figure here asserts coverage the corpus doesn't have.
Full report: audytx-testbed Actions run 29226801605 (2026-07-13).
How the competitor tables are produced
The head-to-head scorecards live on /comparison. Here's how the audytx column in them is kept honest.
The audytx column is pulled from live GitHub Code Scanning SARIF — per
bench/* branch of the public audytx-testbed, by
scripts/benchmark-scorecard.sh — and a row is accepted only when the SARIF
driver.version matches the live engine, so a stale scan can't slip in.
Every competing scanner runs at a pinned version with no suppression file, on the same
corpus, scored by the same deterministic script: a measurement, not an argument.
Where the claims stop
This is a benchmark, not a sales sheet. What these numbers do not claim:
- The auditor is a single model. The precision audit is one model applying primary-source citations to each verdict, not a panel of independent reviewers. Each audited item carries its per-item evidence field so a second auditor can re-check the call; until someone does, the number is a documented estimate.
- It's a point-in-time snapshot. Every figure is pinned to engine 1.12.2 and the dated artifacts named in the banner. A later engine or a re-fetched corpus produces a different scorecard. That's by design: nothing here poses as a standing property.
- Precision is a sample-based estimate. 96.9% is the point estimate over a 100-item kept sample; the honest range is the Wilson interval (91.2%–98.9%), and 93.0% is the conservative floor. We publish all three rather than the single flattering number.
- The corpus skews to starred, recently-active repositories. Real public Terraform, though nowhere near a uniform sample of everything out there; the diversity report above quantifies the skew exactly.
- There are two recall gaps. SC-015 and SC-016 (public SQS / ECR resource policies) have no audytx check today. Both are registered gaps, disclosed above.
- The corpus is IAM-heavy and type-sparse. See corpus credibility: IAM is 30.7% of vulnerable instances (above our ≤ 25% target) and only 21.45% of AWS resource types have a vulnerable fixture. Recall claims are scoped accordingly.
- AWS and Terraform only, by design. Nothing here says anything about multi-cloud, which audytx deliberately doesn't cover, nor about audytx's CloudFormation support, which shipped after this benchmark and has no measured numbers yet.
Reproduce it yourself
You don't have to take these numbers on faith. The precision and CloudFormation harnesses are public with their per-finding adjudication records; the recall suite runs as tests in the engine repository.
# Public harness — manifests, scoring, per-finding adjudication records: git clone https://github.com/victorsinha/audytx-benchmark && cd audytx-benchmark # Terraform precision — seed-pinned 80-repo sample (free Client ID from the dashboard): export AUDYTX_CLIENT_ID=<your-client-id> make precision # Precision aggregator self-check (anti-gaming + determinism gates, offline): python3 precision/aggregate.py --self-test # CloudFormation 4-tool scorecard (needs checkov, trivy, kics): make cfn # Corpus diversity report — download the exact artifact this page cites: gh run download 29226801605 --repo victorsinha/audytx-testbed --name diversity-report-2026-07-13
Ground-truth write-ups: precision/results/scorecard.md
and the per-defect resolution history precision/results/register-history.md,
both in the public harness; the recall suite and its write-up
(benchmark/recall/README.md) run as tests in the engine repo. Live engine
check and axis counts are on /status.
Benchmark FAQ
The three headline metrics, defined in one place.
What is audytx's measured precision?
96.9% audited precision on the kept-findings sample (Wilson 95% CI 91.2%–98.9%; conservative floor 93.0%).
What is recall?
Recall is computed over non-gap items only — the fraction of hand-authored vulnerabilities audytx reports as a kept finding. A finding audytx emits but context-suppresses does not count toward recall. Measured recall is 100.0% on 74 ground-truth items.
What is suppression correctness?
Suppression correctness is the moat metric: audytx must fire the naive finding and attach the reasoning that reclassifies it as benign. Measured suppression correctness is 97.4%.
Start free during the open beta
Install the GitHub App, open a pull request, and read the same engine these numbers measure — one comment, precision you can trace. Free for every team.