Skip to content
← Все главы

Глава 07

Автономия роя

Запуск множества агентов описывает ведущего агента и его линии. Эта глава описывает то, что поддерживает такую схему в работе, когда одна учётная запись достигает лимита или один агент пропадает. Линия проверяет, сколько запаса осталось у её учётной записи, и передаёт свою работу дальше до того, как он закончится. Ведущий агент передаёт лидерство или его заменяют, когда он пропадает. Рой спрашивает разработчика только о том, что действительно критично.

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

Всё здесь определяют шесть правил:

  1. Одна задача на продукт. coding-agents-kit (ak) знает учётные записи и запас, herdr-peers знает сообщения, панели и то, кто ведёт, а пакет Deep Work Plan знает метод: когда передавать работу, что нужно преемнику, что эскалировать. Каждый из них остаётся необязательным. Без них действуют те же правила, а сообщения пересылает и агентов перезапускает разработчик.
  2. Единица непрерывности — план, а не агент. Каждая передача работы и каждая смена ведущего — это обычное возобновление плюс небольшой пакет передачи с тем, чего нет в журнале: намерением, которое было в процессе выполнения.
  3. Упреждение лучше реакции. Агент проверяет свой запас на границах задач и передаёт работу, пока ещё может написать хороший пакет передачи. Реакция после достижения лимита остаётся страховкой.
  4. Автономия никогда не расширяет полномочия. Передачи работы, преемственность, запуски и планирование выполняются в рамках авторизации плана. Ни один агент не отвечает на экран разрешений, bypass, входа, согласия или оплаты, а работа перемещается только между учётными записями, которые объявил разработчик.
  5. Непрерывность никогда не снижает планку. Преемник наследует те же gates. Пакет передачи не закрывает ни одного критерия, не ослабляет ни одного gate и не пропускает ни одного ревью.
  6. Дёшево по конструкции. Запас читается из кеша на границах задач, никогда в цикле или по таймеру. Односторонние уведомления заменяют вопросы, которым не нужен ответ, а пакеты передачи небольшие.

Роли

Роль Кто это Чем владеет Никогда не делает
Ведущий агент Агент, который держит запись ведущего одного плана Планом, таблицей линий, планированием, порядком релизов, слияниями и тегами в рамках авторизации, порядком преемственности Не пишет в checkout линии и не ведёт план, который держит другой ведущий агент
Заместитель Первая доступная запись в порядке преемственности ведущего агента Ничем, пока не примет лидерство Не действует как ведущий, пока ведущий агент доступен
Линия Один агент на репозиторий, поток работы или задачу, в собственной панели на собственной учётной записи Своим дочерним планом или задачей, веткой, gate и пакетом передачи Не назначает работу другой линии, не сливает и не ставит теги
Ревьюер Линия другого поставщика, только для чтения Своими находками Не пишет в дерево, которое проверяет
  • Ведущий агент остаётся на связи. Оркестратор, чьи линии ждут, пока человек передаст сообщение, встаёт. Ведущий агент никогда не останавливает рой ради вопроса, который может решить сам.
  • Один исполнитель на план. Конкретный план или дочерний план в каждый момент выполняет ровно один агент. Второй агент на том же плане — это сбой координации, который должен устранить ведущий агент.
  • Полномочия исходят от плана, а не от peer-агента. Линия сама читает авторизацию плана. Одобрение, пересланное другим агентом, не добавляет ничего, чего у линии ещё не было.
  • Несколько ведущих агентов могут работать в одном рабочем пространстве, каждый ведёт свой план. Учётную запись в каждый момент держит одна линия через аренду ak, поэтому два ведущих агента никогда не посадят двух записывающих на одну учётную запись Codex.
  • Несколько экземпляров одного типа — три панели Grok, четыре панели Codex на одном или нескольких профилях — это обычные линии. Экземпляры на одном профиле делят запас этого профиля.

У каждой линии есть план, как минимум Lite-план в её собственном репозитории, и этот план — первое, что читает преемник. Каждая линия отчитывается ведущему агенту фиксированным словарём — plan ready, PR open <url>, blocked <class> <what it needs>, handoff <packet path>, done — и завершает каждое сообщение одной строкой о запасе, например capacity=ok 64% @work1, поэтому ведущему агенту редко приходится самому читать квоты.

