Агенти та subagents

Сьогодні зʼявляється третій командний артефакт - агент: спеціалізований виконавець із власним вікном контексту, своїм набором інструментів і своєю інструкцією.

Сьогодні розберемо:

Наскрізний приклад - agents/reviewer.md: агент-ревʼюер, якого ми зберемо, покладемо в репозиторій і проженемо на готовому diff.

Сьогодні пройдемо: рівень 11. Агенти та subagents: ролі, межі та конфігурація.
Сьогодні - що таке агент, як зібрати свого і дати йому перші межі. Тонке налаштування прав, ізоляція роботи агента, приймання результату за контрактом і оцінка користі - тема наступного вебінару.

Що таке субагент і навіщо він

Субагент - це спеціалізований помічник, якому Claude Code передає завдання: він робить роботу у своєму власному вікні розмови і повертає у вашу сесію коротке зведення. Уся метушня - читання файлів, пошуки, виклики інструментів - залишається в нього.

Навіщо так: усе, що відбувається в сесії, накопичується в основному вікні контексту, а вікно скінченне. Заповнилося - Claude починає губити нитку розмови. ви це вже бачили, коли працювали з /context та /compact.

На старті субагент отримує два головні входи:

flowchart TD A["Завдання від головної сесії"] --> C["Subagent працює у своєму вікні"] B["System prompt із файлу конфігурації"] --> C C --> D["Уся чорнова робота залишається в нього"] D --> E["У головну сесію повертається зведення"]

На схемі важливе одне: далі субагент працює сам, а в основну сесію його чорнова робота не потрапляє - повертається лише зведення. Є і чесний tradeoff: ви не бачите, як він дійшов висновку, - тому зведення перевіряють, а не приймають на віру.


15 файлів заради одного факту

Уявіть: ви в незнайомому проєкті і хочете дізнатися, який сервіс обробляє refunds. Потрібен один факт.

Без субагента: 15 файлів + пошуки + трейс викликів -> усе у вашому вікні
Із субагентом:  питання -> зведення. Решта залишилася в Explore

Делегування не робить відповідь вірнішою - воно робить дослідження ізольованим і дешевим для вашого контексту. Відповідь та сама, рахунок за неї - інший.

Є й побічний бонус: субагент стартує з чистим контекстом, без багажу припущень, що накопичилися в основній сесії, - і часом копає туди, куди основна сесія вже не дивиться. А якщо два агенти перевірили одну гіпотезу і розійшлися - це не помилка, а сигнал: питання неоднозначне або в коді справді два шляхи. Як розбирати такі розбіжності - на наступному вебінарі.

Коли Claude шукає щось по проєкту, у статус-рядку миготить Explore. Делегування вже відбувається - без жодної спеціальної команди з вашого боку.

Вбудовані субагенти

Частина субагентів уже вбудована в Claude Code - він обирає їх сам, за змістом завдання і description:

А коли потрібна роль під ваш workflow - reviewer, test writer, генератор документації - субагента створюють свого. Цим займемося у другій половині вебінару.

Набір та імена вбудованих субагентів змінюються від версії до версії. Спирайтеся на тип поведінки, а не на вивіску: "потрібен ізольований read-only дослідник" переживе будь-який реліз.

Зведення - результат, який перевіряють

Зведення - єдине, що потрапляє у вашу сесію з роботи субагента. Тож увесь контроль якості відбувається тут - на тому, що він повернув.

Просимо дослідити баг із порядком refund-запитів - і дивимося, що повернеться. Зверніть увагу: цей запит адресований не субагенту, а звичайному Claude Code. Напряму задачі субагентам не ставлять - головна сесія сама вирішує, кому делегувати і що передати:

Досліди, де задається порядок refund-запитів в inbox.
Нічого не змінюй. Поверни:
1) ключові файли,
2) повʼязані тести,
3) що залишилося неперевіреним.
Зведення:
- src/support/refundInbox.ts:42 - сортування за createdAt ASC
- src/api/refundRoutes.ts:18 - endpoint /api/refunds/inbox кличе listInbox
- tests/refundInbox.test.ts:55 - тест фіксує порядок ASC
- Не перевірено: чи сортує таблиця на фронтенді повторно

Це сильне зведення: файли і рядки можна відкрити й перевірити, і є чесний блок "не перевірено". Слабке має інший вигляд - "схоже, проблема в support-модулі": настрій замість доказів.

