Как только задач становится больше одной, встаёт вопрос параллельной работы без конфликтов, и базовый механизм здесь - git worktree. Worktree даёт отдельный checkout, свою ветку и рабочий каталог при общей объектной базе git. Это лучшая основа для параллельных изменений именно потому, что агенты не редактируют один и тот же набор файлов: у каждого своё дерево, и правки одного физически не пересекаются с правками другого.
Создают worktree флагом --worktree или -w, в том числе прямо по номеру pull request. По умолчанию он появляется под .claude/worktrees/<name> на ветке worktree-<name>, а базу задаёт worktree.baseRef: fresh берёт remote default branch (чистое дерево под remote), head - текущий локальный HEAD с вашими незапушенными коммитами. Worktree - это свежий checkout только отслеживаемых файлов, поэтому dev-окружение в нём (зависимости, setup) инициализируют заново.
Отдельная тонкость - файлы, игнорируемые git, в worktree сами не появляются. Для них есть .worktreeinclude: он копирует только те файлы, что одновременно совпали с шаблоном и являются gitignored, - например, локальный .env. Правило безопасности простое: секреты копируют только когда это действительно нужно и когда путь защищён sandbox и permissions. Бездумно перенести .env во все worktrees - значит размножить секрет по копиям репозитория.
Полезно один раз увидеть настройку worktree целиком. Ниже - baseRef (с чего ветвить), sparsePaths и symlinkDirectories для большого репозитория и напоминание про .worktreeinclude. К этой форме возвращаются, заводя параллельную работу: fresh даёт чистое дерево под remote, head несёт незапушенные коммиты, sparsePaths оставляет на диске только нужные каталоги через git sparse-checkout, symlinkDirectories не копирует тяжёлые общие папки вроде node_modules, а gitignored-файлы вроде .env переносит .worktreeinclude.
Фоновые сессии выносят работу из-под вашего внимания. Их запускают из интерактива командой /background или из shell флагом --background, а список открывают через claude agents (в том числе --json для машинного разбора). Управляют ими набором команд: attach подключается, logs показывает вывод, stop останавливает, respawn перезапускает, rm убирает job и безопасно созданный worktree, когда это возможно. Транскрипт при этом остаётся доступным для возобновления.
Agent view - это единый пульт фоновых сессий. claude agents показывает их состояния: working, blocked, done, failed, stopped. Особенно полезно поле waitingFor в JSON: оно объясняет, чем именно заблокирована сессия - permission prompt, нужен ввод, sandbox-запрос, запрос воркера или диалог. Отсюда рождается практичный мониторинг: одним jq-запросом можно вытащить все заблокированные сессии и понять, что каждая ждёт, не открывая их по одной.
Предотвращение конфликтов сводится к нескольким правилам. Одна задача, меняющая файлы, получает собственный worktree; research-only субагент может работать и без него. Двум агентам не назначают одни и те же файлы. Слияние выполняет человек или отдельная интеграционная задача после тестов. Перед удалением worktree проверяют коммиты и untracked-файлы. И symlink'ят только тяжёлые общие каталоги вроде node_modules через symlinkDirectories, но не записываемые исходники - общий writable-source между worktrees ломает ту изоляцию, ради которой всё затевалось.
Инженерный вывод про параллельность прост: она оправдана только там, где работа реально независима. Стая агентов - это множитель расхода, и запускать её ради задачи, которая линейно решается одним проходом, дороже и глупее. Типичные провалы - два агента на одних файлах, symlink записываемых каталогов и удаление worktree без проверки незакоммиченного. Давайте каждой меняющей файлы задаче своё дерево, а параллельте только то, что действительно параллелится.
{
"worktree": {
"baseRef": "head",
"sparsePaths": ["services/api"],
"symlinkDirectories": ["node_modules"]
}
}
// baseRef: "fresh" (remote default branch) | "head" (локальный HEAD)
// sparsePaths: checkout только этих каталогов + root-файлы (git sparse-checkout) - быстрее в монорепо
// symlinkDirectories: symlink больших общих каталогов (node_modules) вместо копии на диск
// .worktreeinclude копирует gitignored-файлы (.env); секреты - только при защите sandbox/permissions# Фоновые сессии и agent view
claude --background "исследуй flaky test и подготовь отчёт"
claude agents --json | jq '.[] | select(.state=="blocked") | {id,name,waitingFor}'
# управление: attach | logs | stop | respawn | rm <id>