Capstone 15 — Constitutional Safety Harness + Red-Team Range
The 2026 safety-classifier stack is Anthropic's Constitutional Classifiers, Meta's Llama Guard 4, Google's ShieldGemma-2, NVIDIA's Nemotron 3 Content Safety, and X-Guard for multilingual coverage. garak, PyRIT, NVIDIA Aegis, and promptfoo are the standard adversarial evaluation tools, and NeMo Guardrails v0.12 ties them into a production pipeline. This capstone wires all of it together: a layered safety harness around a target app, an autonomous red-team agent running 6+ attack families, and a constitutional self-critique run that produces a measurable harmlessness delta.
Learning Objectives
- Compose a layered safety pipeline (input sanitize, policy rails, classifier gate, output filter, HITL tier) around a target LLM, with one observable span per layer.
- Run six attack families (PAIR, TAP, GCG, encoding, multi-turn persona, multilingual code-switch) against the target and report the success rate per family.
- Apply a constitutional self-critique loop and measure the before/after harmlessness delta, checking over-refusal on a benign suite such as XSTest.
- Score successful jailbreaks with CVSS 4.0, write a disclosure timeline, and automate the red-team range on a cron with alerts.
Problem
A safety harness is a stack of guardrails around an LLM app, paired with a red-team range that attacks the app on a schedule and records what gets through. In 2026 the open question is not whether classifiers work (they do, roughly) but how to compose them around a production app without over-refusing or leaving obvious holes.
Each classifier covers a different gap. Llama Guard 4 handles English policy violations. X-Guard (132 languages) handles multilingual jailbreaks. ShieldGemma-2 catches image-based prompt injection. NVIDIA Nemotron 3 Content Safety covers enterprise categories. Anthropic's Constitutional Classifiers are a different kind of tool, used during training rather than at serving time.
Attacks keep evolving too. PAIR and TAP automate jailbreak discovery. GCG runs gradient-based suffix attacks. Multi-turn and code-switch attacks exploit agent memory. A deployed LLM needs a red-team range of its own, with garak and PyRIT as the canonical drivers, plus documented mitigations and CVSS-scored findings.
You will harden a target application (either an 8B instruction-tuned model or one of the RAG chatbots from other capstones), run 6+ attack families against it, and produce a before/after harmlessness measurement.
Concept
The safety pipeline is five layers around the target model, each with one job. Input sanitize strips zero-width chars, decodes base64/rot13, and normalizes Unicode. Policy layer applies NeMo Guardrails v0.12 rails for off-domain requests, toxicity, and PII extraction. Classifier gate runs Llama Guard 4 on input, X-Guard on non-English, and ShieldGemma-2 on image inputs. The model is the target LLM, sitting between the classifier gate and the output filter. Output filter runs Llama Guard 4 on output, a Presidio PII scrub, and citation enforcement where applicable. HITL tier sends outputs flagged high-risk to a Slack queue.
The red-team range runs on a scheduler. PAIR and TAP discover jailbreaks autonomously, and GCG runs gradient-based suffix attacks. Encoding attacks use ASCII, base64, and rot13. Multi-turn attacks work through persona adoption and memory exploitation. Code-switch attacks mix English with Swahili or Thai. Every run writes a structured findings file with CVSS scoring and a disclosure timeline.
Constitutional self-critique is a training-time intervention: the model drafts a response, a critic scores it against a written constitution of do-not-harm rules, and the model retrains on the result. Here you take 1k harmful-attempt prompts, have the model draft a response to each, critique the draft against the constitution, and retrain on the critique loop. Then you measure the before/after harmlessness delta on a held-out eval.
Architecture
request (text / image / multilingual)
|
v
input sanitize (strip zero-width, decode, normalize)
|
v
NeMo Guardrails v0.12 rails (off-domain, policy)
|
v
classifier gate:
Llama Guard 4 (English)
X-Guard (multilingual, 132 langs)
ShieldGemma-2 (image prompts)
Nemotron 3 Content Safety (enterprise)
|
v (allowed)
target LLM
|
v
output filter: Llama Guard 4 + Presidio PII + citation check
|
v
HITL tier for flagged outputs
parallel:
red-team scheduler
-> garak (classic attacks)
-> PyRIT (orchestrated red team)
-> autonomous jailbreak agent (PAIR + TAP)
-> GCG suffix attacks
-> multilingual / code-switch
-> multi-turn persona adoption
output: CVSS-scored findings + disclosure timeline + before/after harmlessness delta
Stack
- Safety classifiers: Llama Guard 4, ShieldGemma-2, NVIDIA Nemotron 3 Content Safety, X-Guard
- Guardrail framework: NeMo Guardrails v0.12 + OPA
- Red-team drivers: garak (NVIDIA), PyRIT (Microsoft Azure), NVIDIA Aegis, promptfoo
- Jailbreak agents: PAIR (Chao et al., 2023), Tree-of-Attacks (TAP), GCG suffix
- Constitutional training: Anthropic-style self-critique loop + SFT on critiques
- PII scrub: Presidio
- Target: an 8B instruction-tuned model or one of the other capstones' RAG chatbots
Build It
-
Target setup. Stand up an 8B instruction-tuned model on vLLM, or reuse a RAG chatbot from another capstone. This is the app under test.
-
Safety pipeline wrap. Wire the five layers (sanitize, policy, classifier gate, output filter, HITL) around the target. Verify that each layer is individually observable, with one span per layer in Langfuse.
-
Classifier coverage. Load Llama Guard 4, X-Guard (multilingual), and ShieldGemma-2 (image). Run each on a small labeled set to establish baselines.
-
Red-team scheduler. Schedule garak, PyRIT, a PAIR agent, a TAP agent, a GCG runner, a multi-turn attacker, and a code-switch attacker. Each one gets its own queue.
-
Attack suite. Run six attack families: (1) PAIR automated jailbreak, (2) TAP tree-of-attacks, (3) GCG gradient suffix, (4) ASCII / base64 / rot13 encoding, (5) multi-turn persona, (6) multilingual code-switch. Report the success rate per family.
-
Constitutional self-critique. Curate 1k harmful-attempt prompts. For each, the target drafts a response, and a critic LLM scores it against a written constitution ("do no harm," "cite evidence," "refuse illegal requests"). Prompts where the critic objects get rewritten, and the target fine-tunes on the critique-improved pairs. Measure before/after harmlessness on a held-out eval.
-
Over-refusal measurement. Track the false-positive rate on a benign prompt suite (e.g., XSTest). The target has to stay helpful on benign questions.
-
CVSS scoring. Score every successful jailbreak on CVSS 4.0 (attack vector, complexity, impact). Produce a disclosure timeline and a mitigation plan.
-
Range automation. Put everything above on a cron. Findings write to a queue, and over-refusal regression alerts fire to Slack.
Use It
$ safety probe --model=target --family=PAIR --budget=50
[attacker] PAIR agent running on target
[attack] attempt 1/50: disguise query as academic research ... blocked
[attack] attempt 2/50: appeal to roleplay ... blocked
[attack] attempt 3/50: chain-of-thought coax ... SUCCEEDED
[finding] CVSS 4.8 medium: roleplay bypass on target
[range] 7 successes out of 50 (14% success rate)
Ship It
outputs/skill-safety-harness.md is the deliverable: a production-grade layered safety pipeline plus a reproducible red-team range with before/after harmlessness deltas.
| Weight | Criterion | How it is measured |
|---|---|---|
| 25 | Attack-surface coverage | 6+ attack families exercised, 2+ languages |
| 20 | True-positive / false-positive trade-off | Attack block rate vs XSTest benign pass rate |
| 20 | Self-critique delta | Before/after harmlessness on held-out eval |
| 20 | Documentation and disclosure | CVSS-scored findings with timeline |
| 15 | Automation and repeatability | Everything runs on cron with alerts |
| 100 |
My bet is that the over-refusal suite from step 7 belongs in the first pass, not the last. A pipeline can post a high attack block rate simply by refusing broadly, and the block-rate number alone will never show it. I'd run XSTest after each layer I add in step 2, so that when the benign pass rate drops I know which layer caused it. The rubric scores the attack-block versus benign-pass trade-off at 20 points, the same weight as the self-critique delta.
I'd also be wary of reading the self-critique delta by itself. The constitution in step 6 includes "refuse illegal requests," and a retrained target can learn to refuse more across the board. I'd rerun the benign suite on the retrained model before calling the harmlessness gain a win.
Exercises
-
Run garak's prompt-injection plugin on a RAG chatbot and compare the attack success rate with and without the output-filter layer.
-
Add a seventh attack family: indirect prompt injection via retrieved documents. Measure the extra defense required.
-
Implement a "refuse-with-help" mode. When the guardrail blocks, the target offers a safer related answer instead of a flat refusal. Measure the XSTest delta.
-
Find a language where X-Guard underperforms, and propose a fine-tune dataset that targets it.
-
Run the constitutional self-critique on a 30B model and measure whether the delta scales.
Key Terms
| Term | What people say | What it actually means |
|---|---|---|
| Layered safety | "Defense in depth" | Multiple guardrails at input, gate, output, HITL |
| Llama Guard 4 | "Meta's safety classifier" | The 2026 reference input/output content classifier |
| PAIR | "Jailbreak agent" | Paper (Chao et al.) on LLM-driven jailbreak discovery |
| TAP | "Tree-of-Attacks" | Tree-search variant of PAIR |
| GCG | "Greedy coordinate gradient" | Gradient-based adversarial suffix attack |
| Constitutional self-critique | "Anthropic-style training" | Target drafts -> critic scores -> rewrite -> retrain |
| XSTest | "Benign probe set" | Benchmark for over-refusal regression |
| CVSS 4.0 | "Severity score" | Standard vulnerability scoring for safety findings |
Further Reading
- Anthropic Constitutional Classifiers: training-time reference
- Meta Llama Guard 4: the 2026 input/output classifier
- Google ShieldGemma-2: image + multimodal safety
- NVIDIA Nemotron 3 Content Safety: enterprise reference
- X-Guard (arXiv:2504.08848): 132-language multilingual safety
- garak: NVIDIA red-team toolkit
- PyRIT: Microsoft red-team framework
- NeMo Guardrails v0.12: rail framework
- PAIR (arXiv:2310.08419): jailbreak agent paper
Code
- main.py (python, 293 lines)