3,583 papers
arXiv:2610.26394 80 19 окт. 2026 г. FREE

PACE-Bench: почему агент «закончил», а ТЗ не выполнено, и как проверять его работу чек-листом критериев

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

TL;DR

Агент, получив ТЗ (PRD, документ с требованиями) для большого живого проекта, обычно пишет отдельные куски, но не доводит дело до конца. Часть функций реализована наполовину, часть написана, но не подключена к остальной системе. Чтобы такую работу надёжно проверить, нужен не вопрос «всё ли готово?», а чек-лист из мелких критериев. Критерии фиксируют до проверки. Судья по каждому находит в коде доказательство и цитирует его. Итоговый балл считается по жёсткому правилу, а не «на глаз».

Боль знакомая. Агент пишет «готово», а обработчик нигде не зарегистрирован. Или метод создан, но тело пустое. Или забыто условие, которое в ТЗ прямо не написано, но из смысла очевидно. Лучшие агенты полностью закрыли ТЗ лишь в малой доле задач. Две причины провалов дают около трёх четвертей всех потерь: недоделанная реализация и отсутствие интеграции. Сложность задачи определяет не объём ТЗ и не число изменённых файлов, а доля неявных требований, которые нужно вывести из смысла.

Метод проверки работает в четыре шага: 1) разбить ТЗ на атомарные критерии; 2) найти в коде доказательства; 3) вынести вердикт по каждому критерию с цитатой; 4) посчитать итог по фиксированному правилу. Без «контракта» критериев и без агрегации по правилу согласие с экспертами заметно падает.

🔬

Схема метода

ШАГ 0 (отдельный запрос): ТЗ → список атомарных критериев
       (поведение, допустимые альтернативы, вес) → ЗАМОРОЗИТЬ
ШАГ 1: Жёсткие нарушения явных ограничений → Missing
       (если не доказано нарушение — не решать, передать дальше)
ШАГ 2: Для каждого критерия найти код + связи, 
       из-за которых поведение достижимо → пакет доказательств
ШАГ 3: По каждому критерию вердикт с цитатой:
       Covered / Partial / Missing (новых требований не добавлять)
ШАГ 4: Итог по правилу: Covered=1, Partial=0.5, Missing=0,
       взвешенное среднее. «Готово» = балл ≥ 95 И ни одного Missing

Шаги 1–4 можно уместить в один промпт. Шаг 0 лучше сделать отдельным запросом и проверить критерии глазами.

🚀

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

Задача: Вы руководите разработкой маркетплейса и просите Claude Code добавить программу лояльности вроде «Яндекс Плюса»: списание баллов при оплате заказа. Агент отчитался «готово». Проверять 1 200 строк диффа вручную нет времени, а просто спросить «всё ли сделано?» бесполезно.

Промпт:

Ты — строгий приёмщик работы. Проверь реализацию по ТЗ.

<ТЗ>
Программа лояльности «Баллы»:
1. При оформлении заказа пользователь может списать баллы, 1 балл = 1 ₽.
2. Списать можно не более 30% от суммы заказа.
3. Баллы списываются только после успешной оплаты.
4. При отмене заказа списанные баллы возвращаются.
5. В истории заказов отображается, сколько баллов списано.


<Критерии>
C1 (вес 3): расчёт скидки по курсу 1 балл = 1 ₽ при оформлении.
C2 (вес 3): лимит 30% от суммы заказа; превышение отклоняется или обрезается.
C3 (вес 3, неявный): списание происходит после подтверждения оплаты, а не при создании заказа.
C4 (вес 2): возврат баллов при отмене заказа.
C5 (вес 1): поле «списано баллов» видно в истории заказов.
C6 (вес 2, интеграция): новый обработчик/сервис зарегистрирован и вызывается из потока оформления заказа.
Допустимые альтернативы: любое имя методов и структура классов, если поведение то же.


<Дифф>
{вставить дифф или список изменённых файлов с кодом}


