La AI jobbe til det er ferdig

En løkke lar AI-en prøve, sjekke og prøve igjen til suksesskriteriene er oppfylt. Et suksesskriterium er en test du kan kjøre, som sier ja eller nei til om jobben er ferdig. Skriv dem ned før løkka starter, og bestem når den skal gi opp. Del 6 av 6 i Koding med AI.

Magnus Gribbestad 9. oktober 2026 8 min
Figur · løkka og kriteriene
En løkke som går til tre kriterier er oppfylt Til venstre et hjul der en markør går én runde per trinn, med stasjonene gjør, sjekk og ny runde, og en rundeteller i midten. Til høyre en sjekkliste med tre kriterier: testene består, testene er uendret og endringen er liten, og under den en budsjettmåler som tømmes. Runde 1: testene feiler, 3 av 5. Runde 2: alle testene består, men testfila er endret, så det kriteriet blir gult. Runde 3: testen er satt tilbake, og 4 av 5 tester består. Runde 4: alle tre kriteriene er grønne, og budsjettet står på 3 700 av 10 000. Et gult banner viser det alternative utfallet: med maks tre runder hadde løkka stoppet etter runde 3 og spurt. Til slutt en port som åpnes når et menneske godkjenner. GJØR SJEKK NY RUNDE RUNDE 0 1 2 3 4 FERDIG BETYR 0/3 2/3 3/3 Testene består ! ! ikke kjørt 3 av 5 består 5 av 5 består 4 av 5 består 5 av 5 består Testene er uendret ! ikke kjørt låsen stemmer testfila er endret låsen stemmer Endringen er liten maks 10 linjer 0 av maks 10 linjer 4 av maks 10 linjer 6 av maks 10 linjer BUDSJETT 10 000 8 200 5 800 3 700 oppdiktede enheter ! ALTERNATIVT: MAKS 3 RUNDER Da stopper den etter runde 3 og spør deg. DU GODKJENNER Du leser diffen før noe går ut.
  1. Før løkka starter, skriver du hva ferdig betyr: tre kriterier som kan sjekkes uten tolkning. Budsjettet er fullt.
  2. Runde 1. Koden sjekkes mot kriteriene. Testene feiler, 3 av 5, så løkka går en runde til.
  3. Runde 2. Alle testene består, men testfila er endret. Kriteriet for det som ikke skal endres, fanger det.
  4. Runde 3. Testen er satt tilbake, og ett kriterium feiler fortsatt: 4 av 5. Én runde til, og budsjettet krymper.
  5. Runde 4. Alle tre kriteriene er bestått, og løkka stopper av seg selv. Brukt 6 300 av 10 000, 3 700 igjen.
  6. Hadde grensa vært maks tre runder, hadde den stoppet etter runde 3 med én feil igjen, og spurt deg.
  7. Uansett hvordan løkka stopper, ender den hos deg. Du leser diffen, altså lista over endrede linjer, før noe går ut.
Kort sagt

En løkke er tre ting i ring: gjør et steg, sjekk, gå en runde til. Før den starter, trenger den to ting skrevet ned: hva som er ferdig, og når den skal gi opp. Til slutt leser et menneske endringen.

Del 6 av 6 i Koding med AI. Den bygger på del 3 om tester.

Hva en løkke er

Du ber AI-en fikse noe, den sier at den er ferdig, og så finner du feilen selv. En løkke snur det. Den sjekker før den stopper, men bare mot det du har skrevet ned.

En løkke er et oppsett som lar en agent ta runde etter runde til en sjekk sier bestått, eller til en grense slår inn. En agent er en AI som selv kan lese filer, endre kode og kjøre kommandoer.

  1. Gjør: modellen endrer koden.
  2. Sjekk: noe svarer bestått eller ikke bestått.
  3. Ny runde: ikke bestått gir et nytt forsøk, med svaret som tilbakemelding.

Selve løkka i Python står i En agent på 30 linjer.

Et bilde, ikke en fasit

En intervalløkt har samme form. Du vet før du starter hvor fort hvert drag skal gå, og hvor mange du tar. Klokka avgjør, ikke hvordan det føltes.

Skriv «ferdig» før du starter

Ellers er det den som gjør jobben, som avgjør når den er ferdig. Anthropic skriver det rett ut i veiledningen for Claude Code: Claude stopper når arbeidet ser ferdig ut. Uten en sjekk er det det eneste signalet.

Kriterier kommer i tre slag:

Mekanisk: maskinen svarer

  • Testene består
  • Bygget går gjennom
  • Lint er rent (kodestil og vanlige feil)
  • Endringen er under en grense

