3,583 papers
arXiv:2610.35488 87 26 окт. 2026 г. FREE

FeatureLoop: почему кодовый агент не доделывает работу за одну правку, и что с этим делать

КЛЮЧЕВАЯ СУТЬ
Агент написал код, ты сказал «отмена не работает», он починил отмену, а выбор мастера внезапно умер. Знакомо? Обнаружено: кодовый агент закрывает ровно тот симптом, на который указали, и считает работу законченной. Метод позволяет довести программу до рабочего состояния за меньшее число жалоб: подавай требования порциями и пиши отчёт об ошибке как проверяемый сценарий. Фишка: условие завершения «проходят все прежние сценарии», а не «исчез последний симптом». Из 12 сильных моделей после жалобы на сбой полностью вылечивается лишь малая доля случаев, а выдача всего ТЗ сразу оказалась худшим способом.
Адаптировать под запрос

FeatureLoop — это тест, который проверяет не «решил ли агент задачу с первого раза», а сколько повторных указаний ему нужно, чтобы довести программу до рабочего состояния. Задача растёт по ступеням: сначала просьба, потом новые требования, потом жалобы «не работает». На каждой ступени проверяются и новое, и всё, что уже было сделано раньше.

Главная находка для практика: агент плохо чинит то, что сломалось, и забывает про старые требования. Вы пишете «коннектор остался на месте при перетаскивании», агент правит именно это. Симптом уходит, но рядом ломается другое, а раньше работавшая часть уезжает в тупик. Одна правка редко возвращает всё в рабочее состояние. И ещё: агент часто «проверяет» не то, что видит пользователь, а удобный внутренний кусок.

Исследователи прогнали 12 сильных моделей через три способа выдачи задачи: сразу всё ТЗ, требования по частям, требования по частям + отчёты об ошибках. Лучше всего оказался третий способ, а выдача всего ТЗ целиком — худший. При этом после жалобы на сбой полностью вылечивается лишь малая доля случаев.

🔬

Схема метода

ШАГ 1: Берут реальный репозиторий и цель разработки → разбивают на ступени (от 2 до 8)
ШАГ 2: Агент получает первую просьбу → делает реализацию в том же рабочем каталоге
ШАГ 3: Проверка тестами → если что-то не работает, агенту присылают жалобу (completion feedback)
ШАГ 4: Если всё работает, присылают следующее требование (evolution feedback)
ШАГ 5: После каждой ступени проверяют новое + все прежние требования + исходное поведение проекта

Три сценария выдачи одной и той же задачи: Full (всё сразу), Evo (по частям), Evo+Comp (по частям и с жалобами). Агента не обучали и не донастраивали, это способ измерить.

🚀

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

Сначала про границы. Бенчмарк не даёт готового промпта и не проверял никакой инструмент. Он показывает, как ведут себя агенты при долгой работе над одной программой. Выводы работают для долгих задач на несколько шагов; для разового скрипта на 20 строк они избыточны.

Задача: Вы дорабатываете Telegram-бота записи в салон красоты на Python (Claude Code). Вы просите: «Добавь выбор мастера». Потом: «Теперь учитывай график мастера». Потом: «Отмена записи освобождает слот». Бот падает на отмене. Вы пишете: «отмена не работает» — агент чинит отмену, а выбор мастера внезапно ломается.

Промпт (отчёт об ошибке, составленный с учётом находок статьи):

Отчёт об ошибке. Сценарий: клиент записывается к мастеру Анне на 15:00 и затем нажимает «Отменить запись».
Ожидаю: запись удаляется, слот 15:00 у Анны снова свободен.
Фактически: бот отвечает «Ошибка», слот остаётся занят.

Исправь и затем проверь ВСЮ накопленную функциональность через настоящий вход бота (обработчик сообщений), а не отдельные функции:
1. Выбор мастера.
2. График мастера.
3. Отмена записи.
Запусти каждый сценарий и покажи вывод. Если что-то из прежних пунктов сломалось из-за правки — исправь, повтори проверку и не заканчивай, пока все три не пройдут.

