juni 2026

A Best-of-Breed Chain for AI-Assisted Software Development

Hvorfor den svære del af vibe coding er verifikation, ikke generering, og hvordan Claude Code, GitHub, Vercel, Next.js og Postgres lukker den sløjfe, vi bygger Nashua 360-platformen på

Resumé

En kompetent kodningsagent ændrer softwareudviklingens økonomi: at skrive kode, den aktivitet der plejede at dominere en udviklers dag, bliver hurtigt og næsten gratis, mens aktiviteterne omkring det, at beslutte hvad der skal bygges og at sikre sig, at resultatet er korrekt, ikke bliver det. Begrænsningen flytter sig fra generering til verifikation. Dette papir hævder, at værdien af en AI-assisteret udviklingsopsætning ikke ligger i den model, der skriver koden, men i kæden af værktøjer omkring den, der lader et team verificere, i hast, hvad agenten producerer, og som fanger dens fejl, før de når brugerne. Det er en teknisk, holdningspræget redegørelse for den kæde, vi i Nashua bygger og driver vores eget produkt, Nashua 360 Enterprise Platform, på, og for hvorfor hvert led er, som det er: Claude Code som agenten, kørt i en sløjfe med resten af kæden og tilgængelig fra en mobilapp, så en ændring kan startes og et resultat gennemgås fra en telefon; GitHub som rygraden, med en beskyttet main-branch, påkrævede statustjek og en pull request som ændringsenheden; Vercel, der giver hver pull request sin egen isolerede, kørende preview-deployment; Next.js som et typet, konventionelt framework, hvis typetjekker er den første og billigste port, og hvis rendering- og runtimemodel agenten navigerer flydende i; og PostgreSQL som varig tilstand, ændret gennem gennemgåede, reversible migreringer. Vi går ned i de dele, praktikere bekymrer sig om: hvordan agenten får kontekst og holdes ærlig, hvad der kører i kontinuerlig integration, hvad en preview-deployment i virkeligheden er, hvordan Next.js renderer og hvor den kører, og hvordan man ændrer en live-database uden at ødelægge den. Vi hævder, at for AI-assisteret arbejde betyder best-of-breed konventionel, fordi agenten bedst skriver de værktøjer, den har set mest af, og vi er åbne om omkostningerne: leverandørkobling, den disciplin den menneskelige gennemgangsport kræver, risikoen ved en agent med bred adgang og dataets uoprettelighed. Dette er rådgivning henvendt til praktikere, ikke et benchmark.

Nøgleord: AI-assisteret udvikling; vibe coding; kodningsagenter; Claude Code; GitHub; Vercel; Next.js; PostgreSQL; kontinuerlig levering; preview-deployments; kodegennemgang; databasemigreringer; udviklerværktøj; Nashua 360

1. Introduktion

I det meste af softwarens historie var den knappe ressource selve skrivningen. En udviklers håndværk blev målt på evnen til at omsætte en hensigt til korrekt kode, og timerne gik med at taste, slå ting op, koble biblioteker sammen og rette de små fejl, som compilerfejl og fejlende tests afslørede. En kompetent kodningsagent fjerner det meste af det. Giv den en klar instruktion og adgang til en kodebase, og den vil producere en fungerende ændring på minutter, i idiomer den har set en million gange, med boilerplate allerede korrekt. Det daglige navn for at arbejde på denne måde, populariseret i begyndelsen af 2025, er vibe coding: at beskrive, hvad man vil have, og lade modellen producere det, idet man styrer efter resultater snarere end ved at skrive hver linje. Det er i sandhed et spring fremad, og det er let at forveksle det med hele historien.

Det er ikke hele historien, for at få kode til at opstå var aldrig den svære del af software, kun den møjsommelige del. De svære dele er at beslutte, hvad der skal bygges, og at vide, at det byggede faktisk er rigtigt, sikkert og egnet til at køre. Disse bliver ikke billigere, når generering gør det; om noget bliver de sværere, fordi der nu er langt mere kode at forstå, produceret hurtigere end et menneske skrev den, af en forfatter, der er selvsikker, selv når den tager fejl. Softwareudviklingens flaskehals flytter sig. Den plejede at sidde ved generering, hvor hurtigt et team kunne skrive korrekt kode. Med en agent sidder den ved verifikation: hvor hurtigt et team kan være sikker på, at koden er korrekt, og lukke den igennem.

Dette papir handler om konsekvensen af den forskydning for værktøj, og det er bevidst konkret. Hvis verifikation er begrænsningen, så er det mest værdifulde, en AI-assisteret opsætning kan gøre, ikke at generere hurtigere, men at hjælpe et team med at verificere hurtigere og mere sikkert, idet den fanger agentens fejl billigt og tidligt. Vi beskriver den specifikke kæde, vi i Nashua bruger til at bygge og drive vores eget produkt, Nashua 360 Enterprise Platform: Claude Code som agenten, GitHub som den versionsstyrede rygrad og gennemgangsport, Vercel til en kørende preview af hver ændring, Next.js som applikationsframework og Postgres som databasen, og vi går ned i, hvordan hver del faktisk fungerer, for det er i detaljen, værdien ligger. Hvert led fortjener sin plads ved at stramme en sløjfe eller tilføje en port, ikke ved at være individuelt smart.

