Несколько фич одновременно — каждой задаче своя копия репозитория
С 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: «готово»
Оба агента отчитались, тесты зелёные. Но уже не понятно, чей это код и кто его на самом деле проверил. Это не ошибка модели — это ошибка в устройстве работы.
Решение: git worktree
Заголовок раздела «Решение: git worktree»Один репозиторий, несколько рабочих папок, у каждой своя ветка. История общая, ничего не клонируется.
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. - У каждой копии своя текущая ветка и свои изменения, поэтому коммиты в одной не мешают другой.
Что важно знать про копии
Заголовок раздела «Что важно знать про копии»- Копия создаётся одной командой git — сразу на новой ветке от основной.
- Одну ветку нельзя открыть в двух копиях одновременно.
- В копию попадает только то, что лежит в git. Секреты, зависимости и сборки готовятся заново.
- Папку с копиями исключают из основного дерева, чтобы инструменты и IDE её не видели.
- После мержа копию удаляют — ветка остаётся в истории.
Git изолирует только файлы
Заголовок раздела «Git изолирует только файлы»Новой копии нужно окружение: секреты, зависимости, сгенерированный код, порт, база данных. Готовые инструменты для параллельных агентов — например, 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["Откат и эскалация"]
Три правила поверх изоляции:
- агент работает только в своей копии: не трогает основное дерево, не пушит, не мержит;
- «готово» — это полная сборка и тесты в этой же копии, без кэша, со счётчиками в отчёте;
- принимает работу отдельный ревьюер со свежим контекстом; после мержа — ещё один полный прогон, упало — откат.
Человека зовут только в четырёх случаях: спека противоречит брифу, исчерпан лимит доработок, исполнитель недоступен, действие затрагивает прод или необратимо.
Пример: одна фича, пять задач, 31 минута
Заголовок раздела «Пример: одна фича, пять задач, 31 минута»Фича «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 разработки. Дальше в серии: почему «отчитался» не равно «принято».