AmitableСвязанные данные и процессы
← Все статьи

Статья · Разработка

ai-worker, часть 1: от задачи до проверенного слияния

Как работает ai-worker: три роли ботов, согласованный план с последовательными этапами, проверка результатов, исправления по ревью, CI и веб-панель управления.

Опубликовано 21 октября 2026 г.10 мин. чтенияАвтор: Создатель и разработчик Amitable
Читать на другом языке: EN

ai-worker координирует планирование, реализацию и ревью кода в репозиториях Amitable. Задачи описывают нужный результат, комментарии фиксируют решения, а пул-реквесты содержат изменения. Контроллер на Python управляет процессом, а сессии моделей исследуют исходный код, реализуют изменения и проверяют их.

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

Выбор точки входа и полномочий

Сейчас используются роли planner-bot, worker-bot и reviewer-bot, каждая с отдельной учётной записью Forgejo без прав администратора. Они разделяют планирование и координацию слияний, реализацию и независимое ревью. Имена служб, префиксы веток, маркеры владения и команды с ai-worker сохраняют совместимость.

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

Задачу, созданную пользователем с правом записи в репозиторий, можно назначить сразу на worker-bot. Это разрешает реализацию по задаче и требованиям человека без отдельного планирования и согласования плана. Воркер явно формулирует критерии приёмки; неоднозначные требования по-прежнему останавливают работу. Ссылка на ветку в Forgejo задаёт целевой контекст, иначе используется ветка по умолчанию.

Reviewer-bot может проверять отдельные PR без связанной задачи или плана. Если критерии не заданы, он ищет ошибки корректности, безопасности и регрессии по описанию PR, обсуждению и исходному коду, не придумывая новые требования. Одобрение ревью само по себе не даёт разрешения на слияние.

Опрос сервера, проверку полномочий, публикацию Git, чтение CI, обновление статуса и допустимые слияния выполняет обычный код. Для отображения задачи, которая простаивает или ждёт согласования, сессия модели не нужна.

Согласование конкретной версии плана

Планирование исследует зафиксированный снимок репозитория, не меняя код и не запуская установку зависимостей, тесты или сборку. План содержит результат, критерии приёмки, ограниченные по объёму этапы, поддерживаемые команды проверки, риски и вопросы. Новые планы выполняются последовательно. Небольшой задаче может быть достаточно одного этапа.

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

Человек с правами Write, Admin или Owner может согласовать план новым, неотредактированным комментарием:

@planner-bot approve-plan p-<revision>

Вместо шаблона подставьте версию, указанную под планом. Другой вариант — поставить 👍 на неотредактированное уведомление планировщика об ожидании согласования именно этой версии. Реакция на основной комментарий с планом не учитывается. Боты не могут дать согласование от имени человека; старые команды @ai-worker продолжают работать.

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

Новые этапы выполняются по порядку

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

Каждый этап создаёт PR из управляемой ветки, например ai-worker/issue-N-m1, в интеграционную ветку задачи. Следующий этап начинается после подтверждения слияния текущего. Даже логически независимые этапы одного нового плана выполняются последовательно.

Рассмотрим условный план экспорта записей: m1 определяет общий контракт, m2 реализует экспорт с проверкой прав, а m3 добавляет интерфейс. Это пример, а не описание ранее выполненной задачи или результат измерения производительности.

Последовательный процесс: задача для planner-bot, согласование версии плана, реализация и ревью этапов m1, m2 и m3 по очереди, синхронизация интеграционной ветки с основной, финальный CI и подтверждение защищённого слияния. Прямые задачи в основную ветку отдельно требуют одобрения человека.
В новых планах этапы одной функции идут по очереди. Свободные слоты могут обслуживать другие функции и ревью.

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

Контроллер поддерживает синхронизацию интеграционной ветки с веткой по умолчанию. Гостевая среда может разрешить конфликты относительно зафиксированного коммита основной ветки; результат обязан включать этот коммит до публикации. Исправления используют обычные коммиты и сохраняют накопленную работу, не заменяя её force push.

Реализация должна вернуть проверяемые подтверждения

Сессия реализации получает согласованную область текущего этапа, снимок исходного кода, прежние замечания и сохранённую работу. Она следует правилам репозитория и создаёт коммиты через его хуки. В Amitable общие проверки сборки, схемы и затронутых unit-тестов обычно выполняет pre-commit, а полную проверку покрытия — CI пул-реквеста. Нужные целевые e2e и явно согласованные измерения запускаются отдельно. Обходить хуки нельзя.

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

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

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

Провалы обязательных проверок и подходящие пробелы в отчёте запускают ограниченное восстановление: обычно до трёх попыток для неизменного снимка. Отсрочки из-за квоты не расходуют этот лимит. Вопросы и изменение области работ по-прежнему требуют участия человека или нового планирования.

