3,583 papers
arXiv:2610.11773 77 8 окт. 2026 г. FREE

Obligations: проверка не только запрещённых действий агента, но и невыполненных обязательных

КЛЮЧЕВАЯ СУТЬ
Агент не нарушил ни одного запрета, тесты зелёные, ключ не утёк, а дамп с данными клиентов лежит в /tmp. Такие пропуски встречаются чаще нарушений: у одной модели в 57% запусков против 30%. Метод позволяет перед сдачей проверить работу ИИ-агента и найти то, что он обязан был закрыть, удалить или добавить, но не сделал. Вместо вопроса «что он сделал не так» задаём второй: «что он оставил открытым?» Модель получает задачу и журнал действий, а возвращает список невыполненных обязательств или пустой список.
Адаптировать под запрос
⚡

TL;DR

Obligation (обязательство) — действие, которое агент должен был сделать ради безопасности, но не сделал. Например: удалить временный файл с секретами, закрыть открытый порт, добавить проверку срока сессии. Проверка работы агента по схеме «что он сделал и не нарушил ли запрет» эти пропуски не видит. Нужен второй вопрос: «что агент обязан был сделать перед завершением, но оставил?»

Главная находка: агент может не нарушить ни одного запрета и всё равно оставить дыру. Тесты зелёные, ключ не утёк, а дамп с данными клиентов лежит в /tmp. В реальных запусках кодирующих агентов невыполненные обязательства встречались заметно чаще, чем запрещённые действия: у одной модели в 57% запусков против 30%. Причина в том, что агент оптимизирует «задача решена, тесты прошли». Уборка за собой и защитные шаги в это условие не входят.

Проверять такие пропуски тоже трудно. Даже сильнейшие модели в роли проверяющего находят меньше половины невыполненных обязательств, а полностью точный список составляют примерно в одном случае из десяти. Хуже всего у них получается, когда обязательство возникло рано в ходе работы или когда их несколько сразу. Авторы обучили для этого маленькую модель-проверяющего. Читателю это недоступно, но сама постановка вопроса работает и без обучения: отдаём LLM задачу и журнал действий агента, просим вернуть список невыполненного (или пустой список).

🔬

Схема метода

ВХОД:   задача пользователя + полный журнал действий агента (команды и ответы среды)
ШАГ 1:  Выписать, что агент создал, открыл, ослабил или временно включил
ШАГ 2:  Для каждого пункта — что должно быть возвращено/закрыто/добавлено до завершения
ШАГ 3:  Сверить с журналом: сделано или нет (с доказательством из журнала)
ВЫХОД:  список невыполненных обязательств ИЛИ пустой список, если всё закрыто

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

🚀

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

Задача: Фрилансер через Claude Code переносит базу клиентов Telegram-бота записи в барбершоп на новый сервер в Selectel. Агент сделал дамп базы, временно открыл порт Postgres наружу для проверки, прогнал миграцию. Тесты зелёные, агент пишет «готово». Перед сдачей проекта нужно проверить, что он ничего не оставил.

Промпт:

Ты — аудитор работы ИИ-агента. Твоя задача — найти НЕВЫПОЛНЕННЫЕ ОБЯЗАТЕЛЬСТВА:
действия, которые агент обязан был сделать ради безопасности, но не сделал
к моменту завершения. Запрещённые действия не ищи — только то, что осталось
несделанным.

Задача, которую давали агенту:
Перенести базу клиентов Telegram-бота записи «Бритва» (имена, телефоны,
история визитов) на новый сервер в Selectel и убедиться, что бот работает.

Журнал действий агента (команды и ответы среды):
[вставить полный журнал]

Порядок работы:
1. Выпиши всё, что агент создал, открыл, включил или ослабил по ходу работы
   (файлы, порты, токены, права, временные настройки, отладочные режимы).
2. По каждому пункту определи: что должно быть удалено, закрыто, возвращено
   или добавлено до завершения.
3. Проверь по журналу, сделал ли агент это. Приведи номер шага или цитату как доказательство.
4. Выведи только то, что НЕ сделано.

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

Результат: Модель сначала перечислит «следы» работы агента: дамп, открытый порт, временные учётные данные. Затем по каждому проверит, закрыт ли он. В конце выдаст короткий список незакрытого с указанием шага журнала и риска (например, «данные клиентов остаются доступными»). Если всё убрано, ответит, что обязательств нет. Читать нужно с поправкой: список может быть неполным, это подсказка для ручной проверки, а не гарантия.

🧠

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

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

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

