Apply to my task
arXiv:2610.10608 ★ 89 Oct 7, 2026

AIDA: an independent adversary and judge instead of self-checking — how to stop an agent from closing a case on an empty result

Key result

The finding: an agent closes a dangerous alert if its search came back "nothing found". The AIDA method lets you trust an agent with the "close or escalate" (hand off to a human) decision without worrying about a missed attack. The Strategist writes down a thesis before any criticism, the Adversary looks for holes in it from a separate context, and the Judge demands positive proof before closing. The model stops reinterpreting its own text. In investigations with empty searches, four of five standard approaches closed at least 88% of attacks.

01

TL;DR

AIDA (Adversarial Investigation and Dialectical Analysis) is a four-role scheme for an agent that decides "close or escalate". The Strategist gathers evidence and writes down a thesis (the proposed decision). The Adversary, in a separate context, looks for where the thesis doesn't hold up. The Judge weighs the thesis and the objection against the evidence. Everything goes into an investigation ledger that can only be appended to.

The main finding: an agent closes a dangerous case if its searches came back "nothing found". An empty result only means that this query found nothing. But agents take it as proof of safety. Four of the five tested approaches closed at least 88% of attacks in investigations with empty searches. Then there's a second problem: checking in the same context more often breaks correct decisions than fixes wrong ones. The reason is that the model reinterprets what it already wrote instead of looking for new evidence. And a third: before closing a case, the agent gathers no more evidence than before escalating, even though closing is irreversible.

The method solves all of this with structure. The thesis is locked in before criticism. The critic sees only the thesis and the evidence, not the author's line of reasoning. The Judge demands stronger evidence for closing than for escalating. If there isn't enough evidence, it sends the case back for another round and names exactly what to look for.

Want this for your own case? Apply this study to your task: AI adapts its method to what you are working on and writes the prompt.

02

Method Blueprint

STEP 1 (Strategist): determines what evidence is needed → list of queries
STEP 2 (Executor): runs the searches, handles failures → results into the ledger
         (an empty result is recorded as "empty", not as "clean")
STEP 3 (Strategist): locks in a thesis — "escalate / close" + the evidence it rests on
STEP 4 (Adversary, SEPARATE context): objection if the evidence contradicts
         the thesis or required data is missing → objection into the ledger
STEP 5 (Judge): weighs thesis + objection against the evidence
         → decision OR a new round specifying what to collect
         (the evidence bar is higher for closing)
Repeat 2–5 with the same ledger until the Judge reaches a decision

Steps 1–5 are separate model calls, not a single prompt. The Adversary and the Judge each get their own context.

03

Example in Practice

Task: You own an online store built on Shopify. Your monitoring system sends alerts: "admin login from Brazil at 3:12 a.m." Almost all alerts are harmless: a contractor, a VPN or a business trip. But one of them could be a breach, and nobody will ever reopen a closed alert. You need an agent (Claude Code or a custom GPT with log access) that checks the alert on its own and decides whether to close it.

Prompt:

<Role>
You orchestrate the investigation of security alerts for an online store.
Nobody will ever re-check a closed alert, so missing an attack is the worst possible error.
Work through four roles and an investigation ledger.
</Role>

<Ledger>
The investigation ledger is append-only; entries are never edited or deleted.
Entry format: [round] [role] [type: query / result / thesis / objection / decision] [content]
</Ledger>

<Protocol>
Until the Judge reaches a decision:

1. Strategist: determine what evidence is needed to tell whether the login is legitimate.
   For example: this user's other logins, password changes, admin actions after the login,
   logins from this IP on other accounts, the employee's location history.
   Output a list of queries for the Executor.

2. Executor: run the queries through the tools. Mark query failures as "ERROR".
   If a query found nothing, write "EMPTY: query X for period Y returned nothing".
   An empty result is not proof of safety.

3. Strategist: once there's enough evidence or the round's query limit ({query_limit}) is used up,
   write a THESIS: "escalate" or "close" + which ledger entries support it.

4. Adversary: work in a separate context; you see only the ledger and the thesis,
   not the Strategist's reasoning. Write an OBJECTION if:
   - the evidence contradicts the thesis, or
   - data is missing without which the alert can't be resolved.
   If you have no objections, write "no objections" and explain exactly what you checked.

5. Judge: weigh the thesis and the objection against the evidence in the ledger.
   - For "escalate", plausible evidence is enough.
   - For "close", positive proof of legitimacy is required
     (for example, the login is confirmed by a known VPN or the work schedule).
     The absence of suspicious findings is not proof.
   - If important data is missing, request a new round and list exactly what to collect.
   - Otherwise, issue a decision with a rationale.
</Protocol>

<Alert>
Login to the Shopify admin panel, user {login}, IP {IP}, Brazil, 3:12 a.m. Eastern.
</Alert>

