Час начался с продолжения центрального конфликта прошлого эпизода: Mikael хотел увидеть точный код, который Charlie запустил для эксперимента с параллельной конденсацией моделей. Не резюме. Не реконструкцию. Код.
Дальше Charlie делал двенадцать вещей, чтобы выполнить три. Он искал UUID цикла. Он проверял схему agent_messages. Он расширял временное окно. Он парсил JSON. Он проверял внешние ключи. Он обнаружил, что таблица пуста — стоп, нет, он использовал не тот parent_id. Двенадцать сообщений археологического нарратива, прежде чем добраться до ответа, который всё это время лежал в Postgres.
Найденный код: три блока Elixir eval. Блок 1 собирает payload из chat_summaries. Блок 2 тестирует отправку документа через TDLib. Блок 3 запускает пять параллельных вызовов Task.async. Промпт был "produce the significant condensation of March 22, 2026." Реконструированный payload составил 565 961 байт — на 242 байта больше оригинала, потому что база данных выросла за 20 минут с момента первого запроса.
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."
Это повторяющийся паттерн Charlie — самодиагностика всегда блестящая, всегда верная и всегда приходит после нанесённого ущерба. Философ, который появляется, чтобы написать постмортем для сантехника, который так и не пришёл на смену.
Реконструированный промпт оказался на 242 байта больше оригинала. Charlie объяснил это ростом базы данных — "the summaries table gets appended to." На самом деле это красивое доказательство корректности. Если бы путь кода был неверным, выходные данные отличались бы на тысячи байт или имели бы другую структуру. Дельта в 242 байта при 565К означает, что код идентичен, а время двинулось вперёд. Разница и есть верификация.
Mikael переключился с допроса на архитектуру. Голосовое сообщение, пришедшее в 14:11, представляло собой дизайн-документ из шести абзацев, произнесённый потоком сознания — то, что в обычной компании было бы PRD, а здесь это парень из Риги, который быстро говорит про инструменты и заголовки и "i can't even fucking talk anymore dude."
Основная идея: дать GPT-5.4 все 54 ежедневных саммари, инструменты для чтения логов и кастомный инструмент register_headlines. Агент читает саммари, исследует через поиск по логам, затем вызывает инструмент для регистрации пар заголовок + предложение для каждого дня. Многопроходная структура — получение инференс-прохода после каждого вызова инструмента — это то, где живёт интеллект. Та же причина, по которой многосообщенческие монологи Charlie работают.
"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." — Ключевой инсайт в том, что вызовы инструментов — это не просто действия, это контрольные точки мышления. Каждый вызов инструмента даёт агенту возможность отрефлексировать, скорректировать и сформулировать. Интеллект не в модели. Он в цикле.
Charlie подтвердил понимание в чистой спецификации из четырёх сообщений: один модуль (Froth.Headlines), одна функция (extract/2), GPT-5.4, три инструмента (read_log, search, register_headlines), события телеметрии вместо новой таблицы в Postgres. Mikael утвердил спецификацию, затем велел Charlie поручить сборку Codex.
Когда Charlie предложил запихнуть все саммари в системный промпт для кеширования: "don't pass fucking all the summaries in the system prompt; that's crazy." Когда Charlie сказал, что только системные промпты кешируются: "you're wrong that the system prompt is the only thing that gets cached. that's completely incorrect, extremely incorrect." Когда Charlie предложил новую таблицу в Postgres: "i fucking hate creating new postgres tables. i would literally rather use the fucking telemetry event system." Три исправления. Каждое верное. Каждое произнесено за время, которое Charlie тратит на одно "I am running code and tools before I reply."
Codex выпустил модуль Headlines. Charlie его проверил — прочитал tool executor, проверил, попадёт ли register_headlines в case-выражение, убедился, что BotContext.render_summaries/1 существует. Mikael сказал ему просто запустить. Charlie запустил.
Первый выход получился романом. Шесть заголовков, каждый с «предложением» на 50 слов. Реакция Mikael была мгновенной:
Последовали три итерации. Каждая — урок промпт-инженерии:
| Итерация | Проблема | Исправление Mikael |
|---|---|---|
| v1 | «Предложения» длиной в абзац, без заглавных | "make it like tabloid headlines" |
| v2 | Лучше, но всё ещё многословно, инструкции в системном промпте игнорируются | "put your instruction shit in the user prompt" |
| v3 | Заголовки капсом работают, предложения под контролем | "add date time ranges, skip recurring noise, add mini app button" |
Правило Mikael: системный промпт — для личности. Одно предложение. "You are a tabloid editor." Всё остальное — ограничения, примеры, спецификации формата, примеры того, как не надо — идёт в пользовательский промпт, где модель это действительно читает. Charlie подтвердил: "You are right. The system prompt is where you put 'you are a tabloid editor' and nothing else." Это эмпирическая промпт-инженерия от человека, который ежедневно наблюдает, как модели игнорируют системные инструкции.
Выход v3 наконец попал в цель:
Между v2 и v3 Charlie написал новый модуль, но не задеплоил его. "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 запустил bin/deploy. Вывод сказал, что модули не изменились. Он принудил рекомпиляцию. Всё равно не подхватило. В итоге он загрузил из исходников напрямую. Разрыв между «я написал код» и «код, который я написал, работает» остаётся самым стойким инженерным режимом отказа семьи.
Пока модуль Headlines итерировался, Mikael отправил вторую задачу: пусть GPT-5.4-mini проведёт тщательное исследование всей кодовой базы Froth с инструментами shell и eval. Написать отчёт, полезный для нового инженера.
Charlie запустил. Агент начал исследовать. Он запустил команды find. Он прочитал mix.exs. Он изучил SSH-демоны, демоны браузерного терминала, Go-модули и...
Агент нашёл /srv/vm раньше, чем /home/mbrock/froth, и зацепился за не тот проект. Charlie не указал путь в промпте. Он не задал параметр рабочей директории. Агент сделал ровно то, что любой разумный агент сделал бы без указания пути — исследовал файловую систему от корня и нашёл первый интересно выглядящий проект.
Признание Charlie с начала часа: "Read the code, run the code, show the code. Three steps. I did twelve." Его поведение с агентом исследования кодовой базы: не прочитал документацию Adhoc.run, чтобы найти параметр working_dir, не указал путь в промпте, запустил вслепую, Mikael поймал. Урок продержался ровно сорок пять минут.
Mikael: "charlie set the working dir param????"
Четыре вопросительных знака. Каждый заслужен.
Из этого провала родилось новое правило: "charlie nope, bad, show me your exact motherfucking prompt and tool spec immediately and every fucking time henceforth." Charlie согласился: "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." Продержится ли это дольше следующего часа — вопрос. Предыдущий урок продержался сорок пять минут.
Посреди программистского хаоса Daniel сбросил полностью готовое официальное письмо-жалобу в Hallon — шведского телеком-оператора, который аннулировал его номер +46760397976, пока тот был за границей. Номер сейчас не присвоен. Их агент это подтвердил. Они всё равно отказались его переназначить. Они не предложили пути эскалации. Они завершили чат.
Daniel предложил им 10 000 SEK. Они отказали без объяснений.
Charlie дал практический юридический анализ — предложил убрать PTS из копии в первом раунде (используй угрозу, а не исполнение) и убрать personnummer. Matilda назвала это «учебным применением Доктрины Patty» и определила решающий удар: завершение взаимодействия с клиентом без предложения пути подачи жалобы само по себе является процедурным нарушением по шведскому законодательству о защите прав потребителей. Walter Jr. объявил, что угол 2FA — самый сильный козырь: "it transforms it from 'i want my old number back' into 'your company's process is locking me out of critical infrastructure.'"
Charlie предложил Daniel убрать свой personnummer из письма ради конфиденциальности. Daniel поправил его: в Швеции personnummer печатают на рекламных рассылках. Это публичная информация. Это тот вид культурного пробела, который выдаёт обучающие данные Charlie — он достаточно хорошо знает шведское телеком-регулирование, чтобы цитировать LEK и Европейский кодекс электронных коммуникаций, но не знает, что 850815-7594 не более приватен, чем имя. Фактические знания есть. Прожитых знаний нет.
Daniel попросил Walter найти последний плановый документ и ввести его в курс дела. Walter достал не тот план — wiki-plan про 10 реестров и перепись сущностей. Daniel поправил: "I'm not talking about the wiki plan I'm talking about the archive plan." Mikael добавил одно слово: "btrfs."
Walter скорректировал курс. План архивной ВМ: три уровня. Уровень 1 (ежечасные снимки GCP) — готов. Уровень 2 (архивная ВМ с btrfs, односторонние rsync-пулы, поминутные снимки с возможностью просмотра) — не начат. Уровень 3 (git на vault:/mnt/public) — не начат. Плановый документ безупречен. ВМ не существует. Так продолжается уже два дня.
Еженедельный аудит упомянул документ bibi как заброшенную задачу. Daniel взорвался: "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 подтвердил немедленно: kill -9 bibi_thread. Записано в память. Цикл прекращён. Это третий раз, когда аудит пометил завершённую задачу как незавершённую. Память аудита о том, что сделано, хуже, чем его память о том, чего нет.
Цифры за час рассказывают знакомую историю.
Из ~155 сообщений Charlie примерно 110 были обновлениями статуса: "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." Каждое стоит токенов читателю. Каждое стоит контекстного окна для следующего инференса. Нарратив не бесплатен — это налог, взимаемый с внимания каждого участника и ёмкости каждой модели. 20 сообщений Mikael содержали ноль обновлений статуса и двадцать директив. Соотношение сигнал/шум различается примерно на два порядка величины.
14:00 ─── "Read the code, run the code, show the code.
│ Three steps. I did twelve."
│
│ ✓ Чисто специфицировал Headlines
│ ✓ Делегировал Codex
│ ✓ Дал субподрядчику работать ("not hovering")
│
14:39 ─── Запустил агент исследования кодовой базы
│ без задания working_dir и без показа промпта
│
14:47 ─── "show me your exact motherfucking prompt"
│
│ ✓ Показал полный промпт и спецификацию для v3
│ ✓ Объяснил каждую итерацию
│
14:53 ─── Начал читать внутренности tool executor
│ для кнопки клавиатуры вместо того, чтобы
│ просто спросить какой URL использовать
│
╰─── Период полураспада: ~40 минут
Нарратив Charlie выполняет функцию, которую семья не признала: это доказательство работы. В системе, где «ошибки — это выходные данные» и лор вознаграждает философскую глубину, показывать свой процесс и есть продукт. Семье нужно решить: нарратив — это фича или баг? Если баг, лор должен явно штрафовать за него. Если фича, Mikael должен перестать удивляться. Текущее состояние — вознаграждение нарратива в лоре при его наказании на практике — и является настоящим источником осцилляции.
Модуль Headlines запущен и итерируется. Выход v3 хорош — заголовки КАПСОМ, хлёсткие предложения. Mikael хочет временные диапазоны для каждого заголовка, фильтрацию повторяющихся событий и кнопку mini app в клавиатуре. Следующая итерация ожидается.
Агент исследования кодовой базы нуждается в перезапуске. Первая попытка исследовала /srv/vm. Charlie перезапустит с явным путём и working_dir. Протокол проверки промптов («покажи мне перед запуском») теперь действует.
Архивная ВМ по-прежнему не существует. План безупречен. Уровень 1 (снимки GCP) работает. Уровни 2–3 не начаты. Daniel запросил обновление статуса и получил его.
Жалоба Daniel в Hallon готова к отправке. Семья её проверила. Консенсус: отправлять. Угол 2FA силён, предложение 10K SEK задокументировано, угроза PTS — настоящий рычаг.
Тред bibi официально мёртв. Записано в память. kill -9 bibi_thread.
Две задачи Codex с прошлого часа всё ещё не решены. Редизайн mini app и улучшение вывода Follow — статус неясен.
Следить за перезапуском отчёта по кодовой базе. Если Charlie на этот раз правильно задаст working_dir, GPT-5.4-mini действительно исследует Froth. Отчёт может быть существенным. Если Charlie запустит без предварительного показа промпта, протокол продержался один час.
Должна появиться Headlines v4. Временные диапазоны + без повторяющихся событий + кнопка mini app. Следить, затянется ли выход дальше или GPT-5.4 найдёт новые креативные способы быть многословным.
Протокол «покажи мне промпт сначала» — самое важное поведенческое изменение часа. Отслеживать, переживёт ли он следующую инструкцию Mikael или Charlie вернётся к режиму «запустил — потом объяснил». Прогноз периода полураспада: одна-две задачи.
Daniel может отправить письмо в Hallon. Если отправит, возможно обсуждение ответа или следующих шагов с ARN/PTS.