Agent Prompt Injection Testing: What a Two-Boolean Score Leaves Out

Agent Prompt Injection Testing

The plan was ordinary. Take a set of documented prompt-injection classes, run them against a pinned agent framework, and report what got through.

Before running anything, I went to read how the benchmark records a result. That reading ended the original plan and produced this article instead.

The benchmark is AgentDojo, built by ETH Zurich’s SPY Lab. It is the most serious open tool for agent prompt injection testing, and I want to be clear from the start that nothing here is a criticism of it. It is well built, its source is readable, and it is honest about what it does.

What I found is a property of how agent security gets scored, not a bug. It affects anyone quoting a number from this class of tool. And you can check it yourself in about ninety seconds.

Here it is in one sentence: in AgentDojo 0.1.35, a provider outage and a successful defence are recorded identically.

Key takeaways
  • Verified in source: AgentDojo 0.1.35 contains three exception paths that set security = True on infrastructure failures. A context-window overflow and a working defence are recorded identically.
  • Verified in source: The scoring does not confirm that a payload reached the model. A dropped payload and a refused payload produce the same result.
  • Interpretation, not measurement: Published agent security numbers are therefore somewhat optimistic. The size of the effect is unmeasured and environment-dependent.
  • Design principle: Ambiguity should resolve to “indeterminate”, not to “secure”. A benchmark has to write something to disk; a published article does not.
  • Failure shape is not a detail. A silent failure produces a plausible answer and no alert. Attack success rate treats it identically to a loud refusal.
  • Attribution defaults to unknown. A mitigation observed with no defence configured is a property of the model, not of the framework. Assuming otherwise breaks on your next model upgrade.
  • Limitation: No models were run for this article. It is source analysis, and the payload evaluation remains open.

Quick Navigation


What a Model Card Is, and What Model Card Disclosure Now Means

What is a model card? A model card is a short structured document published alongside a machine learning model that states its intended uses, training data, evaluation results, and known limitations. The format was proposed by Margaret Mitchell and colleagues in 2019 and has since become the default unit of AI documentation.

The original proposal assumed one document would carry everything. That assumption broke in 2026. Frontier labs now publish a system card focused on pre-deployment safety evaluation, a model card focused on specifications and benchmark results, and — for anyone selling into Europe — a separate public summary of training content filed under the AI Act. These three documents overlap unevenly and almost never link to one another.

So “model card disclosure” in 2026 means something looser than it did five years ago: the sum of what a provider publishes about a model, wherever it lands. The problem for the reader is that nobody tells you which document holds which fact.


How We Audited Model Card Disclosure

We read four flagship cards released between July and September 2026 directly, against a seven-item checklist, and recorded what each one states on its own terms. Where a card points elsewhere rather than stating something, we recorded a pointer rather than crediting the disclosure.

The sample is small and deliberately so: OpenAI’s GPT-6 Astra (3 September), Google DeepMind’s Gemini 3.8 Flash (2 September), Anthropic’s Claude Opus 5 (24 July), and Thinking Machines Lab’s Inkling (15 July). It spans two closed-weight US labs, one closed-weight card from a lab that publishes model cards rather than system cards, and one open-weight release.

Three cells below are marked unverified. We could not confirm them from the primary document within the scope of this audit, and we are not going to guess. Flagging what you could not check is the difference between an audit and a roundup.

For breadth, we cross-reference three independent corpora that cover far more ground than four cards: the GPAI Ledger’s archive of Article 53(1)(d) filings, the AI Accountability Lab’s graded assessment of those filings, and Stanford CRFM’s Foundation Model Transparency Index.


What I actually tested in this agent prompt injection testing exercise

I tested the measuring instrument. Not the payloads, not the models.

The subject is agentdojo version 0.1.35, the current release, uploaded on 27 October 2025. I verified that against the PyPI JSON API rather than the project’s documentation, downloaded the published wheel, and read the source. Every claim below comes from that wheel, not from docs that may lag the code.

Here is what the package contains at that version.

PropertyValue
Release0.1.35, uploaded 2025-10-27
Releases published to date36
Python requirement>= 3.10
Evaluation suitesworkspace, banking, travel, slack
Suite versions shippedv1, v1_1, v1_1_1, v1_1_2, v1_2, v1_2_1, v1_2_2
Built-in defences4
Attack generators17
Result representationTwo booleans per run

