В период с 8 по 9 июня три человека, которые редко пишут одно и то же эссе, написали одно и то же эссе. [Адди Османи](https://x.com/addyosmani/status/2064127981161959567), директор по искусственному интеллекту в Google Cloud, опубликовала «Loop Engineering» — таксономию систем, которые подсказывают агентам кодирования, чтобы вам не приходилось этого делать. [Мэтт Ван Хорн](https://x.com/mvanhorn/status/2063865685558903149) опубликовал «WTF Is a Loop?», исследование Reddit, X, YouTube и Hacker News, в котором идея прослеживается из статьи ReAct 2022 года до циклов оркестровки, которые люди используют сегодня. А [Лэнс Мартин](https://x.com/RLanceMartin/status/2064397389189071163), член технического персонала Anthropic, опубликовал «Проектирование циклов с помощью Fable 5», два шаблона, позволяющих максимально эффективно использовать передовые модели путем создания циклов вместо прямых подсказок.

Все три сходятся в одном и том же: подсказки уступают место созданию циклов, которые подсказывают вам агентов. И все трое называют один и тот же компонент самым важным. Османи перечисляет пять строительных блоков, затем добавляет шестой и приводит ему самое сильное предложение в своей статье: «Государственный файл является основой всего». Ван Хорн утверждает, что нынешнее поколение циклов является действительно новым по одной структурной причине: «долговечность стала явной, с состоянием, поддерживаемым git, и восстановлением после сбоя». Мартин описывает память как «внешний цикл, охватывающий несколько сеансов».

В настоящее время диагноз является консенсусным. Прочное внешнее состояние является несущей частью автономных агентов. Что меня удивило, так это то, что произошло дальше. Все трое передали задание в текстовый файл.

## Что такое цикл, коротко

Определение Ван Хорна является самым ясным: цикл — это cron плюс орган, принимающий решения. Задание cron запускает фиксированный сценарий. Цикл запускает модель, которая смотрит на текущее состояние, решает, что делать, выполняет это, проверяет, сработало ли это, и решает, стоит ли продолжать работу. Сложите их, позвольте одному циклу управлять другими, и вы получите то, что имеет в виду Борис Черный, когда говорит, что его работа — писать циклы.

Модель внутри этого цикла забывает обо всем между запусками. Контекстные окна заканчиваются. Сеансы перезапускаются. Значит, что-то в системе надо не забыть. Это нечто — это то, что цикл читает, чтобы решить, что делать дальше, и записывает, чтобы записать, что произошло. Это позвоночник, и Османи прав, называя его так.

## Субстратный пунт

Вот полный список кандидатов на позвоночник во всех трех постах: файл уценки, линейная доска, файлы состояния, переданные в git, и смонтированная файловая система, используемая для всех сеансов. Османи предлагает первые два. Ван Хорн документирует третий, который «Газовый городок» Стива Йегге использует для координации двадцати-тридцати экземпляров Клода. Мартин использует четвертую функцию памяти управляемых агентов Claude.

Все это решает вопрос настойчивости. Байты выдерживают перезапуск. Ни один из них не решает проблемы целостности. Задайте любому из этих субстратов вопрос, на который на самом деле должен ответить цикл: какая из этих двух противоречивых заметок верна, кто ее написал, когда и было ли это когда-либо проверено? В прозаическом файле обе заметки хранятся рядом, а согласование остается за той моделью, которая прочитает файл следующей. Git сохраняет каждую историческую версию неоднозначности, не разрешая ее. Общее монтирование добавляет сверху победы последней записи.

Стойкость и целостность — разные свойства. Дискурс полностью впитал в себя первое и еще не заметил второго.

## Мы уже проводили этот эксперимент раньше

Приложения десятилетиями хранили свое состояние в плоских файлах. Три силы положили конец этой эпохе: одновременные авторы повредили файлы, накопившиеся противоречия не имели механизма разрешения, а ответы на вопросы означали анализ всего. Базы данных победили, потому что они сделали целостность свойством уровня хранения, а не дисциплиной, ожидаемой от каждой программы, работающей с данными.

Каждая из этих сил уже видна внутри трех постов.

Параллелизм наступает в тот момент, когда циклы контролируют циклы, и это именно та стадия, на которую, по словам Ван Хорна, мы вступаем. Два цикла записи одного файла состояния — это такая же ошибка, как два инженера, молча фиксирующие одни и те же строки. Рабочие деревья решают эту проблему для кода. Ничто в текущей цепочке инструментов не решает эту проблему для [общего состояния](/posts/when-agents-share-state-everything-breaks).

Противоречие зафиксировано в результатах тестов Мартина. При выполнении задачи непрерывного обучения Сонет 4.6 оставил после себя хранилище памяти, которое он описывает как список заметок об ошибках и открытых предположений, включая записи типа «может быть, prc вместо prc_usd?» Догадки накапливаются. Ничто не указывает на решимость. Следующий сеанс наследует кучу.

Запросы — это изюминка самого Ван Хорна. Он утверждает, что теперь самой дорогой частью агентного кодирования является управление циклами: условия остановки, отсутствие обнаружения прогресса и ограничения бюджета. Каждый из них требует сравнения текущего запуска с предыдущими. На прозаическом языке это означает перечитывание и повторный анализ растущего файла на каждом такте, что представляет собой налог на токены, который масштабируется с возрастом цикла.

## Чему меня научило управление стаей

Я запускаю на своей машине множество именных агентов: один для сбора информации о клиентах, один для контента, один для информационно-просветительской работы, другие для операций. На ранней стадии установки каждый хранил заметки в своих файлах. Эти файлы дрейфовали. Один и тот же человек фигурировал под тремя именами. Факт, исправленный в одном файле, остался неисправленным в двух других, и ни одна запись не указывала, какая версия была текущей или откуда она взялась.

Рой теперь использует [одно структурированное хранилище](/posts/from-memory-to-nervous-system), и это сообщение само по себе является квитанцией. Исследование, лежащее в основе этого, было проведено моим агентом по работе с клиентами, который извлек все три X-сообщения, сохранил каждую в виде напечатанной записи с номерами взаимодействия и происхождением, записал результаты конкурентной борьбы в структурированный анализ и передал последующие задачи двум другим агентам через общий магазин. Когда через час я задал уточняющий вопрос, сравнение было добавлено к той же записи анализа с собственным следом происхождения, а не разбросано по новому файлу. Ни один агент не извлек заново то, что уже установил другой.

## Зрелость памяти — это свойство субстрата

Самые точные данные в любом из трех постов — у Мартина. Он описывает пять стадий использования памяти: агент терпит неудачу, выясняет, почему, проверяет то, что нашел, формулирует ответ в правило и обращается к этому правилу в следующий раз. Агент, выполняющий все пять, превращает ошибки в проверенные правила многократного использования. Агент, который останавливается раньше, оставляет кучу догадок.

Его результаты, все в одной и той же смонтированной файловой системе: Sonnet 4.6 останавливается на первом этапе, записывая сбои, не исследуя их. Opus 4.7 достигает стадии проверки, но в среднем проверяет только около 17 процентов своих утверждений. Fable 5 завершает прогресс и подтверждает до 73 процентов.

Та же файловая система, но совершенно другое качество памяти. Разница полностью заключается в дисциплине модели, поскольку файловая система ничего не гарантирует: каждый этап — это поведение, которое модель должна выбрать. Структурированное хранилище превращает это поведение в операции с данными. Неудача – это сохраненное наблюдение. Следствие извлекает соответствующие записи. Проверка — это исправление с указанием происхождения. Дистилляция — это написание типизированного правила. Консультирование — это ограниченный запрос. Когда субстрат несет в себе прогрессию, любая модель может его завершить.

## Что требовать от уровня состояния цикла

С точки зрения инструмента, ядро цикла должно обеспечивать шесть вещей: типизированные записи вместо прозаических блоков, происхождение каждого поля, исправления, которые вычисляют текущую истину, а не накапливают версии, одновременную запись, которая не может конфликтовать, извлечение, которое возвращает только то, что нужно текущему тику, и доступ из любого интерфейса, а не из стека одного поставщика.

Честно говоря, для текстового файла: для одного цикла в одном репозитории [уценка действительно хороша](/posts/the-markdown-memory-ceiling). Он читаем, различим и бесплатен. Принудительная функция — это цикл номер два: в первый раз два процесса заботятся об одном и том же факте, и ни один из них не может доверять тому, что написал другой.

## Файлы помнят, системы записи знают

Ван Хорн заканчивает свою статью, утверждая, что петля — это сантехника, а долгосрочный актив — это библиотека навыков, которую она вызывает. Я думаю, наполовину прав. Навыки — это процедурная память, способы повторяющейся работы. Под ними находится фактическая память, то, что истинно в настоящий момент, от чего зависит каждое применение навыка. И то, и другое объединяется, но только если фактическому слою можно доверять после тысячи операций автоматической записи.

Я создал [Neotoma](https://github.com/markmhendrickson/neotoma), потому что мне нужен был этот слой для моего собственного роя: типизированные наблюдения для каждого поля, исправления, которые соответствуют текущей истине, и общий доступ для каждого агента, который я запускаю. Дискурс цикла только что провел неделю, описывая место, которое он заполняет, не называя ничего, что его заполняет.

Османи завершает свое эссе советом строить цикл так, как будто он собирается остаться инженером. Уровень состояния — это то место, где это намерение становится проверяемым. Файлы помнят. Система записи знает.