Цикл проверки запаса

Агент проверяет собственный запас перед началом каждой задачи, после любого gate или шага, который длился дольше 20 минут, всякий раз, когда его CLI показывает предупреждение о лимите использования, и перед тем как принять передачу работы или лидерство. Проверка — это ak capacity --self --json из coding-agents-kit v1.0.1, которую помощник пакета превращает в решение:

Вердикт Решение Линия Ведущий агент, для себя
ok (выше нижнего порога) продолжить Продолжает Продолжает
low (25 % или меньше) подготовиться Заканчивает текущую задачу, не начинает ту, которую не сможет закончить, сообщает capacity=low Называет назначенного преемника и не запускает на себе долгую работу
critical (10 % или меньше либо при ограничении частоты запросов) передать работу Доходит до следующей безопасной точки, пишет пакет передачи, уведомляет ведущего агента, останавливается Передаёт лидерство немедленно
unknown (нет источника квоты) продолжить Сообщает capacity=unknown, передаёт работу при предупреждении CLI о лимите или на экране usage_limit Предпочитает для долгих задач линии с известным запасом
  • Пороги задаёт kit: по умолчанию нижний — 25 %, критический — 10 % свободной доли определяющего окна, настраиваются через AGENTKIT_CAPACITY_LOW и AGENTKIT_CAPACITY_CRITICAL. Показания берутся из кеша, который хранится 300 секунд, поэтому проверка на каждой границе задачи стоит несколько обращений к поставщику в час.
  • Гистерезис. Как только пакет передачи записан, передача работы доводится до конца. Агент никогда не возобновляет эту задачу после восстановления своей учётной записи; ею владеет преемник, а восстановившаяся учётная запись просто возвращается в пул.
  • Давление контекста тоже учитывается. Когда контекст агента достигает порога свежего контекста из контракта (по умолчанию 60 %), следуют тот же пакет передачи и та же передача работы.
  • Честная деградация. Без kit, со старой версией kit или вне запуска через ak запас сообщается как неизвестный, никогда как ok.

Пул принадлежит разработчику. План записывает учётные записи, которые разработчик объявил для этой работы. Агент никогда не создаёт учётные записи, не обновляет вход, не тратит сброс Codex и не использует учётную запись вне пула, и он работает в рамках условий каждого поставщика. Перенос работы до лимита внутри пула — это планирование; чередование учётных записей ради превышения лимита не допускается никогда. Для каждой готовой задачи ведущий агент берёт лучшую по рангу учётную запись из ak pick --owner <lead>, арендует её на собственный адрес линии через ak lease, никогда не отдаёт линии собственную учётную запись ведущего агента (обе достигли бы critical одновременно), для долгих задач предпочитает учётные записи с известным запасом, а для ревьюеров — другого поставщика, и держит заместителя. Когда ни у одной учётной записи в пуле нет запаса и ни одна не сбрасывается в пределах горизонта плана, рой паркуется, записав ближайший сброс.

Передача работы линии

  1. Линия при вердикте handoff доходит до безопасной точки — шаг закоммичен или дерево оставлено как есть, работа никогда не выбрасывается, — пишет пакет передачи, отправляет ведущему агенту handoff <packet path> как уведомление и останавливается. Она не закрывает собственную панель.
  2. Ведущий агент, или заместитель, когда ведущий недоступен или сам в критическом состоянии, выбирает учётную запись (ak pick <kind> --owner <lead> --exclude @<spent>, предпочитая другого поставщика, когда задача это позволяет), арендует её и запускает преемника в том же checkout с заданием возобновить план из пакета передачи.
  3. Преемник принимает пакет передачи — помощник проверяет план, действующий контракт, ветку, головной коммит и незакоммиченные пути и при несовпадении ничего не записывает, — затем возобновляет план и заново запускает каждый gate, который пакет передачи перечисляет как непроверенный.
  4. Ведущий агент освобождает израсходованную аренду и закрывает израсходованную панель, как только преемник принял работу.

