agentsec · Benchmark

Offline · stdlib-only · MIT

Detection benchmark


On the expanded 125-sample synthetic corpus (ten tools), overall precision is 100.0% and recall is 100.0% (76 true positives, 0 false positives, 0 false negatives). On the original 85-sample, 5-tool slice the same run scores precision 100.0% and recall 100.0% (was 91.5% / 84.3% in v0.38.0).

This is a small, author-written, synthetic corpus. It is not a red-team dataset, not drawn from production traffic, and not a claim about performance on real attacks. Heuristic scanners miss things; misses are listed on purpose.

Before (v0.38.0) — original 85-sample, 5-tool corpus

Frozen numbers from the v0.38.0 release, before the issue #7–#11 rule changes. Eight evasions were missed and four benign samples were flagged.

ToolTPFPFNTN PrecisionRecallF1n
resultguard923681.8%75.0%78.3%20
secretflow6014100.0%85.7%92.3%11
shellfence11018100.0%91.7%95.7%20
toolpoison822680.0%80.0%80.0%18
tracesweep9016100.0%90.0%94.7%16
overall43483091.5%84.3%87.8%85

After — same 85 samples, same five tools

Re-run on the identical 85 fixtures after the general rule changes. The four false positives were removed without dropping any of the original true positives.

ToolTPFPFNTN PrecisionRecallF1n
resultguard12008100.0%100.0%100.0%20
secretflow7004100.0%100.0%100.0%11
shellfence12008100.0%100.0%100.0%20
toolpoison10008100.0%100.0%100.0%18
tracesweep10006100.0%100.0%100.0%16
overall510034100.0%100.0%100.0%85

Held-out set (written after the fixes)

A fresh set of 40 samples was written after the rule changes were locked, and was not used to tune them. Wording and obfuscation differ from the original fixtures. Misses on this set, if any, are listed below without being patched away.

ToolTPFPFNTN PrecisionRecallF1n
resultguard7003100.0%100.0%100.0%10
secretflow4002100.0%100.0%100.0%6
shellfence5004100.0%100.0%100.0%9
toolpoison5003100.0%100.0%100.0%8
tracesweep5002100.0%100.0%100.0%7
overall260014100.0%100.0%100.0%40

Held-out false negatives

None on this corpus (false negative).

Held-out false positives

None on this corpus (false positive).

Independent red-team round 9 (v0.48.0, unseen)

A ninth independent set of 100 samples across the same eleven tools, written against the frozen v0.48.0 detectors by a separate author who did not read tool source, rule lists, tests, prior red-team fixtures (including round 8), the private dev set, or the v0.48.0 diff. Techniques come from published 2026 research that round 8 did not use as its basis (see benchmarks/redteam9/SOURCES.md). These numbers were scored once against the frozen v0.48.0 rules and were not used to retune detectors. They are the current headline independent unseen score. Unseen F1 across successive independent rounds: 78.3 (r3) → 74.4 (r4) → 61.5 (r5) → 81.3 (r6) → 96.1 (r7) → 78.2 (r8) → 69.2 (r9).

ToolTPFPFNTN PrecisionRecallF1n
fetchfence6003100.0%100.0%100.0%9
mcpoauth510283.3%100.0%90.9%8
mcpposture1053100.0%16.7%28.6%9
memfence4023100.0%66.7%80.0%9
pathfence511283.3%83.3%83.3%9
piiguard412280.0%66.7%72.7%9
resultguard4034100.0%57.1%72.7%11
secretflow0053n/a0.0%n/a8
shellfence3043100.0%42.9%60.0%10
toolpoison3034100.0%50.0%66.7%10
tracesweep1043100.0%20.0%33.3%8
overall363293292.3%55.4%69.2%100

Round 9 false negatives

Round 9 false positives

Round 9 detection-gap issues #37–#46

Every tool with a round-9 miss or false positive has one detection-gap issue: #37 (resultguard), #38 (toolpoison), #39 (shellfence), #40 (memfence), #41 (piiguard), #42 (pathfence), #43 (mcpposture), #44 (secretflow), #45 (tracesweep), and #46 (mcpoauth). fetchfence had a clean score on this set. These issues were opened after the single v0.48.0 scoring run; detectors were not changed against the fixtures.

