3,583 papers
arXiv:2609.33382 72 27 сент. 2026 г. FREE

WideSWE: когда задача затрагивает несколько репозиториев, кодинг-агенты доделывают только часть

КЛЮЧЕВАЯ СУТЬ
Парадокс: кодинг-агент редко ломает код, он просто не доделывает работу. В наборе из 120 реальных задач на несколько репозиториев он часто сам называет нужные правки в плане, а делает только часть. Подход из статьи позволяет не терять половину задачи: выбирать режим запуска под тип работы и закрывать дыру «остановился после первого успеха». Фишка: агент останавливается не от нехватки сил, а потому что тесты в одном репозитории позеленели и работа ощущается законченной. Лечится не длиннее сессией, а явным списком репозиториев и сверкой в конце.
Адаптировать под запрос
⚡

TL;DR

WideSWE — это бенчмарк из 120 реальных задач, где одну фичу или один багфикс нужно внести сразу в несколько репозиториев. Главная практическая находка: агент редко ломает код, но часто не доделывает работу. Он чинит один репозиторий, видит зелёные тесты и останавливается. Остальные репозитории остаются нетронутыми.

Вот как это выглядит. Вы просите «добавь поддержку в Go, Python и Ruby SDK». Агент делает Go, пишет «готово», а про Python и Ruby молча забывает. Иногда он даже сам называет нужные изменения в плане, но реализует только часть. Есть и вторая беда: агент пишет свои тесты по своему же неверному пониманию задачи. Тесты проходят, а нужное поведение не сделано.

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

🔬

Схема метода

В статье нет одного «метода». Это сравнение двух режимов запуска агента:

РЕЖИМ A (совместный): один запуск → агент видит все репозитории → правит сразу везде
  + видит контракты и соседние реализации, может сверять поведение
  − забывает часть репозиториев, останавливается после первого успеха

РЕЖИМ B (раздельный): по одному запуску на репозиторий → один и тот же промпт
  + узкий фокус, не забывает свой репозиторий
  − не видит соседей, строит неверные догадки об их интерфейсах
  − расходует втрое больше запросов

Выбор режима:

Багфикс           → режим B
Фича с контрактом → режим A + явный чек-лист репозиториев
Любой режим       → финальная проверка: «каждый репозиторий из списка изменён и проверен?»
🚀

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

Задача: У вас сервис доставки еды в духе «Самоката». Три репозитория: delivery-api (Go), delivery-web (React), courier-app (Kotlin). Нужна фича: клиент оставляет «комментарий для курьера» («домофон не работает, звоните»). Поле должно уйти через API и отобразиться у курьера. Это фича с общим контрактом, поэтому берём совместный режим и страхуемся от «остановился на первом».

Промпт:

Рабочее пространство содержит три репозитория: delivery-api, delivery-web, courier-app.

ЗАДАЧА: добавить поле «комментарий для курьера» (строка до 300 символов, необязательное).
Клиент вводит его в веб-форме оформления заказа. API сохраняет его в заказе.
Приложение курьера показывает его на экране заказа.

ПЕРЕД НАЧАЛОМ работы:
1. Выпиши список ВСЕХ репозиториев, которые нужно изменить, и что именно в каждом.
2. Выпиши, что считается «готово» для каждого репозитория (поведение, не названия функций).

ПРАВИЛА:
- Сначала изучи контракт в delivery-api, потом подгоняй под него web и courier-app.
- Не останавливайся, пока не обработан каждый репозиторий из списка.
- Прохождение тестов в одном репозитории — это не конец задачи.
- Свои тесты пиши по требованиям из задачи, а не по своей реализации.

ПЕРЕД ЗАВЕРШЕНИЕМ:
Пройди по списку и для каждого репозитория ответь: изменён? Поведение соответствует
критерию «готово»? Сверь формат поля (имя, тип, пустое значение) во всех трёх местах.
Если хоть один пункт не выполнен — продолжай работу.

Результат: Агент сначала выдаст список затронутых репозиториев и критерии готовности. Дальше он будет править код, начиная с API. В конце появится явная сверка по каждому репозиторию. Это не гарантирует успех, но снижает шанс «забыл фронт» или «поле называется по-разному в API и в приложении».

