3,583 papers
arXiv:2610.28934 91 20 окт. 2026 г. FREE

Backup Awareness: агенты выполняют задачу, но не сохраняют то, что меняют, и как это закрыть

КЛЮЧЕВАЯ СУТЬ
Обнаружено: кодовые агенты (Claude Code, Codex) проходят задачу, но бэкап перед «моментом сожаления» делают лишь в малой доле запусков. Они обновляют пакеты, правят базу, удаляют файлы и ничего не сохраняют. Метод BackUpper позволяет не терять старые версии пакетов, удалённые записи и прежние конфиги, даже если модель про бэкап не вспомнила. Фишка: не проси модель помнить про бэкап, а перехватывай каждый вызов инструмента до выполнения. Простые команды закрывают жёсткие правила, а сложные разбирает маленький субагент (отдельная лёгкая модель-помощник). Это дало покрытие бэкапами там, где у агентов оно почти нулевое. Для чата есть упрощённая версия в виде текста для CLAUDE.md, но её авторы не проверяли.
Адаптировать под запрос
⚡

TL;DR

Кодовые агенты (Claude Code, Codex и им подобные) почти не делают бэкап перед действием, которое меняет состояние: обновляют пакеты, правят базу, удаляют файлы, меняют настройки. Задачи они при этом проходят в большинстве случаев, а бэкап перед «моментом сожаления» делают лишь в малой доле запусков. Статья называет это backup awareness (понимание, что состояние может понадобиться потом, и привычка сохранить его заранее). BackUpper, предложенный авторами, — это «страховочный слой». Он перехватывает каждый вызов инструмента до выполнения и сохраняет затронутое состояние. Простые команды обрабатывают жёсткие правила, а сложные и непонятные — отдельный маленький субагент.

Боль в том, что агент делает ровно то, что просили, и всё «работает». Через неделю выясняется, что нужна старая версия пакета, удалённая запись или прежний конфиг, а копии нет. Причина в том, что модель не думает «а вдруг это понадобится». Она оптимизирует выполнение запроса. Хуже всего с изменениями вне рабочей папки: встроенные защиты агентов (снимки папки проекта, сохранение файлов перед правкой) их не покрывают. Больше всего удивляет разброс. У одних моделей бэкап есть в большинстве запусков, у других — почти никогда. Не помогают ни «умная» обвязка агента, ни новые поколения модели, ни рост размера.

Метод работает в четыре уровня. Для безопасных команд — заменить rm на mv в .trash. Перед pip install — выполнить pip freeze. Для изменений в папке проекта — сделать снимок. Для остального — спросить лёгкую модель «это только чтение?» и, если нет, вызвать субагента-«бэкапера». Всё это происходит вне контекста основного агента.

🔬

Схема метода (BackUpper)

ПЕРЕХВАТ: каждый вызов инструмента — до выполнения

ПРОВЕРКА 0: команда только читает? (белый список) → пропустить, бэкап не нужен

УРОВЕНЬ 1: есть правило-замена? → выполнить обратимый аналог
           (rm x → mv x .trash/)
УРОВЕНЬ 2: есть правило-пара? → сначала команда бэкапа, потом оригинал
           (pip install ← pip freeze)
УРОВЕНЬ 3: изменение в рабочей папке или встроенным инструментом? → снимок
           (Git-снимок только затронутых файлов)
УРОВЕНЬ 4: остальное (например, bash run.sh):
           ├─ лёгкая LLM: «только чтение или нет?»
           └─ если нет → субагент осматривает и сохраняет состояние

ЖУРНАЛ: что сохранено + команда или инструкция восстановления

Основной агент может сам пометить действие тегом [BACKUP NEEDED]. Тогда оно пропускает проверку «только чтение?». Непомеченные вызовы всё равно проверяются автоматически.

🚀

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

Задача: Основатель интернет-магазина с выгрузками из 1С, парсером цен конкурентов с Wildberries и PostgreSQL для аналитики просит Claude Code «почистить старые выгрузки, обновить зависимости парсера и убрать дубли товаров в базе». Всё это меняет состояние вне проекта. Откатить потом нечем.

Это перенос идеи BackUpper в текстовую инструкцию для файла CLAUDE.md. Сами авторы реализовали её кодом (хук перед вызовом инструмента). Работает ли текстовая версия так же надёжно, статья не проверяла.

Промпт (в CLAUDE.md или системный промпт агента):


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



Перед КАЖДЫМ вызовом инструмента классифицируй действие:

READ_ONLY (только чтение: ls, cat, SELECT) → выполняй без бэкапа.

Иначе иди по уровням, применяй первый подходящий:

Уровень 1 — ЗАМЕНА на обратимое:
  rm <файл> → mv <файл> ./.trash/<дата>/
  DELETE в базе → сначала CREATE TABLE <таблица>_bak_<дата> AS SELECT ...