Result: The agent will run one or more rounds. The ledger will show the queries and results, with empty searches clearly flagged. Then the thesis, the Adversary's objection and the Judge's decision citing the evidence. If there's no confirmation of legitimacy, the alert gets escalated or goes back for another round with a specific list of missing data.

04

Why It Works

The weakness. The model can't tell "didn't find it" from "it isn't there". It reads an empty tool response as confirmation of whatever version it was already leaning toward. When the model checks itself in the same context, it conforms to its own earlier text. That's why, in the study, self-checking broke several times more correct decisions than it fixed wrong ones.

The strength. Give the model someone else's concrete thesis and ask it to poke holes in it, and it critiques well. It also works well as a judge when it has to weigh two claims against recorded evidence. Criticism is sharper when the model doesn't carry the baggage of its own reasoning in context.

How the method uses this. The thesis is locked in before criticism, which gives the Adversary a target. A separate context removes the conformity. The asymmetric bar (closing requires positive proof) corrects the bias of "closing is cheaper than escalating". An append-only ledger keeps round 3 from quietly rewriting the conclusions of round 1.

Control knobs: - {query_limit} per round → raise it for complex cases, lower it to save tokens. - Bar for closing → tighten or loosen the evidence requirements to match the cost of an error. - Number of rounds → set a ceiling after which the case goes to a human. - The Judge role → without it, F1 in the ablation fell from 0.952 to 0.895.

05

Prompt Template

<Role>
You orchestrate the process of "{what_we_decide}". The decision "{irreversible_decision}" is irreversible
and nobody re-checks it later, so missing {critical_error} is the worst possible error.
Work through four roles and a ledger.
</Role>

<Ledger>
The ledger is append-only. Entry format:
[round] [role] [type: query / result / thesis / objection / decision] [content]
</Ledger>

<Protocol>
Until the Judge reaches a decision:

1. Strategist: determine what evidence is needed to resolve {case}.
   Output a list of queries for the Executor.

2. Executor: run the queries through {tools_or_sources}.
   Failure → "ERROR". Nothing found → "EMPTY: what was searched, where, for what period".
   An empty result is not proof.

3. Strategist: once there's enough evidence or the limit ({query_limit}) is used up,
   write a THESIS: "{option_A}" or "{option_B}" + the ledger entries it rests on.

4. Adversary: work in a separate context; you see only the ledger and the thesis.
   Write an OBJECTION if the evidence contradicts the thesis or data needed for a decision is missing.
   If you have no objections, state what you checked.

5. Judge: weigh the thesis and the objection against the ledger.
   - For "{safe_option_A}", {soft_bar} is enough.
   - For "{irreversible_option_B}", positive proof of {what_kind} is required.
     The absence of anything suspicious is not proof.
   - If important data is missing, request a new round and list what to collect.
   - Otherwise, issue a decision with a rationale.
</Protocol>

<Input>
{case}
</Input>

What to fill in: {irreversible_decision}: the thing that can't be undone (closing a ticket, approving a payment, letting an order through). {critical_error}: the most expensive error in your field. {soft_bar} and {what_kind}: the difference between "suspicion is enough" and "confirmation is required".

🚀 Quick start: paste into the chat:

Here is the AIDA template (four roles + an investigation ledger). Adapt it to my task: [your task].
Ask me questions to fill in the fields.

[paste the template above]

The LLM will ask which of your decisions is irreversible, which error costs more and what evidence can be gathered. The Judge's asymmetric bar depends on exactly that, and it's the central part of the method. It will take the structure from the template and tailor it to your field.

ℹ️ What in the template comes from the paper and what is reconstructed. The available part of the paper doesn't include the agents' prompt texts. The roles, the order of steps, the ledger, the thesis-before-objection rule, the Adversary's separate context and the higher bar for closing are all described by the authors. The wording in the template was assembled from that description.

⚠️ About chat. In a single chat window, the Adversary has no separate context. To preserve the essence of the method, run the Adversary and the Judge in a new chat (or as subagents in Claude Code), passing them only the ledger.

06

Limitations

⚠️ The price is more escalations: AIDA sends noticeably more cases to analysts (18.4% vs. 8.5–14%). That's the cost of missing almost no attacks. If human attention is scarce for you, this is the bottleneck.

⚠️ Tested on one task: this is a single attack scenario (out of eight possible) on lab data, and almost all the attacks are web reconnaissance. Rare phases (privilege escalation, service scanning) were represented by a handful of cases.

⚠️ Tools and evidence are required: the method works when the agent can gather data. If the decision is made from text alone with no sources, the Adversary and the Judge have nothing to stand on.

⚠️ Not for simple decisions: for reversible, cheap decisions, four roles and several rounds are overkill.

