11 · Agents e Subagents
Un subagent è un aiutante che Claude lancia per delegare un compito: un “secondo Claude” con la sua memoria di lavoro separata, che fa il suo pezzo e riporta solo il risultato. L’analogia è il capocantiere che manda un operaio a fare un sopralluogo: l’operaio si guarda tutto, e al capo torna il rapporto, non l’intera visita. Due i motivi per usarli, ed è importante distinguerli: il risparmio (le letture pesanti restano nella memoria dell’aiutante, non nella tua — il tema del modulo 4) e la qualità (un revisore con la memoria pulita giudica il lavoro senza esserne affezionato). Questo modulo insegna a usare gli aiutanti pronti, a costruirne di tuoi, e a combinarli.
Obiettivi
Sezione intitolata “Obiettivi”- Capire perché un subagent risolve il problema del contesto meglio di qualsiasi altra tecnica.
- Usare i tipi integrati —
Explore,Plan,general-purpose— senza definirne di nuovi. - Scrivere un subagent custom con i tool, il modello e i permessi giusti.
- Sapere cosa entra e cosa non entra nel contesto di un subagent.
- Distinguere subagent e fork, e sapere quando serve l’uno o l’altro.
Concetti chiave
Sezione intitolata “Concetti chiave”Un subagent è una finestra di contesto separata. È l’unica cosa da ricordare, se ne ricordi una sola. Quando deleghi una ricerca che legge venti file, quei venti file stanno nel contesto del subagent, non nel tuo: a te torna solo un riassunto. Nella sessione principale paghi ~80 token per lo spawn e ~400 per il report, invece di 20.000 di letture.
Ha i suoi tool, il suo modello, i suoi permessi. Un subagent può essere in sola lettura mentre la sessione principale scrive, girare su un modello diverso, avere hook che valgono solo per lui e sparire quando ha finito.
È anche uno strumento di qualità, non solo di risparmio. Un revisore che gira in un contesto fresco vede solo la diff e i criteri che gli dai, non il ragionamento che ha prodotto quella modifica. Valuta il risultato per quello che è. È la ragione per cui la revisione con un subagent trova cose che la sessione che ha scritto il codice non trova.
Delegare non è gratis. Il subagent non conosce la tua conversazione: il prompt di delega deve essere autosufficiente. Un subagent istruito male rilegge da zero cose che nella sessione principale erano già chiare.
I tipi integrati
Sezione intitolata “I tipi integrati”Prima di definirne uno tuo, controlla se ti basta uno di questi:
| Tipo | Modello | Tool | A cosa serve |
|---|---|---|---|
Explore |
Lo stesso della conversazione principale (al massimo Opus: se usi un modello superiore, l’agente scala a Opus) | Solo lettura: Write ed Edit negati |
Scoperta di file, ricerca nel codice, esplorazione del codebase |
Plan |
Eredita | Solo lettura | Ricerca nel codebase per la pianificazione, in Plan Mode |
general-purpose |
Eredita | Tutti quelli disponibili ai subagent | Task complessi multi-step che richiedono sia esplorazione sia azione |
claude |
Eredita | Tutti | Catch-all quando il task non rientra in un agente specializzato |
statusline-setup |
Sonnet | Read, Edit |
Quando lanci /statusline |
claude-code-guide |
Haiku | Bash, Read, WebFetch, WebSearch |
Domande su funzionalità di Claude Code |
Cosa entra nel contesto di un subagent
Sezione intitolata “Cosa entra nel contesto di un subagent”All’avvio, un subagent (non-fork) ha:
- Il suo system prompt — il prompt dell’agente più i dettagli d’ambiente. Non il system prompt completo di Claude Code.
- Il messaggio di task — il prompt di delega che Claude scrive.
- I file
CLAUDE.mddi ogni livello della gerarchia — tranne perExploreePlan. - Lo stato git — snapshot preso all’avvio della sessione padre; anche questo saltato da
ExploreePlan. - Le skill precaricate — contenuto completo delle skill elencate nel campo
skills. - L’elenco degli altri agenti attivi — la conversazione principale (
main) e gli agenti con un nome, così il subagent sa a chi può mandare messaggi.
E soprattutto, cosa non arriva:
- La tua cronologia di conversazione (tranne nei fork)
- Il tuo output style
- L’auto memory della conversazione principale
- La dimensione della finestra di contesto della conversazione principale
flowchart LR
subgraph MAIN["Sessione principale"]
H["Cronologia della conversazione"]
AM["Auto memory"]
OS["Output style"]
end
subgraph SUB["Subagent — contesto separato"]
SP["System prompt proprio"]
TM["Messaggio di task"]
CM["CLAUDE.md<br/><i>tranne Explore e Plan</i>"]
GS["Stato git<br/><i>tranne Explore e Plan</i>"]
SK["Skill precaricate"]
end
MAIN -->|"prompt di delega"| TM
H -.->|"NON passa"| SUB
AM -.->|"NON passa"| SUB
OS -.->|"NON passa"| SUB
SUB -->|"riassunto finale"| MAIN
classDef main fill:#1d4e6f,stroke:#4a9ecb,color:#fff
classDef sub fill:#2f5c33,stroke:#5aa864,color:#fff
class H,AM,OS main
class SP,TM,CM,GS,SK sub
Definire un subagent
Sezione intitolata “Definire un subagent”I file vanno in agents/, scoperti ricorsivamente — puoi organizzarli in sottocartelle:
Directory.claude/agents/
- code-reviewer.md
Directoryreview/
- security.md
- performance.md
Directoryresearch/
- api-docs.md
Le posizioni, dalla priorità più alta alla più bassa. (Noterai che qui i managed settings e il flag di sessione stanno sopra tutto, e il progetto sopra l’utente: l’ordine è diverso da quello delle skill del modulo 7, dove la tua skill personale batte quella di progetto. Ogni meccanismo ha la sua tabella: quando serve la certezza, guarda quella giusta invece di andare a memoria.)
| Posizione | Portata |
|---|---|
| Managed settings | Tutta l’organizzazione |
Flag --agents |
Solo la sessione corrente |
.claude/agents/ |
Il progetto — si committa |
~/.claude/agents/ |
Tutti i tuoi progetti |
agents/ di un plugin |
Dove il plugin è abilitato |
Riferimento del frontmatter
Sezione intitolata “Riferimento del frontmatter”---name: unique-identifierdescription: When Claude should delegate to this subagenttools: Read, Grep, Glob, BashdisallowedTools: Write, Editmodel: sonnetpermissionMode: defaultmaxTurns: 10skills: - api-conventions - error-handling-patternsmcpServers: - server-namehooks: PreToolUse: - matcher: "Bash" hooks: - type: command command: "./scripts/validate-command.sh"memory: projectbackground: falseeffort: highisolation: worktreecolor: blueinitialPrompt: Testo del primo turno, inviato automaticamente---Obbligatori: name (identificatore univoco, minuscole e trattini) e description (quando Claude deve
delegare a questo subagent).
| Campo | Cosa fa |
|---|---|
tools |
Allowlist dei tool. Se omesso, eredita tutti quelli disponibili |
disallowedTools |
Denylist |
model |
sonnet, opus, haiku, fable, un ID completo, o inherit (default) |
permissionMode |
default, acceptEdits, auto, dontAsk, bypassPermissions, plan |
maxTurns |
Numero massimo di turni agentici prima di fermarsi |
skills |
Skill precaricate nel contesto all’avvio |
mcpServers |
Server MCP disponibili a questo subagent |
hooks |
Hook che valgono solo mentre il subagent gira |
memory |
user, project o local per la memoria persistente |
background |
true per tenerlo in background anche quando Claude lo vorrebbe in primo piano |
effort |
low, medium, high, xhigh, max |
isolation |
worktree per farlo lavorare in un worktree git isolato (una copia di lavoro separata dello stesso repository) |
color |
Colore nell’interfaccia: red, blue, green, yellow, purple, orange, pink, cyan |
initialPrompt |
Primo turno utente inviato automaticamente |
Un file completo
Sezione intitolata “Un file completo”---name: code-improverdescription: Scans files and suggests improvements for readability, performance, and best practices. Use after writing or modifying code.tools: Read, Grep, Globmodel: sonnetmemory: project---
You are a code improvement specialist. For each issue you find:
1. Explain the problem clearly2. Show the current code3. Provide an improved version with explanation4. Suggest when the improvement matters most
Focus on:- Readability and clarity- Performance and efficiency- Best practices and patterns- Maintainability and scalability
Be specific and actionable in your feedback.Nota tools: Read, Grep, Glob: nessun Write né Edit. Un revisore che può modificare il codice
smette di essere un revisore. La restrizione dei tool è la parte più importante della definizione, non un
dettaglio.
Invocare un subagent
Sezione intitolata “Invocare un subagent”Tre modi, in ordine crescente di forza:
-
Linguaggio naturale — nomini il subagent, Claude decide se delegare:
Use the test-runner subagent to fix failing tests -
@-menzione — garantisce che il subagent giri per quel task. La sintassi va copiata esatta:
@apre la menzione, le virgolette servono perché il nome contiene uno spazio, e il suffisso(agent)distingue l’agente da un file con lo stesso nome. Scrivendo@nel prompt, l’autocomplete te la compone da solo:@"code-reviewer (agent)" look at the auth changes(= “code-reviewer, guarda le modifiche all’autenticazione”)
-
Default di sessione — tutta la sessione usa quell’agente:
Terminal window claude --agent code-reviewer.claude/settings.json {"agent": "code-reviewer"}
Per far riprendere un subagent, basta chiederlo: “Continue that code review and now analyze the
authorization logic”. Claude usa il tool SendMessage per riattivarlo; il subagent ripreso conserva
tutta la sua cronologia e riparte da dove si era fermato.
Memoria persistente
Sezione intitolata “Memoria persistente”Nel modulo 4 hai visto l’auto memory: gli appunti che il Claude
principale si prende tra una sessione e l’altra. I subagent non la ereditano — e possono però
averne una propria, separata, attivata dal campo memory: stessa idea (appunti che sopravvivono),
directory diversa, per agente. Così il tuo revisore ricorda i falsi positivi che gli hai contestato,
senza mescolarli con la memoria della conversazione principale:
---name: code-reviewerdescription: Reviews code for quality and best practicesmemory: project---Il suo system prompt guadagna le istruzioni per leggere e scrivere nella directory di memoria, più le
prime 200 righe o 25 KB di MEMORY.md — quello che scatta per primo. I tool Read, Write ed Edit
vengono abilitati automaticamente.
| Scope | Percorso |
|---|---|
user |
~/.claude/agent-memory/<nome-agente>/ |
project |
.claude/agent-memory/<nome-agente>/ |
local |
.claude/agent-memory-local/<nome-agente>/ |
È il meccanismo che rende un revisore utile alla decima esecuzione invece che alla prima: si ricorda i falsi positivi che gli hai contestato.
Fork: quando il subagent deve sapere tutto
Sezione intitolata “Fork: quando il subagent deve sapere tutto”Un fork è diverso da un subagent normale. Eredita dalla conversazione corrente:
- Tutta la cronologia
- Lo stesso system prompt e gli stessi tool
- Lo stesso modello e gli stessi permessi
E isola:
- Le proprie chiamate a tool, che non compaiono nella conversazione principale
- Il risultato finale, che torna come messaggio
Si crea con /subtask <task>, oppure chiedendo il tipo di subagent fork. La modalità fork è attiva di
default nelle sessioni interattive, controllata dalla variabile CLAUDE_CODE_FORK_SUBAGENT.
| Usa un subagent quando | Usa un fork quando |
|---|---|
| Il task è autosufficiente e descrivibile in un prompt | Il task dipende da tutto quello che avete già discusso |
| Vuoi occhi freschi — revisione, verifica | Vuoi continuità, non indipendenza |
| Vuoi tool o modello diversi | Va bene la stessa configurazione |
| Vuoi risparmiare contesto | Vuoi solo tenere le chiamate a tool fuori dalla vista |
Esempio guidato
Sezione intitolata “Esempio guidato”Costruiamo una coppia che si usa insieme: un ricercatore in sola lettura e un revisore avversariale.
-
Prima prova senza definire nulla. I tipi integrati coprono più casi di quanto sembri:
Use subagents to investigate how our authentication system handles tokenrefresh, and whether we have any existing OAuth utilities I should reuse.Report back in under 30 lines.Il vincolo sulla lunghezza non è pignoleria: un subagent che ti restituisce un muro di testo ti rimangia il risparmio di contesto.
-
Definisci un ricercatore specializzato. Serve quando le indagini si ripetono e vuoi che seguano sempre lo stesso taglio:
.claude/agents/ricercatore.md ---name: ricercatoredescription: Indaga come funziona una parte del codebase e riporta i punti chiave. Usalo proattivamente prima di modifiche che toccano codice che non conosci.tools: Read, Grep, Glob, BashdisallowedTools: Write, Editcolor: cyan---Sei un ricercatore di codebase. Il tuo output viene letto da un altro agenteche scriverà del codice: deve essere denso e verificabile, non discorsivo.Riporta sempre, in quest'ordine:1. **Punto d'ingresso** — da quale file si parte, con percorso e riga2. **Flusso** — i passaggi principali, con `file:riga` per ciascuno3. **Convenzioni** — i pattern che il codice esistente segue e che vanno rispettati4. **Trappole** — casi limite già gestiti, che una modifica ingenua romperebbe5. **Da riusare** — utility o astrazioni già presenti, con percorsoVincoli:- Massimo 40 righe. Se non ci stai, taglia le sezioni 3 e 4, mai la 1 e la 2.- Ogni affermazione deve avere un riferimento `file:riga`. Se non puoi citarlo,non affermarlo.- Non proporre modifiche. Non è il tuo compito. -
Definisci un revisore avversariale.
.claude/agents/revisore.md ---name: revisoredescription: Rivede una diff cercando difetti di correttezza. Usalo dopo che una modifica è completa, prima del commit.tools: Read, Grep, Glob, BashdisallowedTools: Write, Editmodel: opuseffort: highmemory: projectcolor: red---Sei un revisore. Vedi la diff e i criteri, non il ragionamento che l'ha prodotta.Valuta il risultato per quello che è.Cerca, in quest'ordine di priorità:1. **Correttezza** — la modifica fa quello che doveva? Casi limite non gestiti?2. **Regressioni** — c'è comportamento esistente che si rompe?3. **Requisiti mancanti** — qualcosa nella richiesta non è stato implementato?Per ogni rilievo, dai uno scenario concreto: input, stato, output sbagliato.Un rilievo senza scenario di fallimento non è un rilievo: non riportarlo.**Non** segnalare preferenze di stile, naming, o "si potrebbe astrarre".Se non trovi nulla che tocca correttezza o requisiti, dillo in una riga.Prima di rivedere, leggi la tua memoria: contiene i falsi positivi che ti sonogià stati contestati su questo progetto. Dopo la revisione, se un tuo rilievoviene respinto, annotalo.Tre scelte da notare:
model: opusedeffort: high— Opus è il modello più capace e più “costoso” in consumo del piano, e la revisione è esattamente il punto in cui quel consumo extra rende;disallowedTools: Write, Edit, perché un revisore che corregge non è più un revisore; ememory: project, che lo rende progressivamente meno rumoroso. -
Usali in sequenza.
@"ricercatore (agent)" investigate how rate limiting works in this codebasePoi, con il report in mano, implementa. E infine:
@"revisore (agent)" review the diff against PLAN.md. Check that everyrequirement is implemented, that the listed edge cases have tests, and thatnothing outside the task's scope changed. -
Verifica il risparmio di contesto.
/contextConfronta con quello che avresti speso facendo la stessa indagine nella sessione principale.
-
Prova l’isolamento con un worktree. Se due agenti devono modificare file in parallelo, aggiungi al frontmatter:
isolation: worktreeOgni esecuzione ottiene un worktree git suo, così le modifiche non collidono. È costoso — setup e spazio su disco — quindi usalo solo quando serve davvero.
Esercizio
Sezione intitolata “Esercizio”Costruisci una pipeline a tre agenti e misurane l’effetto.
- Definisci tre subagent: uno che esplora, uno che implementa, uno che verifica.
- Dai a ciascuno i tool minimi necessari.
- Fai passare un task reale attraverso tutti e tre.
- Confronta il consumo di contesto con lo stesso task fatto in una sessione sola.
Soluzione
Passi 1–2. Il punto dell’esercizio è la restrizione dei tool: è quella che rende ciascun agente affidabile nel suo ruolo.
| Agente | tools |
disallowedTools |
Perché |
|---|---|---|---|
ricercatore |
Read, Grep, Glob, Bash |
Write, Edit |
Deve leggere ed eseguire comandi di ispezione, mai modificare |
implementatore |
(omesso: eredita tutto) | — | Deve poter fare tutto |
revisore |
Read, Grep, Glob, Bash |
Write, Edit |
Se può correggere, smette di rivedere e comincia a scrivere |
Per il terzo agente puoi riusare revisore del passo 3 dell’esempio guidato. L’implementatore, se non ha
bisogno di un prompt particolare, non definirlo: usa general-purpose, che è già quello.
Passo 3. Una sequenza realistica su un task medio:
@"ricercatore (agent)" investigate how we validate request payloads.I need to add validation to the new /webhooks endpoint.Leggi il report. Poi implementa nella sessione principale, che ora ha il contesto denso invece dei file grezzi:
Following the conventions from that report, add payload validation tosrc/routes/webhooks.js. Write tests for: missing signature header,invalid signature, valid payload. Run the tests.Infine:
@"revisore (agent)" review the diff for src/routes/webhooks.js and its tests.Passo 4. Il confronto va fatto onestamente, con due sessioni separate.
Sessione A, tutto insieme: /clear, poi un solo prompt che chiede di indagare, implementare e
verificare. Alla fine, /context.
Sessione B, con delega: /clear, poi la sequenza a tre agenti sopra. Alla fine, /context.
Cosa dovresti osservare:
| Sessione A | Sessione B | |
|---|---|---|
| File letti nel contesto principale | Tutti quelli esplorati | Nessuno: solo il report |
| Contesto a fine task | Alto | Sensibilmente più basso |
| Qualità della revisione | Il revisore è la stessa istanza che ha scritto il codice | Contesto fresco, valuta il risultato |
Il secondo punto è quello misurabile; il terzo è quello che conta di più, ed è la ragione per cui la delega vale la pena anche quando il contesto non è un problema.
Se non vedi differenza, controlla due cose: che tu abbia davvero usato la @-menzione (il linguaggio naturale suggerisce la delega, non la garantisce), e che il ricercatore abbia rispettato il limite di righe — un report da 300 righe non è delega, è copia-incolla con passaggi intermedi.
Errori comuni e troubleshooting
Sezione intitolata “Errori comuni e troubleshooting”| Sintomo | Causa | Soluzione |
|---|---|---|
| Claude non delega mai al tuo subagent | La description non dice quando delegare |
Riscrivila in termini di situazione; aggiungi “use proactively” |
| Vuoi essere sicuro che parta | Il linguaggio naturale lascia decidere a Claude | Usa la @-menzione: @"nome (agent)" |
| Il subagent non conosce le convenzioni del progetto | Stai usando Explore o Plan, che saltano i CLAUDE.md |
Usa general-purpose o un agente custom |
| Il subagent chiede cose già dette in conversazione | La cronologia non passa ai subagent | Rendi il prompt di delega autosufficiente, o usa un fork |
| Il revisore corregge invece di rivedere | Ha Write ed Edit |
disallowedTools: Write, Edit |
| Il report del subagent è enorme e non risparmi contesto | Nessun vincolo di lunghezza | Metti un limite esplicito nel prompt dell’agente |
| Due subagent in parallelo si sovrascrivono i file | Lavorano nella stessa working copy | isolation: worktree |
| Il subagent gira all’infinito | Nessun limite di turni | maxTurns |
| Il subagent è troppo lento o costoso | Eredita modello ed effort della sessione | model: haiku ed effort: low per i task meccanici |
| La memoria del subagent non persiste | Manca il campo memory |
memory: project (o user / local) |
| L’auto memory principale non arriva al subagent | È voluto: non viene passata | La memoria del subagent è una directory separata |
| Hai bisogno che il subagent sappia tutto della conversazione | Un subagent normale non eredita nulla | Usa un fork: /subtask <task> |
Cheat-sheet
Sezione intitolata “Cheat-sheet”Struttura minima
---name: nome-agentedescription: Quando Claude deve delegare a questo agentetools: Read, Grep, Glob---
Il system prompt dell'agente.I campi che userai davvero
| Campo | Quando |
|---|---|
tools / disallowedTools |
Sempre: è ciò che definisce il ruolo |
model / effort |
Alza per la revisione, abbassa per i task meccanici |
memory |
Agenti ricorrenti che devono migliorare nel tempo |
maxTurns |
Agenti autonomi, per evitare loop |
isolation: worktree |
Solo quando più agenti scrivono in parallelo |
skills |
Precaricare convenzioni che l’agente deve conoscere |
permissionMode |
Agenti che devono lavorare senza conferme |
Invocare
| Modo | Forza |
|---|---|
Use the X subagent to ... |
Claude decide |
@"X (agent)" ... |
Garantito per quel task |
claude --agent X |
Default di tutta la sessione |
/subtask <task> |
Fork: eredita la conversazione |
Tipi integrati
Explore → ricerca veloce, sola lettura, salta CLAUDE.md e gitPlan → ricerca per la pianificazione, sola letturageneral-purpose → task complessi, tutti i toolPercorsi
.claude/agents/<nome>.md → progetto, si committa~/.claude/agents/<nome>.md → tutti i tuoi progetti.claude/agent-memory/<nome>/ → memoria persistente (scope project)Pagine ufficiali consultate, verificate il 16 agosto 2026:
- Subagents — posizioni, frontmatter completo, tipi integrati, contesto all’avvio, memoria persistente, fork
- Agents — panoramica degli agenti
- Best practices — delega delle ricerche e revisione avversariale
- Agent teams — coordinamento automatico di più sessioni
- Worktrees — isolamento per il lavoro in parallelo
- Hooks — hook con durata limitata al subagent
- Model configuration — modelli ed effort
Corso indipendente, non affiliato ad Anthropic o Google. Claude e Claude Code sono marchi di Anthropic; Antigravity e Gemini sono marchi di Google.