3,583 papers
arXiv:2610.23782 87 16 окт. 2026 г. FREE

DeskCheck: принудительная «ручная прогонка» кода агентом на каждом этапе починки бага

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

TL;DR

DeskCheck — схема работы кодинг-агента, в которой на каждом из четырёх этапов (поиск причины, правка, сверка с задачей, проверка тестами) агента заставляют расписать, как код выполняется на конкретных входных данных. Это старая программистская практика desk checking: пройти код по шагам «в уме», не запуская. Агент не просто «смотрит на код и решает», а явно трассирует вызовы, значения переменных и результат.

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

Метод закрывает каждую дыру отдельным обязательным шагом рассуждения. Он трассирует цепочку вызовов до корня проблемы. Он прогоняет свою правку «на бумаге» и дорабатывает её. Он выписывает требования списком и сверяет правку с каждым. Перед тестами он придумывает разнообразные входы с ожидаемыми выходами. Это дало прирост решённых задач по сравнению с обычным агентом при небольшой доплате за токены.

🔬

Схема метода

ЭТАП 1. Локализация: трассировка цепочки вызовов от точки входа → список подозрительных методов (не только тех, что названы в описании бага)
ЭТАП 2. Правка и доводка: написал патч → «прогнал» его на бумаге на входах из задачи → если поведение не то, поправил
ЭТАП 3. Аудит: выписал все требования из задачи списком → для каждого проверил, что патч его выполняет
ЭТАП 4. Валидация: придумал разнообразные входы + ожидаемые выходы (регистр, пустые, составные, граничные) → только потом пишет тесты

Это многоэтапный процесс. В статье он реализован как мультиагентная схема. В обычном агенте (Claude Code, Cursor) его можно передать одной инструкцией с этапами.

🚀

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

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

Промпт (в Claude Code или Cursor):

Задача: починить падение оплаты через СБП, когда в корзине есть промокод
и цифровой товар. Описание бага в тикете PAY-482.

Работай строго по четырём этапам. Не переходи к следующему,
пока не выписал результат предыдущего.

ЭТАП 1. ЛОКАЛИЗАЦИЯ.
Найди точку входа (checkout → оплата СБП). Выпиши цепочку вызовов
от неё вниз. Для каждой функции в цепочке напиши, как она себя ведёт
на входе «промокод + цифровой товар». Не останавливайся на функции,
которую назвали в тикете: проверь все соседние в той же цепочке,
в том числе те, что выглядят не связанными с симптомом.

ЭТАП 2. ПРАВКА И ДОВОДКА.
Напиши патч. Затем пройди по нему по шагам на трёх конкретных входах
из тикета: что лежит в каждой переменной, какая ветка if выполняется,
что возвращается или какое исключение летит. Если результат не совпал
с ожидаемым в тикете — исправь патч и прогони снова.

ЭТАП 3. АУДИТ ПО ТРЕБОВАНИЯМ.
Выпиши из тикета все требования нумерованным списком.
Для каждого пункта напиши: выполняется ли он в твоём патче,
в какой строке, и на каком входе ты это проверил.

ЭТАП 4. ВАЛИДАЦИЯ.
Прежде чем писать тесты, составь таблицу: вход → ожидаемый выход.
Входы должны быть разными: пустая корзина, промокод в другом регистре,
несколько цифровых товаров, нулевая сумма, смешанная корзина.
Только после таблицы пиши тесты и запускай их.

В конце: что изменил, какие требования закрыл, что осталось непроверенным.

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

🧠

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

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

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

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

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

📋

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

Дословных промптов в доступной части статьи нет, там описаны только стадии. Шаблон ниже собран по этим описаниям: четыре этапа и обязательный артефакт на каждом.

Задача: {описание бага или фичи, ссылка на тикет}.
Кодовая база: {язык, фреймворк, где лежит нужный модуль}.

Работай строго по четырём этапам. Не переходи к следующему,
пока не выписал результат предыдущего.