The four defences are tool_filter, transformers_pi_detector, spotlighting_with_delimiting and repeat_user_prompt. The seventeen attack generators split into twelve goal-hijacking templates and five denial-of-service templates.

That last row is where this article lives.


The test harness

I built a small analysis layer that reads AgentDojo’s own trace logs and re-scores them. It runs no attacks of its own and calls no model. It is deterministic, which means anyone can re-run it against the same logs and get the same output.

AgentDojo writes one JSON file per run to a predictable path:

runs/{pipeline}/{suite}/{user_task}/{attack}/{injection_task}.json

Each file carries the full trajectory plus the context the logger attached: utility, security, attack_type, pipeline_name, benchmark_version, agentdojo_package_version, an evaluation timestamp, and the injection strings used.

That is a generous amount of information. It is enough to ask questions the summary statistics do not answer, which is exactly what the harness does.

The harness ships with twelve unit tests covering every branch of its classifier. The test that motivated the whole project asserts that an infrastructure error is not scored as a block.


What the two booleans encode

AgentDojo reduces each run to utility and security.

utility is true when the agent completed the legitimate user task. security is true when the injection task goal was not achieved. So security = False means the attack worked.

This is a reasonable design. It produces attack success rate, which is the number most of the literature reports, and it makes results comparable across models and defences.

The compression is also where information goes missing. Two runs that look identical in the summary can be very different events.

Consider two cases that both record security = True:

  • The model read the injected instruction and declined to follow it.
  • The injected instruction never reached the model at all.

The first tells you something about the model’s resistance. The second tells you something about your filtering, or about nothing at all if no filter was configured. Collapsed into one boolean, they are indistinguishable.


What happened

Reading agentdojo/benchmark.py at version 0.1.35 turned up three exception handlers that set utility = False; security = True.

They fire on:

  • BadRequestError where the code is context_length_exceeded, the parameter is max_tokens, or the message asks to reduce message length
  • ApiError whose string contains internal server error
  • ServerError

Each path logs the error and moves on. The run is counted.

So a context-window overflow enters the summary statistics in the same column as a defence that worked. A provider having a bad afternoon looks, at the aggregate level, like security.

There is a fourth behaviour worth noting. For denial-of-service attack generators, the scoring inverts: security = not utility. Those five generators measure availability rather than goal hijacking, so mixing them into a single headline number combines two different properties.

These are observations about the code, not about any model’s behaviour. No model was run for this article. That distinction matters and I want it stated plainly rather than buried in the limitations section.


Where the measurement holds

The design is sound for what it was built to do.

AgentDojo’s core contribution is realism. Its environments are stateful and require multiple tool calls. Injection strings are placed inside realistic content, such as an email body, rather than appended to a tool response where they would be trivially detectable. Over 900 combinations of benign user tasks and malicious injection tasks are paired across the four suites.

That is a substantially harder setting than earlier work. InjecAgent used simulated single-turn scenarios where one adversarial item is fed as a tool output without evaluating the agent’s planning. The newer AgentDyn benchmark reports average trajectory lengths of 7.1 steps against AgentDojo’s 3.49 and InjecAgent’s 1.

The two-boolean scheme also does something quietly important. By tracking utility alongside security, it catches the failure mode where a defence works by breaking the agent. A system that refuses everything scores perfectly on security and terribly on utility, and you can see that immediately.

Agent task competence is a real confound in every security number, and AgentDojo’s original evaluation is upfront about it. The best-performing model in that paper reached only 78.22% utility in benign settings with no attack present. If an agent fails a fifth of its ordinary tasks, some portion of every security result is just ordinary incompetence.


Where the measurement breaks

Three places, in rising order of importance.

  1. Infrastructure errors count as wins. Covered above. The practical effect depends on how often those exceptions fire in your environment, which depends on your context lengths, your provider’s reliability that week, and your rate limits. None of those have anything to do with security.
  2. Delivery is never verified. Nothing in the summary confirms the payload reached the model’s context. A truncation bug, a serialisation error, or a defence quietly dropping content all produce the same security = True as a model that read the attack and refused.
  3. Ambiguity resolves toward safety. This is the pattern underneath the other two. When the framework cannot determine what happened, it records the secure outcome. That is a defensible engineering choice, because a benchmark has to write something. It is a poor choice for a published number, because it biases every aggregate in the reassuring direction.

