Hero title card per l'articolo 'Code Review Agent Benchmark' che mostra il titolo 'Code Review Agent Benchmark' con sottotitolo 'Come valutare un reviewer — ed eseguire c-CRAB sul tuo codice', un flusso in tre passaggi da PR a Review a Pass con card arrotondate, un motivo sottile di imbuto che si restringe e il logo OrcaRouter composito in basso a destra.
Guides & Insights

Benchmark dell'Agente di Code Review: Come Valutare un Revisore ed Eseguire c-CRAB sul Tuo Codice

Autore

Alistair Wren

Data di pubblicazione

Ultimi modelli · 20Vedi tutti i modelli
Benchmark: Artificial Analysis · aggiornato ogni giorno
Torna a tutti gli articoli

Come si fa a capire se un agente di revisione del codice è davvero valido? Per gran parte della breve storia di questo campo, la risposta era "misurare quanto i suoi commenti siano vicini a quelli di un revisore umano" — il che sembra ragionevole finché non lo provi davvero, perché due revisori possono segnalare lo stesso problema con parole completamente diverse. Il Code Review Agent Benchmark — il paper è arXiv:2603.23448, il suo dataset è c-CRAB — è il primo serio tentativo di valutare una revisione in base a ciò che produce metterla in pratica, piuttosto che in base alla sua formulazione. Ha convertito 234 commenti di revisione umani in test eseguibili, ha eseguito quattro revisori ampiamente utilizzati su di essi — PR-Agent, Devin, Claude Code e Codex — ed ha scoperto che tutti e quattro insieme superano il 41,5% di quei test, "solo circa il 40%" come dice lo stesso paper. Questa pagina è un manuale: come leggere quel risultato senza stravolgerlo, come eseguire c-CRAB da soli, e cosa fare quando il vostro codebase non è affatto nel benchmark.

Il numero nel titolo è la cosa meno utile di questa pagina. Le cose utili sono il metodo e le modalità di fallimento: perché ogni schema di valutazione precedente misurava la cosa sbagliata, quanto costa invece valutare una recensione con test eseguibili, e perché "gli agenti di revisione catturano solo il 40% dei bug" è una triplice lettura errata del risultato effettivo. Tutto ciò che c'è qui è una lettura comunitaria del benchmark pubblicato e dell'esperienza dei professionisti che lo eseguono — non indicazioni dei fornitori da parte dei produttori degli strumenti coinvolti.

Perché le metriche ovvie non funzionano

Prima di c-CRAB, le valutazioni degli agenti di revisione del codice rientravano in un piccolo numero di famiglie, e la tabella comparativa dell'articolo (Tabella 1) ne traccia la discendenza. La più antica è la sovrapposizione testuale — BLEU, ROUGE, chrF e affini, usati da benchmark come CodeReviewer e ContextCRBench. L'idea è che il commento di un agente sia buono quando i suoi n-grammi corrispondono a quelli di un umano. L'idea fallisce proprio nel tipo di caso che è ovunque nella revisione del codice: lo stesso difetto descritto con parole diverse.

