Claude Code för CI-fel: be modellen citera den felande utdata, föreslå minsta möjliga fix och lägg till ett regressions-test så felet inte återkommer.

Ett CI-fel är vanligtvis inte mystiskt. Loggen talar om var det slutade, vilket kommando som misslyckades och felmeddelandet. En bra körning innehåller en stack-trace, ett kompilatorfel med fil och radnummer, eller en testrapport som visar vilken assertion som misslyckades. Ibland får du till och med en diff-liknande ledtråd som "expected X, got Y" eller ett tydligt misslyckat steg som "lint", "build" eller "migrate database".
Det verkliga problemet är att människor (och AI) ofta behandlar loggen som bakgrundsbrus. Om du klistrar in en lång logg och ber om "en fix", hoppar många modeller till en bekant förklaring istället för att läsa de sista meningsfulla raderna. Gissningarna blir värre när felet ser vanligt ut ("module not found", "timeout", "permission denied"). Du sitter kvar med en stor omskrivning, ett nytt beroende, eller ett svar som "försök uppdatera allt" som inte matchar det faktiska felet.
Målet är inte "få det att passera på något sätt". Det är enklare:
I praktiken är den "minsta fixen" vanligtvis en av dessa: en kodändring på några rader på ett ställe, en saknad import eller fel sökväg, ett konfigvärde som uppenbart är fel för CI-miljön, eller att återställa en oavsiktlig brytande ändring istället för att redesigna koden.
Ett uppföljande test spelar också roll. Att passera CI en gång är inte samma sak som att förhindra upprepningar. Om felet kom från ett kantfall (null-input, tidszon, avrundning, behörigheter), lägg till ett regressions-test som misslyckas före fixen och passerar efter. Det förvandlar en engångsinsats till ett skydd.
De flesta dåliga fixar börjar med saknad kontext. Om du bara klistrar in den sista röda raden måste modellen gissa vad som hände tidigare, och gissningar blir ofta omskrivningar.
Sikta på att ge tillräcklig detalj så att någon kan följa felet från det första verkliga felet till slutet, och sedan ändra så lite som möjligt.
Kopiera detta i ditt meddelande (ordagrant när du kan):
go test ./..., npm test, flutter test, golangci-lint run).Lägg till begränsningar med vanliga ord. Om du vill ha en liten fix, säg det: inga refaktorer, inga beteendeförändringar om det inte är nödvändigt, håll patchen begränsad till det felande området.
Ett enkelt exempel: CI misslyckas på ett lint-steg efter en dependency-bump. Klistra in lint-utdata från första varningen, inkludera kommandot CI använde, och nämn den enda paketversionsändringen. Det räcker för att föreslå en en-radig konfigjustering eller en liten kodändring, istället för att omformatera halva repot.
Om du vill ha något copy-pastebart är den här strukturen vanligtvis tillräcklig:
CI command:
Failing output (full):
Recent changes:
Constraints (smallest fix, no refactor):
Flaky? (runs attached):
När en modell missar ett CI-avbrott är det ofta för att din prompt tillåter den att gissa. Din uppgift är att få den att visa sitt arbete med den exakta felutgången, och sedan hålla sig till den minsta ändringen som kan få jobbet att passera.
Kräv bevis och en liten plan. En bra prompt tvingar fram fem saker:
Osäkerhet är okej. Dold osäkerhet är det som slösar tid.
Klistra in detta högst upp i din CI-fråga:
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.
Om loggen säger "expected 200, got 500" plus en stacktrace till user_service.go:142, driver den här strukturen svaret mot den funktionen och en liten guard eller felhantering, inte en redesign av endpointen.
De snabbaste vinsterna kommer från en prompt som tvingar fram citat av loggar, håller sig inom begränsningar och slutar när något saknas.
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).
Två detaljer som minskar fram-och-tillbaka:
Det snabbaste sättet att förlora tid är att acceptera en "röjning" som ändrar fem saker samtidigt. Definiera "minimal" i förväg: den minsta diffen som gör att det misslyckade jobbet passerar, med lägst risk och snabbaste verifiering.
En enkel regel fungerar bra: åtgärda symptomet först, avgör senare om en större refaktor är värd det. Om loggen pekar på en fil, en funktion, en saknad import eller ett kantfall, sikta där. Undvik "medan vi är här"-ändringar.
Om du verkligen behöver alternativ, be om två och bara två: "säkraste minsta fix" vs "snabbaste minsta fix." Du vill ha tradeoffs, inte en meny.
Kräv också lokal verifiering som matchar CI. Be om samma kommando som pipelinen kör (eller närmaste motsvarighet), så du kan bekräfta på minuter:
# run the same unit test target CI runs
make test
# or the exact script used in CI
npm test
Om svaret föreslår en stor ändring, ställ tillbaka med: "Visa den minsta patchen som fixar den misslyckade assertionen, utan orelaterad formatering eller namnbyten."
En fix utan test är ett vad om att du inte träffar samma problem igen. Be alltid om ett uppföljande test som misslyckas före patchen och passerar efter.
Var specifik om vad "bra" är:
Ett användbart mönster är att kräva fyra saker: var testet ska ligga, vad det ska heta, vilket beteende det täcker, och en kort notis om varför det förhindrar framtida regressioner.
Kopiera-tillägg:
Exempel: CI visar en panic när en API-handler får ett tomt sträng-ID. Begär inte "ett test för den här raden". Be istället om ett test som täcker ogiltiga ID:n (tomma, bara whitespaces, fel format). Den minsta fixen kan vara en guard clause som returnerar 400. Uppföljningstestet bör assertera beteende för flera ogiltiga inputs, så nästa gång någon refaktorar parsing bryter CI direkt.
Om ditt projekt redan har testkonventioner, skriv dem. Om inte, be modellen spegla närliggande tester i samma paket eller mapp och håll det nytt testet kort och läsbart.
Klistra in CI-loggsektionen som innehåller felet och 20–40 rader ovanför. Klistra även in det exakta felande kommandot CI körde och viktiga miljödetaljer (OS, runtime-versioner, viktiga flaggor).
Be den sedan att återge vad som gick fel på klar svenska och peka på de(ta) rad(er) i utdata som bevisar det. Om den inte kan citera loggen har den inte verkligen läst den.
Be om den minsta möjliga kodändringen som får det felande kommandot att passera. Tryck tillbaka mot refaktorer. Innan du applicerar något, låt den lista:
Applicera patchen och kör det exakta felande kommandot lokalt (eller i samma CI-jobb om det är enda alternativet). Om det fortfarande misslyckas, klistra in bara den nya felande utdata och upprepa. Mindre kontext håller svaret fokuserat.
När det är grönt, lägg till ett uppföljande test som skulle misslyckas före patchen och nu passerar. Håll det riktat: ett test, ett syfte.
Kör kommandot igen med det nya testet inkluderat för att bekräfta att du inte bara tystade felet.
Be om ett kort commit-meddelande och en PR-beskrivning som innehåller vad som felade, vad som ändrades, hur du verifierade det och vilket test som förhindrar återfall. Granskare går snabbare när resonemanget är tydligt.
Ett vanligt fel: allt fungerade lokalt, men en liten ändring gör att testerna misslyckas i CI. Här är ett enkelt exempel från en Go-API där en handler började acceptera ett datum utan tid (2026-01-09) men koden fortfarande parser bara fulla RFC3339-tidsstämplar.
Det här är typen av snippet att klistra in (håll det kort, men inkludera felraden):
--- 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
Använd sedan en prompt som tvingar fram bevis, en minimal fix och ett 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.
Ett bra svar pekar på mismatch i parsing-layout, och gör en liten ändring i en funktion (t.ex. parseDueDate i invoice.go) för att försöka RFC3339 först och falla tillbaka till 2006-01-02. Ingen refaktor, inga nya paket.
Regressions-testet är skyddet: skicka due_date: "2026-01-09" och förvänta 201. Om någon senare tar bort fallbacken bryter CI direkt med samma felklass.
Det snabbaste sättet att förlora en timme är att ge en beskuren bild av problemet. CI-loggar är bullriga, men den användbara delen är ofta 20 rader ovanför slutfelet.
En fälla är att klistra in bara sista röda raden (t.ex. "exit 1") medan den verkliga orsaken tidigare (saknad env-variabel, misslyckat snapshot eller första crashande test) göms. Fix: inkludera det felande kommandot plus loggintervallet där första verkliga felet visas.
En annan tidstjuv är att låta modellen "städa upp" i processen. Extra formatering, dependency-bumps eller refaktorer gör det svårare att granska och lättare att introducera nya fel. Fix: lås scope till minsta möjliga kodändring och avvisa allt orelaterat.
Några mönster att se upp för:
Om du misstänker flakighet, linda inte över det med retries. Ta bort slumpen (fixerad tid, seedad RNG, isolerade temp-kataloger) så signalen blir tydlig.
Innan du pushar, gör en kort sanity-check. Målet är att säkerställa att ändringen är riktig, minimal och repeterbar, inte ett lyckokast.
Slutligen, kör en något bredare uppsättning än det enda felande jobbet (t.ex. lint plus unit-tests). En vanlig fälla är en fix som passerar ursprungsjobbet men bryter ett annat mål.
Om du vill att detta sparar tid vecka efter vecka, behandla din prompt och svarstruktur som teamprocess. Målet är repeterbara inputs, repeterbara outputs och färre "mystery fixes" som bryter något annat.
Gör din bästa prompt till ett delat snippet i teamet. När alla använder samma format går recensioner snabbare eftersom granskare vet var de ska titta.
En lättvikts-loop som funkar i de flesta team:
Om du föredrar en chat-först-workflow för att bygga och iterera på appar, kan du köra samma fix-och-test-loop i Koder.ai, använda snapshots medan du experimenterar, och exportera koden när du är redo att slå ihop tillbaka till ditt vanliga repo.
Börja med det första verkliga felet, inte det sista exit 1.
Be modellen bevisa att den läst loggen.
Använd en begränsning som:
Standardisera på den minsta patch som får den misslyckade steget att lyckas.
Det betyder oftast:
Undvik ”röjning” tills CI är grön igen.
Klistra in tillräcklig kontext för att återskapa felet, inte bara sista röda raden.
Inkludera:
Ja—ange begränsningar klart och upprepa dem.
Exempelbegränsningar:
Det håller svaret fokuserat och lätt att granska.
Fixa det tidigaste verkliga felet först.
Vid osäkerhet, be modellen identifiera det första felsteget i loggen och följ det.
Behandla flakighet som en signal att ta bort slump, inte att lägga till retries.
Vanliga stabilisatorer:
När det är deterministiskt blir den minsta fixen tydlig.
Be om det exakta kommandot CI körde, och kör sedan det lokalt.
Om lokal reproduktion är svår, be om ett minimalt repro i repot (ett test eller mål) som triggar samma fel.
Skriv ett fokuserat regressions-test som misslyckas före fixen och passerar efter.
Bra mål inkluderar:
Om det är ett lint/build-fel kan motsvarande “test” vara att skärpa en lintregel eller lägga till en check som förhindrar samma misstag.
Använd snapshots/rollback så experiment är reversibla.
Ett praktiskt loop:
I Koder.ai hjälper snapshots dig iterera snabbt utan att blanda experimentella ändringar i den slutliga patchen.
go test ./...npm testflutter test