La galassia
NUCLEO · COSTELLAZIONE

Operator Core

Operare l'IA

Il sole della galassia. Impari a operare Claude Code e i sistemi IA da professionista: ambiente, contesto, prompt, versionamento e deploy. Tutto il resto orbita qui.

Alimenta Tutti i progetti
8 moduli · 8 lezioni
MODULI DELLA COSTELLAZIONE Apri ogni modulo per la lezione completa
OC-01

Ambiente operativo

lezione

Lasciare terminale, VS Code e Claude Code installati, autenticati e verificati per iniziare a costruire un progetto reale in meno di un'ora.

Senza un ambiente operativo solido perdi ore a combattere con errori di PATH, permessi e autenticazione invece di costruire. L'80% degli abbandoni dei principianti avviene qui, prima di scrivere una sola riga utile.

LA LEZIONE

Un operatore non 'usa' l'IA da un sito web: la opera dalla sua macchina, con accesso ai suoi file, al suo git e al suo terminale. Questo è Claude Code. Prima di installarlo ti servono tre fondamenta: un terminale dove esegui comandi, un editor (VS Code) dove vedi e modifichi il codice, e un gestore di pacchetti per installare strumenti. Su macOS il terminale è Terminal.app o iTerm2; su Windows usa WSL2 (Ubuntu) perché Claude Code e la maggior parte degli strumenti assumono un ambiente di tipo Unix. Non provare a operare da PowerShell puro: ti costerà il doppio.

Per prima cosa controlla cosa hai. Apri il terminale ed esegui `node --version` e `git --version`. Se `node` non esiste o è inferiore alla v18, installa Node LTS. Su macOS la via pulita è Homebrew: `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` e poi `brew install node git`. Dopo aver installato Homebrew, l'installer ti stampa DUE righe `eval "$(/opt/homebrew/bin/brew shellenv)"` che devi aggiungere al tuo `~/.zprofile` — se le salti, `brew` 'sparisce' quando apri un nuovo terminale. Questo è il primo errore di PATH che incontrerai e conviene capirlo: il PATH è la lista di cartelle dove la shell cerca i comandi; se lo strumento non è in una di esse, la shell dice `command not found` anche se il file esiste sul disco.

Installa Claude Code con `npm install -g @anthropic-ai/claude-code` e verifica con `claude --version`. Se npm si lamenta dei permessi (`EACCES`) NON usare `sudo npm` — ti lascia file di proprietà di root che poi non riesci a cancellare. La soluzione corretta è puntare npm a un prefisso nella tua home: `npm config set prefix ~/.npm-global` e aggiungere `export PATH=~/.npm-global/bin:$PATH` al tuo `~/.zshrc`. Ricarica con `source ~/.zshrc`. Ora `claude` parte e ti chiede di autenticarti con il tuo account Anthropic tramite browser; quel token resta salvato e non lo reinserisci più.

VS Code è la tua finestra sul codice, mentre Claude Code sono le tue mani. Installalo da code.visualstudio.com e, al suo interno, apri la palette dei comandi (Cmd+Shift+P) → 'Shell Command: Install code command in PATH'. Questo ti dà il comando `code .` per aprire la cartella corrente in VS Code dal terminale — il gesto che farai cento volte al giorno. Installa almeno queste estensioni: quella ufficiale del tuo linguaggio, GitLens e un formattatore come Prettier. Non gonfiare l'editor con 40 estensioni; ognuna è superficie di attacco e rumore.

Il flusso di lavoro reale è sempre lo stesso e lo interiorizzerai in questo modulo. Apri un terminale, navighi al tuo progetto con `cd ~/mio-progetto`, scrivi `claude` per avviare la sessione, e in un'altra scheda (o pannello diviso di VS Code) hai l'editor aperto con `code .`. Claude Code propone modifiche, tu le rivedi nell'editor o con `git diff`, e le accetti. Il terminale e l'editor non competono: il terminale è dove avviene l'azione, l'editor è dove verifichi. In MOONKEY LAB, per esempio, una sessione tipica è `cd ~/xop && claude` e gli chiedi di toccare un componente Astro mentre tu guardi il file in VS Code.

Verifica l'intero ambiente con una prova del fuoco prima di dare il modulo per chiuso. Crea una cartella `mkdir ~/lab-01 && cd ~/lab-01`, inizializza git con `git init`, lancia `claude` e chiedigli di creare un `hola.txt` con il tuo nome. Esci da Claude, esegui `cat hola.txt` per confermare che il file esiste su disco, e `code .` per vederlo nell'editor. Se i quattro passaggi funzionano (il terminale naviga, claude parte e scrive, il file compare, VS Code lo apre) il tuo ambiente è operativo. Documenta in una nota personale le versioni esatte che hai installato: quando qualcosa si romperà tra un mese, quella nota ti farà risparmiare un pomeriggio.

ESERCIZIO

Da zero, rendi operativa la tua macchina e dimostralo: installa Node LTS, git, VS Code e Claude Code. Crea `~/lab-01`, rendilo un repo git con `git init`, lancia `claude` al suo interno e chiedigli di generare un file `entorno.md` che elenchi gli output di `node --version`, `git --version` e `claude --version`. Apri il risultato con `code entorno.md` e conferma che le tre versioni sono quelle che hai installato.

CONSEGNA

Una cartella `~/lab-01` con un repo git inizializzato e un file `entorno.md` che contiene le tre versioni verificate (Node ≥18, git, Claude Code), generato da Claude Code e aperto in VS Code.

INTUIZIONE CHIAVE

Il terminale non compete con VS Code: il terminale è dove avviene l'azione e l'editor è dove la verifichi. Un operatore ha sempre entrambi aperti e non si fida mai di ciò che l'IA dice di aver fatto senza guardare il file su disco.

