Claude Code per i fallimenti CI: chiedi di citare l'output fallito, suggerire la correzione più piccola e aggiungere un test di regressione per evitare ricorrenze.

go test ./..., npm test, flutter test, golangci-lint run).\n- I percorsi file menzionati nell'errore, più eventuali config rilevanti (config test, config del linter, script di build).\n- Cosa è cambiato di recente: sommario diff della PR, bump di dipendenze, modifiche di config CI.\n- Se è flakiness: due o tre run fallite e una passata, se le hai.\n\nAggiungi vincoli in parole semplici. Se vuoi una correzione minima, dillo: niente refactor, nessun cambiamento di comportamento a meno che non sia necessario, mantieni la patch limitata all'area fallita.\n\nUn esempio semplice: CI fallisce a uno step di lint dopo un bump di dipendenza. Incolla l'output del lint a partire dal primo warning, includi il comando che CI ha usato e menziona la singola modifica di versione del package. Questo è sufficiente per suggerire una modifica di config di una riga o una piccola correzione al codice, invece di riformattare metà del repo.\n\nSe vuoi qualcosa pronto da incollare, questa struttura di solito basta:\n\ntext\nCI command:\n\nFailing output (full):\n\nRecent changes:\n\nConstraints (smallest fix, no refactor):\n\nFlaky? (runs attached):\n\n\n## Regole di prompt che costringono a leggere l'output fallito\n\nQuando un modello sbaglia su un break CI, è di solito perché il tuo prompt gli permette di indovinare. Il tuo compito è farlo mostrare il suo lavoro usando l'esatto output fallito, poi impegnarsi sulla modifica più piccola che potrebbe far passare il job.\n\n### Regole che mantengono il modello onesto\n\nRichiedi evidenze e un piano minimo. Un buon prompt forza cinque cose:\n\n- Cita le esatte righe fallite del log CI (errori, stack trace, file:linea) e dì esplicitamente "Sto usando queste righe."\n- Dai una diagnosi in una frase, senza attenuanti.\n- Proponi un piano di patch minimale con 1–3 modifiche, nominando i file esatti che toccherà.\n- Evita cambi non correlati (niente formattazione, rinomi, refactor, bump di dipendenze) a meno che tu non li approvi.\n- Elenca cosa non è sicuro e il singolo dettaglio che confermerebbe la diagnosi.\n\nL'incertezza va bene. L'incertezza nascosta è ciò che fa perdere tempo.\n\n### Frammento di prompt pronto da incollare\n\nIncolla questo all'inizio della tua domanda su CI:\n\ntext\nUse ONLY the evidence in the CI output below.\n1) Quote the exact failing lines you are using.\n2) Give ONE sentence: the most likely cause.\n3) Propose the smallest fix: 1-3 edits, with file paths.\n4) Do NOT do formatting/renames/refactors or "cleanup".\n5) List uncertainties + the one extra detail that would confirm the diagnosis.\n\n\nSe il log dice "expected 200, got 500" più uno stack trace in user_service.go:142, questa struttura spinge la risposta verso quella funzione e una piccola clausola di guardia o gestione dell'errore, non verso un ridisegno dell'endpoint.\n\n## Un template di prompt pronto per i fallimenti CI\n\nI guadagni più rapidi arrivano da un prompt che forza la citazione dei log, resta nei vincoli e si ferma quando manca qualcosa.\n\ntext\nYou are helping me fix a CI failure.\n\nRepo context (short):\n- Language/framework:\n- Test/build command that failed: <PASTE THE EXACT COMMAND>\n- CI environment (OS, Node/Go/Python versions, etc.):\n\nFailing output (verbatim, include the first error and 20 lines above it):\n<PASTE LOG>\n\nConstraints:\n- Propose the smallest possible code change that makes CI pass.\n- Do NOT rewrite/refactor unrelated code.\n- Do NOT touch files you do not need for the fix.\n- If behavior changes, make it explicit and justify why it is correct.\n\nStop rule (no guessing):\n- If the log is incomplete or you need more info (missing stack trace, config, versions, failing test name), STOP and ask only the minimum questions needed.\n\nYour response format (follow exactly):\n1) Evidence: Quote the exact log lines that matter.\n2) Hypothesis: Explain the most likely cause in 2-4 sentences.\n3) Smallest fix: Describe the minimal change and why it addresses the evidence.\n4) Patch: Provide a unified diff.\n5) Follow-up: Tell me the exact command(s) to rerun locally to confirm.\n\nThen, write ONE regression test (or tweak an existing one) that would fail before this fix and pass after it, to prevent the same failure class.\n- Keep the test focused. No broad test suites.\n- If a test is not feasible, explain why and propose the next-best guardrail (lint rule, type check, assertion).\n\n\nDue dettagli riducono i giri di andata e ritorno:\n\n- Includi il comando esatto fallito e il primo errore (non solo il riepilogo finale).\n- Se ci sono più fallimenti, dì quale risolvere per primo (di solito il primo errore reale nel log).\n\n## Come spingere per la correzione minima, non per una riscrittura\n\nIl modo più rapido per perdere tempo è accettare una modifica di "pulizia" che modifica cinque cose insieme. Definisci "minimale" fin da subito: la diff più piccola che fa passare il job fallito, con il minor rischio e il modo più veloce per verificarla.\n\nUna regola semplice funziona: risolvi il sintomo prima, poi valuta se un refactor più ampio vale la pena. Se il log punta a un file, una funzione, un import mancante o un caso limite, mira lì. Evita le modifiche del tipo "tanto ne approfitto".\n\nSe hai davvero bisogno di alternative, chiedi due e solo due: "correzione minimale più sicura" vs "correzione minimale più veloce." Vuoi compromessi, non un menu.\n\nRichiedi anche la verifica locale che corrisponda a CI. Chiedi lo stesso comando che la pipeline esegue (o l'equivalente più vicino), così puoi confermare in pochi minuti:\n\nbash\n# run the same unit test target CI runs\nmake test\n# or the exact script used in CI\nnpm test\n\n\nSe la risposta suggerisce una grande modifica, contrasta con: "Mostrami la patch più piccola che corregge l'asserzione fallita, senza formattazioni o rinomi non correlati."\n\n## Prompt per un test di follow-up che prevenga ricorrenze\n\nUna correzione senza test è una scommessa che il problema non si ripresenterà. Chiedi sempre un test di regressione che fallisca prima della correzione e passi dopo.\n\nSii specifico su cosa significhi "buono":\n\n- Se il fallimento era un crash di unit test, probabilmente vuoi un test nuovo o un'asserzione più forte.\n- Se il fallimento era build, lint o una regola di formattazione, vuoi un controllo che imponga la regola in modo che lo stesso tipo di errore non possa rientrare.\n\nUno schema utile richiede quattro cose: dove mettere il test, come chiamarlo, quale comportamento deve coprire e una breve nota che spiega perché previene regressioni future.\n\nFrammento pronto da aggiungere:\n\n- Scrivi un test di regressione che fallisce sul branch main attuale e passa dopo la tua correzione.\n- Fai in modo che il test copra la stessa classe di fallimento, non solo la riga esatta che ha rotto.\n- Metti il test in: <path or folder>. Segui la convenzione di naming: <your convention>.\n- Se si tratta di una regola lint/build, aggiungi o regola un controllo che imponga la regola.\n- Aggiungi 2-3 frasi: perché questo test catturerebbe un bug simile in futuro.\n\nEsempio: CI mostra un panic quando un handler API riceve un ID vuoto. Non chiedere "un test per questa riga." Chiedi un test che copra ID non validi (vuoto, spazi bianchi, formato sbagliato). La correzione minima potrebbe essere una clausola di guardia che restituisce 400. Il test di follow-up deve assertare il comportamento per più input non validi, così la prossima volta che qualcuno rifattorizza il parsing, CI fallisce subito.Inizia dal primo errore reale, non dall'ultimo exit 1.\n\n- Trova la prima riga che mostra cosa è fallito (nome del test, file:linea, comando).\n- Leggi ~20–40 righe sopra per contesto/setup.\n- Ignora gli errori a valle a catena finché non risolvi il primo fallimento.
Chiedigli di provare di aver letto il log.\n\nUsa una costrizione tipo:\n\n- “Cita le esatte righe fallite che stai usando.”\n- “Diagnosi in una frase.”\n- “Correzione minimale: 1–3 modifiche con i percorsi file esatti.”\n- “Fermati e chiedi se il log è incompleto.”
Di solito significa la patch più piccola che fa passare lo step fallito.\n\nDi solito è:\n\n- Una singola modifica mirata (clausola di guardia, import corretto/percorso).\n- Una piccola modifica di config specifica per CI.\n- Revert di una modifica che ha rotto qualcosa invece di ridisegnare.\n\nEvita cambi “pulizia” finché CI non è verde.
Incolla contesto sufficiente per ricreare il fallimento, non solo l'ultima riga rossa.\n\nIncludi:\n\n- Il comando CI esatto (go test ./..., npm test, flutter test, ecc.).\n- Il log dalla prima riga di errore fino alla fine.\n- I percorsi file menzionati negli errori.\n- Cosa è cambiato recentemente (bump di dipendenze, edit config CI, sommario PR).\n- Se è flakiness (alcune esecuzioni fallite + una passata).
Sì—dillo esplicitamente in parole semplici e ripetilo.\n\nEsempio di vincoli:\n\n- “Niente refactor, rinomini, formattazione o bump di dipendenze.”\n- “Tocca solo i file necessari per la correzione.”\n- “Se cambia il comportamento, descrivi esattamente cosa e perché è corretto.”\n\nQuesto mantiene la risposta focalizzata e facile da revisionare.
Risolvere per primo il primo fallimento reale.\n\n- Gli errori successivi spesso sono causati dal primo (per esempio, build fallita → test/lint non eseguiti correttamente).\n- Se gli errori sono indipendenti, scegli quello più vicino al blocco (di solito build/lint prima di integrazione).\n\nSe sei indeciso, chiedi al modello di identificare il primo step fallito nel log e attieniti a quello.
Considera la flakiness come un segnale per rimuovere la casualità, non per aggiungere retry.\n\nStabilizzanti comuni:\n\n- Congela il tempo (inietta un clock, usa timestamp fissi).\n- Seed per RNG.\n- Evita chiamate di rete (mock/stub).\n- Usa cartelle temporanee isolate e porte uniche.\n\nQuando diventa deterministico, la “correzione minima” diventa ovvia.
Chiedi il comando esatto che CI ha eseguito, poi lancialo localmente.\n\n- Stesso comando e flag di CI.\n- Abbina le versioni chiave dell'ambiente quando possibile (Go/Node/Flutter, OS).\n\nSe la riproduzione locale è difficile, chiedi un repro minimale nel repository (un singolo test/target) che provochi lo stesso errore.
Scrivi un test di regressione focalizzato che fallisce prima della correzione e passa dopo.\n\nBuoni target includono:\n\n- Il caso limite che ha causato il fallimento (input null, fuso orario, arrotondamento, permessi).\n- Una classe di fallimento leggermente più ampia (per esempio, più ID non validi, non solo uno).\n\nSe è un fallimento lint/build, l'“equivalente test” può essere l'inasprimento di una regola lint o l'aggiunta di un controllo che prevenga lo stesso errore.
Usa snapshot/rollback per mantenere sperimentazioni reversibili.\n\nUn loop pratico:\n\n- Fai la modifica minima.\n- Esegui il comando CI esatto.\n- Se fallisce ancora, ripristina o torna all'ultimo snapshot e prova una diversa patch minimale.\n\nSe usi Koder.ai, gli snapshot aiutano a iterare velocemente senza mischiare le modifiche sperimentali con la patch finale che esporterai.