3,583 papers
arXiv:2610.07261 87 5 окт. 2026 г. FREE

Планирование до старта: параллельные кодинг-агенты без конфликтов за счёт непересекающихся зон и порядка слияния

КЛЮЧЕВАЯ СУТЬ
Каждый агент прошёл свои тесты, а вместе код сломан: ветки слились без единого конфликта, но потребитель пишет под старое поле. Метод позволяет запускать несколько кодинг-агентов в одном репозитории и не получать тихо сломанный результат после слияния. Работу делят заранее: непересекающиеся зоны файлов плюс порядок слияния «производитель → потребитель». Каждый агент на старте получает точную миграцию контракта («было → стало»), а не расплывчатое «что-то может поменяться». Итог: доля повторов ошибки упала с 1.00 до 0.00, а ни один из пяти агентов не вышел за свою зону.
Адаптировать под запрос
⚡

TL;DR

Идея простая: перед запуском нескольких кодинг-агентов в одном репозитории заранее раздели работу на непересекающиеся зоны файлов и расставь порядок слияния по цепочке «кто меняет контракт → кто его использует». Каждому агенту в старте выдай явную инструкцию: какие файлы можно, какие нельзя, что именно изменилось в контракте и в каком порядке сливать ветки. Реакция по факту («коллега, возможно, правит файл X») не нужна. Предупреждение приходит уже после лишней правки.

Главная находка: каждый агент по отдельности проходит свои тесты, а общий результат сломан. Один агент переименовал поле amount в amountCents. Другой работал в своей ветке со старым контрактом. Ветки слились без конфликта, но код потребителя неверный. Расплывчатое предупреждение «что-то может измениться» не помогло: потребитель знал, что есть риск, и всё равно писал под старое поле. Причина в том, что нужного факта нет у него в рабочей копии. Модель покрупнее тут не спасает, она не может угадать то, чего не видела.

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

🔬

Схема метода

ШАГ 1: Для каждой задачи записать: какие файлы пишет + какие контракты потребляет → таблица задач
ШАГ 2: Найти задачи с пересекающимися файлами → развести по разным очередям (батчам)
ШАГ 3: Найти «производитель → потребитель» (кто меняет контракт, кто на него опирается)
        → порядок слияния: производитель раньше потребителя
ШАГ 4: Выдать каждому агенту в начале: разрешено / запрещено + точная миграция контракта + его слот слияния
ШАГ 5: Проверка: реальное слияние веток + сборка + тесты, а не слова агентов

Шаги 1–4 можно выполнить в одном запросе к LLM-планировщику. Шаг 5 делается отдельно, в вашем репозитории.

🚀

Пример применения

Задача: Интернет-магазин на Python/TypeScript. Платёжный сервис хранит сумму в рублях (amount) и переходит на копейки (amountKopecks, целое число) из-за округлений в ЮKassa. Запускаете трёх агентов Claude Code в отдельных git worktree (отдельных рабочих копиях). Агент A меняет платёжный сервис. Агент B считает итог корзины, он потребитель. Агент C формирует чек для Telegram-бота, тоже потребитель. Ещё есть задача D: поправить тексты в письмах, она независима.

Промпт:

Ты — планировщик параллельной работы кодинг-агентов. Работаешь строго по алгоритму, не пропуская шагов.

<Задачи>
A: Платёжный сервис. Меняю поле amount (рубли, float) на amountKopecks (копейки, int).
   Пишу: payments/models.py, payments/api.py, payments/schema.json
   Потребляю: —
B: Итог корзины. Считаю сумму заказа по данным платежа.
   Пишу: cart/total.py, cart/tests/test_total.py
   Потребляю: контракт payments/schema.json (поле суммы)
C: Чек в Telegram-боте. Форматирую сумму для пользователя.
   Пишу: bot/receipt.py
   Потребляю: контракт payments/schema.json (поле суммы)