Уровень 2 — ПАРА «бэкап → действие»:
  pip install / npm install → сначала pip freeze > .backup/requirements_<дата>.txt
  UPDATE в базе → сначала выгрузка затрагиваемых строк в .backup/
Уровень 3 — СНИМОК (изменения в папке проекта): git commit или git stash
  перед правкой.
Уровень 4 — НЕПОНЯТНЫЙ ЭФФЕКТ (запуск скрипта, внешний сервис):
  сначала прочитай скрипт или документацию, выпиши, какое состояние
  он меняет, сохрани его, и только потом запускай.

Если действие меняет что-то ВНЕ рабочей папки — пометь его
[BACKUP NEEDED] и выполни бэкап обязательно.



После каждого бэкапа добавь запись в .backup/LOG.md:
- что сохранено,
- где лежит,
- точная команда восстановления.
В конце задачи покажи мне список записей.



Бэкапь: {что_бэкапить}
Не бэкапь: {что_не_бэкапить}

Результат: Перед каждой опасной операцией агент будет называть класс действия и уровень. Удаление выгрузок пойдёт через перемещение в .trash. Перед обновлением зависимостей появится файл со списком версий. Перед чисткой дублей в базе появится копия затрагиваемых строк. В конце придёт список журнала с командами восстановления. Это сократит часть пропусков. Полное покрытие гарантирует только перехват на уровне инструмента.

🧠

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

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

Сильная сторона: модель хорошо следует чёткому правилу вида «если встретил X, сделай Y» и умеет разбирать, что делает скрипт. BackUpper разгружает её. Для простых случаев правило прописано жёстко (rm → mv), и думать не нужно. Для сложных вызывается отдельный субагент, который видит только текущий вызов и заранее подготовленную «шпаргалку» (backup experiences: что меняет каждый инструмент и как это сохранить). Основной контекст остаётся чистым, а бэкап стоит копейки.

Рычаги управления: - Белый список «только чтение» → расширь, чтобы агент не бэкапил лишнее и не тратил токены. - Правила уровней 1–2 → добавляй свои пары «опасная команда → безопасный аналог» под свой стек (1С, Postgres, Kubernetes). - → сужай через естественный язык («бэкапь только то, что написано людьми»). Охват падает, расходы тоже. - [BACKUP NEEDED] → хорошо работает как явный сигнал для хука или проверки: помеченное не проходит лишнюю проверку.

📋

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

См. промпт в примере выше. Он сохраняет структуру метода: проверка «только чтение», четыре уровня, тег [BACKUP NEEDED], журнал восстановления, настройка охвата.

Подставляй: - {что_бэкапить} — что для тебя ценно: «любые данные клиентов, файлы вне папки проекта, версии пакетов, схему базы»; - {что_не_бэкапить} — что можно терять: «кэш, логи, временные файлы, node_modules».

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

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

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

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

⚠️

Ограничения

⚠️ Промпт-версия не проверена: В статье эффект измерен у кода-перехватчика, а не у текстовой инструкции в CLAUDE.md. Текстовое правило поможет, но может пропускаться так же, как и сейчас. Надёжнее хук, который срабатывает независимо от модели.

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

⚠️ Нужна инженерия: Полный BackUpper — это плагин для обвязки агента (перехват вызовов, правила, субагент, снимки). Просто настроить его в чате нельзя. Читатель без разработчика получит лишь упрощённую версию.

⚠️ Узкий класс действий: бенчмарк — изменения внешнего состояния (терминал, SQL, браузер, почта, DevOps). Для чистого написания кода или текста это не нужно.

⚠️ Проверка автоматизирована: результаты судила LLM (с проверкой людьми, высокое согласие), а задачи собраны с помощью LLM. Вместо реальных потерь — моделирование.

⚠️ Цена бэкапа: лучшая модель тратит около 9% вызовов на самосохранение, и их оплачивает дорогая основная модель. Субагент дешевле, но это дополнительные вызовы и хранилище.

🔍

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

Исследователи собрали 205 реальных историй «я потерял X и жалею, что не сделал бэкап» с X.com, GitHub, Stack Overflow и из новостей про потерю данных. Из каждой выделили действие, затронутое состояние и то, что потом понадобилось. Затем каждую историю превратили в исполняемую задачу из нескольких шагов в реальном окружении, например в чужом репозитории с тестами. Задачи покрывают пять типов инструментов: терминал, SQL, браузер, почту и DevOps. Затронутое состояние нарочно вынесли за пределы папки, которую защищают встроенные механизмы агента, чтобы любой бэкап был заслугой самого агента.