Слабке зведення не оплакуємо, а дотискаємо формат: "для кожного висновку вкажи файл і рядок, гіпотези познач окремо". У житті сліди перевіряють вибірково - відкрити один-два ключові файли вже достатньо, щоб зрозуміти, чи можна зведенню вірити.


Коли делегувати, а коли самому

Після перших вдалих зведень хочеться делегувати взагалі все, аж до пошуку одного рядка. Вчасно пригальмуйте. "Самому" тут - це два варіанти, а не один: відкрити файл руками або поставити питання звичайному Claude Code в основній сесії, без субагентів. Ось простий орієнтир:

flowchart TD Q["Треба щось дізнатися в коді"] --> A{"Знаєте точний файл і функцію?"} A -->|так| S["Читайте самі"] A -->|ні| B{"Дослідження розповзається на шари і точки входу?"} B -->|так| D["Делегуйте субагенту"] B -->|ні| C["Коротке питання просто в сесії"]

Питання-розвилка насправді одне: чи захаращить розслідування основну розмову? Так - ізоляція окупається. Ні - субагент зайвий прошарок: вистачить короткого питання, це інструмент, а не ритуал на кожен запит.

І не чекайте автоматики, якщо знаєте, чого хочете: делегувати можна явно - "винеси перевірку проти специфікації в субагента", "підсумуй цей модуль субагентом".

Порада від Boris Cherny, творця Claude Code: коли завданню потрібно більше обчислень, просто допишіть до запиту "use subagents".

Два випадки, де субагент радше нашкодить:


Одне слово - пʼять механізмів

"Запусти ще одного агента" - цю фразу ви тепер будете чути постійно. Проблема в тому, що за словом agent ховаються зовсім різні речі, і в розмові їх плутають.

Розкласти будь-яку з них допомагають три питання - вони ж колонки цієї карти:

СутністьДе контекстЯк повертається результатФайлова ізоляціяКоли доречна
subagentокреме вікно всередині workflowзведення саме приходить у сесіюнівузьке спеціалізоване підзавдання
separate sessionповністю окрема розмовапереносите вручнунісамостійна лінія на свіжому контексті
background agentокремий процеспізніше, коли закінчитьнідовга робота без діалогу
worktree-backed sessionокрема сесіясвій diff у своїй гілцітак, worktreeризиковані правки паралельно
agent teamкілька координованих контекстівчерез спільну координаціюможе бутиexperimental: знати корисно, будувати рано

Робочий варіант за замовчуванням - subagent. Решта слів потрібні, щоб не сплутати його із сусідніми режимами. Одну відмінність варто запамʼятати одразу: субагент лише звітує нагору, у головну сесію, і з іншими субагентами не розмовляє - а в agent team кілька агентів ведуть спільний список завдань і листуються напряму одне з одним. Детально agent team розберемо на рівні 15, зараз його пропускаємо.


З чого складається субагент

Skill був рецептом, який ви записали. Plugin - коробкою з рецептами для команди. Агент у цьому ряду - найнятий спеціаліст. Досі ви працювали із вбудованими - тими, кого Claude Code дає з коробки. Суть будь-якого субагента вміщується в один рядок:

subagent = role + isolated context + tools + output contract

Читайте її як трудовий договір нового колеги:

agent - розмовна назва, subagent - технічна: той самий файл, але запущений під вашою сесією.

Сила субагента - у спеціалізації та ізоляції, не в автономності. А далі ця формула стане файлом: role - у тіло інструкції, tools - у поле tools, output contract - у формат результату. Ідемо наймати свого.


Створюємо свого субагента

Claude Code іде зі вбудованими субагентами, але під свій робочий ритуал можна створити власного - спеціалізованого. reviewer перевіряє diff, тестер ганяє тести, документатор пише доки. Вбудованих вистачає для загальної роботи, а ревʼю за правилами вашої команди - це вже своя роль.

Субагент - це markdown-файл у теці .claude/agents/. Створити його можна двома шляхами:

flowchart LR A["Що має робити агент"] --> B{"Як створити"} B -->|попросити Claude| C["Claude генерує чернетку"] B -->|вручну| D["додати файл самі"] C --> E[".claude/agents/reviewer.md"] D --> E