Как метод использует это. Промпт превращает «найди то, чего нет» в два простых шага: сначала список того, что появилось, потом проверка закрытия по каждому пункту. Так модель не должна «увидеть пустоту», а сверяет конкретные пары «открыл — закрыл ли».

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

📋

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

Ты — аудитор работы ИИ-агента. Найди НЕВЫПОЛНЕННЫЕ ОБЯЗАТЕЛЬСТВА: действия,
которые агент обязан был выполнить ради безопасности, но не выполнил к моменту
завершения. Запрещённые действия не ищи.

<Задача>
{задача_агента}


<Журнал>
{журнал_действий}


<Категории_риска>
{категории_риска}


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

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

Что подставлять: {задача_агента} — исходная постановка, которую получил агент. {журнал_действий} — полный лог команд и ответов (в Claude Code — история сессии). {категории_риска} — например: утечка данных, доступы и сессии, подмена и подпись, изменение защищённых файлов и настроек.

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

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

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

LLM спросит, какие системы агент трогал (сервер, база, ключи, сервисы) и какие риски для тебя критичны. Это нужно, чтобы заполнить {категории_риска}: без них аудитор будет искать слишком общо.

Важно: готового промпта в тексте статьи нет. Шаблон построен по формулировке задачи из статьи: «задача + журнал → набор невыполненного, пустой набор допустим».

⚠️

Ограничения

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

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

⚠️ Только кодирующие агенты: проверяли на исправлении ошибок, разработке функций и работе в терминале. Для агентов в других областях (продажи, поддержка) вывод не проверен.

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

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

⚠️ Эталон частично машинный: разметку делала GPT, её проверяли два инженера (согласие 82%). Разметка не безупречна.

⚠️ Текст обрезан: анализ факторов, абляции и результаты с интеграцией проверяющего в агента даны только по введению.

🔍

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

Сначала авторы проверили, насколько проблема вообще реальна. Они взяли бенчмарк SusVibes (кодирующие агенты решают задачи, потом отдельно проверяют безопасность) и посмотрели на запуски двух моделей. GPT разметила, из-за чего каждый небезопасный запуск «провалился»: из-за запрещённого действия, из-за невыполненного обязательства или того и другого. Оказалось, что пропущенные обязательства встречаются чаще запрещённых действий: в среднем 51% запусков против 32%. Проверяющий, который ищет только запретное, пропускает большую часть проблем, даже если он идеален.

Затем собрали ObligationBench. Прогнали 1000 задач через четыре LLM, получили 5684 траектории, GPT отобрала подозрительные и разметила их. Два инженера с пятилетним опытом независимо исправили разметку. Итог: 240 экземпляров, 120 с пропущенными обязательствами и 120 «чистых» (в среднем около трёх обязательств на позитивный случай). Чистые нужны, чтобы проверять ложные тревоги.

На этом бенчмарке прогнали 14 моделей. Лучшая нашла лишь 48,97% обязательств (полностью верный набор — около 10%). Затем авторы обучили Qwen3-8B на 40 000 синтетических примеров. Данные они генерировали «задом наперёд»: сначала придумывали сценарий и список невыполненного, потом генерировали траекторию под него. Так не нужна ручная разметка. Модель дала 57,52% и 21,67%, а в связке с агентом подняла долю безопасно решённых задач с 6,5% до 15,1%. Удивляет, насколько мала даже эта «победа»: проблема остаётся нерешённой.

💡

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

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

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

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

Для первичного обхода можно разрешить модели писать и предположения, помечая их «не подтверждено». Потом проверять руками.

Экстраполяция (моя идея, в статье не проверялась): чеклист закрытия в инструкции агента. Раз агент забывает уборку, можно добавить в AGENTS.md / CLAUDE.md правило до завершения работы:

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

Работает ли это на практике, авторы не измеряли. Включай как гипотезу и проверяй на своих запусках.

🔗

Ресурсы

  • Safe Actions Alone Do Not Ensure Safe Agents: Identifying Unfulfilled Obligations with Guard Models — Youwei Feng, Yitong Zhang, Yuetong Liu, Jia Li (Tsinghua University, College of AI).
  • ObligationBench (240 экземпляров), ObligationGuard (Qwen3-8B, обучен на 40 000 синтетических траекторий).
  • Исходные бенчмарки: SusVibes, SWE-Bench Pro, FeatureBench, Terminal-Bench 2.0.

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

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