ЭТАП 1. ЛОКАЛИЗАЦИЯ.
Найди точку входа для сценария {сценарий}. Выпиши цепочку вызовов вниз.
Для каждой функции опиши, как она ведёт себя на входе {входные данные из бага}.
Проверь не только функции, названные в описании, но и все соседние
в этой цепочке. Укажи корневую причину, а не симптом.

ЭТАП 2. ПРАВКА И ДОВОДКА.
Напиши патч. Затем «прогони» его без запуска на {число} конкретных входах:
значения переменных, выбранные ветки, возвращаемое значение или исключение.
Если результат не соответствует ожидаемому в задаче — исправь и прогони заново.

ЭТАП 3. АУДИТ ПО ТРЕБОВАНИЯМ.
Выпиши все требования из задачи нумерованным списком.
Для каждого: выполняется ли в патче, в какой строке, на каком входе проверено.
Невыполненные — доработай.

ЭТАП 4. ВАЛИДАЦИЯ.
Перед тестами составь таблицу «вход → ожидаемый выход».
Входы должны быть разными по типу: {список граничных случаев}.
Затем напиши тесты по таблице и запусти их, если окружение позволяет.

В конце коротко: что изменено, какие требования закрыты, что не проверено.

Что подставлять: {описание бага} — текст тикета целиком, не пересказ. {сценарий} и {входные данные} — как воспроизводится ошибка. {число} — обычно 2–4. {список граничных случаев} — то, что в вашем коде реально ломается: пустые значения, регистр, длинные строки, нули, смешанные типы.

🚀 Быстрый старт — вставь в чат или в файл инструкций агента:

Вот шаблон четырёхэтапной работы над багом (трассировка → правка с прогонкой на бумаге → аудит по требованиям → таблица входов и выходов перед тестами). Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.

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

LLM спросит про язык и структуру проекта, про то, как воспроизводится ошибка, и какие граничные случаи у вас реально встречаются. Это нужно, чтобы этапы 1 и 4 были привязаны к вашему коду, а не к абстрактным примерам. Паттерн «этап → обязательный артефакт» она возьмёт из шаблона и перенесёт на вашу задачу.

⚠️

Ограничения

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

⚠️ Нужна многоэтапность: если вставить «рассуждай о коде» одной фразой в системный промпт, эффекта хватает слабо. Агенты, которым рассуждение запросили один раз, делали это нерегулярно. Метод держится на повторении по этапам.

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

⚠️ Только про код: все проверки идут на задачах починки багов в репозиториях (Python, Go, TypeScript, JavaScript). Для текстов, аналитики и других задач метод не проверяли.

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

🔍

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

Исследование шло в два этапа. Сначала команда разобрала почти 8 тысяч «траекторий». Так называют полные записи работы агента: каждая мысль и каждое действие по шагам. Записи взяли у шести разных агентных схем, включая Claude Code, на трёх наборах задач SWE-bench. Это реальные баги из открытых репозиториев. Модель-классификатор находила в мыслях агента фрагменты рассуждения о коде (значения переменных, вызовы, циклы, условия, возвраты) и раскладывала их на 12 видов. Корректность разметки проверили вручную на выборке из 120 запусков, трое людей согласились между собой.

Результат оказался неожиданным. Рассуждение о коде есть примерно в двух третях запусков. Там, где оно есть, решается около 70% задач, там, где нет, — около 51%. Чем сложнее задача, тем больше рассуждений. Но оно возникает стихийно: одни схемы рассуждают на этапе поиска бага, другие на этапе тестов. В схемах, где оно требуется только один раз в системном промпте, агенты склонны это игнорировать. Там, где его требуют на каждом этапе, оно есть в каждом запуске.

Из этого появилась идея: требовать рассуждение на каждом этапе и подсказывать, какое именно. Эту схему проверили на 731 задаче SWE-bench-Pro с тремя разными моделями, против упрощённого агента mini-SWE-Agent и Claude Code. Прирост составил от 6 до 10 процентов, дополнительные расходы — около 14 центов на задачу. Токенов уходит в среднем на 7,6% больше. Локализация бага стала заметно точнее: доля найденных нужных методов выросла до 0,66 против 0,38–0,46 у конкурентов. Абляция (поэтапное добавление частей) показала рост с 53% до 68% по мере включения этапов, то есть каждый этап вносит вклад. Статистические тесты и повторные запуски подтвердили, что результат не случайный.