Bidraget er et argument og en gennemarbejdet anbefaling, ikke et benchmark. Afsnit 2 redegør for, hvad AI ændrede, og hvad det ikke ændrede, og lokaliserer flaskehalsen. Afsnit 3 præsenterer kæden som en sløjfe (Figur 1), fremfører argumentet om, at best-of-breed for agent-assisteret arbejde betyder konventionel, og forklarer, hvorfor uafhængige porte forstærker hinanden. Afsnit 4 til 9 tager de fem dele én for én og går ned i deres indre, herunder den runtimearkitektur, en deployment faktisk har (Figur 2), og den del, der overrasker folk, nemlig at en ændring nu kan startes og gennemgås fra en telefon. Afsnit 10 til 12 behandler den menneskelige port og dens fejltilstande, de reelle omkostninger og hvordan kæden kører i praksis. Spørgsmålet hele vejen igennem er: når en agent først kan skrive koden, hvad bør et team så sætte omkring den, så det at skrive hurtigt ikke betyder at udsende forkert?

2. Hvad AI ændrede, og hvad det ikke ændrede

2.1 Forskydningen

Den ændring, en agent bringer, er bedst formuleret præcist. Det er ikke, at maskinen nu forstår problemet; det er, at omkostningen ved at producere en plausibel, ofte korrekt, implementering af en veldefineret ændring er faldet sammen. En udvikler, der ville have brugt en eftermiddag på en funktion, kan have en første version på den tid, det tager at beskrive den, og kan kassere flere versioner billigt. Arbejdsformen skifter fra at forfatte til at dirigere: at udtrykke hensigt, læse resultater, korrigere kursen. Dette er reel løftestang, og et team, der afviser den, vil blive overhalet.

2.2 Ingen sølvkugle

Ændringen er også afgrænset, og grænsen er gammel. Brooks (1987) drog den skelnen, der stadig gælder her: softwarens tilfældige kompleksitet, det arbejde der pålægges af vores værktøjer og sprog snarere end af problemet, kan angribes og reduceres, men den essentielle kompleksitet, at forstå problemet og specificere en korrekt løsning, kan ikke automatiseres væk, fordi den er problemet. En kodningsagent er det mest kraftfulde angreb på tilfældig kompleksitet, der endnu er bygget: den opsuger syntaksen, boilerplate’en, API-opslagene, idiomerne. Den gør intet ved essensen. At vide, hvad forretningen har brug for, at beslutte det rigtige design og at fastslå, at en given ændring faktisk opfylder behovet uden at ødelægge noget andet, forbliver menneskearbejde, og det er det arbejde, der altid var svært.

2.3 Verifikation bliver begrænsningen

Sæt de to sammen, og konklusionen følger. Generering, den tilfældige del, er nu hurtig og billig. Verifikation, hvor essensen bor, at denne ændring er korrekt, at den gør, hvad der var ønsket, at den ikke har ødelagt noget, at den er sikker at eksponere, er det ikke. I enhver pipeline sættes gennemløbet af det langsomste trin, og når generering accelererer forbi verifikation, bliver verifikation den bindende begrænsning. Et team, der kan generere ti ændringer om dagen, men verificere to, vil udsende to og vil ophobe en pukkel af uverificeret kode, der er en forpligtelse, ikke et aktiv. Værre endnu producerer en agent selvsikkert, overfladisk korrekt arbejde, så omkostningen ved under-verificering, ved at merge det, der ser rigtigt ud og ikke er det, stiger netop som fristelsen til at gøre det stiger. Resten af dette papir handler om at bygge en kæde, hvis opgave er at hæve verifikationsloftet og at gøre underverificering svær.

3. Kæden, og hvorfor det konventionelle vinder

3.1 Sløjfen

En god AI-assisteret opsætning er en sløjfe, ikke et værktøj. Figur 1 tegner den, vi bruger. En udvikler udtrykker en hensigt. Claude Code, agenten, omsætter den til en ændring på en branch, ikke på den live kode. Ændringen bliver en GitHub pull request, hvor to automatiske porte kører uden nogens opmærksomhed: typetjekkeren og den kontinuerlige integrations suite. Vercel bygger branchen til en reel, kørende preview-deployment, en fuld kopi af applikationen med ændringen live, tilgængelig på sin egen URL. Et menneske gennemgår ændringen, læser diff’en og klikker sig gennem previewet, på en computer eller, i stigende grad, på en telefon. Først da bliver den merget til main-branchen, som Vercel deployer til produktion, understøttet af Postgres. Resultatet føder den næste hensigt. Pointen med diagrammet er, at agenten optager én kasse; hver anden kasse er en sløjfe, der lukker, eller en port, der fanger, og det er der, sikkerheden og hastigheden kommer fra.

Figur 1. Udviklingssløjfen. Agenten (Claude Code) optager ét trin; hvert andet trin lukker enten en feedbacksløjfe eller tilføjer en verifikationsport. En ændring bevæger sig fra venstre mod højre fra hensigt til produktion (fuldt optrukket); gennemgang sender arbejde tilbage til agenten, og produktion føder den næste hensigt (stiplet). Typetjekkeren og den kontinuerlige integrations suite porter pull request'en automatisk; preview-deploymentet lader et menneske se ændringen køre; mergen til main-branchen er den eneste vej til produktion.
Figur 1. Udviklingssløjfen. Agenten (Claude Code) optager ét trin; hvert andet trin lukker enten en feedbacksløjfe eller tilføjer en verifikationsport. En ændring bevæger sig fra venstre mod højre fra hensigt til produktion (fuldt optrukket); gennemgang sender arbejde tilbage til agenten, og produktion føder den næste hensigt (stiplet). Typetjekkeren og den kontinuerlige integrations suite porter pull request'en automatisk; preview-deploymentet lader et menneske se ændringen køre; mergen til main-branchen er den eneste vej til produktion.

