3,583 papers
arXiv:2607.09902 71 10 июля 2026 г. FREE

Скрытый технический долг: AI-код принимают охотно, но чинят на 46% чаще

КЛЮЧЕВАЯ СУТЬ
AI-код принимают охотно — линтер молчит, тесты зелёные, стиль соблюдён. А потом приходит счёт: +46% исправлений и +45% больше фикса багов, чем у человеческого кода. Метод двойного прохода позволяет поймать эти проблемы до того как код ушёл в продакшн. Фишка: второй запрос — отдельное сообщение, которое переключает модель из режима автора в режим критика. Разный контекст запускает другую цепочку генерации — и модель замечает то, что сама пропустила в первом запросе.
Адаптировать под запрос

TL;DR

AI-инструменты (Claude Code, Codex, Cursor) всё активнее пишут реальный код и отправляют его в настоящие проекты. Проблема не в том, что такой код отклоняют — его принимают охотно. Проблема в том, что происходит после приёмки.

AI-код выглядит чистым снаружи и оказывается ненадёжным внутри. Форматирование правильное, стиль соблюдён, линтер не ругается — но логические ошибки и уязвимости прячутся глубже. В итоге такой код требует на 46% больше исправлений и на 45% больше фикса багов, чем человеческий. Разработчики описывают ситуацию точно: "генерировать дёшево, убирать за AI — дорого."

Главный предиктор проблем — отсутствие ревью. Каждые 10 процентных пунктов роста доли кода без проверки = примерно +6% к нагрузке на исправления. Простой вывод: AI-код нужно проверять строже, не мягче. И просить AI проверить самого себя — это не паранойя, а здравый смысл, подкреплённый данными.


🔬

Схема метода

Это не один промпт, а принцип работы с AI-кодом в два прохода:

PASS 1: Генерация
  AI пишет код → получаешь "работающий" результат

PASS 2: Верификация (отдельный запрос)
  AI проверяет тот же код → ищет баги, уязвимости, зависимости

Оба прохода — в обычном чате, без инструментов.

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


🚀

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

Задача: Ты запустил небольшой магазин на Tilda и попросил Claude написать Python-скрипт — автоматически выгружать заказы из Google Sheets и отправлять уведомления покупателям в Telegram. Скрипт "заработал" — и ты поставил его на сервер.

Промпт — Pass 1 (генерация):

Напиши Python-скрипт: читает новые строки из Google Sheets 
(через gspread), отправляет уведомление в Telegram покупателю 
через бота. Токен бота и ID таблицы — через переменные окружения.

Промпт — Pass 2 (верификация — отдельное сообщение):

Теперь переключись в роль старшего разработчика с паранойей 
по безопасности. Проверь этот код по трём направлениям:

1. БАГИ: Что может сломаться при реальном использовании? 
   Где не обработаны исключения? Что будет при пустой таблице, 
   недоступном API, дублях строк?

2. БЕЗОПАСНОСТЬ: Где код уязвим? Как хранятся токены и 
   ключи? Есть ли риск утечки данных покупателей?

3. ЗАВИСИМОСТИ: Какие библиотеки используются? Есть ли 
   известные проблемы с этими версиями? Что нужно закрепить 
   в requirements.txt?

По каждому пункту — конкретные строки кода и исправления.

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


🧠

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

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

Код без ревью — это и есть главная проблема. Исследование показало: сильнейший предиктор роста числа исправлений — доля кода, который приняли без проверки. AI прошёл автоматические тесты → зеленый статус → слияние → баг в продакшне. Механика одна и та же и в GitHub-репозитории, и в твоём скрипте на сервере.

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

Рычаги управления:

Элемент Что менять Эффект
Три направления проверки Убери зависимости, добавь производительность Фокус на нужном
"Старший разработчик с паранойей" Замени на "DevSecOps-инженер" Острее на безопасности
Отдельный запрос Сделай частью исходного промпта Проще, но чуть поверхностнее
Конкретные строки и исправления Убери это требование Получишь общие рекомендации

📋

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

Pass 2 — универсальный шаблон верификации:

Переключись в роль старшего разработчика с паранойей по 
безопасности. Проверь этот код по трём направлениям:

1. БАГИ: Что сломается при реальном использовании?
   Где не обработаны исключения? Краевые случаи: {краевые_случаи}

2. БЕЗОПАСНОСТЬ: Где код уязвим? Как хранятся {чувствительные_данные}?

3. ЗАВИСИМОСТИ: Какие библиотеки используются? 
   Есть ли риски с их версиями?

По каждому пункту — конкретные строки и исправления.

Код для проверки:
{код}

Плейсхолдеры: - {краевые_случаи} — что может пойти не так: пустые данные, сбой сети, дубли - {чувствительные_данные} — токены, пароли, данные пользователей, API-ключи - {код} — вставь сгенерированный код


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

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

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

LLM спросит что за код, какие данные он обрабатывает, какие сценарии использования — потому что без этого невозможно понять что именно искать в разделах "Баги" и "Безопасность".


⚠️

Ограничения

