Subagents в Claude Code: когда делегировать и как запустить агентов параллельно
Один диалог с Claude Code хорош для маленькой задачи. Но когда работа растёт — нужно собрать три независимых ресурса, отревьюить чужой код свежим взглядом, параллельно обработать несколько модулей — один диалог начинает мешать сам себе. Контекст засоряется, роли путаются, задачи выстраиваются в очередь, хотя могли бы идти параллельно. Subagents в Claude Code решают именно эти три проблемы — и в этой статье разберём, как они устроены, когда их применять и как запустить несколько агентов одновременно без конфликтов.
Что такое subagent и чем он отличается от основного диалога
Subagent — это отдельный экземпляр Claude с изолированным контекстом, своим набором инструментов и узкой ролью, заданной описанием. Основной диалог выступает оркестратором: ставит задачу, получает итог и движется дальше. Subagent — исполнитель, который работает в своём окне.
Ключевое свойство — изоляция контекста. Subagent читает файлы, грепает код, ошибается и переделывает — всё это остаётся в его окне. В основной диалог возвращается только сжатый результат. Главный контекст остаётся чистым.
Агент живёт в файле .claude/agents/<name>.md в корне проекта (либо в ~/.claude/agents/ для личных агентов, доступных во всех проектах). Минимальная анатомия такого файла:
---
name: resource-builder
description: Собирает NestJS-ресурс CoffeeCRM (module + controller + service + entity + DTO) по конвенциям проекта. Использовать, когда нужно добавить новый CRUD-ресурс в backend.
tools: Read, Edit, Write, Bash, Grep
---
Ты — инженер, собирающий ресурсы строго по конвенциям проекта.
Читай CLAUDE.md и существующий ресурс menu/ как образец структуры.
НЕ трогай app.module.ts — регистрацию делает оркестратор отдельным шагом.
Верни кратко: список созданных файлов и какие эндпоинты появились.
Обязательны только name и description. Поле description — это триггер: Claude Code смотрит на него, чтобы решить, кого позвать. Хорошее описание отвечает на вопрос «КОГДА это использовать», а не просто называет агента.
Технически делегирование выполняется инструментом Task (в новых версиях — Agent): основной агент вызывает его, передавая задачу и тип агента. Точный синтаксис меняется между версиями — сверяйтесь с актуальной документацией через Context7 MCP.
Три сигнала, что задачу пора делегировать
Делегирование — не бесплатная операция: каждый subagent стартует с нуля и тратит токены на восстановление контекста. Поэтому сначала спросите себя по трём критериям.
Изоляция контекста. Задача нагенерит много шума (длинные логи, поиск по большой кодовой базе, многошаговые правки), который не нужен в основном диалоге? Делегируйте. Весь этот шум осядет в контексте subagent, а вы получите только итог.
Узкая роль. Нужен «другой режим мышления»? Ревьюер кода и автор кода — это разные режимы. Ревьюер с суженным набором инструментов (только чтение, без Write) смотрит на код свежим взглядом и не защищает его. В одном диалоге эти роли мешают друг другу.
Параллелизм. Есть несколько независимых задач, которые можно делать одновременно? Делегируйте каждую отдельному агенту — они пойдут параллельно.
Если ни одного критерия нет и контекст уже под рукой — ведите задачу сами. Например, прочитать один файл и поправить опечатку: overhead на запуск агента не окупится.
Подробнее о базовых принципах делегирования — в статье «Что и когда делегировать AI-агенту».
Параллельный запуск: почему нельзя просто запустить пятерых сразу
Соблазн очевиден: агенты независимы, запустим пятерых в одной рабочей директории — всё соберётся за один проход. Так делать нельзя.
Все агенты в одной рабочей копии видят одни и те же файлы и пишут в одну копию git. Два агента одновременно дописывают строку в app.module.ts — и затирают работу друг друга. Даже если их файлы разные, общая рабочая копия создаёт гонку состояний: один агент делает git add . и захватывает чужие недописанные файлы.
Нужна физическая изоляция: каждому агенту — своя рабочая копия, своя папка, своя ветка.
git worktree: один репозиторий, несколько рабочих копий
git worktree — встроенная возможность git иметь несколько рабочих копий одного репозитория в разных папках. История общая, а рабочие файлы у каждой копии свои. Это не разные репозитории — один репозиторий с несколькими «рабочими столами».
На практике: создаёте три worktree на трёх ветках от основной (git worktree add <путь> -b <ветка>), в каждом запускаете Claude Code с agentom и своим заданием. Агенты работают физически изолированно и не могут затереть работу друг друга.
Что это даёт сверх параллелизма:
- Локализация сбоев. Если агент C нагенерил мусор — мусор только в его worktree и его ветке. Остальные две ветки чистые. Откатываете один worktree, не трогая остальные.
- Чистое сведение. Ветки сливаются осознанно, каждый вклад виден отдельно.
Worktree — это локально и бесплатно, часть стандартного git.
Паттерн «раздели → распараллель → сведи»
Разберём на примере CoffeeCRM (Next.js + NestJS), сквозного проекта курса. Нужно собрать пять сущностей backend: Client, Order, OrderItem, Employee, Shift.
Шаг 1 — Раздели на независимые куски. Главное правило: задачи не должны трогать одни и те же файлы. Разбиваем по смысловой связи:
- Worktree A: Client — самостоятельная сущность.
- Worktree B: Order + OrderItem — позиция без заказа бессмысленна, держим вместе.
- Worktree C: Employee + Shift — смена без сотрудника бессмысленна, держим вместе.
Шаг 2 — Распараллель. Каждому куску — свой worktree, своя ветка, один и тот же агент resource-builder. Каждому передаём задание с явным «НЕ трогай app.module.ts»:
# В worktree A (ветка feat/client):
Собери ресурс Client (name, phone, email, loyaltyPoints). Не трогай app.module.ts.
# В worktree B (ветка feat/order):
Собери ресурсы Order и OrderItem (Order: clientId, status, total; OrderItem: orderId, menuItemId, qty, price). Не трогай app.module.ts.
# В worktree C (ветка feat/employee):
Собери ресурсы Employee и Shift (Employee: name, role; Shift: employeeId, startAt, endAt). Не трогай app.module.ts.
Три агента работают параллельно. Три ресурса собираются примерно за время одного.
Шаг 3 — Сведи. Возвращаемся в основную ветку module-4, сливаем три ветки. Поскольку агенты не трогали общие файлы — слияние проходит без конфликтов.
Затем отдельным, не параллельным шагом регистрируем модули:
// backend/src/app.module.ts
@Module({
imports: [
// ...существующее
ClientModule,
OrderModule, // включает OrderItem
EmployeeModule, // включает Shift
],
})
export class AppModule {}
Железное правило: общий слой никогда не собирается параллельно. app.module.ts, корневой роутинг, общие провайдеры — точка встречи всех ресурсов. Параллельные правки здесь гарантированно дадут конфликт. Именно поэтому в промпте каждого агента стоит запрет трогать этот файл.
После сведения удаляем отработавшие worktree (git worktree remove), чтобы не засорять проект.
Как действовать при сбое
Изоляция решает и задачу отказоустойчивости. Если агент C нагенерил кривой код:
- Ветки A и B чистые — их не трогаем.
- Откатываем только ветку
feat/employee(или удаляем worktree и создаём заново). - Перезапускаем только агента C.
Цена ошибки — один кусок, а не вся работа. Это главный практический аргумент за worktree при параллельной работе агентов.
Что дальше
Subagents — это следующий уровень после базовой работы с Claude Code. Сначала стоит разобраться, что такое Claude Code и как устроен цикл агента, а также понять роль плагинов и MCP — agenty умеют переиспользовать их инструменты напрямую через поле skills в frontmatter файла агента.
Паттерн «раздели → распараллель → сведи» переносится на любой стек: режьте по независимым модулям, давайте каждому свой worktree, общий слой (DI-контейнер, роутер, манифест зависимостей) собирайте отдельным шагом после сведения.
Если хотите освоить это системно — от создания первого агента до оркестрации и сборки переиспользуемых плагинов на реальном проекте — это весь Модуль 4 полного курса по Claude Code.
Курс
Освойте Claude Code системно
6 модулей, реальный fullstack-проект до деплоя, свои skills, MCP и агенты.
Смотреть программу курса