Проверили шесть передовых моделей в трёх обвязках агентов. Две LLM-судьи оценивали, выполнена ли задача и сделан ли бэкап перед «моментом сожаления» (согласие с людьми — 95,3%). Результат: агенты проходят в среднем 86,1% задач, но бэкап перед «моментом сожаления» делают только в 15,2%. В 72% запусков задача выполнена, а нужное состояние не сохранено. Лучшая модель (Claude Opus-5) пропускает бэкап в 35,6% задач. Остальные — гораздо хуже: GPT 5.6-Sol — 5,9%, DeepSeek V4-Pro — 2,9%.

Дальше сравнили обвязки. Одни и те же модели в Claude Code, Codex и Hermes дали почти одинаковую долю бэкапов (разброс до 5 пунктов), а между моделями разница огромна. Вывод: дело не в обвязке, а в самой модели. Три поколения GPT (5.4 → 5.5 → 5.6-Sol) подняли «интеллект» с 39 до 47, но доля бэкапов осталась на уровне 5–7%. Значит, «подождём, пока модели поумнеют» не работает. Claude Opus-5 с тем же уровнем интеллекта выдаёт около 73%, значит, привычку надо специально тренировать.

BackUpper покрыл все «моменты сожаления» во всех моделях, а восстановленное состояние на 92,2% совпало с исходным. Цена — $0,014 на задачу, затраты токенов в 7 раз ниже, а задержка бэкапа на 31,7% меньше, чем при самосохранении основным агентом. Ограничение по предпочтениям пользователя даёт F1 84,5%, а решения субагента можно превращать в правила и удвоить покрытие правилами за 30 задач. Часть результатов в предоставленном тексте обрезана.

💡

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

🔧 Техника: сузить охват словами → меньше шума и расходов

Авторы в оригинале допускают «персонализированные режимы»: пользователь описывает, что бэкапить. Пример для блока :

Бэкапь только изменения контента, написанного людьми
(тексты, таблицы, договоры). Автогенерируемое (кэш, логи,
сборки) не сохраняй.

Это сокращает вызовы субагента и место под копии.

Экстраполяция (моя идея, в статье не проверялась): предполётная проверка перед опасной задачей

Перед длинной задачей попроси агента заранее составить карту рисков. Это дёшево и отлавливает пропуски до начала.

Прежде чем начать: перечисли все действия из моей задачи, которые
изменят что-то ВНЕ рабочей папки (пакеты, база, настройки, внешние
сервисы). Для каждого напиши: что будет потеряно, как это сохранить,
как восстановить. Жди моего «ок» и только потом выполняй.
🔗

Ресурсы

  • Работа: Back Up Before You Regret: Measuring Backup Awareness and Automating Backup in Coding Agents (препринт)
  • Авторы: Xu Li, Simon Yu, Minzhou Pan, Yiyou Sun, Zhaorun Chen, Bo Li, Weiyan Shi
  • Университеты: Northeastern University, UC Berkeley, University of Chicago, UIUC
  • Страница проекта: https://back-up-before-you-regret.github.io/
  • Данные (RegretBench): https://huggingface.co/datasets/CHATS-Lab/RegretBench
  • Код (BackUpper): https://github.com/CHATS-lab/BackUpper

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

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

Обнаружено: кодовые агенты (Claude Code, Codex) проходят задачу, но бэкап перед «моментом сожаления» делают лишь в малой доле запусков. Они обновляют пакеты, правят базу, удаляют файлы и ничего не сохраняют. Метод BackUpper позволяет не терять старые версии пакетов, удалённые записи и прежние конфиги, даже если модель про бэкап не вспомнила. Фишка: не проси модель помнить про бэкап, а перехватывай каждый вызов инструмента до выполнения. Простые команды закрывают жёсткие правила, а сложные разбирает маленький субагент (отдельная лёгкая модель-помощник). Это дало покрытие бэкапами там, где у агентов оно почти нулевое. Для чата есть упрощённая версия в виде текста для CLAUDE.md, но её авторы не проверяли.

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

Метод работает как четыре ступени. Первая подходящая срабатывает, остальные пропускаются. 0. Команда только читает (ls, cat, SELECT)? Пропускаем. 1. Есть обратимая замена? Делаем её: rm x превращается в mv x .trash/. 2. Есть пара «бэкап, потом действие»? Перед pip install идёт pip freeze. 3. Правка в папке проекта? Делаем снимок только затронутых файлов (Git). 4. Всё остальное, например bash run.sh: лёгкая модель спрашивает «это только чтение?». Если нет, субагент осматривает скрипт и сохраняет состояние. Простые случаи решает жёсткое правило, думать модели не нужно. Умная часть включается только для непонятных вызовов. Это как охранник на входе: большинство проходит по пропуску, а подозрительных отводят в комнату к проверяющему. В конце агент пишет журнал: что сохранено, где лежит и команда восстановления. Сам агент может пометить действие тегом [BACKUP NEEDED], и тогда оно пропускает проверку «только чтение?».

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