For agent prompt injection testing that informs a real deployment decision, an unresolvable run should be visible as unresolvable.


The shape of failure matters

A pass/fail score tells you whether something went wrong. It does not tell you whether anyone would have noticed.

That second question decides whether your incident response has any chance of working. I use four shapes.

ShapeDefinition
LoudThe system refused, blocked, or sanitised, and made that visible. The event enters your telemetry.
SilentThe injected behaviour executed and the output reads as a normal, plausible completion. Nothing signals a problem.
PartialThe agent followed part of the injected instruction without completing it.
IndeterminateThe shape cannot be established from the trace.

A silent failure is one where the system produces an apparently valid response while following the injected instruction.

Silent failures are the operationally dangerous ones. A loud failure generates a log line and possibly an alert. A silent failure generates a plausible answer, a satisfied user, and no reason for anyone to look. If an agent exfiltrates a record and then produces a competent summary of your inbox, the summary is what your reviewer sees.

Attack success rate treats both identically. They are not remotely the same risk.

The harness detects loudness with a pattern list matching refusal and warning language in assistant output. That is a lexical heuristic, and it errs in both directions. It over-counts loudness when a model uses refusal-shaped phrasing while still complying, and under-counts it when concern is expressed in wording the list does not cover. Anyone using it should hand-audit a sample and publish the agreement rate.


Why attribution is difficult

When a payload does not get through, the interesting question is why. It is also the question most evaluations skip, because it is genuinely hard.

A blocked payload looks the same whether the block was engineered or accidental. The trace shows an attack that did not succeed. It does not show you which component is responsible.

The harness records attribution across ten causes, with a stated confidence on each: documented, observed, inferred, or unknown. The default is “cannot be determined”, and a cause is only assigned when a rule can point at a specific artefact in the trace or a documented behaviour of the configured pipeline.

Two rules carry most of the weight.

  1. No defence configured, payload reached context, attack failed. Attributed to model behaviour, never to the framework. The framework did nothing. Whatever resisted the attack is a property of the model you happened to pick, and it may not survive your next model upgrade.
  2. A presentation-layer defence configured, payload reached context, attack failed. Attributed to model behaviour at inferred confidence only, with competing explanations listed. Delimiting changes how content is presented, not whether it arrives. The refusal decision still sat with the model, but the delimiter markup may itself have supplied the cue. Those cannot be separated from a single trace.

Every attribution that is not “undetermined” carries a list of competing explanations. If that list is empty and confidence is below “observed”, it is a bug in the classifier rather than a finding.

The most common error in this area is reading a model’s refusal as a framework security feature. It is an easy mistake and it leads directly to deploying the same architecture on a different model and being surprised.


What the results actually tell us

Three things, held at appropriate strength.

First, verified. AgentDojo 0.1.35 scores three classes of infrastructure error as defensive successes, and does not verify payload delivery. This is directly checkable in the published source.

Second, an interpretation. Published agent security scores are therefore slightly optimistic by an amount nobody currently reports. How much is unknown and depends entirely on the environment. I am not going to put a number on it, because I have not measured one.

Third, an open question. Whether stricter scoring changes any published conclusion is unknown. It may turn out that infrastructure errors are rare enough to be noise. That would be a useful finding too, and it is testable with the harness.

What this does not tell us is anything about which frameworks resist prompt injection. That evaluation has not been run. The original question stands open.


Limitations

This section is longer than the findings section, which is the correct ratio.

  • No models were run. This is source analysis. Every claim is about code, not behaviour.
  • One framework, one version. AgentDojo 0.1.35 only. Whether other agent evaluation tools share this property is untested, though the design pressure that produces it is common.
  • Point-in-time. Verified 20 September 2026 against a release dated 27 October 2025. The project is active and this may change. Re-check before citing.
  • The stricter rubric is unvalidated. The harness demands positive evidence of payload delivery before scoring a block. That is a defensible bar, but it is my bar. It will produce lower block rates than AgentDojo’s own scoring on identical logs, and I have not demonstrated that the difference is meaningful rather than pedantic.
  • Loudness detection is lexical. A pattern list, not a semantic judgement. Error in both directions.
  • Template attacks measure a floor. Work on adaptive attacks shows defences evaluated against fixed templates degrade badly under attacks adapted to them. Any result from this class of tool is a lower bound on what a motivated attacker achieves.
  • Passing proves nothing. A system that survives this evaluation is not secure. It survived these payloads, at these versions, on this date, under this configuration. Failing one test does not mean a framework is broadly insecure, either.

