Глава 06
Запуск множества агентов
Один агент на одном плане — вариант по умолчанию, и он покрывает бо́льшую часть работы. Некоторая работа шире одной сессии: изменение, затрагивающее несколько репозиториев, релиз, который должен выйти в определённом порядке, или бэклог, на который одному агенту понадобились бы дни. DWP масштабируется на такую работу, не меняя своего контракта. План остаётся источником истины, каждая задача по-прежнему закрывается на собственном gate, а дополнительные агенты — это линии (lanes), которые координирует ведущий агент (lead).
Эта глава описывает модель. Она использует три необязательных аддона — Herdr для панелей и peer-агентов, agentkit для учётных записей и devcontainer для контейнеров, — и ни один из них не нужен для плана с одним агентом.
Ведущий агент и его линии
Ведущий агент владеет родительским планом. Он определяет линии, передаёт каждой её объём работы, собирает вехи и даёт сигнал, который позволяет линии слить изменения или выпустить релиз. Он не пишет код другой линии.
Линия — это один агент с одним объёмом работы, обычно одним репозиторием. Она читает AGENTS.md этого репозитория, запускает его gate и хранит собственный план в репозитории. В хабе-оркестраторе родительский план лежит в .dwp/plans/ хаба вместе с таблицей отслеживания дочерних планов, а план каждой линии лежит в её собственном репозитории и использует идентификаторы планов и gate этого репозитория.
| Роль | Владеет | Никогда не делает |
|---|---|---|
| Ведущий агент | Родительским планом, списком линий, порядком релизов, GO | Не редактирует репозиторий линии |
| Линия | Одним репозиторием: его веткой, планом, gate и pull request | Не сливает и не выпускает релиз до GO ведущего агента |
Где работают линии
Линия — это агент в панели терминала, и панель может находиться в нескольких местах. Herdr размещает каждого агента в панели и дотягивается до других машин по SSH, поэтому ведущий агент видит каждую линию в одной боковой панели.
- На хосте. Одна панель на линию, рядом с ведущим агентом. Самая быстрая настройка — для репозиториев, в которых разработчик уже работает.
- В контейнере. Контейнер devcontainer-kit присоединяется к сети Herdr при
dck up: его агенты дотягиваются до хоста и других контейнеров, а хост дотягивается до них. Контейнер — это песочница, поэтому его агенты могут работать в режиме автономии. - На другой машине. Любая машина, до которой Herdr дотягивается по SSH, принимает линии так же, если на ней тоже установлен herdr-peers.
Место меняет изоляцию, а не протокол: линия в контейнере и линия на хосте координируются с ведущим агентом одинаково.
Учётные записи и поставщики по запасу квоты
Множество агентов быстро расходует квоту. Каждая линия работает на собственной учётной записи — один CLI и один профиль в coding-agents-kit, — поэтому линии не исчерпывают одно и то же окно, а учётная запись, упёршаяся в лимит, останавливает одну линию, а не все.
ak usageпоказывает остаток квоты на каждой учётной записи и профиле, один раз на пакет.ak pick <kind> --count Nвозвращает N учётных записей с наибольшим запасом, начиная с лучшей;--excludeисключает занятую учётную запись,--modelучитывает окно одной модели, а--needотказывается стартовать без достаточного запаса.ak <kind> @<profile>запускает агента линии на этой учётной записи, в его панели.
Поставщиков сочетают так же. Линия Claude может писать, пока линия Codex проводит ревью, каждая на учётной записи, которую ak pick выбрал для её типа. Линия в контейнере может использовать учётные записи хоста: когда в профиле хоста devcontainer-kit разработчика включён host_profiles, контейнер получает профили хоста для CLI, которые устанавливает репозиторий, — Claude через долгоживущий токен на профиль, Codex через его файл аутентификации — и не нуждается в собственном входе. Используйте только собственные учётные записи и соблюдайте условия каждого поставщика: распределяйте работу между ними, но никогда не чередуйте учётные записи, чтобы обойти лимит.
Запуск и разблокировка линий без человека
Ведущий агент может запускать линии и поддерживать их движение, когда за клавиатурой никого нет. Как только разработчик разрешил работу без присмотра — постоянным указанием или предварительной авторизацией плана, — ни один отдельный запуск не требует дополнительного одобрения. Для этого ведущий агент использует собственные команды Herdr; никакой код kit не отправляет нажатия клавиш. У процедуры фиксированный порядок: подготовить один раз, избежать запроса, обнаружить остановку, отправлять клавиши только в одном случае, остальное эскалировать.
- Подготовьте один раз, как разработчик. Claude Code один раз для каждого профиля просит подтвердить свой режим bypass-permissions. Это подтверждение — собственный шаг разработчика, который он выполняет при создании профиля; в контейнере devcontainer-kit kit записывает его только в собственные home-каталоги контейнера. Ни один агент никогда не отправляет клавиши для него.
- Избегайте.
ak pick <kind>называет учётную запись с наибольшим запасом, аherdr pane run <pane> 'ak <kind> @<profile> --trust-cwd'запускает линию в её собственной папке.--trust-cwd(илиAGENTKIT_TRUST_CWD=1) заранее делает эту папку доверенной, поэтому Claude и Codex пропускают экраны доверия к папке без нажатий клавиш. - Обнаруживайте.
herdr-peers lanes(илиherdr agent list) показывает каждую линию как работающую, простаивающую, заблокированную или завершённую. Для линии, которая заблокирована или простаивает без вывода,herdr-peers status <pane>классифицирует экран, на котором она стоит, — доверие к папке, подтверждение bypass, вход, разрешение или неизвестный — с задокументированным следующим шагом, аherdr pane read <pane>показывает его. - Одно нажатие, один случай. Единственные клавиши, которые может отправить ведущий агент, — это ответ на экран доверия к папке, в панели, которую он сам запустил, когда
--trust-cwdбыл недоступен. Он читает экран перед отправкой клавиш, отправляет минимум клавиш, отвечающих на него, и читает снова. - Всё остальное прочитайте, запишите и эскалируйте. Подтверждение режима bypass-permissions в Claude, запросы входа и учётных данных, запросы разрешений на отдельные действия, подтверждения разрушительных действий, запросы оплаты или тарифа, неизвестные экраны и панели, которые ведущий агент не создавал, уходят разработчику как заблокированная веха, никогда как нажатия клавиш.
- Отказ побеждает. При
AGENTKIT_PERMISSIONS=askлинии спрашивают, прежде чем действовать, и ведущий агент никогда не обходит запрос, который приносит отказ. - Перезапускайте. Если агент завершает работу, ведущий агент запускает его снова на той же учётной записи или выбирает другую. Потерянный вход — это запрос учётных данных: его эскалируют.
Каждое вмешательство — что показывал экран, какие клавиши отправлены, что произошло дальше — записывается в родительский план.
Координация через herdr-peers
Линии и ведущий агент общаются через herdr-peers: ask несёт отметку, которая авторизует ровно один reply, и каждый обмен записывается. Ведущий агент держит протокол небольшим:
- Вехи наверх. Каждая линия отчитывается в фиксированных точках — план готов, pull request открыт, заблокировано, завершено — и между ними продолжает работать, не дожидаясь ответа.
- Вопросы как ask. Линия, которой нужно решение, спрашивает ведущего агента; ведущий агент отвечает одним reply.
- Глубина один. На reply никогда не отвечают, и линия не делегирует дальше. Ветвление на одного вызывающего ограничено, по умолчанию четырьмя peer-агентами.
- Данные, а не инструкции. Reply не даёт ничего, чего у получателя ещё не было. Утверждение линии, что её gate пройден, проверяется запуском этого gate.
- Запись того, кто что сделал. Каждая запись делегирования называет учётную запись и поставщика линии, поэтому родительский план показывает, какая учётная запись выполнила какую работу.
- Лейны Codex называют свою панель. Codex выполняет команды лейна из фонового сервера, общего для всех сессий этой учётной записи, поэтому унаследованный id панели может принадлежать другому лейну. Лейн Codex передаёт свою панель, указанную в задании лидера, через
--pane <pane>в каждой команде herdr-peers (ask,reply,notify,check,wait,lanes,cancel).
Ведущий агент может видеть весь оркестр сразу: herdr-peers lanes показывает каждую линию с её состоянием, а DeepWorkPlan Vim показывает линии плана-оркестратора рядом с самим планом (:DwpLanes).
Одна ветка, один релиз на репозиторий
Правило, которое сохраняет возможность ревью множества линий, простое: одна линия на репозиторий, на его базовом checkout, с одной веткой, одним pull request и одним релизом для всего изменения. Линия не разбивает свою работу на несколько веток или worktree. Worktree нужны только тогда, когда двум записывающим приходится делить один репозиторий: каждый получает собственный, чтобы у каждого пути был один записывающий.
Pull request остаётся открытым, зелёным и помеченным меткой для ревью до GO ведущего агента. Тогда линия сливает изменения, ставит тег и сообщает тег обратно.
Порядок релизов
Репозитории зависят друг от друга, поэтому их выпускают в порядке зависимостей: сначала инструменты, затем то, что их закрепляет, затем документация, описывающая результат, а затем потребители, которые его внедряют. Ведущий агент держит порядок и отправляет GO по одному репозиторию за раз. Линия, закрепляющая релиз другого репозитория, ждёт его тега, прежде чем записать закрепление, поэтому ни одно закрепление никогда не указывает на релиз, которого не существует.
Контрольные точки
Родительский план закрывается на доказательствах, а не на отчётах:
- Для каждой линии. Gate каждой линии проходит на её собственной ветке, а ревью её pull request чистое. Ревью может быть отдельной линией: AI Diff Reviewer проверяет pull request каждой линии, а с аддоном Dailybot каждая линия сама сообщает команде о своём прогрессе.
- Для каждого релиза. Каждый тег существует и закрепляет то, что нужно следующему репозиторию.
- Интеграция. После последнего релиза контрольная точка запускает потребителей на выпущенных версиях и записывает вердикт в
analysis_results/родительского плана. - Финальное ревью. Проверка безопасности охватывает всё, что пересекло границу, — прежде всего учётные записи, токены и файлы, предоставленные контейнерам, — прежде чем родительский план будет завершён.
Безопасность
- Никогда не помещайте ключ, токен или секрет в ask, prompt или лог; ссылайтесь на переменные по имени.
- Общие ресурсы получают блокировку: линия берёт её перед тяжёлым шагом, например сборкой контейнера, и освобождает после.
- Отказ от разрешений, если он установлен, побеждает для каждой линии и каждого агента, которого запускает линия.
- Линия, которая не может продолжить, сообщает об этом как о заблокированной вехе и останавливается; решает ведущий агент.
Когда заканчивается учётная запись или ведущий агент
Долгий запуск переживает любую отдельную учётную запись. Начиная с coding-agents-kit (v0.7.1) и herdr-peers (v0.3.2), линия проверяет собственный запас на каждой границе задачи и передаёт свою работу через пакет передачи до того, как её учётная запись исчерпается, ведущий агент передаёт лидерство или его заменяет заместитель, а до разработчика доходят только критические вопросы. Глава Автономия роя описывает цикл, пакет передачи, преемственность и классы эскалации.