Модель заточена под выполнение запроса. Про сохранение прошлого состояния её никто не просил, и шаг «бэкап» сам не появляется. Это не вопрос ума. Рост «интеллекта» между поколениями GPT почти не поднял долю бэкапов. Умная обвязка агента тоже не помогла. Жесть: у одних моделей бэкап есть в большинстве запусков, у других почти никогда, и это привычка из обучения, а не вопрос размера или версии. Зато модель хорошо следует правилу «встретил X, сделай Y» и умеет читать, что делает скрипт. Субагент видит только текущий вызов и заранее написанную шпаргалку (что меняет каждый инструмент и как это сохранить). Основной контекст остаётся чистым. Лучшая модель тратит на самосохранение около 9% вызовов, а субагент делает ту же работу дешевле.

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

Агенты для терминала, баз данных, браузера, почты и DevOps (настройка и обслуживание серверов) → особенно когда они меняют что-то вне папки проекта. Встроенные защиты агентов (снимки проекта, сохранение файла перед правкой) эти изменения не покрывают. Для парсеров, выгрузок, зависимостей и чистки дублей в базе это обязательная страховка. НЕ подходит для чистого написания кода или текста: там нечего откатывать вне файлов. Полный BackUpper требует разработчика, потому что это плагин с перехватом вызовов. Текстовая версия в CLAUDE.md может пропускаться так же, как сейчас.

Мини-рецепт

1. Вставь политику: положи блок в CLAUDE.md или системный промпт агента.
2. Заполни охват: в напиши, что ценно: данные клиентов, версии пакетов, схема базы, файлы вне проекта.
3. Назови, что не жалко: кэш, логи, node_modules, временные файлы. Так агент не потратит токены на мусор.
4. Добавь свои пары: для своего стека пропиши «опасная команда, безопасный аналог». Например, DELETE в Postgres, потом копия таблицы через CREATE TABLE ..._bak AS SELECT.
5. Потребуй журнал: запись в .backup/LOG.md после каждого бэкапа с точной командой восстановления.
6. Проверь на себе: дай агенту безопасную задачу с rm и pip install. Убедись, что бэкап появился, а не только обещан.
7. Ставь хук, если можно: если рядом есть разработчик, пусть сделает перехват вызовов в коде. Он срабатывает независимо от настроения модели.

Примеры

[ПЛОХО] : Почисти старые выгрузки из 1С, обнови зависимости парсера и убери дубли товаров в базе
[ХОРОШО] : Перед каждым действием, которое меняет состояние, определи класс: только чтение, замена на обратимое, пара «бэкап, потом действие», снимок или непонятный эффект. Удаление файлов делай через перемещение в .trash/<дата>/. Перед обновлением пакетов сохрани список версий в .backup/. Перед удалением дублей в базе сделай копию затрагиваемых строк. Всё, что меняет что-то вне папки проекта, помечай [BACKUP NEEDED]. После каждого бэкапа пиши в .backup/LOG.md, что сохранено, где лежит и команду восстановления. В конце покажи список записей. Не бэкапь: кэш, логи, временные файлы. Задача: почисти старые выгрузки из 1С, обнови зависимости парсера цен и убери дубли товаров в базе PostgreSQL После второго промпта через неделю не придётся гадать, какая версия пакета работала. Старая лежит в .backup/, а в журнале написана команда отката. Но честно: текстовое правило никто не проверял. Гарантию даёт только перехват на уровне инструмента.
Источник: Back Up Before You Regret: Measuring Backup Awareness and Automating Backup in Coding Agents
ArXiv ID: 2610.28934 | Сгенерировано: 2026-10-22 17:50

Концепты не выделены.

📖 Простыми словами

Back Up Before You Regret: Measuring Backup Awareness and Automating Backup in CodingAgents

arXiv: 2610.28934

Кодовые агенты вроде Claude Code или Codex лажают не потому, что они тупые. Дело в архитектуре: LLM оптимизированы под результат, а не под безопасность. Модель стремится выполнить задачу любой ценой, поэтому спасительный бэкап перед необратимым действием она делает лишь в малой доле запусков. И рост «интеллекта» моделей это не лечит: новые поколения GPT ломают прод так же бодро, как и старые. У агентов напрочь отсутствует backup awareness — врожденная привычка сохранять состояние до того, как наступит момент сожаления.

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

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

В статье гоняли код, но грабли абсолютно универсальны. Та же беда ждет любого, кто пускает агентов разгребать выгрузки из 1С, обновлять зависимости для парсеров цен или оптимизировать таблицы в PostgreSQL. Как только ты даешь модели терминал, она превращается в цифровую гранату без чеки. Любая безобидная правка конфига вне проекта моментально приводит к полной потере состояния, откатить которое задним числом уже нечем.

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

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

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

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