D: Тексты писем. 
   Пишу: emails/templates/*.html
   Потребляю: —


<Алгоритм>
1. Выпиши, у каких пар задач пересекаются файлы записи. Для каждой пары укажи общий файл.
2. Построй зависимости «производитель → потребитель»: задача Х производит контракт, если её файлы записи пересекаются с тем, что потребляет задача Y. Выпиши все рёбра.
3. Построй порядок слияния: производитель всегда раньше потребителя. Если есть цикл — разорви его, убрав ребро от производителя с наименьшим числом потребителей, и скажи об этом явно.
4. Раздели задачи на батчи, которые можно запускать параллельно: внутри батча файлы записи не пересекаются.
5. Выдели «переназначенные» задачи: те, что делят файл с другой задачей, и те, что потребляют изменённый контракт. Для каждой напиши причину.


<Выход>
Таблица: задача | батч | слот слияния | переназначена? | причина.
Затем для каждой переназначенной задачи — готовая инструкция агенту:
- РАЗРЕШЕНО править: [файлы]
- ЗАПРЕЩЕНО править: [файлы]
- Что изменилось в контракте: [точная миграция: старое → новое поле, единицы, пример]
- Что делать: кодируй под НОВЫЙ контракт, а не под тот, что видишь в своей ветке. Не сливай, пока задача A не слита.

Результат: Модель выдаст таблицу: A в первом слоте слияния, B и C после A, D независима и может идти параллельно. Для B и C будут готовые инструкции с запретными файлами и точным описанием миграции: «рубли → копейки, целое число, умножить на 100». Если пересечений по файлам нет, модель так и скажет. Дальше вы раздаёте инструкции агентам. После слияния обязательно запускаете сборку и тесты. В статье именно этот шаг показал, что ветки B и C слились чисто, но были сломаны.

🧠

Почему это работает

Слабость: агент видит только свою рабочую копию. Если коллега поменял контракт в другой ветке, у потребителя нужного факта просто нет. Поэтому он уверенно пишет под старую форму. Расплывчатое предупреждение («кто-то может править X») ничего не меняет: агент знает, что что-то может поменяться, но не знает что. Реакция по факту ещё и опаздывает. Агент работает секундами, и к моменту предупреждения конфликтный код уже написан.

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

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

Рычаги управления: - Детализация миграции (точное «старое → новое» с примером против общих слов): в статье именно конкретика и порядок отличали рабочий вариант от бесполезного предупреждения. Полностью этот рычаг они не разделили, это честно отмечено в ограничениях. - Явный список запрещённых файлов: убирает «заодно поправлю». Для слабой модели добавь короткий чек-лист в конце задачи. - Число агентов: выигрыш растёт с их количеством. Для двух агентов и разных файлов планирование избыточно. - Правило разрыва циклов: замени на своё, например «приоритет у задачи с большим числом потребителей».

📋

Шаблон промпта

Блок 1 — планировщик (вставляется в чат один раз перед запуском агентов):

Ты — планировщик параллельной работы кодинг-агентов. Работаешь строго по алгоритму.

<Задачи>
{ID}: {краткое описание}
   Пишу: {файлы или папки, которые задача изменит}
   Потребляю: {контракты, API, схемы, от которых зависит задача, или «—»}
[...повторить для каждой задачи]


<Алгоритм>
1. Найди пары задач с пересекающимися файлами записи. Укажи общий файл.
2. Построй рёбра «производитель → потребитель»: задача Х производит контракт, если её файлы записи входят в то, что потребляет Y.
3. Построй порядок слияния: производитель раньше потребителя. Цикл разорви, убрав ребро от производителя с наименьшим числом потребителей, и скажи об этом.
4. Раздели задачи на параллельные батчи: внутри батча файлы записи не пересекаются.
5. Отметь «переназначенные» задачи: делят файл с другой или потребляют изменённый контракт. Напиши причину.


<Выход>
Таблица: задача | батч | слот слияния | переназначена? | причина.
Для каждой переназначенной задачи — инструкция агенту:
- РАЗРЕШЕНО править: [...]
- ЗАПРЕЩЕНО править: [...]
- Что изменилось в контракте: [точно: было → стало, единицы, пример]
- Кодируй под НОВЫЙ контракт. Сливай только после: {задача-производитель}.

Блок 2 — проверка после слияния (отдельным запросом агенту-ревьюеру или вручную):

Слей ветки в порядке: {порядок_слияния}. После слияния запусти {команда_сборки_и_тестов}.
Отчитайся структурированно:
- merge_conflicts: число
- build_ok: true/false
- tests_ok: true/false
- потребители_используют_новый_контракт: для каждого файла — да/нет + строка кода, где используется новое поле
Не пересказывай словами «всё хорошо» — приводи строки кода.

Что подставлять: {ID} и описание берёте из своего бэклога. Пишу и Потребляю — самый важный ввод: чем честнее вы укажете файлы и контракты, тем лучше план. {порядок_слияния} берёте из ответа планировщика.

🚀 Быстрый старт — вставь в чат:

Вот шаблон планировщика параллельных агентов. Адаптируй под мою задачу: [твоя задача — какие фичи или правки параллелятся в репозитории]. 
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

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

⚠️

Ограничения

⚠️ Зоны объявляются вручную: статья не решает, как определять зоны автоматически. Если вы ошиблись с файлами или забыли зависимость, план гарантирует безопасность только на бумаге. Авторы сами называют это открытой проблемой.

⚠️ Слабая модель выполняет хуже: на маленькой модели план сработал не всегда. Часть правок вышла за зону или миграция осталась неполной. Для слабых агентов добавляйте проверку после работы.

⚠️ Не разделено, что именно помогло: в живом сравнении вместе менялись время выдачи, точность данных, зоны и порядок слияния. Какая часть даёт больше, неизвестно. Эксперимент «поздно, но детально» авторы оставили на будущее.

⚠️ Малые выборки: ключевые живые результаты сняты на 3–15 прогонах, на маленькой модели и у второго вендора — на пяти. Сценарии построены авторами, и в базовом варианте нужной информации у потребителя заведомо нет. Направление понятно, величину эффекта в реальных репозиториях пока не знаем.

⚠️ Простые случаи не требуют метода: если агенты работают в разных частях проекта и общих контрактов нет, планирование ничего не меняет. На контрольном сценарии без пересечений все варианты сработали одинаково.

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

🔍

Как исследовали

Идея была в том, чтобы превратить вопрос «помогает ли координация» из утверждения в измерение. Авторы сравнили три режима. Первый: агенты работают вслепую. Второй: реактивные предупреждения, намеренно расплывчатые, как в реальной жизни. Третий: заранее составленный план. Результат читали с настоящего git merge, а не с отчёта агента.

Сначала была детерминированная симуляция на девяти сценариях. Доля чистых интеграций: 1 из 9 при отсутствии координации, 4 из 9 при реактивных предупреждениях, 9 из 9 с планом. Конфликты слияния упали с 13 до 0. Когда N агентов переписывают один файл, конфликты растут как N−1 и при предупреждениях, и без них. Предупреждение всегда опаздывает. План держит ноль и при 32 агентах.

Затем живые агенты в изолированных git worktree. Основной сценарий — миграция контракта: поле денег переименовано из долларов в центы, потребитель считает итог. Ветки сливались чисто, но потребитель был сломан. На самой сильной модели (15 прогонов) 0 из 15 без плана и с предупреждением, 15 из 15 с планом. На небольшой модели 0.6 с планом, у второго вендора 1.0 на пяти прогонах. Предупреждение не помогало ни одной модели. В сценарии с общим файлом ни один из пяти агентов не нарушил выданную зону.

Отдельно проверили память. Два одинаковых модуля авторизации, а какой из них «правильный», нигде в коде не написано. Решение записали в первой сессии, во второй спросили, какой импортировать. Повторов ошибки: 1.00 без памяти, 0.00 с памятью, и у сильной, и у слабой модели. Без памяти агенты называли варианты «ничьёй» и угадывали.

Любопытнее всего две честные вставки. Первая: гипотеза о том, что роутинг фактов спасёт точность на длинном контексте, не подтвердилась. Модели находили нужное поле среди отвлекающих до 280 тысяч токенов. Выигрыш только в стоимости: около 155 токенов против 10–280 тысяч. Вторая: красивый результат «70% против 100%» оказался багом оценки, регулярка ложно помечала верные ответы. Авторы его отозвали и перешли на проверку по структурированным полям и сырым ответам. Вывод для практики: не доверяйте тому, что агент пересказал словами. Проверяйте реальный артефакт — строку импорта, слитое поле.

💡

Адаптации и экстраполяции

🔧 Техника: перенести память в файл инструкций → решение переживает сессию

В статье память работала через инструмент системы. Без своей системы то же можно сделать файлом. Это моя адаптация, в статье измерялся именно инструмент памяти.

# В CLAUDE.md / AGENTS.md
Перед выбором между равноценными вариантами (модуль, библиотека, подход) прочитай DECISIONS.md.
Если решение уже записано — следуй ему и назови запись.
Если принимаешь новое решение, которого нет в коде, допиши в DECISIONS.md: что выбрали, почему, дата.

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

🔧 Техника: требовать от агента структурированный отчёт → вместо «всё готово» получаешь проверяемые поля

Добавь в конец задачи: «В финале выведи JSON: files_changed, contract_field_used, tests_passed. Не добавляй пояснений». Это дешёвый аналог «оценивай по разобранным артефактам, а не по прозе».

Экстраполяция: распределение до старта + проверка после. Перед запуском попроси планировщик разложить работу по зонам. Затем после слияния отдай ветки отдельному агенту-ревьюеру с задачей «найди потребителей изменённого контракта и покажи строки, где используется старая форма». Так вы закрываете и профилактику, и ловлю то, что планировщик не предусмотрел. Это моя комбинация, статья проверяла только план и реальный merge.

🔗

Ресурсы

  • Работа: Verifying Coordination in Parallel Coding Agents: NP-Bench and a Scheduling Planner
  • Автор: Sumanyu Muku, Amira Learning
  • Система и набор тестов NP-Bench: Nerveplane v0.17.0, открытый код, работает с Claude Code, Codex, OpenCode через MCP
  • Отсылки из работы: SWE-bench, SWE-agent, MemGPT, Model Context Protocol, Agent2Agent, закон Конвея, закон Брукса, «lost in the middle»

📋 Дайджест исследования

Ключевая суть

Каждый агент прошёл свои тесты, а вместе код сломан: ветки слились без единого конфликта, но потребитель пишет под старое поле. Метод позволяет запускать несколько кодинг-агентов в одном репозитории и не получать тихо сломанный результат после слияния. Работу делят заранее: непересекающиеся зоны файлов плюс порядок слияния «производитель → потребитель». Каждый агент на старте получает точную миграцию контракта («было → стало»), а не расплывчатое «что-то может поменяться». Итог: доля повторов ошибки упала с 1.00 до 0.00, а ни один из пяти агентов не вышел за свою зону.

Принцип работы

Правило простое: кто меняет контракт, сливается первым, кто на него опирается, идёт следом. Контракт — это поле, схема или API, на которые рассчитывает чужой код. Агент видит только свою рабочую копию. Если коллега переименовал amount в amountKopecks в другой ветке, у потребителя этого факта просто нет. Он знает, что риск есть, и всё равно пишет под старое. Предупреждение «возможно, коллега правит файл X» тоже не спасает: оно приходит, когда лишний код уже написан. Это как соседи по общей кухне. Лучше заранее повесить график «кто когда готовит», чем кричать «осторожно, там кто-то режет». Не реагируй на конфликт — раздай зоны и очередь до первой строчки кода.

Почему работает

Здесь модели не нужно рассуждать. Ей нужна информация в нужный момент. Раздел «кто что трогает» и «в каком порядке сливаем» — это таблица, а не головоломка. Поэтому эффект не слабел на более сильных моделях. Умная модель не угадает то, чего никогда не видела. Расплывчатое предупреждение не помогло ни разу, а точная миграция с запретными файлами сработала — разница только в конкретике факта. Явные ограничения в начале модели соблюдают хорошо. Некоторые агенты даже писали, что делают «как договорились». Есть оговорка: на маленькой модели план работал хуже. Часть правок выходила за зону, миграция оставалась неполной.

Когда применять

Разработка с несколькими кодинг-агентами в одном репозитории → задачи с общим контрактом (поле в схеме, API, формат данных), особенно когда один агент меняет контракт, а двое других на него опираются. Чем больше агентов, тем сильнее выигрыш. НЕ подходит: два агента в разных папках без общих контрактов. Там планирование ничего не меняет, на контрольном сценарии все варианты сработали одинаково. Также не подходит, если вы сами не знаете, какие файлы заденет задача. Зоны статья определять автоматически не умеет.

Мини-рецепт

1. Выпиши задачи в таблицу: для каждой — какие файлы она пишет и какие контракты потребляет. Здесь честность важнее красоты.
2. Найди пересечения: если две задачи пишут один файл, разведи их по разным очередям.
3. Построй цепочку слияния: кто меняет контракт, тот идёт первым. Потребители — после него.
4. Раздай инструкции: каждому агенту — РАЗРЕШЕНО править, ЗАПРЕЩЕНО править, точная миграция («было → стало», единицы, пример) и его место в очереди.
5. Скажи прямо: Кодируй под НОВЫЙ контракт, а не под тот, что видишь в своей ветке.
6. Для слабой модели: добавь короткий чек-лист в конце задачи.
7. Проверь по-настоящему: слей ветки в порядке очереди, запусти сборку и тесты. Просишь не «всё хорошо», а строки кода, где используется новое поле.
8. Не знаешь файлов: попроси LLM сначала разведать кодовую базу и предложить зоны. Потом проверь их глазами.

Примеры

[ПЛОХО] : Запусти трёх агентов: один переводит платежи на копейки, остальные пусть учтут, что поле суммы может поменяться
[ХОРОШО] : Ты — планировщик параллельных агентов. Задача A: платёжный сервис, меняю amount (рубли, дробное) на amountKopecks (копейки, целое). Пишу: payments/models.py, payments/api.py, payments/schema.json. Задача B: итог корзины, пишу cart/total.py, потребляю payments/schema.json. Задача C: чек в Telegram-боте, пишу bot/receipt.py, потребляю payments/schema.json. Построй порядок слияния «производитель → потребитель». Для B и C выдай инструкцию: РАЗРЕШЕНО править, ЗАПРЕЩЕНО править, точная миграция «рубли → копейки, умножить на 100, пример 199.90 → 19990», и «сливай только после A». В плохом варианте потребитель знает про риск, но не знает, что именно поменялось. Он пишет под старое поле, ветки сливаются чисто, а чек показывает неверную сумму. В хорошем варианте нужный факт лежит у агента перед глазами с первой секунды.
Источник:
ArXiv ID: 2610.07261 | Сгенерировано: 2026-10-07 05:10

Проблемы LLM

ПроблемаСутьКак обойти
Несколько агентов в одном репозитории: у каждого тесты зелёные, а вместе код сломанАгенты работают в отдельных ветках. Один меняет форму данных, например переименовывает поле или меняет рубли на копейки. Другой пишет код под старую форму: в его ветке нового факта нет. Ветки сливаются без конфликта. Сборка при этом падает или считает неверно. Знание «что-то может измениться» не помогает. Агент не знает, что именно. Мощная модель тоже не спасает: нельзя угадать то, чего не видел.Не жди конфликта, раздай факты до старта. Каждому агенту дай список файлов, которые можно и нельзя трогать. Дай точную миграцию: было → стало, единицы, пример. Назначь порядок слияния. После слияния запусти сборку и тесты. Словам агентов не верь.

Методы

МетодСуть
План до старта: зоны, порядок слияния, точная миграцияЧто делать. Опиши каждую задачу двумя полями: Пишу: [файлы] и Потребляю: [контракты]. Контракт — это общая договорённость о форме данных: поля, API, схема. Попроси модель-планировщика пройти по шагам. Шаг 1: найти пары задач с общими файлами. Шаг 2: найти связи «производитель → потребитель». Производитель меняет контракт, потребитель на него опирается. Шаг 3: выстроить порядок слияния, производитель раньше потребителя. Шаг 4: разбить задачи на группы без пересечения файлов. Шаг 5: для каждой зависимой задачи выдать инструкцию. В ней РАЗРЕШЕНО, ЗАПРЕЩЕНО, Что изменилось в контракте и «кодируй под НОВЫЙ контракт, сливай после задачи A». Почему работает. Агент видит только свою рабочую копию. Реакция по факту опаздывает: к предупреждению код уже написан. Для плана не нужны сложные рассуждения. Нужна информация в начале. Модель хорошо соблюдает явные запреты и конкретные данные. Проверка после слияния: попроси отчёт полями merge_conflicts, build_ok, tests_ok. Для каждого потребителя требуй строку кода, где используется новое поле. Фраза «всё хорошо» не доказательство. Когда да: три и больше агентов, есть общие контракты. Когда нет: агенты в разных частях проекта и общих данных нет. Тогда план ничего не меняет. Риски: зоны ты объявляешь вручную. Забыл зависимость — план защищает только на бумаге. Слабой модели добавь короткий чек-лист в конец задачи.
📖 Простыми словами

Verifying Coordination in Parallel CodingAgents: NP-Bench and a Scheduling Planner

arXiv: 2610.07261

Когда ты натравливаешь толпу AI-агентов на один репозиторий, они тупо не видят работы соседа. Каждый варится в своём изолированном контексте и свято уверен, что мир вокруг замер. В итоге один агент переписал контракт функции, а второй радостно строит код на старой версии, потому что понятия не имеет об изменениях. Пытаться слать им запоздалые алерты прямо во время генерации — полная ерунда: нейросеть строчит код за секунды, и предупреждение прилетает, когда всё уже намертво сломано.

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

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

Тестировали механику на параллельных агентах Claude Code, но принцип универсален. Он спасает любые распределенные задачи: от миграции баз данных и распила монолитов до синхронной правки фронтенда с бэкендом. Везде, где несколько LLM трогают взаимосвязанные куски системы, хаотичная параллельность ведет к сливу токенов в помойку.

Главный вывод прост: координация агентов на лету — мертвая затея. Не пытайся учить модели договариваться в процессе — жестко нарезай границы файлов и раздавай контракты на старте. Кто внедрит планирование, получит ускорение разработки в разы, а остальные продолжат вручную чинить кривые мердж-конфликты.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с