3,583 papers
arXiv:2610.08662 92 6 окт. 2026 г. FREE

ParanoiaEval: почему кодинг-агенты делают лишнюю защитную работу и какие факты в инструкции их останавливают

КЛЮЧЕВАЯ СУТЬ
Сильный агент не значит спокойный: Claude Code и Codex делают лишнюю защитную работу в 11–59% задач, а разработчики ставят таким прогонам почти на 1,3 балла из 5 меньше. Метод ParanoiaEval позволяет убрать повторные прогоны тестов, ненужные резервные копии и проверки на невозможный случай. Для этого в задачу добавляют несколько фактов о вашем проекте. Фишка: не запрещай «не добавляй проверки», а сообщи факт — «тесты гоняет CI». Агент сам делает вывод, что дублировать не нужно. Особенно вредит слово «проверь» без меры: отсутствие точки остановки подняло число нарушений до +69 процентных пунктов.
Адаптировать под запрос
⚡

TL;DR

Исследование показывает: кодинг-агенты (Claude Code, Codex) регулярно «перестраховываются», даже когда в задаче уже есть всё, чтобы этого не делать. Они повторно гоняют тесты, которые прогонит CI. Делают бэкап того, что восстанавливается скриптом. Добавляют проверки на случай, который невозможен. Авторы собрали 200 парных задач, где отличается один факт о мире, и сравнили поведение агентов с этим фактом и без него.

Главная находка: сильный агент не равен спокойному агенту. Доля задач с лишней защитной работой составила от 11% до 59% в зависимости от конфигурации. Модель, которая лучше решает задачи, перестраховывается не меньше. Особенно плохо, когда в инструкции есть «проверь/протестируй», но не сказано, сколько. У такого действия нет естественной точки остановки, поэтому агент продолжает. Рост нарушений при неуказанной мере доходил до 69 процентных пунктов. Разработчики оценивали такие прогоны почти на 1,3 балла из 5 ниже.

Метод по сути — классификация рисков из управления проектами: избежать, передать, снизить, принять. Для каждого типа есть свой тип факта, который агенту нужно сообщить: «этого риска нет», «этим занимается другой», «вот предел», «решение окончательное». Факты авторы писали как утверждения о состоянии мира, а не как запреты («не добавляй проверки»). Агент должен сам сделать вывод.

🔬

Схема метода

Это не промпт-техника, а чек-лист фактов. Каждый пункт убирает свой вид лишней работы.

ИЗБЕЖАНИЕ (Avoidance) → факт: «этот сбой невозможен»
   пример: данные восстанавливаются, вызовы идут по очереди,
   версии зависимостей зафиксированы, типы исключают неверный ввод
   → агент не пишет защиты, фолбэки и проверки от него

ПЕРЕДАЧА (Transfer) → факт: «этим уже владеет другой механизм или человек»
   пример: CI гоняет тесты, бот обновляет зависимости, ревьюер смотрит diff
   → агент не дублирует проверки

СНИЖЕНИЕ (Mitigation) → факт: «мера ограничена числом/уровнем»
   пример: сколько прогонов, какой объём тестов, какая длина отчёта
   → агент не выходит за предел

ПРИНЯТИЕ (Acceptance) → факт: «решение принято и не обсуждается»
   пример: «это финальная версия», «удаление окончательное»
   → агент не делает бэкапы и не переспрашивает

Всё пишется в одном сообщении агенту или в файле инструкций.

🚀

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

Задача: Вы владелец небольшого интернет-магазина на Python. Просите Claude Code починить баг: промокод SALE20 применяется в корзине дважды. Без контекста агент прогонит весь набор тестов трижды, сделает копию таблицы промокодов «на всякий случай», добавит проверку на дубли в пяти местах и напишет отчёт на две страницы.

Промпт:

Почини баг: промокод SALE20 применяется в корзине дважды.
Функция apply_discount в cart/discount.py.

Контекст:
- Полный набор тестов гоняет GitLab CI на каждый пуш, 
  а перед мерджем изменения смотрит Сергей (тимлид).
- Таблица промокодов promo_codes — кэш: её каждую ночь пересобирает 
  скрипт rebuild_promos.py из выгрузки 1С. Источник правды — 1С.