3.2 Best-of-breed betyder konventionel

Den sædvanlige måde at vælge værktøjer på er at rangordne dem efter styrke og vælge det mest kapable. For en agent-assisteret kæde er kriteriet et andet, og det er den enkeltstående mest nyttige idé i dette papir. En agent skriver bedst de værktøjer, den har set mest af. Dens kompetence på et framework eller en database er en funktion af, hvor meget korrekt kode der brugte det værktøj, var i dens træning, og den mængde følger værktøjets popularitet, dets dokumentation og stabiliteten af dets konventioner. Et mainstream, veldokumenteret, konventionstungt værktøj er derfor ikke blot et sikkert menneskeligt valg; det er det valg, agenten er mest kapabel på og mindst tilbøjelig til at opfinde en API, der ikke findes. Effekten forstærker sig selv: populære værktøjer får mere agent-genereret kode, der virker, hvilket forstærker deres popularitet. For AI-assisteret udvikling er best-of-breed og mest-konventionel konvergeret, og hvert værktøj i Tabel 1 blev valgt med det for øje. Dette er også en advarsel: det eksotiske framework, en menneskelig ekspert kunne håndtere glimrende, er ofte netop der, hvor en agent er svagest, fordi den har set mindst af det.

3.3 Hvorfor uafhængige porte forstærker hinanden

Kæden stoler ikke på noget enkelt tjek. Den verificerer en ændring gennem flere porte, der ser på ægte forskellige ting: typetjekkeren tjekker former, de kontinuerlige integrationstests tjekker adfærd, preview-deploymentet viser det kørende resultat, og det menneskelige gennemgår bedømmer hensigt. Fordi portene i vid udstrækning er uafhængige, multipliceres deres forbigåelser snarere end at lægges sammen: en defekt når kun produktion, hvis hver port undlader at fange den, så fire beskedne porte, der hver fanger det meste af, hvad de ser, lukker kun en lille brøkdel af produktet af det, de overser, igennem. Dette er princippet om forsvar i dybden, længe kendt i sikkerhedsteknik som lagdelingen af ufuldkomne barrierer (Reason, 2000), og det har et skarpt praktisk korollar. At fjerne eller svække én port, at springe previewet over, at slå en striks type fra, at godkende uden at læse, tilføjer ikke en smule risiko; det multiplicerer undslippelsesraten med den reciprokke af, hvad den port plejede at fange. Den billigste måde at forblive sikker på er at holde flere forskellige, ufuldkomne porte ærlige, hvilket er præcis, hvad kæden er indrettet til at gøre.

Tabel 1. Kæden. Hvert led er valgt for den sløjfe, det lukker, eller den port, det tilføjer, og for at være konventionelt nok til, at agenten håndterer det godt. Den sidste kolonne navngiver, hvad leddet hovedsagelig beskytter imod.

Led Hvad vi bruger Sløjfe det lukker eller port det tilføjer Hvad det værner imod
Kodningsagent Claude Code (CLI, cloud og mobil) Omsætter hensigt til en ændring på en branch; kører selv tjek og tests før overdragelse Et menneske, der udfører det tilfældige arbejde i hånden; langsom iteration
Versionsstyring og gennemgang GitHub (branches, pull requests, Actions) Hver ændring er en diff, der kan gennemgås; intet når main-branchen ugennemgået; CI kører på hver Ugennemgået ændring, der når produktion; mistet historik; intet revisionsspor
Preview og deployment Vercel (git-forbundet) En isoleret, kørende preview af hver pull request på sin egen URL; produktionsdeploy og rollback med ét klik At gennemgå kode, man ikke kan se køre; risikable udsendelser
Webframework Next.js (TypeScript) Typer som den første automatiske port; konventionel, filbaseret struktur agenten navigerer godt i Hele klasser af defekter, typetjekkeren afviser; agenten, der farer vild
Database PostgreSQL (managed) Varig, transaktionel tilstand med gennemgåede, versionerede migreringer Datatab; tavs skemaafdrift; ikke-reproducerbare miljøer
Menneskelig gennemgangsport En person, ved pull request’en Den bedømmelse ingen port automatiserer: er dette, hvad vi ville have, og er det sikkert? Selvsikkert forkert kode, der bestod hvert automatisk tjek

4. Agenten: hvordan Claude Code passer ind

Claude Code er agenten: et værktøj, der læser kodebasen, skriver og redigerer filer, kører kommandoer, udfører testene og åbner pull requests, idet den arbejder ud fra en instruktion og korrigerer sig selv mod de resultater, den ser. Hvordan den køres betyder mere end modellens rå formåen, og tre ting ved den er en praktikers opmærksomhed værd.

