Автор пет-проекта IDE столкнулся с типичной проблемой при работе с coding-агентами: модель находит правдоподобную причину бага, уверенно меняет код, но ошибка не уходит. На просьбу «проверь себя» агент не возвращается к исходной задаче, а достраивает свою версию костылями — добавляет условия, исключения, проверки. В итоге вокруг посредственного решения вырастает конструкция, которую приходится поддерживать, хотя стоило бы пересмотреть саму гипотезу.

Чтобы остановить агента до первой правки, разработчик решил внедрить в IDE многоролевое планирование. Идея не нова: multi-agent debate и фреймворки вроде AutoGen существуют давно. Автор взял эту основу и описал собственную схему управления обсуждением. В каждом эксперименте четыре роли — архитектор, разработчик, рецензент и тестировщик — исполняла одна и та же LLM, но отдельными вызовами с разными инструкциями. Сначала это был DeepSeek, затем Qwen. Первый круг делался независимым: участники не видели ответы друг друга, иначе вместо четырех версий получалась одна и три вежливых согласия. После этого они читали предложения коллег, критиковали их, а отдельный вызов собирал общий план. Только потом генерировался патч.

РежимЧто происходитВызовов на задачу
Сразу к кодуСразу генерируем патч1
Один планСначала план, потом патч2
Полный советЧетыре роли, обязательная критика, план, патч10
BVCТот же совет, но критика включается условно6 или 10

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

Так появился Budgeted Verified Council (BVC). У полного совета появилась развилка перед критикой. Роли должны были вернуть структурированные позиции: предполагаемую причину ошибки, способ исправления, затрагиваемые зависимости и тесты. Система сравнивала эти поля и решала, нужен ли второй круг. Если оснований продолжать нет — сразу собирается план, получается шесть вызовов вместо десяти. Если есть — запускается критика, и расходы остаются прежними. На бумаге схема выглядит просто, но вся сложность в том, чтобы ранняя остановка не выбрасывала полезную проверку. И нужно было убедиться, что система правильно понимает, когда участники расходятся во мнениях.

Для тестов автор взял 60 задач SWE-bench Verified из 11 Python-проектов. Это настоящие issue и исходники: нужно получить патч, который применится к нужному состоянию репозитория и пройдет тесты. Выборка намеренно была сложнее средней: самые легкие задачи, оцененные менее чем в 15 минут работы, не вошли. Для каждой задачи сравнивались четыре режима: «сразу к коду» (один вызов), «один план» (два вызова), «полный совет» (десять вызовов) и BVC (шесть или десять). Режим «один план» особенно важен: он позволяет отделить пользу от многоролевого обсуждения от эффекта простой просьбы сначала подумать.

Внутри каждой модельной серии методы получали одинаковое описание задачи и одинаковые файлы. Контекст выбирался поиском по репозиторию; все 245 выбранных файлов автор сверил с исходными ревизиями — совпали побайтно. Эталонные патчи и проверочные тесты в запросы к модели не попадали. Настройки и список задач были зафиксированы до получения результатов, неудачные ответы тоже оставались в выборке.

В итоге — 480 основных запусков, две модели и несколько миллионов токенов, которые можно было не тратить. Самая полезная находка оказалась не в итоговой таблице, а в понимании, когда останавливать агентов. BVC показал, что можно сократить расходы без потери качества, если правильно определять момент, когда спорить уже не о чем. Однако автор признает, что у системы были проблемы с распознаванием реальных разногласий, и это направление требует дальнейшей работы.