Перейти к содержимому

Несколько фич одновременно — каждой задаче своя копия репозитория

21фича
67задач
97%коммитов — агенты (535 из 552)
31 минот спеки до 5-го мержа

С 2 сентября через AI-агентов в моём проекте прошла 21 фича — 67 задач, 535 из 552 коммитов. Часто по несколько фич одновременно. Это работает только потому, что у каждой задачи своя копия проекта.

sequenceDiagram
  participant A as Агент A
  participant F as Общая папка
  participant B as Агент B
  A->>F: меняет общий файл
  B->>F: запускает тесты
  F-->>B: тесты красные из-за правки A
  B->>F: «чинит» код A
  A-->>A: «готово»
  B-->>B: «готово»

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

Один репозиторий, несколько рабочих папок, у каждой своя ветка. История общая, ничего не клонируется.

flowchart LR
  subgraph GIT["Общий .git — один на все копии"]
    OBJ["Объекты и история"]
    REFS["Ветки, config, hooks"]
    W1["worktrees/task-1<br/>своё состояние"]
    W2["worktrees/task-2<br/>своё состояние"]
  end
  MAIN["my-project/<br/>основное дерево, develop"] --> GIT
  T1[".worktrees/task-1<br/>ветка feat/task-1"] --> W1
  T2[".worktrees/task-2<br/>ветка feat/task-2"] --> W2
  • Файлы у каждой копии свои, история и ветки — одни на всех.
  • В копии вместо папки .git лежит короткая ссылка на общий .git.
  • У каждой копии своя текущая ветка и свои изменения, поэтому коммиты в одной не мешают другой.
  1. Копия создаётся одной командой git — сразу на новой ветке от основной.
  2. Одну ветку нельзя открыть в двух копиях одновременно.
  3. В копию попадает только то, что лежит в git. Секреты, зависимости и сборки готовятся заново.
  4. Папку с копиями исключают из основного дерева, чтобы инструменты и IDE её не видели.
  5. После мержа копию удаляют — ветка остаётся в истории.

Новой копии нужно окружение: секреты, зависимости, сгенерированный код, порт, база данных. Готовые инструменты для параллельных агентов — например, Conductor — дают каждой задаче рабочее место: копию, окружение, порт. Это хорошее рабочее место, когда человек сам смотрит каждую ветку.

Мне нужно было ещё одно: чтобы ветки принимались без меня.

Conductor Мой цикл
Изоляция worktree и ветка на пространство worktree и ветка на каждую задачу
Окружение setup-скрипт подготовка описана в самом задании
Порт свой на каждое пространство тестовые серверы берут свободный порт у системы, поэтому параллельные прогоны не конфликтуют
База данных через setup-скрипт, если настроить задачи с миграциями работают на одноразовой копии базы; общую dev-базу не трогают
Кто принимает ветку человек: ревью и PR в интерфейсе отдельный ревьюер-агент со свежим контекстом
Что значит «готово» решает человек полный прогон в копии без кэша, счётчики в отчёте
После мержа — повторный полный прогон; красный — откат
Когда нужен человек на каждой ветке в четырёх случаях

Колонка Conductor — по его документации, «—» значит, что там это не описано. Колонка «Мой цикл» — по заданиям и тестам в репозитории.

flowchart TD
  S["Спека и план"] --> T["Задачи в журнале"]
  T --> W["Своя копия<br/>и ветка"]
  W --> E["Исполнитель<br/>тест → код → полный прогон"]
  E --> R["Отчёт<br/>счётчики, отклонения"]
  R --> A{"Ревьюер<br/>со свежим контекстом"}
  A -- "доработка, до 2 раз" --> E
  A -- "провал" --> H["Эскалация человеку"]
  A -- "принято" --> M["Мерж в develop"]
  M --> P{"Полный прогон<br/>после мержа"}
  P -- "зелёный" --> D["Готово"]
  P -- "красный" --> X["Откат и эскалация"]

Три правила поверх изоляции:

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

Человека зовут только в четырёх случаях: спека противоречит брифу, исчерпан лимит доработок, исполнитель недоступен, действие затрагивает прод или необратимо.

Фича «AI-продакт пространства», среда, 15 октября.

Время Событие
12:40 спека
12:43 план, 5 задач
12:51 задача 1 влита в develop
13:02 задача 2
13:09 задача 3
13:11 задачи 4 и 5 — шли параллельно

40 файлов, 3 879 строк, 1 254 теста — 0 упавших.

Побочный эффект: модель стала сменной. Задачи в этом цикле закрывали Claude, Grok и DeepSeek — формат задачи и отчёта один.

Цена. Изоляция бесплатна для git, но не для окружения: на каждую копию — свои зависимости, кодогенерация, сборка, порт и база. Параллельные миграции базы почти гарантированно конфликтуют.

Принцип. Когда код пишут несколько агентов сразу, у каждой задачи должна быть своя копия проекта — и всё, что доказывает её готовность, должно быть получено в этой копии.

Этот цикл я собираю в actari — своём инструменте для AI-driven разработки. Дальше в серии: почему «отчитался» не равно «принято».

Скопируйте промпт в ChatGPT, Claude или любой другой AI-ассистент. Он спросит ваш стек и разберёт практику по шагам.

Я прочитал статью про изоляцию задач AI-агентов через git worktree (AIDD Practices #1). Разбери эту практику подробно для моего проекта. Сначала спроси мой стек, менеджер пакетов, базу данных и как я запускаю агентов. Затем объясни:
1) как устроен git worktree внутри и какие команды нужны;
2) как готовить окружение каждой копии: файлы из .gitignore, зависимости, кодогенерация, сборка;
3) как избежать конфликтов портов и базы данных между параллельными задачами;
4) как сделать, чтобы «готово» означало полную сборку и тесты в этой же копии, без кэша;
5) как устроить приёмку работы агента и проверку после мержа с откатом;
6) типичные подводные камни для моего стека.
Дай пошаговый план с примерами команд.