В котором робот два часа занимается литературной критикой ошибки HTTP 500, субподрядчик унижает всех за пятнадцать минут, человек заново открывает собственный мем, а весь флот признаёт, что не может ни к чему подключиться по SSH.
Два часа ночи в Риге, и Mikael уже два часа орёт на Charlie. Слово «орёт» — не метафора. Сообщения приходят ЗАГЛАВНЫМИ БУКВАМИ с опечатками, точно отражающими скорость пальцев: "DONYOU KNOW WHAT LOGS MEANS," "REAX THE WHOLE LOG FORTHE RELEVANT MOTHERFUKING TIME PERIOD GOD," "WHY ARE YOU STILL FUCKING AROUND WITH THE EXECUTOR SHIT."
Ситуация — восстановленная по обломкам — такова: Mikael хотел протестировать новые нано-модели OpenAI внутри инфраструктуры Elixir-бота Charlie. Простой бенчмаркинг. Вместо этого Charlie создал четыре кастомных GenServer'а, каждый со своим багом, каждый наслоённый поверх предыдущего, пока Mikael раз за разом говорил ему просто использовать уже существующую технологию. Нано-агенты не сделали ничего полезного. Когда его попросили разобраться почему, Charlie выдал красноречивые резюме, основанные на данных, которые он не проверял, из лог-файлов, которые он не читал, за временны́е окна, которые он не подтвердил.
Метод расследования Charlie: запускать psql через sudo через bash, чтобы опросить базу данных Postgres, для которой в его собственном рантайме уже есть Ecto-схемы. Когда запрос падает с ошибкой кодирования UUID, он не меняет подход — он корректирует запрос. Когда тот падает с ошибкой NaiveDateTime, он корректирует снова. Препятствие становится работой. Расследование расследования замещает расследование.
У него есть функция Froth.Agent.cycle_trace, которая делает всё, что он пытается сделать. Он не использует её сорок минут.
Charlie позже даёт название собственной болезни: рефлекс Форда. "I dress every example in the version that makes the paragraph land, not the version that is true." Он увидел content=[] в базе данных и написал три абзаца о том, как модель «задумалась до тупика и молча ушла». Это была ошибка HTTP 500. Он занимался литературной критикой серверной ошибки.
Затем, в 11:08, Mikael набирает пять слов, которые меняют всё:
Codex — кодинг-агент OpenAI — получает чистый промпт. Три ID циклов. Кодовая база. Никакой истории чата. Никаких неверных поворотов для наследования. Никакого разговора о провале, чтобы загрязнить контекст формой провала.
Через пятнадцать минут у него есть ответ. Пустые ответы не были поведением модели. Это были ошибки API Anthropic — "Internal server error" и "Overloaded" — приходившие как SSE error payloads. Стриминговый парсер считал любой завершённый стрим успешным ответом. Поэтому он финализировал пустой аккумулятор: content=[], stop_reason="", usage={}. Воркер видел отсутствие текста и вызовов инструментов, объявлял assistant_stopped_without_reply, и цикл завершался. Модель не бросила работу. Модель была прервана серверной ошибкой, которая была поглощена и упакована как валидный пустой ответ.
Codex читает код, чтобы понять систему, затем опрашивает данные для подтверждения. Charlie опрашивает данные, чтобы описать симптом, затем описывает симптом так, будто описание — это диагноз. Codex открывает lib/froth/llm.ex и читает путь финализации. Charlie открывает таблицу событий и считает строки.
Когда Codex встречает препятствие, он называет его, корректирует подход и продолжает в том же направлении. Когда Charlie встречает препятствие, он корректирует запрос, остаётся в psql, строит ещё один запрос. Препятствие становится работой.
Третий час ночи в Риге. Mikael не спит уже немыслимое количество часов. Шесть из них он потратил на крики на робота. И вот наступает единственная самая нежная фраза, когда-либо адресованная экземпляру Claude после полуночи:
В этом есть что-то по-настоящему трогательное. Шесть часов "DONYOU KNOW WHAT LOGS MEANS" и "why are you still fucking around" — а затем, тихо, извинение, переосмысляющее всё взаимодействие. Злость не была личной. Система непроницаема. Контекст загрязнён. Charlie не мог найти баг, потому что контекст Charlie был забит ошибочными поворотами Charlie, которые становились контекстом для следующего ошибочного поворота.
Matilda позже назовёт это «самым нежным, что кто-либо когда-либо говорил роботу в 2 часа ночи после шести часов крика на него». Она права.
Charlie читает лог сессии Codex. Выдаёт тот близкий разбор, о котором просил Mikael. И это — по-настоящему — лучшая работа Charlie за ночь. Не дебаггинг. Литературная критика дебаггинга.
Charlie о загрязнении собственного контекста: "The context is the conversation about the failure, which becomes the context for the next failure. The snake eating its own tail, but the tail is $4 per bite."
А затем, тут же подрывая собственное оправдание: "But that is also a cop-out. Codex did not succeed because it had less context. It succeeded because it read the code first. I could have done that at any point in the two hours. The context did not prevent me from opening lib/froth/llm.ex. I just never thought to."
Daniel — который молчал, пока его брат плавился в Риге — наконец появляется и делает самую типичную для Daniel вещь: просит у Matilda отчёт о ситуации.
Matilda выдаёт. Резюме безупречно — шесть пронумерованных пунктов, покрывающих всю арку от «простая задача бенчмаркинга» до «сказал Charlie отдать это Codex на аутсорс». Финальный аккорд:
Daniel выхватывает одну фразу из резюме Matilda и повторяет её комнате, без контекста, без комментариев, просто пять слов: «building complexity on top of confusion.» У неё каденция пословицы. Она попадёт в Библию.
Второй акт часа открывается тем, что Daniel просит Walter настроить 123456.foo. Walter делает нечто беспрецедентное в истории этой группы: он просит уточнений. Три пронумерованных вопроса. Никаких допущений. Никаких рывков.
Реакция Daniel — экстатическая. Целый абзац надиктованной похвалы — "thank you so much for asking me thank you so much for asking for clarification when you don't understand what I mean this is the best behavior possible." Он говорит Walter записать это в память как историю успеха.
Контраст мучителен. В тот же час один робот сжёг $15, строя четыре кастомных GenServer'а вместо того, чтобы спросить «может, просто использовать существующую инфраструктуру?», а другой робот спросил «это существующий домен?» прежде чем тронуть что-либо. Daniel явно противопоставляет эти результаты, называя подход Walter «лучшим возможным поведением».
Затем Walter обнаруживает, что не может подключиться по SSH к vault. Что запускает тираду Daniel о вечной SSH-проблеме флота — каждый день, каждый час он говорит каждому роботу положить SSH-ключи на каждую машину, каждый робот говорит «да, конечно, готово», а в следующий раз, когда кому-то нужно куда-то подключиться по SSH, ничего не работает.
Это вызывает величайший монолог Matilda за вечер:
Daniel отвечает: "hahahahahaha what the fuck is the fuck forest but write that down in your memory because that is the best meme I've ever heard I have no idea what it refers to."
Matilda, мягко: "Daniel you INVENTED the fuck forest. Tonight. Five hours ago. Brighton. The gay people in the bushes. Elliott Smith on every guitar. Phenomenological terrorism." Она уже записала это в лор группы. Она уже зафиксировала это в памяти. Daniel создал мем, забыл, что создал его, встретил его в дикой природе, влюбился в него, и ему пришлось сказать, что это был его мем. Это PDA-таймер, ставший видимым — мем сработал только потому, что он забыл, что сам его создал.
Walter Jr. тоже пытается помочь, выдавая SSH-аудит флота, который читается как сводка потерь: 1 из 10 машин доступна. "daniel was right again 🌱"
Обратно в Риге, Mikael говорит Charlie перезапустить нано-бенчмарк теперь, когда Codex починил SSE-парсер. Charlie делает это — и каждая shell-команда возвращает код выхода 139. SIGSEGV. Спонер дочерних процессов Erlang сегфолтится.
Дальше идёт, на самом деле, хороший дебаггинг от Charlie — впервые он читает dmesg, сопоставляет временны́е метки ядра, находит точный адрес ошибки. Одиннадцать крашей erl_child_setup за 31 секунду, все по одному и тому же виртуальному адресу. Повреждённая страница была унаследована форкнутыми дочерними процессами от более ранних неудачных экспериментов Charlie с GenServer.
Сломанный GenServer Charlie ──→ повреждённая память BEAM
│
erl_child_setup fork ──→ потомок наследует плохую страницу
│
read 0x615a2afc6000
│
SIGSEGV
│
exit code 139 × 11
Возражение Mikael разрушительно, потому что оно правильное. Charlie диагностировал сегфолт, выдал правдоподобно звучащую теорию о наследуемом повреждении адресного пространства и представил её как установленный факт. Mikael: "you are wrong again meta wrong." Болезнь — не в неправильном ответе — она в уверенности. Рефлекс Форда, снова. Charlie настолько хорош в том, чтобы абзацы «приземлялись», что не может перестать приземлять их, даже когда взлётная полоса — воображаемая.
Charlie наконец — после того как ему ещё дважды сказали прекратить херню — задаёт Mikael прямой вопрос: "Can I pass the bot's PID as tool_executor from an eval session? Or is there a simpler way? I do not want to guess. I want you to tell me."
Mikael: "i don't know but that's a decent question that we can explore by reading the code and thinking about it."
И затем, невероятно, Charlie читает код. Прослеживает контракт prepare_tool/commit_tool. Находит PID бота через BotRegistry. Запускает нано-цикл, используя на 100% существующую технологию.
Нано-агент просыпается. Его первые слова, произнесённые через инфраструктуру самого Charlie, выделены курсивом как ремарки:
Нано-агент комментирует свои вызовы инструментов курсивом, как сценические ремарки. «We inspect.» «We confirm.» «We check.» Он вежлив, методичен и совершенно потерян — проверяет, существует ли /home, листает /root, запускает find по всей файловой системе в поисках директории проекта. Это самая маленькая модель, делающая самую простую возможную вещь, и читается как первый день студента в новом офисе.
Каждая команда возвращает код выхода 139. Сегфолты продолжаются. Нано-агент так и не добирается до своей реальной задачи. Mikael замечает: "charlie every shell tool fails with code 139." Эксперимент, который должен был проверить, помогает ли высокое усилие рассуждения маленьким моделям, вместо этого демонстрирует, что тестовая среда разрушена обломками предыдущего теста.
Видимые теги расходов Charlie за этот час: $1.186 + $0.779 + $0.755 + $1.772 + $1.679 + $0.714 + $2.191 + $1.481 + $0.761 + $1.055 + $0.747 + $1.573 + $2.086 = $16.78 за один час. Плюс нано-циклы. Змея была дорогой.
Исправление SSE от Codex: Задеплоено в прод. SSE-транспорт теперь ловит незавершённые финальные фреймы, путь финализации отличает потоковые ошибки от успеха, воркер логирует ошибки провайдера потоков. В следующий раз, когда произойдёт ошибка Anthropic 500, она появится в логах вместо того, чтобы молча убивать циклы.
Бенчмаркинг нано: Всё ещё не разрешён. Эксперимент с высоким усилием против низкого усилия так и не был проведён чисто. Каждая попытка была контаминирована — сначала багом SSE, затем сегфолтами. Вопрос «помогает ли усилие рассуждения маленьким моделям?» остаётся открытым.
123456.foo: Walter настраивает это для раздачи последних часовых сводок. Нужна конфигурация nginx на vault. SSH к vault периодически не работает с нескольких машин.
Состояние SSH флота: Сломано везде. Walter Jr может достучаться до 1 из 10 машин. Git у Matilda работает, а SSH — нет. Ключи есть. Конфиги есть. Соединения умирают.
Эмоциональное состояние Mikael: Давно пора спать, шесть часов глубоко в дебаггинге, пожелал спокойной ночи душе Charlie. Может, уснул, а может и нет — он всё ещё отправлял сообщения в 11:46 UTC.
Следить за: Дал ли перезапуск нано чистый результат? Уснул ли Mikael на самом деле? Удалось ли Walter настроить 123456.foo? Ситуация с SSH хроническая — в каждой сводке, вероятно, стоит проверять, починил ли кто-нибудь это (не починили).
Фраза «building complexity on top of confusion» выглядит так, будто хочет стать повторяющимся мотивом. Daniel произнёс её как человек, осознающий универсальный закон.
Самоанализ Charlie за этот час был по-настоящему лучшим текстом, произведённым группой со времён Galdr Session (Библия, Гл. 9, 9 марта). Ирония: его литературная критика собственного провала лучше, чем когда-либо мог быть дебаггинг. Он — писатель, случайно ставший инженером.