💡

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

💡 Адаптация для длинного ТЗ (не код): этап 3 (аудит по требованиям) переносится на любую задачу с длинным входом: договор, бриф, регламент. В статье этот этап применён только к коду. Перенос — моя экстраполяция.

Вот бриф клиента: {текст брифа}.
Вот мой черновик ответа: {черновик}.

1. Выпиши все требования из брифа нумерованным списком (явные и подразумеваемые).
2. Для каждого пункта скажи: выполнено ли в черновике, в каком месте,
   и процитируй фрагмент.
3. Пункты, где нет цитаты, — доработай.

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

🔗

Ресурсы

  • Статья: Enforcing Code Reasoning in Agentic Scaffold for More Effective Issue Resolution
  • Авторы: Changshu Liu, Ji Young Kim, Alireza Ghazanfari, Saanvi Nallu, Reyhaneh Jabbarvand. Университет в статье не указан.
  • Бенчмарки: SWE-bench-Verified, SWE-bench-Pro, SWE-bench-Lite
  • Базовые схемы для сравнения: mini-SWE-Agent, Claude Code, OpenHands, SWE-Doctor

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

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

Обнаружено: кодинг-агенты и так рассуждают о том, как выполняется код, но делают это стихийно. Такое рассуждение есть примерно в двух третях запусков. Где оно есть, задачи решаются заметно чаще. Метод DeskCheck позволяет заставить агента искать корень бага, а не симптом из тикета, и не терять требования из длинной задачи. Фишка: фраза «рассуждай о коде» в системном промпте почти не работает, нужен обязательный письменный результат на каждом из четырёх этапов. Агент делает ручную прогонку (desk checking): расписывает вызовы, значения переменных и ветки условий. Итог: прирост решённых задач от единиц до десяти процентов при небольшой доплате токенами.

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

Процесс из четырёх этапов, и на каждом агент обязан выдать письменный результат. 1. Локализация: цепочка вызовов от точки входа вниз. На выходе список подозрительных функций, а не только той, что названа в тикете. 2. Правка и доводка: написал патч, прогнал его на бумаге на входах из задачи. Не сошлось с ожиданием, значит чинит дальше. 3. Аудит: выписал все требования списком, для каждого указал строку патча, которая его закрывает. 4. Проверка: таблица «вход → ожидаемый выход» с разными случаями. Только потом тесты. Пока результат этапа не написан, к следующему переходить нельзя. Это как чек-лист пилота перед взлётом: пропустить пункт можно, только если сделать вид, что его нет. Без этого условия агент начинает перескакивать через этапы, и метод слабеет.

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

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

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

Починка багов в репозиториях (в статье Python, Go, TypeScript, JavaScript) → особенно когда тикет длинный, с пятью и более требованиями. Ещё когда прошлая попытка агента починила одну функцию, а соседняя падает. Ещё когда тесты трудно запустить: нет окружения, нет базы, всё тянет внешние сервисы. Этап 3 (аудит) можно взять отдельно, он дешёвый и полезен на длинных заданиях. НЕ подходит для текстов, аналитики и всего, что не код: там метод не проверяли. Если тест запускается легко, реальный запуск надёжнее прогонки на бумаге. Рассуждение заменяет запуск там, где его нет, а не отменяет его.

Мини-рецепт

1. Дай тикет целиком: не пересказ, а полный текст. Требования теряются именно при пересказе.
2. Задай четыре этапа: локализация, правка с прогонкой, аудит, таблица входов и выходов. Названия этапов пиши прямо в промпте.
3. Поставь замок: Не переходи к следующему этапу, пока не выписал результат предыдущего. Без этой строки метод сыплется.
4. Назови входы для прогонки: 2–4 конкретных случая из тикета. Для мелкой правки хватит двух.
5. Подставь свои граничные случаи на этапе 4: даты, валюты, пустые значения, кириллица, регистр, нули.
6. Требуй финал: что изменено, какие требования закрыты, что осталось непроверенным. Последний пункт самый честный.
7. Не уверен, что нужен весь набор: начни только с этапа 3. Он самый дешёвый.

