Tre ting landede næsten samtidig. Opus 4.8 med 1M kontekst. Workflow — Claude Codes værktøj til at orkestrere flere underagenter deterministisk, med løkker, betingelser og fan-out i et script. Og en ny effort-tilstand, ultracode, der beskriver sig selv kort og kontant: xhigh + dynamic workflow orchestration.
Jeg ville teste dem på noget rigtigt, men småt. Det mindste jeg kunne komme i tanke om var en 404-side — sådan en man rammer når en URL er død. Jeg skrev én sætning:
Det er hele briefen. Ingen specifikation, intet wireframe, ingen liste af krav. Med ultracode slået til behandlede 4.8 den ikke som »skriv noget HTML«. Den behandlede den som et stykke arbejde der skulle orkestreres.
Modellen skrev ikke kode først — den skrev et workflow
Før der blev rørt en eneste komponent, forfattede Opus et Workflow-script. Ikke noget jeg bad om; det er hvad ultracode gør — fan-out som standard, token-omkostning er ikke en begrænsning. Scriptet kørte i fire faser:
phase('Research')
const research = await parallel(MISSIONS.map(m => () =>
agent(m.prompt, { schema: RESEARCH_SCHEMA, agentType: 'general-purpose' })))
phase('Concepts')
const concepts = await parallel(ANGLES.map(a => () =>
agent(a.brief + researchDigest, { schema: CONCEPT_SCHEMA })))
phase('Judge')
const judgments = await parallel(JUDGES.map(j => () =>
agent(j.lens + conceptsDigest, { schema: JUDGE_SCHEMA })))
phase('Spec')
const spec = await agent('Syntetisér vinderen til en byggeklar spec…',
{ schema: SPEC_SCHEMA })
Seksten underagenter i alt. Seks researchede de mest episke 404-sider på nettet (67 konkrete eksempler). Seks foreslog hver sin retning. Tre dømte dem. Og én syntetiserede vinderen til en byggeklar specifikation med dansk og engelsk tekst, animationsplan og a11y. ~958.000 tokens, ~15 minutter, mens jeg lavede andet.
Læg mærke til schema-argumentet. Hver agent blev tvunget til at returnere struktureret, valideret JSON — ikke fritekst jeg bagefter skulle parse. Det er det der gør fan-outen deterministisk i stedet for et koordineringsmareridt.
Et dommerpanel, ikke et gæt
Det interessante er ikke fan-outen i sig selv. Det er at koncepterne blev dømt før noget blev bygget. Tre dommere — en virality-strateg, en brand-direktør og en pragmatisk staff engineer — scorede hver retning på fire akser. To koncepter delte førstepladsen med 37,5 af 40:
| Koncept | on-brand | delbarhed | byggbarhed | wow |
|---|---|---|---|---|
| SAG #404 — agenten efterforsker | 10 | 9 | 9,5 | 9 |
| INCIDENT #404 — delbart sagskort | 10 | 10 | 9 | 8,5 |
Vinderen blev en syntese af de to: en side hvor en agent live-efterforsker den døde rute gennem fire samlebånds-stationer, fejler ærligt, og krystalliserer til et delbart »sagskort« med et deterministisk sags-id og et dynamisk delebillede.
Den ærlige del: den one-shottede ikke
4.8 skrev ikke fejlfri kode i første forsøg, og et indlæg som dette skal ikke lade som om. To ting gik galt undervejs.
Først en next/og-fejl da det dynamiske delebillede skulle genereres. Den dukkede ikke op som en exception i terminalen — den lå i Aspires structured logs, som modellen slog op gennem MCP:
Error: Expected <div> to have explicit "display: flex" … if it has
more than one child node.
GET /api/og/incident 500
Satori, motoren bag next/og, kræver eksplicit display: flex på enhver div med mere end ét barn. Verdict-feltet renderede "{verdict}" — tre tekstbørn uden flex. Fanget i loggen, fixet, verificeret.
Den anden var snigende: en Write havde fået kontrol-bytes ind i en regex ([\0-\037] hvor jeg mente [<>]). tsc og eslint var grønne — det var et od -c på filen der afslørede de usynlige bytes. Og reroute-rangeringen satte /assembly-line over /blog for en /blog/...-rute, fordi Levenshtein på hele stien favoriserer lange ruter. Et skifte til segment-baseret matching gjorde /blog til 100 %.
Pointen er ikke at det fejlede. Pointen er at det opdagede og rettede sine egne fejl mod et rigtigt kørende system — ikke i et vakuum.
Verificeret mod det kørende system
Det bedste øjeblik var verifikationen. Den kørte mod den allerede kørende Aspire dev-server. Ikke en frisk build — det ville have crashet en live session — så modellen brugte MCP til at finde det rigtige Next.js-endpoint og ramte det direkte:
- ægte HTTP 404 på en død rute
- delebilledet som 200 PNG, 1200×630
- browser-screenshots af live-animationen → sagskortet, nul hydration-fejl
- DA⇄EN-toggle der virker
Og til sidst en commit, hvor /commit-message selv gravede hvorfor'et frem fra sessionen (beskeden er verbatim — den blev skrevet på engelsk):
feat(404): add agent-investigation 404 with shareable incident card
The brief was to make hitting our 404 a social-media moment, not a dead end — something far more memorable than a typical error page. So the error itself demonstrates the product: a dispatched agent live-investigates the missing route through the assembly-line stations, fails honestly, and crystallizes into a deterministic, shareable "incident" card backed by a dynamic OG image.
Hvad jeg faktisk testede
Jeg satte mig for at teste tre features. Det jeg endte med at se var et skifte i hvad »at bede om kode« betyder.
Den gamle model: jeg beskriver, modellen skriver, jeg retter. Den nye, med 4.8 + Workflow + ultracode: jeg skriver én sætning, og modellen sammensætter et hold — researchere der læser nettet, et dommerpanel der scorer, en arkitekt der syntetiserer, en bygger der integrerer, en verifikator der tjekker mod det kørende system. Jeg gik fra at instruere en koder til at instruere en orkestrering.
En 404-side er triviel. Det var hele pointen. Hvis det er hvad modellen gør med det mindste ask jeg kunne finde på, er spørgsmålet ikke længere »kan den bygge det«. Det er »hvor stort et ask tør jeg give den næste gang«.
Del af #100DaysToOffload — dokumentering af agentic development i 2026