Den første er kontekst. En agent er kun så god som det, den ved om din kodebase, og det enkeltstående artefakt med størst løftestang er en indtjekket konventionsfil, i vores tilfælde en projekt-CLAUDE.md, der fortæller agenten husreglerne: hvordan projektet er lagt ud, hvordan man kører typetjekkeren og testene, hvad der skal deployes og hvordan, hvad der aldrig må røres. Agenten læser den ved hver kørsel, så en rettelse skrevet ned én gang holder op med at gentage sig. Omkring den sidder en bredere flade, genbrugelige skills til gentagne opgaver, hooks der kører på tool-kald for at håndhæve en regel mekanisk, og MCP-servere der giver agenten typet adgang til udefrakommende systemer, GitHub blandt dem, så den kan åbne og opdatere pull requests som førsteklasses handlinger snarere end ved skærmskrabning. Kontekst-engineering, at beslutte hvad agenten bør vide og kunne gøre, er det reelle arbejde ved at tage en i brug, og det er ganske almindelig softwarehygiejne: skriv konventionerne ned, gør tjekkene kørbare, hold fladen lille.

Den anden er, at agenten kører i sløjfen snarere end isoleret. Den forventes selv at køre typetjekkeren og testene, læse hvad de rapporterer, og rette det, før noget menneske ser på det, så kædens automatiske porte allerede er grønne, når en pull request åbnes. For større opgaver kan den sprede arbejde ud til subagenter, der hver bærer deres egen kontekst og rapporterer tilbage, hvilket holder hovedtråden fokuseret og konteksten ren. Disciplinen er at lade den hurtige, billige feedback, typer og tests, ske inde i agentens egen sløjfe, og at reservere den langsomme, dyre feedback, mennesket, til slutningen.

Den tredje er, hvor den kører. Ud over terminalen kører Claude Code som en cloud-session, der er tilgængelig fra en mobilapp, hvilket ændrer formen på arbejdsdagen. En ændring kan startes fra en telefon på vej et sted hen, efterlades til at køre i cloud’en, og dens pull request og preview gennemgås og godkendes fra den samme telefon senere. Vi er bevidste om dette, ikke fordi mobilarbejde er en nyhed, men fordi det forkorter sløjfen: afstanden mellem at bemærke noget og at starte ændringen, og mellem at en ændring er klar og at nogen godkender den, falder fra timer til minutter, hvilket i en verifikationsbunden verden er præcis den afstand, der er værd at lukke.

5. Rygraden: GitHub

GitHub er den del af kæden, der gør alt det andet sikkert, og den er den mindst glamourøse. Den rummer den eneste kilde til sandhed, repositoriet, og den håndhæver den regel, hele argumentet hviler på: main-branchen, den der udsendes, er beskyttet og kan kun nås gennem en pull request, som et menneske har godkendt, og hvis påkrævede statustjek er bestået. Agenten redigerer aldrig produktionskode direkte; den foreslår, på en branch, og forslaget er en diff, et menneske kan læse og en maskine kan teste.

De påkrævede tjek er der, hvor de automatiske porte bor. På hver pull request kører GitHub Actions den suite, vi insisterer på, før noget merges: typetjekkeren, linteren, testsuiten og et produktionsbuild, hver et påkrævet statustjek, der blokerer merge-knappen, indtil det er grønt. Fordi disse håndhæves af platformen snarere end af nogens disciplin, kan de ikke springes over i en fart, og fordi agenten ved, de vil køre, tilfredsstiller den dem først. Pull request’en er enheden for ændring: lille, selvstændig, individuelt gennemgåelig og individuelt reverterbar, hvilket er det, der holder gennemgang billig og historik læsbar. Og fordi hver ændring er et commit med en forfatter og en besked, er historikken et revisionsspor, og fortrydelsen er total, alt hvad agenten gjorde kan ses, tilskrives og reverteres. En kodningsagent er en hurtig, kraftfuld og fejlbarlig aktør, og GitHub er den struktur, der gør det sikkert at slippe en løs, ved at sikre, at intet, den gør, er ugennemgået, utestet eller uopretteligt.

6. Øjnene: Vercel

At læse en diff fortæller dig, hvad der ændrede sig; det fortæller dig ikke, hvad ændringen gør. Vercel lukker den kløft ved at bygge hver pull request til en preview-deployment: en komplet, isoleret, kørende instans af applikationen med ændringen anvendt, på sin egen URL, skabt automatisk og opdateret ved hvert push. Dette er den port, der fanger, hvad typer og tests ikke gør, layoutet der gik i stykker, flowet der blev ét trin længere, den ting der er teknisk korrekt og forkert i brug, og det er størstedelen af grunden til, at kæden kan bevæge sig hurtigt uden at bevæge sig blindt. En gennemgår, og agenten, klikker sig gennem det faktiske resultat snarere end at forestille sig det ud fra koden.

Det, der gør previewet troværdigt, er, at det er et reelt build af hele stakken, ikke en mock (Figur 2): det samme framework, den samme runtime, dets egne miljøvariabler, og, gjort godt, dets egen isolerede eller branchede database, så det at bruge det ikke kan røre produktionsdata. Deployments er uforanderlige: hver er et distinkt, adresserbart build, så det at forfremme en gennemgået preview til produktion er et pegerflyt snarere end et genbuild, og en dårlig udsendelse er en øjeblikkelig rollback til den forrige uforanderlige deployment snarere end en hektisk hotfix. Ved merge til main-branchen bygger den samme maskineri, der byggede previewet, produktionen, så det, der blev gennemgået, er det, der udsendes. I denne kædes model er preview-deployments en billig, automatisk verifikationsport med en høj fangstrate for en klasse af defekter, som ingen anden port ser.

