РАЗБОР· 2 мин чтения

Fan-out агентов и git worktree: параллельные правки без конфликтов

Пообещать параллелизм легко, сделать его безопасным — сложно. Muse Code решает задачу старой и скучной технологией git, применённой ровно там, где надо.

#worktrees#parallel-agents#git#multi-agent

Паттерн: один родитель, много детей с правом записи

В основе Muse Code лежит простое правило: если работа распадается на несколько независимых задач, они автоматически разлетаются по отдельным агентам. Родительский агент порождает по одному дочернему агенту с правом записи на каждую задачу. Ничего настраивать не нужно, никакого специального «параллельного режима» нет — декомпозиция и раздача задач включены по умолчанию всегда, когда объём работы того стоит.

И тут же возникает очевидный вопрос: если несколько агентов одновременно пишут код в одном репозитории, почему всё не заканчивается мердж-конфликтами и затёртыми файлами?

A Muse Code session task table: six tasks across a breakout game, four done and two running, with isolated worktrees still active for tasks 4 and 6 under /.muse/worktrees/

Реальная сессия с fan-out: шесть задач по одной игре, четыре уже смерджены, две ещё в работе — каждая в своём worktree внутри .muse/worktrees/, а основная рабочая копия не тронута.

Worktree: изоляция средствами самого git

Каждый дочерний агент получает собственный git worktree — отдельный чекаут репозитория, который делит историю с вашей основной копией, но имеет свою рабочую директорию и свою ветку. Два агента могут править один и тот же файл, каждый в своём worktree, и ни один не увидит незавершённых изменений другого. Коллизия невозможна структурно.

Не менее важно другое: ваша рабочая копия остаётся чистой. Директория, открытая у вас в редакторе, — никогда не та, в которой сейчас что-то меняет агент. Ничего не ползёт под курсором, в вашем diff не всплывают полусырые правки, а выбросить работу агента стоит ровно столько же, сколько удалить его worktree. Изменения попадают в вашу ветку только тогда, когда работа закончена и проверена.

Почему не просто ветки? Или контейнеры?

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

Шесть фич одновременно — и это можно показать

Демо на запуске опирались на этот механизм по полной: в примере с разработкой игры Muse Code строил шесть игровых фич одновременно, каждый агент в своём worktree, и все ветки слились без конфликтов. В этом и есть практический выигрыш — время многофичевого спринта по часам схлопывается до длительности самой долгой задачи, а не суммы всех.

Попробуйте рецепт

Fan-out агентов — один из трёх паттернов, для которых Meta публикует рецепты в кукбуке: разбейте одну большую работу на субагентов так, чтобы ничто не сталкивалось на лету. Запускаемая версия — в кукбуке. А поскольку разветвлённую работу вам наверняка захочется потом проаудировать, каждый спавн дочернего агента, каждый вызов инструмента и каждый мердж фиксируются в журнале событий — ничего не происходит «за кадром» только потому, что происходило параллельно.

Читать дальше