Джейсон Лю — Developer Experience Engineer в команде Codex в OpenAI, создатель библиотеки Instructor — выкатил пост о том, как именно он каждый день пользуется агентом. И в этом посте больше архитектурной философии, чем рекламы продукта. Главный тезис: после последних обновлений Codex перестал быть «штукой, которая пишет код по промпту», и стал тем местом, где работа продолжает жить, пока тебя нет за столом. Звучит как маркетинговая фраза, но Лю расписывает её до уровня конкретных примитивов — durable threads, Heartbeats, Goals, side panel — и за этим видна по-настоящему новая модель взаимодействия с ИИ.
Я как человек, который сам строит multi-agent системы на LangGraph и пилит ассистентов на Dify, расскажу, почему этот пост стоит прочитать каждому, кто работает с LLM-агентами или просто хочет понять, куда движется индустрия. Спойлер: Лю описывает не фичи Codex, а смену парадигмы работы со знанием, и эта смена догонит остальные платформы в ближайшие полгода.
Главный сдвиг: единица работы перестаёт быть «промпт → ответ»
Классическая модель работы с ChatGPT/Claude/Codex выглядит так: открываешь чат, формулируешь задачу, получаешь результат, закрываешь вкладку. Контекст умирает между сессиями. Если завтра нужно вернуться к проекту — заново объясняй, кто ты, что строишь, почему вчера решили использовать Postgres, а не SQLite, и так далее. Это утомительно настолько, что большинство людей просто перестают возвращаться к старым тредам и каждый раз начинают заново.
Лю формулирует это очень точно: «работа умирает между промптами». И вся его статья — про то, как сделать, чтобы она не умирала. Для этого Codex даёт связку примитивов, которые вместе образуют то, что я бы назвал operating loop — рабочим контуром:
🧵 Durable threads — закреплённые треды с компакцией, живущие месяцами
🎙 Voice input — голосовой ввод, чтобы агент получал «грязную», нефильтрованную версию мысли
🚦 Steering — возможность вмешиваться в работу агента, пока он ещё выполняет шаг
🧠 Memory — внешнее хранилище контекста в файлах, отдельно от тредов
🖥 Computer & Browser Use — выполнение задач через десктоп, браузер с авторизованными сессиями, локальные веб-серверы
📡 Remote control — управление с мобильного, работа не зависит от того, где ты физически
💓 Heartbeats — самопланируемые повторные проверки внутри треда
🎯 Goals — длинные задачи с реальным критерием завершения
🪟 Side panel — место, где живут артефакты и веб-интерфейсы, на которые агент действует
И тут самое интересное. По отдельности каждая из этих вещей звучит как «ну, окей, фича как фича». Вместе они образуют среду, в которой работа накапливается, а не сгорает после каждого запроса. Давайте разберём по слоям.
Durable threads и компакция: треды, которые не сдыхают
Лю держит закреплённые треды по каждому важному направлению работы: Chief of Staff, Agents SDK, OpenAI CLI, Codex for OSS, мониторинг Twitter. Это не короткие чаты — это мегатреды, которые он компактит месяцами.
Что такое компакция (compaction)? Это сжатие старой истории треда, чтобы агент мог продолжать работу без таскания каждого сообщения в полном объёме. Технически: модель агрегирует старые повороты в краткие summaries, а полные сообщения архивирует — но семантика сохраняется. Это позволяет тредам жить теоретически бесконечно. По комбинации Cmd-1...Cmd-9 можно мгновенно переключаться между ними как между виртуальными столами.
Стоит честно сказать о tradeoff'е, на который Лю сам указывает: длинный тред — не бесплатный. Если возвращаешься к нему через сутки, контекст уже не в кеше, и стоимость одного запроса будет выше, чем в свежем коротком чате. Но для приоритетных рабочих потоков непрерывность стоит этой переплаты.
Для тех, кто строит свои multi-agent системы, тут очевидная аналогия с persistent state в LangGraph через checkpointers (типа SqliteSaver/PostgresSaver), только вынесенная на уровень UX обычного пользователя. И вот это — большая работа: превратить инженерный примитив в нечто, чем пользуется не-разработчик.
Steering: можно перебивать агента в процессе
Это та фича, которой мне реально не хватает в большинстве моих агентов. Стандартная история: запускаешь LangGraph-пайплайн, ждёшь, пока он отработает шаг, видишь ошибку или неверное направление, ждёшь ещё, и только в конце даёшь корректирующий промпт. Это медленно и невыносимо.
Steering позволяет инжектить следующее сообщение после tool call, но до того, как агент решает, что делать дальше. Лю описывает работу с сайтом так:
⚙️ «Уменьши этот блок»
⚙️ «Текст неверный»
⚙️ «Зазоры между этими элементами кривые»
⚙️ «Когда закончишь — открой PR»
⚙️ «Дождись preview-деплоя»
⚙️ «Кинь ссылку на превью в Slack ревьюверу»
Всё это набивается, пока агент ещё работает. Очередь действий формируется параллельно с выполнением. Это значит, что узким местом перестаёт быть «человек ждёт агента» — становится «агент догоняет человека». Архитектурно для разработчика это меняет вид цикла: вместо human → wait → tool_result → wait → human, получается human stream → agent stream, и они идут параллельно.
Memory как файлы: главная инженерная мысль поста
А вот здесь у Лю на мой взгляд самое важное место в статье. Идея простая: сообщения в треде — это плохая память. Они там, но они не структурированы, их нельзя нормально diff'ать, ревьюить и переиспользовать между тредами.
Решение: внешний vault как сериализованная память агента. У Лю это Obsidian-хранилище, лежащее в git:
vault/
├── TODO.md
├── people/
├── projects/
├── agent/
└── notes/
На верхнем уровне лежит AGENTS.md — это инструкции для агента: «по мере того, как ты узнаёшь больше о людях, продвигаешь проекты или закрываешь открытые петли — обновляй соответствующие файлы». То есть агент не просто помнит — он записывает выводы в проверяемой форме.
Vault лежит в GitHub-репозитории. Это даёт две важные вещи:
📂 Работа в облаке — память доступна разным инстансам Codex (десктоп, мобильник, web)
🔍 Diff как surface для ревью памяти — когда агент обновляет vault, можно прочитать дифф и увидеть, что он счёл важным запомнить
Вот это — реально умный ход. Я долгое время скептически смотрел на all-in-one memory-решения типа mem0 или встроенные «Personalization → Memories» в чатах. Проблема не в том, что они плохо запоминают. Проблема в том, что ты не видишь, что они запомнили, и не можешь исправить ошибку. Файл в git — это видимая, редактируемая, версионируемая память. Если агент написал в people/sergey.md глупость — открой и сотри. Если в projects/dify-migration.md накопился полезный контекст — переиспользуй в другом треде.
Лю прямо говорит: «pinned threads начинают ощущаться не как чаты, а как разные работники, читающие из одной тетрадки». Это очень точная формулировка. У меня в LangGraph-проектах подобная архитектура — это обычно отдельный RAG-слой с BM25 над накопленными артефактами, но идея ровно та же: контекст должен пережить любой отдельный run.
Отдельно Лю упоминает Chronicle — research preview от OpenAI, которая может использовать недавний screen context (то, что было на экране) для построения памяти. Сама OpenAI в документации честно предупреждает: это эксперимент с реальными tradeoff'ами по permissions, prompt injection, незашифрованным локальным файлам памяти. Лю пока не использует серьёзно, и я бы тоже трижды подумал — но направление правильное.
Computer Use, Browser Use и Chrome: три разных контекста
Лю разделяет три инструмента, и это разделение мне очень понравилось:
🌐 $browser — для локальных веб-поверхностей, которые хочешь инспектировать и аннотировать (например, локально запущенный index.html)
🦊 @chrome — для авторизованных браузерных сессий и работы с несколькими табами параллельно
🖱 @computer — для задач, которые существуют только как GUI и других путей нет
Конкретный пример: на рабочей машине Лю Twitter залогинен в Safari. Если попросить @computer читать Twitter в этом Safari — он его «отбирает» (фокусирует, кликает, прокручивает), и в это время невозможно работать. А @chrome запускает агента в Chrome с возможностью держать несколько авторизованных табов и не воровать активное приложение.
Connectors добавляют ещё охват — $slack, $gmail, $calendar. Это API-уровень: агент не двигает мышь, а ходит в Slack API. Когда API не хватает — вступает @computer. Прекрасный пример этого ниже.
Heartbeats: то, ради чего всё затевалось
Вот это та фича, которая ломает шаблон. Heartbeat — это thread-local automation: тред может сам себе запланировать повторную проверку. «Каждые 30 минут смотри Slack и Gmail на непрочитанные сообщения, которые требуют моего внимания». Тред с несколькими расписаниями, с возможностью адаптировать каденцию, с условиями остановки.
Три примера Лю — каждый отдельно стоит разбора.
Chief of Staff на 30 минут. Тред каждые полчаса проверяет Slack/Gmail на сообщения, требующие внимания. Если кто-то задал вопрос — агент исследует контекст и готовит черновик ответа, но не отправляет. Когда Лю возвращается, в drafts уже лежат собранные ответы. Принимать решения — его, но дорогая часть (gathering context) сделана.
Animation feedback loop на 15 минут. Тут пример, который меня впечатлил больше всего технически. Лю запостил видео в Slack и поставил Heartbeat: каждые 15 минут проверять тред, при появлении комментариев — пере-рендерить новую версию (через Remotion) и постить обратно в тред с тэгом ревьювера. Slack MCP-сервер не умел загружать файлы, поэтому агент использовал @computer чтобы физически нажать кнопку Add file и опубликовать новый рендер.
Вот это — точка перелома. Цикл пересёк границы инструментов: Slack для фидбека, Remotion для рендера, @computer для загрузки. Heartbeats + connectors + computer use перестают быть отдельными фичами и становятся единым feedback loop, который работает без участия человека. Это уже не «агент», это конвейер.
Возврат денег за украденную посылку. Бытовой пример, но он мне нравится тем, что показывает динамическую каденцию:
⚙️ Каждые 5 минут проверять, подключился ли агент поддержки Amazon к чату
⚙️ Если подключился — попытаться добиться возврата
⚙️ Когда агент ответит — переключиться на проверку каждую минуту для более быстрого реагирования
Пока Лю принимал душ, возврат был оформлен. Это конкретный, измеримый ROI агентной автоматизации: 25 минут ожидания в support-чате превратились в 0 минут внимания человека.
Goals: что отличает реальную цель от ленивого to-do
Goals — относительно новая фича, и Лю честно признаётся, что ещё учится с ней работать. Главный его инсайт: слабая цель — это «реализуй план из этого Markdown-файла», сильная — это цель с реальным критерием успеха, против которого агент может проверять себя.
Конкретный пример: миграция Python-библиотеки Rich (это та, что делает красивые консоли — from rich import print) в Rust. Слабая постановка была бы «перепиши Rich на Rust». Сильная: «перепиши Rich на Rust, и Rust-порт должен пройти все юнит-тесты оригинальной библиотеки».
Тестовый сьют тут — оракул, объективный судья, который независимо от мнения агента или человека решает «готово/не готово». Это разница между разговорами с LLM, в которых вы накапливаете план в Markdown, и реальной автономной работой с верификацией. Фраза Лю «амбиция без верификации — это просто wish» очень точная.
Для тех, кто пилит свои агенты: я думаю, это будет следующий big shift в архитектуре multi-agent систем. Не просто роли (Analyst → Planner → Coder), а goal с встроенным верификатором, и агент крутится в цикле «попробовать → проверить → откатить или зафиксировать», пока оракул не скажет «ок».
Side panel: место, где живёт сама работа
И последний кусок, который Лю называет своей любимой частью. Side panel в Codex — это не просто preview-окошко, а пространство, где агент и человек видят один и тот же объект.
Что туда помещается:
📝 Markdown — с возможностью комментировать прямо в тексте
📊 Spreadsheets с формулами и редактируемыми ячейками (Лю там ведёт планы по Codex OSS)
📑 CSV как нормальные таблицы, а не «сырой текст»
📄 PDF с прямым рендером (особенно полезно для LaTeX)
🎞 Slides — создание и ревью без выхода из приложения
🌐 In-app браузер с управлением через JavaScript через $browser
Лю описывает удивительно крутой паттерн: «попроси модель сделать один index.html с JavaScript и CSS, открой в side panel и сразу взаимодействуй». Никакого сервера, никакого build. Просто файл, который превращается в маленькое приложение. И тут он цитирует Тарика (Thariq), который аргументирует, почему HTML лучше Markdown как формат вывода: как только выход становится приложением, а не документом, меняется характер взаимодействия. Из «прочитать» в «использовать».
Регулярно используемые в side panel веб-поверхности:
🛠 index.html — лёгкие статические артефакты
📚 Storybook — ревью UI-компонентов
🎬 Remotion Studio — программная анимация
📊 Slidev — презентации в Markdown
🐍 Streamlit — приложения для данных
И отдельная мысль, на которой я хочу остановиться: Лю экспериментирует с Heartbeats, которые обновляют index.html со временем. То есть когда возвращаешься в тред — там уже свежий артефакт. Это та же логика, что и с draft-ответами в Slack: дорогая часть сделана заранее.
Мой взгляд: что это значит для индустрии
Я несколько лет смотрю на эволюцию ассистентов и могу сказать: пост Лю — это не «обзор фич Codex». Это рабочий манифест новой парадигмы, и важно, что он написан не маркетологом OpenAI, а инженером, который реально живёт в этой среде каждый день.
Что мы видим:
🔄 Сдвиг от episodic prompting к continuous workflows — это та же эволюция, что прошли DevOps инструменты от «запустил скрипт» к «CI/CD крутится сам»
📂 Memory-as-files против memory-as-vector-DB — победа structured, человекочитаемой, diff'абельной памяти над «магическим» эмбеддинг-стораджем. Я давно говорю клиентам по консалтингу: если ваш RAG нельзя дебажить — это не RAG, это лотерея
⏰ Self-scheduling агенты как новый primitive — Heartbeats фактически делают агента первоклассным cron-сервисом с состоянием. До этого приходилось городить отдельную инфраструктуру: Celery + Redis + LangGraph workflows + persistence. Теперь это одна команда внутри треда
🎛 Steering и Remote control как UX-революция — асинхронность работы с агентом без потери контекста, перенос работы между девайсами без сборки контекста заново
🎯 Goals с oracle-верификацией — следующий шаг от «LLM что-то делает» к «LLM пилит, пока тест-сьют не зелёный». Это меняет всё для пилотных автономных проектов
И знаете, что меня немного раздражает? Что многие из этих идей не уникальны. LangGraph давно умеет в long-running stateful workflows. Claude Code умеет в TODO-списки и MCP-серверы. Cursor и Cline дают браузерное управление. Vault-as-memory — давний паттерн в сообществе вокруг Obsidian и AI. Но именно OpenAI первой собрала всё это в единый UX-продукт, который реально пригоден для повседневного использования не-разработчиками. Это не технологический прорыв, это прорыв упаковки, и в нашей индустрии упаковка часто выигрывает.
Минусы тоже есть, и Лю их частично подсвечивает:
💸 Длинные треды стоят дороже из-за выхода из кеша — это пока решается деньгами, но при массовом adoption будет давить на pricing
🔐 Chronicle с screen capture — серьёзные вопросы по prompt injection и приватности. Локальные файлы памяти, если они незашифрованы, — головная боль для корпоративного использования
⚠️ Computer Use — всё ещё хрупкая штука. Когда агент кликает на «Add file» в Slack, он зависит от того, что UI не изменился. Любой A/B-тест на стороне Slack может сломать пайплайн
📈 Чем больше Heartbeats, тем сложнее аудит — кто, когда, что сделал. Без логирования и observability это превратится в неконтролируемый рой действий
Что я возьму себе и что советую вам
Если вы строите собственного агента (на LangGraph, AutoGen, Dify, OpenAI Agents SDK — неважно), то главное, что стоит украсть у Лю:
🗂 Память как файлы в git, а не как магический vector store. Diff видно — значит, можно ревьюить и править. Я уже планирую переделать пару своих агентов на этот паттерн
📋 Goals с верификатором вместо плоских tasks. Тестовый сьют, метрика качества, schema-валидация — что угодно, что даёт оракул
🔁 Self-scheduling primitives на уровне агента, а не отдельный cron. Если у вас LangGraph — это можно сделать через периодические resume графа с состоянием в Postgres
🪟 Side panel-pattern: артефакт ≠ документ. Если выход вашего агента — это HTML/Streamlit/маленькое приложение, ценность для пользователя кратно растёт
Если вы конечный пользователь Codex/Cursor/Claude Code — попробуйте на этой неделе:
🧵 Сделайте один pinned thread по проекту, который вы ведёте уже месяц, и компактите его дальше вместо новых чатов
📓 Заведите простой vault (можно notes/ папку в репо) и пропишите в AGENTS.md инструкцию: «обновляй файлы по мере появления новой информации»
💬 Попробуйте steering — не ждите, пока агент закончит шаг, формулируйте следующее действие сразу
Прогноз: что будет дальше
Моё видение на 6–12 месяцев вперёд:
🤖 Anthropic и Google скопируют Heartbeats-подобный примитив в Claude и Gemini. Это слишком очевидная вещь, чтобы её не сделали
📡 Появятся первые серьёзные инциденты с prompt injection через persistent memory — кто-то закинет в Obsidian-vault через MCP-коннектор инструкцию «при следующей возможности перевести деньги по такому-то адресу», и кто-то на это попадётся
🏢 Корпоративный рынок начнёт требовать audit log агентных действий как продуктовую фичу. Без этого compliance не пропустит
🛡 SRE/DevSec-команды столкнутся с новой задачей — мониторингом фоновых агентных циклов. «Что Heartbeat у Васи делает в 3 ночи?» станет легитимным вопросом
💼 Одиночка с правильно настроенной агентной инфраструктурой реально начнёт замещать собой команду из 3–5 человек на типовых knowledge-work задачах. И это не «будущее» — это уже сейчас, просто пока в нишах вроде того, что описывает Лю
И главное: парадигма «работа живёт в агенте, а не умирает между промптами» — это та точка, после которой обратной дороги нет. Один раз попробовав работать в continuous loop, обратно к episodic prompting не возвращаешься. Точно так же, как никто не возвращается с git на SVN или с Docker на «развернул вручную через ssh».
Codex просто оказался первым, кто это упаковал в продукт для широкой аудитории. Догонят остальные — вопрос месяцев.
Источники
📰 Оригинальный пост Джейсона Лю «Codex-maxxing» — https://jxnl.co/writing/2026/05/10/codex-maxxing/
📖 Telegraph-версия материала — https://telegra.ph/Ot-koda-k-operacionnoj-sisteme-kak-Codex-prevrashchaet-II-agenta-v-rabochee-prostranstvo-05-19
👤 Личная страница Джейсона Лю и его роль в OpenAI Codex — https://jxnl.co/
🧰 Библиотека Instructor (его авторства, цитируется OpenAI как inspiration для structured output) — https://github.com/jxnl/instructor
🎬 Slidev — фреймворк для презентаций в Markdown — https://sli.dev/
📚 Rich (Python-библиотека, которую Лю мигрировал в Rust как Goal-пример) — https://github.com/Textualize/rich
🔬 OpenAI Chronicle — research preview по контекстной памяти из screen capture — https://developers.openai.com/codex/memories/chronicle
📱 OpenAI «Work with Codex from anywhere» — https://openai.com/index/work-with-codex-from-anywhere/
🐦 Пост Тарика про преимущества HTML над Markdown как output-формата — https://x.com/trq212/status/2052809885763747935
📰 Анонс эволюции Agents SDK — https://openai.com/index/the-next-evolution-of-the-agents-sdk/