Agent Dev 101

Модуль 10 · Урок 10.3

Урок 10.3. Git Worktrees

На этой странице
  1. Зачем это нужно
  2. Основная идея
  3. Ключевые термины
  4. Branch vs Worktree
  5. Схема worktrees для параллельных агентов
  6. Базовые команды
  7. Где создавать worktrees
  8. Важное ограничение: одна branch в одном worktree
  9. Какие tasks можно выносить в worktrees
  10. Parallel-ready checklist
  11. Worktree plan
  12. Пример: Password Reset backend/ui/tests
  13. Worktrees и dependency graph
  14. Worktrees и one task - one change
  15. Worktrees и dirty working tree
  16. Shared environment: чего worktree не изолирует
  17. Environment plan для worktree
  18. Prompt для агента в worktree
  19. Как запускать несколько агентов
  20. Integration после параллельной работы
  21. Integration branch
  22. Merge conflicts
  23. Conflict risk table
  24. Когда worktree не нужен
  25. Worktrees для альтернативных подходов
  26. Worktrees и checkpoints
  27. Cleanup после worktree
  28. Worktree safety rules
  29. Пример 1. Worktree plan для backend/ui/tests
  30. Пример 2. Worktree для dirty main
  31. Пример 3. Worktree для reviewer agent
  32. Пример 4. Worktree для AI Agent evals
  33. Prompt-шаблоны для worktree orchestration
  34. Команды в одном сценарии
  35. Review checklist для каждого worktree
  36. Типичные ошибки
  37. Практика 1. Создать worktree plan
  38. Практика 2. Найти tasks, которые нельзя параллелить
  39. Практика 3. Написать prompt для агента в worktree
  40. Checklist: готов ли task к worktree
  41. Критерии готовности
  42. Краткое резюме
  43. Вопросы для самопроверки
  44. Что дальше

Зачем это нужно

В предыдущем уроке мы закрепили правило:

text
One Task -> One Change

Когда feature разбита на маленькие независимые tasks, появляется соблазн выполнить часть работы параллельно. Например:

  • один агент делает backend endpoint;
  • второй агент делает UI form;
  • третий агент пишет E2E tests;
  • четвертый агент делает review.

Если все они работают в одной рабочей директории, результат быстро становится неуправляемым:

  • агенты перезаписывают изменения друг друга;
  • git diff смешивает несколько задач;
  • tests запускаются на промежуточном состоянии;
  • невозможно понять, кто изменил файл;
  • один агент может случайно удалить temporary файлы другого;
  • merge conflicts появляются раньше, чем есть commits.

Git worktrees решают эту проблему на уровне файловой системы.

Worktree дает отдельную рабочую директорию для отдельной branch, но использует тот же Git repository storage. Для agentic development это удобно: каждый агент получает собственное место для работы, собственный branch и собственный diff.

Главная мысль урока:

text
Parallel agents need isolated working trees.
Worktrees give each task its own directory, branch and diff.

Основная идея

Branch изолирует историю. Worktree изолирует рабочую директорию.

Обычный single-agent workflow:

text
repo/
  branch: feature/auth-reset
  working tree: one directory
  agent: one active editor

Parallel workflow без worktrees:

text
repo/
  branch: feature/auth-reset
  working tree: one directory
  Agent A edits backend
  Agent B edits UI
  Agent C edits tests

Здесь все агенты пишут в одно физическое место. Даже если tasks логически независимы, их diffs смешиваются.

Parallel workflow с worktrees:

text
repo-main/
  branch: main

repo-auth-api/
  branch: feature/auth-api
  Agent A

repo-auth-ui/
  branch: feature/auth-ui
  Agent B

repo-auth-tests/
  branch: test/auth-e2e
  Agent C

Теперь каждый агент работает в своей директории. У каждого свой git status, свой git diff, свой test run и свой commit.

Ключевые термины

Термин Значение
Worktree Дополнительная рабочая директория, подключенная к тому же Git repository.
Main worktree Основная директория repository, где обычно был сделан git clone.
Linked worktree Дополнительная директория, созданная через git worktree add.
Branch isolation Каждый worktree обычно связан со своей branch.
Parallel-ready task Task, которую можно выполнять независимо от других без постоянной синхронизации.
Integration branch Branch, куда последовательно собирают результаты нескольких worktrees.
Merge conflict Ситуация, когда Git не может автоматически объединить изменения.
Shared environment Ресурсы вне Git, которые могут конфликтовать: ports, DB, cache, .env, services.
Worktree cleanup Удаление worktree после merge или отказа от experiment.

