Параллельная работа агентов упирается не в модель, а в файловую систему. Два агента в одном рабочем каталоге неизбежно наступают друг другу на правки, и никакая аккуратность формулировок это не лечит: они читают файл, думают над ним несколько секунд и записывают результат, не зная, что за это время файл изменился. Рабочее дерево git решает задачу физически: отдельный checkout со своими файлами, своей веткой и своими зависимостями. Именно поэтому параллельность начинается с деревьев, а не с количества открытых чатов.
Наивная схема - запустить двух агентов в одной папке и надеяться, что они поделят файлы. Ломается это даже без конфликтов git: один правит контракт, второй одновременно подстраивается под старую версию, и в итоге получается семантический конфликт, который система контроля версий не увидит. Формально всё слилось, фактически поведение сломано - и разбирать это дороже, чем изначально развести задачи по деревьям. Git сравнивает строки, а не смыслы, и там, где две правки не пересеклись текстуально, он честно сообщит об успехе.
Cursor даёт деревья и через интерфейс окна агентов, и через набор команд в редакторе: создать дерево под задачу, применить результат, удалить дерево. Отдельный приём - запустить одну и ту же задачу на нескольких моделях, где каждый кандидат работает в своём дереве. Это честный способ сравнить подходы, не смешивая их: результаты видны рядом, а не наслаиваются друг на друга в общем каталоге. Ценность здесь не в том, что одна модель окажется лучше вообще, а в том, что на конкретной задаче видно несколько решений сразу и есть из чего выбирать.
Важная деталь про сравнение кандидатов: победитель не сливается сам. После выбора нужно просмотреть изменения, закоммитить или применить дерево вручную. Это не недоработка, а осознанная граница - выбор из нескольких вариантов остаётся человеческим решением, а не автоматическим действием по итогам сравнения. Автоматика здесь и не смогла бы решить корректно: критерий выбора обычно лежит вне кода, в том, какой подход вы готовы поддерживать дальше.
Полезно один раз увидеть настройку нового дерева. Ниже - конфигурация с командами подготовки для разных платформ. Cursor читает её сначала из самого дерева, затем из корня проекта; в значении может быть как массив команд, так и путь к скрипту рядом с конфигурацией. Порядок чтения здесь важен: он позволяет дереву под конкретную задачу подготавливаться иначе, чем проект по умолчанию, не трогая общую конфигурацию.
У изоляции есть цена, и её стоит осознавать заранее. Каждое дерево - это отдельный набор файлов и отдельная установка зависимостей, то есть место на диске и время на подготовку. Отсюда соблазн подсунуть зависимости символической ссылкой из основного каталога. Официальная рекомендация в другом: использовать быстрый пакетный менеджер и честно ставить зависимости заново. Причина в том, что общая ссылка возвращает ровно то, ради чего заводили дерево, - общее изменяемое состояние: один агент пересобирает пакет, другой в этот момент видит его наполовину обновлённым, и сбои получаются такие, что искать их приходится не в коде.
И отдельное предупреждение: скрипты подготовки - это исполняемое содержимое проекта. Они запускаются при создании дерева, и приехали они вместе с репозиторием. Значит, к ним применяется то же правило, что и к любой другой исполняемой конфигурации: сначала прочитать, потом разрешить. Незнакомый репозиторий с готовым скриптом подготовки - удобство ровно до тех пор, пока вы не посмотрели, что в нём.
Есть и эксплуатационная сторона. Деревья накапливаются, поэтому Cursor умеет удалять старые по общему лимиту на машину, и значение по умолчанию невелико. Под уборку могут попасть и внешние деревья. Вывод практический: не держите незакоммиченный важный результат в дереве, которое считаете временным, - либо коммитьте, либо явно фиксируйте состояние. Автоматическая уборка не спрашивает, дорог ли вам этот черновик.
Остаётся вопрос, который деревья не решают: как поделить работу. Изоляция снимает конфликты файлов, но не конфликты решений, поэтому задачи разводят по владению - один агент отвечает за миграцию схемы, другой за экран, который эту схему потребляет, и никто не трогает чужую границу. Признак, что владение поделено плохо, узнаётся по характерной картине: в каждом дереве по отдельности тесты зелёные, а после слияния обеих веток падают. Это и есть семантический конфликт в чистом виде, и лечится он не повторным слиянием, а решением о том, чья версия контракта считается основной.
Типичные провалы параллельной работы предсказуемы. Пустить двух агентов на один контракт и получить семантический конфликт без конфликта git. Ждать, что победитель сравнения сольётся сам. Подменить установку зависимостей символической ссылкой и получить странные сбои сборки. Разрешить исполнение чужого скрипта подготовки, не прочитав его. И оставить незакоммиченную работу в дереве, которое удалит автоматическая уборка.
/worktree почини падающие тесты авторизации и обнови текст на экране входа
/best-of-n sonnet,gpt,composer почини нестабильный тест выхода из аккаунта
# кандидаты идут в разных деревьях; слияние победителя - ручное решение// .cursor/worktrees.json - подготовка нового дерева
{
"setup-worktree-unix": ["pnpm install", "pnpm run build"],
"setup-worktree-windows": ["pnpm install", "pnpm run build"]
}
// читается сначала из дерева, затем из корня проекта; это исполняемое содержимое - сначала прочитать