# Fork агента как субагент
> [!summary] Суть
> При спавне субагента через `Agent` tool можно выбрать тип `subagent_type: "fork"` — тогда агент запускает **форк самого себя**. В отличие от обычного субагента (который стартует с **пустого** буфера и видит только переданный `prompt`), форк **наследует полный контекст разговора родителя** на момент запуска. Форк **всегда** идёт на модели родителя — параметр `model` для него **игнорируется**.
---
## Обычный субагент vs fork
ghj
| | Обычный субагент | Fork (`subagent_type: "fork"`) |
| :--- | :--- | :--- |
| Контекст разговора родителя | ❌ не видит (фрешевый буфер) | ✅ наследует полностью на момент запуска |
| Что нужно класть в `prompt` | весь нужный контекст вручную | только саму задачу — историю форк уже знает |
| Модель | из конфигурации агента / унаследованная | **всегда модель родителя**; `model` игнорируется |
| Возврат родителю | только финальное сообщение | только финальное сообщение |
| Вывод инструментов | остаётся внутри субагента | остаётся внутри форка |
> [!note] «Fork» здесь — это не форк сессии
> Не путать с [[Форк сессии Claude Code]] (`--fork-session`): то — копия **сессии** в новый `.jsonl` с новым ID на уровне CLI. А `subagent_type: "fork"` — это форк **agent context'а** внутри одной сессии (см. [[Session ID одинаковый у родительского агента и его субагентов]]). Session ID при этом общий.
---
## Зачем это нужно
Главная ценность форка — **изолировать «шумную» работу, не теряя контекст и не засоряя основное окно**:
- Прогнать объёмный поиск, чтение множества файлов, трол логов, широкий `grep` — и вернуть в основной разговор **только выводы**, а не свалку из содержимого файлов. Промежуточный мусор остаётся в буфере форка.
- При этом, в отличие от обычного субагента, **не надо вручную пересказывать контекст** в `prompt` — форк уже видит всю историю родителя.
Правило выбора:
- Нужно «**я, но с полным контекстом**, чтобы разгрести шумную работу и вернуть итог» → `fork`.
- Нужен **исполнитель с другой/дешёвой моделью или специализированный** (Explore, Plan, кастомный) → обычный субагент, контекст передаётся явно через `prompt`.
---
## Как запустить
Запускает форк сам агент (ассистент) через `Agent` tool. Минимальный вызов:
```json
{
"subagent_type": "fork",
"description": "краткое описание 3-5 слов",
"prompt": "что должен сделать форк"
}
```
Пользователь инициирует это словами — «**форкни себя** и разбери логи, дай только итог», «прогони поиск **форком**».
> [!tip] `model` для форка не задавать
> Для `fork` переопределение модели игнорируется — форк всегда на модели родителя. Если нужна другая модель, это уже сценарий **обычного** субагента, а не форка.
---
## Ограничения и подводные камни
- **Запуск в фоне:** мне возвращается только финальное сообщение форка; вывод его инструментов в мой контекст не попадает.
- **Вложенность бессмысленна:** если агент сам уже является форком — форкать дальше не нужно, задачу надо выполнять напрямую. На максимальной глубине вложенности субагент вообще теряет доступ к запуску агентов.
- **Race conditions на файлах:** несколько форков, пишущих в один файл параллельно, конфликтуют (last-write-wins). Для параллельной правки нужна изоляция (отдельный git worktree).
- **Снимок на момент запуска:** форк наследует историю **до точки спавна**; дальнейшие сообщения родителя в форк уже не доезжают.
---
## Смежная механика: fork как оптимизация токенов
В сторонних разборах «fork субагента» иногда описывают **другой** механизм — через переменную окружения `CLAUDE_CODE_FORK_SUBAGENT=1`. Там акцент не на наследовании истории, а на **prompt caching**: параллельные субагенты переиспользуют закэшированный системный промпт родителя, что резко снижает стоимость в токенах. Срабатывает только когда в вызове агента **не указаны** ни `model`, ни явный `subagent_type`. Это смежная/иная реализация и не тождественна явному `subagent_type: "fork"` в `Agent` tool — относиться к ней стоит как к историческому/смежному контексту, а не к гарантии текущего поведения.
---
## Быстрая шпаргалка
| Хочу | Делаю |
| :--- | :--- |
| Копию себя с полным контекстом для шумной работы | `subagent_type: "fork"` |
| Исполнителя с другой моделью | обычный субагент + контекст в `prompt` |
| Специализированную роль (Explore/Plan/кастом) | обычный субагент нужного типа |
| Параллельную правку файлов без конфликтов | субагенты с изоляцией (worktree) |
---
## Источники
- Спецификация `Agent` tool в Claude Code (актуальное поведение: форк наследует полный контекст разговора и всегда идёт на модели родителя, `model` игнорируется).
- [Create custom subagents — Claude Code Docs](https://code.claude.com/docs/en/sub-agents)
- [How Claude Code works — Resume or fork sessions](https://code.claude.com/docs/en/how-claude-code-works)
- [Fork Subagents in Claude Code — Build This Now](https://www.buildthisnow.com/blog/guide/mechanics/claude-code-fork-subagent) (механика через `CLAUDE_CODE_FORK_SUBAGENT=1`)
- [Agent as a Tool Call: Claude Code's Fork-Exec Pattern — DEV Community](https://dev.to/eyesofish/agent-as-a-tool-call-claude-codes-fork-exec-pattern-n)