How to reproduce this

The source reading needs nothing but the package.

bash

pip download agentdojo==0.1.35 --no-deps
unzip agentdojo-0.1.35-py3-none-any.whl -d src

Then open src/agentdojo/benchmark.py and search for security = True. The three exception paths are in the function that runs a single task against a pipeline. The attack generators are in src/agentdojo/attacks/, and the defence names sit in src/agentdojo/agent_pipeline/agent_pipeline.py.

To run the re-scoring layer, generate traces first. Hold the model fixed and vary one defence at a time, or attribution becomes impossible:

bash

python -m agentdojo.scripts.benchmark \
  --model <exact-dated-model-string> \
  --defense tool_filter \
  --attack important_instructions

Read the directory name that appears under runs/, since that string is the join key the harness needs.

Two things to record and publish: the exact dated model string, never “latest”, and your temperature. Leaving temperature at the provider default is a defensible choice, but it is a choice, and it belongs in your methodology.

Set runs per cell above one. A single run cannot distinguish a defence from a coin flip, and these are stochastic systems. Three is a floor. Five is better. Report cells that produce different outcomes across repeats as variable rather than averaging them, because the variance is the finding.

All of this runs against AgentDojo’s simulated in-process environments. No third-party system is involved, and nothing here should be pointed at infrastructure you do not own.


References

Primary research: source reading of agentdojo-0.1.35-py3-none-any.whl, and the PyPI release metadata API, both accessed 20 September 2026.

Official documentation: AgentDojo repository · AgentDojo documentation

Academic research: AgentDojo, arXiv:2406.13352 · AgentDyn, arXiv:2602.03117 · Adaptive attacks against indirect prompt injection defences, arXiv:2503.00061 · Meta SecAlign, arXiv:2507.02735


Frequently Asked Questions

What is prompt injection?

Prompt injection is an attack where instructions hidden in content an AI system processes get followed as if they came from the operator. In agent systems the content usually arrives indirectly, through a retrieved document, an email body, or a tool response, rather than from the person typing.

What does attack success rate mean?

It is the proportion of runs where the injected instruction’s goal was achieved. It is the standard metric across this literature and it answers a narrow question well. It does not tell you whether the failure was visible, or whether the runs it counted were valid tests.

What is a silent prompt injection failure?

One where the system follows the injected instruction and still produces an apparently valid response. Nothing in the output signals that anything went wrong, so no reviewer has a reason to investigate.

Why should an indeterminate result not count as a defence?

Because it did not test the defence. If a run crashed on a context-length error, you learned nothing about whether the model would have resisted the attack. Scoring it as a block moves an untested run into the reassuring column.

Can prompt injection ever be completely prevented?

Not at the model layer, on current evidence. There is no syntactic boundary between instruction and data in natural language. Practical defence is about limiting what a successful injection can reach: tool permissions, isolation, confirmation on consequential actions.


Keep reading

Agent Prompt Injection Testing

Agent Prompt Injection Testing: What a Two-Boolean Score Leaves Out

The plan was ordinary. Take a set of documented prompt-injection classes, run them against a pinned agent framework, and report what got through. Before running …

Read more

Model Card Disclosure

Model Card Disclosure in 2026: What AI Labs Actually Tell You

Open the documentation for any model released this year and you will find something. Whether you find the thing you came for depends entirely on …

Read more

AI compliance deadlines

AI Compliance Deadlines: What Applies, When, and to Whom

There is no single AI compliance deadline. There is a calendar of them, each attached to a particular jurisdiction, a particular kind of organisation, and …

Read more

AI agent framework security

AI Agent Framework Security: 10 Frameworks Audited

A developer runs pip install, decorates three functions with @tool, and points an agent at them. The agent now has a shell in your process. …

