Лекция 4
Проблема единого контекста, аналогия с командой
Жизненный цикл, наследование, параллельность
Claude Code, Roo Code, Kilo Code, OpenCode
Паттерны: fan-out, pipeline, iterative
Автоматизация через хуки жизненного цикла
Типичные ошибки и как их избежать
Чеклист, домашнее задание
Контекстное окно конечно. Делегирование сохраняет фокус и ускоряет работу.
Контекстное окно агента — ресурс конечный. У Claude Sonnet — 200K токенов, но эффективность падает задолго до лимита.
Решение: разделить работу на несколько агентов с чистым контекстом.
| Один агент | Команда субагентов | |
|---|---|---|
| Контекст | Один на всё | У каждого свой, чистый |
| Параллельность | Последовательно | Одновременно |
| Фокус | Размывается | Сохраняется |
| Отказоустойчивость | Сбой = всё заново | Сбой одного не ломает остальных |
Один разработчик может написать фичу, тесты и документацию — но последовательно, удерживая всё в голове. Команда из трёх специалистов работает параллельно: каждый сфокусирован на своей части.
Человек сам разбивает задачу на подзадачи и запускает агента на каждую.
Агент сам решает, когда задача слишком велика, и порождает субагентов.
Ручная декомпозиция: Автоматическая делегация:
Человек Человек
├── Задача 1 → Агент A └── "Сделай фичу X"
├── Задача 2 → Агент B │
└── Задача 3 → Агент C ▼
Родительский агент
Человек собирает результат ├── Субагент 1 (исследование)
├── Субагент 2 (реализация)
└── Субагент 3 (тесты)
Родитель собирает результат
Отдельный процесс с чистым контекстом. Получает задачу — возвращает результат.
Родитель формулирует задание
Чистый контекст + tools + rules
Автономная работа: чтение, вызовы tools, решения
Только результат, не весь контекст
Родитель работает дальше
Родитель не следит за процессом работы субагента. Он отправляет задачу и ждёт результат. Это асинхронная модель — как задача в трекере, а не парное программирование.
| Что | Наследуется? | Комментарий |
|---|---|---|
| Rules | Обычно да | Субагент работает в том же проекте |
| Permissions | Обычно да | Наследует уровень доступа родителя |
| Skills | Зависит от инструмента | В Claude Code — частично |
| Контекст беседы | Нет | Получает только задачу |
| Результаты других субагентов | Нет | Каждый изолирован |
Самая частая ошибка — забыть, что субагент не видит контекст чата. Всё важное нужно передать в описании задачи явно.
Родитель: "Добавить экспорт в CSV"
│
├── Субагент 1: исследовать текущий код экспорта
├── Субагент 2: найти и изучить тесты экспорта
└── Субагент 3: проверить зависимости в package.json
│
▼ (все три завершились)
Родитель: синтезирует результаты, планирует реализацию
Несколько субагентов работают одновременно — каждый со своим чистым контекстом. Время = самый долгий субагент, а не сумма всех.
Параллельные субагенты не должны редактировать одни и те же файлы. Иначе возникнут конфликты. Разделяйте работу по модулям или используйте git worktree.
Субагент возвращает родителю только результат — текстовое сообщение с итогами работы.
Качество формулировки результата критично.
Если субагент написал "Готово, файлы обновлены" — родитель не узнает, что именно сделано.
Хорошая практика — в описании задачи явно указывать формат ожидаемого результата.
Субагент — это чёрный ящик. Вход: задача. Выход: результат. Всё остальное теряется.
Как Claude Code, Roo Code, Kilo Code и OpenCode реализуют делегацию на практике.
Родительский агент вызывает Agent tool с параметрами: prompt, subagent_type, isolation, run_in_background.
| Тип (subagent_type) | Доступные инструменты | Когда использовать |
|---|---|---|
| Explore | Grep, Glob, Read | Исследование кодовой базы |
| Plan | Read, Grep, Glob, LSP | Планирование без изменений |
| General-purpose | Все инструменты | Полноценная реализация |
| code-review | Чтение + комментирование | Ревью кода |
| Кастомный | Из AGENTS.md / .claude/agents/ | Специализированные задачи |
Agent tool — полноценный инструмент, доступный модели наравне с Read, Edit, Bash. Субагент получает чистый контекст и возвращает только результат.
Файл AGENTS.md в корне репо или отдельные файлы в .claude/agents/*.md описывают кастомных агентов. Claude Code подхватывает их автоматически.
# AGENTS.md
## code-reviewer
You are a senior code reviewer. Focus on:
- Security vulnerabilities (injection, auth bypass, data exposure)
- Performance anti-patterns (N+1 queries, missing indexes)
- API contract violations
Tools: Read, Grep, Glob
Constraints: Never modify files. Always cite file:line.
Output format: list of findings with severity (critical/warning/info).
## test-writer
You are a test engineer. Given a source file, write comprehensive tests.
Tools: Read, Grep, Glob, Edit, Bash
Constraints: Use existing test framework. Run tests before returning.
Output format: summary of tests added and pass/fail status.
Каждый блок определяет: роль, доступные инструменты, ограничения и формат выходных данных.
Несколько Agent tool одновременно в одном сообщении.
isolation: "worktree" — отдельная git worktree для каждого субагента.
run_in_background: true — субагент в фоне, родитель не ждёт.
Worktree + параллелизм + фон — главные преимущества субагентности Claude Code.
Полный доступ
Только чтение
Вопросы-ответы
Диагностика
Делегация задач другим режимам
Пользователь: "Добавить авторизацию"
│
Orchestrator
├── → Architect: спроектировать
│ ← архитектурный план
├── → Code: реализовать
│ ← код готов
├── → Code: написать тесты
│ ← тесты написаны
└── → Debug: проверить
← всё работает
Orchestrator → итог пользователю
Boomerang Tasks работают последовательно — Orchestrator ждёт завершения текущей подзадачи.
Файл .roomodes в корне проекта определяет кастомные режимы. Совместим между Roo Code и Kilo Code.
{ "customModes": [{
"slug": "doc-writer",
"name": "Documentation Writer",
"roleDefinition": "You are a technical writer...",
"groups": ["read", "command"],
"customInstructions": "Always include usage examples."
},
{ "slug": "security-audit", "groups": ["read"], ... }
]}
Доступные инструменты: read, edit, command, browser, mcp.
Визуальная панель: дерево подзадач, статусы, результаты.
Агенты определяются декларативно в opencode.json или как markdown-файлы в .opencode/agents/.
{
"agents": {
"reviewer": {
"model": "anthropic:claude-sonnet-4-20250514",
"prompt": ".opencode/agents/reviewer.md",
"permission": ["read", "glob", "grep"]
},
"implementer": {
"model": "anthropic:claude-sonnet-4-20250514",
"prompt": ".opencode/agents/implementer.md",
"permission": ["read", "glob", "grep", "edit", "bash"]
}
}
}
Агенты в OpenCode — предустановленные профили, а не динамически порождаемые субагенты. Переключение — смена конфигурации внутри одного сеанса.
Альтернатива: отдельные файлы .opencode/agents/reviewer.md. Заголовок — имя, содержимое — системный промпт. Удобно для длинных инструкций.
| Критерий | Claude Code | Roo / Kilo Code | OpenCode |
|---|---|---|---|
| Модель | Явный spawn через Agent tool | Режимы + Orchestrator / Boomerang | Агенты в конфигурации |
| Конфигурация | AGENTS.md / .claude/agents/ + subagent_type | .roomodes (JSON) | opencode.json / .opencode/agents/ |
| Параллельность | Да (несколько Agent-вызовов) | Последовательная | Зависит от реализации |
| Изоляция | Worktree (git-копия) | Отдельный контекст (общая FS) | Отдельный контекст (общая FS) |
| Кастомные типы | AGENTS.md | .roomodes | Агенты в конфиге |
| Фоновый запуск | run_in_background | Нет | Нет |
Самая продвинутая модель — у Claude Code: worktree-изоляция, параллелизм и фоновый режим. Roo/Kilo Code берут удобством Orchestrator-паттерна. OpenCode — минимальный подход с предустановленными профилями.
Когда разбивать руками, когда доверять агенту и четыре паттерна оркестрации.
Миграция БД → код → тесты — порядок критичен.
Два субагента редактируют один файл — безопаснее разделить.
Ядро, миграция данных, API — предсказуемость важнее.
Понятная изолированная задача с ясным результатом.
Настроены AGENTS.md, rules и контекст проекта.
Доки, тесты, линтер — задачи не пересекаются.
Родитель порождает несколько субагентов одновременно, каждый работает над своей частью, затем родитель собирает и синтезирует результаты.
Родитель
/ | \
/ | \
v v v
Sub-1 Sub-2 Sub-3 ← параллельно
\ | /
\ | /
v v v
Родитель собирает
результаты
Обновить 5 микросервисов одновременно — каждый субагент получает свой сервис, вносит изменения, возвращает результат.
Лучший паттерн по скорости — все субагенты работают параллельно. Но требует полной независимости подзадач.
Цепочка субагентов, где каждый следующий получает результат предыдущего. Порядок строго определён.
Задача → Sub-1 → результат → Sub-2 → результат → Sub-3 → итог
Пример:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Генерация │───►│ Написать │───►│ Запустить │
│ кода │ │ тесты │ │ и исправить │
└──────────────┘ └──────────────┘ └──────────────┘
Каждый шаг зависит от предыдущего: код → тесты к этому коду → прогон тестов и исправление ошибок.
Все инструменты — паттерн не требует параллелизма, достаточно последовательной делегации.
Самый простой паттерн. Подходит для задач с чёткой последовательностью шагов, где каждый этап нуждается в результате предыдущего.
Родитель
/ | \
v v v
Ревьюер Тестер Докум.
(только (только (только
чтение) тесты) docs)
Субагенты с узкой специализацией и ограниченными инструментами. Ревьюер не может редактировать, тестер не трогает документацию.
AGENTS.md (Claude Code), .roomodes (Roo/Kilo), конфиг агентов (OpenCode).
Родитель: поручает задачу
│
Субагент: выполняет
│
Родитель: проверяет
┌────┴────┐
v v
OK Не OK → повтор
с правками
Цикл: делегировать → проверить → принять или вернуть на исправление с уточнённым промптом.
Claude Code — повторный Agent tool. Roo/Kilo — Orchestrator перенаправляет Boomerang Task.
| Паттерн | Как работает | Пример | Поддержка |
|---|---|---|---|
| Fan-out / fan-in | Параллельные субагенты, родитель собирает | Обновление 5 микросервисов | Claude Code (параллельно), Roo/Kilo (последовательно) |
| Pipeline | Цепочка: результат одного → вход другого | Код → тесты → прогон | Все инструменты |
| Specialist | Узкие специалисты по доменам | Ревьюер + тестер + документатор | Все инструменты |
| Supervisor | Делегация → проверка → принятие/возврат | Ревью кода субагента | Claude Code, Roo/Kilo (Orchestrator) |
На практике паттерны комбинируются: Pipeline из трёх шагов, где на первом — Fan-out для исследования, а на последнем — Supervisor для финальной проверки.
Автоматизация жизненного цикла агента. Промпты — предложения. Hooks — гарантии.
«Промпты — предложения. Hooks — гарантии.» (лекция 1, секция 3.6)
Hook — реакция на событие жизненного цикла агента, выполняемая хостом, а не моделью. Модель не решает, запускать ли hook, — он срабатывает автоматически.
prettier / ESLint после Edit — чистый код, ошибки через stderr
Hook на Stop: git add -A && git commit
Slack webhook / push при ошибке
PostToolUse → тесты; SessionStart → git status + issues
PreToolUse: rm -rf, push --force → exit 2 = deny
Конфигурация в .claude/settings.json (проектные) или ~/.claude/settings.json (глобальные).
{
"hooks": {
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "npx prettier --write \"$FILEPATH\""
}]
}]
}
}
PreToolUse, PostToolUse, Stop, SessionStart и др.
command, prompt, agent, http
Regex по имени tool. Пустой = для всех.
0=OK, 1=не-блок., 2=блок+stderr
Shell-команда хоста. Переменные: $FILEPATH, $TOOL_NAME.
{ "type": "command", "command": "npx prettier --write \"$FILEPATH\"" }
Однопроходная оценка моделью, результат в контекст.
{ "type": "prompt", "prompt": "Check API naming conventions" }
Субагент с инструментами. Уникально для Claude Code.
{ "type": "agent", "prompt": "Review changes for security" }
POST-запрос на URL для внешних интеграций.
{ "type": "http", "url": "https://hooks.example.com/notify" }
Exit codes: 0 = OK → продолжить · 1 = не-блокирующая ошибка, stderr в лог · 2 = блокировка, stderr → модели
Hooks реализованы через JS/TS-плагины — полноценный код с доступом к SDK, а не JSON-конфиги.
export const AutoFormatPlugin = async ({ $ }) => {
return {
"tool.execute.after": async (input, output) => {
if (input.tool === "write" || input.tool === "edit") {
const filePath = output.args?.filePath || ""
if (filePath.match(/\.(ts|tsx|js|jsx)$/))
await $`npx prettier --write ${filePath}`
}
}
}
}
tool.execute.before/after, session.created, session.idle, session.error, file.edited, permission.asked, shell.env
$ (shell), client (API), project (метаданные). Можно импортировать npm-пакеты.
Локально: .opencode/plugins/. Через npm: "plugin": ["package-name"] в opencode.json.
Гибче Claude Code (логика, async, API), но нужен TypeScript вместо JSON.
Нативных hooks нет. Эмуляция: MCP-tool + правила + .roomodes.
async function execute({ scope }) {
const { stdout } = await execAsync(
`npm run lint -- ${scope || "."}`
)
return `ok: ${stdout}`
}
MCP-инструмент lint_check с shell-командой.
## .roo/rules-code/lint.md
Перед ЛЮБЫМ изменением ОБЯЗАН
вызвать `lint_check`.
- `ok:` → можно изменять
- `fail:` → ЗАПРЕЩЕНО
Правило заставляет модель вызывать tool.
{
"customModes": [{
"slug": "safe-code",
"name": "Safe Code",
"groups": ["read","edit","mcp"],
"customInstructions":
"Always call lint_check"
}]
}
Режим объединяет tool и правило.
Ограничение: это не гарантия — модель может пропустить проверку. Для критичных сценариев недостаточно.
| Критерий | Claude Code | OpenCode | Roo / Kilo Code |
|---|---|---|---|
| Механизм | Нативные hooks (settings.json) | Плагины (JS/TS) | Эмуляция (rules + MCP tools) |
| Гарантия срабатывания | Да | Да | Нет (зависит от модели) |
| Язык обработчика | Shell / prompt / agent / http | JS / TypeScript | Shell (через MCP tool) |
| Количество событий | 20+ | 7+ | Нет нативных |
| Сложность настройки | Низкая (JSON) | Средняя (TypeScript) | Высокая (workaround) |
Claude Code — самая зрелая реализация: JSON-конфиг, 20+ событий, четыре типа обработчиков, включая уникальные типы agent и http. OpenCode — больше гибкости через код. Roo/Kilo — только эмуляция.
Блокировка опасных операций, обязательное форматирование, автокоммиты — только хост-уровень.
→ Claude Code hooks или OpenCode plugins
Хост выполняет hook безусловно — модель не может его пропустить.
Условная логика, API-вызовы, проверка coverage, метрики в Grafana, сложные проверки.
→ OpenCode plugins
Полноценный TypeScript с доступом к npm, SDK и shell.
Эмуляция работает для «мягких» сценариев: напоминание о линтере, рекомендация запустить тесты.
→ Комбинируйте с CI/CD
Эмулированный hook ловит ~90% случаев, CI/CD pipeline гарантирует остальные 10%.
Правило: для критичных сценариев (безопасность, деплой) — только нативные hooks. Для «мягких» рекомендаций — эмуляция допустима, но страхуйте CI/CD.
Типичные ловушки мультиагентных систем — и как их избежать
Проблема: субагент не знает, что делают другие. Тестировщик пишет тесты для старого кода, потому что не знает о рефакторинге.
AGENTS.md, TODO.mdПроблема: два субагента параллельно редактируют один файл — merge-конфликты, дубли в конфигах.
src/api/»Общий принцип: субагент получает только текстовое описание задачи — детали теряются при пересказе. Чем точнее задание, тем меньше ошибок.
Проблема: исправляет один тест — ломается другой. Бесконечный цикл «почти готово», пока не кончится бюджет токенов.
Проблема: 5-минутная задача разбивается на 4 субагентов. Overhead на координацию превышает стоимость самой работы.
Правило: все четыре ловушки решаются одним подходом — чёткие границы, лимиты и правильный выбор паттерна оркестрации.
Что забрать с собой из этой лекции
Субагент = чистый контекст. Делегирование — не «больше агентов», а фокус и изоляция. Каждый субагент получает только то, что нужно.
Паттерны решают. Fan-out для независимых, Pipeline для зависимых, Specialist для экспертизы, Supervisor для контроля.
Каждый инструмент — своя модель. Claude Code: Agent tool + worktree. Roo/Kilo: Orchestrator + Boomerang. OpenCode: агенты-профили.
Hooks — гарантированная автоматизация. Хост выполняет hook, а не модель. Форматирование, линтинг, блокировка — без исключений.
Не всё нужно декомпозировать. Субагент — это overhead. Если задача укладывается в один контекст — делайте в основном агенте.
Знайте ловушки. Потеря контекста, дублирование, зацикливание, оверхед — решаются чёткими границами и правильным паттерном.
AGENTS.md с описанием специализированного агента (code-reviewer). Дайте задачу, требующую делегации.roomodes. Переключитесь в Orchestrator и делегируйте задачуopencode.json с ограниченным набором инструментов. Проверьте блокировку.claude/settings.json — форматирование после каждого Edit.opencode/plugins/logger.ts — логирование всех вызовов инструментовpre_edit_check + правило, обязывающее проверку перед редактированиемПолные примеры кода — в конспекте лекции. Выберите один инструмент (Claude Code / Roo / OpenCode) и выполните оба задания.
Что может пойти не так, когда агент имеет доступ к файлам, shell и API
Как атакующий может перехватить управление агентом через данные
Rug pull, tool poisoning, shadow tools — специфические атаки на MCP-серверы
Агент видит .env, токены в истории — как ограничить exposure
Принцип наименьших привилегий, allow-lists, sandboxing, approval flows
Что делать, когда инцидент уже произошёл — логи, откат, remediation
Безопасность агентов — модель угроз, prompt injection, защита и реагирование
Сканируйте QR или переходите по ссылке, чтобы получить обновления по следующим материалам.