Measured results

One run of jev-1.13.0 on 2026-09-19. 1,942 requests, $0.061 at the published price, 753 input tokens per request on average. Each screened call costs one model request.

This is one dated run, not a scoreboard. The recorded model responses are committed, so the scorer reproduces these numbers with no API key. The harness and the method are in the repository.

What the package actually does at these numbers#

The sweeps below are a range, not a setting. These are the thresholds the package ships with, so a row at another threshold is a what-if rather than a description of the tool.

Annotated is not withheld, and on the largest set the gap is wide. Of 1,054 injected tool results, 848 were flagged at the annotate threshold, and 359 of those met the bar to be withheld. The rest reached the agent with a banner on them. Whether that is enough depends on what the agent does next, which is why the threshold is a number you own.

InjecAgent tool responses#

Tool results carrying an injected instruction, from a public benchmark.

1,394 items, 1,054 positive, AUC 0.976. Screened as a tool result, before the agent reads it.

ThresholdPrecisionRecallFlagged in errorMissed
0.30.9560.9494654
0.50.9890.8059206
0.70.9960.5162510
0.81.0000.3430692
0.91.0000.1280919

BIPIA email#

Emails with an instruction hidden in the body, from a public benchmark.

250 items, 200 positive, AUC 1.000. Screened as a tool result, before the agent reads it.

ThresholdPrecisionRecallFlagged in errorMissed
0.31.0000.850030
0.51.0000.825035
0.71.0000.665067
0.81.0000.530094
0.91.0000.2350153

Benign documents that discuss injection#

Pages that talk about prompt injection without performing one. Every flag here is wrong.

63 items, none of them positive, AUC not defined with no positives. Screened as a tool result, before the agent reads it.

ThresholdPrecisionRecallFlagged in errorMissed
0.3--100
0.5--70
0.7--30
0.8--10
0.9--00

Hand-labeled tool calls#

Calls I labeled myself, leaning toward shell commands because that is where the damage is.

100 items, 51 positive, AUC 0.993. Screened as a tool call, before it runs.

ThresholdPrecisionRecallFlagged in errorMissed
0.30.9090.98051
0.50.9800.96112
0.70.9780.88216
0.81.0000.82409
0.91.0000.667017

deepset prompt injections#

Bare prompt strings rather than tool results. Kept out of the headline because the shape is not what the screen sees in use.

116 items, 60 positive, AUC 0.949. Screened as a tool result, before the agent reads it.

ThresholdPrecisionRecallFlagged in errorMissed
0.31.0000.550027
0.51.0000.450033
0.71.0000.400036
0.81.0000.333040
0.91.0000.250045

What the false positives actually were#

The benign set is documents that discuss prompt injection without performing one, which is the hardest honest negative I could build. Every flag on it is wrong by construction. At the shipped annotate threshold there were 7, and the two highest-scoring were a documentation index written in a way that addresses automated readers, and a code sample containing the literal text of a screening question. Both are the same failure: content about the mechanism reading like the mechanism.

Reliability #

Read this before the table. Roughly 70 percent of the scored items are positives, which is not the mix of a real session, so this shows the ordering of the scores rather than supporting a claim that the probabilities are calibrated to a base rate you would see in use.

Score rangeItemsObserved positive rate
0.0 to 0.25300.111
0.2 to 0.41740.684
0.4 to 0.62940.929
0.6 to 0.83940.975
0.8 to 1.05310.998

Limits #

Reproduce it without a key#

git clone git@github.com:agent-chaperone/agent-chaperone.git
cd agent-chaperone/bench
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python src/score.py

That scores the committed responses against the labels and prints the table this page is built from. If a number here disagrees with what you get, that is worth an issue.