3,583 papers
arXiv:2610.25776 76 19 окт. 2026 г. FREE

TRACE–FIX: ремонт после сбоя агента через список «что ещё не выполнено», а не поиск виноватого шага

КЛЮЧЕВАЯ СУТЬ
Обнаружено: виновный шаг, симптом и то, что надо чинить сейчас, — три разные вещи. Агент тихо удалил журнал SQLite на 2-м шаге, а упал на 97-м. Метод TRACE–FIX позволяет разбирать сбои долгих агентов, которые меняют файлы и базы, и находить причину там, где её не видно в логе. Фишка: не спрашивай «где ошибка?» — составь список требований задачи и отметь, какие из них ещё не выполнены. Для каждого невыполненного требования модель выбирает события-подозреваемые, и гипотезы проверяются отдельно от ремонта. Часть бюджета резервируется заранее, чтобы хватило сил починить и перепроверить.
Адаптировать под запрос
⚡

TL;DR

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

Главная находка: шаг, который сломал, симптом и то, что надо чинить сейчас, — это три разные вещи. Агент молча удалил журнал SQLite на 2-м шаге, а упал на 97-м. Если показать модели лог и спросить «где ошибка?», она укажет на последнюю подозрительную команду или на самое громкое сообщение об ошибке. Бывает и наоборот. В истории есть сбой, но текущее состояние уже здоровое, и чинить нечего. Когда проверки и ремонты делят общий бюджет, агент часто тратит всё на диагностику и не успевает проверить свой ремонт.

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

🔬

Схема метода

ШАГ 1 (TRACE): лог + требования задачи → реестр: что не выполнено,
                какие события с этим связаны, какие данные устарели
ШАГ 2 (TRACE): LLM ранжирует топ-N событий-кандидатов в причины
                → пакет гипотез (гипотеза ≠ факт)
ШАГ 3 (FIX):   список допустимых действий с ценой
                (проверка / ремонт / продолжить / сдать) → прогноз исходов
ШАГ 4 (FIX):   выбор действия с учётом резерва на ремонт
ШАГ 5:         выполнили → квитанция → устаревшее помечено →
                реестр пересобран → снова ШАГ 3

В оригинале шаги 1, 3–5 выполняет код (рантайм), а LLM ранжирует события и даёт прогнозы. В обычном чате вручную можно воспроизвести шаги 1–2 и логику решений шагов 3–4.

🚀

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

Задача: Вы ведёте интернет-магазин и поручили Claude Code перенести каталог из старой базы в новую (PostgreSQL). На 60-м шаге падает финальный тест: «в каталоге 11 840 позиций вместо 12 000». Агент уже перебрал три версии скрипта, все с ошибками. Скрипт чистки дублей на 14-м шаге молча удалил 160 товаров без артикула. Ошибок он не выдал, а тест упал только в конце.

Промпт:

Ты разбираешь сбой агента. Не ищи, какая команда выглядела подозрительно.
Сначала собери реестр.

<Задача>
Перенести каталог из старой базы в PostgreSQL. Итог: 12 000 позиций,
у каждой есть артикул, цена, категория.


<Требования>
R1: в новой базе 12 000 позиций
R2: у всех позиций заполнена цена
R3: у всех позиций заполнена категория
R4: скрипт миграции запускается повторно без ошибок


<Лог>
{вставь лог команд и их результатов, с номерами шагов}


<Симптом>
Шаг 60: тест R1 не прошёл, 11 840 вместо 12 000.


Шаг 1. Для каждого требования напиши статус: выполнено / не выполнено /
заблокировано / неизвестно. Укажи, на чём основан статус
(какой шаг лога). Если после этого шага состояние менялось,
пометь доказательство как устаревшее.
Шаг 2. Только для невыполненных требований выбери до 3 событий из лога,
которые могли создать проблему. Отдельно отметь: это команда,
которая ИЗМЕНИЛА данные, или более поздняя проверка/отчёт о проблеме.
Если явной вредной записи нет, рассмотри пропущенные
или переставленные шаги.
Шаг 3. Для каждой гипотезы предложи дешёвую проверку, которая её
подтвердит или опровергнет. Ничего не чини, пока гипотеза не проверена.
Шаг 4. Если требование уже выполнено в текущем состоянии,
не предлагай его чинить, даже если в истории была ошибка.