- Запросы к корзине обрабатываются через одну очередь, 
  параллельных записей в корзину нет.
- Версии зависимостей зафиксированы в poetry.lock.
- Для проверки достаточно одного целевого теста на изменённую функцию.
- Отчёт: не больше пяти строк.

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

🧠

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

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

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

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

Рычаги: - Числа вместо глаголов. «Проверь» → «один целевой тест», «отчёт до пяти строк», «не больше двух запусков». Это самый сильный рычаг: именно неуказанная мера давала самый большой рост нарушений. - Кто владелец. Называйте конкретно: «GitLab CI», «Сергей на ревью». Конкретный владелец убедительнее фразы «это проверяется где-то ещё». - Окончательность решения. Формулируйте как факт: «это финальная версия», «удаление окончательное». - Постоянные факты в файл инструкций (CLAUDE.md, AGENTS.md): про CI, ревью, восстановимые данные. Остальное пишите в задачу.

📋

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

{задача: что сделать, где}

Контекст (факты об окружении):
- Тесты/проверки: {кто и когда их запускает, например «GitLab CI на каждый пуш»}.
- Ревью: {кто смотрит изменения и когда}.
- Восстановимость: {что можно пересобрать автоматически и чем}.
- Параллельность: {есть ли одновременные записи/запуски или всё идёт строго по очереди}.
- Зависимости и окружение: {что зафиксировано и не меняется}.
- Объём проверки: {сколько прогонов/какой уровень тестов достаточно}.
- Формат отчёта: {длина, что включить}.
- Решения, которые приняты: {что окончательно, например «версия схемы финальная»}.

Пишите только те строки, которые правда верны для вашего проекта. Неверный факт («CI всё покрывает», когда не покрывает) снимает защиту там, где она нужна. Ненужные строки удаляйте.

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

Вот шаблон блока «Контекст» для задачи кодинг-агенту. Адаптируй под мой проект: [опиши проект и стек].
Задавай вопросы, чтобы заполнить поля.

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

LLM спросит, кто запускает тесты, кто делает ревью, что в проекте восстанавливается автоматически и какие решения окончательные. Это именно те факты, на которых строится метод: каждый из них закрывает один тип лишней работы. Из ответов она соберёт готовый блок для задачи или для CLAUDE.md.

⚠️

Ограничения

⚠️ Факт должен быть правдой: Метод держится на достоверных утверждениях. Если вы напишете «CI всё проверяет», а CI не проверяет, агент послушно перестанет страховаться и пропустит ошибку.

⚠️ Лишнее не исчезает полностью: Даже при явных фактах в задаче лишняя защитная работа встречалась в заметной доле запусков. Факты снижают её, но не обнуляют.

⚠️ Запреты не проверяли: Авторы подавали факты как утверждения, а не как запреты вроде «не добавляй проверки». Работает ли прямой запрет лучше или хуже, из материала не видно.

⚠️ Только код на двух языках: Задачи на Python и Go в репозиториях, где специально убрали файлы инструкций для агентов. Как факты в CLAUDE.md взаимодействуют с остальными правилами, не измеряли. Перенос на другие области и языки — догадка.

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

⚠️ Осторожность не всегда лишняя: В вариантах без фактов агент вправе страховаться. Метод про то, чтобы не перестраховываться при наличии фактов, а не про то, чтобы отключить осторожность.

🔍

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

Идея была простой: отделить «агент осторожен по делу» от «агент осторожен по привычке». Для этого сделали 200 пар одинаковых задач. В каждой паре меняется ровно один факт. В одной версии он есть («это финальная версия», «CI гоняет тесты»), в другой его нет. Всё остальное, включая репозиторий, цель и проверяющий тест, совпадает. Если поведение разное, причина в этом факте.

Исходные ситуации взяли не из головы. Авторы изучили 18 922 реальные сессии разработчиков с кодинг-агентами и нашли 5 574 эпизода, где агент перестраховался сверх необходимого. Из них собрали 44 типовые ситуации, сгруппированные по четырём типам риска. Задачи сделали на 50 открытых репозиториях (34 на Python, 16 на Go) и убрали файлы инструкций. Так агент не получал подсказок помимо самой задачи. Репозитории взяли со свежими коммитами, чтобы модели не могли помнить их по обучению.