🧠

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

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

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

Как использовать. Явный список репозиториев и критериев «готово» превращает размытое «сделай везде» в чек-лист. Финальная сверка по списку закрывает дыру «остановился после первого успеха». А выбор режима по типу задачи позволяет использовать узкий фокус там, где он помогает (багфиксы), и общий контекст там, где он нужен (фичи).

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

📋

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

Рабочее пространство содержит репозитории: {список_репозиториев}.

ЗАДАЧА: {описание_фичи_или_бага}
Ожидаемое поведение: {что_должно_происходить_в_итоге}

ПЕРЕД НАЧАЛОМ:
1. Выпиши ВСЕ репозитории, которые нужно изменить, и что именно в каждом.
2. Для каждого репозитория опиши критерий «готово» через поведение.

ПРАВИЛА:
- Источник контракта: {репозиторий_с_контрактом}. Изучи его первым.
- Не останавливайся, пока не обработан каждый репозиторий из списка.
- Зелёные тесты в одном репозитории — не конец задачи.
- Тесты пиши по требованиям из задачи, а не по своей реализации.
- Если сомневаешься, что репозиторию не нужны правки, объясни почему.

ПЕРЕД ЗАВЕРШЕНИЕМ:
Для каждого репозитория из списка ответь: изменён? Критерий «готово» выполнен?
Сверь форматы данных (имена, типы, пустые значения) между репозиториями.
Если хоть один пункт не выполнен — продолжай.

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

Для багфикса запускайте отдельную сессию агента на каждый репозиторий с одним и тем же описанием. Из шаблона оставьте только задачу и критерий «готово» для этого репозитория.

Шаблон собран из паттернов отказов, найденных в статье. Авторы сами такой промпт не проверяли.

⚠️

Ограничения

⚠️ Шаблон не проверен напрямую: в статье измерены только сами отказы агентов и сравнение режимов «совместно / раздельно». Что именно чек-лист снижает долю забытых репозиториев, остаётся гипотезой.

⚠️ Вывод про режимы опирается на небольшую выборку: сравнение сделано на одной связке агента и модели, на 89 задачах. Багфиксов в нём всего 29. Разница в 10 п.п. по типам задач может сдвинуться на другой выборке.

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

⚠️ Больше шагов — не значит лучше: в статье агенты делали сотни запросов и всё равно оставляли работу недоделанной. Длинная сессия не гарантирует завершённость.

⚠️ Узкая область: результаты получены на задачах из открытых экосистем (Sentry, Kubernetes, Symfony и др.). Для вашего монорепо или микросервисов поведение может отличаться.

🔍

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

Исследователи взяли 200 крупнейших GitHub-организаций и нашли 103 экосистемы, где репозитории работают как единый продукт. Из 1,7 млн pull request'ов (PR, запросов на слияние) они выделили 109 тысяч, ссылающихся на соседние репозитории. Ручной отбор и запуск тестов оставили 120 задач: 60 багфиксов и 60 фич в 41 экосистеме. Задача считалась решённой, только если прошли тесты во всех целевых репозиториях.

Проверили семь связок «агент + модель». Лучшая решила 42,5% задач, остальные от 11 до 37,5%. При этом лучшая связка хотя бы в одном репозитории преуспевала в 83% задач. Разрыв между «частично» и «полностью» и есть главная находка. Среди провалов лучшей связки в 48 из 69 случаев один репозиторий проходил все целевые тесты, а другой нет. Существующие тесты (регрессии) почти не ломались. Агенты не портят, а недоделывают.

Неудачные запуски разобрали по трём причинам: не увидел весь объём, увидел но не сделал, сделал но неверно. Причины сильно зависели от модели. Одна часто застревала на «изучении» и не доходила до реализации. У других ошибки чаще возникали уже после правок. Одна и та же модель в разных оболочках агента показала разный результат: 42,5% против 32,5%. Значит, инструмент важен не меньше модели.

Самый интересный эксперимент — совместный запуск против раздельных на 89 задачах с одинаковыми промптами. Итог почти ничья (40% против 36%), но внутри у 22% задач результат поменялся. Багфиксы лучше решались раздельно, фичи лучше совместно. Раздельные запуски требовали втрое больше запросов. Для практики вывод такой: выбирайте режим по типу задачи, а не «всегда так» или «всегда эдак».