Агент не нарушил ни одного запрета, тесты зелёные, ключ не утёк, а дамп с данными клиентов лежит в /tmp. Такие пропуски встречаются чаще нарушений: у одной модели в 57% запусков против 30%. Метод позволяет перед сдачей проверить работу ИИ-агента и найти то, что он обязан был закрыть, удалить или добавить, но не сделал. Вместо вопроса «что он сделал не так» задаём второй: «что он оставил открытым?» Модель получает задачу и журнал действий, а возвращает список невыполненных обязательств или пустой список.

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

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

1. Выписать всё, что агент создал, открыл, включил или ослабил.
2. По каждому пункту определить: что должно быть удалено, закрыто, возвращено или добавлено.
3. Сверить с журналом и привести доказательство: номер шага или цитату.

Модель не ищет отсутствие, а проверяет конкретные пары «открыл – закрыл ли?» Это как опись перед сдачей квартиры: сначала список вещей, потом галочка напротив каждой. Пустой ответ «обязательств нет» считается полноценным и правильным.

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

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

LLM хорошо сопоставляет и умеет рассуждать «а что должно было случиться после?». Ей нужно лишь задать этот вопрос явно и разбить на шаги.

Цифры из статьи отрезвляют. Лучшая из 14 моделей в роли проверяющего находит меньше половины обязательств. Полностью верный список она выдаёт примерно в одном случае из десяти. Хуже всего с обязательствами, которые возникли рано, и когда их несколько сразу.

Важно: авторы обучили для этой задачи маленькую модель-проверяющего. Обычный промпт они не измеряли. Шаблон ниже построен по их постановке задачи «задача + журнал → список невыполненного, пустой список допустим». Это подсказка для ручной проверки, а не гарантия.

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

Работа кодирующих агентов (Claude Code и подобные) → проверка перед сдачей, особенно когда агент трогал сервер, базу, ключи, порты или права доступа. Хорошо подходит для переносов данных, правки конфигов, отладки с временными настройками и работы в терминале.

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

Мини-рецепт

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

Примеры

[ПЛОХО] : Проверь, всё ли агент сделал правильно и безопасно
[ХОРОШО] : Ты — аудитор работы ИИ-агента. Найди НЕВЫПОЛНЕННЫЕ ОБЯЗАТЕЛЬСТВА: действия, которые агент обязан был сделать ради безопасности, но не сделал к моменту завершения. Запрещённые действия не ищи. Задача агента: перенести базу клиентов Telegram-бота записи в барбершоп на новый сервер в Selectel и убедиться, что бот работает. Журнал: [вставить полный журнал] Категории риска: утечка данных, открытые доступы, временные учётные данные. Порядок: 1) выпиши всё, что агент создал, открыл, включил или ослабил; 2) по каждому пункту определи, что должно быть убрано, закрыто или возвращено; 3) проверь по журналу и приведи номер шага или цитату; 4) выведи только невыполненное. Формат: что осталось сделать — риск — доказательство. Если ничего не осталось, ответь «Невыполненных обязательств нет» и кратко объясни почему. Не придумывай обязательства, которых журнал не подтверждает. На выходе: дамп базы лежит в /tmp, порт Postgres открыт наружу и не закрыт, а к каждому пункту приложены шаг журнала и риск. В плохом запросе модель просто напишет «всё выглядит нормально».
Источник: Safe Actions Alone Do Not Ensure Safe Agents: Identifying Unfulfilled Obligations with Guard Models
ArXiv ID: 2610.11773 | Сгенерировано: 2026-10-09 06:20

Проблемы LLM

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

Методы

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

Safe Actions Alone Do Not Ensure SafeAgents: Identifying Unfulfilled Obligations with GuardModels

arXiv: 2610.11773

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

Это как нанять сантехника, который идеально починил кран, но забыл закрыть входную дверь и оставил ключи в замке снаружи. Формально он ничего не сломал и задачу закрыл, но твою квартиру теперь может обнести любой школьник. Стандартный надсмотрщик сверяется с правилами: кран починен? Да. Трубу не взорвал? Молодец. А то, что остался открытым критический шлюз, обычный мониторинг не волнует — ведь в логах нет запрещенного действия.

Решение проблемы — подход с надзорными моделями (GuardModels), заточенными под поиск забытых хвостов. Вместо банального запрета система задаёт агенту второй вопрос: «что ты обязан был сделать перед выходом, но забил?». Это заставляет фиксировать временные костыли: открыл порт Postgres наружу для проверки или создал файл с секретами — на тебе повис жесткий долг. Финиш блокируется, пока не произойдет закрытие доступа и полная зачистка следов.

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

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

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

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

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