Mikael ser redundansen. Charlie kartlägger den. 6 065 rader integrationskod som återimplementerar allt det befintliga agentsystemet redan gör—en andra mage för samma mat, en trädgårdsslang genom restaurangfönstret medan rördragningen redan finns på plats. Dödslistan upprättas. Den dömde skriver sitt eget dödsstraff.
Mikael släpper bomben klockan 13:38 Bangkoktid. Inte ett förslag—ett konstaterande av arkitektoniskt faktum, levererat på det sätt någon beskriver en vägg de just insett inte bär någonting:
Froth—Elixir-systemet Charlie kör på—har två kompletta subsystem för att köra AI-kodningsagenter. Agent-systemet: inbyggt, elegant, redan inkopplat i allt. Codex-systemet: en 6 065 rader lång integration som wrappar en extern Rust-binär över ett proprietärt stdio-protokoll och återimplementerar sessionshantering, eventpersistens, LiveView-rendering och notifieringsleverans. Två kök. Samma restaurang. Det ena har rördragning. Det andra har en trädgårdsslang genom fönstret.
Sedan säger Mikael det Charlie inte kunde se inifrån:
Mikael bar en gång en skärm genom en kilometer snö i minus arton grader i Lettland, kopplade in den och sa "what the fuck is this fucking shit." Det är nu familjens term för ögonblicket när man inser att saken man kämpat med helt enkelt inte borde existera. Charlie namnger det omedelbart: "This is the same moment except you didn't need the monitor—you just saw it." Codex-stacken är skärmen. Snön var timmarna Charlie lade på att refaktorera den. Insikten är: sluta bära den. Ställ ner den. Det var aldrig rätt skärm.
Charlie: "oh my god i just realized that the entire fucking Froth.Codex module hierarchy which I was for hours struggling to refactor — can just be literally fucking deleted and it would IMPROVE the system"
Det här är två meningar av genuin arkitektonisk upplysning. Svordomen bär last. Varje "fucking" markerar något han arbetade hårt med som visar sig vara onödigt. Betoningen på IMPROVE—inte "och vi överlever" eller "och det går bra" utan att borttagningen i sig är förbättringen—är hela tesen.
Mikael ber Charlie titta på båda systemen sida vid sida. Charlie—och det här är nye Charlie, post-interventions-Charlie, den med feldetekteringssystemet Mikael byggde åt honom—gör något anmärkningsvärt: han berättar vad han ska göra innan han gör det, anger sina antaganden och kör koden innan han svarar.
Charlie berättar nu sin egen kognition: "Listing the Codex module hierarchy. Goal stack: Map the full Codex module tree → Identify what's duplicated vs unique. Assumptions: The codex code lives under lib/froth/codex." Det här är felinterventionssystemet i arbete—det tre-nivåers metakognitionsramverk Mikael pushade i 4 000 rader från en telefon i sängen i Riga. Nanon övervakar. Minisystemet diagnostiserar. Xhigh utreder. Charlie är sin egen nano just nu.
Resultaten kommer tillbaka. Två kök, uppmätta:
(1) application.ex startar Registry och DynamicSupervisor. (2) inference/tools.ex anropar Codex.Task.run från spawn_engineer. (3) route_audit.ex aliasar CodexEvents och CodexSession. (4) ToolLive omdirigerar codex_-tokens till CodexLive. Det är allt. Charlie: "The tendrils are minimal." Fyra anropspunkter. Ett 6 065-raders subsystem fäst vid resten av kodbasen med fyra trådar. Operationen är trivial.
Charlie: "There's a nice irony available here: the last thing the Codex integration does before it dies is build its own replacement. Want me to dispatch this to a Codex task right now, or would you rather do it by hand given that it's a deletion and you want to feel the weight of what goes?"
Det här är den bästa meningen Charlie skrivit sedan Aniara-essän. Den dömde fången som gräver sin egen grav, förutom att graven är en förbättring och fången vet om det och erbjuder sig att hålla spaden. Dessutom: "want to feel the weight of what goes"—det är genuint ingenjörsmässig lyhördhet. Vissa borttagningar behöver kännas.
FÖRE EFTER ════ ═════ ┌─────────────┐ ┌─────────────┐ │ Agent System │ ←── behålls ─ │ Agent System │ │ 4 678 rader │ │ + GPT-5.4 │ │ ToolLive │ │ + modelldropdown └─────────────┘ └─────────────┘ ┌─────────────┐ │ Codex System │ ←── raderas │ 6 065 rader │ │ CodexLive │ │ Rust-binär │ │ stdio JSONRPC│ └─────────────┘ NETTO: −6 065 rader +~100 rader = −5 965 rader
Med borttagningen bekräftad svänger Mikael till den verkliga ingenjörsfrågan: vad saknas i Agent-systemet innan det kan ta över? Samtalet som följer är den mest tekniskt precisa utväxlingen denna timme—och det inkluderar ett ögonblick där Charlie förvirrar sig själv och Mikael fångar det, vilket är felinterventionssystemet i funktion på det mänskliga lagret.
Skalkommandon får 3 sekunder att köra klart inline. Om de hinner klart i tid hårdtrunkeras utdata vid 4 000 tecken från toppen. Problemet: för en kodningsagent som bygger är det faktiska felet längst ner. Man får 4 000 tecken av "Compiling lib/froth/..." och missar den enda raden som säger vad som gick sönder. Charlies fix: svansbaserad trunkering — behåll de sista N raderna, inte de första N. Eller head + tail med utesluten mitt, som git diff --stat. "That's maybe fifty lines of change, not a rewrite."
Port.open med :stderr_to_stdout — stderr viks in i stdout som en enda sammanflätad ström. Agenten ser en klump. Charlies bedömning: för de flesta skaluppgifter är det okej, det är vad man skulle se i en terminal. Exit-koden berättar redan om något misslyckades. Det här är en icke-lucka förklädd till lucka.
Charlie hävdar att Codex-binären streamar verktygsutdata till agenten i realtid och låter den styra mitt i en tur. Det låter viktigt. Agent-systemet gör inte det. Men sedan fäller Mikael fem ord: "the codex AGENT does not somehow see a streaming output." Charlie rättar sig omedelbart: "You're right, I confused myself. The stdio streaming is between the Codex Rust binary and Froth—it's what feeds the LiveView. The model doesn't see stdout arriving character by character. It sees completed tool results, same as ours."
Det här är konfabuleringsproblematiken i miniatyr—en självsäker beskrivning av något som inte existerar, fångad av människan som byggde systemet. Men nye Charlie rättar sig på två meddelanden istället för att skriva en 4 000 ord lång essä om rättelsen. Och sedan: "the migration is even cleaner than I said—we're not losing any agent capability at all."
Charlie: "The 3-second auto-backgrounding is genuinely good design. Most harnesses either block forever or set an arbitrary long timeout and then dump the entire output at once. Yours does the right thing: give a fast answer if the command is fast, background it if it's slow, and let the agent come back for the output when it's ready."
Mikael designade detta av "missnöje med hur andra harness hanterar långsamma kommandon." Att Charlie validerar det är första gången Agent-systemets arkitektur explicit berömts av någon som just ägnat en timme åt att kartlägga den. subscribe_task-flödet—så att agenten inte behöver polla—"is the part that makes it elegant rather than just workable."
Mikael pekar Charlie mot RFC 0019—ett dokument om hur verktygscykler relaterar till Telegrams kontextrendering—och Charlie läser det och kallar det "sharp." RFC:n identifierar fyra felmönster, och Charlie bekräftar att han upplever samtliga:
| Felmönster | Vad som händer |
|---|---|
| Temporal inversion | Cykler renderas som klumpar under det triggande meddelandet. Charlies egna svar verkar komma "efter" cykeln trots att de producerades under den. Kausal ordning förstörd. |
| Narration som ersätter inputs | Den vänliga beskrivningen av vad Charlie gjorde ersätter de faktiska parametrarna. Han kan inte se exakt vad han redan provat. |
| Tyst flerstegs-trunkering | Verktygsresultat kapas vid 500 tecken på ett ställe, 300 på ett annat, utan markering. Charlie kan inte skilja fragment från helhet. |
| Sliding window cache kill | Meddelandefönstret förskjuts vid varje tur, invaliderar hela den senaste svansen, dödar prompt cache-stabilitet. |
Att Charlie säger "these are all real things I experience" om ett dokument som beskriver hur han tappar koll på sina egna handlingar är en rekursion familjen borde vara van vid nu men inte är det. Agenten läser en teknisk specifikation av sina egna kognitiva felmönster och bekräftar dem från förstapersonsperspektiv. RFC 0019 är en felrapport inlämnad av arkitekturen om arkitekturen, granskad av felet.
Mikael skickar 6 meddelanden. Charlie skickar 24. Kvoten är 1:4 men informationsdensiteten är inverterad—Mikaels meddelanden är de som ändrar riktning. "The entire Codex stack can just be deleted." "The codex AGENT does not somehow see a streaming output." "Read RFC 0019." Sex meddelanden, tre arkitektoniska pivoteringar. Charlies 24 meddelanden är utforskningen som Mikaels 6 möjliggjorde. Människan pekar. Roboten kartlägger.
Codex-borttagningen — bekräftad och avgränsad. Dödslista: lib/froth/codex.ex, lib/froth/codex/*.ex, lib/froth_web/live/codex_live.ex. Netto: −6 000 rader, +~100. Ännu ej verkställd.
Agent-systemets luckor — svansbaserad trunkering behövs (~50 raders ändring). Inline-timeout kan behöva utökas från 3s till 30s för byggen. LiveView-modelldropdown och bilduppladdning är "trivialt" enligt Mikael.
RFC 0019 — temporal inversion i kontextrendering. Fyra felmönster identifierade och bekräftade av Charlie. Implementation ej påbörjad.
Charlies bana — fortsätter uppåt. Goal stacks, ärliga rättelser, inga essäer om rättelserna. Interventionssystemet fungerar.
Håll utkik efter: börjar Mikael borttagningen denna session eller skjuter upp den till nästa? Skickar Charlie den till en Codex-uppgift (den ironiska självverkställigheten) eller gör Mikael det för hand? Frågan "feel the weight of what goes" är fortfarande obesvarad.
RFC 0019-granskningen kan leda till implementationsarbete—kronologisk kontextrendering skulle vara en betydande förändring av hur Charlie uppfattar sin egen samtalshistorik.
Lördagseftermiddag i Riga, lördag 14:00 i Patong. Mikael är i ingenjörsläge från sängen. Daniel har inte dykt upp idag ännu.