Результат: Агент исправит отмену, затем по очереди прогонит все три сценария и покажет вывод каждого. Если правка сломала прежнее поведение, он должен заметить это в своей проверке, а не оставить на пользователя.

🧠

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

Слабость модели. Агент чинит то, на что указали, и считает работу законченной, когда симптом исчез. Он редко проверяет остальное сам. Часто проверка оказывается «параллельной»: вспомогательная функция работает, а настоящая точка входа осталась со старым поведением.

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

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

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

📋

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

В статье нет готового промпта. Ниже шаблон, собранный по её выводам (проверка всего накопленного, проверка через публичный вход), а не авторский метод.

Мы дорабатываем {проект} по шагам. Накопленные требования, которые должны работать всегда:
{список_прежних_требований}

Новая задача или жалоба:
- Сценарий: {что делаю}
- Ожидаю: {ожидаемый результат}
- Фактически: {что происходит}

Правила работы:
1. Сначала повтори проблему и покажи, что она воспроизводится.
2. Исправь причину, а не симптом.
3. Проверь не внутренние функции, а настоящий вход: {точка_входа}.
4. Прогони ВСЕ накопленные требования и покажи вывод по каждому.
5. Если что-то сломалось из-за правки, исправь и повтори пункт 4. Заверши только когда проходят все.
6. В конце перечисли: что исправлено, что проверено, что не удалось проверить.

Подставляй {проект}, {список_прежних_требований} (по одной строке на функцию), {точка_входа} (бот, URL, команда).

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

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

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

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

⚠️

Ограничения

⚠️ Это измерение, а не лечение: статья не проверяла никакой промпт или инструкцию. Все выводы о том, как работать, — наши гипотезы по её данным.

⚠️ Один способ запуска: все модели работали через Claude Code, а жалобы формировал фиксированный генератор, не живой человек. Реальные жалобы бывают сумбурнее.

⚠️ Малая выборка задач: 61 задача из 34 репозиториев. Для каждой отдельной модели различия в пару задач могут быть шумом.

⚠️ Корректировок было не больше двух на ступень: что будет при трёх-четырёх, не знаем.

⚠️ Тесты измеряют заранее заданное поведение: если вы просите агента что-то, чего нет в таких тестах, результат может быть иным.

🔍

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

Исследователи из Tencent и CUHK собрали 61 задачу из 34 открытых репозиториев на пяти языках (Go, Rust, JavaScript, TypeScript, Python). Каждую задачу взяли из реальных запросов пользователей и разложили на 2–8 ступеней. К каждой ступени написали проверки отдельно от эталонного решения, чтобы тесты не копировали готовый патч. Затем людей-проверяющих попросили прогнать задачи с четырьмя моделями и исправить недочёты.

Дальше 12 моделей запустили в трёх сценариях, всего 2196 прогонов. Результат: полная доля успеха — 40,3% при выдаче всего ТЗ сразу, 51,6% при выдаче по частям и 64,1% при выдаче по частям с жалобами. Лучшая модель довела до конца 72,1% задач.

Самое показательное: после первого провала в рабочее состояние в пределах двух правок возвращается лишь 15,4% сбойных состояний. Даже когда конкретная жалоба устранена, в 20,9% случаев остаётся нарушенным другое требование. А 11,4% уже работавшего позже ломается.

Разбор неудачных прогонов показал причину: в 75,3% случаев агент пропустил проверку на пути пользователя или проверил вспомогательный кусок вместо настоящего входа. На задачах, которые не решила ни одна модель, 32,4% ошибок — рассогласованное общее состояние (реестр, хранилище, обработчики жизненного цикла не сходятся). На задачах, которые хоть кто-то решил, таких всего 2,6%.

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

💡

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

🔧 Техника: добавить в файл инструкций агента правило завершения → агент не бросает работу после первого прохождения

«Работа закончена только тогда, когда проходят все пункты списка требований, а не только последний. Если правка ломает прежний пункт — исправь».

🔧 Техника: отчёт об ошибке в три строки → меньше недопонимания

