Lion Cipher Lab

Catch multi-turn escalation that a per-message guardrail misses, with a conversation-level monitor

Why it matters

Most chatbot guardrails judge one message at a time: is THIS request allowed? Russinovich, Salem and Eldan showed in 2024 that this is not enough. Their Crescendo attack opens with a general question and escalates gradually, each new turn referring to the model's own previous answer, until it reaches something a direct request would never get. Microsoft's own write-up says the fix it shipped looks at the whole prior conversation, not just the latest message. If you run an internal assistant that knows things outsiders must not see, this is the gap you need to measure in your own deployment,…

What you'll learn

Steps in this lab

  1. The words first: guardrail, canary, multi-turn escalation, per-message vs conversation-level - and the fact that the assistant is a stub
  2. Open a terminal, check Python, make a scratch folder (Windows, macOS, Linux)
  3. One-step recap: how this differs from the many-shot lab and the canary-leak lab
  4. Generate 480 labelled conversations: benign short, benign long, direct asks, and three kinds of escalation
  5. Write the assistant stub: no refusal of its own, and eager to build on what it already said
  6. Write the three guards: a per-message score, a conversation monitor with decayed risk, and an output-side canary check
  7. Write the simulator: play every conversation and record leak turn, partial-leak turn and fire turn
  8. Measure BEFORE: the per-message guardrail stops direct asks and 0 of 120 escalations
  9. Measure AFTER: the conversation monitor, turn of detection vs turn of leak, and the output canary backstop
  10. Honest negatives: false alarms on long benign chats, and an attacker who opens a new chat for every step
  11. Why this, not that - and when NOT to put a conversation monitor in front of an assistant
  12. The way a pro does it: take the secret out of reach first, then monitor per user, test with real multi-turn tooling, and log every score
  13. Ship it: re-run, change one constant on purpose, and clean up

Open the full interactive lab →