Vurdert: en leser foreslår

  • En skill, altså en gjenbrukbar instruks, leser diffen og merker funnene, som i del 2

Menneskelig: du avgjør

  • Du leser diffen
  • Du sier ja før noe går ut

Bare det mekaniske kan stå alene i en løkke. Det vurderte gir funn som noen må sortere, og det menneskelige er porten til slutt.

Et godt kriterium kan feile

Det kan sjekkes uten tolkning, det kan faktisk feile, og det sier hva som ikke skal endres.

VagtBedre
«Koden skal være ferdig»python -m unittest gir OK, 5 av 5
«Ikke ødelegg noe»Testfilene er uendret: python laas.py sjekk gir OK
«Hold det lite»Maks 10 linjer endret i tempo.py
«Gjør det bra»Ingen funn merket «må rettes» fra korrekthetsleseren, og du har lest diffen
«Brevet er ferdig»Brevet har dato, mottaker og én konkret frist

De tre første radene er kriteriene i eksempelet lenger ned, med testene fra del 3.

Pass på: et kriterium som aldri kan feile, er pynt. Kjør det én gang mot kode du vet er feil, og se at det sier nei.

For deg som vil vite mer: hva Anthropic sier om kriterier

Gode kriterier er spesifikke, målbare, oppnåelige og relevante. Anthropics eksempel er ikke «trygge svar», men under 0,1 prosent av 10 000 svar flagget for giftig innhold av et innholdsfilter.

La AI-en foreslå, du godkjenner

Du trenger ikke finne på kriteriene alene, men du må godkjenne dem. Har du blitt grillet med tips 1 i Femten grep, står «hvordan vi ser at det virker» allerede i SPEC.md.

Prompt · Foreslå kriteriene
Les SPEC.md. Ikke skriv kode ennå. Foreslå suksesskriterier for [oppgaven]:
- Tre til fem kriterier. Hvert av dem er en kommando eller sjekk som gir bestått eller feilet, og hva du forventer at den gir.
- Minst ett kriterium for det som IKKE skal endres, for eksempel testene, et API eller en mappe.
- En stoppregel: maks antall runder, og hva som får deg til å stoppe og spørre meg.
- Si hvilke deler av SPEC.md kriteriene ikke dekker.
Vent til jeg har godkjent lista. Skriv den så til SPEC.md under overskriften «Ferdig når».
Det siste punktet ber om hullene, ikke bare kriteriene. Har du ingen SPEC.md, bytt første linje med en kort beskrivelse av oppgaven.

Løkke: ja eller nei

Bruk løkke der en maskin kan sjekke resultatet og feil kan angres. Kan angres betyr at du får tilbake tilstanden fra før, som med kode i git eller data med sikkerhetskopi.

En sendt e-post, en betaling, en utrulling uten vei tilbake og sletting uten sikkerhetskopi kan ikke angres.

Maskinen kan sjekke · kan angres

Løkke. Tester som skal bli grønne i en egen kopi av koden. En stor fil som skal deles opp.

Maskinen kan sjekke · kan ikke angres

Løkka forbereder, et menneske trykker. En betaling, en sletting, en endring som skal settes i drift.

Må vurderes · kan angres

Kort løkke med en leser, du avgjør. Tekst på en nettside, navn i koden.

Må vurderes · kan ikke angres

Utkast, ikke løkke. AI-en skriver et utkast, du leser og sender selv. Et svar til en kunde.

Fem spørsmål til teamet
  1. Hva betyr «ferdig» for denne oppgaven, og står det skrevet ned?
  2. Hvem godkjenner endringen til slutt, og hva skjer når den personen ikke har tid?
  3. Hva kan løkka røre av filer, systemer og nøkler, og hva av det kan ikke angres?
  4. Hva stopper løkka: antall runder, penger eller tid? Og når spør den et menneske?
  5. Hva koster en runde omtrent, og hvem ser loggen etterpå?

Hva du bør kreve av et team som koder med AI, står i del 2.

Stoppregler: når den skal gi opp

Uten stoppregel stopper løkka når pengene eller tålmodigheten tar slutt. Sett minst to grenser, og vit hvilke som telles av en maskin.

Telles av maskinen

  • --max-turns 30, bare med claude -p
  • --max-budget-usd 2.00, bare med claude -p. Et anslag som kan gå over.
  • En Stop-hook. Som standard slipper den etter åtte nektelser på rad uten verktøybruk imellom.
  • En tidsgrense på hver sjekk i ditt eget skript