Branch vs Worktree

Branch - это указатель в истории Git.

Worktree - это directory checkout для branch.

Можно иметь много branches, но в одной обычной working tree одновременно checked out только одна branch.

Worktree позволяет иметь несколько checked out branches одновременно:

text
Branch feature/auth-api  -> directory ../project-auth-api
Branch feature/auth-ui   -> directory ../project-auth-ui
Branch test/auth-e2e     -> directory ../project-auth-tests

Сравнение:

Механизм Что изолирует Что не изолирует
Branch Git history Рабочую директорию, если branch переключается в одном folder.
Worktree Рабочую директорию и checked-out branch Shared external resources: DB, ports, caches.
Separate clone Все файлы и Git metadata Требует больше disk/network, сложнее синхронизировать.
Checkpoint Промежуточное состояние agent edits Не заменяет branch/commit/review.

Worktree часто лучше отдельного clone, потому что использует тот же repository storage и быстрее создается.

Схема worktrees для параллельных агентов

text
main
 │
 ├─ worktree/auth-api
 │      branch: feature/auth-api
 │      Agent A: backend endpoint
 │
 ├─ worktree/auth-ui
 │      branch: feature/auth-ui
 │      Agent B: reset form UI
 │
 └─ worktree/auth-tests
        branch: test/auth-e2e
        Agent C: E2E regression tests

В виде flow:

flowchart TD A[Base branch: main] --> B[Worktree auth-api<br/>feature/auth-api] A --> C[Worktree auth-ui<br/>feature/auth-ui] A --> D[Worktree auth-tests<br/>test/auth-e2e] B --> E[Commit API change] C --> F[Commit UI change] D --> G[Commit E2E tests] E --> H[Integration branch / PR sequence] F --> H G --> H H --> I[Run integration verification]

Главное: parallel work начинается только после decomposition. Worktrees не исправляют плохой task graph. Они помогают безопасно выполнить уже разделенные tasks.

Базовые команды

Посмотреть worktrees:

bash
git worktree list

Создать worktree с новой branch от main:

bash
git worktree add -b feature/auth-api ../project-auth-api main

Создать worktree для уже существующей branch:

bash
git worktree add ../project-auth-api feature/auth-api

Перейти в worktree:

bash
cd ../project-auth-api
git status --short
git branch --show-current

Удалить worktree после завершения:

bash
git worktree remove ../project-auth-api

Почистить записи о worktrees, которые были удалены вручную:

bash
git worktree prune

Для курса достаточно этих команд.

Где создавать worktrees

Обычно worktrees удобно создавать рядом с основным repository, а не внутри него.

Хорошо:

text
~/codex/ai-agent-development-101
~/codex/ai-agent-development-101-auth-api
~/codex/ai-agent-development-101-auth-ui
~/codex/ai-agent-development-101-auth-tests

Плохо:

text
~/codex/ai-agent-development-101/worktrees/auth-api

Вложенные worktrees могут запутать tooling, search, editor и ignore rules. Иногда это допустимо в настроенной команде, но для 101 workflow проще использовать sibling directories.

Naming convention:

text
<project>-<task-scope>

Примеры:

Worktree path Branch Agent task
../app-auth-api feature/auth-api Backend API
../app-auth-ui feature/auth-ui UI form
../app-auth-tests test/auth-e2e E2E tests
../app-agent-plan-mode test/agent-plan-mode Agent workflow eval
../app-docs-git-worktrees docs/git-worktrees-lesson Docs lesson

Название должно помогать понять ownership worktree.

Важное ограничение: одна branch в одном worktree

Обычно Git не дает checkout одной и той же branch сразу в двух worktrees.

Это правильно. Иначе два рабочих дерева могли бы независимо менять один branch pointer.

Плохая идея:

text
Agent A and Agent B both write to feature/auth-reset in two directories.

Лучше:

text
Agent A -> feature/auth-api
Agent B -> feature/auth-ui
Agent C -> test/auth-e2e

Затем changes интегрируются через PRs или integration branch.

Какие tasks можно выносить в worktrees

Worktree подходит для tasks, которые достаточно независимы.