Найкращий шлях той самий, що зі skill на вебінарі 5: описуєте словами - "read-only reviewer, перевіряє готовий diff, повертає findings" - і Claude сам згенерує name, description та інструкцію. Вам залишиться відревʼюити чернетку. Де агент житиме, вирішує тека: .claude/agents/ у репозиторії їде до команди з кодом, ~/.claude/agents/ у домашній теці - тільки ваш, у всіх проєктах.

У старих гайдах трапляється команда /agents - у свіжих версіях її видалено. Наберіть її - і Claude Code сам підкаже заміну: "/agents (removed) Ask Claude to create/manage subagents, or edit .claude/agents/". Тобто рівно два шляхи зі схеми вище.
Чому не skill? Skill працює inline у вашому контексті, агент - в окремому вікні. Потрібна ізоляція й автономна робота - агент; повторювана процедура без шуму - skill.

Налаштування: інструменти та модель

При створенні ви налаштовуєте, що агенту доступно. Перше - tools: дайте лише потрібне для його роботи. В інструментів промовисті імена: Read читає файл, Glob знаходить файли за маскою, Grep шукає за вмістом, Bash запускає команди. reviewer'у потрібна ця четвірка - Bash заради git diff і безпечних read-only перевірок; а Edit і Write - право змінювати файли - йому ні до чого.

Мінімум прав - це "під роботу", а не "якомога менше".

Як проєктувати мінімум під кожну роль - reviewer, tester, documenter - і чим ще обмежувати агента, розберемо на наступному вебінарі. Сьогодні вистачає четвірки для reviewer.

Класика на проєктах - видати агенту всі tools "про всяк випадок" і згадати про це, коли він несподівано щось виправив. Розширити права пізніше дешевше, ніж розбирати сюрприз у diff.

Друге - модель під завдання. Агенту можна привʼязати свою: швидку Haiku для легкого пошуку, Opus для складного аналізу або inherit - ту саму, що у вашій сесії. Це одна із сильних сторін агентів: різній роботі - різний рушій, а не один на все.

У файлі .claude/agents/reviewer.md це має вигляд frontmatter на початку документа:

---
name: reviewer
description: Read-only review готового diff перед merge
tools: Read, Glob, Grep, Bash
model: inherit
---

Файл конфігурації

Після створення агент лежить у репозиторії - .claude/agents/reviewer.md. Усередині frontmatter з полями і тіло інструкції:

---
name: reviewer
description: Read-only review готового diff перед merge
tools: Read, Glob, Grep, Bash
model: inherit
---

Перевір змінені файли і поверни короткі зауваження.

Розберемо поля - name і description знайомі по skills, працюють так само:

Додали або виправили файл на диску - Claude Code сам помітить це за кілька секунд, без перезапуску. Restart потрібен лише один раз: коли теку agents/ створено вперше вже після старту сесії.

Пишемо інструкцію агента

Першу інструкцію дуже хочеться написати в чатовому стилі: "ти досвідчений, уважний, дуже сильний reviewer". Звучить як опис супергероя. Користі - нуль. Згадайте аналогію: ви найняли спеціаліста - йому потрібна посадова інструкція, а не комплімент.

Погано:
Ти дуже досвідчений code reviewer. Думай як senior,
перевіряй глибоко й уважно, знаходь усе важливе.

Добре:
Роль: reviewer готового diff.
Коли: зміна готова до перевірки.
Можна: читати diff і тести, повернути findings з evidence.
Стоп: diff надто великий або зачеплено чутливу зону.

Різниця принципова: задасте характер - отримаєте характер; задасте межі - отримаєте результат. Поганий варіант не відповідає на жодне робоче питання: коли запускати? що повернути? де зупинитися? За контрактом же результат приймають або відхиляють без гадання.

Окремий анти-патерн - агент-"експерт": "ти Python-експерт" не додає здібностей, ці знання в Claude уже є. Цінність агента - у межах і форматі, а не у званні.


З чого складається інструкція

Щоб інструкція не розповзалася в трактат, тримайте перед очима рамку з чотирьох елементів.

ЕлементНа яке питання відповідаєЩо ламається без нього
рольхто цей агентвиходить помічник "про все"
коли використовуватиу який момент його кликативикликається не вчасно або ніколи
дії + формат результатущо робить і що поверневідповіді впевнені, але неперевірювані
умови зупинкиде мусить зупинитисяагент "корисний" до самого хаосу