Ревью и исправления — отдельные решения

Reviewer-bot начинает свежую сессию для полного diff зафиксированных коммитов и окружающего кода. Обычное ревью не устанавливает зависимости и не запускает тесты, линтер, проверку типов, сборку или e2e. Оно сообщает о конкретных ошибках корректности, безопасности и регрессиях с точными ссылками на исходный код. Подтверждением выполненных проверок остаются записи сессии реализации.

Замечания создают явное обязательство по исправлению. Worker-bot должен ответить на каждое из них коммитом с исправлением и проверкой регрессии, обоснованным по исходному коду возражением либо незавершённым результатом с объяснением блокировки. Прежние успешные тесты сами по себе замечание не закрывают. Неполные ответы или повторное «уже готово» без изменений получают корректирующую обратную связь в пределах лимита исправлений.

Возражение направляется на новое независимое ревью, даже если head и base не изменились. Worker-bot не может снять собственные замечания. Подходящие незавершённые ревью и блокировки реализации тоже могут перейти в ограниченное восстановление. После исчерпания попыток система сообщает о нерешённых пробелах и точной команде повтора; изменение области работ всё ещё требует решения человека.

Завершённое ревью публикует одобрение или запрос изменений. Черновые и WIP PR обычно пропускаются; для финального ревью ранее созданных параллельных функций есть отдельное исключение. Изменение снимка отменяет прежний допуск по ревью.

Условия доставки зависят от процесса

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

У завершённого нового последовательного плана итоговый PR становится готовым и может слиться автоматически, когда интеграционная ветка синхронизирована, текущий head удовлетворяет настроенному CI, возможность слияния подтверждена и нет запроса изменений. Этот путь не требует отдельного финального одобрения человека, отдельного автоматического финального ревью или прежней задачи общей валидации. Подтверждения каждого этапа уже проверены до его интеграции.

Процесс Разрешение на план Условие финального слияния
Новый последовательный план Человек согласовал версию Актуальный применимый CI, возможность слияния, отсутствие запроса изменений, правила сервера
Прямая задача в основную ветку Назначение задачи, созданной пользователем с правом записи Формальное одобрение человеком текущего head, принятые ревью и проверки, применимый CI
Ранее созданная параллельная функция Её согласованный граф Независимое финальное ревью, общая валидация, одобрение человеком текущего head, применимый CI

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

Запросы слияния не используют принуждение и содержат ожидаемый head. Доставка фиксируется только после подтверждения слияния сервером. Безрезультатная попытка слияния уступает место другой готовой работе. Здесь доставка означает попадание изменений в целевую ветку; развёртывание приложения выполняется отдельно.

Наблюдение и управление

Веб-панель дополняет терминальный интерфейс экранами Overview, Tasks, Logs и Settings. Overview показывает общий планировщик, активные слоты, фазу, провайдера и модель, сохранённые квоты, ресурсы хоста и гостей и ошибки. Tasks содержит историю этапов и результаты; Logs — ограниченную свежую выборку журнала; Settings — предварительный просмотр поддерживаемых изменений настроек.

В Settings также виден сохранённый статус доступа каждой роли к репозиторию. Check access проверяет права, а Repair access выдаёт недостающий неадминистративный доступ Write и проверяет его через учётные записи ботов. При добавлении репозиториев через Save эта операция выполняется для новых записей. Частичный сбой не отменяет сохранение настроек и отображается предупреждением. Открытие Settings не проверяет права, а удаление репозитория из настроек не отзывает существующий доступ.

Экран Overview ai-worker от 9 ноября 2026 года: два занятых слота — реализация через OpenCode и ревью через Codex, управление планировщиком, ресурсы, сохранённые квоты и отсутствие зарегистрированных ошибок.
Снимок от 9 ноября показывает конкретную конфигурацию. Модели, выделенные ресурсы и квоты здесь — наблюдения, а не значения по умолчанию или оценка производительности. Нажмите на изображение, чтобы открыть полный размер.

Start now запрашивает немедленную проверку при наличии ресурсов. Pause scheduling не останавливает уже выполняемые задания. Stop selected slot требует подтверждения с указанием текущего задания и повторной проверки на сервере перед остановкой. Resume доступен только для корректно приостановленного, ранее включённого и проверенного планировщика; первичное включение и восстановление остаются операциями администратора вне веб-панели.

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

Изменения, остановка и очистка

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

Используйте @planner-bot retry для задач планирования, @worker-bot retry для задач реализации и @reviewer-bot review или @reviewer-bot retry для PR. Закрытие родительской задачи или снятие назначения останавливает дальнейшую работу над функцией, публикацию и слияния, но не отменяет уже подтверждённые слияния.

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

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