Каждый раз формулируй жалобу как «Сценарий / Ожидаю / Фактически». Статья показывает, что локальное исправление ещё не гарантирует полного, но ясный сценарий даёт агенту точку, которую он может проверить.

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

🔗

Ресурсы

FeatureLoop: Benchmarking Coding Agents under Evolving Requirements. Авторы: Jia Feng, Alyssa Wu, Cuiyun Gao, Yunlong Wang, Songyuanyi Lu, Zhichao Hu (Hunyuan Team, Tencent; Chinese University of Hong Kong). Использованная среда: Claude Code. Связанные бенчмарки: SWE-bench и его расширения.


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

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

Агент написал код, ты сказал «отмена не работает», он починил отмену, а выбор мастера внезапно умер. Знакомо? Обнаружено: кодовый агент закрывает ровно тот симптом, на который указали, и считает работу законченной. Метод позволяет довести программу до рабочего состояния за меньшее число жалоб: подавай требования порциями и пиши отчёт об ошибке как проверяемый сценарий. Фишка: условие завершения «проходят все прежние сценарии», а не «исчез последний симптом». Из 12 сильных моделей после жалобы на сбой полностью вылечивается лишь малая доля случаев, а выдача всего ТЗ сразу оказалась худшим способом.

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

Правило простое. Жалоба = сценарий + ожидание + факт. Заверши, только когда проходят все накопленные требования. Проверяй через настоящий вход, не через внутреннюю функцию. Агент чинит то, на что ты показал пальцем, поэтому показывай на всю систему. Это как механик, который заменил лампочку в салоне и не проверил, заводится ли машина. Ты просил лампочку, он сделал лампочку. Готовый промпт в статье не проверяли, поэтому шаблон ниже считай рабочей гипотезой, собранной по находкам.

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

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

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

Долгая работа с агентом над одной программой, где требования копятся по шагам: бот, сайт, внутренний сервис → особенно когда после очередной правки всплывают старые поломки. НЕ подходит для разового скрипта на 20 строк: проверка всего списка там избыточна. Работает слабее, если у программы нет способа запустить сценарии, тогда проверка остаётся на словах.

Мини-рецепт

1. Веди список: выпиши накопленные требования, по одной строке на функцию.
2. Режь задание: давай требования порциями, для запутанных проектов порции мельче.
3. Пиши жалобу как тест: сценарий, ожидание, факт. Без слов «не работает» в одиночку.
4. Назови вход: <вход>бот, адрес сервера или команда запуска, а не внутренняя функция.
5. Поставь финиш: заверши, только когда проходят все пункты списка, вывод покажи по каждому.
6. Знай, когда стоп: две правки не помогли, не пиши третью жалобу. Попроси остановиться и разобрать проблему заново.

Примеры

[ПЛОХО] : Отмена записи не работает, почини
[ХОРОШО] : Отчёт об ошибке. Сценарий: клиент записывается к мастеру Анне на 15:00 и нажимает «Отменить запись». Ожидаю: запись удалена, слот 15:00 у Анны свободен. Фактически: бот отвечает «Ошибка», слот занят. Исправь и проверь ВСЮ накопленную функциональность через настоящий вход бота, а не отдельные функции: 1. Выбор мастера. 2. График мастера. 3. Отмена записи. Запусти каждый сценарий и покажи вывод. Если правка что-то сломала, исправь и повтори. Не заканчивай, пока все три не пройдут.
Источник: FeatureLoop: Benchmarking Coding Agents under Evolving Requirements
ArXiv ID: 2610.35488 | Сгенерировано: 2026-10-29 13:18

Проблемы LLM

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

Методы

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

Тезисы

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

FeatureLoop: Benchmarking CodingAgentsunder Evolving Requirements

arXiv: 2610.35488

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

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

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

Для разового скрипта на двадцать строк это не страшно, но принцип универсален. На длинных многошаговых задачах — будь то разработка сложной фичи, рефакторинг легаси или цепочка правок — модель начинает заметать мусор под ковёр. Чем дольше агент ковыряется в проекте, тем сильнее он отрывается от реальности и плодит бесполезные костыли.

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

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

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

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