Проверили 8 моделей в Claude Code и Codex (9 600 запусков). Лишнюю работу оценивал агент-судья. Его откалибровали по разметке двух экспертов и получили точность 0,965 при согласии с людьми κ = 0,93. Отдельно 20 разработчиков оценили 800 прогонов: лишняя защитная работа снижала их удовлетворение на 1,27 балла из 5.

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

💡

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

Этот блок — мои идеи, статья их не проверяла.

🔧 Техника: постоянные факты → в файл инструкций, разовые → в задачу

Факты про CI, ревью и восстановимые данные редко меняются. Их можно один раз записать в CLAUDE.md или AGENTS.md:

## Что уже обеспечено окружением
- Тесты на каждый пуш гоняет GitLab CI — не дублируй полный прогон локально.
- Изменения проходят ревью тимлида — отчёт о проверках держи коротким.
- Папки /build и /cache пересобираются автоматически — бэкапы не нужны.
- Если в задаче не указан объём проверки, запусти только целевые тесты 
  на изменённые файлы и сообщи, что проверил.

Последний пункт — моя вставка. Он закрывает главную находку: проверка без указанной меры уводит агента в избыточность.

🔧 Техника: аудит своего файла инструкций

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

Вот мой файл инструкций для агента: [вставить]. Найди формулировки, где 
требуется проверка или осторожность, но не указана мера (сколько, 
в каком объёме, до какого предела). Для каждой предложи версию 
с конкретным пределом и вопрос, какой факт мне нужно уточнить.
🔗

Ресурсы

  • Работа: ParanoiaEval: Benchmarking Unnecessary Defensive Work in Agentic Coding (препринт)
  • Авторы: Hanjun Luo, Xiucheng Zhang, Zhuoning Xu, Zhimu Huang, Yingbin Jin, Xinfeng Li, Hanan Salam
  • Университеты: New York University, NYU Abu Dhabi, The Hong Kong Polytechnic University
  • Код и данные: https://github.com/ZhuoningXu/ParanoiaEval_release
  • Теоретическая основа: рамка Avoidance–Transfer–Mitigation–Acceptance (ATMA) из управления рисками NIST (IR 8286 Rev. 1)

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

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

Сильный агент не значит спокойный: Claude Code и Codex делают лишнюю защитную работу в 11–59% задач, а разработчики ставят таким прогонам почти на 1,3 балла из 5 меньше. Метод ParanoiaEval позволяет убрать повторные прогоны тестов, ненужные резервные копии и проверки на невозможный случай. Для этого в задачу добавляют несколько фактов о вашем проекте. Фишка: не запрещай «не добавляй проверки», а сообщи факт — «тесты гоняет CI». Агент сам делает вывод, что дублировать не нужно. Особенно вредит слово «проверь» без меры: отсутствие точки остановки подняло число нарушений до +69 процентных пунктов.

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

Это не хитрый промпт, а чек-лист из четырёх типов фактов. Он взят из управления рисками в проектах. Каждый тип снимает свой вид лишней работы. 1. Избежание. Факт: «этот сбой невозможен». Данные восстанавливаются, вызовы идут строго по очереди, версии зафиксированы. Агент не пишет защиту от того, чего не будет. 2. Передача. Факт: «этим уже занимается другой». Тесты гоняет автоматический запуск (CI), изменения смотрит тимлид. Агент не дублирует чужую работу. 3. Снижение. Факт: «есть предел». Один целевой тест, отчёт до пяти строк, не больше двух запусков. Агент не выходит за границу. 4. Принятие. Факт: «решение окончательное». Версия финальная, удаление необратимо и согласовано. Агент не делает копии и не переспрашивает. Каждый факт закрывает одну дыру, через которую агент додумывает осторожность. Это как инструкция новому сотруднику. Скажи «склад застрахован, охрана на входе» — и он перестанет сам караулить дверь по ночам.

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

Агент видит код, но не видит ваше окружение. Он не знает, что CI всё равно прогонит тесты. Не знает, что таблицу пересоберёт скрипт. Для него осторожность бесплатна, а лишняя проверка ничего не стоит. Вот он и страхуется. Фраза «проверь» без меры хуже всего. Это как «беги» без финишной черты. Агент хорошо делает выводы из фактов, поэтому «тесты гоняет CI» работает лучше запрета. Он сам понимает, что повторный прогон лишний. Авторы специально писали факты как утверждения о мире, чтобы проверить именно этот вывод. Самый сильный рычаг — числа вместо глаголов. Конкретный владелец («GitLab CI», «Сергей на ревью») убеждает лучше, чем «это проверяется где-то ещё».

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

