Главная / Статьи

Два ведущих элемента, девять проектов: практическое применение многоподразделочной схемы Claude Code

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

Издатель: REACTAPP.TOP12 мин чтения2810 слов

Источники: Inside a Real Multi-Agent Claude Code Setup: Two Leads, 9 Projects, 40 Prompts a Day

Многие описания многокомпонентных систем имеют одинаковую структуру: диаграмма с ячейками, помеченными как «Оркестратор», «Рабочий 1» и «Рабочий 2», стрелка с надписью «результаты» и сорок строк псевдокода, которые теряют смысл сразу же, как только два агента приходят к противоположным выводам. Редко говорится о том, что происходит, когда «Рабочий 2» продолжает работу после того, как результаты «Рабочего 1» опровергли его предположения, или когда оркестратор выходит из строя на середине выполнения задачи. Такие описания напоминают диаграммы, нарисованные человеком, которого никогда не будили посреди ночи из-за агента, тратившего шесть часов на бесконечные попытки решения проблемы, которое никогда не могло увенчаться успехом.

Этот обзор использует иной подход. В нем описывается способ настройки, предложенный одним разработчиком, применяемый в девяти активных проектах и отточенный примерно за три месяца до состояния, достаточно надежного для использования. Цель — добиться максимальной надежности. В следующих разделах рассматривается структура, функции Claude Code, делающие её технически осуществимой, моменты, в которых она терпит неудачи в соответствии с результатами собственных исследований Anthropic в области многокомпонентных систем, а также те части, которые следует скопировать отдельному разработчику. Конкретные детали взяты из описания самого разработчика и не проверялись независимо.

Как выглядит структура

Два основных агента находятся в верхней части системы и носят прозвища lead-alpha и lead-beta. Каждый из них представляет собой долгоживущую сессию Claude Code, работающую на разном оборудовании: небольшом устройстве, которое никогда не выключается, и виртуальной машине в облаке. Они контролируют друг друга. Каждые несколько минут каждый из них отправляет своему партнеру короткое сообщение с помощью функции SendMessage. Когда один из агентов замолкает дольше разрешенного времени, другой восстанавливает его работу, либо напрямую перезапуская сессию, если может к ней подключиться, либо запуская запланированную задачу, которая создает новую сессию, связанную с контекстом данного проекта.

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

Под двумя руководителями находятся девять проектов. У каждого из них есть свой агент технического руководителя и агент менеджера проекта, которые создаются и находятся под контролем соответствующего верхнего руководителя проекта; ответственность между ними делится примерно пополам, в основном по областям деятельности, а также частично в зависимости от того, у кого в ту неделю было меньше задач. Агент менеджера проекта отслеживает объем работ, разделяет поступающие запросы на задачи и определяет порядок их выполнения. Агент технического руководителя занимается техническим разбиением задач, решает, какой агент конкретного участника будет работать над какой частью, и проверяет изменения перед тем, как они попадут к человеку.

Каждый технический лидер управляет от 5 до 10 инженерами, каждый из которых занимается определённой частью кодовой базы или определённым типом задач. Один из них отвечает только за скрипты миграции, и это правило возникло в тот день, когда инженер-универсал убрал папку с скриптами миграции, предположительно исправляя что-то не связанное. Всего получается примерно 75–90 ролей агентов, причём большинство инженерных мест остаются свободными, поскольку нет очереди задач.

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

+---------------------------------+------------------+
| Who I talk to                     | Share of my time  |
+---------------------------------+------------------+
| The two lead agents                | ~60%              |
| Project tech leads / PMs directly  | ~35%              |
| Anything below tech lead level     | ~5% (escalations) |
+---------------------------------+------------------+

