JavaRush /Курсы /Claude code /Subagents: тихое расследование

Subagents: тихое расследование

Claude code
8 уровень , 2 лекция
Открыта

1. Большое расследование засоряет основную сессию

Компактный пакет улик — код, команду, вывод, trace, скриншот — вы уже умеете приносить. Этого хватает на локальный вопрос. Но как только надо пройтись по нескольким модулям и вернуться с коротким проверяемым выводом, всплывает другая проблема: расследование захламляет основную сессию.

Расследование почти всегда шире, чем правка одного метода. Claude читает много файлов, держит гипотезы, сравнивает тесты, копит куски логов. Это нормально. Плохо то, что дальше: основная сессия тащит весь этот багаж с собой, даже когда вам нужен только итог.

Пример. В Commerce OS вы разбираете refund flow. Claude читает OrderController, RefundService, OrderService, клиент платёжного провайдера, пару конфигов, тесты и старый лог с ошибкой. На этапе поиска всё полезно. Но потом вы хотите просто дописать строку в API_MAP.md — а сессия всё ещё «помнит» весь промежуточный шум, включая отброшенные гипотезы.

Решение — subagent. Тяжёлое чтение уходит в отдельное окно контекста. Назад возвращается не мусор, а выжимка: что нашли, где, что не проверили, что дальше.

Основная сессия
  └─ ставит задачу investigation
       └─ subagent читает много файлов и логов
            └─ возвращает только summary + evidence
                 └─ основная сессия принимает решение

2. Subagent — это отдельное окно контекста

Subagent — не «мини-разработчик» и не «магический стажёр», а отдельное окно контекста под узкую исследовательскую задачу. Его сила не в уме, а в изоляции: он много читает, много ищет и отдаёт наружу только то, что нужно для следующего шага.

Модель простая. Основная сессия формулирует вопрос. Subagent проводит исследование. Основная сессия получает короткий результат и на его основе обновляет артефакты и решает дальше. Subagent — не замена сессии, а её «комната для шума».

Небольшая таблица помогает это зафиксировать:

Механизм Что происходит Когда уместно
Основная сессия Всё исследование остаётся в одном контексте Когда вопрос маленький и ответ тоже маленький
Subagent Исследование уходит в отдельное окно, назад приходит только выжимка Когда нужно прочитать много, а вернуть мало
Свежая сессия Вы начинаете новый диалог почти с нуля Когда текущая сессия уже загрязнена целиком

Очень важно и то, чем subagent сегодня не является. Мы не конфигурируем кастомных агентов, не настраиваем разрешения, не собираем multi-agent pipeline и не строим «армию исследователей». Пока это просто паттерн — вынести тяжёлое расследование из основной сессии.

3. Subagent нужен, когда читать надо много, а вернуть мало

Новый приём тянет применять везде. Удержитесь. Subagents полезны не тем, что звучат красиво, а тем, что уменьшают context pollution.

Один файл, одна строчка в тесте, известный заранее обработчик — subagent тут лишний посредник. А вот просканировать все routes, найти все точки вызова Stripe, собрать тесты вокруг refund flow, обойти большой модуль и вернуть только summary — его работа.

Посмотрите на это так:

Хороший кандидат для subagent Плохой кандидат для subagent
Найти все точки интеграции с платёжным провайдером Прочитать один контроллер
Проверить, какие тесты покрывают конкретный эндпоинт Понять одну строку stack trace
Собрать evidence по большому diff Уточнить имя метода в уже открытом файле
Просканировать конфиги, тесты и клиенты по одному потоку Сделать маленькое исправление в docs

Вопрос к себе один: «Мне нужно, чтобы Claude много прочитал, но мало вернул?» Если да — subagent почти наверняка полезен. Если нужен длинный интерактивный разговор по ходу чтения — оставайтесь в основной сессии. Subagent любит чёткие рамки и короткий проверяемый результат.

4. Ставьте задачу как мини-версию task spec

Бесполезное investigation почти всегда от размытой постановки, а не от плохого Claude. С subagent это видно особенно хорошо. Скажете «посмотри, что тут с платежами» — он честно посмотрит, подумает и вернёт туман. Поэтому subagent task оформляется как маленький task spec.

Рабочий шаблон очень простой:

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

Вот хороший пример для Commerce OS:

Исследуй, где в Commerce OS проходят refund-операции.
Смотри только controllers, services, payment client, configs и tests.
Верни короткое summary, file:line ссылки, связанные тесты и open questions.
Не меняй файлы и не присылай длинные куски кода.

Заметьте, здесь нет магии. Вы не пишете «будь лучшим аналитиком на свете». Вы задаёте цель, границы и формат ответа. Это всё та же инженерная дисциплина из предыдущих модулей, только на более мелком уровне.

Ещё один пример — уже под задачу из текущего модуля, где вы поддерживаете API_MAP.md:

Найди все точки, где проект общается со Stripe.
Проверь build file, client code, config keys, env vars и integration tests.
Верни только подтверждённые места с file:line ссылками.
Если что-то похоже на гипотезу, пометь это явно.