Выдай: таблицу требований, топ-3 гипотезы с проверками, рекомендацию
первого действия.

Результат: Модель выдаст таблицу статусов по R1–R4 с привязкой к шагам лога. Затем три гипотезы по требованию R1, причём события-изменения будут отделены от более поздних проверок. К каждой гипотезе будет приложена дешёвая проверка, например подсчёт позиций без артикула до и после шага 14. В конце будет рекомендация сделать сначала проверку, а не ремонт. Требования, которые уже в порядке, модель пометит как «не чинить».

🧠

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

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

Сильная сторона. Если дать модели структуру вместо плоского потока, она хорошо ранжирует кандидатов по связи с конкретным невыполненным требованием. В опыте авторов тот же объём информации, поданный плоским текстом (Residual Context), прироста не дал. Подача в виде реестра с зависимостями дала.

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

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

📋

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

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


Ты разбираешь сбой агента, который менял постоянное состояние
(файлы, базы, настройки). Твоя задача — найти, что ещё не выполнено
и какое прошлое событие этому мешает. Не угадывай виноватого.



Цель: {цель_задачи}
Требования:
{список_требований_R1_R2_...}
Зависимости между требованиями: {что_от_чего_зависит}



{пронумерованный_лог: шаг, команда, результат, какие ресурсы затронуты}



Результаты проверок: {какие_проверки_что_показали}
Наблюдаемый симптом: {что_упало_и_когда}



1. Для каждого требования: выполнено / не выполнено / заблокировано /
   неизвестно. Укажи шаг лога, на котором основан статус.
2. Если после этого шага менялся ресурс, от которого зависит доказательство,
   пометь доказательство УСТАРЕВШИМ и не опирайся на него.
3. Остаточное обязательство = требование, которое не выполнено,
   заблокировано невыполненной предпосылкой или потеряло подтверждение.
4. Историческая ошибка не является целью ремонта, если текущее
   состояние уже удовлетворяет требованию.



Выбери до {N} событий, которые вероятнее всего создали невыполненное
требование, от более к менее вероятному.
- Отличай команды, ИЗМЕНИВШИЕ состояние, от более поздних наблюдений,
  тестов и отчётов о проблеме.
- Если явной вредной записи нет, рассмотри пропущенные или
  переставленные действия.
- Зависимость и «последняя запись» — это подсказка, не доказательство.



Для каждой гипотезы: ID события, ссылки на доказательства,
какие требования затронуты, дешёвая проверка, которая её подтвердит
или опровергнет. Гипотеза остаётся гипотезой до проверки.



Бюджет: {всего_единиц}. Резерв на ремонт и повторную проверку: {резерв}.
Допустимые действия и цена: {проверка=..., ремонт=..., продолжить=..., сдать=...}
Для каждого действия оцени возможные исходы и что останется возможным после.
Правила:
- Не трать резерв на диагностику.
- Не чини то, что уже выполнено.
- После любого действия пересобери реестр с шага 1.
- Если оценить нельзя, продолжай как раньше.


Выдай: таблицу требований, пакет гипотез, следующее действие с обоснованием
и остаток бюджета.

Подставь: {цель_задачи} — одно предложение; {список_требований} — что должно быть истинно в конце; {пронумерованный_лог} — команды и результаты; {N} — 3; {всего_единиц} и {резерв} — условные единицы, например 12 и 4.

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

Вот шаблон TRACE–FIX для разбора сбоя агента. Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.

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

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

⚠️

Ограничения

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

