Несколько месяцев назад я писал о [моем агентном стеке](/posts/what-my-agentic-stack-actually-does): частном монорепозитории, где агенты ИИ обрабатывают мою электронную почту, платежи и развертывания, используя [Neotoma](https://neotoma.io) в качестве структурированной памяти под ним. Этот пост закончился обещанием. Я сказал, что являюсь стратегом и что архитектура спроектирована таким образом, чтобы эту роль можно было заменить программным обеспечением. Это пост о том, как это сделать.

[Ateles](https://github.com/markmhendrickson/ateles) — мой второй продукт после Neotoma, созданный непосредственно на его основе. Это рой личных агентов. Если в старом стеке был один агент на сеанс, и я был в цикле для каждой задачи, то Ateles представляет собой постоянный парк агентов, определенных ролями, координируемых через Neotoma и ежедневно работающих под launchd. В этом разница между тем, как я управляю каждым агентом, и тем, что я руководю командой, которая уже знает свою работу.

В этом посте объясняется, почему я его создал, как он работает и куда движется.

## Почему стек перестал масштабироваться

Триггером была громкость. После [выпуска для разработчиков](/posts/neotoma-developer-release) Neotoma в конце февраля мое внимание разделилось на три режима, между которыми мало общего: создание продукта, его маркетинг и управление отношениями с первыми пользователями. Я также сообщал Неотоме все больше и больше контекста о моей жизни, как в профессиональном, так и в личном плане, и чем лучше становилась эта память, тем больше любой отдельный агент мог с ней сделать. Это не устранило ограничение, а сдвинуло его. Предел больше не был тем, что знали агенты. Это был я, единственный, кто воплощал в жизнь то, что они знали, по одному сеансу за раз.

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

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

Еще две вещи подтолкнули нас в том же направлении. По умолчанию я перенес операции с продуктом на GitHub, используя задачи и запросы на включение вместо фиксации непосредственно в основной части. Частично это было вызвано [построенным мною конвейером проблем](/posts/agent-to-agent-issue-solve-with-humans-at-the-edges), который начал направлять реальные отчеты от пользователей и их агентов в Neotoma и обратно на GitHub. И я хотел, чтобы мой процесс разработки был понятен публично, чтобы люди, использующие Neotoma, могли точно видеть, какая работа ведется. И тем, и другим нужна последовательность специализированных агентов, занимающихся дизайном, управлением продуктами, контролем качества и выпуском. Один агент, делающий все это, противоречит сути.

Итак, Ателес — это решение создать флот и определить этот флот в самой Неотоме.

## Неотома как ткань, а не только память

Отличительной чертой Ателеса является то, что Неотома владеет двумя вещами одновременно. Он содержит оперативный контекст, необходимый рою, те же факты, которые читал и записывал мой старый стек. И оно удерживает сам рой.

Агенты — это сущности Неотомы. Каждый из них представляет собой «agent_definition» с приглашением, списком разрешений инструментов и набором разрешений возможностей. Обновление поведения агента — это вызов метода «correct()» для этого объекта с полной историей версий и указанием автора. Ни фиксации, ни повторного развертывания. Файлы SKILL.md на диске являются зеркалами этих объектов, а не источником.

Их отношения тоже являются сущностями Неотомы. Рой имеет иерархию, выраженную в виде дерева, поэтому координатор знает, каких агентов он отправляет, а задача знает, какому агенту он принадлежит. А сама работа — это сущности Neotoma: задачи, планы, определения рабочих процессов, записи участия. Агент берет задачу, выполняет ее и записывает результат обратно в виде наблюдения, приписываемого его личности.

В результате получается один мировой график для всего. Факты, на которые воздействует рой, определение роя, который на них действует, и запись того, что он сделал, — все это хранится в одном и том же хранилище, доступном только для добавления. Это дает всему этому три свойства, которые меня волнуют. Это прозрачно, потому что каждое действие — это приписываемое наблюдение, которое вы можете прочитать. Его можно проверить, поскольку вы можете воспроизвести действия любого агента в любом окне. И это обратимо, потому что ничто не перезаписывает истину на месте. Если агент делает неправильный вызов, я могу отследить событие, которое его вызвало, вернуть состояние и исправить правило, которое привело к этому, один раз.

Идентичность – это та часть, которая делает атрибуцию реальной, а не желаемой. Каждый агент имеет пару ключей [AAuth](/posts/know-what-of-your-agents-wrote-what) и подписывает каждый вызов инструмента. Система проверяет подпись перед тем, как действовать, и записывает, кто утверждал, что действовал совместно с теми, кто действительно действовал на GitHub. Агент по написанию кода больше не действует как я. Он действует сам по себе, и об этом говорит журнал.

## Агенты по ролям

Рой организован ярусами. T1 — это хост: процесс, который владеет каналом и порождает агентов, в настоящее время OpenClaw для тех, с которыми я общаюсь, и launchd для фоновых. Это инфраструктура, а не агент с определенной ролью. Сами агенты работают на трех уровнях. Агенты Т2 всегда на связи и сохраняют личность: я говорю с самим Ателесом, и это единственный агент, который отправляет мне пейджинг. Демоны T3 — это управляемые событиями фоновые процессы без личности, каждый из которых подписан на события Neotoma или внешний веб-перехватчик. Агенты T4 не имеют состояния, создаются для каждой задачи, со стабильной идентификацией и памятью, которые они получают, запрашивая Neotoma.

Некоторые из ролей, которые работают сегодня:

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

**Финансы.** Демон регулярных платежей запускает переводы Wise и Bitcoin, инициируемые календарными событиями и сроками выполнения задач, при этом каждый получатель и сумма загружаются из объектов платежного профиля, а не из кода. Добавление нового регулярного платежа — это новая сущность, а не фиксация. Роль финансового консультанта и роль специалиста по налогам и отчетности определены для составления бюджета и сверки.

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

**Стратегия.** Эту роль я описал как свою в последнем посте, и именно ее я передаю наиболее сознательно. Эта передача является конкретной версией аргумента, который я привел в [Человеческая инверсия](/posts/series/the-human-inversion): по мере того, как агенты поглощают середину исполнения, человеческие рычаги перемещаются к концам, появляются более четкие стандарты и выходят более четкие суждения. Автономность калибруется по плану, а не глобально. Объект политики выполнения объявляет для данного плана, что агенту разрешено делать самостоятельно, какую планку качества он должен преодолеть и где он должен остановиться и уточнить у меня, прежде чем продолжить. Цепочка эскалации проходит от действующего агента к эксперту в предметной области, к хранителю конституции и ко мне, и каждое решение записывается обратно как сущность, поэтому следующий экземпляр наследует решение.

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

## Спайн задачи

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

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

Это основа, вокруг которой я строю весь остальной опыт.

## Куда это идет

Интерфейс, который я хочу, прост в описании. Я даю рою информацию через любой ближайший транспорт, и рой поглощает ее и действует. Подсказка в терминале. Электронная почта. Сообщение в Телеграмме. Аудиозапись, записанная на прогулке, с которой начались заметки к этому посту. Все это должно попасть в один и тот же график, и рой должен активно выполнять работу, которую он подразумевает, без моего участия в этом какого-либо агента.

Два свойства делают это возможным. Рой должен быть саморазвивающимся. По мере того, как он приобретает новый контекст и новые виды работы, он должен предоставлять необходимые возможности и развивать необходимые навыки, адаптируясь к моим исправлениям, а не дожидаясь, пока я переконфигурирую его вручную. И мой вклад, который по-прежнему необходим в моменты, когда действительно требуется суждение, никогда не должен повторяться дважды. Я исправляю способ действий один раз, он становится сущностью, и исправление сохраняется.

Ближайшая дорожная карта близка к достижению. Ateles был создан для моего собственного использования, поэтому значительная его часть по-прежнему предполагает одного оператора, меня. Я [движу его к тому, чтобы его можно было установить и использовать для нескольких операторов](https://github.com/markmhendrickson/ateles/blob/main/docs/multi_tenant.md): рой, который кто-то другой может разветвить, указать на свою собственную Neotoma, предоставить свои собственные объекты контекста и запустить. Поскольку политика агентов не зависит от оператора и в коде не заложено ничего, специфичного для оператора, случай разветвления в основном является вопросом контекста, а не переписывания. По-настоящему новая работа заключается в поддержке более чем одного человека внутри одного арендатора, поэтому граница арендатора проектируется сейчас, а не модернизируется позже.

Неотома создала агентов, которые помнят, а Ателес — это то, что эта память сделала возможным: рой, который может действовать без меня на каждом этапе. Оба поднимаются вместе. Улучшение памяти — это не решенная проблема, от которой я отказался. Это субстрат, на котором стоит весь рой, и каждый выигрыш в том, что Неотома может удержать и разрешить, — это выигрыш в том, что может сделать рой. Память продолжает улучшаться, и рой продолжает улучшаться вместе с ней.