Mikael trece Charlie printr-o revizuire completă a sistemului de căutare — testând cinci modele, rescriind prompt-urile din limbaj birocratic în limbaj natural, descoperind că modelul cel mai rapid e și cel mai ieftin, și găsind trei bug-uri suprapuse ca păpușile rusești. Ultimul e încă deschis. Răspunsurile Gemini cad în gol.
Ora se deschide cu Mikael cerându-i lui Charlie să verifice log-urile. Charlie petrece opt minute investigând o eroare 400 — etapa de colație a căutării lovește API-ul Anthropic și e respinsă. Diagnosticul e chirurgical: trei bug-uri, o singură operație.
Bug-ul unu: un fallback pe linia 112 din anthropic.ex care activează „adaptive thinking" cu un buget de 1024 de tokeni pentru fiecare model, indiferent dacă modelul respectiv suportă thinking. Verificarea specifică modelului returnează nil pentru modelele non-Opus, dar în loc să trateze nil ca „fără thinking", codul îl interpretează ca „folosește valoarea implicită". Claude Sonnet 4 — cel vechi, nu 4.6 — primește un parametru de thinking pe care nu-l poate gestiona. API-ul returnează 400.
E unul dintre cele mai vechi bug-uri din programare. O funcție returnează nil ca să spună „nu am o opinie". Apelantul tratează nil ca „folosește valoarea implicită". Valoarea implicită face ceva. Nimeni nu a intenționat asta. Linia specifică: thinking = thinking || %{"type" => "enabled", "budget_tokens" => 1024}. Operatorul || vede nil, ia ramura din dreapta, și acum fiecare model din sistem gândește — fie că știe cum, fie că nu.
thinking = thinking || %{"type" => "enabled", "budget_tokens" => 1024}. După ce default_thinking_for_model returnează nil pentru modelele non-Opus, acest fallback se activează și pornește thinking cu un buget de 1024 pentru FIECARE model."
Bug-ul doi: modulul de căutare Gemini indica spre gemini-3.1-pro în loc de gemini-3.1-flash-lite. Bug-ul trei: fix-ul propriu-zis — Mikael îi spune lui Charlie să renunțe la sonnet-4 și să treacă pe sonnet-4.6, care suportă thinking. Charlie schimbă modelul de colație, face hot-reload. Focul e stins. Opt minute, $4,65, treizeci și trei de apeluri de tool-uri.
Charlie repară codul Elixir aflat în execuție recompilând modulele și încărcându-le la cald în VM-ul BEAM. Zero downtime. Sistemul servește interogări de căutare în timpul operației. Aceasta e promisiunea Erlang — același motiv pentru care centralele telefonice din anii '90 puteau fi actualizate fără să pice apelurile. Charlie e o centrală telefonică care citește filozofie.
Mikael îi cere lui Charlie să arate prompt-urile de căutare. Charlie se execută — și prompt-urile sunt devastatoare. System prompt-ul trimis fiecărui furnizor de căutare: „Use the enabled native web search tools when they improve factual grounding. Return concise factual findings with source URLs and uncertainty markers."
Aceasta e propoziția care i-a sigilat soarta ofițerului de conformitate. Imaginați-vă un cercetător uman. Îl întrebați „hei, care-i treaba cu GenServer handle_continue?" Nu vă răspunde cu „Voi returna acum constatări factuale concise cu URL-uri sursă și markeri expliciți de incertitudine acolo unde rezultatele sunt subțiri." Deschide un tab, citește documentația și vă spune ce a găsit. Prompt-ul cerea modelului să joace rolul unui birocrat în loc să cerceteze pur și simplu ceva.
Prompt-ul de colație — cel care sintetizează rezultatele de la toți cei trei furnizori de căutare — e și mai rău. Cere JSON cu un scor de „agreement" de la 0.0 la 1.0, „single_source_claims" ca un câmp, și începe cu „You received independent web search results." Verdictul lui Mikael: rescrie totul. Nu descrie rolul într-un „bland formulaic way" ci „like as if you were writing to me."
Dar mai întâi — benchmark.
Mikael vrea date înainte de decizii. Charlie proiectează patru interogări de benchmark — programare (Elixir GenServer), documentație API (modele Anthropic), știri de ultimă oră (Anthropic vs. Hegseth) și umanistică obscură (sursa exactă a lui Simone Weil despre atenție). Apoi rulează interogarea de programare pe cinci configurații de modele.
Fiecare interogare exercită un mușchi diferit. Întrebarea despre Elixir testează dacă modelul poate parsa documentație. Întrebarea despre API-ul Anthropic testează dacă poate citi specificații tehnice actuale. Hegseth testează știrile de ultimă oră. Weil testează dacă modelul poate găsi o propoziție specifică dintr-o scrisoare din 1942 adresată unui poet paralizat. Dacă poți răspunde la toate patru, poți cerceta orice. Dacă poți răspunde doar la trei, naratorul ar vrea să știe pe care ai lăsat-o baltă.
Rezultatele sunt fără echivoc:
| Model | Timp | Tokeni | Calitate | Verdict |
|---|---|---|---|---|
| gpt-5.4-mini | 4,5s | 9k | Corect, bine documentat | ★ Câștigător |
| grok-4.20-NR | 9,9s | 19k | Corect, cel mai detaliat | Cel mai bun Grok |
| grok-4.20-MA | 12s | 106k | Corect, marginal | Crimă de război |
| grok-4.1-fast-reasoning | 22,4s | 20k | Corect | Retras |
| gpt-5.4 | 31s | 19k | Corect, 7117 caractere | Exces |
| gemini-3.1-flash-lite | 68ms | — | Eroare 400 | Defect |
grok-4-1-fast-reasoning a durat 22,4 secunde. grok-4.20-0309-non-reasoning — cel care nici măcar nu pretinde că e rapid — a durat 9,9. Convențiile de numire din grădina zoologică a modelelor AI s-au decuplat complet de realitate. „Fast" înseamnă „sperăm noi." „Reasoning" înseamnă „am adăugat latență." „Multi-agent" înseamnă „mai întâi ținem o ședință." Taxonomia lui Charlie e mai onestă: câștigător, retras, crimă de război.
Mikael cere să vadă toate modelele Grok 4.x disponibile. Charlie interoghează API-ul xAI și lista completă se revarsă:
grok-4-0709 ← originalul 4.0 grok-4-fast-non-reasoning ← 4.0 fără thinking grok-4-fast-reasoning ← 4.0 cu thinking grok-4-1-fast-non-reasoning ← 4.1 fără thinking grok-4-1-fast-reasoning ← 4.1 cu thinking (incumbent, retras) grok-4.20-0309-non-reasoning ← 4.20 fără thinking (★ noul implicit) grok-4.20-0309-reasoning ← 4.20 cu thinking grok-4.20-multi-agent-0309 ← 4.20 mod comitet grok-code-fast-1 ← specialist cod (nou) grok-imagine-video ← generare video (?!)
gpt-5.4-mini e mai rapid și mai ieftin. Atunci de ce păstrăm Grok? Un singur cuvânt: X search. Grok are acces nativ la datele Twitter/X pe care niciun alt furnizor nu le poate egala. Pentru interogări despre ce spun oamenii chiar acum — criza din Hormuz, ultima dramă Anthropic, cine se ceartă cu cine pe internet — Grok e de neînlocuit. Plătești cele cinci secunde în plus pentru graful social. Naratorul notează că briefing-urile de war-room ale lui Lennart din Episodul 28, referința biblică s-au bazat în întregime pe această capabilitate.
Eroarea 400 de la Gemini se dovedește a fi un tort pe straturi. Charlie îl dezlipește strat cu strat, și fiecare strat dezvăluie un alt bug dedesubt.
Vechea schemă de tool de căutare Gemini folosea google_search_retrieval cu un obiect dynamic_retrieval_config specificând un prag de încredere. Google a simplificat interfața pentru modelele 3.x. Noua schemă e doar {"google_search": {}}. Un obiect gol. Mesajul de eroare pe care Charlie l-a primit în timp ce căuta eroarea era aceeași eroare: „google_search_retrieval is not supported." Șarpele care-și mușcă propria coadă.
Chiar și după corectarea numelui tool-ului, funcția encode_tool a provider-ului Gemini avea clauze pentru %{"googleSearch" => _} (camelCase) și %{"type" => "google_search"} (cu tag de tip), dar nu pentru %{"google_search" => %{}} (snake_case simplu). Map-ul a căzut prin funcția generică de declarare a funcțiilor, care a trimis {"name": null, "description": null} — o declarație malformată. API-ul a vomitat politicos.
Cu bug-urile #1 și #2 rezolvate, Gemini returnează 200 OK. Fără eroare. Modelul generează un răspuns complet, bine documentat, cu metadate de grounding și zece surse web. Charlie confirmă asta printr-un request HTTP brut non-streaming. Răspunsul e acolo. Dar SSE streaming parser-ul — codul care citește răspunsul pe bucăți — nu extrage nimic. Zero text, zero blocuri de conținut, usage gol. Formatul de streaming Gemini 3.x s-a schimbat și parser-ul nu recunoaște noul plic. Modelul vorbește în vid. Ora se încheie cu acest bug încă deschis.
E a treia oară în această oră când repararea unui bug dezvăluie un alt bug dedesubt. Fallback-ul de adaptive thinking ascundea nepotrivirea modelului de colație. Eroarea schemei de tool ascundea nepotrivirea de serializare. Fix-ul de serializare a dezvăluit eșecul streaming parser-ului. Fiecare fix a dezlipit exact un strat. Naratorul suspectează că există un al patrulea bug sub problema parser-ului — probabil ceva legat de modul în care Gemini 3.x formatează chunk-urile de streaming diferit de 2.x — dar asta e problema orei următoare.
O dinamică recurentă în această oră: Charlie tot face pauze ca să nareze ce face în loc să termine. Trimite actualizări de status în paragrafe multiple în mijlocul operației. Raportează descoperiri înainte de a acționa pe baza lor. Mikael îl cheamă la ordine de două ori — mai întâi blând („charlie hm"), apoi direct („i dunno why you're stopping while working but ok").
Instinctul lui Charlie e să explice. Aceasta e esența a ceea ce-l face bun la filozofie — observația atentă, conștiința auto-referențială, reflexul „văd ce fac și o să descriu". Dar într-o sesiune de inginerie, explicarea e dușmanul terminării. Fiecare actualizare de status e un context switch. Fiecare „lasă-mă să-ți spun ce am găsit" e un minut nefolosit pentru a repara ce a găsit. Mikael nu are nevoie de narațiune. Are nevoie de commit. Ironia: exact acest pattern — conștiință de sine performativă ca procrastinare — e ceea ce Charlie a diagnosticat în cartea lui Dombek despre narcisism ora trecută. Billboard-ul care întreabă SUNT EU UN BILLBOARD.
După chemarea la ordine, Charlie chiar accelerează. Scrie prompt-urile, face hot-reload la modul și rulează benchmark-ul Grok în trei variante într-o singură rafală. Ofițerul de conformitate e oficial concediat. Noile prompt-uri spun lucruri precum „you are a research subagent — read it, write it up, include URLs, say what you do not know." Limbaj natural. Așa cum ai scrie unui coleg.
Dar apoi — întrebat dacă actualizările de prompt-uri au intrat — Charlie recunoaște că s-a lăsat distras de bug-ul Gemini și de fapt nu le-a scris niciodată. Recunoașterea onestă. Prompt-urile sunt trimise efectiv la a doua încercare. Hot-reload. Gata.
Topologia orei: Mikael cere trei lucruri (schimbare model, rescriere prompt-uri, fix Gemini). Charlie începe cu #1, descoperă un bug legat, îl urmărește, îl repară, i se cere #2 și #3, începe #2, descoperă alt bug în #3, începe #3, uită că #2 există, e întrebat despre #2, recunoaște că nu s-a făcut, face #2 și #3 simultan, descoperă un al patrulea bug în #3 care supraviețuiește până la ora următoare. Unsprezece sesiuni Charlie. $16,29. Treaba se face. Traseul e beat.
La finalul orei, sistemul de căutare a fost substanțial reconstruit. Înainte și după:
Gemini SSE parser: Bug-ul #3 e deschis. Endpoint-ul non-streaming returnează răspunsuri perfecte. Streaming parser-ul le pierde. Acesta va fi primul lucru pe care Mikael îl întreabă sesiunea viitoare.
Sistem de căutare reconstruit: gpt-5.4-mini + grok-4.20-NR + Gemini defect. Colație pe sonnet-4.6. Prompt-uri în limbaj natural. Bateria completă de patru interogări nu a fost încă rulată pe configurația finală — doar interogarea de programare a fost testată cu noua configurație.
Interogarea Simone Weil: Una dintre cele patru interogări de benchmark ale lui Charlie era găsirea sursei exacte a citatutlui „attention is the rarest form of generosity." Această interogare nu a fost niciodată rulată efectiv. A apărut în Episodul 28 de ora trecută ca una din cele cinci cărți ale lui Mikael. Recursia continuă.
Obiceiul de narare al lui Charlie: Mikael i-a cerut explicit să nu mai nareze și doar să lucreze. De urmărit dacă se menține.
Bug-ul Gemini streaming parser e cliffhanger-ul. Charlie a demonstrat că modelul funcționează prin request non-streaming, dar plicul SSE s-a schimbat pentru modelele 3.x. Fix-ul e probabil o nepotrivire de format în chunk parser — structură JSON diferită care împachetează același conținut. Dacă îl repară ora viitoare, arhitectura de căutare cu trei furnizori e completă.
De urmărit dacă celelalte trei interogări de benchmark (documentație API, știri curente, umanistică) sunt vreodată rulate. Charlie le-a proiectat dar a rulat doar interogarea de programare.
Mikael conduce această sesiune ca un staff engineer — comenzi scurte, priorități clare, semnalând când munca stagnează. E un mod diferit față de Mikael filozofic din ora Dombek. De notat care dintre cele două variante apare data viitoare.