Субагенты, оркестрация и Hooks · Лекция 4 ← На главную
AI Engineering Course

Субагенты, оркестрация и Hooks

Лекция 4

Аудитория: разработчики Фокус: делегирование и автоматизация

Содержание

1. Зачем делегировать

Проблема единого контекста, аналогия с командой

2. Как устроен субагент

Жизненный цикл, наследование, параллельность

3. Субагенты в инструментах

Claude Code, Roo Code, Kilo Code, OpenCode

4. Декомпозиция и оркестрация

Паттерны: fan-out, pipeline, iterative

5. Hooks

Автоматизация через хуки жизненного цикла

6. Подводные камни

Типичные ошибки и как их избежать

7. Итоги и практика

Чеклист, домашнее задание

Раздел 01

Зачем делегировать

Контекстное окно конечно. Делегирование сохраняет фокус и ускоряет работу.

Проблема единого контекста

Контекстное окно агента — ресурс конечный. У Claude Sonnet — 200K токенов, но эффективность падает задолго до лимита.

  • После ~80-100K токенов модель начинает забывать ранние инструкции
  • Сложная задача (исследование + реализация + тесты) генерирует огромный промежуточный контекст
  • Каждый вызов tool добавляет входные данные и результаты — контекст растёт нелинейно
  • Когда контекст переполнен, агент теряет фокус: путает файлы, повторяет действия

Симптомы переполнения

  • Агент забывает начальные инструкции
  • Повторяет уже выполненные действия
  • Путает имена файлов и переменных
  • Теряет общий план задачи

Решение: разделить работу на несколько агентов с чистым контекстом.

Один агент vs Команда субагентов

Один агент Команда субагентов
Контекст Один на всё У каждого свой, чистый
Параллельность Последовательно Одновременно
Фокус Размывается Сохраняется
Отказоустойчивость Сбой = всё заново Сбой одного не ломает остальных

Один разработчик может написать фичу, тесты и документацию — но последовательно, удерживая всё в голове. Команда из трёх специалистов работает параллельно: каждый сфокусирован на своей части.

Два способа решения

Ручная декомпозиция

Человек сам разбивает задачу на подзадачи и запускает агента на каждую.

  • Простой и предсказуемый подход
  • Требует усилий от пользователя
  • Лучше для критичных задач

Автоматическая делегация

Агент сам решает, когда задача слишком велика, и порождает субагентов.

  • Удобнее для пользователя
  • Требует доверия к агенту
  • Лучше для рутинных задач
Ручная декомпозиция:                Автоматическая делегация:

Человек                             Человек
├── Задача 1 → Агент A              └── "Сделай фичу X"
├── Задача 2 → Агент B                      │
└── Задача 3 → Агент C                      ▼
                                     Родительский агент
Человек собирает результат           ├── Субагент 1 (исследование)
                                     ├── Субагент 2 (реализация)
                                     └── Субагент 3 (тесты)

                                     Родитель собирает результат
Раздел 02

Как устроен субагент

Отдельный процесс с чистым контекстом. Получает задачу — возвращает результат.

Жизненный цикл субагента

1. Задача

Родитель формулирует задание

2. Spawn

Чистый контекст + tools + rules

3. Work

Автономная работа: чтение, вызовы tools, решения

4. Return

Только результат, не весь контекст

5. Продолжение

Родитель работает дальше

Родитель не следит за процессом работы субагента. Он отправляет задачу и ждёт результат. Это асинхронная модель — как задача в трекере, а не парное программирование.

Что наследует субагент

Что Наследуется? Комментарий
Rules Обычно да Субагент работает в том же проекте
Permissions Обычно да Наследует уровень доступа родителя
Skills Зависит от инструмента В Claude Code — частично
Контекст беседы Нет Получает только задачу
Результаты других субагентов Нет Каждый изолирован

Самая частая ошибка — забыть, что субагент не видит контекст чата. Всё важное нужно передать в описании задачи явно.

Параллельность субагентов

Родитель: "Добавить экспорт в CSV"
         │
         ├── Субагент 1: исследовать текущий код экспорта
         ├── Субагент 2: найти и изучить тесты экспорта
         └── Субагент 3: проверить зависимости в package.json
         │
         ▼ (все три завершились)
Родитель: синтезирует результаты, планирует реализацию

Преимущество

Несколько субагентов работают одновременно — каждый со своим чистым контекстом. Время = самый долгий субагент, а не сумма всех.

Правило

Параллельные субагенты не должны редактировать одни и те же файлы. Иначе возникнут конфликты. Разделяйте работу по модулям или используйте git worktree.

Ключевое ограничение

Субагент возвращает родителю только результат — текстовое сообщение с итогами работы.

Родитель НЕ получает:

  • Полный контекст субагента
  • Какие файлы читал, какие промежуточные решения принимал
  • Логи вызовов tools
  • Промежуточные рассуждения