Vurderes av en modell

  • /goal selv
  • «Eller stopp etter 20 turer» i betingelsen til /goal. Claude rapporterer tellingen, modellen vurderer den.
  • En tidsgrense i betingelsen

Bare grensene i det grønne kortet er harde. De andre er nyttige, men ingen teller for deg.

Ingen framgang: /goal gir deg kontrollen tilbake når Claude svarer flere turer på rad uten å bruke verktøy. Målet står fortsatt. En økt som bruker verktøy uten å komme nærmere, fanges ikke.

Stopp og spør: skriv i prompten at den skal spørre før noe som ikke kan angres, og når en test ser feil ut.

Runde og tur er ikke det samme. En tur er én rundtur der Claude kaller verktøy og får svaret tilbake. Å endre koden og kjøre testene tar gjerne flere turer, så sett --max-turns romslig.

To forsøk, så ny start. Anthropics råd etter to mislykkede rettelser er /clear og en bedre første prompt. I en løkke: skriv kriteriene på nytt.

Slik gjør du det i Claude Code

Tre verktøy: et mål for økta, en port som ikke tolker, og kjøring uten deg. Skriv / i Claude Code for å se hva din versjon har.

/goal: et mål for økta

Skriv betingelsen etter kommandoen. Etter hver tur vurderer en egen modell om den er oppfylt, og Claude jobber videre til den er det.

Kommando · Et mål for økta
/goal python -m unittest gir OK, og python laas.py sjekk gir OK. Begge utskriftene står i samtalen. Eller stopp etter 15 turer.

Pass på:

Stop-hook: en port som ikke tolker

En Stop-hook er et skript som kjører når Claude vil avslutte en tur, og som kan nekte til testene er grønne. Sida viser ikke et ferdig skript. Se hooks-guiden, særlig feltet stop_hook_active.

claude -p: uten at du svarer underveis

Slik kjører du Claude Code fra et skript eller fra CI, den automatiske testkjøringen når kode sendes inn. Ingen svarer på spørsmål om tillatelse, så du sier på forhånd hva den får gjøre.

Kommando · ikke kjørt her, flaggene er sjekket mot dokumentasjonen 9. oktober 2026
claude -p "Få python -m unittest til å gi OK uten å endre testfilene. Kjør python laas.py sjekk før du sier at du er ferdig." \
  --allowedTools "Edit,Bash(python -m unittest *),Bash(python laas.py sjekk *)" \
  --permission-mode dontAsk --max-turns 30 --max-budget-usd 2.00
Skråstreken er for bash. I PowerShell skriver du alt på én linje.

dontAsk avviser alt som ikke står i --allowedTools. Kjør den i en egen gren, og kjør sjekkene selv etterpå, for her avgjør Claude når den er ferdig.

To andre typer løkke

Et eksempel du kan kjøre

Tre ekte kriterier, en løkke med stoppregler, og en forbedrer som er et manus. Du trenger Python 3.10 eller nyere, ikke noe mer.

  1. Last ned fem filer til samme mappe: kriterier.py, demo.py, laas.py, test_tempo.py og utkast_tempo.py.
  2. Åpne et terminalvindu i mappa.
  3. Kjør python demo.py normal, eller maks-runder, budsjett eller ring.

Forbedreren er ikke en AI

Den er et manus med tre forsøk, og kostnadene er oppdiktet. Det eksempelet viser, er kriteriene og stoppreglene.

En runde er én sjekk av alle kriteriene. Mellom to runder gjør forbedreren ett forsøk.

Utskrift · kjørt 9. oktober 2026
$ python demo.py normal
Kopierte utkastet og testene til en midlertidig mappe, og låste testene der.

Runde 1   brukt 0 av 10000
  Testene består      NEI  3 av 5 består
                           feiler: test_null_distanse_gir_feil
                           feiler: test_sekunder_runder_opp_til_nytt_minutt
  Testene er uendret  ja   1 testfil(er) uendret
  Endringen er liten  ja   0 linjer endret, grensa er 10
  -> forbedre: endret fasiten i testen (kostnad 1800, oppdiktet)

Runde 2   brukt 1800 av 10000
  Testene består      ja   5 av 5 består
  Testene er uendret  NEI  test_tempo.py er endret siden testene ble låst
  Endringen er liten  ja   0 linjer endret, grensa er 10
  -> forbedre: satte testen tilbake og rettet avrundinga (kostnad 2400, oppdiktet)