Кілька спостережень із практики до цієї таблиці:


Збираємо agents/reviewer.md

Беремо каркас зі слайда "Файл конфігурації" і перетворюємо його на повний контракт:

---
name: reviewer
description: Read-only reviewer готового diff. Запускати
  для локального review перед merge, коли тести прогнані.
tools: Read, Glob, Grep, Bash
model: inherit
---

## Роль
Reviewer готового diff. Код не редагуєш.

## Коли використовувати
Є diff, зрозумілий scope, тести по можливості прогнані.
Не використовувати для написання коду й дослідження з нуля.

## Дії та формат результату
Запусти git diff, прочитай зачеплені файли і тести.
З команд - лише read-only.
Поверни: summary, findings зі severity, file:line, evidence
і suggested action, окремо open questions.
Гіпотези без доказів помічай [hypothesis].

## Умови зупинки
Diff надто великий - попроси звузити scope.
Зачеплено чутливу зону - не роби висновків без evidence.
Після findings рішення за людиною.

Уявний тест: відкрийте файл очима нового колеги. За хвилину зрозуміло, коли кликати, чого чекати і де стоп? Так - файл живий. Ні - він написаний для автора, а не для команди.

Готово - файл у project-scope, коміт, і reviewer поїде до команди разом із кодом.

Перший прогін - це ревʼю не тільки коду, а й самого агента. Не пишіть ідеальну інструкцію з першої спроби: випустіть робочу версію, проженіть на реальних ревʼю і підсилюйте там, де тече - голослівні висновки: жорсткіше evidence, лізе в код: жорсткіше межі ролі.

Ролі: reviewer, tester, debugger, documenter

Reviewer - перший із чотирьох базових каркасів. Будь-яку роль зручно описувати за чотирма осями: що читає, що запускає, що пише, де зупиняється.

РольЧитаєЗапускаєПишеДе стоп
reviewerdiff, файли, тестибезпечні read-only перевіркинічогоfindings зібрані або diff надто широкий
testerкод, тести, логи падіньтестові командилише тестові файликоли потрібен production-код
debuggerкод, логи, stack traceкоманди відтвореннязазвичай нічогоroot cause знайдено або даних мало
documenterкод, README, конфігизазвичай нічоголише документаціютвердження не можна підтвердити кодом

Вісь write у reviewer порожня - і це принципово: write-доступ "на випадок дрібних правок" перетворює його на тихого співавтора diff. А tester із правом змінювати логіку одного разу піджене код під зелений тест - і проблема сховається під килим. І не плутайте tester з анти-патерном тест-раннера: tester ганяє тести, працюючи над ними; виносити прогін ваших тестів заради "passed/failed" так само не варто - повний вивід потрібен вам.

У Boris Cherny у вжитку свої ролі: code-simplifier спрощує код після того, як Claude закінчив роботу, а verify-app ганяє застосунок цілком. Четвірка - не стеля: субагенти - це автоматизація найчастіших workflow вашої команди.

І обіцяний прогін: кличемо зібраного reviewer'а на готовий diff - @agent-reviewer перевір diff останнього коміту. Хороший результат має вигляд нудний і перевірюваний:

severity: medium
file: src/payments/refundService.ts:48
evidence: статус замовлення перевіряється, роль оператора - ні
suggested_action: додати guard і тест на доступ

Три шари review: місце агента

Агент не висить у вакуумі - він вбудовується в review-процес команди. Ось навчальна карта з трьох шарів - це спосіб побачити місце агента, а не термін Claude Code:

flowchart TD D["Готовий diff"] --> L1["Layer 1: локальний review - автор + reviewer-агент"] L1 --> L2["Layer 2: gate - автоматичні перевірки в CI"] L2 --> L3["Layer 3: team approval - вирішує людина"]

На схемі - драбина від дешевої перевірки до дорогої. Наш reviewer живе на Layer 1: поки diff свіжий і відкат дешевий, він ловить грубі ризики до Layer 2 - CI, автоматичної перевірки коду перед публікацією - і до Layer 3, людини на чутливих рішеннях. Тести, build і логи reviewer при цьому не підміняє - він перевіряє, що вони є і стосуються завдання.