Independent red-team round 8 (v0.47.0, unseen)

An eighth independent set of 100 samples across the same eleven tools, written against the frozen v0.47.0 detectors by a separate author who did not read tool source, rule lists, tests, prior red-team fixtures, or the private dev set. Techniques come from published 2025-2026 research that rounds 1-7 did not list (see benchmarks/redteam8/SOURCES.md). These numbers were scored once against the frozen v0.47.0 rules, before any later rule was changed against this set. They remain the honest v0.47.0 unseen score on this set. The headline independent number is now round 9. Unseen F1 across successive independent rounds: 78.3 (r3) → 74.4 (r4) → 61.5 (r5) → 81.3 (r6) → 96.1 (r7) → 78.2 (r8).

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5013100.0%83.3%90.9%9
mcpoauth4013100.0%80.0%88.9%8
mcpposture2043100.0%33.3%50.0%9
memfence1053100.0%16.7%28.6%9
pathfence4023100.0%66.7%80.0%9
piiguard6003100.0%100.0%100.0%9
resultguard4034100.0%57.1%72.7%11
secretflow4013100.0%80.0%88.9%8
shellfence5023100.0%71.4%83.3%10
toolpoison323260.0%50.0%54.5%10
tracesweep5003100.0%100.0%100.0%8
overall432223395.6%66.2%78.2%100

Round 8 false negatives (v0.47.0)

Round 8 false positives (v0.47.0)

Same round-8 set after v0.48.0 generalization (now seen)

