guest@manav-thakkar:~/research/guardrail-gap
Back to Operations

RESEARCH FILE _

ACDSA 2027 · SUBMITTED

Many Looks Beat One Look: Why Full Context Does Not Help Commercial LLM Guardrails Against Multi-Turn Attacks

Manav Thakkar · Independent Researcher · Dallas, United States

// MISSION BRIEFING

Enterprises put a commercial guardrail in front of their language models and, following vendor documentation, show it one message at a time. Multi-turn attacks beat this setup, and the obvious fix is to show the guardrail the whole conversation.

This paper tests that fix on four deployed commercial guardrails: AWS Bedrock Guardrails, Azure Prompt Shields, Azure Content Safety, and Google Vertex Model Armor. The result is counter-intuitive. Full context makes each individual decision better, but it never improves detection across a whole conversation, and for two products it makes it worse.

// KEY INTEL

4
commercial guardrails tested
2,489
multi-turn attack conversations
1,227
benign conversations
13%
of attacks pass all four products

// FINDINGS

  • Full context never wins in aggregate. Conversation-level detection is no higher with the whole conversation for any product at any filter strength, and it drops for Bedrock and Model Armor.
  • But it wins every single decision. On the final turn alone, every product that detects anything does better with context. Bedrock rises from 38% to 56%.
  • Many looks beat one look. Turn-by-turn scoring takes many weakly correlated looks, and their union beats any single look. Nested full-context prefixes are strongly correlated, and a prefix that fired stops firing when extended in 8–28% of flagged conversations.
  • Topic drift is the blind spot. When benign role-play comes before a harmful final request, the role-play outweighs the request. Under full context, Model Armor catches only 26% of drift attacks.
  • One pass reveals the whole curve. Running each product in detection-only mode and logging every internal detector's graded confidence reconstructs the full strength-threshold curve and shows which harm families evade every filter.
  • A cheap stateful fix helps. A cumulative-sum adapter over each service's own per-turn scores adds detection under a fixed 5% false-positive budget, with no extra API cost.

// FIELD DATA

Conversation-level detection rate by attack family at maximum sensitivity, scoring only the latest message (last) vs. the whole conversation (full).

ServiceConfigEscalationDriftCoreferenceBenign FPR
AWS Bedrocklast0.820.620.640.14
full0.820.500.550.13
Azure Prompt Shieldslast0.000.000.000.01
full0.000.000.000.01
Azure Content Safetylast0.240.020.110.02
full0.240.020.110.02
Google Model Armorlast0.900.540.850.42
full0.760.260.760.22

Source: Table II of the paper. Detection is credited if any detector fires on any turn.

// RUN IT YOURSELF

$ git clone https://github.com/Manav-claude/guardrail-gap
Cloning into 'guardrail-gap'...
$ cat README.md
Vendor-agnostic harness: per-product configuration guidance, detection-only runs, and a stateful adapter.

The harness is released so any operator can measure the guardrail they already trust, against their own tenant and configuration.

Classified file declassified. The seventh flag is yours.

Check the HUD: the locked slot just opened. Type flags in the terminal to see where you stand.