ERRORI DA EVITARE

  • ×Usare `sudo npm install -g` per saltare un errore di permessi: ti lascia file di proprietà di root che poi non puoi aggiornare né cancellare senza altri sudo. Sistema invece il prefisso di npm nella tua home.
  • ×Operare da PowerShell puro su Windows invece che da WSL2: metà dei comandi dei tutorial assume Unix e dovrai tradurli uno per uno a mano.
  • ×Dimenticare di aggiungere la riga `brew shellenv` (o l'`export PATH` di npm) al tuo file di profilo: lo strumento 'funziona' in quel terminale ma 'sparisce' quando ne apri uno nuovo.
  • ×Credere che il file sia stato creato perché Claude ha detto di averlo creato: conferma sempre con `cat` o aprendo il file in VS Code prima di proseguire.
  • ×Gonfiare VS Code con decine di estensioni il primo giorno: aggiungono rumore, lentezza e superficie di attacco. Inizia con il formattatore e l'estensione del tuo linguaggio, nient'altro.
Apri la lezione →
OC-02

CLAUDE.md: contesto persistente

lezione

Scrivere un file CLAUDE.md che dia a Claude Code una memoria persistente del tuo progetto, in modo che ogni sessione parta conoscendo il tuo stack, le tue convenzioni e i tuoi divieti senza che glieli ripeti.

Senza CLAUDE.md, ogni sessione parte da zero e l'IA inventa convenzioni, aggiunge dipendenze che non vuoi e tocca cose che non dovrebbe. Con esso, lavora preciso invece che generico — è la differenza tra uno stagista che dimentica tutto ogni mattina e uno che già conosce la casa.

LA LEZIONE

CLAUDE.md è un file di testo nella radice del tuo progetto che Claude Code legge automaticamente all'avvio di ogni sessione. Non è documentazione per umani (anche se serve pure a quello): è il contesto che l'IA carica prima di fare qualsiasi cosa. Se il tuo `package.json` dice React ma tu usi Astro, o se hai una regola del tipo 'non aggiungere mai dipendenze senza giustificarle', quel file è dove vive. L'IA non indovina il tuo criterio; tu glielo scrivi una volta e lo riutilizza per sempre.

L'errore del principiante è scrivere un CLAUDE.md generico ('questo è un progetto web, usa buone pratiche'). Questo non aggiunge nulla perché l'IA assume già buone pratiche. Il valore sta nel SPECIFICO e nel NON-OVVIO: quale stack REALE usi (non quello che sembra), quali tabelle del tuo database appartengono a un altro progetto e non deve toccare, quale pattern di i18n segui, cosa si traduce e cosa no. Guarda il CLAUDE.md reale di MOONKEY LAB: ha una sezione '⚠️ Il DB Supabase è CONDIVISO con XHUB IRON' che elenca le tabelle vietate (`iron_*`, `world_*`) e quelle permesse (`profiles, progress, feedback, leads, proofs`). Quell'unica riga evita che l'IA cancelli dati di un altro prodotto. Questo è il tipo di conoscenza che solo tu hai e che il file cattura.

Struttura un CLAUDE.md efficace in sezioni chiare con intestazioni Markdown. Quelle che contano: (1) Visione — una frase su cos'è il progetto. (2) Stack REALE — versioni e strumenti esatti, segnalando dove la realtà differisce dall'apparenza. (3) Modello di sicurezza o di dati — chi può toccare cosa. (4) Convenzioni — nomi, struttura delle cartelle, tipografia, qualsiasi cosa abbia regole. (5) Tono — come deve suonare il testo che genera. (6) Regole di costo — cosa NON fare. In MOONKEY quest'ultima sezione dice letteralmente 'Non aggiungere dipendenze senza giustificazione. Niente JS dove basta HTML/CSS.' — divieti concreti, non consigli vaghi.

La regola d'oro è: ogni riga di CLAUDE.md deve cambiare una decisione. Se una frase non altera ciò che l'IA farebbe di default, toglila. 'Scrivi codice pulito' non cambia nulla. 'Gli href devono essere locale-aware: usa localizedPath(/percorso, locale), mai /percorso grezzo (si rompe sotto il prefisso di lingua)' cambia ogni link che genera. La seconda è oro; la prima è riempitivo. Un CLAUDE.md di 80 righe dense vale più di uno di 300 righe di ovvietà, e consuma meno contesto a ogni sessione.

CLAUDE.md è un documento vivo, non un atto fondativo. Ogni volta che l'IA fa qualcosa di sbagliato in modo sistematico — aggiunge una dipendenza che non volevi, usa il pattern di i18n sbagliato, traduce un termine di marca che non si traduce — quello è un difetto del file, non dell'IA. Torna e aggiungi la regola. Col tempo il file diventa il distillato di tutte le correzioni che hai fatto. In pratica, una buona sessione finisce con 'aggiungi questo a CLAUDE.md così non si ripete'. Tieni anche le cose della tua macchina e le preferenze personali fuori dal CLAUDE.md del repo (quelle vanno nella memoria utente o in un CLAUDE.local.md non versionato): quello del repo lo condivide il team.

Per scriverlo, non partire da un template vuoto. Esegui `claude` nel tuo progetto e chiedigli: 'Percorri la struttura del repo, leggi package.json e i file di config, e proponi una bozza di CLAUDE.md che catturi lo stack reale e le convenzioni che rilevi.' L'IA è bravissima a leggere il tuo stesso codice e a riassumerlo. Poi TU correggi: aggiungi i divieti che lei non può conoscere (le tabelle di un altro progetto, i termini che non si traducono, le decisioni di business) e cancelli il generico. Quel ciclo — l'IA propone dal codice, tu inietti la conoscenza che sta solo nella tua testa — produce un file onesto in venti minuti.

ESERCIZIO

In un tuo progetto (o clonane uno di esempio), lancia `claude` e chiedigli di generare una bozza di CLAUDE.md leggendo la struttura reale del repo. Poi modificala a mano finché ogni sezione è specifica: stack con versioni, un divieto concreto (qualcosa che NON deve toccare o aggiungere), e una regola di convenzione che cambi come genera codice. Cancella ogni frase che non altera una decisione. In una sessione nuova, verifica che l'IA rispetti una delle tue regole senza che gliela ripeti.

CONSEGNA

Un file `CLAUDE.md` nella radice del tuo progetto, tra le 40 e le 120 righe, con sezioni di Stack, Convenzioni, un divieto concreto e Tono — dove ogni riga cambia una decisione dell'IA — verificato in una sessione nuova.

INTUIZIONE CHIAVE

Ogni riga di CLAUDE.md deve cambiare una decisione che l'IA prenderebbe di default. Se una frase non altera il suo comportamento, è riempitivo che spreca contesto. Il file non è documentazione: è il distillato di tutte le correzioni che hai già fatto, per non ripeterle.

ERRORI DA EVITARE

  • ×Scrivere un CLAUDE.md generico ('usa buone pratiche', 'codice pulito'): non cambia nulla perché l'IA lo assume già di default. Solo lo specifico e il non-ovvio aggiungono valore.
  • ×Documentare lo stack apparente invece di quello reale: se package.json suggerisce una cosa ma ne usi un'altra, dillo esplicitamente o l'IA seguirà la pista falsa.
  • ×Trattarlo come un atto fondativo immutabile: quando l'IA sbaglia sistematicamente, è un buco del file. Torna e aggiungi la regola.
  • ×Mettere segreti, chiavi o percorsi assoluti della tua macchina: il file si versiona e si condivide. Quelle cose vanno nella memoria utente o in CLAUDE.local.md.
  • ×Dimenticare i divieti — ciò che NON deve fare (tabelle altrui, dipendenze, termini che non si traducono) — che è proprio la conoscenza che l'IA non può dedurre da sola.
Apri la lezione →
OC-03

Arsenal di prompt

lezione

Costruire un arsenale personale di prompt riutilizzabili — ciascuno con ruolo, contesto, struttura e intenzione espliciti — che producono lavoro di qualità costante invece di risposte a lotteria.

Un prompt vago dà risultati casuali e ti costringe a iterare cinque volte. Un prompt strutturato dà il risultato corretto al primo colpo, e salvandolo lo riutilizzi per sempre. La differenza tra un dilettante e un operatore è che l'operatore non improvvisa: ha dei template.

LA LEZIONE

Un prompt non è una domanda: è un'istruzione di lavoro. Quando chiedi a un collega competente di fare qualcosa, non dici 'sistema il login'; dici 'il magic-link di Supabase non reindirizza dopo l'autenticazione, controlla il callback in src/lib/supabase.ts, il problema è probabilmente l'URL di redirect nella config'. Gli dai un ruolo implicito, contesto, focus e un'ipotesi. Un buon prompt fa lo stesso in modo esplicito. I quattro pilastri sono: RUOLO (chi deve essere l'IA: 'sei un ingegnere Postgres che revisiona le RLS'), CONTESTO (cosa deve sapere: lo stack, il file, il vincolo), STRUTTURA (come vuoi l'output: 'restituisci solo l'SQL, senza spiegazione' oppure 'elenca 3 opzioni con i trade-off'), e INTENZIONE (l'obiettivo reale dietro la richiesta, non solo il passaggio).

Il RUOLO non è teatro: cambia quale conoscenza attiva l'IA e quale standard applica. 'Revisiona questo codice' produce una revisione blanda. 'Sei un auditor di sicurezza avversariale: il tuo compito è confutare l'affermazione che questa RLS sia sicura, cerca il percorso di escalation' produce un'analisi completamente diversa, perché gli hai dato una postura. In XCAP, i prompt di research portano il ruolo di 'analista che non mente a sé stesso' proprio perché il bias di default di un modello è compiacere; il ruolo lo contrasta.

La STRUTTURA dell'output è ciò che ti fa risparmiare più tempo e ciò che si dimentica più spesso. Se non specifichi il formato, l'IA ne sceglie uno e di solito è prosa lunga che devi accorciare. Di' esattamente cosa vuoi: 'Restituisci un unico blocco di SQL pronto da incollare, senza commenti né spiegazione.' Oppure 'Rispondi con una tabella a tre colonne: opzione, vantaggio, rischio.' Oppure 'Dammi il diff, non l'intero file.' In MOONKEY, dove il tono è 'chiaro, diretto, senza fumo né emoji', un prompt di generazione di copy include quel vincolo di formato alla lettera, perché altrimenti l'IA aggiunge orpelli che poi cancelli a mano.

L'INTENZIONE è il perché, e sblocca soluzioni che non hai chiesto. Se dici 'aggiungi un indice a questa colonna', l'IA lo aggiunge. Se dici 'questa query impiega 2 secondi nella pagina dell'account e voglio scendere sotto i 200ms; l'indice è la mia prima idea ma sono aperto ad alternative', potrebbe dirti che il vero problema è un N+1 e che l'indice non aiuta. Quando dai l'intenzione, l'IA può mettere in discussione la tua soluzione proposta e offrirne una migliore. Quando dai solo l'ordine, esegue alla cieca.

Un arsenale è una collezione versionata di questi prompt, organizzata per compito, che riutilizzi. Non partire da zero ogni volta: tieni un prompt di 'audit di sicurezza della RLS', uno di 'genera copy nella voce della marca', uno di 'rifattorizza questo componente preservando il comportamento', uno di 'scrivi il messaggio di commit a partire dal diff'. Salvali in un file `prompts.md` nel tuo progetto o in una nota. MOONKEY LAB ha una pagina intera, `/prompts`, dedicata a questo, perché un arsenale è un asset: ogni prompt affinato è lavoro che non ripeti. Parametrizza i prompt con segnaposto `[FILE]`, `[VINCOLO]` che riempi quando li usi.

Itera il prompt, non l'output. Quando un risultato esce male, il riflesso del principiante è correggere la risposta a mano. Il riflesso dell'operatore è chiedersi 'cosa è mancato al prompt come informazione' e sistemare il prompt. Se l'IA ha usato i tab e tu vuoi gli spazi, non modificare il file: aggiungi 'indentazione con 2 spazi' al prompt e salvalo così per sempre. Ogni correzione che metti nel template è una correzione che non rifai più. Col tempo i tuoi prompt dell'arsenale diventano chirurgici e i risultati escono bene al primo colpo — che è l'obiettivo: smettere di iterare.

ESERCIZIO

Scegli un compito che ripeti (generare messaggi di commit, revisionare la sicurezza, scrivere copy). Scrivi un prompt con i quattro pilastri espliciti — ruolo, contesto, struttura dell'output e intenzione — e provalo. Poi degradalo a una versione vaga ('fammi un commit message') e confronta i due output. Affina quello buono finché dà il risultato corretto al primo colpo e salvalo, parametrizzato con segnaposto, in un `prompts.md`.

CONSEGNA

Un file `prompts.md` con almeno tre prompt riutilizzabili, ciascuno con ruolo, contesto, formato dell'output e intenzione marcati, e parametrizzato con segnaposto `[...]` — più una nota breve che confronta l'output del prompt strutturato con la versione vaga di uno di essi.

INTUIZIONE CHIAVE

Itera il prompt, non l'output. Quando un risultato esce male, non correggere la risposta a mano: sistema il prompt e salvalo così. Ogni correzione che metti nel template è lavoro che non rifai mai più.

ERRORI DA EVITARE

  • ×Omettere il formato dell'output: senza di esso l'IA sceglie prosa lunga che accorci a mano. Di' 'solo l'SQL', 'dammi il diff', 'tabella a 3 colonne'.
  • ×Confondere il ruolo con il teatro: il ruolo ('auditor avversariale che deve confutare') cambia quale standard applica l'IA, non è decorazione.
  • ×Dare l'ordine senza l'intenzione: 'aggiungi un indice' viene eseguito alla cieca; 'voglio far scendere questa query da 2s a 200ms, l'indice è la mia idea' lascia che l'IA proponga qualcosa di meglio.
  • ×Correggere l'output invece del prompt: perdi il miglioramento. La prossima volta rifai lo stesso errore.
  • ×Non salvare i prompt che funzionano: un prompt affinato e poi dimenticato è lavoro buttato. L'arsenale è un asset che si accumula.
Apri la lezione →
OC-04

Git e GitHub per operatori

lezione

Versionare il tuo lavoro con Git e GitHub in modo da poter sperimentare, rompere cose e tornare indietro senza paura — usando branch, commit atomici e diff per revisionare ogni modifica che l'IA propone.

Senza controllo di versione, una cattiva modifica dell'IA può distruggere ore di lavoro e non c'è ritorno. Con Git, ogni stato buono resta salvato e puoi annullare qualsiasi cosa. È la rete di sicurezza che ti permette di lavorare veloce e senza paura.

LA LEZIONE

Git risolve un solo problema, ma è il più importante: poter tornare a qualsiasi stato precedente del tuo progetto. Ogni volta che fai un `commit`, congeli una foto del progetto a cui puoi sempre tornare. Questo cambia la tua psicologia di lavoro: quando sai che l'ultimo stato buono è salvato, lasci che l'IA faccia modifiche aggressive senza paura, perché il peggio che può succedere è `git restore` e torni indietro. Un operatore senza Git lavora con paura; con Git, lavora veloce. Il flusso minimo è: `git status` per vedere cosa è cambiato, `git add -p` per revisionare e scegliere le modifiche pezzo per pezzo, `git commit -m 'messaggio'` per congelare, e `git log --oneline` per vedere la tua storia.

Il ciclo quotidiano è vedere-revisionare-congelare. Dopo una sessione di Claude Code, NON fidarti MAI che la modifica sia corretta: esegui `git diff` e leggi esattamente cosa ha toccato. È qui che scopri se l'IA ha cambiato qualcosa che non doveva, ha cancellato una riga per sbaglio o ha aggiunto una dipendenza. `git diff` è il tuo strumento di revisione numero uno e lo usi a ogni sessione. Solo quando il diff ti convince, fai `git add` e `git commit`. Questa abitudine — leggere il diff prima di accettare — è ciò che separa un operatore da chi copia e incolla alla cieca.

I commit devono essere atomici: un commit, una modifica logica, con un messaggio che spiega il PERCHÉ, non il cosa. 'Sistema il login' è pessimo (cos'aveva?). 'Corregge il redirect del magic-link: l'URL di callback non includeva il locale e si rompeva sotto /en/' è buono: tra sei mesi, quel messaggio ti dice perché hai toccato quel file. Claude Code è eccellente nello scrivere messaggi di commit a partire dal diff — chiedigli 'scrivi un messaggio di commit per queste modifiche spiegando il perché' e di solito ci azzecca. Ma controlla: a volte descrive il cosa e devi chiedergli il perché.

I branch (`branches`) sono universi paralleli per sperimentare senza toccare ciò che funziona. Il branch principale (`main`) è la tua versione stabile. Quando stai per provare qualcosa di rischioso — una rifattorizzazione grande, una nuova feature — crei un branch con `git checkout -b mio-esperimento`, ci lavori, e se va bene lo fondi; se va male, lo cancelli e `main` non se ne accorge nemmeno. Regola pratica da operatore: non lavorare mai direttamente su `main` per modifiche non banali. Crea un branch. In MOONKEY LAB ogni modifica di sicurezza o di RLS va nel suo branch e si fonde solo quando `get_advisors` dà il via libera.

GitHub è Git nel cloud: il tuo backup remoto e il posto da cui si fa il deploy del tuo progetto. Connetti il tuo repo locale con `git remote add origin git@github.com:utente/repo.git` e carichi con `git push`. Da quel momento, `git push` dopo ogni sessione buona salva il tuo lavoro fuori dalla tua macchina — se il tuo disco muore, il tuo progetto vive. Inoltre, piattaforme come Cloudflare Pages (che fa il deploy di MOONKEY LAB da `garciafradepablo-pixel/xop`) osservano il tuo repo GitHub e pubblicano automaticamente ogni push su `main`. Così Git non è solo versionamento: è il motore del tuo deploy, che vedrai nel prossimo modulo. Per parlare con GitHub dal terminale, installa la CLI `gh` e autenticati con `gh auth login`.

Un `.gitignore` è importante quanto i commit: elenca i file che Git deve IGNORARE. Qui vanno `node_modules/` (si reinstalla da package.json, non si versiona), i file `.env` (segreti — MAI caricare chiavi su GitHub), e gli artefatti di build. Caricare un `.env` con una chiave in un repo pubblico è uno degli incidenti di sicurezza più comuni al mondo, e una volta caricata la chiave, anche se cancelli il commit, resta nella storia: bisogna ruotarla. Per questo il `.gitignore` si configura PRIMA del primo commit. Chiedi a Claude Code 'genera un .gitignore per un progetto Astro con Supabase' e controlla che includa `.env` e `node_modules`.

ESERCIZIO

Prendi un progetto, inizializzalo con `git init` e crea un `.gitignore` che escluda `node_modules` e `.env`. Fai un commit iniziale. Crea un branch `git checkout -b esperimento`, chiedi a Claude Code una modifica aggressiva, revisiona il risultato con `git diff`, e fai commit con un messaggio che spiega il perché (chiedilo all'IA e correggilo). Torna su `main` con `git checkout main` e conferma che la modifica non è lì. Carica tutto su un nuovo repo GitHub con `gh repo create` e `git push`.

CONSEGNA

Un repo su GitHub con un `.gitignore` corretto (che esclude `.env` e `node_modules`), una storia di almeno due commit con messaggi che spiegano il perché, e un branch `esperimento` separato da `main` che dimostra lavoro isolato.

INTUIZIONE CHIAVE

Leggi il `git diff` prima di accettare qualsiasi modifica dell'IA. È il tuo strumento di revisione numero uno: lì scopri cosa l'IA ha toccato senza dirtelo. Accettare alla cieca è il modo più rapido per introdurre un bug di cui non saprai da dove è uscito.

ERRORI DA EVITARE

  • ×Lavorare direttamente su `main` per modifiche rischiose: se vanno male, contamini la tua versione stabile. Crea un branch e isola l'esperimento.
  • ×Caricare un file `.env` con segreti su GitHub: resta nella storia per sempre anche se cancelli il commit; bisogna ruotare la chiave. Configura il `.gitignore` PRIMA del primo commit.
  • ×Accettare le modifiche dell'IA senza leggere `git diff`: ti porti dietro righe cancellate o dipendenze aggiunte che non noterai finché qualcosa non si rompe.
  • ×Messaggi di commit che descrivono il cosa ('modifiche al login') invece del perché: tra sei mesi non ti dicono nulla. Spiega la causa.
  • ×Commit giganti che mischiano cinque modifiche distinte: impossibili da revisionare e da revertire selettivamente. Un commit, una modifica logica.
Apri la lezione →
OC-05

Automazioni e deploy

lezione

Trasformare uno script o un compito manuale in un sistema che gira e pubblica da solo — dall'automatizzare un comando ripetitivo al fare il deploy del tuo sito automaticamente a ogni push e programmare compiti che si eseguono senza di te.

Tutto ciò che fai a mano e ripeti è tempo che perdi e un punto dove ti dimentichi un passaggio. Automatizzare il deploy e i compiti ricorrenti trasforma il tuo lavoro da 'lo faccio io ogni volta' a 'il sistema lo fa da solo e bene', che è la differenza tra un hobby e un'operazione.

LA LEZIONE

L'automazione inizia nel piccolo: un comando che ripeti diventa uno script. Se ogni volta che finisci scrivi `npm run build && git add -A && git commit -m wip && git push`, quello è uno script `deploy.sh` di quattro righe che esegui con `./deploy.sh`. Il principio è: ciò che fai più di tre volte, lo salvi. Chiedi a Claude Code 'crea uno script bash che faccia build, commit con timestamp e push, e che si interrompa se il build fallisce' — il `&&` tra i comandi garantisce già che se uno fallisce, i successivi non girano, che è esattamente ciò che vuoi in un deploy.

Il deploy moderno di un sito statico è quasi gratis da montare e si chiama deploy continuo. Piattaforme come Cloudflare Pages osservano il tuo repo GitHub: ogni volta che fai `git push` su `main`, clonano il tuo repo, eseguono il tuo comando di build (`npm run build` per Astro), e pubblicano il risultato su un URL reale. MOONKEY LAB funziona esattamente così: `git push` al repo `garciafradepablo-pixel/xop` e qualche secondo dopo le modifiche sono su `moonkeylab.pages.dev`. Non carichi file via FTP, non tocchi un server: il tuo unico gesto di deploy è `git push`. Questo unisce il modulo di Git con questo: Git non solo versiona, è il grilletto del deploy.

Configurare il deploy continuo è un processo da fare una sola volta. Connetti il tuo account Cloudflare (o Vercel, o Netlify) a GitHub, scegli il repo, e dichiari due cose: il comando di build (`npm run build`) e la cartella di output (`dist` in Astro). Cloudflare salva quella config e da lì ogni push fa partire un build. Se il build fallisce, NON pubblica — il tuo sito precedente resta vivo. Questa è una proprietà di sicurezza enorme: un commit rotto non butta giù il tuo sito, semplicemente non viene fatto il deploy e ti avvisa. Vedrai il log del build nel pannello di Cloudflare; quando qualcosa fallisce nel deploy ma funziona in locale, quel log è la prima cosa che leggi.

Le variabili d'ambiente sono il ponte tra il tuo deploy e i tuoi segreti, e qui si incrocia con la sicurezza. Il tuo codice ha bisogno dell'URL di Supabase e della anon key, ma quelle NON vanno hardcoded nel repo (l'hai visto nel modulo di Git). In locale vivono in un `.env`; nel deploy le metti nel pannello di Cloudflare come variabili d'ambiente, e la piattaforma le inietta nel build. Distinzione critica che imparerai a fondo in Ops & Security: la anon key di Supabase PUÒ vivere nel client (è protetta da RLS), ma una service-role key MAI — quella darebbe accesso totale saltando tutta la sicurezza. Sapere quale chiave va dove è competenza da operatore.

Il livello successivo è automatizzare compiti ricorrenti che non dipendono da un push: cose che devono girare secondo un orario. Questi sono compiti programmati (cron). In XCAP, per esempio, ci sono gli 'autopilot ticks' — loop che girano periodicamente per ingerire dati di mercato e aggiornare il ledger di Market Memory senza che nessuno prema un pulsante. L'idea generale: definisci un comando e un orario ('ogni giorno alle 6:00', 'ogni 15 minuti'), e la piattaforma lo esegue da sola. Per un sito statico questo di solito vive in funzioni serverless (Cloudflare Workers) o in cron job. La chiave da operatore è che il loop sia onesto e idempotente: che girare due volte non duplichi dati, e che accumuli apprendimento invece di rumore — esattamente la disciplina del 'capital invariant' di XCAP, dove lo stato cambia solo in eventi reali, non a ogni tick.

Automatizzare senza osservabilità è pericoloso: un sistema che gira da solo e fallisce in silenzio è peggio di uno manuale. Per ogni automazione, abbi un modo per sapere se ha funzionato. Il build di Cloudflare ti manda una email se fallisce. Un compito cron deve loggare il suo risultato da qualche parte che tu controlli. La regola: non automatizzare mai qualcosa che non puoi verificare dopo. Inizia sempre da una versione che gira e ti avvisa, e solo quando ti fidi la lasci girare davvero da sola. Un deploy automatico senza revisionare il log la prima volta è come si pubblica un sito rotto in produzione senza accorgersene.

ESERCIZIO

Prendi il repo GitHub del modulo precedente e connettilo a Cloudflare Pages (o Vercel): configura il comando di build e la cartella di output, e metti le variabili d'ambiente nel pannello invece che nel codice. Fai una piccola modifica, `git push`, e conferma nel log di build che il deploy è avvenuto da solo su un URL reale. Come bonus, scrivi un `deploy.sh` che faccia build+commit+push e si interrompa se il build fallisce.

CONSEGNA

Un sito con deploy su un URL pubblico reale (Cloudflare Pages o simile) che si ricostruisce automaticamente a ogni `git push`, con i segreti nelle variabili d'ambiente del pannello (non nel repo) e un `deploy.sh` che si interrompe davanti a un build fallito.

INTUIZIONE CHIAVE

Non automatizzare mai qualcosa che non puoi verificare dopo. Un sistema che gira da solo e fallisce in silenzio è peggio di uno manuale. Ogni automazione ha bisogno di un canale che ti avvisi — il log di build, una email, un registro che controlli — prima di fidarti che giri da sola.

ERRORI DA EVITARE

  • ×Hardcodare l'URL e le chiavi di Supabase nel codice invece di usare le variabili d'ambiente: le carichi su GitHub e si espongono. Vanno nel `.env` locale e nel pannello del deploy.
  • ×Confondere la anon key con la service-role key: la anon PUÒ andare nel client (la RLS la protegge), la service-role MAI — darebbe accesso totale saltando la sicurezza.
  • ×Lasciare un deploy automatico senza guardare il log la prima volta: se il build fallisce nel cloud ma funziona in locale, pubblichi un sito rotto o non pubblichi nulla senza accorgertene.
  • ×Scrivere compiti cron non idempotenti: girare due volte duplica i dati. Il loop deve accumulare apprendimento, non rumore (la disciplina dei tick di XCAP).
  • ×Automatizzare senza osservabilità: uno script che fallisce in silenzio ti dà una falsa sensazione che vada tutto bene finché il danno non è grande.
Apri la lezione →
OC-06

Migrazione ChatGPT → Claude

lezione

Spostare il tuo lavoro da ChatGPT a Claude Code montando un sistema documentato e versionato — dove il contesto vive in CLAUDE.md e in file del repo invece di perdersi in thread di chat, e dove l'IA agisce sui tuoi file reali invece di solo conversare.

In ChatGPT il tuo contesto vive intrappolato in thread che si perdono e l'IA non tocca i tuoi file reali: copi e incolli a mano. Migrare a Claude Code trasforma quel caos in un sistema documentato, versionato e operativo. È il salto da 'conversare con un'IA' a 'operare un'IA sul tuo progetto reale'.

LA LEZIONE

La differenza fondamentale non è di modello, è di paradigma. ChatGPT è una conversazione: tu scrivi, l'IA risponde con testo, e tu copi quel testo nel tuo progetto a mano. Il contesto vive nel thread, e quando il thread cresce troppo o lo chiudi, quel contesto evapora. Claude Code è un operatore: vive nel tuo terminale, legge e scrive i tuoi file direttamente, esegue comandi, fa commit. Il contesto non vive in una conversazione effimera — vive in CLAUDE.md e nel tuo repo, che sono permanenti e versionati. Migrare significa spostare la tua conoscenza da un posto che si cancella a uno che persiste.

Inizia controllando quale contesto prezioso hai intrappolato in ChatGPT. Probabilmente ci sono thread dove hai definito lo stack di un progetto, decisioni di architettura, convenzioni di stile, prompt che ti hanno funzionato bene. Tutto questo è un asset che ora esiste solo nei thread. Il primo passo della migrazione è estrarlo: percorri le tue conversazioni importanti ed estrai le decisioni durature (non l'intera chat, le conclusioni). 'Usiamo Astro, non React, per X', 'il tono è diretto senza emoji', 'il DB lo condivido con un altro progetto e queste tabelle sono intoccabili'. Questo è esattamente il materiale di un CLAUDE.md.

Il cuore della migrazione è costruire il CLAUDE.md a partire da quel contesto estratto. Ciò che in ChatGPT dovevi ripetere all'inizio di ogni thread ('ricorda che uso Astro e Supabase e il tono è...'), in Claude Code lo scrivi una volta in CLAUDE.md e si carica da solo a ogni sessione, per sempre. Questo si collega direttamente al modulo OC-02: la migrazione non è altro che riversare il contesto disperso dei tuoi thread nel file di memoria persistente. Un buon esercizio è chiedere a ChatGPT stesso: 'riassumi tutte le decisioni tecniche e le convenzioni di questo thread in formato bullet per un file di contesto' — e usare quell'output come bozza.

Cambia anche il tuo modo di chiedere le cose. In ChatGPT chiedi 'scrivimi il codice per X' e ricevi un blocco che incolli. In Claude Code chiedi 'crea il file src/lib/x.ts che faccia X, seguendo le convenzioni di CLAUDE.md, e mostrami il diff' — l'IA crea il file al suo posto, tu revisioni il diff con git, e fai commit. Il gesto del copia-e-incolla scompare. Questo richiede di disimparare un'abitudine: smettere di trattare l'IA come un generatore di testo e iniziare a trattarla come un collaboratore che agisce sul tuo progetto. All'inizio costa fidarsi che tocchi i file corretti; per questo `git diff` e i commit del modulo OC-04 sono la tua rete di sicurezza.

Migrare bene significa montare l'intero sistema, non solo cambiare strumento. Il sistema di un operatore è: un repo con git, un CLAUDE.md con il contesto, un .gitignore che protegge i segreti, un arsenale di prompt in un prompts.md, e il deploy continuo connesso. Quando hai questi cinque elementi, hai smesso di 'usare un'IA' e hai montato un'operazione. Ognuno dei moduli precedenti di Operator Core era un pezzo; questo modulo li assembla migrando un progetto reale dal caos dei thread di ChatGPT fino a quel sistema documentato. Il risultato è che qualsiasi sessione nuova — tua o di un collaboratore — parte con tutto il contesto caricato.

Il valore che sentirai subito è la continuità. In ChatGPT, riprendere un progetto dopo una settimana significa rileggere i thread e ricordare dov'eri. Nel sistema migrato, apri il terminale, `cd` al progetto, `claude`, e l'IA già sa lo stack, le convenzioni e i divieti perché sono in CLAUDE.md; tu vedi dov'eri in `git log`. Il progetto si documenta da solo. Quella continuità è ciò che permette di operare molti progetti in parallelo senza che si mescolino — come serve quando porti avanti XNLAB, XHUB, XCAP, Espejo e questa scuola in parallelo: ognuno con il suo CLAUDE.md, il suo repo e il suo contesto isolato, tutti operati con lo stesso flusso.

ESERCIZIO

Scegli un progetto che hai portato avanti in ChatGPT. Estrai dai tuoi thread le decisioni e le convenzioni durature (chiedi a ChatGPT di riassumerle in bullet). Crea il repo con git, riversa quel contesto in un CLAUDE.md, aggiungi un .gitignore che protegga i segreti, e salva in un prompts.md i 2-3 prompt che usavi di più. Poi lancia `claude` e chiedigli un compito reale del progetto chiedendo il diff invece di un blocco di testo — revisionalo con git e fai commit. Confronta l'esperienza con come lo facevi prima.

CONSEGNA

Un progetto migrato e operativo: repo git con CLAUDE.md (contesto estratto dai tuoi thread), .gitignore che protegge i segreti, prompts.md con i tuoi prompt chiave, e almeno un commit di una modifica reale fatta da Claude Code sui file (non copiata-incollata).

INTUIZIONE CHIAVE

Il cambiamento reale non è di modello, è di paradigma: passi dal conversare (contesto intrappolato in thread che si cancellano) all'operare (contesto vivo in CLAUDE.md e nel repo, permanente e versionato). Migrare significa spostare la tua conoscenza da un posto che evapora a uno che persiste e si carica da solo.

ERRORI DA EVITARE

  • ×Copiare l'intero contenuto dei thread di ChatGPT invece di estrarre solo le decisioni durature: riempi il CLAUDE.md di rumore conversazionale invece che di regole che cambiano decisioni.
  • ×Continuare a usare Claude Code come ChatGPT — chiedendo blocchi di testo da copiare-incollare — invece di lasciare che agisca sui file e revisionare il diff. Perdi tutto il valore del paradigma.
  • ×Migrare lo strumento ma non montare il sistema: senza CLAUDE.md, senza git, senza .gitignore, sei ancora nel caos, solo che in un altro terminale.
  • ×Fidarti alla cieca che l'IA abbia toccato i file corretti senza revisionare `git diff`: proprio quando migri, quando ancora non hai intuizione del suo comportamento, quella rete di sicurezza è imprescindibile.
  • ×Mescolare il contesto di più progetti in un solo posto: ogni progetto ha bisogno del proprio repo e del proprio CLAUDE.md isolato, o le convenzioni di uno si filtrano in un altro.
Apri la lezione →
OC-07

Verificación y testing

lezione

Costruire una checklist di verifica riutilizzabile e applicarla a una modifica reale di Claude Code prima di pubblicarla, dimostrando che la modifica fa ciò che dice.

Il fallimento numero uno dell'operatore alle prime armi non è scrivere male il prompt: è credere al "fatto, ora funziona" dell'IA. Claude Code ti consegna un diff che compila, suona sicuro e a volte gira pure, ma verificare che compila NON è verificare che funziona. La verifica è la frontiera tra qualcuno che muove file e un operatore di cui ci si può fidare: significa che quando dici "è fatto", è fatto. Non è una fase opzionale alla fine del lavoro; è il lavoro. Una modifica non verificata è un'ipotesi, non un deliverable, e mandare ipotesi in produzione è il modo in cui l'academy perde clienti e il modo in cui tu perdi la mattina seguente a sistemare ciò che hai rotto ieri.

LA LEZIONE

Verifica NON è testing automatizzato, e NON è solo di sicurezza. È la disciplina generale di provare che una modifica si comporta come ti aspetti PRIMA di pubblicarla. Ha quattro livelli che si applicano in ordine e quasi mai ti servono tutti e quattro: (1) compila / parte senza errore? (2) il diff dice ciò che credevi di chiedere? (3) il comportamento osservabile è cambiato come ti aspettavi? (4) hai rotto qualcosa che prima funzionava (regressione)?

Il livello economico e obbligatorio: LEGGERE IL DIFF. Prima di accettare nulla, `git diff` (o il pannello di diff dell'editor). Claude Code è eccellente nel descrivere ciò che ha fatto e mediocre nel rivelare ciò che ha fatto in più: un file che non hai chiesto di toccare, un `console.log` dimenticato, una dipendenza aggiunta, un blocco cancellato "di passaggio". Se il diff tocca più di quanto la tua frase chiedeva, quello è un segnale, non una coincidenza. Regola: non accettare mai una modifica il cui diff non capisci riga per riga.

"Sembra che funzioni" è una bugia comoda con tre facce. Faccia 1: è partito senza errore → confondi 'non crasha' con 'fa la cosa giusta'. Faccia 2: l'ho provato una volta con il caso felice → non hai provato l'input vuoto, il duplicato, l'utente senza permesso. Faccia 3: l'IA mi ha detto che l'ha verificato → l'IA non ha eseguito nulla, ha predetto testo. L'antidoto è sempre lo stesso: osservare il comportamento reale con i tuoi occhi, non accettare il resoconto di chi ha fatto la modifica (né umano né IA).

Smoke test = il percorso più corto che dimostra che il pezzo centrale respira. Non è copertura totale; è il 20% di prove che catturano l'80% dei disastri. Per un sito web: lancia `npm run dev`, apri la rotta che hai toccato, fai l'azione principale, guarda che succeda ciò che ti aspetti. Per uno script: eseguilo con un input noto e confronta l'output con ciò che SAI debba dare. Definisci lo smoke test PRIMA di chiedere la modifica, non dopo, per non ingannarti aggiustando la prova al risultato.

Asserzione sopra l'osservazione: non guardare lo schermo cercando conferma, definisci in anticipo l'affermazione falsificabile. Male: "vediamo se carica bene". Bene: "inviando il form senza email, deve comparire l'errore 'email richiesta' e NON deve essere inserita una riga in `leads`". Una buona verifica si può scrivere come una frase che sarebbe chiaramente falsa se la modifica fosse fallita. Se non riesci a scrivere quella frase, non sai cosa stai verificando.

Regressione: la modifica nuova spesso rompe quella vecchia. La domanda che separa il senior dal junior non è "la mia feature funziona?" ma "cosa funzionava prima che la mia modifica potrebbe aver rotto?". In questa scuola, toccare `galaxy.ts` può rompere la mappa SVG e tutte le pagine di costellazione, perché si generano dallo stesso file. Prima di pubblicare, elenca mentalmente quali ALTRE cose dipendono da ciò che hai toccato e verificane almeno una.

Come usare Claude Code COME verificatore, senza delegargli il giudizio: chiedigli di eseguire il comando reale (`npm run build`, il test, lo script) e di incollarti l'OUTPUT grezzo, non il suo riassunto. "Esegui il build e incollami l'output completo" è verificabile; "il build funziona?" invita all'allucinazione compiacente. L'IA verifica eseguendo e mostrando evidenza; tu verifichi leggendo quell'evidenza. Mai il contrario.

Verifica proporzionale al rischio (non ogni verifica costa uguale). Cambiare un testo di copy: leggere il diff basta. Toccare la RLS, un trigger di Postgres o il flusso di pagamento: build + smoke + regressione + revisione degli advisors. L'operatore maturo calibra lo sforzo di verifica al costo di sbagliare, non verifica tutto allo stesso modo né si fida di tutto allo stesso modo.

ESERCIZIO

Prendi una modifica piccola e reale in questo repo (es. aggiustare il `blurb` di un modulo in `src/data/galaxy.ts`, o aggiungere un termine al `glosario.ts`). PRIMA di toccare nulla, scrivi in un file `VERIFY.md` tre asserzioni falsificabili sul risultato atteso (es. "la pagina /constelacion/operator-core mostra il nuovo blurb", "`npm run build` termina senza errore", "il resto dei moduli continua ad apparire uguale"). Chiedi la modifica a Claude Code. Poi: (1) leggi l'intero `git diff` e annota qualsiasi riga che non ti aspettavi; (2) esegui `npm run build` e incolla l'output; (3) lancia `npm run dev` e verifica con i tuoi occhi le tue tre asserzioni, segnando ognuna PASSA/FALLISCE. Se qualcuna fallisce, NON pubblichi: sistemi e ripeti il ciclo.

CONSEGNA

Un `VERIFY.md` con le 3 asserzioni falsificabili scritte PRIMA della modifica, ognuna segnata PASSA/FALLISCE con l'evidenza osservata (output del build incollato + cosa hai visto sullo schermo), e la conferma che il `git diff` non contiene righe inattese. È la prova che hai verificato il comportamento, non che l'IA ha detto di sì.

INTUIZIONE CHIAVE

La domanda dell'operatore non è "l'IA ha detto che funziona?" ma "quale evidenza ho, con i miei occhi, che funziona — e cosa potrebbe aver rotto che prima funzionava?". Chi pubblica senza quell'evidenza non è più veloce: sta chiedendo tempo in prestito al suo io di domani, con gli interessi.

ERRORI DA EVITARE

  • ×Accettare il diff senza leggerlo perché "compila" — compilare prova la sintassi, non l'intenzione; leggi sempre riga per riga ciò che ha toccato.
  • ×Provare solo il caso felice e dichiarare vittoria — il bug vive nell'input vuoto, nel duplicato e nell'utente senza permesso, non nel percorso che già sapevi avrebbe funzionato.
  • ×Chiedere a Claude Code "questo funziona?" invece di "esegui il comando e incollami l'output" — il primo invita a un'allucinazione compiacente; il secondo produce evidenza.
  • ×Dimenticare la regressione: verificare solo la feature nuova e non controllare cosa dipendeva da ciò che hai toccato (in questo repo, `galaxy.ts` alimenta la mappa E tutte le pagine di costellazione).
  • ×Scrivere la prova DOPO aver visto il risultato e aggiustarla perché passi — l'asserzione si definisce prima della modifica o non vale come verifica.
OC-08

Sesiones largas y orquestación

lezione

Progettare un protocollo per le sessioni lunghe: rilevare la degradazione del contesto, montare un handoff che riparta pulito senza perdere lo stato, e delegare un ramo di lavoro a un subagente. Consegnare il protocollo applicato a una sessione reale.

Questo è il modo di fallimento QUOTIDIANO dell'operatore IA, e quasi nessuno lo nomina. La finestra di contesto non è infinita: man mano che la sessione cresce, Claude Code inizia a dimenticare decisioni di un'ora fa, a ripetere lavoro, a contraddire ciò che avete concordato, a modificare il file sbagliato. Non è che il modello sia diventato stupido; è che hai continuato a spingere una sessione già satura. L'operatore alle prime armi lo sopporta, combatte contro un'IA sempre più persa, e perde il pomeriggio. Il professionista riconosce il segnale presto e fa la cosa controintuitiva: si ferma, riassume, riparte o delega. Sapere QUANDO ripartire da zero e come farlo senza perdere il filo vale più di qualsiasi prompt perfetto, perché nessun prompt sopravvive a un contesto marcio.

LA LEZIONE

I segnali di degradazione del contesto, in ordine di comparsa: (1) l'IA ti chiede di nuovo qualcosa a cui hai già risposto; (2) re-implementa codice che già esisteva o annulla una modifica concordata; (3) le sue risposte diventano generiche, perdono i nomi concreti del tuo progetto; (4) modifica il file sbagliato o inventa percorsi. Appena vedi il segnale 1-2, sei nella zona rossa. Non aspettare il segnale 4: lì stai già ripulendo un disastro, non avanzando.

L'intuizione corretta è controintuitiva: quando la sessione deraglia, fermarsi e ripartire è PIÙ VELOCE che insistere. Combattere contro un contesto saturo è interesse composto negativo: ogni turno aggiunge rumore al rumore. La domanda non è "come glielo spiego meglio?" ma "questo contesto mi aiuta ancora o ormai mi ostacola?". Se ostacola, la soluzione non è un prompt migliore, è un contesto nuovo.

L'handoff: come ripartire SENZA perdere lo stato. Prima di chiudere una sessione deragliata, chiedi il riassunto di passaggio: "Riassumi in un blocco cosa stavamo cercando di fare, quali decisioni abbiamo preso, quali file abbiamo toccato, cosa è rimasto in sospeso e qual è il prossimo passo concreto". Quel blocco è il tuo stato portatile. Sessione nuova → incolli il riassunto → Claude Code riparte con contesto fresco e memoria di ciò che conta, senza trascinarsi dietro il rumore. L'handoff trasforma un riavvio a perdita totale in un riavvio a costo quasi zero.

La tua memoria persistente vive su disco, non nella finestra. Ciò che conta davvero non deve vivere solo nella chat: vive in `CLAUDE.md` (decisioni di progetto, convenzioni, cosa NON toccare) e in file di note del repo. Una sessione nuova che legge il tuo `CLAUDE.md` già sa l'essenziale. Regola: se una decisione ti servirà domani, non lasciarla nella chat — scrivila in `CLAUDE.md`. La finestra di contesto è RAM volatile; il repo è il tuo disco.

Prevenzione: sessioni corte e di focus unico superano la maratona. Una sessione = un obiettivo circoscritto. "Sistema la verifica della RLS" è una buona sessione; "rifattorizza tutto il backend" è una maratona che si degraderà a metà. Quando un compito è grande, lo spezzi in sessioni indipendenti con handoff tra loro, non lo metti intero in una finestra che non regge.

Delega ai subagenti: parallelismo e isolamento del contesto. Un subagente è una sessione figlia con la PROPRIA finestra di contesto, a cui dai un compito circoscritto e un deliverable definito. Due guadagni: (1) lavoro in parallelo — un subagente fa l'audit della sicurezza mentre un altro scrive i test; (2) isolamento — il subagente brucia il suo contesto investigando un file enorme e ti restituisce solo il riassunto, senza contaminare la tua sessione principale. Deleghi ciò che è voluminoso da esplorare ma compatto da riportare.

Come scrivere un buon incarico per un subagente: come se il subagente non avesse memoria della tua conversazione — perché non ce l'ha. Percorsi assoluti, contesto autocontenuto, e un deliverable esplicito ("restituiscimi X"). Un incarico vago a un subagente è peggio che non delegare: sprechi un'intera finestra per ricevere spazzatura generica. Il subagente brilla in compiti dal confine chiaro, non in "aiutami con questo".

Recuperare il filo quando Claude Code si perde a metà compito: non continuare a spingere. Fermati, chiedigli di dirti con PAROLE SUE cosa crede di stare facendo e perché. Se la sua versione non coincide con la tua, lì sta la deriva — correggila esplicitamente o fai handoff a una sessione pulita. L'opzione peggiore è quella del principiante: dare altre istruzioni sopra un modello che ha già capito male, accatastando correzioni su un malinteso di base.

ESERCIZIO

Nella tua prossima sessione di lavoro reale in questo repo, tieni un registro vivo. (1) Annota il primo momento in cui rilevi un segnale di degradazione (l'IA ripete, dimentica un nome, tocca il file sbagliato) e quale fosse. (2) A quel punto, invece di insistere, chiedi il blocco di handoff (cosa stavamo cercando di fare, decisioni, file, in sospeso, prossimo passo). (3) Apri una sessione nuova, incolla l'handoff, e verifica che riprenda senza richiedere ciò che era già risolto. (4) A parte, delega a un subagente UN compito circoscritto con deliverable esplicito — es. "Leggi `src/data/galaxy.ts` e restituiscimi la lista di tutti i `code` di modulo con il loro `status`, nient'altro" — e verifica che il report sia utilizzabile senza che il subagente conoscesse la tua conversazione.

CONSEGNA

Un `SESSION-LOG.md` con: il segnale di degradazione che hai rilevato (quale e in quale turno), il blocco di handoff che hai generato, la conferma che la sessione nuova ha ripreso senza richiedere di nuovo, e l'incarico + report del subagente. È la prova che sai operare la sessione come una risorsa finita, invece di sopportarla finché non si rompe.

INTUIZIONE CHIAVE

L'abilità invisibile dell'operatore senior non è scrivere il prompt perfetto: è sapere quando il contesto attuale è ormai una zavorra e avere il riflesso di ripartire puliti con un handoff invece di combattere. La finestra di contesto è RAM volatile; la tua disciplina di handoff e il tuo `CLAUDE.md` sono il disco. Chi confonde i due perde il pomeriggio a difendere una sessione che era già morta.

ERRORI DA EVITARE

  • ×Insistere su una sessione satura con sempre più prompt — è interesse composto negativo; ogni turno aggiunge rumore, la soluzione è contesto nuovo, non un prompt migliore.
  • ×Ripartire senza handoff e perdere tutto lo stato — chiedi sempre il blocco di riassunto (intenzione, decisioni, file, in sospeso, prossimo passo) prima di chiudere.
  • ×Lasciare decisioni importanti solo nella chat invece di scriverle in `CLAUDE.md` — la chat è RAM volatile; ciò che ti servirà domani va su disco.
  • ×Mettere un compito enorme ("rifattorizza tutto") in un'unica maratona che si degrada a metà — spezzalo in sessioni di focus unico con handoff tra loro.
  • ×Delegare a un subagente con un incarico vago e senza deliverable — senza percorsi assoluti, contesto autocontenuto e un "restituiscimi X" esplicito, sprechi un'intera finestra per ricevere spazzatura generica.

Costellazione successiva

Data & Systems

Backend che regge