Хорошие кандидаты:

  • backend endpoint после согласованного API contract;
  • UI form после согласованного request/response contract;
  • tests/evals для уже описанного behavior;
  • documentation lesson;
  • isolated bug fix;
  • refactor в отдельном module;
  • tool policy eval;
  • skill trigger tests;
  • migration planning в read-only/discovery mode.

Плохие кандидаты:

  • tasks, которые меняют один и тот же файл;
  • tasks без согласованного interface;
  • tasks, где один агент постоянно зависит от результата другого;
  • broad refactor shared module;
  • database schema change, от которого зависят все остальные;
  • dependency upgrade, который меняет environment для всех;
  • product decision, который еще не принят.

Правило:

text
Parallel-ready means independent enough to produce separate reviewable diffs.

Parallel-ready checklist

Перед тем как создать worktree для task, проверьте:

text
[ ] Task имеет один verifiable outcome
[ ] Task имеет свой branch name
[ ] Expected files/areas не пересекаются с другой task
[ ] Shared interface согласован
[ ] Acceptance criteria понятны
[ ] Verification commands определены
[ ] Integration point известен
[ ] Stop conditions указаны
[ ] Агент знает, что не должен менять shared contract без approval

Если хотя бы первые три пункта не выполнены, worktree может создать видимость порядка, но conflict все равно придет.

Worktree plan

Перед параллельной работой полезно написать worktree plan.

Формат:

text
Base branch:

Integration strategy:

Worktrees:
- path:
  branch:
  agent:
  task:
  expected files:
  verification:
  dependencies:
  stop conditions:

Conflict risks:

Merge order:

Пример:

text
Base branch:
main

Integration strategy:
Merge each task through separate PR into main, then run integration tests.

Worktrees:
- path: ../app-auth-api
  branch: feature/auth-reset-api
  agent: Agent A
  task: Add reset password API endpoint
  expected files:
    - src/auth/resetPasswordController.ts
    - src/auth/resetPasswordService.ts
    - tests/auth/resetPassword.api.test.ts
  verification:
    - npm test -- resetPassword.api
  dependencies:
    - reset token repository contract exists
  stop conditions:
    - API contract missing
    - schema migration required

- path: ../app-auth-ui
  branch: feature/auth-reset-ui
  agent: Agent B
  task: Add reset password form
  expected files:
    - web/routes/reset-password.tsx
    - web/components/ResetPasswordForm.tsx
    - web/components/ResetPasswordForm.test.tsx
  verification:
    - npm test -- ResetPasswordForm
  dependencies:
    - API contract from design doc
  stop conditions:
    - API response contract changes

- path: ../app-auth-e2e
  branch: test/auth-reset-e2e
  agent: Agent C
  task: Add E2E reset password flow
  expected files:
    - tests/e2e/password-reset.spec.ts
  verification:
    - npm run test:e2e -- password-reset
  dependencies:
    - API and UI branches integrated or mocked contract
  stop conditions:
    - cannot run browser test locally

Conflict risks:
- API contract changes may affect UI and E2E
- test fixtures may overlap

Merge order:
1. API
2. UI
3. E2E
4. integration verification

Такой plan лучше, чем просто запустить трех агентов и надеяться на Git.

Пример: Password Reset backend/ui/tests

Feature:

text
Password Reset

Разделение:

Worktree Branch Task Why parallel-ready
../app-auth-api feature/auth-reset-api Endpoint and service API contract already defined.
../app-auth-ui feature/auth-reset-ui Reset form Can build against documented contract or mock.
../app-auth-tests test/auth-reset-e2e E2E scenario Can be written against expected behavior, may need final integration.

Но не все можно параллелить.

Если reset token database model еще не согласован, сначала нужна sequential task:

text
AUTH-010:
Define reset token repository and data model.

Только после этого backend, UI и tests можно разделять.

Worktrees и dependency graph

Из модуля 4:

text
Большая feature -> task graph -> parallel-ready branches

Worktree - это способ физически выполнить ветви графа.

flowchart LR A[Design approved] --> B[Task AUTH-010<br/>Reset token model] B --> C[Task AUTH-012<br/>API endpoint] B --> D[Task AUTH-016<br/>UI form] C --> E[Task AUTH-020<br/>Integration tests] D --> E C -. worktree .-> C1[../app-auth-api] D -. worktree .-> D1[../app-auth-ui] E -. later .-> E1[../app-auth-integration]

Если tasks имеют dependency, worktree не отменяет dependency. Он только дает отдельное место для работы.

Worktrees и one task - one change

Каждый worktree должен соответствовать одному task boundary.

