Claude Code voor CI-fouten: vraag het om de falende output te citeren, stel de kleinst mogelijke fix voor en voeg een regressietest toe om herhaling te voorkomen.

Een CI-fout is meestal niet mysterieus. De log vertelt je waar het stopte, welk commando faalde en het foutbericht. Een goede run bevat een stacktrace, een compilerfout met bestand en regelnummer, of een testrapport dat toont welke assertie faalde. Soms krijg je zelfs een diff-achtige hint zoals "expected X, got Y" of een duidelijke falende stap zoals "lint", "build" of "migrate database".
Het echte probleem is dat mensen (en AI) de log vaak behandelen als achtergrondruis. Als je een lange log plakt en vraagt om "een fix", springen veel modellen naar een bekend verklaarpatroon in plaats van de laatste betekenisvolle regels te lezen. Het gokken wordt erger als de fout er bekend uitziet ("module not found", "timeout", "permission denied"). Je eindigt met een grote herschrijving, een nieuwe dependency of een "probeer alles te updaten"-antwoord dat niet overeenkomt met de werkelijke fout.
Het doel is niet "maak het op de een of andere manier groen". Het is eenvoudiger:
In de praktijk is de "kleinst mogelijke fix" meestal een van de volgende: een paar regels code wijzigen op één plek, een ontbrekende import of verkeerde pad, een configwaarde die duidelijk onjuist is voor de CI-omgeving, of het terugdraaien van een per ongeluk breaking change in plaats van het herontwerpen van de code.
Een follow-up test is ook belangrijk. Eén keer CI groen is niet hetzelfde als herhaling voorkomen. Als de fout voortkwam uit een edge case (null input, timezone, afronding, permissies), voeg dan een regressietest toe die faalt vóór de fix en slaagt erna. Dat verandert een eenmalige redding in een vangrail.
De meeste slechte fixes beginnen met ontbrekende context. Als je alleen de laatste rode regel plakt, moet het model raden wat er eerder gebeurde, en raden leidt vaak tot herschrijvingen.
Streef ernaar voldoende detail te geven zodat iemand de fout kan volgen vanaf de eerste echte fout tot het eind, en vervolgens zo min mogelijk hoeft te veranderen.
Kopieer dit in je bericht (woordelijk waar mogelijk):
go test ./..., npm test, flutter test, golangci-lint run).Voeg beperkingen toe in gewone woorden. Als je een piepkleine fix wilt, zeg dat: geen refactors, geen gedragswijzigingen tenzij noodzakelijk, houd de patch beperkt tot het falende gebied.
Een simpel voorbeeld: CI faalt op een lint-stap na een dependency bump. Plak de lint-output vanaf de eerste waarschuwing, voeg het commando dat CI gebruikte toe en noem de enkele packageversiewijziging. Dat is genoeg om een eénderige config-aanpassing of een kleine codewijziging voor te stellen, in plaats van het herformatteren van de halve repo.
Als je iets copy-paste-achtigs wilt, is deze structuur meestal genoeg:
CI command:
Failing output (full):
Recent changes:
Constraints (smallest fix, no refactor):
Flaky? (runs attached):
Wanneer een model de mist in gaat bij een CI-breuk, komt dat meestal doordat je prompt het laat raden. Jouw taak is het model te dwingen zijn werk te tonen met de exacte falende output, en zich vervolgens te committeren aan de kleinste wijziging die het job laat slagen.
Eis bewijs en een klein plan. Een goede prompt dwingt vijf dingen af:
Onzekerheid is prima. Verborgen onzekerheid is wat tijd verspilt.
Plak dit bovenaan je CI-vraag:
Use ONLY the evidence in the CI output below.
1) Quote the exact failing lines you are using.
2) Give ONE sentence: the most likely cause.
3) Propose the smallest fix: 1-3 edits, with file paths.
4) Do NOT do formatting/renames/refactors or "cleanup".
5) List uncertainties + the one extra detail that would confirm the diagnosis.
Als de log zegt "expected 200, got 500" plus een stacktrace naar user_service.go:142, duwt deze structuur het antwoord richting die functie en een kleine guard- of error-handlingwijziging, niet het herontwerpen van de endpoint.
De snelste overwinningen komen van een prompt die het quoten van logs afdwingt, binnen beperkingen blijft en stopt zodra iets ontbreekt.
You are helping me fix a CI failure.
Repo context (short):
- Language/framework:
- Test/build command that failed: <PASTE THE EXACT COMMAND>
- CI environment (OS, Node/Go/Python versions, etc.):
Failing output (verbatim, include the first error and 20 lines above it):
<PASTE LOG>
Constraints:
- Propose the smallest possible code change that makes CI pass.
- Do NOT rewrite/refactor unrelated code.
- Do NOT touch files you do not need for the fix.
- If behavior changes, make it explicit and justify why it is correct.
Stop rule (no guessing):
- 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.
Your response format (follow exactly):
1) Evidence: Quote the exact log lines that matter.
2) Hypothesis: Explain the most likely cause in 2-4 sentences.
3) Smallest fix: Describe the minimal change and why it addresses the evidence.
4) Patch: Provide a unified diff.
5) Follow-up: Tell me the exact command(s) to rerun locally to confirm.
Then, 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.
- Keep the test focused. No broad test suites.
- If a test is not feasible, explain why and propose the next-best guardrail (lint rule, type check, assertion).
Twee details die heen-en-weer verminderen:
De snelste manier om tijd te verliezen is akkoord gaan met een "opschoon"-wijzigingenset die vijf dingen tegelijk verandert. Definieer "minimaal" vooraf: de kleinste diff die de falende job groen maakt, met het laagste risico en de snelste verificatie.
Een simpele regel werkt goed: fix eerst het symptoom, beslis daarna of een bredere refactor de moeite waard is. Als de log naar één bestand, één functie, één ontbrekende import of één edge case wijst, richt je daar. Vermijd "while we're here"-edits.
Als je echt alternatieven nodig hebt, vraag om twee en alleen twee: "veiligste minimale fix" versus "snelste minimale fix." Je wilt trade-offs, geen menu.
Eis ook lokale verificatie die overeenkomt met CI. Vraag om hetzelfde commando dat de pipeline draait (of het dichtstbijzijnde equivalent), zodat je in minuten kunt bevestigen:
# run the same unit test target CI runs
make test
# or the exact script used in CI
npm test
Als het antwoord een grote wijziging voorstelt, druk dan terug met: "Laat de kleinste patch zien die de falende assertie oplost, zonder niet-gerelateerde formattering of hernoemingen."
Een fix zonder test is een gok dat je het probleem niet opnieuw tegenkomt. Vraag altijd om een follow-up test die vóór de fix faalt en erna slaagt.
Wees specifiek over wat "goed" betekent:
Een nuttig patroon is deze vier dingen te eisen: waar je de test plaatst, hoe je hem noemt, welk gedrag hij moet dekken, en een korte uitleg waarom hij toekomstige regressies voorkomt.
Klaar-om-te-plakken toevoeging:
Voorbeeld: CI toont een panic wanneer een API-handler een lege string ID ontvangt. Vraag niet om "een test voor deze regel." Vraag om een test die ongeldige IDs (leeg, whitespace, verkeerd formaat) dekt. De kleinste fix kan een guard-clausule zijn die een 400-response retourneert. De regressietest zou gedrag voor meerdere ongeldige inputs asserten, zodat de volgende keer iemand parsing refactort, CI meteen faalt.
Als je project al testconventies heeft, beschrijf die. Als niet, vraag om nabijgelegen tests in dezelfde package/folder te spiegelen en houd de nieuwe test klein en leesbaar.
Plak de CI-logsectie die de fout bevat en 20–40 regels erboven. Plak ook het exacte falende commando dat CI draaide en belangrijke omgevingsdetails (OS, runtime-versies, belangrijke flags).
Vraag het vervolgens het falen in gewone taal te herhalen en wijs naar de regel(s) in de output die het bewijzen. Als het de log niet kan citeren, heeft het hem niet echt gelezen.
Vraag om de kleinste mogelijke codewijziging die het falende commando laat slagen. Druk op refactors. Laat het vóór het toepassen opsommen:
Pas de patch toe en draai lokaal exact het falende commando (of in dezelfde CI-job als dat je enige optie is). Als het nog steeds faalt, plak alleen de nieuwe falende output en herhaal. Kleine context houdt het antwoord gefocust.
Als het groen is, voeg één follow-up test toe die vóór de patch faalde en erna slaagt. Houd het gericht: één test, één reden.
Draai het commando opnieuw met de nieuwe test om te bevestigen dat je de fout niet alleen hebt gefilterd.
Vraag om een korte commit message en een PR-beschrijving die bevat wat faalde, wat veranderde, hoe je het verifieerde en welke test een herhaling voorkomt. Reviewers gaan sneller als de redenering duidelijk is.
Een veelvoorkomende fout: alles werkte lokaal, maar een kleine wijziging maakt tests kapot op de CI-runner. Hier een simpel voorbeeld uit een Go-API waar een handler begon een datum-only waarde (2026-01-09) te accepteren, maar de code nog steeds alleen volledige RFC3339-timestamps parseerde.
Dit is het soort snippet om te plakken (houd het kort, maar includeer de foutregel):
--- FAIL: TestCreateInvoice_DueDate (0.01s)
invoice_test.go:48: expected 201, got 400
invoice_test.go:49: response: {"error":"invalid due_date: parsing time \"2026-01-09\" as \"2006-01-02T15:04:05Z07:00\": cannot parse \"\" as \"T\""}
FAIL
exit status 1
FAIL app/api 0.243s
Gebruik nu een prompt die bewijs afdwingt, een minimale fix en een test:
You are fixing a CI failure. You MUST use the log to justify every claim.
Context:
- Language: Go
- Failing test: TestCreateInvoice_DueDate
- Log snippet:
<PASTE LOG>
Task:
1) Quote the exact failing line(s) from the log and explain the root cause in 1-2 sentences.
2) Propose the smallest possible code change (one function, one file) to accept both RFC3339 and YYYY-MM-DD.
3) Show the exact patch.
4) Add one regression test that fails before the fix and passes after.
Return your answer with headings: Evidence, Minimal Fix, Patch, Regression Test.
Een goed antwoord wijst naar de parsing-layout mismatch en maakt vervolgens een kleine wijziging in één functie (bijvoorbeeld parseDueDate in invoice.go) om eerst RFC3339 te proberen en terug te vallen op 2006-01-02. Geen refactor, geen nieuwe packages.
De regressietest is de vangrail: zend due_date: "2026-01-09" en verwacht 201. Als iemand later parsing "opschoont" en de fallback verwijdert, faalt CI meteen met dezelfde foutklasse.
De snelste manier om een uur te verliezen is een uitgeknipte weergave van het probleem te geven. CI-logs zijn ruisig, maar het nuttige gedeelte is vaak 20 regels boven de eindfout.
Een valkuil is alleen de laatste rode regel plakken (bijvoorbeeld "exit 1") terwijl de echte oorzaak eerder zat (een ontbrekende env var, een falende snapshot, of de eerste test die crasht). Oplossing: includeer het falende commando plus het logvenster waar de eerste echte fout verschijnt.
Een andere tijdverspilling is het model toestaan "op te ruimen" onderweg. Extra formattering, dependency bumps of refactors maken het lastiger te reviewen en makkelijker om iets anders te breken. Oplossing: zet de scope vast op de kleinste mogelijke codewijziging en verwerp alles niet-gerelateerd.
Enkele patronen om op te letten:
Als je flakiness vermoedt, plak er geen pleister overheen met retries. Verwijder de willekeur (vaste tijd, seeded RNG, geïsoleerde temp-mappen) zodat het signaal duidelijk is.
Voordat je pusht, doe een korte sanity-check. Doel is te verzekeren dat de wijziging echt, minimaal en reproduceerbaar is, niet een gelukstreffer.
Draai tenslotte een iets bredere set dan alleen de falende job (bijv. lint plus unittests). Een veelvoorkomend valkuil is een fix die de originele job groen maakt maar een ander target breekt.
Als je wilt dat dit week na week tijd bespaart, behandel je prompt en responsformaat als teamproces. Het doel is herhaalbare inputs, herhaalbare outputs en minder "mystery fixes" die iets anders breken.
Zet je beste prompt om in een gedeeld snippet en pin die in teamchat. Het doel is dat iedereen hetzelfde format gebruikt: (1) bewijs, (2) één-regel oorzaak, (3) kleinste wijziging, (4) follow-up test, (5) hoe lokaal te verifiëren. Reviewers vinden het makkelijker omdat ze weten waar ze moeten kijken.
Een lichtgewicht habit-loop die in de meeste teams werkt:
Als je een chat-first workflow verkiest voor bouwen en itereren, kun je dezelfde fix-en-test-lus in Koder.ai draaien, gebruik snapshots tijdens experimenten en exporteer de bron wanneer je klaar bent om te mergen.
Begin bij de eerste echte fout, niet bij de laatste exit 1.
Vraag het model te bewijzen dat het de log heeft gelezen.
Gebruik een beperking zoals:
Standaard: de kleinste patch die de falende stap laat slagen.
Dat betekent meestal:
Vermijd “opschoon” wijzigingen totdat CI weer groen is.
Plak genoeg context om de fout te reproduceren, niet alleen de laatste rode regel.
Inclusief:
Ja—stel beperkingen in platte taal en herhaal ze.
Voorbeeldbeperkingen:
Dit houdt het antwoord gefocust en reviewbaar.
Los eerst de vroegste echte fout op.
Bij twijfel, vraag het model de eerste falende stap in de log te identificeren en houd je daaraan.
Behandel flakiness door willekeur uit de test te verwijderen, niet door retries toe te voegen.
Veelvoorkomende stabilisatoren:
Als het deterministisch is, wordt de “kleinste fix” duidelijker.
Vraag het exacte commando dat CI draaide en voer dat lokaal uit.
Als lokale reproductie lastig is, vraag om een minimale repro in de repo (één test of target) die dezelfde fout triggert.
Schrijf één gerichte regressietest die vóór de fix faalt en erna slaagt.
Goede doelen zijn:
Als het een lint/build-fout is, kan de ‘test’ het aanscherpen van een lintregel of het toevoegen van een check zijn die dezelfde fout voorkomt.
Gebruik snapshots/rollback om experimenten omkeerbaar te houden.
Een praktisch loopje:
Als je in Koder.ai werkt, helpen snapshots je snel te itereren zonder experimentele edits in de uiteindelijke patch te mengen.
go test ./...npm testflutter test