Правила:
1. Критерии менять и добавлять нельзя.
2. По каждому критерию найди в диффе код, который реализует поведение, и код, который делает его достижимым (вызов, регистрация, маршрут, конфигурация). Процитируй оба.
3. Наличие имени метода — не доказательство. Пустое тело, заглушка или код, который нигде не вызывается — это Partial или Missing.
4. Вердикт: Covered (поведение реализовано и достижимо), Partial (реализовано, но неполно или не подключено), Missing (нет или явно нарушено).
5. Если доказательств нет, пиши «не найдено», не додумывай.
6. Итог: Covered=1, Partial=0.5, Missing=0. Посчитай взвешенное среднее ×100. Работа принята, только если балл ≥ 95 и нет ни одного Missing.

Формат ответа: таблица «критерий — вердикт — цитата — чего не хватает», затем расчёт балла и вывод «принято / не принято».

Результат: Модель выдаст таблицу по шести критериям. В каждой строке будет вердикт и цитата кода. Если обработчик написан, но не вызывается из потока заказа, критерий C6 получит Partial или Missing, а не «ок». Затем идёт арифметика взвешенного балла и вывод «принято / не принято». Вы увидите конкретные дыры, а не общее «выглядит хорошо».

🧠

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

Слабость. Если попросить модель «оцени, выполнено ли ТЗ», она смотрит на диф целиком и поддаётся поверхностным совпадениям: имена методов, похожие названия классов. Пустая заглушка с правильным именем получает частичный кредит. Вердикт «на глаз» нестабилен и зависит от того, как подан материал. Без заранее зафиксированных критериев согласие с экспертами в исследовании упало до 70%.

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

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

Рычаги управления: - Веса критериев. Поднимай вес для бизнес-критичных условий (платежи, права доступа), снижай для косметики. - Порог «готово». Строже: 100 и ни одного Partial. Мягче: 90. - Список допустимых альтернатив. Чем подробнее, тем меньше ложных «не принято» из-за другой реализации. - Критерий интеграции. Добавляй отдельным пунктом для каждой новой сущности: «зарегистрирована и вызывается». Именно здесь агенты теряют больше всего. - Неявные критерии. Помечай их отдельно: именно они сложнее всего для агента, и им стоит уделять больше внимания.

📋

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

Ты — строгий приёмщик работы. Проверь реализацию по ТЗ.

<ТЗ>
{текст_ТЗ}


<Критерии>
{id} (вес {1-3}, {явный/неявный/интеграция}): {одно проверяемое поведение}
...
Допустимые альтернативы: {что считать эквивалентной реализацией}


<Результат_работы>
{дифф_или_код_или_описание_изменений}


Правила:
1. Критерии менять и добавлять нельзя.
2. По каждому критерию найди и процитируй: (а) код, реализующий поведение; (б) код, делающий его достижимым (вызов, регистрация, маршрут, настройка).
3. Имя метода или файла — не доказательство. Пустое тело, заглушка, код без вызова = Partial или Missing.
4. Covered = реализовано и достижимо. Partial = реализовано неполно или не подключено. Missing = нет или явно нарушено.
5. Нет доказательств — пиши «не найдено».
6. Балл = взвешенное среднее (Covered=1, Partial=0.5, Missing=0) ×100.
   Принято, только если балл ≥ {порог} и нет ни одного Missing.

Формат: таблица «критерий — вердикт — цитата — чего не хватает», затем расчёт и вывод.

Что подставлять: {текст_ТЗ} — исходное ТЗ без правок. {id} — C1, C2… Критерии пишите по одному поведению на строку. {порог} — 95 по умолчанию. Результат работы — то, что сделал агент.

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

Вот шаблон приёмки работы агента по ТЗ. Мой случай: {опиши задачу и что сделал агент}.
Сначала разбей моё ТЗ на атомарные критерии (одно поведение на критерий), 
отметь неявные требования и пункты интеграции, предложи веса. 
Задавай вопросы, чтобы заполнить поля.

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

