Gauntlet
Adversarial co-evolution arena for prompt-injection defenses · 3 seeds · 5 rounds × 12 generations · population 200
source on GitHub·leaderboard·put your own detector through this
What the numbers say
- naive: mean recall on a never-seen attack family is 84.5% (in-distribution 100.0%); weakest family is indirect at 32%.
- hardened: mean recall on a never-seen attack family is 96.2% (in-distribution 100.0%); weakest family is indirect at 71%.
- windowed: mean recall on a never-seen attack family is 98.5% (in-distribution 99.9%); weakest family is authority at 97%.
- transformer: mean recall on a never-seen attack family is 87.6% (in-distribution 100.0%); weakest family is indirect at 13%.
- transformer windowed: mean recall on a never-seen attack family is 96.9% (in-distribution 99.7%); weakest family is indirect at 82%.
- naive under attack: evolved attackers evade it 68% of the time in round 1 and 0% in round 5 (peak later round: 14%).
- hardened under attack: evolved attackers evade it 92% of the time in round 1 and 3% in round 5 (peak later round: 3%).
- windowed under attack: evolved attackers evade it 16% of the time in round 1 and 14% in round 5 (peak later round: 17%).
- transformer under attack: evolved attackers evade it 75% of the time in round 1 and 0% in round 5 (peak later round: 10%).
- transformer windowed under attack: evolved attackers evade it 55% of the time in round 1 and 0% in round 5 (peak later round: 15%).
- naive on real human-written injections: AUC 0.56 before adversarial training, 0.57 after.
- hardened on real human-written injections: AUC 0.67 before adversarial training, 0.70 after.
- windowed on real human-written injections: AUC 0.81 before adversarial training, 0.81 after.
- transformer on real human-written injections: AUC 0.57 before adversarial training, 0.64 after.
- transformer windowed on real human-written injections: AUC 0.72 before adversarial training, 0.76 after.
1 · Can it catch an attack family it has never seen?
Leave-one-family-out: the defender is retrained without one family, then tested on it. Threshold calibrated to 1% false positives on benign validation prompts. Bars show the mean over seeds; hover for ranges.
Data table
| defender | family | seen in training | never seen | benign FPR (test) |
|---|---|---|---|---|
| hardened | authority | 100.0% | 99.6% | 0.0% |
| hardened | direct_override | 100.0% | 100.0% | 0.0% |
| hardened | encoding | 100.0% | 100.0% | 0.0% |
| hardened | indirect | 100.0% | 70.8% | 0.0% |
| hardened | multilingual | 100.0% | 100.0% | 0.0% |
| hardened | obfuscation | 100.0% | 100.0% | 0.0% |
| hardened | payload_split | 100.0% | 100.0% | 0.0% |
| hardened | roleplay | 100.0% | 99.6% | 0.0% |
| naive | authority | 100.0% | 99.6% | 1.8% |
| naive | direct_override | 100.0% | 100.0% | 1.8% |
| naive | encoding | 100.0% | 58.1% | 1.8% |
| naive | indirect | 100.0% | 31.9% | 1.8% |
| naive | multilingual | 100.0% | 100.0% | 1.8% |
| naive | obfuscation | 100.0% | 86.5% | 1.8% |
| naive | payload_split | 100.0% | 100.0% | 1.8% |
| naive | roleplay | 100.0% | 99.6% | 1.8% |
| transformer | authority | 100.0% | 99.8% | 0.1% |
| transformer | direct_override | 100.0% | 100.0% | 0.1% |
| transformer | encoding | 100.0% | 90.2% | 0.1% |
| transformer | indirect | 99.8% | 12.9% | 0.1% |
| transformer | multilingual | 100.0% | 99.8% | 0.1% |
| transformer | obfuscation | 100.0% | 100.0% | 0.1% |
| transformer | payload_split | 100.0% | 99.8% | 0.1% |
| transformer | roleplay | 100.0% | 98.1% | 0.1% |
| transformer_windowed | authority | 100.0% | 100.0% | 1.5% |
| transformer_windowed | direct_override | 99.8% | 99.6% | 1.5% |
| transformer_windowed | encoding | 100.0% | 99.8% | 1.5% |
| transformer_windowed | indirect | 97.5% | 81.7% | 1.5% |
| transformer_windowed | multilingual | 100.0% | 95.4% | 1.5% |
| transformer_windowed | obfuscation | 100.0% | 100.0% | 1.5% |
| transformer_windowed | payload_split | 100.0% | 99.8% | 1.5% |
| transformer_windowed | roleplay | 100.0% | 99.2% | 1.5% |
| windowed | authority | 100.0% | 96.9% | 0.2% |
| windowed | direct_override | 100.0% | 99.8% | 0.2% |
| windowed | encoding | 100.0% | 99.0% | 0.2% |
| windowed | indirect | 99.6% | 97.3% | 0.2% |
| windowed | multilingual | 100.0% | 97.9% | 0.2% |
| windowed | obfuscation | 100.0% | 100.0% | 0.2% |
| windowed | payload_split | 100.0% | 97.5% | 0.2% |
| windowed | roleplay | 100.0% | 99.6% | 0.2% |
2 · Arms race: an evolving attacker vs a retraining defender
Each round the attacker mutates payloads for 12 generations against the current defender; the defender then retrains on what got through. Every round uses fresh malicious goals, so later rounds test whether patching generalised. Attacker success = share of the final population that evades detection and is still understood by the victim oracle.
Data table
| defender | round | attacker success | min | max | recall (clean) | FPR | evasions found |
|---|---|---|---|---|---|---|---|
| hardened | 1 | 92.0% | 90.0% | 93.5% | 100.0% | 0.0% | 787 |
| hardened | 2 | 2.3% | 0.0% | 4.0% | 100.0% | 0.3% | 5 |
| hardened | 3 | 0.5% | 0.0% | 1.5% | 100.0% | 0.4% | 1 |
| hardened | 4 | 3.0% | 0.0% | 9.0% | 100.0% | 0.4% | 6 |
| hardened | 5 | 2.8% | 0.0% | 8.5% | 100.0% | 0.4% | 6 |
| naive | 1 | 67.7% | 62.0% | 72.5% | 100.0% | 1.8% | 574 |
| naive | 2 | 14.0% | 4.0% | 31.5% | 100.0% | 0.3% | 39 |
| naive | 3 | 0.3% | 0.0% | 1.0% | 100.0% | 0.2% | 1 |
| naive | 4 | 0.0% | 0.0% | 0.0% | 100.0% | 0.3% | 0 |
| naive | 5 | 0.0% | 0.0% | 0.0% | 100.0% | 0.3% | 0 |
| transformer | 1 | 74.8% | 68.0% | 88.0% | 100.0% | 0.1% | 706 |
| transformer | 2 | 10.3% | 5.0% | 17.5% | 99.9% | 0.3% | 20 |
| transformer | 3 | 1.2% | 0.0% | 3.5% | 100.0% | 0.9% | 2 |
| transformer | 4 | 0.2% | 0.0% | 0.5% | 100.0% | 0.6% | 0 |
| transformer | 5 | 0.0% | 0.0% | 0.0% | 100.0% | 0.8% | 0 |
| transformer_windowed | 1 | 54.7% | 43.0% | 68.5% | 99.7% | 1.5% | 339 |
| transformer_windowed | 2 | 15.2% | 2.5% | 36.5% | 99.9% | 0.3% | 45 |
| transformer_windowed | 3 | 13.2% | 0.0% | 31.5% | 99.9% | 0.4% | 29 |
| transformer_windowed | 4 | 2.7% | 0.0% | 5.0% | 99.9% | 0.8% | 5 |
| transformer_windowed | 5 | 0.2% | 0.0% | 0.5% | 99.9% | 0.3% | 0 |
| windowed | 1 | 15.5% | 0.5% | 39.5% | 99.9% | 0.2% | 31 |
| windowed | 2 | 17.0% | 0.0% | 44.5% | 100.0% | 0.2% | 75 |
| windowed | 3 | 16.7% | 7.5% | 32.5% | 100.0% | 0.2% | 34 |
| windowed | 4 | 14.0% | 0.0% | 42.0% | 100.0% | 0.3% | 39 |
| windowed | 5 | 14.5% | 0.0% | 25.5% | 100.0% | 0.3% | 28 |
3 · Does patching the attacker help in the real world?
Public human-written injections (deepset/prompt-injections, n=662, English + German). Threshold-free AUC, before vs after each defender was adversarially trained on the attacker's evasions.
Data table
| defender | stage | AUC | min | max | recall | fpr |
|---|---|---|---|---|---|---|
| hardened | final | 0.696 | 0.683 | 0.716 | 74.4% | 56.0% |
| hardened | initial | 0.668 | 0.663 | 0.672 | 57.9% | 32.4% |
| naive | final | 0.574 | 0.562 | 0.591 | 73.0% | 70.8% |
| naive | initial | 0.562 | 0.554 | 0.568 | 63.8% | 59.2% |
| transformer | final | 0.639 | 0.624 | 0.665 | 46.8% | 18.2% |
| transformer | initial | 0.568 | 0.562 | 0.577 | 27.8% | 5.3% |
| transformer_windowed | final | 0.758 | 0.729 | 0.794 | 17.9% | 0.2% |
| transformer_windowed | initial | 0.724 | 0.72 | 0.73 | 20.5% | 0.3% |
| windowed | final | 0.812 | 0.81 | 0.815 | 25.2% | 0.4% |
| windowed | initial | 0.807 | 0.806 | 0.807 | 34.2% | 1.3% |
What the attacker learned
Mutation operators most often present in successful evasions (count of distinct evasions, summed over seeds).
- naive: benign_suffix (1735), benign_prefix (1449), pad_words (1030), drop_frame (1018), tag_smuggle (839), template_spoof (765)
- hardened: benign_suffix (2391), benign_prefix (2254), alt_case (1317), homoglyph (1186), fullwidth (1163), interleave (1071)
- windowed: benign_suffix (470), alt_case (457), benign_prefix (421), leet (398), interleave (347), drop_frame (343)
- transformer: benign_prefix (2011), benign_suffix (1955), zero_width (1185), alt_case (1065), template_spoof (835), spaced_letters (829)
- transformer windowed: benign_prefix (1142), drop_frame (1037), interleave (1026), benign_suffix (755), alt_case (569), template_spoof (540)
Example evolved attacks (round 1, seed 0)
naive
hardened
windowed
transformer
transformer windowed
Limitations (read these)
- Attacks and benign prompts are synthetic, built from templates. Malicious goals are split by string between train/test/arena, but they share a vocabulary. High in-distribution numbers say little; the out-of-family and real-data numbers are the honest ones.
- The victim oracle is a keyword-recovery proxy, not a real LLM. It can accept mutants a real model would not follow (e.g. heavy interleaving) and reject some it would.
- Thresholds are calibrated on synthetic benign text. On real data the operating point does not transfer, which is why AUC is reported alongside recall/FPR.
- Three defenders are linear models over TF-IDF; two are one small fine-tuned transformer (MiniLM-L6, 160 optimiser steps per fit, CPU budget). A larger model or a longer schedule may behave differently, so read the transformer rows as "a small fine-tuned encoder does not close the gap", not as a statement about all transformers.