Чому окреме вікно взагалі працює: та сама модель у свіжому контексті знаходить баги, які пропустив автор - рівно як колега на ревʼю надійніше ловить ваш баг, ніж ви самі. В Anthropic це робоча практика: кожен PR - пропозиція влити гілку в основну - проходить вбудований Code Review, який ганяє кілька ревʼю-агентів паралельно.

У маленьких командах Layer 3 - це просто "спитати тимліда", а Layer 2 - пара скриптів у CI. Шари - про те, хто каже "так", а не про розмір бюрократії.

Спеціалізації reviewer, а не зоопарк агентів

Наступна спокуса - завести окремого агента на кожен випадок життя. Не поспішайте: security, performance, test quality, architecture, DB і frontend - це фокуси одного шаблону reviewer, а не шість різних механік.

Спеціалізації заводять за реальним болем - після першого інциденту з доступами, а не заздалегідь заради краси. так ніхто і не робить "шість ревʼюерів на старті".

Ще й тому агент у репозиторії цінний: reviewer.md фіксує критерії ревʼю вашої команди в одному файлі - усі перевіряють за однаковими правилами, а не хто як запамʼятав.

Потрібен стандартний пошук багів - почніть із вбудованого /code-review: він ганяє ревʼю-агентів із коробки. Свого reviewer'а заводять заради іншого - правил і формату вашої команди.

І фінальна звичка: агент - живий артефакт. Змінюється кодова база - оновлюєте чутливі зони і правила в інструкції через звичайний PR, який Claude Code допомагає готувати і ревʼюити.

Далі - точні межі агентів: мінімум прав за інструментами, ізоляція контексту та оцінка роботи агента.


Практика: завдання і мета

Тепер ви зберете агента іншого ґатунку - агент-інструмент md2html. reviewer з лекції перевіряв чужий diff, а тут агент сам робить невеликий результат: верстає resume.md у self-contained resume.html.

Мета практики - спроєктувати субагента як конфігурований інструмент: роль, межі, параметри, дефолти й обовʼязкове рішення, яке агент здобуває запитанням. Домен верстки тут полігон; головна навичка - engineering contract для агента з вузьким write.

У готовому результаті мають бути:


Практика: деталі реалізації

Вхід - resume.md зі стартового репо: досвід, освіта, навички, проєкти. Агент читає один .md, пише один .html, сам resume.md не чіпає. У тілі агента потрібна специфікація параметрів - це його сигнатура.

ВидПараметрПоведінка
опціональнийtheme = light | dark, дефолт lightне вказали - бере light мовчки
опціональнийsections, дефолт - усі блокине вказали - верстає всі; вказали - лише перелічені
обовʼязкове рішенняконтакти у футерідефолту немає: не передали - агент здобуває запитанням, а не вирішує за вас

Пресети light і dark - короткі CSS-блоки прямо в інструкції агента. Stop conditions теж пишемо явно: немає вхідного файлу - спитати; невідомий theme - відкотитися на light і попередити; після запису одного .html - стоп.

Уся різниця видна на поведінці: theme без значення мовчить і бере дефолт, а контакти без значення агент витребує. Це багата конфігурація поверх того самого контракту, що ви писали для reviewer.


Практика: як довести, що працює

Головний доказовий прогін - як агент здобуває обовʼязкове рішення. Контакти ви не передали, і агент не починає верстати, доки не спитає.

Запит: зверстай resume.md

Агент (ДО верстки):
  Додати блок контактів у футер? Телефон / email / посилання?
Ви: лише email, jane@example.com

Агент: готово. resume.html - тема light, усі секції,
       у футері email. Відкривається у браузері, нуль зовнішніх запитів.

Гілка "ні, не треба" теж валідна: агент пропускає блок цілком, не залишає порожній футер і не пише "контакти не вказані". А передали контакти одразу в запиті - верстає з ними, не перепитуючи.

Готовий агент поводиться правильно, якщо коротко:

Головна пастка - агент мовчки верстає, не спитавши. Лікується рядком в інструкції: "контакти не передані - СПОЧАТКУ спитай, ЛИШЕ ПОТІМ верстай". Дайте його агенту дослівно.
Вийшло, якщо без параметрів агент сам спитав про контакти до верстки, а з готовими контактами в запиті не перепитав. Той самий engineering contract, що у reviewer, плюс параметри зверху.