Такой запрос особенно хорош тем, что сразу заставляет subagent разделять факт и предположение. А это сильно экономит вам время на проверке.

5. Хороший ответ — это output contract

Subagent полезен, только если назад приходит рабочий результат, а не «литературное расследование на шесть экранов». Для этого нужен output contract. Не пугайтесь громкого слова: это просто заранее оговорённый формат ответа.

Хороший ответ почти всегда содержит пять вещей:

summary — суть в двух строках;

evidencefile:line ссылки для проверки;

assumptions — где subagent догадался, а не увидел;

open questions — что не смог подтвердить;

next steps — что логично делать основной сессии дальше.

Summary: refund flow входит через `OrderController`, дальше идёт в
`RefundService`, а внешний вызов уходит через `StripeClient`.

Доказательства:
- `src/orders/OrderController.java:41-67`
- `src/refunds/RefundService.java:18-73`
- `src/payments/StripeClient.java:88-123`
- `src/test/.../RefundServiceTest.java:22-64`

Предположения:
- webhook-обработка, вероятно, есть, но не подтверждена.

Открытые вопросы:
- не найден тест на проверку подписи webhook.

Следующие шаги:
- проверить webhook handler и обновить `API_MAP.md`.

Ответ короткий и проверяемый. Плохой — наоборот: двадцать file paths без контекста, огромные цитаты кода, неявные догадки, «всё вроде находится тут». Правило простое: subagent должен сжимать исследование, а не дублировать его. Иначе вы поменяли место хранения шума, а не убрали его.

6. Subagent помогает заполнить API_MAP.md

Свяжем это с Commerce OS. В API_MAP.md уже зафиксированы первые маршруты и интеграции. Теперь надо дополнить раздел внешних интеграций — описать платёжного провайдера и точки refund flow. Целиком в основной сессии это утопит её в деталях, поэтому работаете через subagent.

Основная сессия ставит задачу: «Найди все подтверждённые точки интеграции со Stripe: dependency, client, config keys, места вызова checkout/refund, связанные tests. Верни короткую выжимку с evidence и open questions». Subagent уходит читать код, сессия держит только цель — обновить артефакт.

Возвращается, допустим, такое:

Summary: Stripe подключён как внешний payment provider; checkout и refund
идут через один client class.

Доказательства:
- `build.gradle:34`
- `src/payments/StripeClient.java:14-145`
- `src/orders/OrderService.java:132-154`
- `src/refunds/RefundService.java:87-104`
- `src/main/resources/application.yml:54-61`

Открытые вопросы:
- webhook signature validation не подтверждена тестом.

Из такой выжимки удобно обновлять API_MAP.md, troubleshooting note или черновик документации, не перетаскивая назад весь сырой поиск. Но в API_MAP.md это не копируется вслепую: основная сессия проверяет два-три опорных места, чтобы убедиться, что выводы не фантазия, и только потом обновляет артефакт.

Фрагмент API_MAP.md может стать таким:

## Внешние интеграции

- Stripe payment provider
  - dependency: `build.gradle:34`
  - client: `src/payments/StripeClient.java:14-145`
  - checkout call: `src/orders/OrderService.java:132-154`
  - refund call: `src/refunds/RefundService.java:87-104`
  - config: `src/main/resources/application.yml:54-61`
  - open question: webhook signature validation not verified

Тут сходятся предыдущие лекции. Из лекции 1 — формат карты. Из лекции 2 — привычка опираться на evidence. Из сегодняшней — способ добыть evidence, не утопив основную сессию. Новые приёмы не живут отдельно, а достраивают знакомый workflow.

7. Возвращаем выводы в основную сессию

Финиш — место, где легко всё испортить. Subagent отработал хорошо, а основная сессия тащит назад весь сырой материал или начинает спорить с ним на эмоциях. Спасает простой порядок.

Сначала сессия принимает только summary и evidence. Потом выборочно проверяет два-три опорных места — те ссылки, на которых держится вывод. Потом обновляет артефакт: API_MAP.md, investigation note или docs draft. И только затем, если нужно, ставит следующий вопрос.

Основная сессия
   ↓ формулирует mini task spec
Subagent
   ↓ приносит summary + citations
Вы
   ↓ проверяете опорные места
Артефакт
   ↓ обновляется через diff

Subagent не снимает с вас ответственность. Он не решает за разработчика — он сокращает стоимость исследования. Владелец результата по-прежнему вы: какие выводы войдут в API_MAP.md, какие останутся open questions, а какие уйдут в корзину как неподтверждённые, решаете вы.

В этом весь подход. Subagent не делает сессию умнее. Он не даёт ей захламиться — а чистая сессия работает лучше.

1
Задача
Claude code, 8 уровень, 2 лекция
Недоступна
Investigation через delegation/subagent механизм
Investigation через delegation/subagent механизм
1
Задача
Claude code, 8 уровень, 2 лекция
Недоступна
Investigation brief для subagent
Investigation brief для subagent
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