claude plugin eval esegue il tuo plugin rispetto a una suite di casi di test e valuta i risultati. Ogni caso è un prompt realistico più uno o più valutatori. Un valutatore è un controllo pass/fail su ciò che Claude ha prodotto, come un’espressione regolare sulla risposta, se uno strumento particolare è stato chiamato, o una rubrica che un secondo modello giudica rispetto alla risposta.
Non devi scrivere la suite manualmente. claude plugin eval init ti pone domande sul tuo plugin, propone i casi e i valutatori, li prova e scrive i file. Puoi anche chiedere a Claude di fare lo stesso da una sessione che hai già aperto.
Usa evals per:
- Misurare quanto affidabilmente il tuo plugin porta Claude a produrre il risultato corretto
- Rilevare regressioni quando modifichi il plugin o viene rilasciato un nuovo modello
- Vedere quale contributo apporta il plugin rispetto a nessun plugin
evals/evals.json, e nessuno dei due strumenti legge i file di caso dell’altro. Per creare un plugin, vedi Creare un plugin; per controllare i file di un plugin per errori di sintassi e schema piuttosto che il suo comportamento, usa claude plugin validate.
Ogni esecuzione di eval e ogni valutatore giudice è una vera chiamata al modello sul tuo account, conteggiata rispetto all’utilizzo del tuo piano o alla tua fattura API, quindi controlla prima i requisiti. Quindi crea la tua prima suite di eval, oppure vai a Eseguire evals nella CI se ne hai già una.
Requisiti
Per eseguire plugin evals hai bisogno di:- Claude Code v2.1.269 o successivo. Esegui
claude --versionper controllare eclaude updateper aggiornare. - Git 2.31 o successivo, se git è installato. Esegui
git --versionper controllare. Con una versione più vecchia di git,claude plugin evalsi ferma prima di eseguire qualsiasi caso. Senza git, viene eseguito normalmente. - Una directory di plugin con un manifesto
plugin.jsono.claude-plugin/plugin.json, o un plugin skills-directory. - La stessa autenticazione e provider di modello che le tue normali sessioni Claude Code utilizzano. Le esecuzioni di eval, i grader valutati da judge, e
claude plugin eval initchiamano il modello con le tue credenziali, quindi contano rispetto ai tuoi limiti di utilizzo del piano o alla tua fattura API. Quando il comando riporta un costo, la cifra è una stima del prezzo di listino di quelle chiamate. Se esegui Claude Code su Amazon Bedrock, Google Cloud’s Agent Platform o Microsoft Foundry, esegui la suite da una shell che esporta le stesse variabili del provider delle tue normali sessioni, perché ogni esecuzione le eredita da quella shell come descritto nel campoenv.
Come funziona un’esecuzione di eval
Una suite di eval vive in una directory chiamataevals/ dentro il tuo plugin, organizzata come mostra Scrivere e perfezionare i casi. Ogni caso è la sua sottodirectory con un prompt e uno o più grader. Il prompt è qualcosa che una persona che usa il tuo plugin potrebbe digitare, come una richiesta che una delle sue skill dovrebbe gestire.
Cosa succede in un’esecuzione
Per ogni esecuzione di un caso, Claude Code avvia una sessione fresca, isolata non-interattiva con solo il tuo plugin caricato, invia il prompt, e lascia che Claude lavori finché non finisce o non raggiunge il limite di turni o tempo del caso. Ogni grader quindi controlla la risposta finale, la trascrizione, o un file che Claude ha creato, e passa o fallisce.Come viene valutato un caso
Un’esecuzione di un agente non deterministico ti dice poco, quindi ogni caso viene eseguito tre volte per impostazione predefinita. Il punteggio di un’esecuzione è la frazione dei suoi grader che hanno passato, ponderata se imposti pesi, e il punteggio del caso è la media tra le sue esecuzioni. Un caso passa quando il suo punteggio soddisfa la--threshold, 1.0 per impostazione predefinita. Nelle chiamate di modello, una suite fa approssimativamente casi × esecuzioni esecuzioni di agenti con il plugin e altrettante per la baseline senza plugin, più tre brevi chiamate judge per grader llm o baseline per esecuzione.
La baseline senza plugin
Un punteggio alto di per sé non ti dice se il plugin ha aiutato, perché Claude potrebbe fare altrettanto bene senza di esso. Per separare i due, le esecuzioni di ogni caso vengono ripetute senza plugin caricato, e ottieni due punteggi,WITH e W/OUT. La loro differenza, Δ, è quello che il plugin ha contribuito. Se un caso ottiene 1.0 sia con che senza il plugin, il plugin non è quello che l’ha fatto passare.
I due set di esecuzioni sono chiamati with-arm e without-arm; Confrontare con una baseline senza plugin copre quali casi eseguono solo il with-arm e come i grader vengono valutati tra i due arm.
Crea la tua prima suite di eval
Questa procedura scrive un caso per il tuo plugin, lo esegue, e legge il risultato. Prima di iniziare, assicurati di avere:- Claude Code v2.1.269 o successivo e gli altri requisiti
- Un terminale aperto nella directory root del tuo plugin, quella che contiene
plugin.jsono.claude-plugin/plugin.json - Una skill nel plugin che vuoi testare, e una richiesta che un utente digiterebbe che dovrebbe attivarla
1
Crea i casi
Dalla root del plugin, esegui:Se Claude Code non ha già fiducia in questa directory, prima chiede
Trust this plugin directory?; rispondi y.Si apre quindi una sessione Claude Code interattiva. Claude legge il tuo plugin e ti chiede quale sia un buon risultato, propone prompt che dovrebbero e non dovrebbero attivare il plugin, progetta grader per ognuno, li esegue una volta come prova per controllare che si comportino correttamente, e scrive una directory di caso per prompt sotto evals/, ognuna denominata dal suo prompt.Quando Claude ti dice che la suite è pronta, esci da quella sessione con /exit o Ctrl+D per tornare alla tua shell.Se hai già una sessione Claude Code aperta nella root del plugin, puoi invece chiedere lì a Claude di eseguire claude plugin eval init. Claude esegue il comando e poi ti pone le stesse domande in quella conversazione.Se preferisci scrivere un caso tu stesso per vedere esattamente cosa contengono i file, segui Scrivi un caso a mano e torna qui per eseguirlo.2
Esegui la suite
Di nuovo alla tua shell nella root del plugin, esegui ogni caso sotto Hai già dato fiducia a questa directory durante il passaggio 1, quindi l’esecuzione inizia immediatamente. Se hai scritto il caso a mano invece, l’esecuzione prima chiede
evals/:Trust this plugin directory? [y/N]; rispondi y. Cosa un’esecuzione può accedere spiega a cosa stai acconsentendo.Ogni caso viene eseguito tre volte con il tuo plugin e tre volte senza, quindi un caso è sei esecuzioni. Una linea di progresso viene stampata mentre ogni esecuzione finisce, con il punteggio di quella esecuzione e il verdetto di ogni grader.3
Leggi il riepilogo
Quando la suite finisce vedi una tabella di riepilogo, seguita da dove è andato il rapporto:
WITH è il punteggio del caso con il tuo plugin caricato, W/OUT è il punteggio senza di esso, e un Δ positivo significa che il plugin ha aumentato il punteggio. COST è una stima del prezzo di listino delle chiamate al modello, e NOTES mostra la spiegazione del grader con il peso più alto che fallisce, o l’errore dell’esecuzione, dal with-arm.4
Apri il rapporto e itera
Apri l’URL Sostituisci
Published:, o il percorso Report: quando non appare una linea Published:, per vedere il verdetto di ogni grader e la spiegazione per ogni esecuzione, e per i grader llm i voti del judge e l’estratto che ha valutato. La linea Published: appare solo quando il tuo account può pubblicare rapporti.Il primo risultato più comune è un Δ vicino a zero con il grader tool_used: Skill del caso che fallisce, il che significa che Claude non sta scegliendo la tua skill sulla formulazione naturale. Regola la description della skill, esegui di nuovo claude plugin eval ., e confronta.Per iterare su un caso con meno esecuzioni, esegui un singolo arm una volta. Un’esecuzione singola è rumorosa, quindi conferma qualsiasi modifica alle tre esecuzioni predefinite prima di fidarti. Con un arm la tabella mostra colonne SCORE e PASS% invece di WITH, W/OUT, e Δ:<case-name> con uno dei nomi di directory sotto evals/.Scrivi e perfeziona i casi
I casi checlaude plugin eval init scrive sono file semplici che puoi aprire, modificare e aggiungere. Un caso è una directory sotto la directory eval del plugin che contiene un prompt.md, un case.yaml, o entrambi. Dai a ogni caso almeno un grader, come un file graders/<name>.md o una voce graders: in case.yaml, perché un caso senza uno non riesce a caricarsi. Per raggruppare i casi, annidali sotto una directory che non è essa stessa un caso; qualsiasi cosa dentro una directory di caso, come graders/ e file fixture, appartiene a quel caso.
Questo è il layout che claude plugin eval init scrive e quello da usare per le nuove suite. Il riferimento della suite di eval ha l’albero completo, inclusi mock e risultati:
Scrivi un caso a mano
Avere Claude che scrive i casi conclaude plugin eval init è il percorso consigliato. Per scriverne uno tu stesso invece, inizia da un modello vuoto. Il seguente comando scrive un caso denominato first-case con un prompt.md segnaposto e un grader segnaposto, e non esegue nulla:
prompt.md scrivi il messaggio che Claude riceve in ogni esecuzione, e imposta i limiti dell’esecuzione e gli strumenti che il caso può usare nel suo frontmatter. Apri evals/first-case/prompt.md e sostituisci il corpo segnaposto con una richiesta che una delle tue skill dovrebbe gestire, formulata nel modo in cui un utente la digiterebbe piuttosto che nominare la skill. Questo esempio è per una skill che redige messaggi di commit; usa la tua richiesta:
graders/ è un controllo applicato dopo l’esecuzione. Apri evals/first-case/graders/criteria.md e sostituisci il segnaposto con una rubrica per il modello judge, scritta come condizioni PASS e FAIL concrete:
evals/first-case/graders/skill-fired.md, sostituendo your-skill-name con il nome della directory della tua skill sotto skills/, che è il nome con cui Claude la invoca:
plugin-name:skill-name con namespace.
Tipi di grader elenca gli altri controlli disponibili, come la corrispondenza di una regex o la conferma che un file è stato creato.
Con entrambi i file salvati, esegui il caso nel modo in cui la guida rapida fa, con claude plugin eval . dalla root del plugin.
Imposta i limiti di esecuzione e gli strumenti in prompt.md
Impostamax_turns, timeout_seconds, model, tags di un caso, e gli allowed_tools che può usare nel frontmatter di prompt.md; il riferimento prompt.md frontmatter elenca ogni campo e il suo valore predefinito.
Claude riceve il corpo esattamente come l’hai scritto. Le menzioni @path in esso non vengono espanse in allegati di file, quindi se Claude ha bisogno di leggere un file, concedi uno strumento per esso in allowed_tools.
Scegli e pesa i grader
Il frontmatter di un grader imposta il suotype, e opzionalmente un weight che lo fa contare per più del punteggio dell’esecuzione e un arm che controlla come viene valutato rispetto alla baseline. Dei sei tipi, regex, tool_used, tool_order, e file_exists vengono calcolati dalla trascrizione e dai file e non costano nulla, mentre llm e baseline chiamano un modello judge e si aggiungono al costo dell’esecuzione.
Non ci sono grader di codice personalizzato.
Tipi di grader elenca le opzioni di ogni tipo e la condizione di passaggio, e cosa un grader può guardare elenca i valori che target e focus accettano.
Per impostazione predefinita, il judge per i grader llm e baseline è il modello che Claude Code usa per le attività in background. Passa --judge-model sonnet o un ID modello completo per scegliere tu stesso il judge.
Scegli grader che danno un segnale stabile
Un graderllm chiede a un modello un verdetto, quindi la sua risposta può differire tra le esecuzioni, e differisce di più il testo più lungo che deve leggere. Queste abitudini mantengono i punteggi di una suite abbastanza stabili da fidarsi:
- Per output lungo come un file generato, valutalo con un grader
regexsui contenuti del file, che controlla l’intero file allo stesso modo ogni volta. Mantieni i graderllmper output brevi, con rubriche scritte come condizioni PASS e FAIL concrete. - Dai a ogni caso un grader sul risultato, come il messaggio finale o un file prodotto, e uno su come Claude ci è arrivato, come
tool_usedotool_order. Insieme ti dicono sia se la risposta era corretta che se il tuo plugin l’ha prodotta. - Se il grader
tool_used: Skilldi un caso passa maΔè negativo, sospetta il judge prima del plugin. Un modello judge piccolo può contrassegnare una risposta corretta come sbagliata perché è formattata diversamente da quello che la rubrica descrive. Riesegui con--judge-model sonnet, e stringi la rubrica in modo che la formattazione non decida il verdetto. - Per controllare che una build o un test sia passato dentro l’esecuzione, chiedi al prompt a Claude di eseguirlo e scrivere il risultato in un file, valuta quel file, e asserire che il comando è stato eseguito con un grader
tool_usedil cuiinput_matchnomina il comando.
Valuta rispetto alla baseline senza plugin
Quando un plugin è sotto test, un caso normalmente viene eseguito in due arm. Il with-arm è le sue esecuzioni con il plugin caricato, e il without-arm è lo stesso numero di esecuzioni senza plugin. Il riepilogo e il rapporto mostrano entrambi i punteggi eΔ, il punteggio with-arm meno il punteggio without-arm.
In queste situazioni un caso esegue solo il with-arm, quindi non ottiene alcun punteggio W/OUT o Δ:
- Passi
--ablation none: ogni caso esegue un arm, che dimezza il costo quando non hai bisogno del confronto, come durante l’iterazione sui grader. - Il caso riprende una trascrizione e il target è un percorso: con un target come
.piuttosto che il nome di un plugin installato, un casocontext.history_fileesegue un arm per impostazione predefinita, sulla base del presupposto che la conversazione registrata rifletta già il plugin. L’esecuzione stampa un avvisosingle-arm (no Δ)su stderr nominando questi casi. Per confrontare il turno ripreso con e senza il plugin, passa--ablation with-without. - Nessun plugin è stato trovato per il caso: quando il target è un percorso, un caso il cui plugin Claude Code non ha potuto individuare esegue anche un arm per impostazione predefinita. Vedi il baseline arm non mostra alcun plugin per correggerlo.
scored: false. Un controllo come “la skill è stata invocata” non può mai passare senza il plugin, quindi contarlo spingerebbe il without-arm verso zero e gonfierebbe Δ. Per mantenere i due arm comparabili, Claude Code esclude tali grader dal punteggio in entrambi gli arm e li riporta nel with-arm come indicatori pass/fail solo. Questo include:
- Ogni grader
tool_usedil cuitoolèSkill - Ogni grader
regexcontarget: mock_callse ogni graderllmconfocus: mock_calls, quando ogni server mock nel caso è uno che il tuo plugin dichiara - Qualsiasi grader che contrassegni
arm: with-only
- Ogni grader escluso: se ogni grader in un caso è nell’insieme escluso, vengono valutati normalmente invece, poiché non ci sarebbe nulla di sinistra da valutare.
arm: both: impostaarm: bothsu un grader per valutarlo in entrambi gli arm indipendentemente, che è quello che vuoi per un controllo “non deve invocare la skill” conmin: 0emax: 0.--ablation none: sotto--ablation nonenulla viene escluso, quindi la stessa suite può produrre un punteggio assoluto diverso nei due modi.
Usa una directory eval diversa
Seevals/ è già presa da un altro strumento, mantieni la suite in una directory diversa. Puoi registrare quella directory nel plugin.json del plugin in modo che ogni esecuzione e ogni collaboratore la usi, o passarla sulla riga di comando per un’esecuzione singola:
- In
plugin.json: aggiungi"experimental": { "evals": "quality/evals" }. - Sulla riga di comando: passa
--eval-dir quality/evalssia aclaude plugin evalche aclaude plugin eval init.
qa o quality/evals; un percorso assoluto o uno contenente .. viene rifiutato: come valore di flag è un errore, mentre un valore di manifest inutilizzabile stampa una riga Warning: e l’esecuzione usa evals/ invece. I casi, i risultati, e l’output init si spostano tutti in quella directory.
Configurare fixture e mock
Un caso può richiedere più di un prompt: file o un repository git nell’area di lavoro, una conversazione precedente da continuare, o risposte dai server MCP con cui il vostro plugin comunica. Ognuno di questi viene configurato accanto al caso in modo che le esecuzioni rimangono ripetibili.Inizializzare l’area di lavoro o la conversazione
Ogni esecuzione inizia in un’area di lavoro vuota. Quando un caso ha bisogno di più del prompt, aggiungete uncase.yaml accanto a prompt.md con un blocco context:
- File fixture o un repository git: scrivete uno script Bash nella directory del caso e nominate lo script in
context.scaffold_script. Lo script viene eseguito come voi, al di fuori della sandbox dell’agente, e solo quando passate--scaffold, quindi passate questo flag solo per suite che voi o la vostra organizzazione avete scritto. - Una conversazione precedente da continuare: salvate la trascrizione come file
.jsonle nominate il file incontext.history_file, e il prompt del caso diventa il turno utente successivo. Quando il target è un percorso, un caso di questo tipo viene eseguito senza un braccio baseline per impostazione predefinita. - Directory fixture che Claude può leggere durante l’esecuzione: elencatele in
context.add_dirs.
case.yaml ha anche bisogno di schema_version: "1.1" e name; il riferimento case.yaml fields ha l’elenco completo.
Questo case.yaml inizializza un’area di lavoro da uno script e permette a Claude di leggere fixture da una directory resources/:
PATH della vostra shell, HOME impostato sulla directory home temporanea dell’esecuzione, TMPDIR, e alcune costanti come TERM=dumb. Nient’altro dalla vostra shell lo raggiunge, e nemmeno le variabili EVAL_* del caso. Se lo script esce con codice non zero o viene eseguito più a lungo di 120 secondi, quell’esecuzione ottiene un punteggio 0 con un errore scaffold failed. Utilizzate lo script solo per file e stato git, poiché la configurazione del progetto che scrive non viene caricata.
Mock dei server MCP
Potete valutare un plugin le cui skill chiamano tool MCP senza il servizio reale dietro di essi. Mettete un file Markdown per tool sottoevals/mocks/<server>/<tool>.md per l’intera suite, o sotto la directory mocks/ del caso stesso per un singolo caso, dove <server> è il nome del server nella configurazione MCP del vostro plugin.
Un’esecuzione non avvia mai i veri server MCP del vostro plugin a meno che non lo chiediate. Claude Code registra un sostituto sotto il nome di ogni server. I tool con un file mock rispondono da esso e sono consentiti senza una concessione --allow-tools, e un tool senza file mock non è disponibile per Claude. Un server senza alcun mock appare nella riga di progresso mocked: del caso come plugin_<plugin>_<server>[not started: no mock].
Il corpo del file è quello che il tool restituisce a Claude. Questo mock sostituisce un tool create_issue su un server denominato tracker, controlla l’input che Claude invia, e ripete il titolo. Salvate lo come evals/mocks/tracker/create_issue.md:
- Sostituzioni: inserite i campi dalla chiamata dell’input con
{{input.<field>}}, e il contenuto di un file fixture accanto al mock con{{file:fixtures/{input.<field>}.json}}. expect:: il bloccoexpect:protegge l’input. Se una chiamata lo viola, l’esecuzione si interrompe con punteggio 0 e registra il motivo, in modo che un caso possa asserire cosa il vostro plugin ha chiesto al server di fare.error: true: impostateerror: trueper restituire il corpo come errore di tool.type: agent: impostatype: agentper far rispondere il modello giudice come se fosse il server, seguendo le istruzioni nel corpo. Le chiamate ai mock agent condividono un unico budget per esecuzione pari a quattro volte ilmax_turnsdel caso, e una chiamata che lo supera interrompe l’esecuzione con punteggio 0.
_server.md e _tools.json.
Per valutare le chiamate stesse, puntate un grader a target: mock_calls.
Per eseguire contro i veri server MCP del plugin, passate uno di questi flag. In entrambi i casi questi processi vengono eseguiti come voi, al di fuori della sandbox dell’esecuzione, e i loro tool hanno bisogno di una concessione --allow-tools:
--allow-real-servers: avvia il processo reale per ogni server che non avete mockato, e continua a rispondere ai tool mockati dai loro file--mocks off: ignoramocks/completamente e avvia ogni server che il plugin dichiara
Riprodurre risposte mock dell’agente
Un mocktype: agent risponde con una chiamata al --judge-model, quindi il suo output varia tra le esecuzioni e cambia se cambiate il giudice. Quando un’esecuzione si completa senza errore o interruzione, Claude Code salva ogni risposta che un mock dell’agente ha dato sotto la directory dei risultati in mock-recordings/.
Aprite ADOPT.txt lì per vedere ogni registrazione e la directory .replay/<server>/ in cui copiarla, accanto al mock che l’ha prodotta. Dopo aver copiato una registrazione lì, le esecuzioni successive rispondono alla chiamata identica da essa senza alcuna chiamata al modello. Committete mocks/.replay/ insieme al resto di mocks/ in modo che le esecuzioni CI siano ripetibili.
Esegui evals
Una volta che una suite esiste,claude plugin eval la esegue. Scegli quale plugin e quali casi eseguire con l’argomento target, concedi qualsiasi strumento che i casi hanno bisogno oltre il set di sola lettura con --allow-tools, e controlla il conteggio delle esecuzioni, i modelli, il costo, e l’output con le altre opzioni.
Scegli cosa valutare
La maggior parte delle volte eseguiclaude plugin eval . dalla root del plugin, che esegue ogni caso nella suite con il plugin in cui stai caricato. Per eseguire un singolo file di caso, o per valutare un plugin che hai installato piuttosto che uno che stai sviluppando, passa un target diverso:
Aggiungi
--case <glob> per filtrare per nome di caso e --tag <tag> per mantenere i casi con uno qualsiasi dei tag dati.
Metti il target prima di --tag, --allow-tools, e --json. I primi due prendono un elenco e --json prende un percorso opzionale, quindi ognuno di loro legge un target che segue come il suo valore proprio.
Concedi strumenti
Le esecuzioni non si fermano mai per chiedere il permesso. Gli strumenti incorporati che hanno bisogno di una concessione che non hai dato, comeBash, Write, Edit, WebFetch, e WebSearch, vengono rimossi dalla sessione, quindi Claude non può chiamarli affatto.
Un’esecuzione consente solo gli strumenti di sola lettura che il caso elenca in allowed_tools, da Read, Glob, Grep, NotebookRead, Skill, AskUserQuestion, Agent, TodoWrite, e gli strumenti di task TaskCreate, TaskGet, TaskList, TaskUpdate, e TaskStop, più quello che concedi con --allow-tools. Quella concessione si applica a ogni caso nell’esecuzione. Per lasciare che i casi usino Bash, Write, Edit, WebFetch, o WebSearch, concedili tu stesso:
not granted. Gli strumenti su un server MCP mockato non hanno bisogno di concessione. Gli strumenti su un vero server MCP del plugin hanno bisogno sia del server avviato, con --allow-real-servers o --mocks off, che di una concessione per nome, come --allow-tools "mcp__plugin_my-plugin_github__*"; gli strumenti MCP di un plugin sono denominati mcp__plugin_<plugin>_<server>__<tool>.
Quando concedi Bash in qualsiasi forma, ogni comando viene eseguito sotto la sandbox a livello di OS di Claude Code. Le scritture sono confinate allo spazio di lavoro dell’esecuzione, la tua directory home e la configurazione di Claude Code sono illeggibili, e l’accesso alla rete è limitato ai domini che concedi con --allow-tools "WebFetch(domain:example.com)". Se concedi Bash o PowerShell su una macchina senza backend sandbox, Claude Code rifiuta ogni esecuzione piuttosto che eseguirla non confinata, e il caso mostra un errore di esecuzione e di solito ottiene un punteggio 0. Windows nativo non ha backend, quindi esegui le suite che concedono shell sotto WSL2; su Linux, installa prima bubblewrap e socat. Vedi i prerequisiti di sandboxing.
Opzioni di comando
Questa tabella copre le opzioni per il conteggio delle esecuzioni, i modelli, la valutazione, il costo, le concessioni di strumenti, i mock, e l’output. Eseguiclaude plugin eval --help per l’elenco completo, che include anche --case, --tag, --eval-dir, --no-scaffold, --report, e --verbose.
Esegui evals in CI
Nel tuo lavoro CI, esegui la suite con--json per scrivere il risultato per l’archiviazione, e fallisci la build sul codice di uscita. Passa --trust-plugin in modo che il lavoro non aspetti mai al primo prompt di fiducia, fissa entrambi i modelli in modo che i punteggi siano comparabili nel tempo, mantieni il rapporto locale, e imposta un limite di costo come limite superiore:
Il delta with-minus-without è segnalato ma non cambia mai il codice di uscita, e nemmeno i problemi di scrittura o pubblicazione del rapporto HTML.
Per vedere perché un caso ha ottenuto un punteggio basso, eseguilo localmente senza
--json in modo che le linee di progresso per caso e per grader vengano stampate.
Un runner CI ha anche bisogno di questi elementi:
- Installazione e credenziali: un runner CI ha bisogno di un’installazione di Claude Code e credenziali nell’ambiente come
ANTHROPIC_API_KEYo le variabili del tuo provider cloud. - Fiducia: senza
--trust-plugin, un lavoro la cui directory di checkout Claude Code non ha già fiducia ha bisogno del primo prompt di fiducia, e un’esecuzione che non può chiedere è rifiutata con uscita 1. initin CI:claude plugin eval initha bisogno di un terminale per farti le sue domande; in CI, eseguiclaude plugin eval init --bare <name>per ottenere il modello vuoto.
--ablation none dove non hai bisogno di Δ, e lascia i documenti partial: true e le esecuzioni con skippedPaidGraders fuori da qualsiasi tendenza che grafici.
Leggi i risultati
Ogni esecuzione con almeno un caso scrive una directoryresults/<timestamp>/ dentro la directory eval, contenente aggregate-result.json e report.html. Per un target di percorso che è sotto il plugin; per un plugin che hai denominato, è sotto la tua directory corrente, come la tabella target mostra. La tabella di riepilogo, il JSON, e il rapporto rendono tutti gli stessi dati di risultato.
Rapporto HTML
report.html è un singolo file autonomo che non fa richieste esterne, quindi puoi allegarlo a un lavoro CI o aprirlo dal disco. Questo esempio è la parte superiore di un rapporto per un’esecuzione di suite a tre casi con --threshold 0.8; il costo mostrato è una stima al prezzo di listino e varia con il modello e il numero di casi:

