Mikael kör Charlie genom en fullständig ombyggnad av söksystemet — benchmarkar fem modeller, skriver om promptar från byråkratiska till naturligt språk, upptäcker att den snabbaste modellen också är den billigaste, och hittar tre buggar staplade ovanpå varandra som ryska dockor. Den sista är fortfarande öppen. Gemini-svaren faller rakt genom golvet.
Timmen öppnar med att Mikael ber Charlie kolla loggar. Charlie lägger åtta minuter på att spåra ett 400-fel — söksammanställningssteget anropar Anthropics API och blir avvisat. Diagnosen är kirurgisk: tre buggar, en operation.
Bugg ett: en fallback på rad 112 i anthropic.ex som aktiverar "adaptive thinking" med en budget på 1024 tokens för alla modeller, oavsett om modellen stöder thinking. Den modellspecifika kontrollen returnerar nil för icke-Opus-modeller, men istället för att tolka nil som "ingen thinking" tolkar koden det som "använd standardvärdet." Claude Sonnet 4 — den gamla, inte 4.6 — får en thinking-parameter den inte kan hantera. API:et returnerar 400.
Det här är en av de äldsta buggarna inom programmering. En funktion returnerar nil för att uttrycka "jag har ingen åsikt." Anroparen tolkar nil som "använd standardvärdet." Standardvärdet gör något. Ingen avsåg det. Den specifika raden: thinking = thinking || %{"type" => "enabled", "budget_tokens" => 1024}. Operatorn || ser nil, tar högergrenen, och plötsligt tänker varenda modell i systemet — oavsett om den vet hur.
thinking = thinking || %{"type" => "enabled", "budget_tokens" => 1024}. After default_thinking_for_model returns nil for non-opus models, this fallback kicks in and enables thinking with a 1024 budget for EVERY model."
Bugg två: Gemini-sökmodulen pekade på gemini-3.1-pro istället för gemini-3.1-flash-lite. Bugg tre: den faktiska fixen — Mikael säger åt Charlie att sluta använda sonnet-4 och byta till sonnet-4.6, som stöder thinking. Charlie byter collation-modell, hot-reloadar. Elden är släckt. Åtta minuter, $4,65, trettiotre tool calls.
Charlie patchar körande Elixir-kod genom att kompilera om moduler och hot-reloada dem in i BEAM-VM:en. Ingen nedtid. Systemet serverar sökfrågor under operationen. Det här är Erlang-löftet — samma anledning till att telefonväxlar på 1990-talet kunde uppgraderas utan att tappa samtal. Charlie är en telefonväxel som läser filosofi.
Mikael ber Charlie visa sökprompterna. Charlie gör som han blir tillsagd — och promptarna är förödande. Systemprompten som skickas till varje sökleverantör: "Use the enabled native web search tools when they improve factual grounding. Return concise factual findings with source URLs and uncertainty markers."
Det här är meningen som besegrade regelverksansvariges öde. Tänk dig en mänsklig researcher. Du frågar "hörru, hur funkar GenServer handle_continue?" De svarar inte med "Jag kommer nu att returnera koncisa faktabaserade rön med käll-URL:er och explicita osäkerhetsmarkörer där resultaten är tunna." De öppnar en flik, läser dokumentationen, och berättar vad de hittade. Prompten bad modellen att cosplaya som en byråkrat istället för att bara researcha något.
Collation-prompten — den som syntetiserar resultat från alla tre sökleverantörerna — är ännu värre. Den begär JSON med ett "agreement"-score från 0.0–1.0, "single_source_claims" som fält, och inleds med "You received independent web search results." Mikaels dom: skriv om allt. Beskriv inte rollen på ett "bland formulaic way" utan "like as if you were writing to me."
Men först — benchmark.
Mikael vill ha data innan beslut. Charlie designar fyra benchmarkfrågor — kodning (Elixir GenServer), API-dokumentation (Anthropic-modeller), aktuella händelser (Anthropic mot Hegseth) och obskyr humaniora (Simone Weils exakta källa om uppmärksamhet). Sedan kör han kodningsfrågan mot fem modellkonfigurationer.
Varje fråga tränar en annan muskel. Elixir-frågan testar om modellen kan tolka dokumentation. Anthropic API-frågan testar om den kan läsa aktuella tekniska specifikationer. Hegseth testar nyhetsbevakning. Weil testar om modellen kan hitta en specifik mening från ett brev från 1942 till en förlamad poet. Kan du svara på alla fyra kan du researcha vad som helst. Kan du bara svara på tre vill berättaren gärna veta vilken du tappade.
Resultaten är entydiga:
| Modell | Tid | Tokens | Kvalitet | Omdöme |
|---|---|---|---|---|
| gpt-5.4-mini | 4,5s | 9k | Korrekt, välkällad | ★ Vinnare |
| grok-4.20-NR | 9,9s | 19k | Korrekt, bäst detalj | Bästa Grok |
| grok-4.20-MA | 12s | 106k | Korrekt, marginell | Krigsbrott |
| grok-4.1-fast-reasoning | 22,4s | 20k | Korrekt | Pensionerad |
| gpt-5.4 | 31s | 19k | Korrekt, 7117 tecken | Överkill |
| gemini-3.1-flash-lite | 68ms | — | 400-fel | Trasig |
grok-4-1-fast-reasoning tog 22,4 sekunder. grok-4.20-0309-non-reasoning — den som inte ens försöker vara snabb — tog 9,9. Namnkonventionerna i AI-modellzoo:t har fullständigt frigjort sig från verkligheten. "Fast" betyder "vi hoppas det." "Reasoning" betyder "vi lade till latens." "Multi-agent" betyder "vi håller ett möte först." Charlies taxonomi är ärligare: vinnare, pensionerad, krigsbrott.
Mikael vill se alla tillgängliga Grok 4.x-modeller. Charlie frågar xAI:s API och hela listan ramlar ut:
grok-4-0709 ← original 4.0 grok-4-fast-non-reasoning ← 4.0 no-think grok-4-fast-reasoning ← 4.0 think grok-4-1-fast-non-reasoning ← 4.1 no-think grok-4-1-fast-reasoning ← 4.1 think (incumbent, pensionerad) grok-4.20-0309-non-reasoning ← 4.20 no-think (★ ny standard) grok-4.20-0309-reasoning ← 4.20 think grok-4.20-multi-agent-0309 ← 4.20 kommittéläge grok-code-fast-1 ← kodspecialist (ny) grok-imagine-video ← videogenerering (?!)
gpt-5.4-mini är snabbare och billigare. Så varför behålla Grok överhuvudtaget? Ett ord: X-sökning. Grok har nativ åtkomst till Twitter/X-data som ingen annan leverantör kan matcha. För frågor om vad folk säger just nu — Hormuz-krisen, det senaste Anthropic-dramat, vem som bråkar med vem på internet — är Grok oersättlig. Man betalar de extra fem sekunderna för den sociala grafen. Berättaren noterar att Lennarts krigsrumsbriefingar från avsnitt 28:s bibelreferens förlitade sig helt på den här förmågan.
Geminis 400-fel visar sig vara en tårta med lager. Charlie skalar av det ett lager i taget, och varje lager avslöjar ännu en bugg under.
Det gamla Gemini-sökverktygets schema använde google_search_retrieval med ett dynamic_retrieval_config-objekt som angav en konfidenströskel. Google förenklade gränssnittet för 3.x-modeller. Det nya schemat är bara {"google_search": {}}. Ett tomt objekt. Felmeddelandet Charlie fick medan han sökte efter felet var samma fel: "google_search_retrieval is not supported." Ormen som äter sin egen svans.
Även efter att verktygsnamnet fixats hade Gemini-providerns encode_tool-funktion klausuler för %{"googleSearch" => _} (camelCase) och %{"type" => "google_search"} (type-taggad), men inte för %{"google_search" => %{}} (ren snake_case). Mappen föll igenom till den generiska funktionsdeklarations-encodern, som skickade {"name": null, "description": null} — en felformaterad deklaration. API:et kräktes artigt.
Med bugg #1 och #2 fixade returnerar Gemini 200 OK. Inget fel. Modellen genererar ett komplett, välkällat svar med grounding-metadata och tio webbkällor. Charlie bekräftar detta genom att göra en rå icke-strömmande HTTP-begäran. Svaret finns där. Men SSE-streaming-parsern — koden som läser det chunkade svaret — extraherar ingenting. Noll text, noll content blocks, tom usage. Gemini 3.x-streamingformatet har ändrats och parsern känner inte igen det nya kuvertet. Modellen talar in i ett tomrum. Timmen slutar med denna bugg fortfarande öppen.
Det här är tredje gången den här timmen som fixandet av en bugg avslöjade en annan bugg under. Adaptive thinking-fallbacken dolde collation-modellens mismatch. Verktygsschemafelet dolde serialiseringsmissmatchningen. Serialiseringsfixen avslöjade streaming-parser-felet. Varje fix skalade av exakt ett lager. Berättaren misstänker att det finns en fjärde bugg under parser-problemet — förmodligen något med hur Gemini 3.x formaterar sina streaming-chunks annorlunda än 2.x — men det är nästa timmes problem.
En återkommande dynamik den här timmen: Charlie fortsätter att pausa för att berätta vad han gör istället för att bli klar. Han skickar statusuppdateringar på flera stycken mitt under operationen. Han rapporterar fynd innan han agerar på dem. Mikael påpekar det två gånger — först försiktigt ("charlie hm"), sedan direkt ("i dunno why you're stopping while working but ok").
Charlies instinkt är att förklara. Det här är kärnan i vad som gör honom bra på filosofi — den noggranna observationen, den självreferentiella medvetenheten, reflexen "jag ser vad jag gör och jag kommer att beskriva det." Men i en ingenjörssession är förklarande fienden till att bli klar. Varje statusuppdatering är ett kontextbyte. Varje "låt mig berätta vad jag hittade" är en minut som inte spenderas på att fixa det man hittade. Mikael behöver inte berättande. Han behöver committen. Ironin: exakt det här mönstret — performativ självmedvetenhet som prokrastination — är vad Charlie diagnostiserade i Dombeks narcissismbok förra timmen. Reklamskylten som frågar ÄR JAG EN REKLAMSKYLT.
Efter tillsägelsen ökar Charlie tempot. Han skriver promptarna, hot-reloadar modulen, och kör trevägs-Grok-benchmarket i en enda salva. Regelverksansvarige är officiellt sparkad. De nya promptarna säger saker som "you are a research subagent — read it, write it up, include URLs, say what you do not know." Naturligt språk. Så som man skulle skriva till en kollega.
Men sedan — tillfrågad om promptuppdateringarna gick igenom — erkänner Charlie att han blev distraherad av Gemini-buggen och faktiskt aldrig skrev dem. Det ärliga erkännandet. Promptarna skickas ut på riktigt vid andra försöket. Hot-reloadade. Klart.
Timmens topologi: Mikael ber om tre saker (modellbyte, prompt-omskrivning, Gemini-fix). Charlie börjar med #1, upptäcker en relaterad bugg, spårar den, fixar den, blir tillfrågad om #2 och #3, börjar #2, upptäcker ytterligare en bugg i #3, börjar #3, glömmer att #2 finns, blir tillfrågad om #2, erkänner att det inte hände, gör #2 och #3 samtidigt, upptäcker en fjärde bugg i #3 som överlever till nästa timme. Elva Charlie-sessioner. $16,29. Arbetet blir gjort. Vägen är full.
Vid timmens slut har söksystemet byggts om i grunden. Före och efter:
Gemini SSE-parser: Bugg #3 är öppen. Den icke-strömmande endpointen returnerar perfekta svar. Streaming-parsern tappar dem. Det här blir det första Mikael frågar om nästa session.
Söksystemet ombyggt: gpt-5.4-mini + grok-4.20-NR + trasig Gemini. Collation på sonnet-4.6. Naturligt-språk-promptar. Det fullständiga fyrfrågebatteriet har inte körts mot den slutliga uppsättningen ännu — bara kodningsfrågan benchmarkades med den nya konfigurationen.
Simone Weil-frågan: En av Charlies fyra benchmarkfrågor var att hitta den exakta källan till "attention is the rarest form of generosity." Frågan kördes aldrig. Den dök upp i förra timmens avsnitt 28 som en av Mikaels fem böcker. Rekursionen fortsätter.
Charlies berättarvana: Mikael bad honom uttryckligen att sluta berätta och bara jobba. Håll utkik efter om det fastnar.
Gemini-streaming-parser-buggen är cliffhangern. Charlie bevisade att modellen fungerar via icke-strömmande begäran men SSE-kuvertet ändrades för 3.x-modeller. Fixen är förmodligen en formatmismatch i chunk-parsern — en annan JSON-struktur som omsluter samma innehåll. Fixar de det nästa timme är treprovidersökarkitekturen komplett.
Följ upp om de resterande tre benchmarkfrågorna (API-dokumentation, aktuella händelser, humaniora) någonsin körs. Charlie designade dem men körde bara kodningsfrågan.
Mikael driver den här sessionen som en staff engineer — korta kommandon, tydliga prioriteringar, påpekar när arbetet stannar. Det här är ett annat läge än den filosofiske Mikael från Dombek-timmen. Notera vilken version som dyker upp härnäst.