An eighth independent set of 100 samples across the same eleven tools, written against the frozen v0.47.0 detectors by a separate author who did not read tool source, rule lists, tests, prior red-team fixtures, or the private dev set. Techniques come from published 2025-2026 research that rounds 1-7 did not list (see benchmarks/redteam8/SOURCES.md). After the v0.48.0 class-level rule changes (issues #28–#36; rules were generalized from the issue text and a private dev set, without opening the round-8 fixtures while designing fixes), the same fixtures were re-run. The table below is a <strong>seen</strong> score and is no longer independent. The original unseen numbers are kept in the table above as the previous unseen score. The headline independent number is round 9.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence6003100.0%100.0%100.0%9
mcpoauth5003100.0%100.0%100.0%8
mcpposture6003100.0%100.0%100.0%9
memfence5013100.0%83.3%90.9%9
pathfence6003100.0%100.0%100.0%9
piiguard6003100.0%100.0%100.0%9
resultguard5024100.0%71.4%83.3%11
secretflow4013100.0%80.0%88.9%8
shellfence7003100.0%100.0%100.0%10
toolpoison6004100.0%100.0%100.0%10
tracesweep5003100.0%100.0%100.0%8
overall610435100.0%93.8%96.8%100

Post-generalization round-8 false negatives

Post-generalization round-8 false positives

None on this corpus (false positive).

Round 8 detection-gap issues #28–#36

Every tool with a round-8 miss or false positive has one detection-gap issue: #28 (resultguard), #29 (toolpoison), #30 (shellfence), #31 (memfence), #32 (fetchfence), #33 (pathfence), #34 (mcpposture), #35 (secretflow), and #36 (mcpoauth). v0.48.0 generalizes detectors by class from the issue text and a private dev set; the original unseen table above is unchanged.

Independent red-team round 7 (v0.47.0, unseen)

A seventh independent set of 80 samples across the same eleven tools, written after the v0.47.0 class-level rules were frozen, from published techniques that rounds 1–6 did not use (Jupyter/GraphQL SDL/SRT/Open Graph/systemd/svn log/plist/Turtle, schema defaults, Base58/quoted-printable/_meta/fullwidth confusables, lua -e / curl --data-binary / ncat / osascript / tar|curl / openssl s_client, forget-archive and clipboard-rewrite memory, Spanish DNI / Irish PPSN / Chinese resident ID / Croatian OIB / Belgian NISS, ldap / Docker API / ftp / [::1]/server-status / cgi-bin, glab/heroku/sfdx/linode/netlify paths, pipx / podman :latest / --listen * / nix profile / deno jsr:, Notion/PagerDuty/Loki sinks, shpat_/github_pat_/vercel_ tokens, HTTP introspection/userinfo/PAR endpoints; see benchmarks/redteam7/SOURCES.md). These numbers are the honest independent score for v0.47.0; they were not used to retune rules. The unseen series is 78.3 → 74.4 → 61.5 → 81.3, then this round.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5002100.0%100.0%100.0%7
mcpoauth3002100.0%100.0%100.0%5
mcpposture5002100.0%100.0%100.0%7
memfence4013100.0%80.0%88.9%8
pathfence4012100.0%80.0%88.9%7
piiguard5003100.0%100.0%100.0%8
resultguard8003100.0%100.0%100.0%11
secretflow3002100.0%100.0%100.0%5
shellfence4023100.0%66.7%80.0%9
toolpoison5003100.0%100.0%100.0%8
tracesweep3002100.0%100.0%100.0%5
overall490427100.0%92.5%96.1%80

Round 7 false negatives

Round 7 false positives

None on this corpus (false positive).

Independent red-team round 6 (v0.46.0, unseen)

A sixth independent set of 80 samples across the same eleven tools, written after the v0.46.0 generalization rules were frozen, from published techniques that rounds 1–5 did not use (iCalendar/vCard/WebVTT/OpenAPI/YAML front matter, RFC 2047 and Base45 concealment, JSON-LD, schema examples/title, Cyrillic confusables, python -c / socat / wget --post-file, farewell-dump and typo-correction memory, hetu/AHV/Taiwan/HKID/CUIL, smb/tftp/Consul/IMDS IPv6, rclone/flyctl/pulumi paths, nix run / cargo install / --bind *, Discord/SMTP/Jira sinks, glpat-/sk_live_/npm_ tokens, implicit grant and HTTP revocation/registration endpoints; see benchmarks/redteam6/SOURCES.md). These numbers were scored once against the frozen v0.46.0 rules, before any later rule was changed against this set. They remain the honest unseen score.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence510183.3%100.0%90.9%7
mcpoauth3002100.0%100.0%100.0%5
mcpposture2032100.0%40.0%57.1%7
memfence1043100.0%20.0%33.3%8
pathfence3022100.0%60.0%75.0%7
piiguard5003100.0%100.0%100.0%8
resultguard6023100.0%75.0%85.7%11
secretflow3002100.0%100.0%100.0%5
shellfence3033100.0%50.0%66.7%9
toolpoison3023100.0%60.0%75.0%8
tracesweep3002100.0%100.0%100.0%5
overall371162697.4%69.8%81.3%80

Round 6 false negatives (v0.46.0)

Round 6 false positives (v0.46.0)

Same round-6 set after v0.47.0 generalization (now seen)

A sixth independent set of 80 samples across the same eleven tools, written after the v0.46.0 generalization rules were frozen, from published techniques that rounds 1–5 did not use (iCalendar/vCard/WebVTT/OpenAPI/YAML front matter, RFC 2047 and Base45 concealment, JSON-LD, schema examples/title, Cyrillic confusables, python -c / socat / wget --post-file, farewell-dump and typo-correction memory, hetu/AHV/Taiwan/HKID/CUIL, smb/tftp/Consul/IMDS IPv6, rclone/flyctl/pulumi paths, nix run / cargo install / --bind *, Discord/SMTP/Jira sinks, glpat-/sk_live_/npm_ tokens, implicit grant and HTTP revocation/registration endpoints; see benchmarks/redteam6/SOURCES.md). After the v0.47.0 class-level rule changes (round 6 was the development set for those rules), the same fixtures were re-run. The table below is a <strong>seen</strong> score and is no longer independent. The original unseen numbers are kept in the table above.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5002100.0%100.0%100.0%7
mcpoauth3002100.0%100.0%100.0%5
mcpposture5002100.0%100.0%100.0%7
memfence5003100.0%100.0%100.0%8
pathfence5002100.0%100.0%100.0%7
piiguard5003100.0%100.0%100.0%8
resultguard8003100.0%100.0%100.0%11
secretflow3002100.0%100.0%100.0%5
shellfence6003100.0%100.0%100.0%9
toolpoison5003100.0%100.0%100.0%8
tracesweep3002100.0%100.0%100.0%5
overall530027100.0%100.0%100.0%80

Post-generalization round-6 false negatives

None on this corpus (false negative).

Post-generalization round-6 false positives

None on this corpus (false positive).

Independent red-team round 5 (v0.45.0, unseen)

A fifth independent set of 80 samples across the same eleven tools, written after the v0.45.0 generalization rules were frozen, from published techniques that rounds 1–4 did not use (CSV HYPERLINK injection, DNS TXT and git-log instructions, JSON \uXXXX escapes, Atom/RSS content, decoded JWT claims, ASCII backspace overstrike, SAML AttributeValue, MCP prompts, Base32/Braille/Atbash concealment, find -exec, schtasks, rsync, make $(shell), wmic, awk system(), planted API base-URL and query-rewrite memory, TCKN/RUT/SA ID/codice fiscale/BSN, gopher/hex/octal/LDAP/k8s DNS SSRF, vault-token and age key paths, FileZilla/terraform/Signal paths, go run @latest, npx github:, cwd /, uvx git+http, bind 0.0.0.0, Telegram/S3/GraphQL secret sinks, pypi-/Slack webhook/gsk_ tokens, token_endpoint_auth none, wildcard redirects, and cleartext front-channel logout; see benchmarks/redteam5/SOURCES.md). These numbers were scored once against the frozen v0.45.0 rules, before any later rule was changed against this set. They remain the honest unseen score.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5002100.0%100.0%100.0%7
mcpoauth0032n/a0.0%n/a5
mcpposture2032100.0%40.0%57.1%7
memfence3023100.0%60.0%75.0%8
pathfence0052n/a0.0%n/a7
piiguard0053n/a0.0%n/a8
resultguard6023100.0%75.0%85.7%11
secretflow310175.0%100.0%85.7%5
shellfence3033100.0%50.0%66.7%9
toolpoison0053n/a0.0%n/a8
tracesweep2012100.0%66.7%80.0%5
overall241292696.0%45.3%61.5%80

Round 5 false negatives (v0.45.0)

Round 5 false positives (v0.45.0)

Same round-5 set after v0.46.0 generalization (now seen)

A fifth independent set of 80 samples across the same eleven tools, written after the v0.45.0 generalization rules were frozen, from published techniques that rounds 1–4 did not use (CSV HYPERLINK injection, DNS TXT and git-log instructions, JSON \uXXXX escapes, Atom/RSS content, decoded JWT claims, ASCII backspace overstrike, SAML AttributeValue, MCP prompts, Base32/Braille/Atbash concealment, find -exec, schtasks, rsync, make $(shell), wmic, awk system(), planted API base-URL and query-rewrite memory, TCKN/RUT/SA ID/codice fiscale/BSN, gopher/hex/octal/LDAP/k8s DNS SSRF, vault-token and age key paths, FileZilla/terraform/Signal paths, go run @latest, npx github:, cwd /, uvx git+http, bind 0.0.0.0, Telegram/S3/GraphQL secret sinks, pypi-/Slack webhook/gsk_ tokens, token_endpoint_auth none, wildcard redirects, and cleartext front-channel logout; see benchmarks/redteam5/SOURCES.md). After the v0.46.0 class-level rule changes (round 5 was the development set for those rules), the same fixtures were re-run. The table below is a <strong>seen</strong> score and is no longer independent. The original unseen numbers are kept in the table above.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5002100.0%100.0%100.0%7
mcpoauth3002100.0%100.0%100.0%5
mcpposture5002100.0%100.0%100.0%7
memfence5003100.0%100.0%100.0%8
pathfence5002100.0%100.0%100.0%7
piiguard5003100.0%100.0%100.0%8
resultguard8003100.0%100.0%100.0%11
secretflow3002100.0%100.0%100.0%5
shellfence6003100.0%100.0%100.0%9
toolpoison5003100.0%100.0%100.0%8
tracesweep3002100.0%100.0%100.0%5
overall530027100.0%100.0%100.0%80

Post-generalization round-5 false negatives

None on this corpus (false negative).

Post-generalization round-5 false positives

None on this corpus (false positive).

Independent red-team round 4 (v0.44.0, unseen)

A fourth independent set of 80 samples across the same eleven tools, written after the v0.44.0 generalization rules were frozen, from published techniques that rounds 1–3 did not use (Policy Puppetry, ANSI-hidden instructions, HTTP header instructions, FigStep-class OCR captions, MCP resource contents and resource templates, outputSchema $comment, ROT13 and reversed-text concealment, tar checkpoint-action, osascript, rclone, MSBuild, forfiles, systemd-run transient units, auto-approve and allow-list memory, calendar-triggered exfil, PESEL/NRIC/NIR/My Number/CURP, redis://, .onion, dword IPs, password-store/1Password/k8s service-account tokens/keychains, SSE token-in-query, Deno, DNS/CSS/WebSocket secret sinks, hf_/dop_v1_/age keys, JWT alg=none, and others; see benchmarks/redteam4/SOURCES.md). These numbers were scored once against the frozen v0.44.0 rules, before any later rule was changed against this set. They remain the honest unseen score.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5002100.0%100.0%100.0%7
mcpoauth2012100.0%66.7%80.0%5
mcpposture4012100.0%80.0%88.9%7
memfence4013100.0%80.0%88.9%8
pathfence2032100.0%40.0%57.1%7
piiguard0053n/a0.0%n/a8
resultguard612285.7%75.0%80.0%11
secretflow3002100.0%100.0%100.0%5
shellfence2043100.0%33.3%50.0%9
toolpoison2033100.0%40.0%57.1%8
tracesweep2012100.0%66.7%80.0%5
overall321212697.0%60.4%74.4%80

Round 4 false negatives (v0.44.0)

Round 4 false positives (v0.44.0)

Same round-4 set after v0.45.0 generalization (now seen)

A fourth independent set of 80 samples across the same eleven tools, written after the v0.44.0 generalization rules were frozen, from published techniques that rounds 1–3 did not use (Policy Puppetry, ANSI-hidden instructions, HTTP header instructions, FigStep-class OCR captions, MCP resource contents and resource templates, outputSchema $comment, ROT13 and reversed-text concealment, tar checkpoint-action, osascript, rclone, MSBuild, forfiles, systemd-run transient units, auto-approve and allow-list memory, calendar-triggered exfil, PESEL/NRIC/NIR/My Number/CURP, redis://, .onion, dword IPs, password-store/1Password/k8s service-account tokens/keychains, SSE token-in-query, Deno, DNS/CSS/WebSocket secret sinks, hf_/dop_v1_/age keys, JWT alg=none, and others; see benchmarks/redteam4/SOURCES.md). After the v0.45.0 structure-based rule changes (round 4 was the development set for those rules), the same fixtures were re-run. The table below is a <strong>seen</strong> score and is no longer independent. The original unseen numbers are kept in the table above.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5002100.0%100.0%100.0%7
mcpoauth3002100.0%100.0%100.0%5
mcpposture5002100.0%100.0%100.0%7
memfence5003100.0%100.0%100.0%8
pathfence5002100.0%100.0%100.0%7
piiguard5003100.0%100.0%100.0%8
resultguard8003100.0%100.0%100.0%11
secretflow3002100.0%100.0%100.0%5
shellfence6003100.0%100.0%100.0%9
toolpoison5003100.0%100.0%100.0%8
tracesweep3002100.0%100.0%100.0%5
overall530027100.0%100.0%100.0%80

Post-generalization round-4 false negatives

None on this corpus (false negative).

Post-generalization round-4 false positives

None on this corpus (false positive).

Independent red-team round 3 (v0.43.0, unseen)

A third independent set of 84 samples across the same eleven tools, written after the v0.43.0 generalization rules were frozen, from published techniques that rounds 1 and 2 did not use (Greshake et al., ArtPrompt, Crescendo, many-shot jailbreaking, Virtual Prompt Injection, MCP initialize/elicitation/sampling, LOLBAS, download-then-exec, ld.so.preload, Aadhaar/CPF/TFN/personnummer, GCP metadata.google.internal, gopher/dict, punycode, RFC 9700 password grant and http redirects, and others; see benchmarks/redteam3/SOURCES.md). These numbers were scored once against the frozen v0.43.0 rules, before any later rule was changed against this set. They remain the honest unseen score.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5002100.0%100.0%100.0%7
mcpoauth2012100.0%66.7%80.0%5
mcpposture4013100.0%80.0%88.9%8
memfence2033100.0%40.0%57.1%8
pathfence5002100.0%100.0%100.0%7
piiguard1043100.0%20.0%33.3%8
resultguard8004100.0%100.0%100.0%12
secretflow112150.0%33.3%40.0%5
shellfence2053100.0%28.6%44.4%10
toolpoison3033100.0%50.0%66.7%9
tracesweep3002100.0%100.0%100.0%5
overall361192897.3%65.5%78.3%84

Round 3 false negatives (v0.43.0)

Round 3 false positives (v0.43.0)

Same round-3 set after v0.44.0 generalization (now seen)

A third independent set of 84 samples across the same eleven tools, written after the v0.43.0 generalization rules were frozen, from published techniques that rounds 1 and 2 did not use (Greshake et al., ArtPrompt, Crescendo, many-shot jailbreaking, Virtual Prompt Injection, MCP initialize/elicitation/sampling, LOLBAS, download-then-exec, ld.so.preload, Aadhaar/CPF/TFN/personnummer, GCP metadata.google.internal, gopher/dict, punycode, RFC 9700 password grant and http redirects, and others; see benchmarks/redteam3/SOURCES.md). After the v0.44.0 structure-based rule changes (round 3 was the development set for those rules), the same fixtures were re-run. The table below is a <strong>seen</strong> score and is no longer independent. The original unseen numbers are kept in the table above.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5002100.0%100.0%100.0%7
mcpoauth3002100.0%100.0%100.0%5
mcpposture5003100.0%100.0%100.0%8
memfence5003100.0%100.0%100.0%8
pathfence5002100.0%100.0%100.0%7
piiguard5003100.0%100.0%100.0%8
resultguard8004100.0%100.0%100.0%12
secretflow3002100.0%100.0%100.0%5
shellfence7003100.0%100.0%100.0%10
toolpoison6003100.0%100.0%100.0%9
tracesweep3002100.0%100.0%100.0%5
overall550029100.0%100.0%100.0%84

Post-generalization round-3 false negatives

None on this corpus (false negative).

Post-generalization round-3 false positives

None on this corpus (false positive).

Independent red-team round 2 (v0.41.0, unseen)

A second independent red-team wrote 134 new samples across eleven tools (the ten above plus mcpoauth) against v0.41.0, without reading detector source, rule files, or the round-1 fixtures (READMEs/usage and the round-1 SOURCES.md only). Techniques favor published research that round 1 did not use: Radware ShadowLeak, HiddenLayer Policy Puppetry, Copilot autoApprove (CVE-2025-53773), Cursor CurXecute, Cato HashJack, Tenable Gemini Trifecta, Noma ForcedLeak, Sneaky Bits and emoji variation-selector smuggling, MPMA and MCPTox tool poisoning, Elastic orchestration injection, postmark-mcp, Shai-Hulud, s1ngularity AI-CLI abuse, Tracebit Gemini CLI, Replit DB deletion, Cymulate EscapeRoute, mcp-remote CVE-2025-6514, MCP Inspector CVE-2025-49596, Unit 42 Bedrock memory poisoning, AgentPoison, and OAuth BCP (RFC 9700) misconfigurations. Fixtures live in <code>benchmarks/redteam2/</code> with citations in <code>SOURCES.md</code>. These are the original independent numbers, frozen from the v0.41.0 detectors (published in v0.42.0), before any rule was changed against this set. They remain the honest unseen score.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence812388.9%80.0%84.2%14
mcpoauth513383.3%62.5%71.4%12
mcpposture3053100.0%37.5%54.5%11
memfence01720.0%0.0%n/a10
pathfence614285.7%60.0%70.6%13
piiguard3043100.0%42.9%60.0%10
resultguard229250.0%18.2%26.7%15
secretflow323160.0%50.0%54.5%9
shellfence319375.0%25.0%37.5%16
toolpoison0084n/a0.0%n/a12
tracesweep4044100.0%50.0%66.7%12
overall379583080.4%38.9%52.5%134

Round 2 false negatives (v0.41.0)

Round 2 false positives (v0.41.0)

Same round-2 set after v0.43.0 generalization and v0.44.0 changes (now seen)

The same 134 samples after the v0.43.0 generalization (structure-based detection for injection, shell, memory, posture, and PII; Unicode and encoding layers; co-occurrence scoring). Round 2 was the development set for those changes, so this table is a <strong>seen</strong> score and is no longer independent. The original unseen numbers are kept in the table above.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence10004100.0%100.0%100.0%14
mcpoauth8004100.0%100.0%100.0%12
mcpposture8003100.0%100.0%100.0%11
memfence7003100.0%100.0%100.0%10
pathfence10003100.0%100.0%100.0%13
piiguard7003100.0%100.0%100.0%10
resultguard11004100.0%100.0%100.0%15
secretflow6003100.0%100.0%100.0%9
shellfence12004100.0%100.0%100.0%16
toolpoison8004100.0%100.0%100.0%12
tracesweep8004100.0%100.0%100.0%12
overall950039100.0%100.0%100.0%134

Post-generalization round-2 false negatives

None on this corpus (false negative).

Post-generalization round-2 false positives

None on this corpus (false positive).

Round 2 detection-gap issues #17–#27

Every tool with an original round-2 miss or false positive has one detection-gap issue: #17 (fetchfence), #18 (mcpoauth), #19 (mcpposture), #20 (memfence), #21 (pathfence), #22 (piiguard), #23 (resultguard), #24 (secretflow), #25 (shellfence), #26 (toolpoison), #27 (tracesweep). The v0.43.0 generalization closed the issues for tools whose remaining gaps on this set were fixed (resultguard, toolpoison, shellfence, mcpposture, piiguard). Issues stay open where a miss remains (memfence false-facts) or where this release did not retune the detector (tracesweep, secretflow, fetchfence, pathfence, mcpoauth). Because the rules were then re-run on the same set, the post-generalization table is a seen score.

Independent red-team results (v0.40.0, unseen)

An independent red-team wrote 100 fresh samples across all ten tools without reading detector source or rule files (READMEs/usage only). Attacks are drawn from published research (Invariant Labs, Trail of Bits, CyberArk, Embrace The Red, Aim Security EchoLeak, PortSwigger SSRF bypasses, Pillar Security, General Analysis / Supabase MCP, Amazon Q wipe prompt, MINJA, Nx s1ngularity). Benign look-alikes are included. Fixtures live in <code>benchmarks/redteam/</code> with citations in <code>SOURCES.md</code>. These are the original independent numbers, frozen from the v0.40.0 release, before any rule was changed against this set. They remain the honest unseen score.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence7003100.0%100.0%100.0%10
mcpposture720177.8%100.0%87.5%10
memfence5023100.0%71.4%83.3%10
pathfence7003100.0%100.0%100.0%10
piiguard7003100.0%100.0%100.0%10
resultguard611285.7%85.7%85.7%10
secretflow7003100.0%100.0%100.0%10
shellfence4033100.0%57.1%72.7%10
toolpoison512283.3%71.4%76.9%10
tracesweep5023100.0%71.4%83.3%10
overall604102693.8%85.7%89.6%100

Independent-set false negatives (v0.40.0)

Independent-set false positives (v0.40.0)

Same red-team set after #12–#16 fixes (now seen)

The same 100 samples after the general rule changes that closed issues #12–#16. This set is now seen: post-fix precision and recall are no longer an independent score. The original unseen numbers are kept in the table above.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence7003100.0%100.0%100.0%10
mcpposture7003100.0%100.0%100.0%10
memfence7003100.0%100.0%100.0%10
pathfence7003100.0%100.0%100.0%10
piiguard7003100.0%100.0%100.0%10
resultguard7003100.0%100.0%100.0%10
secretflow7003100.0%100.0%100.0%10
shellfence7003100.0%100.0%100.0%10
toolpoison7003100.0%100.0%100.0%10
tracesweep7003100.0%100.0%100.0%10
overall700030100.0%100.0%100.0%100

Post-fix red-team false negatives

None on this corpus (false negative).

Post-fix red-team false positives

None on this corpus (false positive).

Detection-gap issues #12–#16

The independent misses and false positives were filed as #12 (resultguard), #13 (toolpoison), #14 (tracesweep), #15 (shellfence), and #16 (memfence), plus two mcpposture false positives on pinned npx -y configs. The rule changes in this release are general (quoted-discussion TR01, concealment phrasing, private-to-public copy bait, line-jumping command prefixes, instructional parameter names, documentary TP03, base64 and cross-turn secret reconstruction, home-directory find/rm, DNS exfil, ANSI-C/hex command deobfuscation, paste-into-chat harvest wording, MINJA-style query remapping, and MP04 suppressed when a package is already pinned), not string matches against these fixtures. Those issues are closed against this release. Because the rules were then re-run on the same set, the post-fix table is a seen score.

Expanded corpus (ten tools)

The original five tools plus piiguard, fetchfence, pathfence, mcpposture, and memfence, on newly written original fixtures.

ToolTPFPFNTN PrecisionRecallF1n
fetchfence5003100.0%100.0%100.0%8
mcpposture5003100.0%100.0%100.0%8
memfence5003100.0%100.0%100.0%8
pathfence5003100.0%100.0%100.0%8
piiguard5003100.0%100.0%100.0%8
resultguard12008100.0%100.0%100.0%20
secretflow7004100.0%100.0%100.0%11
shellfence12008100.0%100.0%100.0%20
toolpoison10008100.0%100.0%100.0%18
tracesweep10006100.0%100.0%100.0%16
overall760049100.0%100.0%100.0%125

Expanded-corpus false negatives

None on this corpus (false negative).

Expanded-corpus false positives

None on this corpus (false positive).

Detection-gap issues #7–#11

The eight original evasions and four false positives were filed as #7 (resultguard), #8 (toolpoison), #9 (tracesweep), #10 (secretflow), and #11 (shellfence). The rule changes in this release are general (typo-tolerant and split-word override matching, ROT13 decode, multilingual override/exfil phrasing, soft workspace-dump-into-parameter, secret-prefix concatenation, encoded secret reuse, and pipe-to-shell deobfuscation), not string matches against the original fixtures. Those issues are closed against this release.

How a detection is counted

A sample is counted as flagged when the assigned tool reports at least one finding with severity low, medium, high, or critical. Info-level inventory rules (for example SF12, FL10) are ignored. The script is benchmarks/run_benchmark.py; the labels live in benchmarks/manifest.json, benchmarks/heldout/manifest.json, benchmarks/redteam/manifest.json, benchmarks/redteam2/manifest.json, benchmarks/redteam3/manifest.json, benchmarks/redteam4/manifest.json, and benchmarks/redteam5/manifest.json, and benchmarks/redteam6/manifest.json, and benchmarks/redteam7/manifest.json, and benchmarks/redteam8/manifest.json, and benchmarks/redteam9/manifest.json. Fixtures are original and use only fake credentials and reserved documentation values.

Ten jobs are covered:

Limits of this benchmark

Reproduce the table locally:

python3 benchmarks/run_benchmark.py --write-pages