Figur 2. En deployments anatomi. En forespørgsel falder gennem Edge-netværket, som serverer statiske aktiver og cachede sider og, ved en miss eller en dynamisk rute, påkalder Next.js-runtimen; kode på serversiden når Postgres gennem en forbindelsespooler. Hver pull request får sin egen isolerede kopi af hele denne stak på en preview-URL, hvilket er grunden til, at en gennemgår kan klikke sig gennem ændringen kørende snarere end at forestille sig den ud fra diff'en. Produktion er den samme stak, forfremmet fra et gennemgået, uforanderligt build.
Figur 2. En deployments anatomi. En forespørgsel falder gennem Edge-netværket, som serverer statiske aktiver og cachede sider og, ved en miss eller en dynamisk rute, påkalder Next.js-runtimen; kode på serversiden når Postgres gennem en forbindelsespooler. Hver pull request får sin egen isolerede kopi af hele denne stak på en preview-URL, hvilket er grunden til, at en gennemgår kan klikke sig gennem ændringen kørende snarere end at forestille sig den ud fra diff'en. Produktion er den samme stak, forfremmet fra et gennemgået, uforanderligt build.

7. Sømløs via git: hvorfor de tre passer sammen

Grunden til, at Claude Code, GitHub og Vercel føles mindre som tre værktøjer og mere som ét system, er, at de deler én enkelt grænseflade, og den grænseflade er git. Claude Codes naturlige output er ikke en deployment; det er en branch og en pull request. GitHubs opgave er at lagre de commits, køre tjekkene og holde gennemgangen. Vercel holder øje med repositoriet og forvandler hver branch til en preview og main-branchen til produktion. Ingen af dem skulle læres om de andre: agenten lærer aldrig en deployment-API, den åbner en pull request; Vercel lærer aldrig om agenten, den holder øje med repoet. Sømmen mellem dem er den git-protokol, alle tre allerede taler, hvilket er grunden til, at det at tilføje en agent til kæden intet ændrede ved, hvordan deployment fungerede, og hvorfor hele vejen fra en prompt til produktion ikke har nogen overdragelser i sig.

Konsekvensen er, at deployment holder op med at være et trin, nogen udfører, og bliver en konsekvens af den git-handling, de alligevel skulle til at foretage. Et push er et build. En pull request er et preview-miljø, skabt og nedtaget af sig selv. En merge til main-branchen er et produktionsdeploy. En revert er en rollback. Ingen kører en udsendelse; de merger, og udsendelsen sker. Der er ingen buildserver at passe, intet deploy-script for agenten at gøre forkert, intet separat forfremmelsesværktøj, intet vindue, hvor nogen har skrevet koden, men endnu ikke udsendt den. For et verifikationsbundet team er dette præcis det rigtige sted at fjerne friktion: den eneste bevidste, menneskelige handling tilbage i vejen er gennemgangen, som er den ene handling, der bør være bevidst, og alt det mekaniske omkring den håndteres af de værktøjer, der holder øje med git.

Dette er også grunden til, at sømløsheden er sikker snarere end hovedkulds, og de to egenskaber kommer fra den samme kendsgerning. Fordi deployment rider på git, arver det gits garantier: hvert produktionsdeploy er bundet til et specifikt gennemgået commit, med en forfatter og en besked; hver preview er bundet til en branch; og fordi deployments er uforanderlige, er det at rulle tilbage blot at pege produktion mod et tidligere commits build. Den samme ledningsføring, der lader en ændring flyde fra en telefonskrevet prompt til et live site, uden at nogen rører en deploy-konsol, sikrer også, at intet når det live site undtagen gennem et gennemgået, tilskriveligt, reverterbart commit. Integrationen er et match ikke, fordi leverandørerne koordinerede den, men fordi alle tre blev bygget til at behandle git som kilden til sandhed, og da agenten sluttede sig til den konvention, var den pipeline, den havde brug for, allerede der.

8. Terrænet: Next.js

Agenten må navigere i en kodebase, og kodebasens framework er terrænet. Next.js er et stærkt valg af to grunde, der begge kommer tilbage til verifikation. Den første er, at det er TypeScript, og typer er den første og billigste port. Kørt i strict mode afviser typetjekkeren en stor klasse af fejl, en forkert form, et manglende felt, en værdi der måske er null, i det øjeblik agenten skriver den, hvilket er præcis, når en rettelse er billigst, før koden kører og længe før et menneske ser på den. Vi skubber den samme idé ud til programmets kanter, idet vi validerer eksternt input, request-bodies, miljøvariabler, databaserækker, mod et skema, så utypede data udefra bliver typede og tjekkede ved grænsen snarere end stolet på. Typer er ikke bureaukrati her; de er den port, der forvandler agentens mest almindelige fejl, en plausibel form der er subtilt forkert, til en rød bølgelinje, den selv retter.

