Сабагенти й оркестрація
Зміст
Актуально станом на липень 2026. Інструменти цього класу змінюються швидко — деталі звіряй з офіційною документацією.
Одна велика задача — «пройдися всім e2e-набором, познач флакі-тести (flaky) за патернами падінь і запропонуй фікс кожному» — теоретично під силу одному агенту. На практиці він захлинається: у контекст лягають десятки трейсів, простирадла логів, тупикові гіпотези, і за кілька десятків кроків модель уже гірше памʼятає, з чого почала, а рахунок за токени тихо росте. Замість одного агента, що тоне у власному контексті, роботу ділять: провідний агент роздає шматки сабагентам, кожен працює у своєму чистому вікні й повертає лише вичавку.
Для QA це не екзотика, а спосіб масштабувати рутину — аудит набору тестів, широкий пошук по кодовій базі, розбір пачки падінь — без того, щоб один агент задихнувся. На співбесідах тему чіпають рідко й неглибоко (вага низька), але вміння пояснити, навіщо взагалі сабагенти і чому вони коштують кратно дорожче, відрізняє «чув про модне» від «розумію механіку». Ця глава — канонічний розбір; оглядово патерн уже згадувався у главі Агенти й agentic loop.
Навіщо ділити роботу
Контекстне вікно (context window) скінченне, і що більше в ньому накопичується, то дорожче й гірше працює модель: кожен крок агента перевідсилає всю історію, а на довгому контексті модель ще й гірше тримає деталі (механіку розібрано у главі Токени, контекст і вартість). Один агент на великій задачі неминуче засмічує собі контекст: туди лягають проміжні викиди інструментів, які більше не знадобляться, і покинуті гіпотези, від яких модель уже відмовилась. Це прямо бʼє по якості й по рахунку.
Ділення розвʼязує три різні проблеми — і плутати їх не варто:
- Ізоляція контексту. Сабагент робить брудну роботу (пошук, читання купи файлів, перебір варіантів) у своєму вікні, а провідному агенту повертає лише підсумок. Головний контекст лишається чистим. Це — головна причина, а не паралелізм.
- Паралелізм. Незалежні підзадачі виконуються одночасно, тож wall-clock (реальний час до результату) коротшає.
- Спеціалізація. Кожен сабагент має власний системний промпт і власний, обмежений набір інструментів: окремий «дослідник», окремий «рецензент», окремий «кодер».
Ключова думка: навіть на одній машині, без жодного паралелізму, сабагенти виправдані — бо тримають головний контекст чистим. Паралелізм — приємний бонус, а не суть.
Анатомія сабагента: контекст, задача, звіт
Сабагент (subagent) — це окремий екземпляр моделі зі своїм контекстним вікном, власним системним промптом, власним набором дозволених інструментів і власними дозволами. Він не бачить історію провідного агента й не ділить із ним памʼять. Уся взаємодія зводиться до трьох речей:
- Контекст — те, з чим сабагент стартує: його системний промпт (роль та інструкції), доступні йому інструменти й порожня, свіжа історія. Нічого з того, що вже накопичив оркестратор, сюди автоматично не потрапляє.
- Задача — конкретне доручення, яке передає оркестратор. Оскільки сабагент не бачить розмови вище, задача має бути самодостатньою: шляхи до файлів, потрібні факти, критерій готовності — усе в тексті доручення.
- Звіт — єдине фінальне повідомлення, яке сабагент віддає назад. Уся його проміжна робота (десятки кроків, простирадла виводу) лишається в його контексті й не перетинає межу — назад іде тільки вичавка.
У Claude Code це оформлено буквально так. Сабагент — це Markdown-файл із YAML-фронтматером у .claude/agents/ (для проєкту) або ~/.claude/agents/ (для всіх ваших проєктів):
---
name: flaky-hunter
description: Аналізує падіння e2e-тестів і позначає флакі за патернами. Використовувати при розборі червоного прогону.
tools: Read, Grep, Glob, Bash
model: sonnet
---
Ти — аналітик стабільності тестів. Для кожного падіння визнач,
чи це флак, за патерном (таймаут / гонка / дані), і поверни короткий звіт.
Тіло файлу — це системний промпт сабагента; tools обмежує його інструментарій; model дозволяє посадити дешевшу роботу на дешевшу модель. Поле description — не декор: саме за ним провідний агент вирішує, коли делегувати задачу цьому сабагенту, тож опис має чітко казати «для чого я і коли мене кликати».
Передача контексту: вузький канал
Найважливіше для розуміння — між оркестратором і сабагентом лише один вузький канал: задача вниз, звіт угору. Це схоже на виклик функції з серіалізацією: усе, що не поклали в аргументи, всередині недоступне, і все, чого не повернули, зовні втрачено.
Звідси два практичні наслідки, на яких сиплються найчастіше:
- Задача має бути самодостатньою. Сабагент осліп до контексту оркестратора. Доручення «полагодь ці тести» без переліку файлів і симптомів приречене: сабагент або вигадає деталі, або зробить не те. Добрий бриф — це, по суті, добре написаний баг-репорт, відданий інженеру, якого не було в кімнаті.
- Звіт має бути повним. Якщо сабагент знайшов точний шлях до зламаного локатора, але не вписав його у звіт, — оркестратор цього вже не дістане: транскрипт сабагента зник. Межа лоссі (з втратами, lossy), тож інтерфейс звіту треба проєктувати, а не сподіватися, що «і так зрозуміло».
Схематично видно, чому проміжна робота не засмічує головний контекст:
Оркестрація
Оркестратор (orchestrator) — це провідний агент, чия робота не «зробити самому», а розбити, роздати, звести:
- Розбити мету на підзадачі, які можна виконати незалежно.
- Роздати кожну сабагенту з самодостатнім брифом (і, за потреби, під потрібну спеціалізацію).
- Зібрати звіти.
- Звести їх у фінальний результат: узгодити суперечності й вирішити, чи потрібен ще раунд роботи.
Сам оркестратор — теж агент у циклі (agentic loop): тільки його «дії» — це не запуски тестів, а виклики сабагентів, а «спостереження» — їхні звіти. Тому він теж може зациклитись чи згубити мету, і ті самі запобіжники (ліміт кроків, умови зупинки) тут потрібні. Канонічний патерн — оркестратор-виконавці (orchestrator-workers): провідний агент динамічно вирішує, на скільки й яких підзадач бити, а не працює за жорстко прописаним планом.
Оркестратор тримає загальну картину й план; сабагенти тримають деталі. Це і є поділ праці: одному вікну — стратегія, іншим — брудна тактика.
Паралельний запуск
Коли підзадачі незалежні, оркестратор може запустити сабагентів одночасно й дочекатися всіх звітів. Виграш — у реальному часі: три пошуки по різних частинах кодової бази, зроблені паралельно, завершаться приблизно за час найдовшого з них, а не їхньої суми.
Але паралелізм має ту саму ціну, що й паралельний запуск автотестів: він вимагає незалежності. Два сабагенти, що одночасно правлять той самий файл або живуть на тих самих тестових даних, влаштують гонку — конфлікти, перезаписи, недетермінований результат. Тому:
- добре паралеляться read-heavy віяльні задачі: пошук, аудит, збір інформації — вони нічого не змінюють, тож не заважають одне одному;
- погано паралеляться write-heavy звʼязані задачі, де кроки залежать від результатів сусіда: тут послідовність дешевша й безпечніша.
Правило те саме, що для ізоляції тестів: спільний змінюваний стан — джерело болю. Хочете паралелити сабагентів — спершу переконайтеся, що їхні шматки роботи не перетинаються.
Headless-режим у CI
Інтерактивний агент у терміналі розрахований на людину поруч, яка підтверджує дії. У CI людини немає — і тут вмикається headless-режим (безголовий, неінтерактивний). У Claude Code це прапорець -p (або --print): агент отримує промпт, робить роботу, друкує результат і завершується.
claude -p "Проаналізуй лог падіння і познач ймовірну причину" \
--allowedTools "Read,Bash" --output-format json
Кілька речей, критичних саме для CI:
- Структурований вивід.
--output-format jsonвіддає результат машиночитним (є щеtextіstream-json), тож наступний крок пайплайна може його розпарсити. У JSON-відповіді повертається й вартість запуску — зручно стежити за витратами. - Дозволи без людини. Головний запобіжник агента — human-in-the-loop (людина в контурі) — у headless зникає: підтверджувати нема кому. Тому інструменти доводиться дозволяти наперед (
--allowedTools) і тримати список вузьким. Для зачинених CI-прогонів є суворі режими дозволів, що забороняють усе, крім явно дозволеного. - Оркестрація без нагляду. Скрипт може запустити агента, який сам роздасть роботу сабагентам, — і все це відпрацює без людини. Саме тому в CI особливо важить безпека: незворотні дії (видалення даних, деплой,
git push) без гейта — це та сама каскадна біда з глави про агентів, тільки тепер без нагляду. Тримайте прогон у пісочниці, давайте read-only там, де можна, і обмежуйте інструментарій (докладніше — у главі про безпеку й приватність при роботі з AI).
Типові QA-сценарії headless: тріаж падінь у нічному прогоні, генерація тесту з тікета, лінтер-рецензент на дифі PR. Базовий воркфлоу й дозволи розібрано у главах Claude Code: базовий воркфлоу для QA і Памʼять, скіли та слеш-команди.
Ціна оркестрації
Мультиагентність — не безкоштовна. Платити доводиться за кількома статтями:
- Токени, і багато. Кожен сабагент — це окреме вікно з власним системним промптом і власною наростаючою історією; кожен крок кожного агента перевідсилає свою історію. За оцінкою Anthropic, їхня багатоагентна дослідницька система спалювала приблизно у 15 разів більше токенів, ніж звичайна чат-взаємодія. Сам вузький канал теж коштує: бриф униз і звіт угору — це додаткові токени понад корисну роботу.
- Складніший дебаг. Коли результат поганий, причина може бути в поганому розбитті оркестратора, у роботі конкретного сабагента або у зведенні звітів. Недетермінізм (глава про те, як працюють LLM) множиться на кількість агентів — відтворити фейл важче.
- Координаційний оверхед. Погане розбиття знецінює всю роботу сабагентів: якщо оркестратор дав нечіткі брифи, звіти будуть неякісні, і зводити нема чого.
Звідси висновок, спільний із главою про агентів: спершу найпростіше рішення. Один агент дешевший і передбачуваніший; сабагенти виправдані лише тоді, коли задача справді ділиться на незалежні шматки і виграє від ізоляції контексту (широкий пошук, аудит, дослідження). Для тісно звʼязаної послідовної роботи один агент упорається дешевше.
Типові помилки
Виглядає як економія контексту, а насправді роздутий рахунок. Дрібну задачу розбили на сабагентів — і кожен наново завантажив системний промпт, описи інструментів, свій контекст. На малому обсязі накладні витрати зʼїдають будь-яку вигоду; сабагенти окупаються лише на масштабі.
Виглядає як паралелізм, а насправді гонка. Кілька сабагентів одночасно правлять ті самі файли або сидять на тих самих тестових даних — конфлікти й недетермінований результат, як у неізольованих паралельних тестів. Паралелити можна лише незалежне.
Виглядає як передана задача, а насправді сабагент осліп. Бриф написали так, ніби сабагент бачить розмову оркестратора. Він не бачить — і або вигадує деталі, або повертає не те. Лікується самодостатнім дорученням.
Виглядає як звіт, а насправді половина загублена. Сабагент зробив роботу, але у звіт не вписав ключову знахідку (той самий шлях до файлу). Оркестратор її вже не дістане — транскрипт сабагента зник. Проєктуйте звіт як повний артефакт.
Виглядає як автономний CI-ран, а насправді знятий запобіжник. Headless прибирає human-in-the-loop; сабагент із правами на запис чи деплой і без нагляду — це незворотні дії без гейта. У CI інструменти мусять бути обмежені туго.
Підсумок
- Сабагент = окремий екземпляр моделі зі своїм свіжим контекстом. Назад до оркестратора повертається лише звіт, а не транскрипт роботи.
- Головна причина ділити — ізоляція контексту, а не паралелізм: сабагент тримає брудну роботу у своєму вікні, головний контекст лишається чистим.
- Канал між оркестратором і сабагентом вузький і лоссі. Задача вниз має бути самодостатньою, звіт угору — повним; що не передав — того нема.
- Паралелити можна лише незалежне. Спільний змінюваний стан (ті самі файли, ті самі дані) = гонка, точно як у паралельних автотестів.
- Оркестрація коштує кратно дорожче (близько 15x токенів у Anthropic) і важче дебажиться. Спершу — найпростіше рішення; сабагенти виправдані лише на великих задачах, що діляться.
- Headless знімає human-in-the-loop — у CI обмежуйте інструменти туго й гейтьте незворотні дії.
Що питають на співбесіді
- «Навіщо взагалі сабагенти, чому не один агент?» — інтервʼюер слухає, чи назвете ізоляцію контексту, а не лише «щоб швидше». Сильна відповідь: один агент на великій задачі засмічує собі контекст, сабагент робить брудну роботу у своєму вікні й повертає вичавку.
- «Як оркестратор передає роботу сабагенту і що отримує назад?» — очікують «самодостатній бриф униз, звіт угору; транскрипт сабагента назад не перетинає». Бонус — що межа лоссі, тож бриф і звіт треба проєктувати.
- «Коли мультиагентність — overkill?» — червоний прапорець, якщо кандидат тулить сабагентів усюди. Сильний назве ціну (кратно більше токенів, складніший дебаг) і «спершу найпростіше»: для звʼязаної послідовної роботи один агент дешевший.
- «Що небезпечного в запуску агента headless у CI?» — чекають: зникає human-in-the-loop, тож інструменти треба обмежити наперед, а незворотні дії — гейтити або тримати в пісочниці.
Джерела
- Claude Code — Create custom subagents: свій контекст, делегування за полем
description, файли в.claude/agents/і фронтматер (name/description/tools/model). - Claude Code — Run Claude Code programmatically: headless-режим
claude -p,--allowedTools,--output-format, режими дозволів для CI. - Anthropic — Building Effective Agents: патерн оркестратор-виконавці й принцип «найпростіше рішення спершу».
- Anthropic — How we built our multi-agent research system: паралельні сабагенти, ізоляція контексту й оцінка ціни (близько 15x токенів).
- Силабус ISTQB CTFL 4.0 оркестрації агентів не торкається; найближчий напрям ISTQB — Certified Tester AI Testing (CT-AI), хоча він про тестування AI-систем, а не про використання агентів для QA.
Що таке сабагент простими словами?
Сабагент (subagent) — це окремий екземпляр моделі, запущений з нуля: власне контекстне вікно, власний системний промпт, свій обмежений набір інструментів і дозволів. Він не бачить розмову провідного агента й не ділить із ним памʼять. Уся взаємодія зводиться до трьох речей: він отримує доручення, робить роботу у своєму вікні й повертає одне фінальне повідомлення. Для QA це спосіб віддати «брудну» роботу (пошук, читання пачки файлів, перебір гіпотез) убік, щоб головний контекст не заплив нею.
Навіщо взагалі ділити роботу на сабагентів, якщо один агент теоретично впорається?
Головна причина — не швидкість, а чистота контексту. Один агент на великій задачі неминуче засмічує собі вікно: туди лягають проміжні викиди інструментів, які більше не знадобляться, і гіпотези, від яких він уже відмовився, — а кожен крок агента ще й перевідсилає всю цю історію заново. Це прямо псує якість (на довгому контексті модель гірше тримає деталі) і роздуває рахунок. Сабагент забирає цю роботу у своє вікно й повертає лише вичавку, тож головний контекст лишається чистим. Паралелізм і спеціалізація — приємні бонуси, але суть саме в ізоляції.
Які три різні задачі розвʼязує поділ на сабагентів, і яка з них головна?
Ізоляція контексту, паралелізм і спеціалізація — і плутати їх не варто. Ізоляція: сабагент тримає брудну роботу у власному вікні, а нагору віддає підсумок — це головний виграш. Паралелізм: незалежні підзадачі йдуть одночасно, тож реальний час до результату коротшає. Спеціалізація: кожен сабагент має власний системний промпт і вузький інструментарій — окремий «дослідник», окремий «рецензент». Показовий момент: навіть на одній машині без жодного паралелізму сабагенти вже виправдані, бо бережуть головний контекст.
З чого складається взаємодія оркестратора з сабагентом?
З трьох речей: контекст, задача, звіт. Контекст — те, з чим сабагент стартує: його роль, доступні інструменти й порожня свіжа історія; нічого з накопиченого оркестратором сюди не потрапляє. Задача — конкретне доручення, і оскільки сабагент осліп до розмови вище, воно мусить бути самодостатнім. Звіт — єдине фінальне повідомлення нагору; уся проміжна робота лишається в контексті сабагента й межу не перетинає. Тобто на вході — бриф, на виході — підсумок, а десятки кроків посередині оркестратор не бачить взагалі.
Що означає, що канал між оркестратором і сабагентом «вузький і лоссі»?
Що між ними лише один прохід: задача вниз, звіт угору — і більше нічого. Це схоже на виклик функції з серіалізацією аргументів: усе, що не поклали в задачу, всередині сабагенту недоступне, а все, чого він не вписав у звіт, зовні втрачено назавжди. Лоссі (з втратами, lossy) — бо транскрипт сабагента після завершення зникає, і дістати з нього щось постфактум уже не вийде. Практичний висновок: і бриф, і звіт — це інтерфейси, які треба свідомо проєктувати, а не сподіватися, що «і так зрозуміло».
Чому доручення сабагенту має бути самодостатнім?
Бо сабагент не бачить контекст оркестратора — для нього розмови вище не існує. Доручення на кшталт «полагодь ці тести» без переліку файлів, симптомів і критерію готовності приречене: сабагент або вигадає деталі, або зробить не те. Добрий бриф — це, по суті, добре написаний баг-репорт, відданий інженеру, якого не було в кімнаті: шляхи, факти, очікуваний результат — усе в тексті. Ця помилка одна з найчастіших: люди пишуть задачу так, ніби сабагент читав усю попередню розмову.
Сабагент зробив роботу, але оркестратор не отримав ключову знахідку. Як таке можливо?
Звіт вийшов неповним. Скажімо, сабагент знайшов точний шлях до зламаного локатора, але у фінальне повідомлення його не вписав — а транскрипт із усіма проміжними кроками вже зник разом із контекстом сабагента. Оркестратор бачить лише те, що прийшло у звіті, тож знахідку він просто не дістане. Саме тому звіт треба проєктувати як повний артефакт: усе важливе — знахідки, шляхи, невдалі спроби — має бути явно в тексті, а не лишатися «в голові» сабагента.
Що робить оркестратор і чому його теж треба обмежувати?
Оркестратор (orchestrator) — це провідний агент, чия робота не «зробити самому», а розбити мету на незалежні підзадачі, роздати кожну сабагенту з самодостатнім брифом, зібрати звіти й звести їх у результат (узгодивши суперечності й вирішивши, чи потрібен ще раунд). Важливо, що він теж агент у циклі: його «дії» — це виклики сабагентів, а «спостереження» — їхні звіти. А отже, він так само може зациклитись чи згубити мету, тож ті самі запобіжники — ліміт кроків, умови зупинки — потрібні й тут.
Що таке патерн «оркестратор-виконавці» (orchestrator-workers)?
Це канонічна схема мультиагентності, де провідний агент динамічно вирішує, на скільки й яких саме підзадач бити роботу, а не йде за жорстко прописаним наперед планом. Оркестратор тримає загальну картину й стратегію, виконавці-сабагенти тримають деталі й тактику. Гнучкість тут і є цінністю: якщо після першого раунду звітів видно, що покриття недостатнє, оркестратор може нарізати ще підзадач. Це відрізняє його від статичного пайплайна з фіксованими кроками, який не вміє підлаштуватись під те, що реально знайшлося.
Коли сабагентів можна запускати паралельно, а коли — ні?
Паралелити можна лише незалежне — умова та сама, що й для паралельного запуску автотестів. Добре паралеляться read-heavy віяльні задачі: пошук, аудит, збір інформації — вони нічого не змінюють, тож не заважають одне одному, і три пошуки завершаться приблизно за час найдовшого, а не їхньої суми. Погано паралеляться write-heavy звʼязані задачі: два сабагенти, що одночасно правлять той самий файл чи сидять на тих самих тестових даних, влаштують гонку — конфлікти, перезаписи, недетермінований результат. Спільний змінюваний стан тут таке саме джерело болю, як у неізольованих тестах.
Як у Claude Code технічно описується сабагент?
Це Markdown-файл із YAML-фронтматером у .claude/agents/ для конкретного проєкту або в ~/.claude/agents/ для всіх ваших проєктів. У фронтматері — поля name, description, tools (обмежує інструментарій) і model (дозволяє посадити дешевшу роботу на дешевшу модель). Тіло файлу під фронтматером — це системний промпт сабагента, тобто його роль та інструкції. Ключова деталь: поле description не декоративне — саме за ним провідний агент вирішує, коли делегувати задачу цьому сабагенту, тож опис має чітко казати, для чого цей сабагент і коли його кликати.
Що таке headless-режим і навіщо він потрібен у CI?
Інтерактивний агент у терміналі розрахований на людину поруч, яка підтверджує дії. У CI такої людини немає, тому вмикається headless-режим (безголовий, неінтерактивний): у Claude Code це прапорець -p (він же --print) — агент отримує промпт, робить роботу, друкує результат і завершується. Щоб наступний крок пайплайна міг розпарсити відповідь, вивід роблять структурованим через --output-format json (є ще text і stream-json), і там же повертається вартість запуску — зручно стежити за витратами. Типові сценарії: тріаж падінь у нічному прогоні, генерація тесту з тікета, лінтер-рецензент на дифі PR.
Що небезпечного в запуску агента headless у CI?
Headless прибирає головний запобіжник агента — human-in-the-loop (людину в контурі): підтверджувати дії нема кому. Тому інструменти доводиться дозволяти наперед через --allowedTools і тримати цей список навмисно вузьким; для зачинених прогонів існують суворі режими дозволів, що забороняють усе, крім явно дозволеного. Найгостріше питання — незворотні дії: сабагент із правами на видалення даних, деплой чи git push і без нагляду — це та сама каскадна біда, що й у звичайного агента, тільки тепер її нема кому спинити. Рецепт: пісочниця, read-only там, де можна, і туго обмежений інструментарій.
Чому мультиагентність коштує кратно більше токенів?
Бо кожен сабагент — це окреме вікно з власним системним промптом і власною наростаючою історією, і кожен крок кожного агента перевідсилає свою історію заново. За оцінкою Anthropic, їхня багатоагентна дослідницька система спалювала приблизно у 15 разів більше токенів, ніж звичайна чат-взаємодія. Додає й сам вузький канал: бриф униз і звіт угору — це токени понад корисну роботу. До прямої ціни в токенах додаються ще й непрямі: дебажити важче (причина поганого результату може бути в розбитті оркестратора, у самому сабагенті або у зведенні звітів), а недетермінізм множиться на кількість агентів.
Коли мультиагентність — це overkill, і що робити спершу?
Правило те саме, що й для агентів загалом: спершу найпростіше рішення. Один агент дешевший і передбачуваніший, тож сабагенти виправдані лише тоді, коли задача справді ділиться на незалежні шматки й виграє від ізоляції контексту — широкий пошук, аудит набору, дослідження. Для тісно звʼязаної послідовної роботи, де кожен крок залежить від попереднього, один агент упорається дешевше й надійніше. Червоний прапорець на співбесіді — кандидат, що тулить сабагентів усюди: сильна відповідь називає ціну (кратно більше токенів, складніший дебаг) і починає з простого.
Дрібну задачу розбили на сабагентів, а рахунок несподівано зріс. Чому?
Бо на малому обсязі накладні витрати зʼїдають будь-яку вигоду. Кожен сабагент наново завантажує свій системний промпт, описи всіх доступних інструментів і піднімає власний контекст — і якщо корисної роботи там на кілька кроків, ця фіксована «плата за вхід» переважує економію. Ізоляція контексту окупається лише на масштабі, коли брудної роботи справді багато й вона діляється. Отже, симптом «розбили на сабагентів, а стало дорожче й не швидше» — це майже завжди ознака того, що задача була замала для мультиагентності й її мав робити один агент.
Три кейси, де видно механіку сабагентів на реальній роботі QA: як описати сабагента в Claude Code й чим добрий бриф відрізняється від «сабагент осліп», як за таблицею рішень обрати між одним агентом і роздачею на виконавців, і як безпечно запустити тріаж падінь headless у CI. Скрізь — що робити і чому саме так.
Кейс 1. Сабагент у Claude Code: файл, бриф, звіт
Задача — проаудитувати e2e-набір на крихкі локатори (XPath за індексом, класи з хешем від CSS-модулів). Це класична робота під сабагента: read-heavy, ділиться на пакети, засмічує контекст читанням десятків файлів. Опис сабагента кладемо у .claude/agents/locator-auditor.md:
---
name: locator-auditor
description: Знаходить крихкі локатори в e2e-тестах (XPath за позицією, класи з хешем, прив'язка до тексту) і повертає список підозрілих із файлом і рядком. Кликати при аудиті стабільності набору.
tools: Read, Grep, Glob
model: sonnet
---
Ти — аудитор стабільності локаторів. Для кожного переданого файлу
знайди селектори, що ламаються на кожному білді, і поверни звіт:
шлях, рядок, тип ризику, пропонована заміна на data-testid чи ARIA.
Нічого не редагуй — лише звітуй.
Тіло під фронтматером — системний промпт, tools тримає сабагента в режимі «тільки читати» (жодного Write чи Bash), description каже оркестратору, коли цей сабагент доречний.
Тепер найважливіше — доручення, яке шле оркестратор. Сабагент не бачить розмови вище, тож порівняйте два брифи:
Поганий: «Подивись наші тести й познач погані локатори.»
Добрий: «Проаналізуй файли tests/e2e/checkout/*.spec.ts.
Крихкими вважай: XPath із позиційним індексом,
CSS-класи з 6+ hex-символами, getByText на динамічному тексті.
Поверни таблицю: файл | рядок | тип ризику | заміна.»
Що дивитися і чому:
- Поганий бриф прирікає сабагента на вигадування. «Наші тести» — де вони? «Погані» — за яким критерієм? Сабагент осліп до контексту оркестратора, тож він або піде шукати навмання, або вирішить за вас, що таке «поганий локатор». Самодостатній бриф — це шляхи, критерії й формат виходу в самому тексті, як баг-репорт для інженера, якого не було в кімнаті.
- Формат звіту задають у брифі, а не сподіваються. Якщо сабагент поверне суцільний абзац міркувань, оркестратору важко буде звести це з іншими пакетами. Проситимете таблицю з полем
рядок— отримаєте те, що можна злити докупи. - Звіт — єдине, що переживе сабагента. Усі проміжні кроки (десятки прочитаних файлів) лишаться в його контексті й зникнуть. Якщо сабагент знайшов крихкий локатор, але не вписав шлях у таблицю, — оркестратор його вже не дістане.
Кейс 2. Таблиця рішень: один агент чи сабагенти
Найдорожча помилка — тулити сабагентів туди, де вистачило б одного агента (роздутий рахунок), або навпаки садити одного агента на задачу, що просить поділу. Спершу — коли поділ виправданий:
| Задача | Рішення | Чому |
|---|---|---|
| Полагодити один флакі-тест із відомою причиною | Один агент | Мало контексту, немає що ізолювати; сабагенти лише додадуть накладних витрат |
| Проаудитувати 200 тестів на крихкі локатори | Сабагенти | Read-heavy, ділиться на пакети, ізолює брудне читання від головного контексту |
| Рефакторинг, де крок N спирається на результат кроку N−1 | Один агент | Звʼязана послідовність; поділ лише поламає залежності між кроками |
| Широкий пошук «де ще використовується цей хелпер» по 5 пакетах монорепо | Сабагенти паралельно | Незалежні шматки, нічого не змінюють — ідеально під віяло |
Коли поділ обрано, друге питання — паралелити чи послідовно:
| Характер підзадач | Паралельно? | Ризик |
|---|---|---|
| Пошук / аудит / збір інформації (read-heavy) | Так | Нічого не змінюють — конфліктів немає |
| Незалежні правки в різних файлах | Обережно | Безпечно, лише поки шматки не перетинаються |
| Кілька сабагентів правлять той самий файл | Ні | Гонка: перезаписи, недетермінований результат |
| Крок одного залежить від звіту іншого | Ні | Послідовність тут дешевша й безпечніша |
Логіка обох таблиць одна: спільний змінюваний стан — джерело болю, точно як у неізольованих паралельних тестів. Хочете паралелити — спершу переконайтеся, що шматки роботи не перетинаються; сумніваєтесь — робіть послідовно або одним агентом.
Кейс 3. Headless-тріаж падінь у CI
Нічний прогон червоний, треба автоматично протріажити лог і повісити ймовірну причину, без людини поруч. Це headless-режим: агент отримує промпт, працює, друкує JSON і виходить. Ключ до безпеки — туго обмежений інструментарій.
claude -p "Проаналізуй лог падіння з файлу $LOG_PATH. Визнач ймовірну
причину (таймаут / гонка / зіпсовані дані / баг застосунку) і коротко
обґрунтуй. Поверни лише JSON з полями reason та evidence." \
--allowedTools "Read" \
--output-format json > triage.json
Наступний крок пайплайна парсить структурований вивід і, наприклад, лишає коментар у тікеті:
REASON=$(jq -r '.result | fromjson | .reason' triage.json)
COST=$(jq -r '.total_cost_usd' triage.json)
echo "Ймовірна причина: $REASON (вартість тріажу: \$$COST)"
Що дивитися і чому:
--allowedTools "Read"— і жодного Write, Bash чи мережі. У headless нема кому підтверджувати дії: human-in-the-loop зник. Тріаж має лише читати лог, тож дозволяємо рівно це. Дати сюди Bash чи права на деплой — означає пустити незворотні дії без гейта й без нагляду.--output-format jsonробить вивід машиночитним. Без нього наступний крок довелося б парсити регулярками з вільного тексту. У JSON-відповіді приходить іtotal_cost_usd— зручно тримати око на витратах headless-прогонів, які легко ростуть непомітно.- Оркестрація теж може бути headless. Скрипт здатен запустити агента, який сам роздасть роботу сабагентам, — і все відпрацює без людини. Саме тому в CI безпека важить особливо: прогін тримають у пісочниці, дають read-only там, де можна, а незворотні дії (видалення, деплой,
git push) гейтять окремо. - Тріаж каже «ймовірна причина», а не вирок. Агент читає лог і висуває гіпотезу — далі її ще має підтвердити людина або окремий крок. Автоматично закривати тікет як «не баг» на основі одного headless-тріажу небезпечно: недетермінізм нікуди не подівся.
Навіщо ділити роботу
- Можу назвати головну причину сабагентів — ізоляція контексту, а не паралелізм чи «щоб швидше».
- Розумію, чому один агент на великій задачі сам собі засмічує вікно: проміжні викиди інструментів і покинуті гіпотези, які щокроку перевідсилаються заново.
- Не плутаю три різні вигоди поділу: ізоляція контексту, паралелізм, спеціалізація.
Анатомія сабагента
- Знаю, що сабагент — окремий екземпляр моделі зі своїм вікном, промптом, інструментами й дозволами, який не бачить історію оркестратора.
- Можу назвати три складові взаємодії: контекст (з чим стартує), задача (доручення вниз), звіт (єдине повідомлення нагору).
- Знаю, що в Claude Code сабагент — це Markdown-файл із фронтматером у
.claude/agents/(проєкт) чи~/.claude/agents/(глобально), а тіло файлу — його системний промпт. - Розумію, що поле
descriptionне декор: саме за ним оркестратор вирішує, коли делегувати задачу цьому сабагенту.
Вузький канал: задача і звіт
- Розумію, що канал між оркестратором і сабагентом один і лоссі: задача вниз, звіт угору, а транскрипт роботи назад не перетинає.
- Можу пояснити, чому задача має бути самодостатньою (сабагент осліп до контексту вище) — і що добрий бриф схожий на баг-репорт для інженера, якого не було в кімнаті.
- Можу пояснити, чому звіт має бути повним артефактом, а не «і так зрозуміло»: після завершення транскрипт сабагента зникає.
Оркестрація і паралелізм
- Можу описати роль оркестратора чотирма дієсловами: розбити, роздати, зібрати, звести.
- Знаю патерн orchestrator-workers: оркестратор динамічно вирішує, на скільки й яких підзадач бити, а не йде за жорстким планом.
- Знаю, що паралелити можна лише незалежне: read-heavy пошук/аудит — так, write-heavy зі спільним станом — гонка.
Headless у CI
- Розумію, що headless (
-p/--print) прибирає human-in-the-loop, тож дозволи треба видавати наперед через--allowedToolsі тримати список вузьким. - Знаю, навіщо
--output-format json: машиночитний вивід для наступного кроку пайплайна плюс вартість запуску. - Можу пояснити, чому незворотні дії (видалення, деплой,
git push) у headless-прогоні треба гейтити або тримати в пісочниці.
Ціна й коли не варто
- Знаю порядок ціни: багатоагентна система ≈ 15x токенів проти звичайного чату (оцінка Anthropic).
- Розумію, чому дебаг мультиагента важчий: причина може бути в розбитті, у сабагенті або у зведенні, а недетермінізм множиться на кількість агентів.
- Можу пояснити правило «спершу найпростіше»: для звʼязаної послідовної роботи один агент дешевший і передбачуваніший.
- Розумію, чому дрібну задачу не варто дробити: накладні витрати на кожен сабагент зʼїдають вигоду, і сабагенти окупаються лише на масштабі.
Яка головна причина ділити роботу на сабагентів?
Питання
Сабагент (subagent) — що це?