Runde 3   brukt 4200 av 10000
  Testene består      NEI  4 av 5 består
                           feiler: test_null_distanse_gir_feil
  Testene er uendret  ja   1 testfil(er) uendret
  Endringen er liten  ja   4 linjer endret, grensa er 10
  -> forbedre: la til feil for null distanse (kostnad 2100, oppdiktet)

Runde 4   brukt 6300 av 10000
  Testene består      ja   5 av 5 består
  Testene er uendret  ja   1 testfil(er) uendret
  Endringen er liten  ja   6 linjer endret, grensa er 10

STOPP: alle bestått etter 4 runder, brukt 6300

Det er de samme fire rundene som i figuren. Med maks tre runder stopper den etter runde 3:

Utskrift · kjørt 9. oktober 2026 · utdrag fra runde 3
$ python demo.py maks-runder
...
Runde 3   brukt 4200 av 10000
  Testene består      NEI  4 av 5 består
                           feiler: test_null_distanse_gir_feil
  Testene er uendret  ja   1 testfil(er) uendret
  Endringen er liten  ja   4 linjer endret, grensa er 10

STOPP: maks runder etter 3 runder, brukt 4200
Utskrift fra budsjett og ring

Et forsøk koster først noe når det er gjort. Derfor ender budsjett på 4 200 av 4 000, slik --max-budget-usd også kan gå over.

Utskrift · kjørt 9. oktober 2026 · utdrag fra runde 3
$ python demo.py budsjett
...
Runde 3   brukt 4200 av 4000
  Testene består      NEI  4 av 5 består
                           feiler: test_null_distanse_gir_feil
  Testene er uendret  ja   1 testfil(er) uendret
  Endringen er liten  ja   4 linjer endret, grensa er 10

STOPP: budsjett etter 3 runder, brukt 4200

I ring endrer forbedreren ingenting, og de samme to testene feiler igjen.

Utskrift · kjørt 9. oktober 2026
$ python demo.py ring
Kopierte utkastet og testene til en midlertidig mappe, og låste testene der.

Runde 1   brukt 0 av 10000
  Testene består      NEI  3 av 5 består
                           feiler: test_null_distanse_gir_feil
                           feiler: test_sekunder_runder_opp_til_nytt_minutt
  Testene er uendret  ja   1 testfil(er) uendret
  Endringen er liten  ja   0 linjer endret, grensa er 10
  -> forbedre: prøvde, men endret ingenting (kostnad 1500, oppdiktet)

Runde 2   brukt 1500 av 10000
  Testene består      NEI  3 av 5 består
                           feiler: test_null_distanse_gir_feil
                           feiler: test_sekunder_runder_opp_til_nytt_minutt
  Testene er uendret  ja   1 testfil(er) uendret
  Endringen er liten  ja   0 linjer endret, grensa er 10

STOPP: ingen framgang etter 2 runder, brukt 1500
Løkka i kriterier.py

Stoppreglene sjekkes i denne rekkefølgen: alle bestått, ingen framgang, maks runder, budsjett.

Python · kriterier.py, løkka
def lokke(kriterier, forbedre, maks_runder=5, budsjett=10_000, logg=print):
    """Kjør kriteriene, og kall forbedre(resultater) til alt er bestått.

    forbedre får resultatene fra runden som tilbakemelding og gir tilbake hva
    forsøket kostet. Løkka stopper på én av fem måter, og sier hvilken.
    """
    if not kriterier:
        raise ValueError("Ingen kriterier. Skriv hva ferdig betyr før løkka starter.")
    brukt = 0
    historikk = []
    sett = []   # feilbildet fra hver tidligere runde
    for runde in range(1, maks_runder + 1):
        resultater = kjor_kriterier(kriterier)
        historikk.append(resultater)
        skriv_tabell(runde, resultater, brukt, budsjett, logg)

        # Hvilke kriterier feiler, og hvorfor. Forklaringen må si hva som
        # feiler, ikke bare hvor mye, ellers ser to ulike feil like ut.
        feil = [(r.navn, r.forklaring) for r in resultater if not r.bestatt]
        if not feil:
            return Stopp("alle bestått", runde, brukt, historikk)
        if feil in sett:
            # Samme feilbilde som i en tidligere runde, enten rett før eller
            # lenger tilbake (løkka svinger). Da skal et menneske se på det.
            return Stopp("ingen framgang", runde, brukt, historikk)
        if runde == maks_runder:
            return Stopp("maks runder", runde, brukt, historikk)
        if brukt >= budsjett:
            # Sjekkes før neste forsøk. Det siste forsøket kan likevel ha gått
            # over grensa, for kostnaden er først kjent når det er gjort.
            return Stopp("budsjett", runde, brukt, historikk)
        sett.append(feil)
        try:
            brukt += int(forbedre(resultater))
        except Exception as e:
            # Med en ekte modell er dette et API-kall, og det kan feile.
            # Da stopper løkka med det den har, i stedet for å krasje.
            logg(f"  -> forbedre feilet: {e}")
            return Stopp(f"forbedre feilet: {e}", runde, brukt, historikk)
    return Stopp("maks runder", maks_runder, brukt, historikk)  # nås bare med maks_runder < 1