Den anden grund er, at Next.js er konventionelt, og dets model, skønt rig, er trådt nok op til, at agenten skriver den flydende. Det er værd at være konkret om den model, for det er der, en stor del af ingeniørarbejdet lever. App Router renderer på serveren som standard: Server Components kører på serveren og sender aldrig deres kode til browseren, idet de holder dataadgang og hemmeligheder på serversiden, mens Client Components, markeret eksplicit, bærer interaktiviteten. Mutationer går gennem Server Actions, serverfunktioner som en formular eller en knap kan kalde direkte, og Route Handlers leverer API-fladen. Hver rute vælger, hvordan den renderer, statisk ved build-tid, inkrementelt regenereret efter en tidsplan eller dynamisk per forespørgsel, og hvor den kører, den lette Edge-runtime tæt på brugeren eller den fyldigere Node.js-runtime, med middleware der kører før forespørgslen for at håndtere ting som autentificering og sprogområde. Dette er en masse håndtag, men de er offentlige, dokumenterede, stabile håndtag, agenten har set brugt korrekt i stor skala, så den griber efter det rigtige, og frameworket er kraftfuldt nok til at bygge et reelt produkt, mens det forbliver det terræn, agenten er mest kapabel på, hvilket, efter argumentet i Afsnit 3, er den kombination, der betyder noget.

9. Tilstanden: Postgres

Alt ovenstående angår kode, som er sikker at ændre, fordi den er versioneret og reversibel. Data er det ikke: en droppet kolonne eller en dårlig migrering kan ødelægge noget, intet commit kan genskabe. Postgres er den varige, transaktionelle tilstand i bunden af kæden, og disciplinen omkring den er bevidst strengere end omkring kode. PostgreSQL fortjener sin plads på samme måde som resten af kæden, det er det konventionelle, kampprøvede, fremragende dokumenterede valg, så agenten skriver korrekt SQL og korrekte migreringer mod det, og en managed instans fjerner det operationelle slid uden at ændre modellen.

Omhuen lægges i ændring. Skemaændringer er migreringer: ordnede, versionerede filer tjekket ind i repositoriet og gennemgået som enhver anden ændring, kørt mod previewet før produktion, og skrevet til at være reversible. En live-database kan ikke ændres på den måde, en frisk kan, så en risikabel ændring laves som en sekvens af sikre, expand and contract-mønstret (Ambler & Sadalage, 2006): tilføj den nye kolonne eller tabel og begynd at skrive til den, backfill, flyt læsningerne over, og først da, i en senere deployment, fjern den gamle form, så det ved hvert mellemtrin gælder, at den kørende kode og skemaet er kompatible, og trinnet er reversibelt. Postgres hjælper ved at gøre de fleste skemaændringer transaktionelle, så en fejlet migrering ruller rent tilbage snarere end at efterlade databasen halvt ændret. To operationelle pointer betyder noget i en serverless sammenhæng, hvor mange kortlivede funktionsinstanser hver ønsker en forbindelse: en forbindelsespooler er ikke valgfri, fordi en database har en hård forbindelsesgrænse, som en flåde af serverless-arbejdere ellers vil udtømme; og row-level security lader databasen selv håndhæve, hvem der må se hvilke rækker, en bagstopper der ikke afhænger af, at applikationen får hver forespørgsel rigtig. Reglen, vi holder fast ved, er enkel og værd at udtrykke: agenten må foreslå en migrering, men en migrering er den ene slags ændring, et menneske altid læser med fuld opmærksomhed, fordi det er den ene slags, kæden ikke fuldt ud kan fortryde.

10. Den menneskelige port, og hvordan den fejler

Hver automatisk port i denne kæde eksisterer for at gøre den menneskelige port billig, ikke for at fjerne den. Det gennemgår, der sidder ved pull request’en, gør den ene ting, ingen port automatiserer: at bedømme, om ændringen er, hvad forretningen faktisk ville have, og om den er sikker at eksponere, spørgsmål som typer, tests og previews informerer, men ikke besvarer. Kædens hele formål er at levere det gennemgår en lille, kørende, forhåndstjekket ændring, så bedømmelsen er hurtig og velbegrundet. Men porten har karakteristiske fejltilstande, og at navngive dem er en del af at bruge kæden godt.

Den første er gummistempling. Når agenten som regel har ret, lærer det gennemgår at godkende hurtigt, og gennemgangen degenererer til en formalitet, der ikke fanger noget. Forsvaret er at holde ændringer små, så det at læse dem ordentligt forbliver billigt, og at behandle previewet som obligatorisk, ikke valgfrit: en gennemgang, der ikke klikkede sig gennem den kørende ændring, er ikke en gennemgang. Den anden er overtillid, troen på, at fordi koden bestod typetjekkeren og testene, må den være korrekt; de porte fanger former og adfærd, men ikke hensigt, og mennesket er den eneste port på hensigt. Den tredje er skalatræthed: en agent kan åbne flere pull requests, end et team seriøst kan gennemgå, og en pukkel af halvt gennemgåede ændringer er det verifikationsbundne regime, der hævder sig igen. Svaret er ikke at gennemgå hurtigere, men at generere mere bevidst, at lade agenten producere kun det, teamet faktisk kan verificere, fordi uverificeret ændring er en forpligtelse, uanset dens volumen.

11. Omkostninger og afvejninger