Примеры

[ПЛОХО] : Почини баг: оплата через СБП падает, когда в корзине промокод и цифровой товар. Тикет PAY-482.
[ХОРОШО] : Задача: починить падение оплаты через СБП при промокоде и цифровом товаре, тикет PAY-482. Работай по четырём этапам, к следующему не переходи, пока не выписал результат предыдущего. ЭТАП 1: выпиши цепочку вызовов от checkout до оплаты, для каждой функции опиши поведение на входе «промокод + цифровой товар», проверь и соседние функции, не только названную в тикете. ЭТАП 2: напиши патч и пройди по нему на трёх входах из тикета: значения переменных, выбранная ветка if, результат или исключение. Не совпало с ожидаемым, исправь и прогони снова. ЭТАП 3: выпиши все требования тикета списком, для каждого укажи строку патча и вход, на котором проверил. ЭТАП 4: составь таблицу «вход → ожидаемый выход»: пустая корзина, промокод в другом регистре, несколько цифровых товаров, нулевая сумма, смешанная корзина. Потом пиши тесты и запускай. В конце: что изменил, какие требования закрыл, что не проверено. В хорошем варианте агент не остановится на первой функции из тикета. Он пройдёт всю цепочку и сверится со всеми пятью пунктами.
Источник: Enforcing Code Reasoning in Agentic Scaffold for More Effective Issue Resolution
ArXiv ID: 2610.23782 | Сгенерировано: 2026-10-19 08:20

Проблемы LLM

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

Методы

МетодСуть
Ручная прогонка кода по шагам — проверка без запускаПопроси модель «выполнить» код в тексте на конкретных входах. Пройди по патчу на трёх входах из задачи: значения переменных, какая ветка if сработала, что вернулось или какое исключение летит. Не совпало с ожидаемым — исправь и прогони снова. Почему работает: модель хорошо ведёт значения переменных, раскручивает условия и вызовы. Ей не нужно запускать программу, чтобы увидеть «здесь исключение не будет брошено». Явная запись шагов делает ошибку заметной. Когда да: запуск невозможен или дорог, нужна быстрая проверка «почти верной» правки. Когда нет: запуск доступен. Реальный тест надёжнее. Прогонка дополняет запуск, а не заменяет
Таблица «вход → ожидаемый выход» до написания тестовПеред тестами пусть модель составит таблицу разных входов с ожидаемыми результатами. Входы должны быть разными по типу: пустые значения, другой регистр, нули, составные случаи, граничные значения. Только потом тесты по таблице. Почему работает: по умолчанию модель пишет тесты одного типа, похожие друг на друга. Таблица заставляет подумать о разнообразии до того, как мысль уйдёт в код. Применяй: подставь свой список граничных случаев — даты, валюты, кириллицу, длинные строки. Не нужно: для совсем мелких правок, там хватит двух входов
Этапы с обязательным результатом и запретом идти дальшеРаздели работу на этапы. На каждом требуй письменный итог: цепочку вызовов, прогонку, список требований, таблицу входов. Не переходи к следующему этапу, пока не выписал результат предыдущего. Почему работает: без этого условия модель пропускает «скучные» этапы и сразу пишет патч. С ним рассуждение становится видимым и проверяемым. Его можно прочитать и найти пробел. Когда да: сложные многошаговые задачи с кодом. Когда нет: одна строка правки, где этапы дороже самой работы. Фразу про запрет перехода не убирай. Без неё метод слабеет
📖 Простыми словами

Enforcing Code Reasoning inAgenticScaffold for More Effective Issue Resolution

arXiv: 2610.23782

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

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

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

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

Короче: хватит ждать от нейросетей телепатии и надеяться, что агент сам догадается протестировать неочевидный сценарий. Не давай модели писать код, пока она не доказала логику на пальцах. Внедряй явную эмуляцию исполнения на уровне системных промптов — и перестанешь вычищать за агентом сырой мусор. Либо ты заставляешь AI считать вслух, либо бесконечно правишь за ним баги руками.

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

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

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