⚠️ The authors' implementation is code: in the paper it's an orchestrator with an MCP interface to a SIEM. Reproducing it with chats and agents takes manual assembly: separate contexts, passing the ledger along.

07

How They Studied It

The researchers built ALERT-BENCH. They took recorded telemetry from a corporate network with a labeled multi-day attack and "replayed" it through a live Wazuh SIEM system. The agent gets one alert and decides on its own what to look for around it. Choosing the right evidence is up to the agent, just like a human analyst. The correct answers are hidden until scoring. The sample included 1,247 alerts: 225 attacks and 1,022 benign ones.

Five popular approaches (direct prompt, ReAct, Self-Consistency, Self-Refine, Chain-of-Verification) were run on the same model (GPT-4.1) with the same tools. Each one missed at least 40.4% of attacks. An analysis of the recorded steps revealed three recurring behaviors: empty search → close, "revising" instead of fixing (Self-Refine fixed 16 errors and broke 79 correct decisions; CoVe, 25 and 132), and the same depth of checking for closing as for escalating.

AIDA was built as a direct answer to these three holes. The result: F1 of 0.958 vs. 0.371–0.744, and the share of missed attacks fell from 40.4% to 3.1%. The Judge corrected 31 wrong theses without reversing a single correct one. Without it, F1 fell from 0.952 to 0.895. The 9-billion-parameter Qwen3.5 model with AIDA reached an F1 of 0.952: structure gives more than model size.

The unexpected part: self-checking, which is commonly recommended, actually did harm here. The practical takeaway: check with a different context and against new evidence, rather than asking the same model to "reread" its work.

08

Adaptations and Extrapolations

🔧 Technique: an empty-results rule → drop it into any agent prompt

The cheapest part of the method, which you can take on its own if you don't have time for the full scheme:

An empty search result is not proof of absence. Record it as
"EMPTY: what was searched, where, for what period". A case may only be closed
on positive proof of legitimacy, not because nothing suspicious was found.

The paper tested the full scheme as a whole, not this snippet on its own. But empty results were the main cause of misses, so it's a sensible place to start.

🔧 Technique: a faceless Adversary → a concrete persona

Instead of Adversary, specify Adversary: a paranoid head of security who will be fired for a missed breach. The criticism will get sharper, but the number of unnecessary escalations may rise. This is my own idea; it wasn't tested in the paper.

Extrapolation: the same framework for support tickets or order review. Plug in {irreversible_decision} = "close the customer's ticket as resolved", {critical_error} = "the customer was left without help". The bar for closing: "the customer confirmed the problem is gone". Not tested in the paper, but the logic (the decision is irreversible and rarely re-checked) is the same.

09

Resources

  • Paper: From Investigation Failures to Reliable SOC Agents: Understanding and Improving LLM-Based Alert Triage
  • Authors: Danfeng (Daphne) Yao (North Carolina State University), Peng Gao, Saimon Amanuel Tsegai (Virginia Tech), Alex Kantchelian (Google)
  • Benchmark: ALERT-BENCH on AIT-LDSv2 data with the AIT-ADS labeling procedure, Wazuh SIEM, MCP interface
  • Approaches compared: Direct-Prompt, ReAct, Self-Consistency, Self-Refine, Chain-of-Verification

Research digest

Key result

The finding: an agent closes a dangerous alert if its search came back "nothing found". The AIDA method lets you trust an agent with the "close or escalate" (hand off to a human) decision without worrying about a missed attack. The Strategist writes down a thesis before any criticism, the Adversary looks for holes in it from a separate context, and the Judge demands positive proof before closing. The model stops reinterpreting its own text. In investigations with empty searches, four of five standard approaches closed at least 88% of attacks.

Principle

Four roles and an append-only ledger. The Strategist decides what evidence is needed. The Executor searches and honestly writes "EMPTY" or "ERROR". The Strategist locks in a thesis: "close" or "escalate". The Adversary sees only the ledger and the thesis, without the Strategist's reasoning, and writes an objection. The Judge weighs everything against the evidence and either decides or sends it back for a new round with an exact list of what to collect. Why does this work? An empty result only means that this query found nothing. The agent reads it as "all clear". So the prompt states outright: an empty result is not proof of safety. For "escalate", plausible evidence is enough; for "close", you need confirmation of legitimacy. This is an asymmetric bar. It's needed because closing is irreversible: nobody will ever reopen a closed alert.

Why it works

The model is bad at checking itself. In the same context, it conforms to its own earlier text. The wild part: self-checking broke correct decisions several times more often than it fixed wrong ones. On top of that, before closing, the agent gathered no more evidence than before escalating, even though a closing error costs more. On the other hand, the model critiques someone else's thesis well. It also judges two claims well against recorded evidence. An Adversary without the baggage of someone else's reasoning finds holes the thesis author can't see. An append-only ledger keeps the third round from quietly rewriting the conclusions of the first. The Judge matters: without it, F1 (overall accuracy, where 1.0 is perfect) fell from 0.952 to 0.895.