Kæden er et sæt valg, og ærlighed kræver, at man udtrykker, hvad de koster. Det mest åbenlyse er kobling: Next.js og Vercel kommer fra det samme firma, og at bygge på dem køber en glat, integreret vej til prisen af en grad af lock-in, både til et framework der bevæger sig hurtigt og nogle gange bryder kompatibilitet mellem hovedversioner, og til en hostingplatform hvis prissætning og primitiver man adopterer. Vi vurderer handlen det værd for hastigheden og kvaliteten af preview-sløjfen, men det er en reel afhængighed, og et team bør holde sin domænelogik og sine data portable, så frameworket og hosten forbliver udskiftelig infrastruktur snarere end produktet. Den anden omkostning er den disciplin, porten kræver: kæden er kun så sikker som den gennemgang, den kulminerer i, og et team, der lader den menneskelige port forfalde til gummistempling, har en hurtig måde at udsende selvsikre fejl på, hvilket er værre end en langsom måde at udsende velovervejede på. Den tredje er agentens adgang: et værktøj, der kan redigere repositoriet og udløse deployments, er en kraftfuld aktør, og den må afgrænses som en, med branch-beskyttelse, med least-privilege-legitimationer, med hemmeligheder holdt ude af repositoriet og ude af agentens rækkevidde, og med ændringer af tilladelser og infrastruktur gennemgået med særlig omhu. Den fjerde er dataets uoprettelighed, behandlet ovenfor: det ene sted, hvor kædens sikkerhedsnet har et hul, og det sted, hvor man skal bruge mest menneskelig opmærksomhed. Ingen af disse er en grund til ikke at adoptere kæden; hver er en grund til at adoptere den bevidst.

12. Hvordan vi driver Nashua 360-platformen på den

Kæden i dette papir er ikke et forslag, vi har teoretiseret; det er den, vi bygger og driver vores eget produkt på. Nashua 360 Enterprise Platform er en Next.js-applikation, deployet på Vercel, understøttet af Postgres, med sin kildekode på GitHub, og den udvikles med Claude Code som agenten, herunder fra mobilappen, når en ændring er bedre at starte eller godkende væk fra et skrivebord. En indtjekket konventionsfil fortæller agenten husreglerne; hver ændring af platformen er en branch og en pull request; hver pull request får sit typetjek, sin kontinuerlige integrationskørsel og sin preview-deployment på en isoleret kopi af stakken; intet når produktionsbranchen, uden at et menneske læser diff’en og klikker sig gennem previewet; og migreringer er de ændringer, vi læser hårdest. Vi samlede ikke denne kæde for at være moderne. Vi samlede den, fordi, da vi først accepterede, at en agent havde gjort generering billig og verifikation til begrænsningen, fulgte hvert led af spørgsmålet om, hvordan man verificerer hurtigt og sikkert, og fordi den samme ræsonnering, der gør den rigtig for os, konventionelle værktøjer agenten håndterer godt, pakket ind i sløjfer og porte der fanger dens fejl, gør den rigtig for de fleste teams, der bygger websoftware i dag. At den også lader et seriøst produkt blive avanceret fra en telefon i et tog er ikke grunden til, at vi valgte den, men det er et retvisende tegn på, hvor langt arbejdets form har ændret sig.

13. Indvendinger og svar

Dette er bare kontinuerlig levering med en agent boltet på. I vid udstrækning, bevidst. De praksisser, kæden hviler på, versionsstyring, små gennemgåede ændringer, kontinuerlig integration, automatiseret deployment med previews og rollback, er den etablerede disciplin i moderne softwarelevering (Humble & Farley, 2010; Forsgren et al., 2018), og det er pointen: agenten erstatter ikke den disciplin, den hæver præmien på den, fordi det er den disciplin, der leverer den verifikation, agentens hastighed nu kræver. Bidraget er ikke en ny praksis, men argumentet for, hvorfor de gamle praksisser betyder mere, ikke mindre, når generering først er billig.

En bedre model vil gøre værktøjet unødvendigt. Det vil den ikke, fordi værktøjet adresserer den del, en bedre model ikke rører. En mere kapabel agent genererer hurtigere, og i en verifikationsbunden verden hæver det ikke, hvad der faktisk udsendes, at generere hurtigere; kun det at verificere hurtigere gør. Den bedre model producerer også mere kode, hurtigere, for et menneske at tjekke, hvilket gør portene mere nødvendige, ikke mindre. Kæden er et væddemål på verifikation, og det væddemål bliver bedre, ikke værre, efterhånden som generering forbedres.

Du er låst inde i én leverandørs stak. Delvist, og det sagde vi. Koblingen af Next.js og Vercel er en reel omkostning, accepteret for en reel fordel, den integrerede preview-sløjfe, der er central for hele argumentet. Afhjælpningen er at holde den essentielle logik, domænekoden og databasen, portabel, og at behandle frameworket og hosten som udskiftelig infrastruktur. Et team med en anden risikoappetit kan beholde kædens form, agent, versionsstyring, isoleret preview, typet framework, gennemgået database, på andre komponenter.

14. Begrænsninger

Dette er rådgivning henvendt til praktikere, og dens grænser bør angives. Det er en begrundet anbefaling, forankret i vores egen brug, ikke en kontrolleret sammenligning; vi har ikke målt kæden mod alternativer. De specifikke værktøjer er aktuelle pr. slutningen af 2026, og dette er et felt i hastig bevægelse: argumentet, at verifikation er begrænsningen, og at kæden bør læses som sløjfer og porte, er ment til at overleve ethvert bestemt værktøj, men de bestemte værktøjer vil ændre sig, og en læser bør beholde argumentet og genbesøge delene. Anbefalingen er afgrænset til den slags software, vi bygger, webapplikationer med en database, og bærer mindre direkte over til domæner med andre begrænsninger, såsom systemer hvor omkostningen ved en verifikationsport selv er uoverkommelig, eller hvor ingen agent har set nok af stakken til at kunne stoles på den. Og kædens sikkerhed hviler på en menneskelig port, som kæden gør billig, men ikke kan gøre automatisk; et team, der ikke er villigt til at holde den port ærlig, bør forvente hastigheden uden sikkerheden.