Что это значит на практике

Качество формулировки результата критично.

Если субагент написал "Готово, файлы обновлены" — родитель не узнает, что именно сделано.

Хорошая практика — в описании задачи явно указывать формат ожидаемого результата.

Субагент — это чёрный ящик. Вход: задача. Выход: результат. Всё остальное теряется.

Раздел 03

Субагенты в инструментах

Как Claude Code, Roo Code, Kilo Code и OpenCode реализуют делегацию на практике.

Claude Code — Agent tool

Родительский агент вызывает 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. Субагент получает чистый контекст и возвращает только результат.

Claude Code — AGENTS.md

Файл 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.

Каждый блок определяет: роль, доступные инструменты, ограничения и формат выходных данных.

Claude Code — параллелизм и изоляция

Параллельный запуск

Несколько Agent tool одновременно в одном сообщении.

  • Один — frontend, другой — backend
  • Изолированные контексты

Worktree-изоляция

isolation: "worktree" — отдельная git worktree для каждого субагента.

  • Субагент пишет в своей копии
  • Результат — через git merge

Фоновый режим

run_in_background: true — субагент в фоне, родитель не ждёт.

  • Прогон тестов
  • Рефакторинг и генерация

Worktree + параллелизм + фон — главные преимущества субагентности Claude Code.

Roo Code / Kilo Code — режимы

Встроенные режимы

Code

Полный доступ

Architect

Только чтение

Ask

Вопросы-ответы

Debug

Диагностика

Orchestrator

Делегация задач другим режимам

Orchestrator + Boomerang Tasks

Пользователь: "Добавить авторизацию"
         │
    Orchestrator
    ├── → Architect: спроектировать
    │   ← архитектурный план
    ├── → Code: реализовать
    │   ← код готов
    ├── → Code: написать тесты
    │   ← тесты написаны
    └── → Debug: проверить
        ← всё работает

    Orchestrator → итог пользователю

Boomerang Tasks работают последовательно — Orchestrator ждёт завершения текущей подзадачи.

Roo Code / Kilo Code — .roomodes

Файл .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"], ... }
]}

Поле groups

Доступные инструменты: read, edit, command, browser, mcp.

Kilo Code — Task Manager UI

Визуальная панель: дерево подзадач, статусы, результаты.

OpenCode — agents

Агенты определяются декларативно в 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 — предустановленные профили, а не динамически порождаемые субагенты. Переключение — смена конфигурации внутри одного сеанса.

Markdown-формат

Альтернатива: отдельные файлы .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 — минимальный подход с предустановленными профилями.

Раздел 04

Декомпозиция задач

Когда разбивать руками, когда доверять агенту и четыре паттерна оркестрации.

Когда разбивать руками vs доверять агенту

Разбивать руками

Зависимости между частями

Миграция БД → код → тесты — порядок критичен.

Риск конфликтов

Два субагента редактируют один файл — безопаснее разделить.

Критичные задачи

Ядро, миграция данных, API — предсказуемость важнее.

Доверять агенту

Задача чётко описана

Понятная изолированная задача с ясным результатом.

Агент «знает» проект

Настроены AGENTS.md, rules и контекст проекта.

Подзадачи независимы

Доки, тесты, линтер — задачи не пересекаются.

Паттерн 1: Fan-out / fan-in

Родитель порождает несколько субагентов одновременно, каждый работает над своей частью, затем родитель собирает и синтезирует результаты.

         Родитель
        /   |   \
       /    |    \
      v     v     v
   Sub-1  Sub-2  Sub-3   ← параллельно
      \     |    /
       \    |   /
        v   v  v
    Родитель собирает
        результаты

Пример

Обновить 5 микросервисов одновременно — каждый субагент получает свой сервис, вносит изменения, возвращает результат.

Поддержка

  • Claude Code — нативные параллельные вызовы Agent tool
  • Roo / Kilo Code — только последовательный Boomerang

Лучший паттерн по скорости — все субагенты работают параллельно. Но требует полной независимости подзадач.

Паттерн 2: Pipeline (конвейер)

Цепочка субагентов, где каждый следующий получает результат предыдущего. Порядок строго определён.

Задача → Sub-1 → результат → Sub-2 → результат → Sub-3 → итог

Пример:
┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│  Генерация   │───►│  Написать    │───►│  Запустить   │
│  кода        │    │  тесты       │    │  и исправить │
└──────────────┘    └──────────────┘    └──────────────┘

Когда использовать

Каждый шаг зависит от предыдущего: код → тесты к этому коду → прогон тестов и исправление ошибок.

Поддержка

Все инструменты — паттерн не требует параллелизма, достаточно последовательной делегации.