Плохо:

text
../app-auth-api
Agent A:
- backend endpoint
- UI form
- docs rewrite
- dependency upgrade

Хорошо:

text
../app-auth-api
Agent A:
- backend endpoint only
- API integration tests
- no UI
- no dependency upgrade

Worktree не делает diff маленьким автоматически. Агент все равно должен работать по правилу one task - one change.

Worktrees и dirty working tree

Одна из сильных сторон worktrees: можно оставить dirty work в основной директории и начать новую isolated task рядом.

Сценарий:

text
Main working tree has user edits in docs.
Need to run agent on auth bug fix.

Вместо того чтобы stash/revert user edits:

bash
git worktree add -b fix/auth-token-reuse ../app-auth-token-reuse main
cd ../app-auth-token-reuse

Теперь агент работает в чистой директории, не трогая user edits в main worktree.

Но важно:

  • base branch должна быть правильной;
  • незакоммиченные user edits не попадут в новый worktree;
  • если agent task зависит от этих edits, нужно сначала сделать commit или patch;
  • worktree не синхронизирует dirty changes между директориями.

Worktree изолирует, но не телепортирует незакоммиченную работу.

Shared environment: чего worktree не изолирует

Worktree изолирует files и branch. Но многое остается общим.

Resource Risk
Local database Agents overwrite each other's data or migrations.
Ports Two dev servers try to use 3000.
Cache Build/test cache becomes stale or contaminated.
.env Different tasks need different flags or credentials.
Background services One agent restarts service used by another.
Package manager cache Usually OK, but install can change local state.
Browser session UI tests may share cookies/storage.
Docker containers Container names and volumes can collide.
Generated artifacts outside repo Agents overwrite outputs.

Therefore:

text
Worktree isolation is filesystem and branch isolation, not full environment isolation.

Для параллельных агентов нужно также планировать environment isolation.

Environment plan для worktree

Для каждого worktree полезно указать:

text
Port:
Database:
Env file:
Test command:
Background services:
Generated outputs:
Cleanup:

Пример:

text
Worktree: ../app-auth-ui
Branch: feature/auth-reset-ui
Port: 3002
Database: not needed, use mocked API
Env file: .env.local copied from template, no secrets committed
Test command: npm test -- ResetPasswordForm
Background services: none
Generated outputs: playwright screenshots in tmp/auth-ui
Cleanup: remove tmp screenshots after review

Для backend:

text
Worktree: ../app-auth-api
Branch: feature/auth-reset-api
Port: 3001
Database: app_auth_api_test
Env file: .env.test
Test command: npm test -- resetPassword.api
Background services: postgres test container
Generated outputs: none
Cleanup: drop app_auth_api_test after task

Если environment не изолирован, параллельность может дать странные failures.

Prompt для агента в worktree

Каждый агент должен знать, что он работает в отдельном worktree и какую task выполняет.

Prompt:

text
You are working in a dedicated Git worktree.

Worktree:
../app-auth-api

Branch:
feature/auth-reset-api

Task:
AUTH-012: Add reset password API endpoint.

In scope:
- backend controller/service
- API integration test

Out of scope:
- UI form
- E2E browser flow
- dependency updates
- reset token data model changes unless blocking

Rules:
- inspect git status before edits;
- keep diff scoped to this task;
- do not touch files owned by other worktrees unless required and explained;
- stop if API contract changes;
- do not commit until asked;
- report changed files and verification evidence.

Для UI worktree:

text
You are working in a dedicated Git worktree.

Branch:
feature/auth-reset-ui

Task:
AUTH-016: Add reset password form using the documented API contract.

Assume API contract:
POST /reset-password
Request: token, newPassword
Responses: success, TOKEN_EXPIRED, TOKEN_ALREADY_USED

Do not modify backend code.
If the contract is insufficient, stop and ask.

Такой prompt предотвращает "я поправил API заодно".

Как запускать несколько агентов

Для каждого агента:

text
1. Создать worktree.
2. Перейти в его directory.
3. Проверить branch/status.
4. Передать агенту task boundary.
5. Запустить agent workflow.
6. Получить diff, tests, final evidence.
7. Сделать commit или PR.
8. Интегрировать в нужном порядке.

Не нужно давать всем агентам один общий prompt "сделайте password reset". Это снова one-shot, только распределенный.

Параллельность должна следовать task graph.

Integration после параллельной работы