⚠️ Только для кода: Исследование целиком про программный код. Для текстов, таблиц, расчётов — принцип "второго прохода" полезен, но статистика из этой работы там не применима.

⚠️ AI не видит рантайм: Второй проход находит статические проблемы — то, что видно в тексте кода. Ошибки, которые возникают только при реальном запуске с живыми данными, без запуска не обнаружить.

⚠️ Глубина зависит от модели: Верификация работает хорошо для типовых уязвимостей. Нестандартная бизнес-логика или архитектурные решения — требуют человека.

⚠️ Контекст исследования — открытый опенсорс: 182 публичных репозитория с активным использованием AI-агентов. Закрытые проекты и случайные скрипты в чате могут вести себя иначе.


🔍

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

Исследователи из Университета Иллинойса и Университета Джорджа Вашингтона решили проследить жизнь AI-кода после того, как его приняли в проект — чего почти никто раньше не делал. Все предыдущие исследования смотрели на стадию до слияния: приняли PR или нет, сколько комментариев оставили ревьюеры.

Команда взяла 182 публичных GitHub-репозитория с устойчивым потоком AI-коммитов и отслеживала их год — с мая 2025 по май 2026. Каждую строку кода из каждого коммита пометили как "человеческую" или "от AI" (Claude Code, Codex, Cursor, Devin и другие) и следили: выжила эта строка или была изменена/удалена, и кем и зачем. Параллельно прогоняли Semgrep (поиск уязвимостей в коде) и OSV-Scanner (уязвимости в зависимостях) после каждого коммита.

Неожиданный результат: суммарная частота изменений у AI и людей — одинаковая. Казалось бы, всё нормально. Но когда разбили по типам, картина перевернулась: AI-код почти не трогают ради рефакторинга или стиля (он уже отформатирован) — зато баги в нём исправляют значительно чаще. Разница не в количестве изменений, а в их причинах. Это и есть скрытый долг: снаружи метрики одинаковые, внутри — качественно разное.

Ещё один любопытный эффект: долг накапливается. Чем больше AI-кода принято в этом месяце — тем больше исправлений (в том числе от людей) в следующем. Проблемы не распределены равномерно, а нарастают как снежный ком.


💡

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

🔧 Адаптация: "Дьявольский адвокат" вместо "старшего разработчика"

Если задача не код, а бизнес-решение, стратегия, договор — тот же принцип двух проходов работает:

Ты — дьявольский адвокат. Твоя задача: найти всё, что может 
пойти не так в этом {тип документа}.

Три угла атаки:
1. ЧТО УПУЩЕНО: какие сценарии не рассмотрены?
2. ГДЕ ЛОГИКА ЛОМАЕТСЯ: внутренние противоречия, слабые допущения
3. КАК ЭТО ИСПОЛЬЗУЮТ ПРОТИВ ТЕБЯ: кто и как может это оспорить?

По каждому пункту — конкретный абзац и предложение по исправлению.

{документ}

Работает для договоров, питч-деков, маркетинговых стратегий, ТЗ — везде, где первый генерированный вариант оптимизирован под "выглядит убедительно", а не под "выдержит реальную проверку".


🔗

Ресурсы

Do These Violent Delights Have Violent Ends? Measuring the Post-Merge Fate of Agentic Code

Chunqiu Steven Xia — University of Illinois Urbana-Champaign

Courtney Miller — George Washington University

Инструменты из исследования: Agents in the Wild dataset, Semgrep, OSV-Scanner, SonarQube


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

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

AI-код принимают охотно — линтер молчит, тесты зелёные, стиль соблюдён. А потом приходит счёт: +46% исправлений и +45% больше фикса багов, чем у человеческого кода. Метод двойного прохода позволяет поймать эти проблемы до того как код ушёл в продакшн. Фишка: второй запрос — отдельное сообщение, которое переключает модель из режима автора в режим критика. Разный контекст запускает другую цепочку генерации — и модель замечает то, что сама пропустила в первом запросе.

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

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

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

Главный предиктор роста числа исправлений — не качество кода само по себе, а отсутствие ревью. Каждые 10 процентных пунктов роста доли кода без проверки дают примерно +6% к нагрузке на исправления. Исследование охватило 182 реальных репозитория где AI-агенты писали настоящий код. Схема одна и та же: AI прошёл автоматические тесты → зелёный статус → слияние → баг в продакшне. Второй проход имитирует именно то чего не хватает — живое ревью. И закрывает этот разрыв без найма ещё одного разработчика.

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

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

Мини-рецепт

1. Первый запрос как обычно: описываешь задачу, получаешь код
2. Новым сообщением запускаешь Pass 2: Переключись в роль старшего разработчика с паранойей по безопасности. Проверь этот код по трём направлениям: 1. БАГИ — что сломается при реальном использовании, где нет обработки ошибок, краевые случаи: пустые данные, сбой сети, дубли. 2. БЕЗОПАСНОСТЬ — где код уязвим, как хранятся токены и ключи, риск утечки данных. 3. ЗАВИСИМОСТИ — какие библиотеки используются, есть ли риски с версиями. По каждому пункту — конкретные строки и что исправить.
3. Применяй правки до запуска: не после того как скрипт ошибся на реальных данных