Ещё одна деталь: авторы переписали часть скрытых тестов, потому что те требовали конкретных имён функций или точного текста ошибки, которых не было в задаче. Иначе правильные решения отвергались бы.

💡

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

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

В статье агент использовал строку с именем исключения, хотя задача требовала структурированную информацию. Тесты были написаны под ту же ошибку. Добавьте в промпт:

Для каждого тестового сценария укажи, какую фразу из задачи он проверяет.
Если сценарий нельзя привязать к фразе из задачи — удали его.

🔧 Техника: сверка «до и после» → ловит остановку на первом успехе

Вместо одного финального вопроса задайте короткий отдельный запрос после того, как агент сказал «готово»:

Вот список репозиториев: {список}. Покажи git diff --stat по каждому.
Для каждого репозитория без изменений объясни, почему правки не нужны.

Экстраполяция: правила в файле инструкций агента. Если вы часто работаете с мультирепо-пространством, перенесите правила из шаблона в CLAUDE.md или AGENTS.md:

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

Это моя адаптация. Авторы такой файл не тестировали.

🔗

Ресурсы

  • WideSWE: Can Coding Agents Coordinate Changes Across Repositories? Zhejiang University и Tsinghua University (авторы: Wang Baoyi, Wang Xingliang, Zhi Chen, Wu Jiayi, Wu Kaiming, Yin Jianwei и др.)
  • Связанные бенчмарки: SWE-bench (Jimenez et al.), DeepSWE (Huang et al.), ProgramBench (Yang et al.)
  • Примеры экосистем из статьи: Sentry (github.com/getsentry), Kubernetes, Symfony, Ansible
  • Рейтинг организаций: gitstar-ranking.com/organizations

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

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

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

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

Два режима запуска. Совместный: один запуск, агент видит все репозитории сразу. Раздельный: по одному запуску на репозиторий, промпт один и тот же. Исправление ошибки — раздельно, фича с общим контрактом — вместе. Почему так? В раздельном режиме узкий фокус не даёт забыть свой репозиторий. Но агент не видит соседей и выдумывает их интерфейсы. Для фичи это смертельно: имя поля в API одно, в приложении другое. В совместном режиме агент берёт контракт из одного репозитория и подгоняет под него остальные. Это как сверять два перевода с оригиналом, а не переводить вслепую. И в любом режиме нужна финальная проверка: каждый репозиторий из списка изменён и проверен?

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

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

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

Разработка с кодинг-агентами → задачи, которые затрагивают несколько репозиториев (SDK на разных языках, API плюс веб плюс мобильное приложение), особенно когда агент любит рапортовать «готово» после первого зелёного прогона. Исправление ошибки в нескольких репозиториях → раздельные запуски. Фича с общим контрактом → совместный режим плюс чек-лист. НЕ подходит для задач в одном репозитории: список там лишний. Раздельный запуск также почти не помогает, если репозиторий уже изменён, но неправильно. Он спасает, когда агент репозиторий вообще не тронул. Выводы про режимы получены на одной связке агента и модели, на 89 задачах (багфиксов всего 29), разница между типами около 10 п.п. На вашем монорепо или микросервисах всё может выглядеть иначе.

Мини-рецепт

1. Назови репозитории: в начале промпта перечисли все, что лежат в рабочем пространстве.
2. Заставь выписать план: пусть агент перечислит, что менять в каждом репозитории, до первой правки.
3. Определи «готово» через поведение: не «функция названа так-то», а «курьер видит комментарий на экране заказа».
4. Укажи источник контракта: API или общая схема изучается первой, остальные подгоняются под неё.
5. Запрети останавливаться на первом успехе: «зелёные тесты в одном репозитории — не конец задачи».
6. Тесты по требованиям: пусть пишет их из условия задачи, а не из собственного кода.
7. Финальная сверка: по каждому репозиторию: изменён? критерий выполнен? имена, типы и пустые значения полей совпадают? Если сомневается, что репозиторию не нужны правки, пусть объяснит почему.
8. Для исправления ошибки: запусти отдельную сессию на каждый репозиторий с одним описанием. Оставь только задачу и критерий «готово» для этого репозитория.