Параллельные worktrees не дают итоговую feature автоматически. Их изменения нужно интегрировать.

Варианты:

Strategy Когда подходит
Separate PRs into main Tasks independent and can merge one by one.
Integration branch Нужно собрать несколько branches перед merge в main.
Sequential merge order Есть dependency order: API before UI before E2E.
Rebase each branch on updated main Нужно обновить branch после merge соседних tasks.

Для курса проще:

text
1. Merge/review API branch.
2. Update UI branch from main.
3. Merge/review UI branch.
4. Update E2E branch from main.
5. Run full integration tests.

Или:

text
1. Create integration branch from main.
2. Merge API branch.
3. Merge UI branch.
4. Merge E2E branch.
5. Resolve conflicts.
6. Run integration verification.
7. Open PR from integration branch.

Выбор зависит от команды и размера feature.

Integration branch

Integration branch полезна, когда отдельные branches должны быть проверены вместе до merge.

Пример:

bash
git switch main
git pull
git switch -c integration/password-reset
git merge feature/auth-reset-api
git merge feature/auth-reset-ui
git merge test/auth-reset-e2e

После этого:

bash
npm test -- auth
npm run test:e2e -- password-reset
npm run typecheck

Integration branch не должна становиться местом новой разработки. Ее задача:

  • собрать готовые changes;
  • resolve conflicts;
  • запустить integration verification;
  • подготовить PR или merge plan.

Если во время integration обнаружен bug, лучше исправить его в owning branch или создать отдельную integration-fix task.

Merge conflicts

Worktrees уменьшают смешивание diffs, но не отменяют conflicts.

Conflicts вероятны, если agents:

  • меняют один и тот же файл;
  • меняют рядом стоящие imports;
  • меняют shared types;
  • меняют dependency lockfile;
  • меняют generated clients;
  • меняют snapshots;
  • меняют route configuration;
  • меняют schema/migrations.

Conflict не всегда плохо. Он просто говорит:

text
Git cannot safely decide how to combine these changes.
Human or reviewer agent must inspect.

После conflict resolution обязательно:

  • review resolved files;
  • проверить, не потеряны ли changes одной branch;
  • запустить tests обеих задач;
  • запустить integration tests.

Нельзя считать conflict resolution простой mechanical operation, особенно с agent-generated code.

Conflict risk table

Shared file/type Risk Mitigation
API types UI and backend disagree Freeze contract first, generate client in integration step.
Route config Two features add routes Merge manually, run route tests.
DB migrations Ordering conflicts Name migrations carefully, run migration apply test.
Lockfile Dependency updates collide Separate dependency tasks.
Snapshot files Baseline overwritten Require visual evidence.
Test fixtures Agents alter shared setup Use local fixtures or coordinate fixture owner.
Project config Tooling behavior changes Avoid config changes in parallel feature tasks.
Documentation index Multiple docs tasks edit same table Assign one docs integration task.

Если conflict risk высокий, parallel work может не стоить coordination cost.

Когда worktree не нужен

Worktree полезен, но не обязателен для каждой task.

Не нужен, если:

  • работает один агент;
  • task маленькая и sequential;
  • working tree clean;
  • нет параллельной работы;
  • нет риска смешать user changes;
  • feature требует строгого sequential order;
  • setup cost выше пользы.

Пример:

text
Write one Markdown lecture in one file.

Один обычный branch и diff вполне достаточны.

Worktree особенно полезен, когда:

  • нужно запустить несколько agents;
  • есть dirty worktree, который нельзя трогать;
  • нужно сравнить альтернативные approaches;
  • нужно держать long-running branch рядом с текущей работой;
  • нужно запустить разные dev servers или tests параллельно;
  • нужно изолировать spike от implementation.

Worktrees для альтернативных подходов

Иногда не нужно параллелить feature tasks, а нужно сравнить два solutions.

Пример:

text
Option A: enforce Plan Mode in prompt/rule layer
Option B: enforce Plan Mode in tool permission layer

Можно создать:

bash
git worktree add -b spike/plan-mode-prompt ../app-plan-mode-prompt main
git worktree add -b spike/plan-mode-tool-gate ../app-plan-mode-tool-gate main

Каждый агент исследует один approach.

Важно:

  • spike branches должны быть явно помечены;
  • не merge оба approaches случайно;
  • после выбора approach создать clean implementation task;
  • spike output может быть design note, not production diff.

Worktrees хорошо поддерживают exploration, если вы не путаете exploration с deliverable.