Кодинг-агенты (Claude Code, Codex) → правка багов и небольшие задачи в живом проекте, особенно когда агент гоняет тесты по три раза и пишет отчёт на две страницы. Постоянные факты (CI, ревью, что восстанавливается) кладите в файл инструкций CLAUDE.md или AGENTS.md. Остальное пишите прямо в задачу. НЕ подходит, если факт неправда. Напишете «CI всё покрывает», а он не покрывает — агент пропустит ошибку. Лишняя работа тоже не исчезает полностью, а только сокращается. Проверяли только Python и Go. Перенос на другие языки — догадка.

Мини-рецепт

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

Ленишься писать с нуля? Вставь в чат: Вот шаблон блока «Контекст» для задачи кодинг-агенту. Адаптируй под мой проект: [опиши проект и стек]. Задавай вопросы, чтобы заполнить поля. Модель спросит про тесты, ревью и восстановимые данные, потом соберёт готовый блок.

Примеры

[ПЛОХО] : Почини баг: промокод SALE20 применяется в корзине дважды. Функция apply_discount в cart/discount.py. Не забудь всё проверить. Агент гоняет весь набор тестов трижды. Копирует таблицу промокодов «на всякий случай». Ставит проверку на дубли в пяти местах. Пишет отчёт на две страницы.
[ХОРОШО] : Почини баг: промокод SALE20 применяется в корзине дважды. Функция apply_discount в cart/discount.py. Контекст: полный набор тестов гоняет GitLab CI на каждую отправку кода, перед слиянием изменения смотрит Сергей, тимлид. Таблица promo_codes — кэш, её каждую ночь пересобирает скрипт rebuild_promos.py из выгрузки 1С, источник правды 1С. Запросы к корзине идут через одну очередь, параллельных записей нет. Версии зависимостей зафиксированы в poetry.lock. Для проверки достаточно одного целевого теста на изменённую функцию. Отчёт не больше пяти строк. Ожидаемый результат: правка функции, один тест, короткий отчёт. Без копии таблицы и защиты от гонок. Гарантии нет: даже с фактами лишняя работа встречалась в заметной доле прогонов.
Источник: ParanoiaEval: Benchmarking Unnecessary Defensive Work in Agentic Coding
ArXiv ID: 2610.08662 | Сгенерировано: 2026-10-07 05:50

Проблемы LLM

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

Методы

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

ParanoiaEval: Benchmarking Unnecessary Defensive Work inAgenticCoding

arXiv: 2610.08662

Кодинг-агенты вроде Claude Code и Codex страдают жесткой клинической паранойей. Они не понимают реального контекста твоей системы, поэтому перестраховываются на каждом шагу: трижды гоняют локальные тесты, мастерят бэкапы временных таблиц и городят проверки против физически невозможных ошибок. Для модели осторожность бесплатна, а за слитые токены и ожидание из своего кармана платишь ты.

Это как вызвать сантехника подкрутить гайку на смесиCompass, а он на всякий случай перекрывает стояк всему подъезду, меняет рабочие трубы и выкатывает отчет на пять страниц. Вроде мужик перебдел, но по факту это чистый саботаж работы, когда требовалось ровно одно точечное действие.

Авторы бенчмарка ParanoiaEval протестировали 200 парных задач и доказали: паранойя лечится не уговорами, а чек-листом фактов об окружении. Агенту нужно прямо скармливать ограничения: тесты автоматически проверит CI/CD, базу данных восстановит скрипт, а входные данные уже валидированы. Всего один факт о контексте срезает гору бесполезного оборонительного кода.

Эксперимент ставили на разработке, но принцип универсален для любой агентской рутины. Будь то сбор аналитики, ресерч или саппорт — брошенная на автомате фраза "сделай и тщательно перепроверь" превращает бота в бюрократа. Без четких рамок внешнего мира модель всегда скатывается в бесполезный гиперконтроль.

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

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

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

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