- La linea di verdetto e i riquadri rispondono se il plugin ha aiutato in tutta la suite. Il punteggio della suite è la media dei punteggi con plugin per caso, Ablation Δ è quanto quella si trova sopra o sotto il punteggio di base, e Cases conta quanti hanno raggiunto la soglia. Perfect runs è la quota di esecuzioni con plugin dove ogni grader ha superato.
- Ogni scheda di caso mostra il
Δdel caso e il punteggio con plugin, con un segno sulla barra alla soglia. Un caso il cuiΔè negativo ottiene un bordo sinistro rosso, quindi le regressioni risaltano quando scorri. - All’interno di un caso, le esecuzioni con plugin vengono prima e le esecuzioni di base dopo. Ogni esecuzione elenca i suoi grader con un chip di passaggio o fallimento. Un grader fallito è già espanso con la sua spiegazione, e un grader
llmmostra anche i voti del giudice e le prove che gli sono state mostrate, che è dove scopri perché un’esecuzione ha ottenuto un punteggio basso. I grader che non contano verso il punteggio, cometool_used: Skill, portano un badgeplugin-fired indicator. - Prompt e Graders, sotto le esecuzioni, mostrano il prompt del caso e la rubrica o il modello di ogni grader, quindi qualcuno che legge il rapporto senza la suite può vedere cosa è stato chiesto e cosa è contato come buono.
Published: <url>. Passa --no-publish per mantenerlo locale. Se non appare una linea Published:, come con l’autenticazione con chiave API, il file locale è il rapporto.
Un’esecuzione che una sessione Claude Code ha avviato, come quando chiedi a Claude di eseguire la suite per te, rimane anche locale, e la sua linea Report: dice kept local. Aggiungi --publish-report a quel comando per pubblicarla.
Risultato JSON
aggregate-result.json, e l’output --json, è un documento versionato con schemaVersion: 1 per gli script CI da analizzare. I nomi dei campi sono camelCase e i nuovi campi vengono aggiunti senza rinominare quelli esistenti, quindi scrivi il tuo script per ignorare i campi che non riconosce.
Questi sono i campi che uno script di gating di solito legge. Il documento porta anche la configurazione della suite, ogni definizione di grader, e risultati di grader per esecuzione con spiegazioni e prove:
Cosa un’esecuzione può accedere
claude plugin eval carica le skill, gli hook e gli agenti del plugin target ed esegue la sua suite di eval sulla tua macchina, come te. Puntare a un plugin è la stessa decisione di fiducia di claude --plugin-dir, quindi valuta solo i plugin di cui ti fidi.
L’isolamento descritto in questa sezione limita quello che l’agente sotto test può raggiungere; non è un confine contro il codice del plugin stesso, e una suite che passa non dice nulla su se il plugin è sicuro.
Fidati della directory del plugin
La prima volta che eseguiclaude plugin eval rispetto a una directory, Claude Code chiede Trust this plugin directory? prima di caricare qualsiasi cosa da essa, a meno che non hai già accettato il prompt di fiducia lì in una sessione claude interattiva. All’interno di un repository git, rispondere sì fidati dell’intero repository, per le sessioni interattive anche. Quando stdin o stdout non è un terminale, o sotto --json, l’esecuzione non può chiedere ed è rifiutata con uscita 1; passa --trust-plugin per asserire la fiducia tu stesso, solo per un plugin che eseguiresti sulla tua macchina. Un target che nomini piuttosto che dai come percorso, significando un plugin installato o un plugin skills-directory, salta il prompt.
Alcune parti del plugin e della suite vengono eseguite solo quando passi il loro flag per quella esecuzione:
- Uno
scaffold_scriptdi un caso con--scaffold - Strumenti oltre il set di sola lettura con
--allow-tools - I veri server MCP del plugin con
--allow-real-serverso--mocks off
allowed_tools di un caso e un frontmatter allowed-tools proprio di una skill non possono ampliare nessuno di loro.
Quando il plugin include hook che non hai scritto, o inizi i suoi veri server MCP, tratta i suoi punteggi come consultivi a meno che non l’hai eseguito in un ambiente isolato come un contenitore o runner CI, poiché gli hook e i server vengono eseguiti fuori dalla sandbox dell’agente e potrebbero modificare i file che i grader leggono.
Come le esecuzioni sono isolate
Ogni esecuzione ottiene una directory home, directory di lavoro, e configurazione di Claude Code monouso, e l’agente sotto test viene eseguito lì come processo figlioclaude -p con solo il tuo plugin caricato. Tieni a mente queste conseguenze quando scrivi i casi:
- Nulla di personale o a livello di progetto carica. Le tue impostazioni utente, gli hook, i file
CLAUDE.md, i server MCP, gli altri plugin installati, la memoria, e le skill sono assenti. La configurazione con scope di progetto non viene letta da nessuna parte: nessuna directory.claude/,CLAUDE.md, o.mcp.jsoncarica da sopra l’area di lavoro o dentro di essa, nemmeno una che unoscaffold_scriptha scritto, e le directoryadd_dirsconcedono accesso in lettura solo. La maggior parte del tuo ambiente shell è anche trattenuta; solo un allowlist e le variabiliEVAL_*raggiungono l’esecuzione. Spedisci qualsiasi skill, agente, hook, o server MCP da cui un caso dipende nel plugin sotto test, poiché unoscaffold_scriptpuò fornire solo file e stato git. - La politica gestita può ancora limitare un’esecuzione. Le restrizioni nelle impostazioni gestite che un amministratore ha distribuito alla macchina si applicano dentro un’esecuzione, quindi i risultati su una macchina gestita possono differire da una non gestita da quella politica.
- Lo strumento Artifact è spento. Una skill che pubblica un artifact può essere valutata solo su quello che produce prima di quel passaggio.
- Le definizioni del caso sono nascoste all’agente. Un’esecuzione non può leggere la directory eval, quindi Claude non può vedere il prompt del caso, i suoi grader, o i casi fratelli.
- Nessuna sandbox di rete al di fuori dei comandi shell. I comandi shell che concedi vengono eseguiti sotto le regole sandbox della rete. Una concessione
WebFetch(domain:…)raggiunge quel dominio direttamente, e gli hook del plugin stesso e qualsiasi vero server MCP che inizi possono raggiungere qualsiasi host.
Riferimento della suite di eval
Tutto quello che una suite di eval può contenere vive sotto la directory eval del plugin,evals/ a meno che non hai configurato un’altra. Una directory conta come un caso quando contiene un prompt.md o un case.yaml, e un caso senza almeno un grader non riesce a caricarsi con un errore invalid case.yaml che nomina graders. Questo albero mostra ogni file che claude plugin eval legge o scrive nella directory eval:
prompt.md frontmatter
Il frontmatter diprompt.md accetta questi campi. Una chiave sconosciuta è un errore:
case.yaml fields
case.yaml è un’alternativa o un complemento a prompt.md: descrive un caso in YAML e aggiunge i campi che puntano ad altri file. Richiede schema_version: "1.1" e name. I campi prompt.md description, tags, plugins, runs, e expected_outcome vanno al livello superiore; model, max_turns, timeout_seconds, allowed_tools, append_system_prompt, e env vanno sotto execution:. Quando entrambi i file esistono, il frontmatter di prompt.md sostituisce i campi corrispondenti di case.yaml, il corpo di prompt.md è il prompt, e graders/*.md vengono aggiunti dopo qualsiasi grader elencato in case.yaml.
Questi campi esistono solo in case.yaml:
Frontmatter del grader
Ogni file di grader sottograders/ prende queste chiavi nel frontmatter, più le opzioni per il suo tipo. Il nome del grader è il nome del file senza .md:
Cosa un grader può guardare
I graderregex prendono un target e i grader llm prendono un focus. Entrambi accettano gli stessi valori:
Tipi di grader
Ogni tipo di grader sotto elenca le sue opzioni e quando passa:File mock
Un file<tool>.md sotto mocks/<server>/ risponde a uno strumento. Il suo corpo è il risultato dello strumento, con sostituzioni {{input.<field>}} e {{file:fixtures/<name>}}. Il suo frontmatter accetta queste chiavi:
Due file opzionali si trovano accanto ai file dello strumento nella directory di un server:
_server.md: un singolo mocktype: agentche risponde a diversi strumenti, elencati nella sua chiave frontmattertools:. Un<tool>.mdper lo stesso strumento ha la precedenza. Una guardiaexpect:qui è un errore di caricamento a meno chetools:non elenchi un singolo strumento, quindi metti invece la guardia sul singolo<tool>.md_tools.json: una rispostatools/listsalvata dal vero server, in modo che gli strumenti mockati portino le loro vere descrizioni e schemi di input invece di un placeholder permissivo
mocks/ propria di un caso usa lo stesso layout e sostituisce i file della suite file per file.
Pattern regex in expect
Un valore/regex/ in expect: usa un piccolo dialetto che Claude Code controlla quando carica la suite:
- Caratteri letterali,
., escape come\d, e classi di caratteri come[a-z] - I quantificatori
*,+,?, e le forme{m,n}, ognuno su un singolo carattere, escape o classe - Un
^opzionale all’inizio e un$alla fine - Solo i flag
ies
^ iniziale la alza, quindi ancora i pattern con ^ e usa pochi quantificatori.
Risoluzione dei problemi
Questi sono i problemi che gli autori incontrano più spesso, chiavi su quello che vedi.“plugin eval is currently in early access”
La tua build precede la disponibilità generale del comando. Eseguiclaude update, poi esegui di nuovo il comando in una sessione fresca.
“plugin eval is currently unavailable”
Anthropic ha disattivato il comando lato server. Nulla sulla tua macchina lo riattiva; eseguiclaude update e riprova in una sessione fresca più tardi.
“is not a trusted plugin directory, and this run cannot stop to ask you about it”
Questa è la prima esecuzione rispetto a una directory di cui Claude Code non ha ancora fiducia, e non può chiedere perché stdin o stdout non è un terminale o hai passato--json. Esegui claude plugin eval <dir> una volta in un terminale e rispondi al prompt, o passa --trust-plugin se ti fidi del codice e della suite del plugin. Vedi Cosa un’esecuzione può accedere.
“is too old for claude plugin eval”
Ilgit sul tuo PATH è più vecchio di 2.31, quindi claude plugin eval si è fermato prima di eseguire qualsiasi caso e è uscito 1 con un messaggio che nomina la tua versione:
claude plugin eval non controllava la versione di git, e su un git più vecchio la suite veniva eseguita con quei programmi lasciati attivi.
“No eval cases found”
Nessun<case>/prompt.md o <case>/case.yaml esiste sotto la directory eval in vigore, o i tuoi filtri --case e --tag non hanno corrisposto a nessun caso. Esegui dalla root del plugin, o esegui claude plugin eval init per creare una suite.
Il baseline arm mostra nessun plugin, o delta è zero
Se il riepilogo non ha colonnaW/OUT, o il caso fallisce con “ablation requested but no plugin resolved”, la causa usuale è che nessun plugin è stato trovato per il caso. Se ogni caso riprende una trascrizione attraverso context.history_file, la colonna mancante è prevista invece, perché quei casi eseguono un arm per impostazione predefinita. Altrimenti, aggiungi plugins: ["../.."] al caso, dando il percorso dalla directory del caso alla directory del plugin.
Se il plugin è stato caricato e Δ è ancora vicino a zero con il tuo grader tool_used: Skill che fallisce, questo è di solito un risultato reale, significando che la description della skill non attiva sulla formulazione del prompt. Regola la descrizione e riesegui la stessa suite.
“Agent type ’…’ not found” for one of your plugin’s agents
Per impostazione predefinita, ogni caso viene eseguito sia con il tuo plugin che senza di esso, e le esecuzioni senza di esso sono la baseline senza plugin. Quando Claude invia uno degli agenti del tuo plugin in un’esecuzione baseline, la chiamata dello strumento Agent fallisce conAgent type '<plugin>:<agent-name>' not found. Available agents: .... L’elenco nomina solo gli agenti che esistono senza il plugin, come i subagenti integrati.
L’errore è previsto, poiché Δ confronta le tue esecuzioni del plugin rispetto alla baseline. Nel risultato JSON, le esecuzioni baseline sono sotto cases[].arms.without.
Nelle esecuzioni con il tuo plugin caricato, un caso che elenca Agent in allowed_tools può inviare uno degli agenti del tuo plugin per il suo nome con namespace, come my-plugin:code-reviewer per l’agente code-reviewer in un plugin denominato my-plugin. Per saltare le esecuzioni baseline, passa --ablation none.
Tutto ottiene un punteggio zero sebbene i file corretti siano stati prodotti
I tuoi grader puntano afiles, l’elenco dei percorsi creati, quando intendevi i contenuti del file. Usa { source: file, path: <path> } come target o focus.
Separatamente, file_exists conta solo i file creati durante l’esecuzione, quindi un file che lo scaffold ha creato o che Claude ha solo modificato è invisibile ad esso; valuta i suoi contenuti, o usa tool_used su Edit.
Una regex sulla traccia non corrisponde al testo che posso vedere
- Target sbagliato: il
targetpredefinito èlast_message, non la traccia. - Escape JSON: quando fai il target
trace, è JSON per riga, quindi le virgolette appaiono come\". - Sintassi regex: le regex usano la sintassi JavaScript, quindi metti
iinflagspiuttosto che scrivere(?i).
Gli strumenti vengono negati, gli strumenti MCP mancano, o Bash non verrà eseguito
Qualsiasi cosa oltre il set di sola lettura ha bisogno della tua concessione, come--allow-tools Bash Write. I tuoi server MCP personali non caricano mai in un’esecuzione. I server del plugin stesso non si avviano a meno che non opti per esso, e i loro strumenti hanno quindi bisogno anche di una concessione --allow-tools "mcp__plugin_<plugin>_<server>__*"; uno strumento mockato non ha bisogno di nessuno dei due.
L’esecuzione esce 1 ma i risultati sembrano bene
Il--threshold predefinito è 1.0, quindi il comando esce 1 quando qualsiasi caso ottiene un punteggio inferiore a perfetto. Imposta una soglia che corrisponda al punteggio che richiedi. L’uscita 1 copre anche un file di caso che non è stato caricato, che viene riportato su stderr sopra la tabella.
--json output path must end in .json
Hai messo il target dopo --json, quindi è stato letto come il percorso di output. Metti il target per primo, come in claude plugin eval . --json, o dai a --json un percorso .json esplicito.
Un grader mostra passed: false sotto un’esecuzione che ha ottenuto un punteggio 1.0
Quel grader è escluso dal punteggio per design in un’esecuzione a due arm, e il suo camposcored è false. Vedi Punteggio rispetto alla baseline senza plugin.
Le esecuzioni falliscono con un errore di limite di utilizzo o limite di velocità a metà strada
Se il tuo account raggiunge il limite di utilizzo del piano o un limite di velocità API mentre una suite è in esecuzione, ogni esecuzione successiva termina con quell’errore, viene valutata su quello che ha prodotto, e di solito ottiene un punteggio 0. La suite finisce comunque e non è contrassegnatapartial, quindi il risultato può sembrare una regressione. Controlla la colonna NOTES o cases[].arms.with[].error nel JSON per il messaggio di limite prima di fidarti dei punteggi, poi riesegui dopo che il limite si ripristina, con --runs 1 o un filtro --case se hai bisogno di rimanere sotto di esso.
“mock call budget exceeded”
Ogni mocktype: agent in un’esecuzione attinge a un unico budget di chiamate pari a quattro volte il max_turns del caso, ovvero 40 chiamate con il valore predefinito di 10. Contano anche le chiamate a cui si risponde dalle registrazioni in .replay/, e la riga di avanzamento mock budget del caso stampa il budget. Una chiamata oltre il budget interrompe l’esecuzione con punteggio 0 e questo motivo, quindi aumenta max_turns nel caso per una skill che effettua molte chiamate ai mock di agente.
Le esecuzioni scadono o colpiscono il limite di turni
I predefiniti sono 10 turni e 300 secondi. Aumentamax_turns e timeout_seconds nel caso per compiti che hanno bisogno di più, e usa --max-cost-usd come limite di costo piuttosto che limiti stretti per esecuzione.
Vedi anche
- Creare un plugin: costruisci il plugin che stai testando, e caricalo con
--plugin-dirdurante lo sviluppo - Riferimento dei comandi plugin: le voci di comando
plugin evaleplugin eval init. La chiaveexperimental.evalsdel manifesto è nel riferimento del manifesto - Skills: come la descrizione di una skill decide quando Claude la invoca, che è quello che un caso che controlla se la skill si attiva sta misurando
- Sandboxing: la sandbox a livello di OS che si applica quando concedi Bash a un’esecuzione
- Pubblicare un plugin: pubblica il plugin una volta che la sua suite passa
- Misurare il costo e l’utilizzo del plugin: quello che il plugin aggiunge al contesto di ogni sessione e se le persone lo usano ancora