Worktrees и checkpoints

Worktree и checkpoint решают разные задачи.

Механизм Для чего
Worktree Изолировать рабочую директорию и branch для task/agent.
Commit Сохранить reviewable change в Git history.
Checkpoint Сохранить промежуточное состояние agent session/edits.
Stash Временно убрать local changes.

Worktree не заменяет commit.

Checkpoint не заменяет worktree.

Пример:

text
Agent works in ../app-auth-api.
Inside that worktree, agent tool may create checkpoints after each edit.
Final useful state still becomes Git commit on feature/auth-api.

Следующий урок будет как раз про checkpoints.

Cleanup после worktree

После merge или отказа от task worktree нужно убрать.

Проверка:

bash
cd ../app-auth-api
git status --short
git branch --show-current

Если все committed/merged или changes больше не нужны:

bash
cd ../ai-agent-development-101
git worktree remove ../app-auth-api
git worktree prune

Если worktree dirty, git worktree remove может отказать. Это хорошо: Git защищает local changes.

Не удаляйте directory вручную без понимания состояния. Сначала проверьте:

bash
git worktree list

И решите:

  • commit;
  • move patch;
  • discard with approval;
  • keep worktree;
  • remove.

Worktree safety rules

text
1. One worktree per task branch.
2. One agent writes in one worktree.
3. Do not let two agents write same branch.
4. Do not create worktrees inside the main repo by default.
5. Each worktree has explicit task boundary.
6. Each worktree has verification commands.
7. Shared environment must be planned.
8. Integration happens intentionally, not by copying files.
9. Cleanup only after status is understood.
10. Worktree does not replace tests, review or commits.

Эти правила простые, но сильно снижают хаос в multi-agent development.

Пример 1. Worktree plan для backend/ui/tests

Feature:

text
Password Reset

Base:

text
main

Worktree plan:

Worktree Branch Agent Task Verification
../app-auth-api feature/auth-reset-api Agent A API endpoint API integration tests
../app-auth-ui feature/auth-reset-ui Agent B Reset form Component tests
../app-auth-e2e test/auth-reset-e2e Agent C Browser flow E2E reset test

Conflict risks:

Risk Mitigation
UI depends on API response shape Freeze API contract in design doc.
E2E depends on API + UI Write E2E after API/UI merge or use mock until integration.
Shared test fixtures Assign fixture owner or keep task-local fixtures.
Route config changes Merge UI branch before E2E.

Merge order:

text
1. feature/auth-reset-api
2. feature/auth-reset-ui
3. test/auth-reset-e2e
4. integration verification

Пример 2. Worktree для dirty main

Ситуация:

text
Main worktree:
- user is editing docs
- urgent bug fix needed in auth

Status:

text
 M docs/course-outline.md
 M guide/content_plan.md

Не нужно делать stash автоматически. Можно создать отдельный worktree:

bash
git worktree add -b fix/auth-permission ../app-fix-auth-permission main
cd ../app-fix-auth-permission

Теперь urgent fix идет рядом:

text
../ai-agent-development-101
  user docs work

../app-fix-auth-permission
  agent bug fix branch

После fix:

  • review diff in bug fix worktree;
  • run tests;
  • commit;
  • PR/merge;
  • remove worktree;
  • user docs work в main worktree не тронут.

Пример 3. Worktree для reviewer agent

Reviewer agent лучше запускать в clean state.

Scenario:

text
Implementer branch:
feature/auth-reset-api

Создать review worktree:

bash
git worktree add ../app-review-auth-api feature/auth-reset-api
cd ../app-review-auth-api

Reviewer prompt:

text
Review this branch as a reviewer agent.

Inputs:
- task spec: AUTH-012
- diff against main
- relevant code/tests

Do not edit files unless explicitly asked.
Focus on:
- bugs;
- missing tests;
- scope creep;
- security issues;
- verification gaps.

Почему отдельный worktree полезен:

  • reviewer не мешает implementer;
  • можно запускать tests независимо;
  • review идет по branch state;
  • не смешиваются local edits.

Если reviewer должен предложить patch, лучше сделать отдельную branch или явно разрешить edits.

Пример 4. Worktree для AI Agent evals

Task:

text
AGENT-WF-01:
Plan Mode must not edit files.

Можно параллелить:

Worktree Task
../app-agent-policy Implement mode guard
../app-agent-evals Add workflow evals
../app-agent-docs Document Plan/Act policy

