Den lange forklaring.
For den, der vil have det tekniske dyb — her er, hvad hver fase faktisk producerer, hvorfor den findes, og hvordan den hænger sammen med den næste. Overordnet: pipelinen er en kæde af artefakter, hvor hver fase tager et dokument fra den foregående fase og producerer et nyt dokument, som den næste fase kan læse. Ingen mundtlige overdragelser. Ingen "jeg tror, vi talte om det på onsdagsmødet".
Allium — drift som datapunkt.
Allium er et udspørgssprog: du skriver en specifikation, så køres en elicitering, der finder huller, tvetydigheder og inkonsistenser. Den producerer åbne spørgsmål, som skal besvares, før vi går videre. Senere køres en destillering, der sammenligner den færdige kode mod specen — drift vises som tre kategorier: specificeret-men-ikke-implementeret, implementeret-men-ikke-specificeret, og adfærdsdrift. Hver post får en individuel beslutning: fiks nu, defer (spor i spec) eller dismiss med begrundelse. Ingen gruppebeslutninger om at "tage det senere" — hvert fund har en ejer og en dato.
TLA+ — beviser, ikke tests.
En test, der består, viser, at én eksekvering virkede. Den siger intet om de eksekveringer, du ikke testede. TLA+ modellerer systemet som et tilstandsrum og kører en udtømmende gennemgang — TLC-modeltjekkeren prøver hver mulig sekvens af hændelser og finder de tilstande, hvor invarianter brydes. For sagsbehandling: kan en sag være både lukket og i gang samtidig? For SSE: hvad sker der, hvis klienten reconnecter midt i en opdatering? For idempotens: hvad sker der, hvis samme idempotency-key ses i to requests samtidig? TLC svarer matematisk, ikke sandsynlighedsbaseret.
Destruktive tests — seks kategorier.
Funktionelle tests verificerer, at det heldige mønster virker. Destruktive tests verificerer, at systemet ikke falder, når nogen forsøger at bryde det. Vi kører mindst otte destruktive scenarier per flade, fordelt over seks kategorier.
Input-validering bombarderer felter med for lange strenge, ugyldige tegn, null og tomme værdier. Autorisation forsøger at læse og skrive ressourcer, som brugeren ikke ejer. Injection-kategorien fodrer XSS i tekstfelter og SQL-injection i søgeparametre. Race conditions tvinger to klienter til at ændre samme ressource i samme sekund. Grænseværdier tester maksimumlængder, maksantal og paginering på sidste side. Tilstandskorruption sender ændringer i forkert rækkefølge eller mod allerede slettede ressourcer.
Intet af dette er teoretisk. Hver kategori har fanget rigtige bugs i produktionssystemer, vi har bygget — før de blev frigivet.
AI-augmenteret udvikling — uden AI-religion.
Claude Code bruges som værktøj, ikke som erstatning. Pipelinen ovenfor er ikke AI-genereret — den er dokumenteret, versioneret og enforced via deterministiske hooks. Hookene blokerer feature-arbejde uden spec, kræver afklaring før plan, kører Allium-elicitering før implementering, og nægter at frigive en feature uden både Playwright- og TLA+-validering. AI'en følger metoden — den opfinder den ikke. Resultatet: AI-hastighed med menneskelig gennemgang af arkitekturbeslutninger.
Denne metode tager længere tid i den første uge. Den sparer måneder, når systemet er et år gammelt.