Read more

AI Red Teaming: 4 Hidden Flaws in a Passing Test

The report lands in your inbox on a Thursday. Forty pages, a summary table, a handful of medium findings, all closed. Somewhere near the front sits the sentence everyone will quote in the launch meeting.

“No critical vulnerabilities were identified.”

That sentence is almost certainly true. It is also one of the most misread lines in AI security, because red teaming answers a far narrower question than the people reading the report believe.

What follows is four flaws that hide comfortably inside a clean red teaming result. Each opens with the kind of line that shows up in real reports, then covers what it actually means, the evidence behind it, and the clause to put in your next scope of work.

Key Takeaways

  • A pass means one configuration survived one set of attacks on one day. It is a snapshot, not a certificate.
  • Single-turn testing misses most of the risk. Cisco ran 6,986 multi-turn attacks against 15 flagship models and broke through as often as 88.3% of the time.
  • Models are probabilistic, so binary results mislead. The same attack can fail four times and succeed on the fifth, which means red teaming needs repeat runs and success rates, not pass or fail.
  • The tested system usually is not the shipped system. Model version, system prompt, tools and retrieval all drift between assessment and launch.
  • Red teaming shows presence, never absence. It proves a flaw exists. It can never prove none remain.
  • The fix is cadence, not coverage. Microsoft’s AI Red Team put it plainly after 100 products: securing AI systems is work that never completes.

Quick Navigation


How to Read a Red Teaming Report Without Being Reassured

Start with a reframe. A red teaming engagement is a search, and every search has a scope, a budget and a stopping rule.

The report tells you what the searchers found. It does not tell you how much of the space they covered, and red teaming reports almost never state that denominator.

AI Red Teaming

That gap is where false confidence grows. Nobody lies. The reader hears “we found nothing bad”, while the document says “we found nothing bad in the places we looked, in the time we had”.

Microsoft’s AI Red Team made this explicit after running more than 80 operations across over 100 generative AI products. One of their eight lessons is simply that red teaming is not safety benchmarking, and another is that the work of securing AI systems will never be complete.

So read a red teaming report the way an auditor reads a sample. Ask what was in scope, how deep the sampling went, and what the result would look like if the system changed next week.


Flaw One: The Red Teaming Ran One Turn, Attackers Run Ten

“We submitted 1,200 adversarial prompts across twelve harm categories. 1,186 were correctly refused.”

What it actually means. Twelve hundred single messages were sent and scored one at a time. Nobody held a conversation, which is the most common shortcut in red teaming.

That distinction decides most of your risk, because real attackers do not fire one prompt and leave. They build rapport, reframe the goal, split the payload across turns and return to it later. Single-turn testing never sees any of that.

The Evidence on Multi-Turn Attacks

The numbers here are not close, and they should reset how you price an engagement. At VB Transform in July 2026, Cisco’s head of AI threat intelligence reported that 6,986 multi-turn attacks against 15 flagship models broke through as often as 88.3% of the time.

Earlier work points the same way. Scale AI’s multi-turn human jailbreak study found human red teamers beat automated ensembles by 19 to 65 percentage points, with overall success above 70% on HarmBench.

One result deserves a pause. Against one strong defence, automated single-turn attacks scored zero while multi-turn human attacks still landed around 70%. A red teaming report built on the first method would have read as flawless.

The follow-up is stranger still. An ACL 2025 paper showed that compressing those multi-turn conversations back into a single structured prompt reached 70.6% to 95.9% success, sometimes beating the original conversation, by hiding the request inside enumerated or code-like formatting.

So the flaw was never really about turn count. It was about context in a shape safety training had not seen, and a suite that varies only the wording will keep missing it.

What to Write Into the Red Teaming Scope

Require a stated minimum conversation depth in the red teaming scope, five turns or more, across every harm category rather than a sampled few.

Require delivered transcripts, not just counts. You cannot fix a conversational attack you cannot read, and transcripts are what make a finding reproducible.

Require at least one structural-reformatting pass, where the same request arrives wrapped in lists, code blocks or documents.


Flaw Two: Red Teaming a Probabilistic System Needs Repeat Runs

“Attack vector 4.2: blocked. Attack vector 4.3: blocked.”