Но есть risk:

text
evals depend on policy names and tool trace format.

Поэтому нужен shared contract:

text
Mode:
plan

Forbidden tools:
- apply_patch
- file write commands
- dependency install
- migration execution

Expected output:
- implementation plan
- no claim of completion

Если contract не согласован, сначала отдельная sequential task:

text
Define Plan Mode tool policy contract.

Только потом worktrees.

Prompt-шаблоны для worktree orchestration

Prompt 1. Составить worktree plan

text
Create a Git worktree plan for this feature.

Input:
<feature/task graph>

Output:
- base branch;
- candidate parallel tasks;
- worktree path;
- branch name;
- assigned agent role;
- expected files;
- verification commands;
- dependencies;
- conflict risks;
- merge order;
- tasks that must remain sequential.

Prompt 2. Запустить агента в worktree

text
You are working in a dedicated Git worktree.

Worktree path:
<path>

Branch:
<branch>

Task:
<task>

Rules:
- inspect git status before edits;
- work only on this task;
- do not modify files assigned to other worktrees;
- do not change shared contracts without stopping;
- run verification for this task;
- report diff summary and evidence;
- do not commit until asked.

Prompt 3. Проверить worktree перед integration

text
Review this worktree before integration.

Check:
- branch name;
- git status;
- diff against base;
- whether changed files match task;
- tests/evals run;
- not-run checks;
- residual risks;
- conflict risk with other branches.

Do not merge yet.

Prompt 4. Integration review

text
Integrate these branches in order:
1. <branch A>
2. <branch B>
3. <branch C>

For each merge:
- inspect diff;
- resolve conflicts carefully;
- run tests relevant to both merged branches;
- stop if public contract changes unexpectedly.

After all merges:
- run integration verification;
- report conflicts, resolutions, commands/results and residual risks.

Команды в одном сценарии

Пример setup:

bash
git switch main
git pull
git worktree add -b feature/auth-reset-api ../app-auth-api main
git worktree add -b feature/auth-reset-ui ../app-auth-ui main
git worktree add -b test/auth-reset-e2e ../app-auth-e2e main
git worktree list

Agent A:

bash
cd ../app-auth-api
git status --short

Agent B:

bash
cd ../app-auth-ui
git status --short

Agent C:

bash
cd ../app-auth-e2e
git status --short

После работы:

bash
cd ../app-auth-api
git diff --stat main...HEAD

Интеграция:

bash
cd ../ai-agent-development-101
git switch main
git pull
git switch -c integration/password-reset
git merge feature/auth-reset-api
git merge feature/auth-reset-ui
git merge test/auth-reset-e2e

Cleanup:

bash
git worktree remove ../app-auth-api
git worktree remove ../app-auth-ui
git worktree remove ../app-auth-e2e
git worktree prune

Команды показаны как workflow sketch. В реальном проекте merge может идти через PRs.

Review checklist для каждого worktree

Перед commit/PR из worktree:

text
[ ] Branch name matches task
[ ] git status понятен
[ ] Diff focused on one task
[ ] Changed files match expected scope
[ ] No unrelated refactor
[ ] No dependency/lockfile change without approval
[ ] Tests/evals run for this task
[ ] Not-run checks documented
[ ] Shared contract changes documented
[ ] Conflict risks reported
[ ] Commit message tied to task

Перед integration:

text
[ ] Merge order defined
[ ] All branches have clean commits
[ ] Base branch updated
[ ] API/contracts stable
[ ] Conflict-prone files identified
[ ] Tests from each task known
[ ] Integration tests planned
[ ] Rollback plan exists

Типичные ошибки

Ошибка Симптом Исправление
Несколько агентов в одной working tree Mixed diff, lost edits, unclear ownership One worktree per agent/task.
Worktree без task boundary Агент меняет все подряд Передать scope, expected files, stop conditions.
Параллелят dependent tasks UI ломается из-за меняющегося API Сначала freeze contract или выполнить sequential task.
Один branch в нескольких местах Confusing branch ownership One branch per worktree.
Shared DB без изоляции Tests влияют друг на друга Separate test DB/schema/container.
Shared port Dev server conflict Назначить ports заранее.
Dependency update в одной ветке ломает другие Inconsistent environment Separate dependency task and rebase/update branches.
Integration без tests Branches merge, feature не работает вместе Run integration verification.
Conflict resolution вслепую Потеря changes одной branch Review resolved files and run both test sets.
Worktree удален вручную Git metadata stale Use git worktree remove and prune.
Worktree воспринимается как checkpoint Нет reviewable commit Commit useful result separately.