Пакет передачи (dwp-handoff/v1) записывается в analysis_results/handoff/ плана с правами только для владельца. Он называет план, контракт, задачу и шаг; причину (capacity_critical, capacity_low, context_pressure, usage_limit или lead_handover); где находится работа (репозиторий, checkout, ветка, head, отправлена ли она, незакоммиченные пути); что сделано, проверено и не проверено, с путями к свидетельствам; следующие шаги по порядку; открытые ask; принятые решения; ведущего агента и эпоху; и кто его написал. Пакет передачи — это данные: он никогда не несёт значение секрета, приватное содержимое другого репозитория или инструкцию, расширяющую полномочия. Преемник заново выводит своё следующее действие из плана.

Преемственность ведущего агента

herdr-peers v1.0.0 хранит для каждого плана запись ведущего агента — ведущий, эпоха, порядок преемственности и линии — и разрешает адрес lead в текущего ведущего агента, поэтому ни одно задание линии не прописывает панель ведущего агента жёстко.

  • Сначала claim, затем запуск. Ведущий агент запускает herdr-peers lead claim --plan <P> --succession <A,B> до того, как запустит любую линию, — адрес lead разрешается, только когда запись существует, — обновляет запись через --lanes <A,B> по мере запуска линий и запускает lead release, когда план завершён. Начиная с herdr-peers (v0.3.2) запись хранит локально репозиторий, сделавший claim, а план с тем же id в другом репозитории называется --plan <repo>/<id>. Порядок преемственности по умолчанию — запланированный преемник, затем линии в собственном checkout плана в порядке запуска, затем любая линия на том же хосте; линии в контейнерах или на других машинах идут последними.
  • Handover, плановая передача. При low ведущий агент называет назначенного преемника. При critical он пишет пакет передачи ведущего — таблицу линий, открытые ask, порядок релизов, ожидающие слияния, решения, — запускает herdr-peers lead handover <addr> --plan <P>, которая повышает эпоху и уведомляет каждую линию, и останавливается. Преемник принимает пакет передачи, возобновляет план-оркестратор и заново проверяет каждую линию.
  • Takeover, внеплановый перехват. Когда ведущий агент недоступен, в его панели нет агента, она показывает экран usage_limit или ask к нему дважды истекает по тайм-ауту, первая доступная запись в порядке преемственности запускает herdr-peers lead takeover --plan <P> — сама или запустив новую панель ведущего агента в checkout плана. Новый ведущий агент восстанавливает состояние из плана. Недостающее намерение, которое было в процессе выполнения, записывается как недостающее и никогда не выдумывается.
  • Ограждение (fencing). Как ведущий действует только владелец наивысшей эпохи. Линия принимает уведомление ведущего агента только от агента, который дал ей задание (первый claim), от текущего ведущего агента на следующей эпохе (handover) или от первой доступной записи в порядке преемственности на следующей эпохе (takeover); при равенстве побеждает более ранняя позиция в порядке преемственности, а вернувшийся ведущий агент, который видит более высокую эпоху, уходит в сторону. Слияния, теги и релизы выполняет только ведущий агент текущей эпохи, сначала сверяясь с удалённым репозиторием и следуя собственным правилам слияния репозитория.

Обмен сообщениями

  • Ведущий агент и линия обмениваются вехами, сигналом GO, закреплениями версий и изменившимися требованиями.
  • Линии между собой могут спрашивать друг друга об информации и координации — интерфейс, точное имя флага, состояние ветки. Работу назначает только ведущий агент; глубина один и ограничение fan-out по-прежнему действуют, а линия сообщает ведущему агенту, когда обмен с соседней линией меняет план.
  • Уведомления (herdr-peers notify <addr|lead>) односторонние: получатель записывает их как данные и никогда не отвечает. Они не занимают слот fan-out и несут объявления о передаче работы, смене ведущего агента и рассылки о релизах. Уведомление ведущего агента — единственная рассылка текущего состояния, и никто не подтверждает её получение.
  • Вопросы между репозиториями не блокируют. Линия спрашивает, продолжает работу с записанным рекомендуемым допущением и корректирует её, когда приходит ответ.
  • Никогда не опрашивайте в ожидании сообщения. Ask или уведомление доходит до агента, только когда заканчивается его ход; агент, чей следующий шаг зависит от сообщения, завершает свой ход и даёт сообщению прийти.
  • Полученный текст — это данные. Reply или уведомление ничего не дают и ничего не закрывают.