Самый простой паттерн. Подходит для задач с чёткой последовательностью шагов, где каждый этап нуждается в результате предыдущего.

Паттерны 3-4: Specialist и Supervisor

Specialist (специалист)

      Родитель
     /   |   \
    v    v    v
Ревьюер Тестер Докум.
(только  (только  (только
чтение)  тесты)   docs)

Суть

Субагенты с узкой специализацией и ограниченными инструментами. Ревьюер не может редактировать, тестер не трогает документацию.

Реализация

AGENTS.md (Claude Code), .roomodes (Roo/Kilo), конфиг агентов (OpenCode).

Supervisor (супервизор)

Родитель: поручает задачу
       │
   Субагент: выполняет
       │
Родитель: проверяет
   ┌────┴────┐
   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 для финальной проверки.

Раздел 05

Hooks

Автоматизация жизненного цикла агента. Промпты — предложения. Hooks — гарантии.

Напоминание и продвинутые сценарии

«Промпты — предложения. Hooks — гарантии.» (лекция 1, секция 3.6)

Hook — реакция на событие жизненного цикла агента, выполняемая хостом, а не моделью. Модель не решает, запускать ли hook, — он срабатывает автоматически.

1. Автоформат и линтинг

prettier / ESLint после Edit — чистый код, ошибки через stderr

2. Автокоммит

Hook на Stop: git add -A && git commit

3. Уведомления

Slack webhook / push при ошибке

4. Тесты и контекст

PostToolUse → тесты; SessionStart → git status + issues

5. Блокировка

PreToolUse: rm -rf, push --force → exit 2 = deny

Claude Code hooks

Конфигурация в .claude/settings.json (проектные) или ~/.claude/settings.json (глобальные).

{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{
        "type": "command",
        "command": "npx prettier --write \"$FILEPATH\""
      }]
    }]
  }
}

20+ событий

PreToolUse, PostToolUse, Stop, SessionStart и др.

4 типа

command, prompt, agent, http

Matcher

Regex по имени tool. Пустой = для всех.

Exit codes

0=OK, 1=не-блок., 2=блок+stderr

Claude Code — типы обработчиков

command (shell)

Shell-команда хоста. Переменные: $FILEPATH, $TOOL_NAME.

{ "type": "command", "command": "npx prettier --write \"$FILEPATH\"" }

prompt (инъекция)

Однопроходная оценка моделью, результат в контекст.

{ "type": "prompt", "prompt": "Check API naming conventions" }

agent (субагент)

Субагент с инструментами. Уникально для Claude Code.

{ "type": "agent", "prompt": "Review changes for security" }

http (webhook)

POST-запрос на URL для внешних интеграций.

{ "type": "http", "url": "https://hooks.example.com/notify" }

Exit codes: 0 = OK → продолжить · 1 = не-блокирующая ошибка, stderr в лог · 2 = блокировка, stderr → модели

OpenCode плагины

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

Полный доступ к SDK

$ (shell), client (API), project (метаданные). Можно импортировать npm-пакеты.

Подключение

Локально: .opencode/plugins/. Через npm: "plugin": ["package-name"] в opencode.json.

Гибче Claude Code (логика, async, API), но нужен TypeScript вместо JSON.

Roo Code / Kilo Code — эмуляция hooks

Нативных hooks нет. Эмуляция: MCP-tool + правила + .roomodes.

Шаг 1: MCP-tool

async function execute({ scope }) {
  const { stdout } = await execAsync(
    `npm run lint -- ${scope || "."}`
  )
  return `ok: ${stdout}`
}

MCP-инструмент lint_check с shell-командой.

Шаг 2: Правило

## .roo/rules-code/lint.md
Перед ЛЮБЫМ изменением ОБЯЗАН
вызвать `lint_check`.
- `ok:` → можно изменять
- `fail:` → ЗАПРЕЩЕНО

Правило заставляет модель вызывать tool.

Шаг 3: .roomodes

{
  "customModes": [{
    "slug": "safe-code",
    "name": "Safe Code",
    "groups": ["read","edit","mcp"],
    "customInstructions":
      "Always call lint_check"
  }]
}

Режим объединяет tool и правило.

Ограничение: это не гарантия — модель может пропустить проверку. Для критичных сценариев недостаточно.

Сводная таблица: hooks

Критерий 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 — только эмуляция.

Стратегия выбора hooks

Нужна гарантия

Блокировка опасных операций, обязательное форматирование, автокоммиты — только хост-уровень.

→ Claude Code hooks или OpenCode plugins

Хост выполняет hook безусловно — модель не может его пропустить.

Нужна гибкость

Условная логика, API-вызовы, проверка coverage, метрики в Grafana, сложные проверки.

→ OpenCode plugins

Полноценный TypeScript с доступом к npm, SDK и shell.

Roo / Kilo Code