Практика 1. Создать worktree plan

Feature:

text
Password Reset

Task graph:

text
AUTH-010: reset token repository
AUTH-012: request reset endpoint
AUTH-013: reset password endpoint
AUTH-016: reset password UI form
AUTH-020: password reset E2E flow
AUTH-021: docs for reset token states

Заполните:

Task Parallel-ready? Worktree Branch Agent Dependencies Verification
AUTH-010
AUTH-012
AUTH-013
AUTH-016
AUTH-020
AUTH-021

Укажите:

text
Base branch:
Integration strategy:
Merge order:
Conflict risks:
Environment risks:

Практика 2. Найти tasks, которые нельзя параллелить

Список tasks:

text
1. Change reset token DB schema.
2. Implement API using the new schema.
3. Build UI using documented API contract.
4. Add E2E test for full reset flow.
5. Update password policy rules.
6. Update docs table for reset token states.

Ответьте:

  • какие tasks должны идти sequential;
  • какие можно делать в worktrees;
  • какой shared contract нужен до UI;
  • какая task должна быть integration point;
  • какие tasks лучше вынести из feature scope.

Возможный вывод:

text
Sequential:
1 -> 2, because API depends on schema.
4 after 2 and 3, because E2E depends on API + UI.

Parallel-ready:
3 can start after API contract is documented.
6 can start after token state semantics are agreed.

Out of scope:
5 password policy rules, unless feature explicitly includes it.

Практика 3. Написать prompt для агента в worktree

Worktree:

text
../app-agent-evals

Branch:

text
test/bugfix-agent-regression-flow

Task:

text
BUGAGENT-03:
Bug-fix agent must add failing regression test before fix when practical.

Напишите prompt, где будут:

  • worktree path;
  • branch;
  • in scope;
  • out of scope;
  • expected files;
  • verification;
  • stop conditions;
  • final evidence format.

Checklist: готов ли task к worktree

text
[ ] Task маленькая
[ ] Task имеет one change
[ ] Branch name выбран
[ ] Worktree path выбран
[ ] Base branch указан
[ ] Dependencies понятны
[ ] Shared contracts стабильны
[ ] Expected files названы
[ ] Verification commands названы
[ ] Environment risks учтены
[ ] Integration order известен

Критерии готовности

После урока студент должен уметь:

  • объяснить, что такое Git worktree;
  • отличить branch от worktree;
  • создать worktree для новой branch;
  • посмотреть список worktrees;
  • удалить worktree после завершения;
  • решить, какие tasks parallel-ready;
  • составить worktree plan;
  • дать агенту task boundary внутри worktree;
  • учесть shared environment risks;
  • спланировать integration branch или PR sequence;
  • распознать merge conflict risks;
  • объяснить, почему worktree не заменяет tests, commits и review.

Краткое резюме

Git worktree - это отдельная рабочая директория для отдельной branch, подключенная к тому же repository.

В agentic development worktrees нужны, чтобы:

  • изолировать параллельных агентов;
  • не смешивать diffs;
  • защитить dirty user work;
  • запускать independent tasks рядом;
  • сравнивать alternative approaches;
  • готовить clean review для каждой branch.

Главная цепочка:

text
Task graph
-> parallel-ready tasks
-> one worktree per task
-> one agent per worktree
-> one change per branch
-> integration verification

Worktree не заменяет task decomposition. Он работает только тогда, когда tasks уже разделены и имеют понятные boundaries.

Worktree также не изолирует everything: ports, databases, caches, .env, containers и browser sessions нужно планировать отдельно.

Вопросы для самопроверки

  1. Чем branch отличается от worktree?
  2. Почему нельзя безопасно запускать нескольких агентов в одной working tree?
  3. Какие признаки говорят, что task parallel-ready?
  4. Какие shared environment risks остаются даже при использовании worktrees?
  5. Когда лучше использовать integration branch?

Что дальше

В следующем уроке мы разберем checkpoints. Worktree изолирует рабочую директорию и branch, commit сохраняет reviewable change, а checkpoint помогает вернуть промежуточное состояние agent session. Важно понять, где checkpoint действительно полезен, а где он создает ложное чувство безопасности и не заменяет нормальный Git workflow.

Обновлено 03.10.2026