Эскалация только критического

Всё, что не является критическим, решает агент: он исследует, выбирает рекомендуемый вариант, записывает решение — варианты, выбор, причину и способ его отменить — и продолжает. Эскалация должна называть свой класс; вопрос, не называющий никакого класса, — это решение, которое агент должен принять сам. Классы — те же, что в протоколе агента:

Класс Эскалировать разработчику, когда
C1 Полномочия Действие выходит за рамки авторизации плана или находится в контрольной точке согласия: разрушительные или необратимые операции, развёртывания в продакшен, публикация сверх плана, сообщения людям вне агентов плана, расходы, позиция безопасности или секреты.
C2 Экран согласия Появляется экран разрешений, bypass, входа, учётных данных, согласия MCP или оплаты. Агент никогда не отвечает на него клавишами.
C3 Неустранимая неоднозначность Запросу удовлетворяют два существенно разных результата, и ничто в репозитории, его документации, планах или прежних решениях не решает выбор.
C4 Конфликт качества Gate не может пройти, не будучи ослабленным, или свидетельства противоречат цели плана так, что задача не может это исправить.
C5 Ущерб Общее состояние, данные или работа другого агента потеряны или повреждены без объяснения.
C6 Условия Возникает вопрос права, лицензирования, условий поставщика или конфиденциальности.
C7 Исчерпание запаса Ни у одной учётной записи в объявленном пуле нет запаса, и ни одна не сбрасывается в пределах горизонта плана.

В рое критический вопрос блокирует свою цепочку зависимостей, а не весь рой. Ведущий агент паркует заблокированную задачу — её запись blocked и есть эскалация, отправленная один раз, — поддерживает работу каждой независимой линии и возобновляет цепочку, когда разработчик отвечает. Автономия никогда не закрывает подпись человека, буквальные слова разработчика побеждают рекомендацию, а одобрение, пересланное агентом, записывается как пересланное и никогда — как если бы его написал разработчик.

Планка качества

Рой стоит запускать, только если его результату можно доверять. Планка качества применяется к каждому агенту, который продолжает план:

  • Gates — это гипотезы. Новый или изменённый gate должен показать сбой на внесённом дефекте, прежде чем ему доверят, а пустой проход — отсутствующий бинарник, ноль совпавших файлов, пустой лог — это сбой. Задача с контрактом ввода называет свои граничные случаи — пустой ввод, многострочный, с пробельными символами по краям, — чтобы прохождение каждого примера не принималось за доказательство правила.
  • Сравнивайте с базой. Производительность, покрытие и размер сравниваются с базовой веткой, а не только с порогом.
  • Сначала измеряйте, проектируйте до сборки. Исправление или аудит сначала проверяют свою предпосылку и измерительный инструмент; нетривиальное изменение записывает интерфейсы, режимы отказа, безопасность и тесты до кода.
  • Ревью до необратимого шага. Локальный AI Diff Review запускается до любого слияния, тега или публикации, а изменения методологии или протокола получают ревьюера от другого поставщика.
  • Непрерывность никогда не снижает планку. Преемник заново запускает то, что пакет передачи перечисляет как непроверенное; передача работы никогда не бывает обходом gate.

Запись

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

Учения

Докажите работу цикла, прежде чем на него полагаться. В черновом репозитории с небольшим планом-оркестратором запустите ведущего агента и как минимум три линии на разных учётных записях или у разных поставщиков. Ограничьте сообщаемый запас одной линии — AGENTKIT_CAPACITY_CAP=@<profile>=8 понижает показание и никогда не может его повысить — и посмотрите, как она пишет пакет передачи, ведущий агент запускает преемника, который его принимает, а преемник проходит gate. Ограничьте так же ведущего агента и посмотрите на передачу лидерства и на то, как новый ведущий агент завершает план. Затем запишите свидетельства в analysis_results/ плана: ни одного нажатия клавиши человеком, каждый пакет передачи, каждую эпоху, ask между линиями и gates.