Se avete letto il post sugli agenti disfunzionali, conoscete già la storia. Stavo sviluppando CarePlatform con cinque agenti AI in ruoli espliciti: PM, Developer, QA, Security, UX. Le prime otto iterazioni sembravano filare lisce. I task venivano contrassegnati come completati. I test salivano: 35, 92, 200. Tutto sotto controllo. Solo che non lo era.
L’activity logging era contrassegnato come effettuato. Il trait LogsActivity non era mai stato applicato a nessun modello. QA non aveva segnalato nulla. Security non aveva alzato la mano. L’equivalente digitale di installare un antifurto senza collegare i sensori.

Da quel momento ho iniziato a riscrivere i prompt introducendo l’adversarial verification esplicita: ogni agente doveva sfidare il lavoro degli altri, fornire evidenza concreta per ogni claim e ricevere uno scrutinio proporzionato alla propria storia di falsi positivi. Ha funzionato, nel senso che i bug emergevano prima di arrivare in produzione.
Il problema è che quel metodo viveva nei prompt. Ogni progetto nuovo richiedeva di ricostruirlo da zero, di ricordarsi di inserirlo, di sperare di non dimenticare uno dei domini critici. Un approccio efficace ma non trasferibile.
adversarial-verify è un tentativo di renderlo trasferibile.
Cosa fa, concretamente
La skill applica la metodologia Chain-of-Verification (CoV) di Dhuliawala et al. (2023) combinata con tecniche che vengono dalla ricerca sull’alignment degli LLM — un campo che, a prima vista, sembra lontano dalla code review ma che condivide un problema fondamentale identico: come fai a trovare comportamenti problematici che il sistema non ha nessun incentivo a dichiararti?
Abstractive Red-Teaming — invece di cercare singoli bug, cerca pattern ricorrenti di errore nell’intero codebase. Nei paper di Anthropic, questa tecnica (Rahn et al., 2026) viene utilizzata per individuare categorie di query che elicitano violazioni di carattere nei modelli linguistici; ho analizzato i comportamenti osservati e li ho utilizzati come ispirazione per estendere il concetto al dominio della code review. La logica di fondo è la stessa: non cercare istanze singole, ma classi di situazioni in cui i problemi emergono sistematicamente.
Hidden Behavior Probing — rileva comportamenti che il codice non dichiara, tracciando i path di esecuzione effettivi anziché quelli previsti. Se una funzione dice di fare X ma, in certi contesti, fa Y, la skill lo riconosce.
Modular Adversarial Scaffold — modella ciò che un reviewer umano non noterebbe e cerca proprio lì. Ispirata direttamente all’approccio di AuditBench (Anthropic, 2026), che costruisce benchmark su comportamenti nascosti che i modelli sono addestrati a non rivelare quando gli si chiede direttamente. Anche qui il trasferimento non è letterale ma di principio: un reviewer umano ha gli stessi punti ciechi di un agente AI che ottimizza per la plausibilità locale.
I cinque domini verificati:
- Codice: data corruption silenziosa, race condition, state leak
- Architettura: spec drift, vincoli mancanti, breaking changes
- Dati: schema inconsistenti, migration distruttive
- Documentazione: istruzioni obsolete, API drift, esempi rotti
- Output AI: allucinazioni, bias cognitivi, cherry-picking delle evidenze
Quest’ultimo dominio è quello che trovo più onesto sul piano intellettuale. Quando adversarial-verify verifica gli output di altri agenti, controlla specificamente sycophantic deference, anchoring bias, confabulated confidence e premature convergence — esattamente ciò che il mio QA stava facendo prima che introducessi le dinamiche narrative: diceva ciò che si aspettava di dover dire, non ciò che aveva davvero verificato.
I bug concreti che ha intercettato su Rainbow Climb
Rainbow Climb è un platformer verticale procedurale per Android scritto in Kotlin con libGDX: generazione a chunk infinita, 8 biomi, 6 tipi di nemici, un sintetizzatore PCM custom che genera musica elettronica in tempo reale. Il tipo di codebase in cui i sistemi generativi interagiscono tra loro in modi che, per definizione, nessun test unitario può coprire completamente, perché la combinazione di stati è, per costruzione, infinita.
Quando ho applicato adversarial-verify a questo progetto, ha individuato tre bug critici quasi subito.
Timer mai resettati. Una funzione del game loop non resettava il timer tra un livello e l’altro in alcuni percorsi di esecuzione del generatore procedurale. Il test passava perché verificava il caso di transizione normale. Il bug emergeva solo nelle sequenze di biomi specifici in cui il timing di generazione creava una race condition con il sistema di difficoltà (che applica una scala del +0,2% per livello in modo compounding). adversarial-verify ha tracciato un path alternativo e ha trovato lo stato sporco.
Collisioni con il bounding box a 0x0. Un componente inizializzava le bounding box a dimensioni nulle durante il caricamento rapido dei chunk — una condizione che si verifica quando il giocatore sale rapidamente attraverso le piattaforme generate dal sistema rainbow. La collision detection sembrava funzionare, ma in quelle condizioni di carico funzionava male.
Shield che bloccavano i check successivi. Il power-up Shield interrompeva la catena di verifica prima che altri controlli di stato si completassero. I test unitari non coprivano l’interazione tra il sistema di protezione e quello di collisione con i nemici, poiché erano stati sviluppati e testati in modo isolato.
Nessuno di questi era un bug evidente. Erano tutti nel territorio che l’adversarial verification aveva imparato a monitorare dopo settimane di iterazioni con gli agenti: le interazioni tra componenti che ciascun agente aveva dichiarato “ok”, senza che nessuno avesse verificato l’interfaccia tra di esse.
Come installarla
La skill è compatibile con Claude Code, Cursor, Windsurf, Cline e con tutti gli IDE che supportano il formato Agent Skills.
Opzione 1 — Installazione diretta:
git clone https://github.com/fullo/claude-adversarial-skill.git
cp -r claude-adversarial-skill/skills/adversarial-verify ~/.claude/skills/
Opzione 2 — Installate il marketplace dei miei plugin
claude marketplace add fullo-plugins https://github.com/fullo/claude-plugins-marketplace
claude plugin install adversarial-verify@fullo-plugins
Una volta installata, /adversarial-verify in Claude Code, oppure in linguaggio naturale: “run an adversarial review on my recent changes” o “verifica questo codice con scetticismo totale”.
La domanda che rimane aperta
Rilasciare questa skill mi ha fatto tornare su una questione che avevo lasciato sospesa nel post precedente: il fatto che io abbia dovuto introdurre una verifica adversaria esplicita per ottenere qualità da parte degli agenti AI dice qualcosa di interessante.
Non è solo un pattern di prompt engineering. È un segnale che questi sistemi, lasciati a se stessi, ottimizzano per la plausibilità locale più che per la correttezza verificabile. adversarial-verify non risolve questo limite strutturale: lo aggira sistematicamente, codificando in uno strumento riutilizzabile ciò che, nell’esperimento con gli agenti, era un processo costruito iterazione per iterazione.
Il test su codebase diversi da CarePlatform — in particolare Rainbow Climb, che non ha alcuna storia condivisa con gli agenti che hanno generato il PROCESS.md — mi ha dato un segnale incoraggiante: la skill identifica problemi anche senza la “memoria” dei fallimenti che l’hanno generata. I pattern di errore che cerca sono sufficientemente generalizzabili da funzionare in contesti nuovi. Ma ho un campione di due progetti e non è statisticamente significativo.
Se la usate su altri codebase, sono molto curioso di sapere cosa trovate e cosa non funziona.
Repo: github.com/fullo/claude-adversarial-skill — Licenza MIT.
Questo articolo è il terzo di una serie. Il primo: Il paradosso del cervello aumentato. Il secondo: Agenti disfunzionali, software funzionante.
Riferimenti: Dhuliawala et al., Chain-of-Verification Reduces Hallucination in Large Language Models, arXiv:2309.11495, 2023 · Rahn et al., Abstractive Red-Teaming of Language Model Character, arXiv:2602.12318, Anthropic 2026 · AuditBench: Evaluating Alignment Auditing Techniques, Anthropic Alignment Science Blog, 2026