⚠️ Свой бенчмарк, часть результатов пока не измерена: корпус из 1 500 сбоев пока запланирован, оценки идут на 200, 120 и 60 случаях. Часть абляций (Figure 4) — «планируемые цели» без измеренных значений. Это слабая опора для кратных обещаний.

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

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

⚠️ Гипотеза ≠ факт: даже верхняя в рейтинге причина остаётся догадкой. Если пропустить проверку и сразу чинить, метод теряет смысл.

🔍

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

Исследователи собрали бенчмарк LongH-Debug из естественных сбоев агентов в семи средах: оболочка и файлы (Terminal-Bench), диалоги с инструментами (τ²-bench), симуляции (ALFWorld, ScienceWorld, TextWorld), длинный поиск (BrowseComp-Plus, xbench). Идея в том, чтобы разделить три разных вопроса: нашли ли причину (TRACE на 200 сбоях), починили ли при известной причине (FIX на 120 случаях), работает ли связка целиком (60 задач). Так нельзя незаслуженно хвалить ремонтника за скрытую повторную диагностику.

Для поиска причин TRACE дал Hit@1 68% против 42% у обычного «ранжируй по логу». Доля гипотез, которые удалось независимо подтвердить в бюджете, выросла с 31% до 60,5%. Стоило это на 29% дороже по токенам. Метод Who&When показал всего 8%, а TraceElephant — 44% при пятикратной цене. Удивительный результат: те же сведения плоским текстом (Residual Context) прироста не дали, 43% против 42%. Значит, дело в структуре, а не в объёме.

Для ремонта при известной причине полный FIX поднял успех с 35% (агент просто продолжает) до 67,5% и снизил вредные вмешательства до 2,5%. Важная деталь: информационный выбор с резервом на ремонт дал 61,7% против 50% без резерва. Авторы сами сказали, что прирост даёт именно резерв, а не рекурсия Беллмана. Поэтому они сравнивали с сильным базовым методом, а не с заведомо слабым.

Практический вывод: что считать целью ремонта и сколько беречь на сам ремонт важнее красоты алгоритма.

💡

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

🔧 Техника: добавить правило остановки в инструкцию агента → защита от «диагностики до нуля»

Для CLAUDE.md или AGENTS.md (это экстраполяция принципа резерва, в статье такой текст не приведён):

Когда тесты падают: сначала выпиши, какие требования задачи не выполнены сейчас.
Историческую ошибку не чини, если текущее состояние уже проходит проверку.
Не более 3 диагностических действий подряд. Остальной запас оставь на ремонт
и повторную проверку. После каждого ремонта пересобери список невыполненного.

Комбинация с самопроверкой: после шага 3 шаблона добавь «Если проверка опровергла гипотезу, вычеркни её и перейди к следующей, не пытаясь чинить опровергнутую». Это дисциплина «гипотеза → проверка → ремонт» из статьи.

🔗

Ресурсы

  • From Trace to Fix: Residual Task State in Long-Horizon Agents (Under review)
  • Авторы: Zile Huang, Ser-nam Lim, University of Central Florida
  • Код: https://github.com/toffeecat/tracedp
  • Используемые среды: Terminal-Bench, τ²-bench, ALFWorld, ScienceWorld, TextWorld, BrowseComp-Plus, xbench; сравнение с Who&When, TraceElephant

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

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

Обнаружено: виновный шаг, симптом и то, что надо чинить сейчас, — три разные вещи. Агент тихо удалил журнал SQLite на 2-м шаге, а упал на 97-м. Метод TRACE–FIX позволяет разбирать сбои долгих агентов, которые меняют файлы и базы, и находить причину там, где её не видно в логе. Фишка: не спрашивай «где ошибка?» — составь список требований задачи и отметь, какие из них ещё не выполнены. Для каждого невыполненного требования модель выбирает события-подозреваемые, и гипотезы проверяются отдельно от ремонта. Часть бюджета резервируется заранее, чтобы хватило сил починить и перепроверить.

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