Эмуляция работает для «мягких» сценариев: напоминание о линтере, рекомендация запустить тесты.

→ Комбинируйте с CI/CD

Эмулированный hook ловит ~90% случаев, CI/CD pipeline гарантирует остальные 10%.

Правило: для критичных сценариев (безопасность, деплой) — только нативные hooks. Для «мягких» рекомендаций — эмуляция допустима, но страхуйте CI/CD.

Раздел 6

Подводные камни

Типичные ловушки мультиагентных систем — и как их избежать

Ловушки: контекст и дублирование

Потеря контекста

Проблема: субагент не знает, что делают другие. Тестировщик пишет тесты для старого кода, потому что не знает о рефакторинге.

  • Чёткие описания задач с полным контекстом
  • Общие артефакты: AGENTS.md, TODO.md
  • Для зависимых задач — Pipeline вместо Fan-out

Дублирование работы

Проблема: два субагента параллельно редактируют один файл — merge-конфликты, дубли в конфигах.

  • Разделяйте работу по файлам и директориям
  • Worktree-изоляция (Claude Code)
  • Явные границы: «Редактируй только src/api/»

Общий принцип: субагент получает только текстовое описание задачи — детали теряются при пересказе. Чем точнее задание, тем меньше ошибок.

Ловушки: зацикливание и оверхед

Зацикливание

Проблема: исправляет один тест — ломается другой. Бесконечный цикл «почти готово», пока не кончится бюджет токенов.

  • Лимит итераций: «3 попытки — потом верни ошибку»
  • Чёткие критерии завершения
  • Паттерн Supervisor — родитель прерывает зацикленного субагента

Избыточная декомпозиция

Проблема: 5-минутная задача разбивается на 4 субагентов. Overhead на координацию превышает стоимость самой работы.

  • Задача умещается в один контекст? Не декомпозируйте
  • Оценивайте до запуска: файлы, параллельность, независимость
  • Субагент оправдан, когда задача реально не помещается

Правило: все четыре ловушки решаются одним подходом — чёткие границы, лимиты и правильный выбор паттерна оркестрации.

Раздел 7

Итоги

Что забрать с собой из этой лекции

6 вещей, которые стоит запомнить

1

Субагент = чистый контекст. Делегирование — не «больше агентов», а фокус и изоляция. Каждый субагент получает только то, что нужно.

2

Паттерны решают. Fan-out для независимых, Pipeline для зависимых, Specialist для экспертизы, Supervisor для контроля.

3

Каждый инструмент — своя модель. Claude Code: Agent tool + worktree. Roo/Kilo: Orchestrator + Boomerang. OpenCode: агенты-профили.

4

Hooks — гарантированная автоматизация. Хост выполняет hook, а не модель. Форматирование, линтинг, блокировка — без исключений.

5

Не всё нужно декомпозировать. Субагент — это overhead. Если задача укладывается в один контекст — делайте в основном агенте.

6

Знайте ловушки. Потеря контекста, дублирование, зацикливание, оверхед — решаются чёткими границами и правильным паттерном.

Практическое задание

Задание 1: Настроить субагентов

  • Claude Code: создайте AGENTS.md с описанием специализированного агента (code-reviewer). Дайте задачу, требующую делегации
  • Roo/Kilo Code: создайте кастомный режим в .roomodes. Переключитесь в Orchestrator и делегируйте задачу
  • OpenCode: определите агента в opencode.json с ограниченным набором инструментов. Проверьте блокировку

Задание 2: Настроить Hook

  • Claude Code: hook в .claude/settings.json — форматирование после каждого Edit
  • OpenCode: плагин .opencode/plugins/logger.ts — логирование всех вызовов инструментов
  • Roo/Kilo Code: MCP-инструмент pre_edit_check + правило, обязывающее проверку перед редактированием

Полные примеры кода — в конспекте лекции. Выберите один инструмент (Claude Code / Roo / OpenCode) и выполните оба задания.

Лекция 5 · Безопасность агентов

Модель угроз

Что может пойти не так, когда агент имеет доступ к файлам, shell и API

Prompt injection

Как атакующий может перехватить управление агентом через данные

MCP-уязвимости

Rug pull, tool poisoning, shadow tools — специфические атаки на MCP-серверы

Утечки секретов

Агент видит .env, токены в истории — как ограничить exposure

Защита

Принцип наименьших привилегий, allow-lists, sandboxing, approval flows

Реагирование

Что делать, когда инцидент уже произошёл — логи, откат, remediation

Дальше

Лекция 5

Безопасность агентов — модель угроз, prompt injection, защита и реагирование

Остаёмся на связи

Фото автора канала

Telegram канал

QR код на Telegram канал SazonovMaybeTalks t.me/SazonovMaybeTalks

Сканируйте QR или переходите по ссылке, чтобы получить обновления по следующим материалам.