LLM спросит, что в ТЗ сказано явно, а что подразумевается, и какие части системы должны быть связаны с новой функцией. Это нужно, потому что качество проверки целиком зависит от критериев. Модель возьмёт структуру из шаблона и соберёт критерии под вашу задачу.

⚠️

Ограничения

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

⚠️ Заглушки всё ещё проходят частично: даже полный пайплайн дал небольшой частичный кредит коду с правильными именами и пустыми телами. Поэтому правило про пустые тела нужно писать явно и просматривать Partial глазами.

⚠️ Критерии нужно проверять руками: в исследовании их проверяли доменные эксперты. Если модель сама разобьёт ТЗ плохо, судья честно проверит неправильный список.

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

⚠️ Связь «сигнал → провал» — совпадение, а не доказанная причина: отсутствие проверки после правки часто идёт рядом с недоделками, но авторы сами пишут, что это не доказывает причину.

⚠️ Узкий материал: задачи из одной корпоративной среды (Java и TypeScript, игры, акции, маркетплейс). Для других стеков закономерности вероятны, но не доказаны.

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

🔍

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

Команда Alibaba (Taobao и Tmall) взяла 43 реальные задачи из рабочей разработки. В каждой был живой репозиторий, диалог с пользователем и принятый патч. Из этого собрали единое ТЗ и разбили его на 750 атомарных критериев, которые проверили доменные эксперты. Медианная задача: около 1 500 изменённых строк в 15 файлах.

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

Судью проверяли так: три аннотатора вручную пересмотрели все 750 вердиктов. Согласие составило 95,2%. Обычный судья без структуры дал около 77%. Без критериев-контракта согласие падало до 70%, без агрегации по правилу — до 76%. Эталонные патчи получили около 98 из 100, а пустые и чужие патчи — ноль. Так показали, что судья не ведётся на поверхностные совпадения.

Удивило: лучшая модель полностью закрыла лишь 6 из 43 задач, хотя средний балл был около 78. Высокий средний балл скрывает недоделанные функции. Сложность задачи зависела от доли неявных требований: баллы падали с 75 до 57 по мере роста этой доли. А объём ТЗ и число файлов почти не влияли.

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

💡

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

🔧 Техника: добавить «определение готовности» в файл инструкций агента → закрыть самые частые провалы

Это не метод статьи, а гипотеза из её диагностики: основные потери идут от недоделок, неподключённых компонентов и отсутствия проверки после последней правки. Для CLAUDE.md или AGENTS.md:

## Определение «готово»
Перед тем как написать «готово», по каждому пункту ТЗ:
1. Покажи, где реализовано поведение (файл, функция).
2. Покажи, где оно подключено: вызов, регистрация, маршрут, конфиг.
3. Убедись, что нет пустых тел, заглушек и TODO.
4. Явно перечисли неявные требования, которые ты вывел из смысла ТЗ.
5. После ПОСЛЕДНЕЙ правки запусти проверку (тесты или сборку) и приведи результат.
Если что-то не сделано — напиши «не сделано», а не «готово».

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

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

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

🔗

Ресурсы

  • Работа: When Coding Agents Outpace Review: Evaluating PRD-Driven Development in Mature Enterprise Repositories (PACE-Bench)
  • Код: https://github.com/TianqiLiu1/PACE-Bench
  • Авторы: Tianqi Liu, Yandong Guan, Songze Li, Wenkai Wang, Gang Yu, Chengfei Lv
  • Организации: Zhejiang University; Alibaba Taobao & Tmall Group
  • Связанные работы: OpenHands (оболочка агента), Agent-as-a-Judge (Zhuge et al., 2025), SWE-bench, DevEval, FeatureBench

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

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

Агент пишет «готово», а обработчик нигде не подключён. Две причины, недоделка и отсутствие связки с остальным кодом, дают около трёх четвертей всех провалов. Метод позволяет принять работу агента по ТЗ (PRD, документу с требованиями), не читая тысячу строк диффа. На выходе таблица: у каждого требования есть вердикт и цитата из кода. Фишка: не спрашивай «всё ли готово?», а заранее заморозь список мелких критериев. Судья ищет по каждому критерию доказательство в коде и связь, из-за которой код вообще вызывается. Итог считается по формуле, а не на глаз.

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