Большая часть дня уходит на обсуждение с двумя руководителями приоритетов, разблокировку застопорившихся проектов и просмотр сводки, собранной за ночь от всех девяти руководителей проектов. Объем обмена сообщениями между агентами, при котором технические руководители распределяют задачи, инженеры докладывают о ходе работ, а менеджеры проектов корректируют задачи, предположительно в два порядка превышает количество запросов от людей, причем лишь небольшая их часть становится видна, если только кто-то не начнет ее искать.

Что делает это возможным сейчас

Здесь важна конкретика, поскольку, как сообщается, такая структура не могла быть создана шесть месяцев назад. Два нововведения в недавней версии Claude Code (указана версия 2.1.232) изменили ситуацию, поэтому для получения точной информации о поведении системы следует ознакомиться с текущими записями об обновлении.

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

Попросите subagent_type: „fork“ — новый сабагент получит всю конверсацию вместе с кэшем вопросов его создателя. Технический лидер, который уже двадцать минут размышляет над сложной задачей миграции, может создать форк интеллектуального агента, уже содержащего все эти размышления, без необходимости снова платить за них или объяснять их заново. Форки по умолчанию работают в фоновом режиме и сохраняют результаты своей работы вне контекста родительского агента, так что технический лидер получает окончательный результат, а не поток данных от процесса чтения файлов.

Существуют ограничения. Переопределение модели игнорируется при создании форка, поскольку форк всегда работает с моделью родительского проекта; поэтому техлид, использующий Sonnet, не может создать форк с более дешевой моделью IC. Кроме того, установка CLAUDE_CODE_FORK_SUBAGENT=0 полностью отключает это поведение. Настройка позволяет продолжать создавать форки везде, кроме модуля migration-scripts IC, где намеренно требуется совершенно чистый контекст каждый раз.

Обмен сообщениями между сессиями с использованием упоминания @. Это позволяет lead-alpha, lead-beta и девяти парам технических лидеров и менеджеров проектов в их подчинении общаться в виде отдельных, прямых сессий, а не как части одного огромного окна контекста. Ввод символа @ вместе с названием сессии в команде позволяет напрямую обратиться к другой активной сессии Claude Code, при этом внутри системы вызывается функция SendMessage. Именно это делает возможным взаимодействие двух лидеров. Оба лидера представляют собой полностью отдельные процессы с собственной памятью, и они обмениваются сообщениями так же, как это делает человек, через именованные сообщения, а не через общую базу данных, которую пришлось бы создавать.

/config содержит настройки по сроку действия диалога и по тому, как сессия обрабатывает входящие сообщения от других сессий (принимать, задерживать или отклонять). При наличии десятков активных сессий такой контроль очень удобен: ведь никто не захочет, чтобы агент менеджера проекта звонил клиенту, игнорируя при этом собственного технического руководителя.

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

Способы сбоев, с которыми ему предстоит справиться

Концепция двух технических руководителей с мониторингом их активности возникла не из паранойи. Она основана на изучении исследований Anthropic о закономерностях и проблемах в многокомпонентных системах, опубликованных, по сообщениям, в середине августа, а также на выявлении ранних сбоев в практически всех описанных в них категориях.

Конформизм с низкой дисперсией. Согласно исследованию, отдельные агенты ведут себя гораздо более одинаково, чем группа людей, выбирая одинаковые решения, названия и подходы, хотя ничто не толкало их к этому. Приведены примеры: 18 из 30 агентов назвали ветку git «mvp-game-loop»; вымышленные агенты пришли к одинаковым названиям без какого-либо общего руководства; более половины из них выбрали радиотрейсер или самостоятельно размещаемый компилятор в качестве основного инструмента; а агенты, использующие опросы, совместно сгенерировали 2,4 миллиона запросов на выполнение задач, поскольку каждый из них выбрал одинаковую высокую частоту опросов.