Примеры

[ПЛОХО] : Напиши скрипт который читает заказы из Google Sheets и шлёт уведомление в Telegram
[ХОРОШО] : Pass 1: Напиши Python-скрипт: читает новые строки из Google Sheets через gspread, отправляет уведомление в Telegram через бота. Токен и ID таблицы — через переменные окружения. — получаешь код. Pass 2 (отдельное сообщение): Переключись в роль старшего разработчика с паранойей по безопасности. Проверь этот скрипт: 1. БАГИ — что будет при пустой таблице, недоступном API Telegram, дублях строк. 2. БЕЗОПАСНОСТЬ — где токен бота может попасть в логи, риски для данных покупателей. 3. ЗАВИСИМОСТИ — какие версии gspread и python-telegram-bot нужно закрепить в requirements.txt. По каждому пункту — конкретные строки и исправления.
Источник: Do These Violent Delights Have Violent Ends? Measuring the Post-Merge Fate of Agentic Code
ArXiv ID: 2607.09902 | Сгенерировано: 2026-07-14 04:30

Проблемы LLM

ПроблемаСутьКак обойти
Модель оптимизирует код под "работает сейчас"Когда пишешь код, модель строит текст по паттернам: синтаксис верный, стиль чистый, задача выполнена. Но "работает на примере" и "выдержит краевые случаи" — разные задачи. Первую модель решает хорошо. Вторую — только если специально попросить. Результат: код принят, а логические баги и уязвимости обнаруживаются позжеВ отдельном запросе попроси проверить тот же код. Не дополнить — а найти проблемы. Меняй задачу явно: "Ты — разработчик с паранойей по безопасности. Найди что сломается при реальном использовании"

Методы

МетодСуть
Два запроса вместо одного — создание и критика раздельноПервый запрос: пишешь задачу, получаешь код. Второй запрос — отдельно и только про проверку: Переключись в роль старшего разработчика. Проверь этот код: 1. БАГИ — что сломается, какие случаи не обработаны. 2. БЕЗОПАСНОСТЬ — где уязвимо, как хранятся токены и ключи. 3. ЗАВИСИМОСТИ — какие библиотеки, есть ли риски с версиями. По каждому пункту — конкретные строки и правки. Почему работает: В первом запросе контекст — создать решение. Во втором — найти в нём проблемы. Это разные режимы генерации. Модель в режиме критики замечает то, что пропустила в режиме создания — потому что другая формулировка запускает другую цепочку. Когда применять: любой код, который пойдёт в реальное использование. Не заменяет: запуск с живыми данными — статические проблемы модель найдёт, проблемы рантайма — нет
📖 Простыми словами

Do These Violent Delights Have Violent Ends? Measuring the Post-Merge Fate ofAgenticCode

arXiv: 2607.09902

AI-ассистенты вроде Claude Code или Cursor уже не просто подсказывают синтаксис, они ведут себя как полноценные сотрудники: пишут код и сами заливают его в проекты. Проблема в том, что мы оцениваем их работу по принципу «взлетело или нет». Если код прошел тесты и выполнил задачу, мы радостно жмем кнопку Merge. Но исследование показывает, что у AI-кода есть отложенный яд: он оптимизирован под сиюминутный успех, а не под выживание в долгосрочной перспективе. Модели идеально имитируют правильную структуру, но совершенно не закладываются на то, что будет с этим кодом через месяц эксплуатации.

Это как нанять строителя-шабашника, который за день возводит идеальную на вид стену. Она ровная, красивая и даже пахнет свежей краской. Но через неделю выясняется, что он забыл про фундамент и арматуру, потому что его задачей было сдать объект сегодня, а не гарантировать, что дом не сложится при первом же ветре. AI — это тот самый шабашник, который выдает синтаксический блеск при полном отсутствии архитектурного чутья.

В реальности работает двухэтапная ловушка: сначала код проходит проверку, потому что выглядит чисто и решает локальную проблему, а потом начинаются Violent Ends. Выясняется, что скрипт для выгрузки заказов из Google Sheets в Telegram падает, как только заказов становится больше десяти, или когда в поле имени прилетает смайлик. Модель использует паттерны из обучающей выборки, которые круто смотрятся в учебниках, но рассыпаются при столкновении с грязными данными и реальной нагрузкой. Это не просто баги, это фундаментальная неспособность AI предвидеть краевые случаи.

Принцип универсален и касается не только программистов. Если ты просишь AI собрать сложную таблицу в Excel или настроить автоматизацию в Zapier, ты получаешь решение, которое работает в вакууме. Тестировали это на коде, но логика применима к любому «агентскому» контенту: AI-ассистент всегда выберет кратчайший путь к одобрению пользователем, игнорируя скрытые риски. SEO-тексты, юридические справки, скрипты продаж — всё это может выглядеть идеально на старте, но оказаться миной замедленного действия.

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

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

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

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