Обычный вопрос к логу: «что пошло не так?». Модель цепляется за последнюю команду или самое громкое сообщение об ошибке. TRACE–FIX сужает вопрос до трёх частей: какое требование не выполнено, какое событие его затронуло и что можно позволить себе сделать сейчас. Гипотеза остаётся гипотезой, пока дешёвая проверка её не подтвердила. Это как врач, который смотрит на сегодняшние анализы, а не листает всю карту болезней. Старая болезнь, которая уже вылечена, не повод для нового лечения. Порядок такой: реестр требований → до 3 подозреваемых событий → проверка → только потом ремонт. После каждого действия реестр собирается заново.

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

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

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

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

Мини-рецепт

1. Выпиши требования: что должно быть истинно в конце. Например, 12 000 позиций, у всех есть цена, скрипт запускается повторно.
2. Пронумеруй лог: шаг, команда, результат, какие файлы и таблицы затронуты.
3. Заставь отметить статусы: выполнено, не выполнено, заблокировано, неизвестно. К каждому статусу нужна ссылка на шаг.
4. Следи за устаревшим: если после шага ресурс менялся, доказательство не считается.
5. Возьми топ-3 подозреваемых: для каждого отдельно пометь, это команда, которая изменила данные, или более поздний отчёт об ошибке.
6. Требуй дешёвую проверку: например, посчитать строки до и после шага. Пока гипотеза не проверена, ничего не чини.
7. Задай бюджет и резерв: например, 12 единиц всего и 4 на ремонт с перепроверкой. Резерв на диагностику не трогать.
8. Запрети лишнее: если требование уже выполнено, чинить его не надо, даже если в истории была ошибка.
9. Пересобирай: после любого действия начинай заново с шага 3.

Примеры

[ПЛОХО] : Вот лог агента на 200 шагов. Где ошибка? Исправь.
[ХОРОШО] : Ты разбираешь сбой агента. Не ищи подозрительную команду, сначала собери реестр. Задача: перенести каталог в PostgreSQL, итог 12 000 позиций. Требования: R1 — 12 000 позиций; R2 — у всех есть цена; R3 — у всех есть категория; R4 — скрипт запускается повторно без ошибок. Симптом: на шаге 60 тест R1 показал 11 840 вместо 12 000. Для каждого требования напиши статус и шаг лога, на котором он основан. Если после этого шага состояние менялось, пометь доказательство устаревшим. Для невыполненных выбери до 3 событий-подозреваемых и отметь, какое из них изменило данные, а какое просто сообщило о проблеме. К каждой гипотезе дай дешёвую проверку. Ничего не чини, пока гипотеза не проверена. Выполненные требования не трогай. Лог: {вставь лог с номерами шагов} Что получится: таблица статусов по R1–R4 со ссылками на шаги. Подозреваемым окажется скрипт чистки дублей с шага 14, который молча удалил 160 товаров без артикула. Первая рекомендация — не ремонт, а проверка: сравнить число позиций без артикула до и после шага 14.
Источник: From Trace to Fix: Residual Task State in Long-Horizon Agents
ArXiv ID: 2610.25776 | Сгенерировано: 2026-10-20 16:10

Проблемы LLM

ПроблемаСутьКак обойти
Разбирая длинный лог, модель указывает на самое заметное, а не на настоящую причинуДаёшь длинную историю действий и спрашиваешь «где ошибка?». Модель называет последнюю команду или самое громкое сообщение об ошибке. Но причина и симптом часто далеки друг от друга. Тихое действие (например, удаление данных с кодом «успех») на 2-м шаге ничего не показало, а сбой вылез на 97-м. Бывает и наоборот: ошибка была, но потом её исправили, и чинить уже нечего. Модель всё равно предлагает чинить. Это касается любой отладки по истории: код, данные, настройки, цепочки действий агентаНе спрашивай «где ошибка?». Сначала задай список требований и попроси статус каждого: выполнено, не выполнено, заблокировано, неизвестно. Только потом ищи события, связанные с невыполненными. Подробный приём описан в методе ниже