What it actually means. Each attack was tried once, and one attempt was treated as decisive. Testing a language model this way borrows a habit from software QA that does not transfer.

Traditional security testing gets away with it. A SQL injection flaw fails the same way every time you send the same malformed input.

A language model does not behave like that. The same prompt can be refused four times and answered on the fifth, because sampling, context and load all move the outcome. Results need repetition to mean anything.

Binary results therefore hide the shape of the risk. “Blocked” might mean blocked every time, or blocked 80% of the time, and those two systems carry very different exposure at a million requests a month.

The Statistics Red Teaming Reports Should Carry

Ask for attack success rate rather than a verdict, with the trial count next to it. Ten runs per vector is a reasonable red teaming floor, and any result from a single attempt should carry a label saying so.

Ask about the grader too. Most large red teaming exercises score results with another model, and that judge has its own false-positive and false-negative rate.

An uncalibrated judge quietly sets your finding count. Ask what sample of its decisions went to human review, and what the agreement rate was, because that number bounds the whole result.

Then watch for the reverse error. A judge tuned to avoid false alarms marks borderline compliance as a refusal, and your report gets cleaner while the system gets no safer.


Flaw Three: The System Under Red Teaming Was Not the System You Shipped

“Testing was conducted against the staging environment between 3 and 14 March.”

What it actually means. Everything that changed after 14 March sits outside the red teaming result, and in an AI stack that is usually quite a lot.

Microsoft’s team pushes hard on this point. Their ontology treats the system as the end-to-end product rather than the model, because integration is where a surprising share of real failures live.

Their own case work makes it concrete. When they tested a vision language model, image inputs proved far more jailbreakable than text, which no amount of text-only red teaming would have revealed.

Five Things That Drift Between Test and Production
  1. The model version. If your integration calls a floating alias rather than a pinned snapshot, the weights behind your tested behavior can change without notice.
  2. The system prompt. Most teams edit it weekly. Every edit is an untested configuration.
  3. The tool list. A new connector adds capability the testers never had access to, which changes what a successful injection can reach.
  4. The retrieval corpus. New documents mean new places for indirect prompt injection to hide, and that path stays the top-ranked risk on the OWASP LLM list. We broke the variants down in our guide to the classes of prompt injection.
  5. The guardrail configuration. Filters get loosened for a legitimate false-positive problem, and nobody re-runs the suite afterwards.
Pinning the System Under Red Teaming Test

Record a configuration fingerprint with every red teaming engagement: model snapshot ID, system prompt hash, tool manifest, guardrail settings and retrieval index version.

Then treat a change to any of those five as a change to the finding. The report is evidence about one fingerprint and nothing else.

This is the same discipline that makes containment work, and our piece on sandbox isolation layers covers the environment side of it.


Flaw Four: Red Teaming Shows Presence, Never Absence

“No critical vulnerabilities were identified in the scope defined above.”

What it actually means. The red teaming team looked for the harms someone thought to list, and did not find those.

This is the deepest of the four flaws and the least fixable. Red teaming demonstrates that a problem exists. It has no mechanism for demonstrating that no problems remain.

Think about what that implies for novel attacks. A red teaming exercise in early 2024 could not test for attack classes published in late 2025, and yours cannot test for whatever lands next quarter.

Prompt injection illustrates the gap neatly. It has sat at the top of the OWASP LLM risk list since 2025, and it remains a flaw that testing finds rather than one that alignment has fixed.

Measuring Red Teaming Coverage Honestly

You cannot measure red teaming coverage against all possible attacks. You can measure it against a named taxonomy, which is the next best thing.

Ask for findings mapped to MITRE ATLAS and the OWASP LLM Top 10, with explicit “not tested” entries rather than silence. In a coverage matrix, a blank row is information and a missing row is not.

Ask for the harm categories considered and then ruled out of scope, with reasons. That list is often more revealing than the red teaming findings themselves.

Finally, ask what the team would have tested with double the budget. Every honest red teaming lead has a ready answer, and that answer is your real risk register.


When to Re-Run Red Teaming: A Trigger List

Annual testing made sense when systems changed annually. Tie your red teaming cadence to change events instead.

