Урок 12 · Совместная работа

Разные агенты не должны делить одно дерево

«Isolate by directory, coordinate by task ID.» Две плоскости, не мешающие друг другу.

⏱ ~10 мин · 📝 3 интерактивных компонента · 🧑‍💻 На основе shareAI-lab · s12_worktree_task_isolation.py

Проблема параллельных агентов

Уроки s09–s11 позволяют запускать несколько teammate одновременно, но здесь есть скрытая ловушка: все они работают в одном рабочем каталоге. Alice правит auth.py, Bob тоже правит auth.py — git-конфликты, перепутанные файлы, взаимное загрязнение тестов.

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

my-repo/                           # главная рабочая область (lead)
.worktrees/
  alice-auth/                      # изолированный каталог Alice
    (branch: wt/alice-auth)
  bob-api/                         # изолированный каталог Bob
    (branch: wt/bob-api)
  index.json                       # реестр worktree
  events.jsonl                     # журнал событий жизненного цикла

Разделение на две плоскости

s12 явно делит систему на две плоскости:

  • Плоскость управления (control plane): JSON-файлы в .tasks/. Task — абстрактная единица «что делать»: зависимости, owner, status.
  • Плоскость исполнения (execution plane): каталоги в .worktrees/. Worktree — физический контейнер «где делать»: один каталог + одна ветка.

Они связаны двусторонне через task.worktree и worktree.task_id.

Такое разделение позволяет: переиспользовать механизм управления задачами, заменив среду исполнения (например, Docker-контейнер вместо git worktree). Или заменить механизм задач, сохранив worktree (например, база данных вместо JSON-файлов).

Демонстрация жизненного цикла

Ниже пройдём полный путь: create task → create worktree → run commands → keep или remove. Каждый шаг фиксируется в журнале событий (events.jsonl), который в production обеспечивает наблюдаемость системы.

keep vs remove

Когда worktree выполнил свою задачу, есть два исхода:

  • remove: git worktree remove --force — каталог удаляется, ветка обычно тоже. Означает «этот эксперимент не нужен».
  • keep: в .worktrees/index.json ставится status: kept, физический каталог сохраняется. Означает «результат нужен, жду слияния».

Типичная схема: subagent делает экспериментальный рефакторинг → результат хороший → keep → человек смотрит → вливает в основную ветку → ручной remove. Результат плохой? remove сразу.

Интерактив

Виджет 1 · Lifecycle · от create task до keep/remove

Нажимайте кнопки по шагам, чтобы запустить 5 событий. Слева — состояние диска (.tasks/ + .worktrees/), справа — журнал событий (events.jsonl).

Состояние диска
events.jsonl (только дозапись)
Интерактив

Виджет 2 · Parallel Lanes · 3 агента в 3 worktree одновременно

alice / bob / charlie правят один и тот же файл в разных worktree. Видят ли они изменения друг друга? Будут ли конфликты?

📂 .worktrees/alice/
📂 .worktrees/bob/
📂 .worktrees/charlie/
Интерактив

Виджет 3 · Decision Flow · выберите правильный следующий шаг

В production, когда агент заканчивает работу в worktree, что делать — keep или remove? 5 сценариев.

Правильно: 0 / 5