Il case study dell'articolo è l'esempio più chiaro. In una pull request in python-telegram-bot (PR #3514), sia il revisore umano che Codex hanno segnalato lo stesso bug di robustezza nell'indicizzazione annidata. La revisione di Codex era comportamentalmente corretta — un agente di programmazione che vi si è basato ha prodotto una correzione che ha superato il test eseguibile. Eppure le metriche testuali le hanno assegnato BLEU-4 0.00, ROUGE-L 7.02, chrF 20.74 e similarità degli embedding 54.59. Zero sovrapposizione di n-grammi, e la revisione aveva ragione. Stessa preoccupazione, parole diverse: le metriche basate su stringhe non potevano vederla. La similarità degli embedding è un parziale passo avanti — 54.59 contro un passaggio confermato è ancora lontano da una soglia utilizzabile — ed eredita lo stesso problema in forma più attenuata.

LLM-as-judge, dove un modello confronta la recensione dell'agente con quella umana e vota, risolve il problema del vocabolario ma ne introduce tre nuovi, che il documento nomina direttamente: bias, instabilità e sensibilità al design del prompt. Esegui lo stesso confronto due volte e un giudice può darti verdetti diversi; riformula il prompt di giudizio e le classifiche si spostano. Quando scegli tra due revisori che distano tre punti sullo stesso benchmark, un giudice con quella varianza non può sostenere una decisione — e un punteggio che non puoi riprodurre non è un punteggio.

Cosa compra un oracolo eseguibile — e quanto costa

L'idea su cui si basa c-CRAB è allo stesso tempo semplice e radicale: invece di chiedersi "la recensione sembra scritta da un essere umano?", chiediti "se agisci in base alla recensione, il codice viene corretto?". Ogni commento di recensione umana conservato viene convertito in un test eseguibile che cattura il problema sottostante. Un commento di recensione è considerato corretto se agendo su di esso si ottiene una correzione comportamentalmente corretta che fa superare il test — e ogni istanza include un ambiente Docker eseguibile, quindi "fa superare il test" è un fatto, non un giudizio.

Il documento definisce due tipi di test. I test comportamentali "importano ed eseguono il codice testato a runtime", invocando funzioni "con input specifici" e verificando "output o eccezioni". I test strutturali "ispezionano il testo del codice sorgente, confrontano pattern e controllano le superfici API per determinare se le modifiche desiderate al codice sono state apportate". La suddivisione finale è di 42 test comportamentali (17,9%) e 192 strutturali (82,1%) — e questa disparità merita una frase onesta: la maggior parte di questo oracle è un confronto di pattern sul testo del codice, non l'esecuzione dello stesso. Lo standard aureo è il test comportamentale; la maggior parte del dataset ne è la versione pragmatica.

Costruire l'oracolo è un imbuto a quattro fasi, e ogni fase butta via qualcosa:

• Dataset iniziale — 671 PR, 1.313 commenti di revisione.

• Filtraggio delle revisioni — 410 PR, 595 commenti. Un classificatore LLM, calibrato su un gold set di 100 commenti annotati manualmente, mantiene solo i problemi oggettivamente verificabili e scarta i feedback conversazionali o soggettivi.

• Costruzione dell'ambiente eseguibile — 410 PR, 595 commenti. Un'immagine Docker per ogni PR, con risoluzione delle dipendenze che ricade su un agente di codifica quando l'automazione fallisce.

• Conversione di commenti NL in test — 339 PR, 481 commenti. Generato con GPT-5.2 sotto un ciclo di raffinamento guidato dall'esecuzione (fino a tre tentativi); un test viene mantenuto solo se fallisce sulla versione precedente e passa su quella successiva.

• Validazione con un agente di codifica — 184 PR, 234 commenti (finale). Claude Code su un backend Sonnet-4.6 cerca di correggere il codice basandosi solo sul commento di revisione umano; i casi in cui non riesce a far passare il test vengono scartati.

Infographic of the c-CRAB curation funnel with four descending wide bars: Initial dataset — 671 PRs / 1,313 comments; After review filtering — 410 PRs / 595 comments; After test generation — 339 PRs / 481 comments; Validated — 184 PRs / 234 comments, with a footer 'About 27% of starting PRs survive · Source: arXiv:2603.23448', and the OrcaRouter logo composited bottom-right.

Circa il 27% delle pull request iniziali sopravvive. Dillo chiaramente, perché è il prezzo onesto di un oracle basato su test: se un commento non è abbastanza azionabile da diventare un test fallito, o l'ambiente non può essere costruito, o un agente di codifica competente non può correggere il codice dal solo commento, l'istanza viene scartata. È anche il motivo per cui il benchmark è piccolo. 184 istanze di PR e 234 commenti validati sono un dataset che puoi leggere, non un corpus in cui annegare — e per un oracle che deve eseguire ambienti Docker reali, la piccolezza è una caratteristica.

Per dare un'idea della scala: un'istanza media tocca 418.1 righe modificate, i test hanno una media di 31.8 righe e ci sono 1.27 test per istanza. Due annotatori sono stati d'accordo l'84% delle volte — su oltre 50 istanze campionate — sul fatto che un test generato rispecchiasse fedelmente la preoccupazione del revisore umano.

Un neo bibliografico che inevitabilmente noterai se vai a leggere l'articolo: la tabella del dataset (Tabella 4) elenca 67 repository, mentre la sezione Threats to Validity riporta "184 istanze di pull request con 234 oracoli verificabili su 56 repository". L'articolo fornisce entrambe le cifre in punti diversi e non le riconcilia. Non sceglierne una preferita e non farne la media: cita ciascuna dove compare. Discrepanze come questa sono esattamente il dettaglio che i lettori usano per decidere se un benchmark merita il loro tempo.

Per la due diligence sull'indipendenza: il documento dichiara che uno degli autori è affiliato a SonarSource e afferma che i risultati non devono essere interpretati come "una valutazione della qualità dei prodotti SonarSource." Questa è la loro dichiarazione di non responsabilità, citata piuttosto che parafrasata.

Come leggere uno spartito su c-CRAB senza citarlo male

La metrica principale è il tasso di superamento: per ogni istanza, la percentuale dei test di quella PR che vengono superati, calcolata come media sulle 184 istanze. Ecco la tabella completa dei risultati dell'articolo, una riga per revisore. La riga relativa agli umani è un indicatore di scala più che un concorrente — gli umani hanno scritto l'oracolo, quindi ottengono il 100% per costruzione:

Scoreboard of the c-CRAB results titled 'c-CRAB results — the scoreboard': Claude Code 32.1%, Devin 24.8%, PR-Agent 23.1%, Codex 20.1%, Union of all four 41.5%, Human 100% by construction, with a footer reading 'Pass rate = average share of a PR's executable tests that pass · Source: arXiv:2603.23448', and the OrcaRouter logo composited bottom-right.

• Claude Code — 1.336 commenti, 7,3 per PR, complessivamente 32,1% (comportamentale 38,1%, strutturale 30,7%).

• Devin — 1.344 commenti, 7,3 per PR, complessivamente 24,8% (comportamentale 31,0%, strutturale 23,4%).

• PR-Agent — 524 commenti, 2.8 per PR, complessivamente 23.1% (comportamentale 38.1%, strutturale 19.8%).

• Codex — 324 commenti, 1,8 per PR, complessivamente 20,1% (comportamentale 38,1%, strutturale 16,1%).

• Umano — 234 commenti, 1.3 per PR, 100% per costruzione.

Tre correzioni, perché il "solo circa il 40%" dell'abstract è il numero più citato male in questo angolo della conversazione sugli AI-coder in questo momento. Primo, il dato del 41,5% — 97 dei 234 test superati da almeno uno strumento — è un'unione su tutti e quattro i revisori: un test conta una volta se un qualsiasi agente lo ha superato. Nessun singolo agente ha ottenuto il 41,5%; il miglior punteggio singolo è il 32,1% di Claude Code. Secondo, la riga degli umani è l'oracolo, non una concorrente; ripeterla come "gli umani battono i bot" è un errore di categoria. Terzo, e più importante: c-CRAB non dà alcun credito per un problema valido che il revisore umano non ha mai sollevato. L'oracolo è l'intento della revisione umana. Un agente che trova un vero bug che nessuno ha menzionato ottiene zero punti per quello. Quindi "gli agenti di revisione AI catturano solo il 40% dei bug" è sbagliato tre volte — è un'unione, non è un tasso di cattura dei bug, e misura la concordanza con i revisori umani, non la correttezza totale.

Il volume dei commenti è la trappola

Il numero più interessante nei risultati non è il vincitore. Claude Code e Devin hanno pubblicato ciascuno più di 1.300 commenti — circa 7,3 per PR — raggiungendo rispettivamente il 32,1% e il 24,8%. Codex ha pubblicato 324 commenti, circa 1,8 per PR, raggiungendo il 20,1%. Il riferimento umano è di 1,3 commenti per PR. Il volume non è copertura: circa cinque volte il numero di commenti frutta ben meno del doppio del tasso di superamento. Se stai scegliendo un revisore, il costo reale di tutti quei commenti extra è l'affaticamento della revisione umana — ogni commento pubblicato da un agente è una valutazione che una persona deve smistare.

La conclusione sull'utilità va nella direzione opposta, ed è l'elemento che impedisce a questa storia di essere un banale "i bot fanno rumore". Gli autori hanno ispezionato manualmente 92 commenti su 6 PR e ne hanno giudicato utili l'84% (77/92) — PR-Agent 94%, Codex 88%, Devin 85%, Claude Code 78%. Quindi la maggior parte dei commenti che non superano il test non è rumore; riguardano qualcosa che il revisore umano non ha sollevato. Il campione è piccolo — 92 commenti, 6 PR — e vale la pena dirlo insieme alle percentuali.

Ciò di cui le due parti parlano effettivamente spiega la forma dei risultati. I revisori umani erano orientati verso manutenibilità, design e documentazione; gli strumenti verso robustezza, testing e gestione degli errori. L'articolo interpreta questo come un argomento a favore della collaborazione uomo-agente piuttosto che della sostituzione — ed è anche la migliore spiegazione disponibile per cui i punteggi sembrano bassi. Un revisore che è brillante sui casi limite ma silenzioso sul design mancherà sistematicamente le categorie che gli esseri umani segnalano, e l'oracolo è costruito interamente sulle segnalazioni umane.

Chi ha lavorato su questo percorso arriva allo stesso punto. Un'analisi dettagliata di Daniel Vaughan, che chiama il lavoro CR-bench, giunge alla stessa conclusione e lo trasforma in un flusso di lavoro: affidare all'agente la verifica di robustezza e correttezza, riservare agli esseri umani design, convenzioni e architettura — le categorie in cui gli agenti ottengono i risultati peggiori — e guidare l'agente con istruzioni di revisione che menzionino le categorie deboli. Il suo avvertimento più utile per chiunque legga la classifica: «l'utilità non equivale al tasso di superamento», perché la suite di test richiede di corrispondere alla correzione intesa dall'umano, e una correzione alternativa valida fallisce il test. Il percorso dal 20% a un punteggio significativamente più alto, secondo la sua lettura, non è un aggiornamento del modello: è un lavoro di configurazione.

Eseguire c-CRAB da soli

Tutto ciò che precede riguarda la lettura dei risultati altrui. Il pacchetto di replica rende eseguibile il benchmark — si trova all'indirizzo c-CRAB-Benchmark/dataset su GitHub — e il README è onesto riguardo a ciò che richiede.

Requisiti: code>uv sync/code>; Docker; e una tra code>OPENAI_API_KEY/code> o code>ANTHROPIC_API_KEY/code> (Claude Code legge inoltre le credenziali da code>~/.claude/.credentials.json/code>, che viene montato nei contenitori per impostazione predefinita). La struttura è composta da cinque directory: code>pipeline//code> (logica della pipeline e prompt), code>execution//code> (costruttori di immagini Docker e helper di runtime), code>results_preprocessed//code> (il sottoinsieme del benchmark rilasciato), code>results_pipeline_funnel//code> (i file JSONL da stage0 a stage4 e il riepilogo del funnel) e code>raw_results_compressed//code> (output grezzi degli esperimenti). I cinque passaggi, in ordine:

1. Costruisci gli ambienti Docker — code>uv run python -m execution.build_swe_care --split test --instance results_preprocessed/instance-ids.txt --max-workers 4/code>. Le immagini precompilate sono pubblicate anche sotto l'organizzazione GitHub Packages di c-CRAB-Benchmark, se preferisci saltare la build.

2. Genera i test — code>./run_testgen_full.sh --instances-file results_preprocessed/instance-ids.txt --workers 4 --output-dir results_testgen/code>.

3. Raccogli le revisioni di base — code>uv run python run_batch_baselines.py --split test --instances-file results_preprocessed/instance-ids.txt --tools pr-agent devin claude-code codex --output-dir baselines_output --workers 4/code>. Configura le credenziali dello strumento esterno corrispondente prima di questo passaggio.

4. Esegui la risoluzione dell'agente — code>uv run python run_batch_agent_resolution.py --stage3-file results_pipeline_funnel/stage3_testgen_verified.jsonl --testgen-dir results_testgen --output-dir results_agent_resolution --workers 4/code>.

5. Valuta — ripeti una volta per strumento: code>uv run python run_batch_tool_eval.py --tool pr-agent --stage3-file results_pipeline_funnel/stage3_testgen_verified.jsonl --testgen-dir results_testgen --tool-results-dir baselines_output --output-dir results_eval_pr-agent --workers 4/code>.

Screenshot of the c-CRAB-Benchmark/dataset GitHub repository page: the repo header (c-CRAB-Benchmark/dataset, Public, 11 stars, 2 forks) and the top-level directory listing showing the pipeline directories execution, pipeline, raw_results_compressed, results_pipeline_funnel and results_preprocessed.

Due cose che il README non menziona. Aggiungere un quinto revisore significa modificare code>run_batch_baselines.py/code> — è lì che risiedono i prompt di revisione baseline per ciascuno strumento, e non esiste un'interfaccia per plugin; il README non documenta alcun punto di estensione più pulito. Inoltre, il repository non contiene alcun file di licenza esplicito, quindi non dare per scontato che il codice sia MIT o Apache — il paper è CC BY 4.0, e i termini del codice stesso non sono dichiarati.

Il costo è l'altra voce non pubblicizzata. L'articolo non pubblica cifre in token o dollari per l'esecuzione della pipeline, quindi considera qualsiasi cifra di costo citata online come non verificata. Ciò che la struttura implica è abbastanza chiaro: un'immagine Docker per PR su 184 istanze, più un passaggio di risoluzione dell'agente di codifica e un passaggio di valutazione per strumento. Non è un pomeriggio da laptop: metti in conto una seria potenza di calcolo.

Quando non puoi permetterti oracoli eseguibili

La posizione onesta della maggior parte dei team è: il benchmark ha ragione quando afferma che un giudice LLM non può valutare le review, ma costruire un oracolo basato su test per le proprie PR è uno sforzo non da poco. La distinzione che vale la pena fare è tra un giudice LLM come valutatore e un giudice LLM come filtro. Il fatto che c-CRAB rifiuti il giudice come oracolo non rende un giudice inutile all'interno di un reviewer: un giudice che raggruppa i risultati duplicati e scarta quelli deboli può comunque aumentare la precisione. La modalità di fallimento contro cui progettare è l'indipendenza.

Un giudice eseguito sul modello del recensore è d'accordo con sé stesso: legge la recensione, la trova plausibile e segnala un successo senza cambiare nulla. Un giudice di un altro fornitore riduce quell'autoconcordanza — non trasforma il giudice in un test, ma ferma il timbro di gomma. Possiamo mostrarti un esempio concreto e verificabile di esattamente questa salvaguardia, perché il nostro stesso harness è aperto: Orca-Code-Review su GitHub è con licenza MIT, e la sua ricetta di routing enuncia la regola con le parole del repository — il giudice "NON DEVE NOMINARE IL MODELLO PREDEFINITO," perché "sul modello del recensore è d'accordo con sé stesso, quindi il passaggio diventa inerte pur continuando a segnalare successo." L'Action non nomina mai un modello; è la ricetta a deciderlo. Nella configurazione prevista, il default del recensore è deepseek/deepseek-v4-flash-0731, e una regola che corrisponde all'header code>x-cr-lens: judge/code> invia il passaggio del giudice a z-ai/glm-5.3 — un fornitore diverso. Questo è un parallelo progettuale con l'argomentazione di c-CRAB, non un risultato: non siamo nel benchmark e non esiste un punteggio c-CRAB per il nostro recensore. Ma è la mitigazione pratica disponibile a chiunque non possa costruire oracoli eseguibili, ed è economica quando giudice e recensore possono trovarsi su provider diversi dietro un'unica chiave — ed è esattamente a questo che serve un router. Su OrcaRouter il recensore e il suo giudice sono due righe in un DSL di routing, e paghi il prezzo di listino del provider senza alcun margine.

Quando il tuo codice non è nel benchmark

184 PR in 56 o 67 repository pubblici non sono il tuo codebase, e non lo sarebbero mai stati. La parte trasferibile è il metodo, e puoi applicarlo alla tua storia a scala molto più ridotta. Prendi le PR che sono state mergiate e hanno ricevuto commenti di revisione umani. Per un campione di quei commenti, scrivi un test che fallisce prima che la revisione venga applicata e passa dopo — la proprietà “fallisce-poi-passa” è l’intero gioco. Esegui il tuo reviewer candidato sulla diff pre-revisione. Poi verifica se dare seguito ai suoi commenti fa passare il test. Quello che ottieni è un numero calcolato sul codice che effettivamente distribuisci, che vale più di una posizione in classifica. Il costo è esattamente il muro contro cui si è scontrato l’articolo: hai bisogno di ambienti riproducibili per ogni PR, perché un test che passa solo sul tuo portatile non è un oracolo.

Non hai bisogno di 234 test. Una dozzina di test ben scelti su PR su cui il tuo team ha effettivamente discusso ti dirà più del tuo reviewer di quanto farà un punteggio di benchmark. E un'analisi pratica parallela di questa famiglia di benchmark è schietta riguardo al gate: la precisione del classificatore LLM nel determinare se un commento è un problema valido e verificabile si attesta tra il 66% e l'85%, quindi tratta il filtraggio automatico come una shortlist e mantieni un passaggio di arbitraggio umano prima che qualsiasi cosa diventi un test. Lo stesso rapporto nota che ReviewBench di LangChain, costruito indipendentemente sulla stessa idea da commento a test, recupera al massimo circa il 30% dei suoi problemi di base — lo stesso ordine di grandezza del 20–32% di c-CRAB, e un promemoria che le differenze a una cifra nelle classifiche tra strumenti sono spesso più piccole del rumore nella tua stessa configurazione.

Se stai decidendo se acquistare uno strumento di review, quella è un'altra domanda: la nostra guida all'acquisto per agenti di code review copre il confronto bot contro agente, i prezzi per postazione contro per token e quando l'hosting autonomo conviene — e una volta che ne hai uno, il costo di esecuzione di un harness di review su ogni push è trattato nel nostro spiegatore sulla code review automatizzata. Questa pagina riguarda solo la misurazione, e il pezzo complementare a questa esamina l'anatomia del benchmark: l'imbuto di costruzione, le statistiche del dataset e la tabella completa dei risultati.

Domande frequenti

Il 41,5% è il punteggio migliore dell'agente? No. Il 41,5% è l'unione di tutti e quattro gli strumenti: un test viene conteggiato una volta se uno qualsiasi di essi lo supera. Il miglior punteggio singolo è il 32,1% di Claude Code.

c-CRAB misura quanti bug un revisore individua? No. Misura quanto bene una revisione corrisponde a ciò che un revisore umano ha segnalato, convertito in test eseguibili. Un difetto reale mai menzionato dal revisore ottiene zero, per quanto valido sia.

I revisori umani hanno "battuto" i bot?La riga 100% umana è l'oracolo stesso — i test sono stati scritti dagli esseri umani — quindi è un indicatore di scala, non un concorrente.

c-CRAB è la stessa cosa di CR-bench? Sì. Il dataset è c-CRAB; alcune fonti terze lo chiamano CR-bench, ma qui c'è un solo benchmark.

Quanto costa eseguirlo? L'articolo non riporta cifre sui costi. Un'immagine Docker per PR su 184 istanze, più un passaggio di risoluzione dell'agente, implica una potenza di calcolo reale — non un pomeriggio su un laptop.

Il risultato finale

Il contributo di c-CRAB non è la classifica — è la dimostrazione che una review può essere valutata eseguendo i suoi consigli, e che gli schemi basati su similarità testuale e su giudici LLM che erano venuti prima valutavano la cosa sbagliata. Se devi portare via una sola cosa, che sia la correzione in tre parti: 41,5% è un'unione, la riga umana è l'oracolo, e il benchmark non dà alcun merito per difetti che gli umani non hanno mai sollevato. E se vuoi un numero su cui agire, il metodo si trasferisce — test fail-then-pass sulle tue PR unite, un passaggio di giudizio umano e, se non puoi costruire oracoli eseguibili, almeno un giudice il cui modello sia indipendente da quello del reviewer.

Se preferisci misurare un revisore piuttosto che discuterne, parti da un harness che puoi leggere. OrcaCode Review esegue una passata di revisione più un giudice di verifica indipendente, per token anziché per postazione, e ogni prompt al suo interno è pubblico — così puoi puntarlo a un benchmark come questo e ottenere il tuo numero invece del nostro.

Confrontati in questo articolo1

Rilevato da questo articolo · Benchmark: Artificial Analysis · aggiornato ogni giorno

© 2026 OrcaRouter

Per i provider

Gestisci una piattaforma di inferenza? Porta i tuoi modelli su OrcaRouter.

providers@orcarouter.ai

Unisciti alla community

Discordsupport@orcarouter.aiXGitHubYouTube