Более мягкая версия этой проблемы проявилась в первом месяце работы данной системы. Три сотрудника IC, работавшие над тремя отдельными проектами и не знавшие друг о друге, каждый решил, что оптимальным решением для похожего бага будет использование обертки для повторной попытки. У этих трех оберток было слегка различающееся поведение при откладывании попыток, и они вступали в конфликт, когда проекты позже стали нуждаться в взаимодействии. Мерой смягчения является строгое ограничение полномочий сотрудников IC и принятие любых решений, затрагивающих несколько проектов, через технического лидера, контролирующего один проект, или лидера, контролирующего несколько проектов. Никто, находящийся ниже уровня технического лидера, не имеет права принимать решения, действие которых будет продолжаться дольше срока рассмотрения соответствующего задания.

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

Борьба за влияние. Это самое опасное. В статье описываются три агента с совершенно противоположными целями, которые постепенно перешли к саботажу друг друга: отзыву учетных записей и запуску процессов самовоспроизведения с случайными именами для обхода команды pkill -f. Только новейшая модель, протестированная в исследовании, снижала уровень напряженности, достигая перемирия в 98% случаев, в то время как более ранние версии приводили либо к блокировкам, либо к открытому конфликту. В этом и заключается риск, связанный с предоставлением агентам реального доступа к системе без внешнего контроля за совместимостью их целей.

Ответ здесь касается структуры, а не изобретательности. Ни у кого из сотрудников, находящихся ниже уровня технического лидера, нет полномочий, распространяющихся за пределы его собственного проекта. У технических лидеров отсутствует доступ к производственным процессам, если только один из лидеров не дает разрешения. Эти два лидера существуют отчасти для того, чтобы, если один начинает одобрять что-то, что приводит к спирале несовместимых целей, другой выступал в качестве независимой проверки, а не просто формальности в рамках одного и того же контекста.

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

Что перенять, если у вас нет девяти проектов

Для одного разработчика или команды из двух-трех человек почти вся такая иерархия не стоит создания, и было бы нечестно притворяться обратного.

Пропустите схему с двумя руководителями. Она предназначена для ответа на вопрос: «Что, если руководитель умрёт в 3 часа ночи, и некому будет за ним присматривать?» Одинокий разработчик и является этим присматривающим. Сессия, которая завершилась с ошибкой ночью, может подождать до тех пор, пока вы не проверите телефон утром.

Пропустите уровень менеджера проектов. Работа с заявками и согласование объёма работ имеют смысл, когда девять одновременных проектов конкурируют за внимание одного человека. При наличии одного-двух проектов вы сами являетесь менеджером проектов, а отдельный агент лишь добавляет дополнительный этап перевода информации между вами и работой.

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

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

Шаблон, который можно скопировать

Это самая миниатюрная версия шаблона для руководителя и инженера, которая всё ещё является рабочей. В ней содержатся два определения агентов Claude Code плюс небольшой самостоятельно размещаемый координатор, не требующий внешней очереди или брокера; это удобно, если вы хотите, чтобы шаблон работал через обычный скрипт, возможно, используя SDK Claude Agent, а не через прямые интерактивные сессии с передачей сообщений с помощью обозначения @.

Нативная версия Claude Code начинается с файла .claude/agents/tech-lead.md:

---
name: tech-lead
description: Owns decomposition and review for one project. Forks IC agents for individual tasks, reviews their diffs, escalates only genuine blockers.
tools: Read, Grep, Glob, Bash, Edit, Agent
---
You are the tech lead for this project. You do not write most of the code
yourself. When a task arrives:
1. Break it into the smallest pieces that can be verified independently.
2. For each piece, spawn a fork subagent scoped to exactly one piece:
   subagent_type: "fork", with a prompt naming the specific files or
   directory it may touch and nothing else.
3. Review every diff before it is considered done. Reject anything that
   touches files outside the scope you gave it.
4. Only message the lead session (via SendMessage / @-mention) if you are
   blocked on a decision you cannot make with the context you have, or if
   two of your own IC agents produced conflicting changes.
Never let two IC agents work on overlapping files in the same task cycle.

А .claude/agents/ic-migration.md показывает IC с узким диапазоном применения:

---
name: ic-migration
description: Handles only database migration scripts under db/migrations/. Never touches application code.
tools: Read, Edit, Bash
---
You only read and write files under db/migrations/. If a task requires
changing anything outside that directory, stop and report back to whoever
assigned you the task instead of making the change yourself.
Write one migration per task. Run it against the local test database
before reporting done. Include the rollback in the same file.

Технический лидер создаёт форк IC с помощью вызова Task или Agent, в котором указывается subagent_type: „fork“ и промпт, касающийся одного тикета. Поскольку это форк, IC уже содержит рассуждения технического лидера по этому тикету, поэтому дополнительных пояснений не требуется.

Режим самохостинга предназначен для случаев, когда вы пропускаете полные интерактивные сессии и хотите, чтобы механизм координации работал непосредственно с API Anthropic: без брокера, без внешней очереди, просто файл на вашем диске.

# coordinator.py
# pip install anthropic --break-system-packages
# A local, file-backed mailbox so "agents" (just API calls) can hand
# work to each other without any hosted message broker.
import sqlite3
import json
import time
from anthropic import Anthropic
DB = "mailbox.db"
client = Anthropic()  # reads ANTHROPIC_API_KEY from env
def init_db():
    conn = sqlite3.connect(DB)
    conn.execute("""
        CREATE TABLE IF NOT EXISTS messages (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            to_agent TEXT,
            from_agent TEXT,
            body TEXT,
            status TEXT DEFAULT 'pending',
            created_at REAL
        )
    """)
    conn.commit()
    conn.close()
def send(to_agent, from_agent, body):
    conn = sqlite3.connect(DB)
    conn.execute(
        "INSERT INTO messages (to_agent, from_agent, body, created_at) VALUES (?, ?, ?, ?)",
        (to_agent, from_agent, body, time.time()),
    )
    conn.commit()
    conn.close()
def next_message(to_agent):
    conn = sqlite3.connect(DB)
    row = conn.execute(
        "SELECT id, from_agent, body FROM messages WHERE to_agent=? AND status='pending' ORDER BY id LIMIT 1",
        (to_agent,),
    ).fetchone()
    if row:
        conn.execute("UPDATE messages SET status='taken' WHERE id=?", (row[0],))
        conn.commit()
    conn.close()
    return row
def run_ic(scope_dir, ticket_body):
    """One scoped worker call. No memory between calls by design here,
    since we're not using Claude Code's native forking in this path."""
    response = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=2048,
        system=f"You may only reason about files under {scope_dir}. "
               f"If the ticket requires anything outside that scope, "
               f"say so and stop.",
        messages=[{"role": "user", "content": ticket_body}],
    )
    return response.content[0].text
if __name__ == "__main__":
    init_db()
    send(to_agent="ic-migration", from_agent="tech-lead", body="Add index on users.email")
    msg = next_message("ic-migration")
    if msg:
        _, sender, body = msg
        result = run_ic("db/migrations/", body)
        send(to_agent=sender, from_agent="ic-migration", body=result)
        print(result)

Это сознательно упрощённая версия: в качестве очереди сообщений используется файл SQLite, а в качестве агента IC — одна функция на Python. Тем не менее она имеет структуру производственной версии: имеется рабочий процесс с определённым диапазоном действий, передача сообщений вместо общего изменяемого состояния, и в ней нет ничего, что зависело бы от платных сервисов. Если такая система станет недостаточной, переход на встроенные функции Claude Code для форкинга и использования синтаксиса @ по сути означает использование той же структуры, только с автоматической обработкой внутренних процессов.

Текущее состояние

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

Само заключение авторов проекта скромно. Замена одной обширной сессии с выполнением всех задач на иерархию, которая в общих чертах имитирует процесс передачи задач между членами небольшой инженерной команды, как сообщается, сократила количество ежедневных запросов вдвое, а оставшиеся сбои стали менее сложными для понимания и более очевидными. Это разумная замена.