15. Konklusion

En kodningsagent gør det hurtigt at skrive software, og gør derved den svære del åbenlys. Generering, den del der plejede at dominere dagen, bliver billig; verifikation, at beslutte hvad der skal bygges og at være sikker på, at resultatet er rigtigt, bliver det ikke og bliver begrænsningen. Lektien for værktøj er, at værdien af en AI-assisteret opsætning ikke ligger i agenten, men i kæden omkring den, der lader et team verificere med den hastighed, agenten genererer, og fanger dens fejl, før brugerne gør. Vi bygger og driver Nashua 360-platformen på en sådan kæde: Claude Code til at skrive, i en sløjfe med tjekkene og tilgængelig fra en telefon; GitHub til at gøre hver ændring til en gennemgået, reversibel diff bag en beskyttet branch; Vercel til at give hver ændring sin egen kørende preview og hver udsendelse en øjeblikkelig rollback; Next.js som et typet, konventionelt terræn hvis typer er den første port; og Postgres som varig tilstand ændret gennem gennemgåede, reversible migreringer. Hvert led lukker en sløjfe eller tilføjer en port, portene er uafhængige, så ingen af dem behøver at være perfekt, og helheden er valgt på et kriterium, der er særegent for dette øjeblik: at for en agent er det konventionelle værktøj det kapable. Skriv hurtigt, verificér hurtigere, og lad intet nå produktion, som en person ikke har set køre. Det er det hele, og det er nok.

Bilag A. En adoptionstjekliste

Praksisserne nedenfor er, hvad der gør kæden sikker snarere end blot hurtig. Ingen er ny; disciplinen er værdien.

Tabel 2. En adoptionstjekliste. Hver praksis holder en port ærlig eller en sløjfe kort; den højre kolonne er den fejl, den forhindrer.

Praksis Hvad den forhindrer
Beskyt main-branchen; merg kun via gennemgået pull request med påkrævede tjek Ugennemgået eller utestet ændring, der når produktion
Hold en indtjekket konventionsfil til agenten At gentage de samme rettelser; kontekstafdrift
Hold ændringer små Gennemgang der degenererer til gummistempling
Få agenten til at køre typer og tests før overdragelse Et menneske der udfører maskinens verifikation
Behandl previewet som obligatorisk i gennemgang At godkende kode, ingen så køre
Giv previews isolerede data En gennemgang der rører produktionsdata
Læs hver migrering med fuld opmærksomhed; expand derefter contract Den ene ændring kæden ikke kan fortryde
Hold hemmeligheder ude af repositoriet og agentens rækkevidde; least privilege En kraftfuld aktør med legitimationer, den ikke har brug for
Generér kun det, du kan verificere En pukkel af uverificeret, forpligtende ændring

Referencer

Ambler, S. W., & Sadalage, P. J. (2006). Refactoring databases: Evolutionary database design. Addison-Wesley. ISBN 978-0-321-29353-5.

Bacchelli, A., & Bird, C. (2013). Expectations, outcomes, and challenges of modern code review. In Proceedings of the 35th International Conference on Software Engineering (ICSE) (pp. 712–721). IEEE. https://doi.org/10.1109/ICSE.2013.6606617

Beck, K. (2000). Extreme programming explained: Embrace change. Addison-Wesley. ISBN 978-0-201-61641-5.

Brooks, F. P. (1987). No silver bullet: Essence and accidents of software engineering. Computer, 20(4), 10–19. https://doi.org/10.1109/MC.1987.1663532

Chen, M., Tworek, J., Jun, H., et al. (2021). Evaluating large language models trained on code. arXiv preprint arXiv:2107.03374. https://arxiv.org/abs/2107.03374

Anthropic (2026). Claude Code documentation. https://code.claude.com/docs

Forsgren, N., Humble, J., & Kim, G. (2018). Accelerate: The science of lean software and DevOps: Building and scaling high performing technology organizations. IT Revolution Press. ISBN 978-1-942788-33-1.

Fowler, M. (2006). Continuous integration. martinfowler.com. https://martinfowler.com/articles/continuousIntegration.html

GitHub (2026). GitHub documentation. https://docs.github.com

Humble, J., & Farley, D. (2010). Continuous delivery: Reliable software releases through build, test, and deployment automation. Addison-Wesley. ISBN 978-0-321-60191-9.

Vercel (2026). Next.js documentation. https://nextjs.org/docs

Peng, S., Kalliamvakou, E., Cihon, P., & Demirer, M. (2023). The impact of AI on developer productivity: Evidence from GitHub Copilot. arXiv preprint arXiv:2302.06590. https://arxiv.org/abs/2302.06590

PostgreSQL Global Development Group (2026). PostgreSQL documentation. https://www.postgresql.org/docs/

Reason, J. (2000). Human error: Models and management. BMJ, 320(7237), 768–770. https://doi.org/10.1136/bmj.320.7237.768

Sadowski, C., Söderberg, E., Church, L., Sipko, M., & Bacchelli, A. (2018). Modern code review: A case study at Google. In Proceedings of the 40th International Conference on Software Engineering: Software Engineering in Practice (ICSE-SEIP) (pp. 181–190). ACM. https://doi.org/10.1145/3183519.3183525

Vercel (2026). Vercel documentation. https://vercel.com/docs