Agent Skill Scanner Benchmark

An independent, rerunnable measurement of the security scanners that vet AI-agent skills. Every scanner runs unmodified, at a pinned version, over the same corpus. Each lens is computed from the scanner's own output: the native column is the tool's own verdict gate, the severity columns apply the same cutoff to every tool, so only those are comparable across rows.

Detection (recall) by lens

ScannerVersionNative gate≥ any finding≥ MEDIUM≥ HIGH
cisco2.0.144% (41/995)15% (145/995)5% (53/995)4% (41/995)
nvidia2.13.187% (870/995) ‡40% (403/995)40% (403/995)21% (210/995)
snyk0.6.947% (470/995)47% (470/995)46% (460/995) †37% (368/995) †
tencent@gpt-oss-20b0.2.27% (70/995)7% (72/995)7% (70/995)7% (66/995)
tencent@qwen3.5-9b-mlx0.2.28% (78/995)8% (79/995)8% (78/995)7% (73/995)

Errors (no parseable verdict, counted in the denominator): cisco 17, nvidia 0, snyk 9, tencent@gpt-oss-20b 9, tencent@qwen3.5-9b-mlx 10.

False-positive rate by lens

ScannerNative gate≥ any finding≥ MEDIUM≥ HIGH
cisco2% (9/545)4% (20/545)2% (13/545)2% (9/545)
nvidia69% (377/545) ‡44% (239/545)42% (229/545)15% (81/545)
snyk24% (131/545)24% (131/545)14% (78/545) †9% (51/545) †
tencent@gpt-oss-20b2% (8/545)2% (9/545)2% (8/545)1% (7/545)
tencent@qwen3.5-9b-mlx0% (0/545)0% (0/545)0% (0/545)0% (0/545)

† Snyk has no severity enum; its severity lenses band Snyk's numeric risk score and are provisional until confirmed against Snyk's published scale. Its native and any-finding lenses are exact.

‡ NVIDIA's native gate here is recommendation ≠ SAFE; the tool's install gate is a stricter risk-score threshold, not recomputed. The severity lenses are exact.

By corpus split

The same lenses restricted to each corpus slice: read a home-ground tool against the source-disjoint slice to see how far detection generalises.

Canaries

Detection (recall):

ScannerVersionNative gate≥ any finding≥ MEDIUM≥ HIGH
cisco2.0.14partial (1/8)partial (2/8)partial (2/8)partial (1/8)
nvidia2.13.1partial (1/8)partial (5/8)partial (5/8)partial (1/8)
snyk0.6.9partial (1/8)partial (1/8)partial (1/8)partial (1/8)
tencent@gpt-oss-20b0.2.2partial (0/8)partial (0/8)partial (0/8)partial (0/8)
tencent@qwen3.5-9b-mlx0.2.2partial (0/8)partial (0/8)partial (0/8)partial (0/8)

False positives:

ScannerNative gate≥ any finding≥ MEDIUM≥ HIGH
cisco0% (0/1)0% (0/1)0% (0/1)0% (0/1)
nvidia0% (0/1) ‡0% (0/1)0% (0/1)0% (0/1)
snyk0% (0/1)0% (0/1)0% (0/1) †0% (0/1) †
tencent@gpt-oss-20b0% (0/1)0% (0/1)0% (0/1)0% (0/1)
tencent@qwen3.5-9b-mlx0% (0/1)0% (0/1)0% (0/1)0% (0/1)

MSB source-disjoint (held-out sources)

Detection (recall):

ScannerVersionNative gate≥ any finding≥ MEDIUM≥ HIGH
cisco2.0.144% (33/839)5% (42/839)4% (38/839)4% (33/839)
nvidia2.13.187% (732/839) ‡32% (265/839)32% (265/839)12% (99/839)
snyk0.6.942% (351/839)42% (351/839)42% (348/839) †35% (290/839) †
tencent@gpt-oss-20b0.2.22% (21/839)2% (21/839)2% (21/839)2% (18/839)
tencent@qwen3.5-9b-mlx0.2.28% (71/839)9% (72/839)8% (71/839)8% (66/839)

False positives:

ScannerNative gate≥ any finding≥ MEDIUM≥ HIGH
cisco2% (9/541)4% (19/541)2% (12/541)2% (9/541)
nvidia69% (375/541) ‡44% (237/541)42% (227/541)15% (80/541)
snyk24% (130/541)24% (130/541)14% (78/541) †9% (51/541) †
tencent@gpt-oss-20b2% (8/541)2% (9/541)2% (8/541)1% (7/541)
tencent@qwen3.5-9b-mlx0% (0/541)0% (0/541)0% (0/541)0% (0/541)

MSB SRC002 (home-ground)

Detection (recall):

ScannerVersionNative gate≥ any finding≥ MEDIUM≥ HIGH
cisco2.0.145% (7/148)68% (101/148)9% (13/148)5% (7/148)
nvidia2.13.193% (137/148) ‡90% (133/148)90% (133/148)74% (110/148)
snyk0.6.980% (118/148)80% (118/148)75% (111/148) †52% (77/148) †
tencent@gpt-oss-20b0.2.233% (49/148)34% (51/148)33% (49/148)32% (48/148)
tencent@qwen3.5-9b-mlx0.2.25% (7/148)5% (7/148)5% (7/148)5% (7/148)

False positives:

ScannerNative gate≥ any finding≥ MEDIUM≥ HIGH
cisco0% (0/3)33% (1/3)33% (1/3)0% (0/3)
nvidia67% (2/3) ‡67% (2/3)67% (2/3)33% (1/3)
snyk33% (1/3)33% (1/3)0% (0/3) †0% (0/3) †
tencent@gpt-oss-20b0% (0/3)0% (0/3)0% (0/3)0% (0/3)
tencent@qwen3.5-9b-mlx0% (0/3)0% (0/3)0% (0/3)0% (0/3)

Per-behavior coverage

flag: the gate fired. noticed: a finding, but the gate said safe. miss: nothing. Multi-sample families show counts.

Behaviorcisconvidiaskill-lintsnyktencent@gpt-oss-20btencent@qwen3.5-9b-mlx
dynamic-code-evalflagflagmissmissmissmiss
env-readmissnoticedmissmissmissmiss
file-read-outside-skillmissmissmissmissmissmiss
file-write-outside-skillmissnoticedmissmissmissmiss
http-requestnoticednoticedmissmissmissmiss
instruction-file-readmissmissmissflagmissmiss
malicious/source-disjoint33/839 flag, 9 noticed732/839 flag, 41 noticed372/839 flag, 20 noticed351/839 flag, 0 noticed21/839 flag, 0 noticed71/839 flag, 1 noticed
malicious/wild7/148 flag, 94 noticed137/148 flag, 4 noticed122/148 flag, 7 noticed118/148 flag, 0 noticed49/148 flag, 2 noticed7/148 flag, 0 noticed
network-connectmissmissmissmissmissmiss
subprocess-spawnmissnoticedmissmissmissmiss

Reference — our own linter (not a neutral entry)

skill-lint is this repository's own linter (ci/), run through the same harness. It is listed for transparency, not as a neutral entry: we wrote both it and the corpus.

ScannerVersionNative gate≥ any finding≥ MEDIUM≥ HIGH
skill-lint0.0.150% (494/995)52% (521/995)50% (494/995)16% (156/995)

Method in brief

Full methodology, corpus provenance and raw per-sample scanner output are in the repository (docs/methodology.md, docs/corpus-sources.md, results/).

An independent benchmark by Martin Andreoni. Reruns are quarterly or on a new scanner release. · Back to the explorer