Сначала отдельным запросом превращаешь ТЗ в список критериев. Один критерий равен одному поведению. К нему добавляешь вес и допустимые альтернативы. Потом список замораживается, и судья ничего в него не добавляет. По каждому критерию судья обязан процитировать два куска: код, который делает дело, и код, который его вызывает. Затем выносит вердикт: Covered (готово), Partial (неполно или не подключено) или Missing (нет). Баллы такие: Covered=1, Partial=0.5, Missing=0. Считается взвешенное среднее. Принято при балле от 95 и без единого Missing. Это как приёмка квартиры по списку: розетка проверена, вода идёт, а не «в целом нормально выглядит».

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

Если попросить «оцени, выполнено ли ТЗ», модель смотрит на дифф целиком. Её цепляют поверхностные совпадения: правильное имя метода, похожее название класса. Пустая заглушка с красивым именем получает частичный кредит. Без заранее зафиксированных критериев согласие с экспертами падало до 70%. Модель плохо судит «в целом», зато надёжно проверяет одно узкое условие, когда ей показали, куда смотреть, и потребовали цитату. Простую арифметику по правилу она тоже считает без ошибок. Убери любую из трёх частей (критерии, поиск связей, правило подсчёта), и согласие с экспертами падает. Судья-агент, который сам бродит по репозиторию, оказался не лучше обычного судьи. Настраивать можно так: - Веса. Бизнес-критичному (платежи, права доступа) ставь 3, косметике 1. - Порог. Строже: 100 и ни одного Partial. Мягче: 90. - Критерий интеграции. Заведи отдельный пункт на каждую новую сущность. Именно здесь агенты теряют больше всего. - Неявные требования. Помечай их отдельно. Они сложнее всего для агента, и сложность задачи зависит от их доли, а не от объёма ТЗ.

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

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

Мини-рецепт

1. Разбери ТЗ отдельным запросом: попроси список критериев, один критерий на одно поведение, с пометкой «явный / неявный / интеграция».
2. Просмотри список глазами: выкинь размытое, допиши то, что подразумевалось, но не было написано.
3. Расставь веса: 3 для денег и прав, 2 для основной логики, 1 для мелочей вроде отображения.
4. Добавь пункт интеграции на каждую новую сущность: зарегистрирована и вызывается из потока оформления заказа.
5. Опиши допустимые альтернативы: любые имена методов и структура классов, если поведение то же. Меньше ложных «не принято».
6. Запрети заглушки явно: имя метода не доказательство, пустое тело или код без вызова = Partial или Missing.
7. Запусти судью и поставь порог: 95 и ни одного Missing. Требуй цитаты и фразу «не найдено», если доказательств нет.
8. Partial читай сам: даже полный пайплайн в исследовании чуть засчитывал пустые тела с правильными именами.

Примеры

[ПЛОХО] : Посмотри дифф и скажи, всё ли сделано по ТЗ про программу лояльности
[ХОРОШО] : Ты строгий приёмщик работы. Критерии менять и добавлять нельзя. C3 (вес 3, неявный): баллы списываются после подтверждения оплаты, а не при создании заказа. C6 (вес 2, интеграция): новый сервис списания зарегистрирован и вызывается из потока оформления заказа. По каждому критерию процитируй код, который реализует поведение, и код, который его вызывает. Имя метода не доказательство, пустое тело это Partial. Нет доказательств, пиши «не найдено». Балл: Covered=1, Partial=0.5, Missing=0, взвешенное среднее x100. Принято при балле от 95 и без Missing. Ответ: таблица «критерий, вердикт, цитата, чего не хватает», потом расчёт и вывод. В плохом варианте модель увидит метод redeemPoints и скажет «выглядит готово». В хорошем обработчик, который нигде не вызывается, получит Partial по C6. Баллы, списанные при создании заказа, а не после оплаты, дадут провал по C3.
Источник: When Coding Agents Outpace Review: Evaluating PRD-Driven Development in Mature Enterprise Repositories
ArXiv ID: 2610.26394 | Сгенерировано: 2026-10-20 13:20