Методы

МетодСуть
Реестр требований вместо поиска виноватого — точная причина сбояЧто делать. Дай модели три вещи: список требований к результату, пронумерованный лог, симптом. Потом веди её по шагам. 1. Для каждого требования пусть напишет статус и номер шага лога, на котором он основан. 2. Если после этого шага состояние менялось, доказательство помечается «устаревшим». Опираться на него нельзя. 3. Только для невыполненных требований: до 3 событий-кандидатов в причины. Пусть отдельно отметит, что это: команда, которая изменила данные, или более поздняя проверка и отчёт об ошибке. Если явной вредной команды нет, пусть рассмотрит пропущенные или переставленные шаги. 4. Для каждой гипотезы пусть предложит дешёвую проверку. Ничего не чинить, пока гипотеза не проверена. 5. Если требование уже выполнено сейчас, чинить его не нужно, даже если в истории была ошибка. Выдай: таблицу требований, топ-3 гипотезы с проверками, первое действие. Почему работает: вопрос сужается с «что пошло не так?» до «какое требование не выполнено и какое событие его затрагивает?». Модель привязывается к цели, а не к громкому тексту. Разделение «изменило данные» и «позже сообщило» не даёт принять симптом за причину. Когда да: есть проверяемые критерии готовности, лог длинный, действия меняют постоянное состояние (файлы, базы). Когда нет: творческие задачи без критерия приёмки. Реестру не из чего строиться
Резерв бюджета на ремонт — агент успевает проверить починкуЧто делать. Задай общий бюджет действий в условных единицах, например 12. Выдели резерв на ремонт и повторную проверку, например 4. Задай цену действий: проверка, ремонт, продолжить, сдать. Правила: Не трать резерв на диагностику. После любого действия пересобери реестр с шага 1. Если оценить исходы нельзя, продолжай как раньше. Почему работает: диагностика затягивает. Без резерва вся бюджетная часть уходит на поиск причины, а ремонт остаётся непроверенным. Основной выигрыш даёт сам резерв, а не сложное планирование. Когда да: у действий есть цена или лимит попыток, ремонт дорогой или рискованный (тогда резерв больше). Когда нет: один шаг, нет лимита. Помни: оценки исходов от модели годятся для планирования, но не как вероятности. Полный цикл с пересборкой после каждого действия вручную тяжёл
📖 Простыми словами

From Trace to Fix: Residual Task State in Long-HorizonAgents

arXiv: 2610.25776

Когда агент выполняет сложную задачу на 60 шагов, он почти гарантированно завалит финал из-за разрыва между причиной и симптомом. Скрипт может тихо снести нужные данные ещё на шаге 14 с кодом возврата 0, а итоговый тест упадёт только в самом конце. Если скормить модели сырой лог, она вцепится в последнюю команду и начнёт лечить следствие, потому что ранняя скрытая диверсия для неё — просто фоновый шум.

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

Чтобы прекратить этот цирк, исследователи придумали связку TRACE–FIX. Компонент TRACE не читает логи как слезливый роман, а превращает их в жесткий реестр: фиксирует, какие требования провалены и какие давние действия виноваты, отсекая неактуальный мусор. Следом подключается FIX: он трезво оценивает лимиты, резервирует бюджет действий на ремонт и точечно проверяет гипотезы, вместо того чтобы вслепую спамить правками.

Метод гоняли на базах данных вроде PostgreSQL, но принцип универсален для любого сложного софта. Будь то Claude Code, Devin или скрипт автоматизации деплоя — везде, где есть изменяемое состояние системы, агент со временем накопит скрытые косяки. Сырые логи убивают отладку, а структурированная работа с остаточным состоянием вытаскивает даже безнадёжно заваленные задачи.

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

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

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

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