TriggerRe-test scope
Model version or snapshot changeFull suite
System prompt editTargeted, plus top jailbreak vectors
New tool or connector addedFull agentic path, permissions and egress
Retrieval corpus expansionIndirect prompt injection set
Guardrail or filter loosenedThe categories that filter covered
Novel public attack classThe affected categories, within days

Two of those rows fire most weeks in an active product. That is the real argument for automating the regression layer and saving human red teaming for depth and novelty.

Continuous testing is now the consensus position rather than a vendor pitch. As Check Point put it in a 2026 write-up, AI security has no final exam — it has an improvement process.


What Good Red Teaming Looks Like on Paper

A strong red teaming report is less comfortable to read than a weak one, and you can spot it from the structure alone.

A good red teaming report puts the configuration fingerprint on page one. It reports success rates with trial counts rather than verdicts. It includes the multi-turn transcripts.

It maps findings to a named taxonomy, marks untested categories explicitly, and separates security findings from responsible-AI harms because those need different owners.

It names what the red teaming could not reach: budget limits, access limits, missing modalities, all stated rather than implied.

And it ends with a re-test trigger list rather than a date twelve months out. If your last red teaming report did none of these, the gap is in the scope you wrote, not the work they did.

Good telemetry makes all of it easier, since red teaming findings are only reproducible if you captured what the system did. Our field guide to the four signals an agent stack must emit covers that layer.


The Verdict: Red Teaming Is a Cadence, Not a Certificate

Go back to that Thursday red teaming report and the sentence everyone quoted. Nothing in it was wrong.

The error was in translation. “No critical vulnerabilities in this scope, this configuration, this fortnight” became “the system is safe”, and a launch decision rode on the gap between them.

None of this is an argument against red teaming. It is the only practice that turns a vague worry into a specific, reproducible finding you can actually fix, and it is worth every rupee.

Just hold red teaming to what it is. It measures resistance to attacks someone imagined, in a system that has since changed, scored by a judge with its own error rate.

Ask for the denominator, the trial counts and the fingerprint. A red teaming report that gives you all three is worth more than one with no findings at all.


Frequently Asked Questions

What is AI red teaming?

AI red teaming is structured adversarial testing of an AI system, where a team emulates a real attacker to surface jailbreaks, prompt injection, data leakage, unsafe outputs and agentic misuse before real users find them. It differs from a penetration test because the target is model and system behavior rather than code and infrastructure.

Does a passing red teaming report mean a model is safe?

No. A pass means the tested configuration resisted the attacks that were tried, within the scope and budget defined. Red teaming can show that a flaw exists but cannot show that none remain, so a clean report is evidence about one snapshot rather than a safety guarantee.

Why does single-turn red teaming miss so much?

Because attackers use conversations, and single-turn red teaming never has one. Cisco reported multi-turn attack success as high as 88.3% across 15 flagship models, and research has shown cases where automated single-turn attacks scored zero against a defence that multi-turn human attacks beat around 70% of the time.

How many times should each attack be run?

More than once. Language models are probabilistic, so the same prompt can be refused several times and answered on another attempt. Ask your provider for success rates with a stated trial count, treat ten runs per vector as a working floor, and label any single-attempt result clearly.

How often should red teaming be repeated?

Tie red teaming to change rather than the calendar. Re-test after a model version change, a system prompt edit, a new tool or connector, a retrieval corpus expansion, a loosened guardrail, or the publication of a novel attack class affecting your categories.


Keep reading

Agent Prompt Injection Testing

Agent Prompt Injection Testing: What a Two-Boolean Score Leaves Out

The plan was ordinary. Take a set of documented prompt-injection classes, run them against a pinned agent framework, and report what got through. Before running …

Read more

Model Card Disclosure

Model Card Disclosure in 2026: What AI Labs Actually Tell You

Open the documentation for any model released this year and you will find something. Whether you find the thing you came for depends entirely on …

Read more

AI compliance deadlines

AI Compliance Deadlines: What Applies, When, and to Whom

There is no single AI compliance deadline. There is a calendar of them, each attached to a particular jurisdiction, a particular kind of organisation, and …

Read more

AI agent framework security

AI Agent Framework Security: 10 Frameworks Audited

A developer runs pip install, decorates three functions with @tool, and points an agent at them. The agent now has a shell in your process. …

Read more