I repoet ligger filene i tech/losninger/kode/loop_kriterier/ og kode/test_forst/, og demo.py finner dem der også.

Seks måter løkka går galt

Løkka blir aldri bedre enn det den måler.

1

Grønn, men feil

Regelen i del 3 sier null eller mindre, testen sjekker bare null, og minus 5 km gir «-5:00» med alle testene grønne.

2

Testen endres i stedet for koden

Runde 2 i figuren. Lås testene, og ha et kriterium som sjekker låsen.

3

Løkka forsterker en feil

En feil antakelse i runde 1 får mer kode oppå seg for hver runde. Stopp, kjør /clear, og skriv kriteriet på nytt.

4

Vagt eller umulig

Et vagt kriterium kan alltid regnes som oppfylt. Et umulig bruker opp budsjettet.

5

Ingen logg

Da vet du ikke hva som ble prøvd. Med claude -p gir --output-format stream-json --verbose én linje per melding.

6

Ingen i enden

Løkka kan forberede en betaling eller en utrulling, og AI-en kan skrive utkastet til en e-post, men du trykker. Se lista for slike handlinger i En agent på 30 linjer.

Hva det koster

En løkke har ingen fast pris. Det du kan kreve, er en grense per kjøring, og at teamet kan si hva en typisk kjøring kostet sist.

Prisen regnes i token, tekstbitene modellen leser og skriver. Hvert kall sender hele samtalen så langt, og en runde har ofte flere kall. Derfor vokser forbruket raskere enn antall runder.

Det meste som sendes på nytt, er mellomlagret (prompt caching). Hos Anthropic koster lesing derfra 0,1 × vanlig pris for inndata, eller 0,05 × for Opus 5.5 og Sonnet 5.5. Å legge noe i mellomlageret koster 1,25 × eller 2 ×.

På et abonnement trekker løkka fra kvoten i stedet. Regn på det med Hva koster det, og se forbruket underveis med /goal uten noe mer.

Løkka har samme tilgang som økta den kjører i: filene, kommandoene du har tillatt, og nøklene i miljøet. Gi den bare det kriteriene trenger.

Ansvaret flytter seg ikke. Den som starter løkka, setter grensene, og den som godkjenner diffen, står for det som går ut. Sida har ingen tall for hva løkker sparer.

Oppdatert oktober 2026. Claude Code-dokumentasjonen, lest 9. oktober 2026:
  • Best practices: at Claude stopper når arbeidet ser ferdig ut, /goal og Stop-hook som port, /clear etter to mislykkede rettelser, --allowedTools med dontAsk, /batch.
  • Keep Claude working toward a goal: at en modell vurderer betingelsen og bare leser samtalen, at tur- og tidsgrenser vurderes av den, stopp uten verktøybruk med målet stående, hva som fjerner målet, status med forbruk.
  • Hooks: Stop-hooken, taket på åtte nektelser på rad og stop_hook_active.
  • CLI reference og Run Claude Code programmatically: -p, --max-turns, --max-budget-usd som anslag, --allowedTools, --permission-mode dontAsk, --output-format.
  • How the agent loop works: hva en tur er, og at turgrensa teller turer med verktøykall.
  • Run prompts on a schedule: /loop kjører bare mens økta er åpen.
  • Manage costs effectively: at hele samtalen sendes med hvert kall, mellomlagring, og at planlagte oppgaver sender hele samtalen hver gang.
Anthropic, Prompt caching (prisfaktorene for mellomlagring) og Define success criteria and build evaluations, begge lest 9. oktober 2026. Ingen av sidene har dato. Eksempelet er konstruert, og forbedreren og kostnadene i det er oppdiktet. Utskriftene er kjørt med Python 3.13 på Windows 9. oktober 2026. Figuren viser det som er igjen av budsjettet, utskriften det som er brukt. Funksjoner og flagg i Claude Code endrer seg ofte, så sjekk dokumentasjonen før du stoler på dem.