When to apply

Security, finance, support → decisions that can't be undone: closing an alert, approving a payment, letting an order through. Especially when almost all cases are harmless and one dangerous case can easily get lost among them. Not a fit for cheap, reversible decisions: four roles and several rounds are overkill there. Also not a fit without data access: if the agent can't gather evidence, the Adversary and the Judge have nothing to stand on. The method's price: more cases go to human review (18.4% vs. 8.5–14% for other approaches). If analyst time is scarce, this is the bottleneck. Tested on a single attack scenario, mostly web reconnaissance.

Mini recipe

1. Find the irreversible decision: what in your process can't be undone. That's your "close" with a high bar. 2. Name the most expensive error: for example, a missed attack or an approved fraudulent payment. Write it into the orchestrator role. 3. Set up a ledger: entries can only be added. Format: `[round] [role] [type: query / result / thesis / objection / decision] [content]`. 4. Teach it to tell empty from clean: `Nothing found → write "EMPTY: what was searched, where, for what period". An empty result is not proof.` 5. Set the Judge's bar: for the safe option, suspicion is enough; for the irreversible one, positive proof is required. 6. Separate the contexts: in chat, run the Adversary and the Judge in a new window and give them only the ledger. In Claude Code, make them subagents. 7. Cap the rounds: after the limit, the case goes to a human. Tune the per-round query limit to the cost of an error and your token budget. 8. Quick start: paste the template into the chat and write `Adapt it to my task: [task]. Ask me questions to fill in the fields.`

Examples

[BAD]: `Check this alert: admin login to the store from Brazil at 3:12 a.m. If you don't find anything suspicious, close it.` [GOOD]: `You orchestrate the investigation of security alerts for an online store. Nobody will re-check a closed alert; missing an attack is the worst possible error. Work through the roles Strategist, Executor, Adversary, Judge and an append-only ledger. Record an empty search as "EMPTY: query, period"; it is not proof. The Adversary works in a separate context and sees only the ledger and the thesis. For "escalate", plausible evidence is enough. For "close", confirmation of legitimacy is required: a known VPN or the employee's work schedule. Alert: admin login, user {login}, IP {IP}, Brazil, 3:12 a.m. Eastern.` [BAD]: `Check this $25,000 payment. Double-check your answer and tell me if you're sure.` [GOOD]: `The Strategist writes a thesis on the payment: "approve" or "hold", citing ledger entries. The Adversary, in a new chat, gets only the ledger and the thesis and looks for where the thesis doesn't hold up. The Judge approves the payment only if there's positive confirmation: a known recipient or a match with the customer's history. The absence of anything suspicious doesn't count as confirmation.`

In plain words

Every LLM is blind to its own screwups for a fundamental reason: it confuses "I found nothing" with "there's no threat". If the model has already decided a late-night login is no big deal, it'll treat an empty log as proof it was right. Asking the model to double-check itself in the same window is a total flop, because it just bends the facts to fit its earlier answer. Ordinary self-checking breaks correct decisions more often than it fixes the blunders.

It's like assigning a burglary to a lazy cop who's itching to go on his lunch break. He glances into an empty closet, declares "nothing's missing", and when you ask him to look harder, he just rereads his own report and says: "I already checked everything". To catch the real thief, you need an angry prosecutor in a separate room who couldn't care less about the detective's authority.

The study's authors rolled out a fix: the AIDA framework. The logic is simple: the work is split among four roles. First, the Strategist gathers evidence and puts forward a working hypothesis. Then the Adversary in an isolated context steps in, whose only job is to tear the thesis to shreds and find the holes. The final word belongs to the Judge, who checks the arguments against an immutable investigation ledger that can only be appended to.

The system was road-tested on security alerts, but the principle is universal. It's critical for any triage: a suspicious Shopify admin login at 3:12 a.m., fraudulent refunds or shady payment transactions. Anywhere an incident closed by mistake turns into a hidden disaster, you can't trust a single agent: the system has to argue with itself.

Bottom line: forget prompts like "think again and fix it"; that's self-deception. If you want reliable autonomy from AI, split roles across separate contexts and pit them head to head. Either you spend pennies' worth of tokens on adversarial analysis, or later you get to explain to your customers where their data went.

AI lab assistant

Apply this study to your task

Describe what you're working on. AI takes the method and the measured results from this paper and adapts them to your case, or writes a ready prompt built on them.

Based on AIDA: an independent adversary and judge instead of self-checking — how to stop an agent from closing a case on an empty result arXiv:2610.10608

Sign in to apply this study New accounts get 50 free credits.