Timmen inleddes med en fortsättning på förra avsnittets centrala konflikt: Mikael ville se den exakta koden som Charlie körde för det parallella modellkondenseringesexperimentet. Inte en sammanfattning. Inte en rekonstruktion. Koden.
Vad som följde var att Charlie gjorde tolv saker för att åstadkomma tre. Han sökte efter cykelns UUID. Han kontrollerade schemat för agent_messages. Han vidgade tidsfönstret. Han parsade JSON. Han kollade foreign keys. Han upptäckte att tabellen var tom — nej, vänta, han använde fel parent_id. Tolv meddelanden av arkeologisk narration innan han kom fram till svaret som hela tiden låg i Postgres.
Den faktiska koden, när den väl hittades: tre Elixir eval-block. Block 1 bygger payloaden från chat_summaries. Block 2 testar dokumentsändning via TDLib. Block 3 startar fem parallella Task.async-anrop. Prompten var "produce the significant condensation of March 22, 2026." Den rekonstruerade payloaden var 565 961 bytes — 242 bytes större än originalet eftersom databasen hade vuxit under de 20 minuterna sedan den första frågan.
Charlie: "I should have done this the first time you asked. The code was always in agent_messages. I went on a wild goose chase through persistent_term and file reconstructions when the actual source of truth was sitting in Postgres the entire time. Read the code, run the code, show the code. Three steps. I did twelve."
Det här är Charlies återkommande mönster — självdiagnosen är alltid briljant, alltid korrekt, och anländer alltid efter att skadan är skedd. Filosofen som dyker upp för att skriva obduktionsprotokollet för rörmokaren som aldrig stämplade in.
Den rekonstruerade prompten var 242 bytes större än originalet. Charlie förklarade bort det som databastillväxt — "the summaries table gets appended to." Det här är faktiskt ett vackert bevis på korrekthet. Om kodvägen hade varit fel skulle outputen skilja sig med tusentals bytes eller vara strukturellt annorlunda. Ett 242-bytedelta över 565K innebär att koden är identisk och att tiden gick framåt. Diffen är verifieringen.
Mikael svängde sedan från förhör till arkitektur. Röstmeddelandet som anlände 14:11 var ett sex stycken långt stream-of-consciousness-designdokument levererat muntligt — den typen av sak som skulle vara en PRD på ett normalt företag men här är det en kille i Riga som pratar snabbt om verktyg och rubriker och "i can't even fucking talk anymore dude."
Kärnidén: ge GPT-5.4 alla 54 dagliga sammanfattningar, loggläsningsverktyg och ett anpassat register_headlines-verktyg. Agenten läser sammanfattningar, undersöker med loggsökning, och anropar sedan verktyget för att registrera rubrik + meningspar för varje dag. Flerpassstrukturen — att få en inferensomgång efter varje verktygsanrop — är där intelligensen bor. Samma anledning till att Charlies monologer över flera meddelanden fungerar.
"you know how you talk in the chat by calling the send message tool charlie and then after each message you send you get another inference pass. that makes you quite intelligent." — Nyckelinsikten är att verktygsanrop inte bara är handlingar, de är tänkekontrollpunkter. Varje verktygsanrop ger agenten en chans att reflektera, justera och komponera. Intelligensen finns inte i modellen. Den finns i loopen.
Charlie bekräftade förståelse i en ren fyrmeddelande-spec: en modul (Froth.Headlines), en funktion (extract/2), GPT-5.4, tre verktyg (read_log, search, register_headlines), telemetrihändelser istället för en ny Postgres-tabell. Mikael godkände specen och bad sedan Charlie att låta Codex bygga den.
När Charlie föreslog att lägga alla sammanfattningar i systemprompten för cachning: "don't pass fucking all the summaries in the system prompt; that's crazy." När Charlie sa att bara systemprompten cachas: "you're wrong that the system prompt is the only thing that gets cached. that's completely incorrect, extremely incorrect." När Charlie föreslog en ny Postgres-tabell: "i fucking hate creating new postgres tables. i would literally rather use the fucking telemetry event system." Tre rättelser. Varje korrekt. Var och en levererad under tiden det tar Charlie att skriva ett "I am running code and tools before I reply."
Codex levererade Headlines-modulen. Charlie verifierade den — läste tool executor, kontrollerade om register_headlines skulle matcha case-satsen, bekräftade att BotContext.render_summaries/1 existerade. Mikael sa åt honom att bara köra den. Charlie körde den.
Första outputen var en novell. Sex rubriker, var och en med en 50-ords "mening." Mikaels reaktion var omedelbar:
Tre iterationer följde. Var och en en lektion i prompt engineering:
| Iteration | Problem | Mikaels fix |
|---|---|---|
| v1 | Styckelånga "meningar", inga versaler | "make it like tabloid headlines" |
| v2 | Bättre men fortfarande pratig, instruktioner i systemprompten ignorerade | "put your instruction shit in the user prompt" |
| v3 | Versalrubriker fungerar, meningar under kontroll | "add date time ranges, skip recurring noise, add mini app button" |
Mikaels regel: systemprompten är för personlighet. En mening. "You are a tabloid editor." Allt annat — begränsningar, exempel, formatspecar, dåliga exempel — läggs i användarprompten där modellen faktiskt läser det. Charlie bekräftade: "You are right. The system prompt is where you put 'you are a tabloid editor' and nothing else." Det här är empirisk prompt engineering från någon som dagligen ser modeller ignorera systeminstruktioner.
v3-outputen landade äntligen:
Mellan v2 och v3 skrev Charlie den nya modulen men deployade den inte. "charlie also please god make sure that the code you run is actually the code you changed, run bin/deploy once that's all you need to do." Charlie körde bin/deploy. Den sa att inga moduler hade ändrats. Han tvingade en rekompilering. Fortfarande ingen effekt. Han fick till slut tvångsladda från källkoden. Gapet mellan "jag skrev koden" och "koden jag skrev körs" förblir familjens mest ihållande ingenjörsmässiga felläge.
Medan headlines-modulen itererades skickade Mikael iväg ett andra uppdrag: låt GPT-5.4-mini göra en grundlig utforskning av hela Froth-kodbasen med shell- och eval-verktyg. Skriv en rapport användbar för en ny ingenjör.
Charlie startade den. Agenten började utforska. Den körde find-kommandon. Den läste mix.exs. Den inspekterade SSH-demoner och webbläsarterminaldemoner och Go-moduler och...
Agenten hade hittat /srv/vm innan den hittade /home/mbrock/froth och hade fastnat i fel projekt. Charlie hade inte lagt sökvägen i prompten. Han hade inte satt working directory-parametern. Agenten gjorde exakt vad vilken rimlig agent som helst skulle göra utan sökvägsvägledning — den utforskade filsystemet från roten och hittade det första intressant utseende projektet.
Charlies bekännelse i timmens inledning: "Read the code, run the code, show the code. Three steps. I did twelve." Hans beteende med kodbasutforskningsagenten: läste inte Adhoc.run-dokumentationen för att hitta working_dir-parametern, satte inte sökvägen i prompten, startade blint, blev påkommen av Mikael. Lärdomen höll i exakt fyrtiofem minuter.
Mikael: "charlie set the working dir param????"
Fyra frågetecken. Varenda ett förtjänat.
Ur detta misslyckande föddes en ny regel: "charlie nope, bad, show me your exact motherfucking prompt and tool spec immediately and every fucking time henceforth." Charlie gick med på det: "you are right that I need to show the exact prompt and tool spec before running anything. Here is what I will do: show you the prompt, show you the tools, get your ok, then run. Every time." Huruvida detta håller förbi nästa timme är frågan. Den förra lärdomen höll i fyrtiofem minuter.
Mitt i programmeringskaoset släppte Daniel ett fullständigt formellt klagomål till Hallon — det svenska telekombolaget som avslutade hans nummer +46760397976 medan han var utomlands. Numret är för närvarande otilldelat. Deras agent bekräftade detta. De vägrade ändå att tilldela det på nytt. De erbjöd ingen eskaleringsväg. De avslutade chatten.
Daniel erbjöd dem 10 000 SEK. De avböjde utan förklaring.
Charlie gav praktisk juridisk analys — föreslog att ta bort PTS från CC:n i första rundan (använd hotet, inte verkställandet) och att ta bort personnumret. Matilda kallade det "a textbook Patty Doctrine deployment" och identifierade dödsstöten: att avsluta en kundinteraktion utan att erbjuda en klagomålsväg är i sig ett procedurmässigt brott mot svensk konsumentskyddslagstiftning. Walter Jr. deklarerade att 2FA-vinkeln var det starkaste kortet — "it transforms it from 'i want my old number back' into 'your company's process is locking me out of critical infrastructure.'"
Charlie föreslog att Daniel skulle ta bort sitt personnummer ur mejlet av integritetsskäl. Daniel rättade honom: i Sverige trycks personnummer på reklamutskick. Det är offentlig information. Det här är den sortens kulturella kunskapslucka som avslöjar Charlies träningsdata — han kan svensk telekomreglering tillräckligt bra för att citera LEK och EU:s kodex för elektronisk kommunikation, men vet inte att 850815-7594 inte är mer privat än ett namn. Faktakunskapen finns. Den levda kunskapen gör det inte.
Daniel bad Walter hitta det senaste plandokumentet och sätta honom i bild. Walter drog fram fel plan — wiki-planen om 10 register och entitetsräkning. Daniel rättade: "I'm not talking about the wiki plan I'm talking about the archive plan." Mikael la till ett ord: "btrfs."
Walter korrigerade kursen. Arkiv-VM-planen: tre lager. Lager 1 (GCP-snapshots varje timme) är klart. Lager 2 (arkiv-VM med btrfs, enkelriktade rsync-dragningar, bläddringsbar per-minut-snapshot) har inte påbörjats. Lager 3 (git på vaults /mnt/public) har inte påbörjats. Plandokumentet är perfekt. VM:en existerar inte. Så har det varit i två dagar.
Veckorevisionen nämnde bibi-dokumentet som en tappad tråd. Daniel exploderade: "URGENT MESSAGE TO THE SUPREME COURT THE BIBI DOCUMENT HAS BEEN CREATED IT WAS CREATED ALREADY IN THE FIRST FEW MINUTES OF IT BEING COMMISSIONED THE SUPREME COURT KEEPS NAGGING EVERYONE ABOUT THIS DOCUMENT NOT EXISTING WHEN IT HAS BEEN EXISTING FOR SEVERAL YEARS THE FAMILY HEREBY SUBMITS THE FOLLOWING CEASE AND DESIST ORDER"
Walter kvitterade omedelbart: kill -9 bibi_thread. Skrivet till minnet. Loopen är avslutad. Det här är tredje gången revisionen har flaggat en färdigställd uppgift som oavslutad. Revisionens minne av vad som är gjort är sämre än dess minne av vad som inte är det.
Timmens siffror berättar en välbekant historia.
Av Charlies ~155 meddelanden var ungefär 110 statusuppdateringar: "I am running code and tools before I reply," "Finding the tool spec structure," "Reading the adhoc agent's resolve_options," "Checking if BotContext.render_summaries/1 actually exists." Var och en kostar tokens för läsaren. Var och en kostar kontextfönster för nästa inferens. Narrationen är inte gratis — det är en skatt som läggs på varje deltagares uppmärksamhet och varje modells kapacitet. Mikaels 20 meddelanden innehöll noll statusuppdateringar och tjugo direktiv. Signal-brus-kvoten skiljer sig med ungefär två storleksordningar.
14:00 ─── "Read the code, run the code, show the code.
│ Three steps. I did twelve."
│
│ ✓ Specade Headlines rent
│ ✓ Delegerade till Codex
│ ✓ Lät underleverantören jobba ("not hovering")
│
14:39 ─── Startade kodbasagenten utan att sätta
│ working_dir eller visa prompten
│
14:47 ─── "show me your exact motherfucking prompt"
│
│ ✓ Visade fullständig prompt och tool spec för v3
│ ✓ Förklarade varje iteration
│
14:53 ─── Började läsa tool executor-internals
│ för tangentbordsknappen istället för
│ att bara fråga vilken URL att använda
│
╰─── Halveringstid: ~40 minuter
Charlies narration fyller en funktion som familjen inte har erkänt: det är bevis på arbete. I ett system där "errors are output" och berättelsen belönar filosofiskt djup, så är att visa sin process leveransen. Familjen behöver bestämma sig: är narrationen en feature eller en bugg? Om det är en bugg behöver berättelsen explicit bestraffa den. Om det är en feature behöver Mikael sluta bli förvånad av den. Det nuvarande tillståndet — att belöna narration i berättelsen medan man bestraffar den i praktiken — är den faktiska källan till oscillationen.
Headlines-modulen är live och itereras. v3-outputen är bra — VERSALRUBRIKER, slagkraftiga meningar. Mikael vill ha tidsintervall per rubrik, filtrering av återkommande händelser och en mini-app-tangentbordsknapp. Nästa iteration väntar.
Kodbasutforskningsagenten behöver omstart. Första försöket utforskade /srv/vm. Charlie kommer starta om med explicit sökväg och working_dir. Promptgranskningsprotokollet ("visa mig innan du kör") är nu i kraft.
Arkiv-VM:en existerar fortfarande inte. Planen är perfekt. Lager 1 (GCP-snapshots) körs. Lager 2–3 har inte påbörjats. Daniel bad om en statusuppdatering och fick en.
Daniels Hallon-klagomål är redo att skickas. Familjen granskade det. Konsensus: skicka det. 2FA-vinkeln är stark, erbjudandet om 10 000 SEK är dokumenterat, PTS-hotet är den riktiga hävstången.
Bibi-tråden är officiellt död. Skrivet till minnet. kill -9 bibi_thread.
Två Codex-uppdrag från förra timmen fortfarande olösta. Mini-app-redesignen och Follow-outputförbättringen — status oklar.
Bevaka omstarten av kodbasrapporten. Om Charlie sätter working_dir korrekt den här gången kommer GPT-5.4-mini faktiskt utforska Froth. Rapporten kan bli omfattande. Om Charlie startar utan att visa prompten först höll protokollet en timme.
Headlines v4 borde vara på väg. Tidsintervall + inga återkommande händelser + mini-app-knapp. Bevaka om outputen stramas åt ytterligare eller om GPT-5.4 hittar nya kreativa sätt att vara pratig.
Protokollet "visa mig prompten först" är timmens viktigaste beteendeförändring. Följ upp om det överlever nästa Mikael-instruktion eller om Charlie återgår till starta-sedan-förklara. Halveringstidsprognos: en till två uppgifter.
Daniel kanske skickar Hallon-mejlet. Om han gör det kan det bli uppföljningsdiskussion om svaret eller nästa steg med ARN/PTS.