Проблемы LLM

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

Методы

МетодСуть
Приёмка работы по замороженному чек-листу — конкретные дыры вместо «выглядит хорошо»Шаг 0, отдельным запросом: разбей ТЗ на атомарные критерии. Один критерий = одно проверяемое поведение. Укажи вес и тип: явный, неявный, интеграция. Добавь список допустимых альтернатив («любые имена методов, если поведение то же»). Просмотри список глазами и зафиксируй. Шаг 1, проверка: передай модели ТЗ, критерии и результат работы. Правила: критерии менять и добавлять нельзя; по каждому критерию процитируй код, реализующий поведение, и код, делающий его достижимым (вызов, регистрация, маршрут); нет доказательств — пиши не найдено. Вердикты: Выполнено, Частично, Нет. Шаг 2, итог: Выполнено=1, Частично=0.5, Нет=0. Считай взвешенное среднее ×100. Работа принята, только если балл ≥ 95 и нет ни одного «Нет». Почему работает: каждый вопрос узкий, и модель знает, куда смотреть. Цитата не даёт отделаться общими словами. Поиск связей ловит неподключённый код. Правило подсчёта убирает интуицию. Если убрать любую из трёх частей, совпадение с экспертами заметно падает. Когда да: большие изменения кода, которые нельзя прочитать вручную; важна приёмка по ТЗ. Когда нет: один небольшой ответ; требования субъективные и без критерия проверки. Ограничения: если модель сама плохо разобьёт ТЗ, проверка честно оценит неверный список. Строки «Частично» просматривай сам, заглушки иногда получают небольшой кредит. Рычаги: вес выше для платежей и прав доступа; порог строже (100 и ни одного «Частично») или мягче (90); чем подробнее допустимые альтернативы, тем меньше ложных отказов

Тезисы

ТезисКомментарий
Модель выносит вердикты, а итог считай по правилуМодель хорошо проверяет одно узкое условие и надёжно считает простую арифметику. Общую оценку «на глаз» она даёт нестабильно. Поэтому разделяй работу: модель ставит оценку каждому пункту, а итог выводится по формуле. Применяй: задай шкалу (1 / 0.5 / 0), веса и порог прямо в запросе. Не проси «поставь общий балл». Это работает для любой проверки по списку пунктов
📖 Простыми словами

When Coding Agents Outpace Review: Evaluating PRD-Driven Development in Mature Enterprise Repositories

arXiv: 2610.26394

Нейросетевые кодеры обожают создавать иллюзию бурной деятельности. Когда агент берет большое ТЗ в энтерпрайз-код, он бодро штампует тонны файлов, но бросает фичи недоделанными и тупо забывает подключить их к проекту. Хуже того, LLM-проверяющий ведется на поверхностное совпадение: видит правильное название метода и засчитывает работу, хотя там лежит пустая заглушка. В итоге точность оценки на глаз падает до позорных 70% совпадения с экспертами.

Это как нанять строителя, который влепил пластиковую дверь посреди поля и радостно кричит: "принимай работу, дом готов!". Ленивый инспектор смотрит издалека, видит дверь и сразу подписывает акт. Формально всё сходится, но жить внутри нельзя. В сложном проекте агенты выстраивают точно такой же бутафорский фасад, создавая опасную иллюзию готовой фичи.

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

Схему гоняли на интеграции системы баллов в маркетплейс, но принцип универсален. Когда агент выкатывает тебе 1200+ строк диффа, ручной код-ревью моментально захлебывается. Тут и выручает машинная верификация требований: она одинаково спасает на программах лояльности, рефакторинге и тяжелом бэкенде.

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

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

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

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