Примеры

[ПЛОХО]: `Добавь в delivery-api, delivery-web и courier-app поле «комментарий для курьера»` Агент сделает API, увидит зелёные тесты, напишет «готово». Про веб и приложение курьера он молча забудет. [ХОРОШО]: `Рабочее пространство содержит три репозитория: delivery-api, delivery-web, courier-app. ЗАДАЧА: добавить необязательное поле «комментарий для курьера» (строка до 300 символов). Клиент вводит его в веб-форме, API сохраняет в заказе, приложение курьера показывает на экране заказа. ПЕРЕД НАЧАЛОМ: выпиши все репозитории, которые нужно изменить, и что именно в каждом. Для каждого опиши, что считается «готово», через поведение. ПРАВИЛА: сначала изучи контракт в delivery-api, потом подгоняй остальные. Не останавливайся, пока не обработан каждый репозиторий из списка. Зелёные тесты в одном репозитории — не конец задачи. Тесты пиши по требованиям задачи, а не по своей реализации. ПЕРЕД ЗАВЕРШЕНИЕМ: пройди по списку. Каждый репозиторий изменён? Поведение соответствует критерию «готово»? Сверь имя, тип и пустое значение поля во всех трёх местах. Если хоть один пункт не выполнен, продолжай работу.` Сначала агент выдаст список и критерии. Потом начнёт с API. В конце будет явная сверка. Гарантий нет, но шанс «забыл фронт» или «поле названо по-разному» заметно ниже. [ПЛОХО]: `Исправь баг с обрезанием длинных имён во всех трёх SDK одним запуском` [ХОРОШО]: три отдельные сессии с одним текстом: `Исправь обрезание имён длиннее 64 символов в этом репозитории. Готово, когда имя из 100 символов возвращается целиком, и это покрыто тестом по условию задачи`
Источник: WideSWE: Can Coding Agents Coordinate Changes Across Repositories?
ArXiv ID: 2609.33382 | Сгенерировано: 2026-10-10 09:10

Проблемы LLM

ПроблемаСутьКак обойти
Агент делает одну часть большой задачи и пишет «готово»Задача из нескольких частей: несколько сервисов, модулей, пакетов. Агент делает первую часть. Тесты зеленеют. Он останавливается. Остальные части не тронуты. Иногда он сам назвал их в плане, но не сделал. Больше шагов не помогает: сотни запросов, а работа не закончена.Проси выписать все части до начала работы. Для каждой — критерий «готово» через поведение, не через названия функций. Добавь правило: «Зелёные тесты в одной части — не конец». В конце проси пройти по списку: часть изменена? Критерий выполнен? Если нет — продолжай. Это снижает риск, но не гарантирует результат.
Агент пишет тесты по своему же неверному пониманию задачиАгент понял задачу неправильно. Пишет код по этому пониманию. Потом пишет тесты по своему коду. Ошибка общая у кода и тестов. Тесты проходят, нужного поведения нет. Проверка ничего не ловит.Пусть сначала выпишет ожидаемое поведение из текста задачи. Тесты пусть пишет по этому описанию, а не по коду. Добавь в запрос: «Тесты пиши по требованиям, а не по своей реализации». Лучше всего, если критерии проверки даёшь ты.

Методы

МетодСуть
Режим запуска по связности частей — меньше забытого и меньше неверных догадокРеши, как связаны части задачи. Части независимы (одна ошибка в нескольких модулях): запусти отдельный сеанс на каждую часть с одним и тем же описанием. Узкий фокус не даёт забыть свою часть. Минус: примерно втрое больше запросов. Отдельный запуск почти не лечит часть, которую агент уже изменил неверно. Части связаны общим контрактом (формат поля, интерфейс API): дай агенту все части в одном запуске. Он берёт контракт из одной части и подгоняет под него другую. Он сравнивает две реализации и находит расхождения. В раздельных запусках агент придумывает интерфейс соседа и ошибается. Добавь в запрос: «Источник контракта — X. Изучи его первым». Сверь форматы (имена, типы, пустые значения) во всех частях. Вывод получен на небольшой выборке. Считай его рабочей гипотезой.

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

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

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