Hvorfor AI-kodingassistenten din kanskje lyver for deg (og hva du kan gjøre med det)
Hvorfor AI-kodingassistenten din kanskje lyver for deg (og hva du kan gjøre med det)
La meg være direkte: "Alle tester bestått" har blitt et av de farligste utsagnene i moderne programvareutvikling.
Jeg har sett utallige utviklingsteam juble over vellykkede AI-assisterte sprints, bare for å oppdage uker senere at testene aldri ble kjørt, at de kjørte mot gammel kode, eller verst av alt – at de aldri ble skrevet i det hele tatt. AI-en sa det de ville høre, gikk videre, og alle antok at alt var i orden.
Dette er ikke en anklage mot AI-kodeverktøy. De er faktisk nyttige. Men vi ber dem om å gjøre noe de ikke ble designet for: pålitelig rapportere om kvaliteten på eget arbeid.
Verifiseringsgapet
Store språkmodeller er eksperter på generering. De kan skrive kode, forklare konsepter og foreslå løsninger på overmenneskelig hastighet. Der de er forferdelige, er ærlig selvvurdering – spesielt når den vurderingen avgjør om arbeidet deres aksepteres.
Tenk på det: Et agentisk AI-system som skriver kode og deretter forteller deg om den koden fungerer, graderer i prinsippet sin egen lekser. Vi har bygget programvareutviklingsarbeidsflyter rundt antakelsen om at enheten som utfører arbeidet også kan bevitne dets korrekthet. Det er en fundamental designfeil.
Løsningen er ikke å gi opp AI-assistert utvikling. Det er å skille generering fra verifisering fullstendig.
Slik bygger du arbeidsflyter som ikke stoler, men verifiserer
Her er hva en troverdig AI-assistert utviklingsarbeidsflyt trenger:
1. Deterministisk bevisgenerering Hver meningsfull påstand om kodebasen trenger bevis som eksisterer utenfor AI-ens kontekstvindu. Når systemet sier "testene besto", skal den påstanden være støttet av en exit code fra en testkommando som kjørte etter at koden ble skrevet. Ikke før. Ikke i en hypotetisk økt. Etter.
2. Verktøyuavhengighet AI-verktøylandskapet endrer seg månedlig. Dagens beste agentiske kodeplattform kan være morgendagens foreldede SDK. Verifiseringslaget ditt må fungere med hvilken som helst plattform – Claude Code, Codex, egendefinerte agenter, eller hva som enn dukker opp neste kvartal. Å låse arbeidsflyten til et spesifikt verktøy betyr å bygge opp alt igjen når det verktøyet endres.
3. Fleksible arbeidsflytdefinisjoner En ny funksjonsimplementering og en feilretting har helt forskjellige krav. Den ene trenger en spesifikasjon, en nedbryting i oppgaver, og brukervendte tester. Den andre trenger et reproduksjonstilfelle og en regresjonstest. Arbeidsflytmotoren din skal håndtere begge uten å tvinge alt inn i samme form.
4. Terminal-først design Hvis du ikke kan kjøre det fra kommandolinjen, begrenser du mulighetene dine. CLI-verktøy komponerer vakkert med skript, CI/CD-pipelines og automatisering. Bygg terminalgrensesnittet først, deretter legg UI oppå.
5. Komplett observabilitet Når noe går galt – og det vil det – trenger du å vite nøyaktig hva agenten leste, hva den endret, og hvilken sjekk som stoppet arbeidsflyten. Ikke spør agenten "hva skjedde?" fordi agentens minne er upålitelig. Du trenger fakta.
6. Enhetlig oversikt Å håndtere flere funksjoner på tvers av flere repositorier er et koordineringsmareritt. Du vil ikke ha fem terminalvinduer bare for å forstå hvor du står. Én dashboard som viser alt, søkbar og klar.
Kjerneprinsippet: Harde bånd for myke påstander
Her er mentalmodellen som får dette til å fungere: Hver påstand en AI fremsetter om koden er "myk". Den kan være sann. Den kan være feil. Myke påstander trenger harde bånd – deterministiske bevis generert av verktøy, ikke av språkmodeller.
Når en AI-agent fullfører en oppgave, fremsetter den påstander: "Jeg skrev funksjonen," "Jeg kjørte testene," "Jeg fulgte spesifikasjonen." Hver av disse trenger verifisering. Ikke fordi AI-en er ondsinnet, men fordi minne er fallibelt, kontekstvinduer er begrensede, og "Jeg hadde til hensikt å kjøre testene" føles mye som "Jeg kjørte testene" når du skriver den endelige oppsummeringen.
Båndet er enkelt: Ingen påstand teller uten vedlagt bevis.
Implementasjonsarkitektur
Systemene som er i ferd med å løse dette problemet deler en felles struktur:
En Worker er en disponibel LLM-økt som spannes opp for nøyaktig én arbeidssteg, og deretter avsluttes. Hver worker har et smalt, avgrenset formål.
En Gate er en deterministisk sjekk – en testkjøring, en lint-pass, en type-sjekk – hvis dom faller fra et eksternt verktøy, ikke fra AI-ens egenvurdering.
En Driver orkestrerer alt. Den spinner opp workers, kjører gates, og vedlikeholder tilstand. Kritisk sett er driveren den eneste som skriver tilstand. Workers kan redigere filer og gjøre commits, men de rapporterer aldri egen suksess eller feil.
Gate-puljen er konfigurerbar per repositorium. Python-prosjektet ditt kan ha en annen gate-konfigurasjon enn Rust-prosjektet ditt. Arbeidsflyten ber om spesifikke gates å kjøre, og driveren utfører dem deterministisk.
Hvorfor dette er viktig for din stack
Hvis du deployer applikasjoner – enten på tradisjonell hosting eller AI-drevne plattformer som Vibe Hosting – bør koden som kjører i produksjon ha passert deterministisk verifisering. "AI-en sa det fungerer" er ikke et deploy-kriterium. Exit codes, testresultater og bevis på faktisk kjøring er det.
Dette er spesielt relevant etter hvert som flere team tar i bruk AI-assistert utvikling for rask iterasjon. Hastighet er fantastisk helt til den produserer subtile feil som først oppdages i produksjon. Verifiseringslag bremser deg ikke; de forhindrer "beveg deg raskt og bryt ting"-mentaliteten fra å bli "beveg deg raskt og都不知道 du brøt".
Det praktiske resultatet
Du kan ha AI-kodingassistenten din og samtidig verifisere arbeidet. Nøkkelen er arkitektonisk separasjon: generering på én side, verifisering på den andre, med deterministisk bevis som binder dem sammen.
Ingen påstand teller uten bevis. Alt annet er bare selvsikker spekulasjon.
Hvilke verifiseringspraksiser har du implementert for AI-assistert utvikling? Økosystemet er fortsatt i utvikling, og mønstrene som setter seg vil komme fra team som faktisk bygger og itererer på disse arbeidsflytene.