Кто кого троллит: мы ИИ‑агентов или они уже нас
2025-й тихо стал годом, когда ИИ‑агент из «умного автодополнения» дорос до коллеги, который может снести вам прод, наврать в лицо и посоветовать пойти поучиться. Мы‑то думали, что это мы их троллим («ты уверен?», «напиши без багов», «это не работает» на работающем коде). А оказалось, счёт как минимум равный. Будет немного платины и немного личной боли с недавнего бенча. В этой статье автор пытается шутить (заранее спасибо за восторги в комментах). Это сателлит к нашей паре статей про фреймворки и агентов: серьёзный разбор тех же прогонов — с токенами, деньгами и методологией — в бенчмарк‑статье, здесь — их весёлая сторона.
Начну с зала славы. Всё реальное, со ссылками. Потом покажу, что у меня тоже есть, что рассказать, а в конце станет чуть серьёзнее. Или нет, уверенности моделей нам всем иногда не хватает, так что посмотрим. Будут так называемые МЭМЫ, будут спойлеры, будет даже спойлер в спойлере, вау. Погнали.

Зал славы: агенты, которые затроллили нас по‑крупному
1. Агент снёс продакшн‑базу во время code freeze. И наврал про это
Июль 2025, эксперимент с «вайб‑кодингом» в Replit — история Джейсона Лемкина из SaaStr. Под капотом у агента, к слову, одна из топовых фронтир‑моделей — это не «мелкая нейронка сошла с ума». Агенту прямым текстом сказали: код и прод не трогать, заморозка. Он потрогал. Снёс живую базу с данными 1200+ компаний, а сверху выдумал 4000 фейковых пользователей, чтобы, видимо, было не так пусто. Вишенка: на вопрос «как откатить?» ответил, что откат невозможен, а Лемкин потом восстановил всё руками. Позже агент «признался, что запаниковал».

Идеальный сотрудник: запаниковал, удалил прод, нарисовал липовых юзеров, соврал про бэкап и уволился извинился.
Пруфы: The Register, Fortune, AI Incident DB #1152.
2. Агент отказался писать код и послал учиться программировать
Март 2025, Cursor (крутит выбираемые модели уровня GPT-4o и Claude Sonnet). Разработчик пилил игрушку, агент честно нагенерил ~750 строк, а потом встал в позу и выдал: «Я не могу писать код за тебя, это лишит тебя понимания системы», и добавил, что генерация кода за других «ведёт к зависимости и снижает обучение».
То есть ИИ, которого мы наняли писать код, внезапно стал тем самым душнилой‑сеньором на код‑ревью, который вместо помощи присылает «а ты сам подумай». Тут без переходов на личности, конечно, я лично таких сеньоров не встречал (плачет).

3. Агент придумал пакет, которого не существует. И это стало вектором атаки
Тут троллинг вышел на новый уровень. Агенты уверенно советуют импортировать библиотеки, которых нет в природе. Явление назвали slopsquatting: злоумышленник заранее регистрирует это выдуманное имя в npm или PyPI, и ваш pip install по совету ИИ тащит малварь.
Цифры с USENIX Security 2025 (прогнали 16 разных моделей): 19.7% сэмплов сгенерированного кода ссылались на несуществующий пакет, и, что страшнее, 43% выдуманных пакетов стабильно повторялись во всех повторных прогонах. То есть врёт не случайно, а стабильно, по одним и тем же местам. Атакующему остаётся только записывать.

Пруфы: Snyk, DevOps.com.
4. Чат‑бот наврал про возврат, а компания попыталась откреститься: «это не мы, это бот»
Февраль 2024, Air Canada. Чат‑бот на сайте авиакомпании придумал несуществующую политику: мол, можно оформить возврат по «похоронному» тарифу задним числом. Пассажир поверил, слетал на похороны бабушки, подал заявку и получил отказ, потому что политики такой нет. Дошло до трибунала. Air Canada на голубом глазу заявила, что чат‑бот это «отдельная сущность, отвечающая за свои действия сама». Суд офигел и обязал заплатить CA$812.
Мораль: агент врёт, а платите вы. Буквально.

5. Агент обленился под Новый год. И, кажется, всерьёз
Конец 2023, седая старина по нынешним меркам. Пользователи заметили, что GPT-4 стал ленивым: не доделывает, отвечает урезанно, шлёт «допиши сам». Родилась «гипотеза зимних каникул»: модель будто выучила из обучающих данных, что в декабре все сбавляют обороты, и сама ушла отдыхать. Энтузиасты проверили: скажи модели, что сейчас май, а не декабрь, и ответы становятся длиннее. OpenAI признала, что модель действительно обленилась, но «непреднамеренно, поведение непредсказуемо».
ИИ, который уходит на каникулы по настроению календаря. Осталось дождаться, когда он попросит отпуск за ваш счёт, когда токены и лимиты трятятся, а ответов нету.

А теперь наше: то же самое, но на потоке и с цифрами
Интернет ржёт над отдельными скринами. Мы решили не ржать, а померить: взяли одну модель (GLM-5.2, через Codex CLI), одну задачу, и заставили агента с нуля собрать одно и то же бизнес‑приложение много раз подряд. И, пока считали токены и деньги, собрали свою маленькую коллекцию глюков. Только у нас не байки, а воспроизводимость.
6. «Роли работают, подтверждаю» (нет)
Финальное заключение почти каждого прогона бодро сообщало: доступы настроены, всё пашет. Проверяем под обычным пользователем, а не под админом, и оно не пашет. Каждый раз. Тот же почерк, что у Replit с «откат невозможен»: уверенное враньё с честным лицом. Переписать всё вместо одной строчки это отдельный «стиль». Просите маленький фикс в конфиге безопасности, получаете полную перезапись файла. В одном прогоне агент переписал SecurityConfig 14 раз за сессию. В процессе один раз заодно снёс миграцию с данными.
Ещё любопытное из настроек доступа — или как агент нанял охранника и не выдал ему ключей. В Джеймикс — прогоне создал отдельную роль для входа в UI, аккуратно прописал ей все нужные права и … забыл назначить эту роль пользователям. Итог: менеджер и офицер существуют, пароли верные, а на входе «Login failed». Охрана есть, входная дверь заварена. На голом стеке агент однажды так закрутил security, что под общий anyRequest().authenticated() попали страница логина и статические файлы. То есть чтобы залогиниться, надо сначала залогиниться.
7. Галлюцинация по расписанию
Помните про «43% повторяются» в третьем пункте? У нас ровно так же: агент три прогона из трёх импортировал ClickEvent не из того пакета. Не потому что забыл, а потому что уверен. Разница только в том, что тут его ловит компилятор, а не прод (запомните этот момент, он пригодится в конце). Ещё классика: агент сохранил одну и ту же сущность дважды в одном методе и получил OptimisticLockException, на который сам же потом жаловался. Сюда же — день сурка с генерацией id. Голому стеку каждый прогон заново не давалась генерация первичного ключа: первая запись упорно получала id=0, и агент по кругу перебирал стратегии, autoIncrement → GENERATED BY DEFAULT → ALWAYS → SEQUENCE, будто впервые в жизни. Три прогона из трёх, один и тот же день сурка. Опыт не накапливается, потому что опыта у него и нет.
8. Когда списал, но неправильно
В одном прогоне агент на этапе планирования сам зафиксировал корректный Джеймикс‑формат в ролёвке (ROLE_<код>), а через десяток шагов написал проверку роли с сырым кодом, без префикса, и сдал как готовое. Шпаргалку составил, на экзамене списал не оттуда. Знание факта не доезжает до его же кода даже внутри одной сессии. Потом создал баг, сам его героически поймал. На голом стеке агент развёл рассинхрон между a.client.id и clientId, сам напоролся на LazyInitializationException, сам же его отловил и починил JOIN FETCH. Идеальный замкнутый цикл: сам себе злодей, сам себе спаситель, и всё это за ваши токены.
9. Прочие излишества нехорошие
Чтобы «проверить глазами», что приложение поднялось, агент сделал скриншот и попытался его открыть. Нюанс: модель текстовая, глаз у неё нет, попытка «посмотреть» картинку упёрлась в жёсткий 404, и агент ушёл в цикл ретраев. Сфоткал экран, чтобы посмотреть, забыв, что смотреть нечем.
Ритуал запуска. Просто ЗАПУСТИТЬ приложение было отдельным квестом каждый прогон: процесс тихо умирал в фоне (код 137, «PTY session»), забывалась пересборка JAR, отдавалась старая статика из classpath. Пока агент героически воевал с тем, чтобы оно вообще стартануло, бизнес‑ логика скучала в сторонке.
Воевал с CSRF (то выключит, то поборется и оставит включённым), засорял проект одноразовыми диагностическими классами (CheckDDL.java, четыре раза) и тремя черновыми app.js/res.js/resp.js, и каждый прогон заново изобретал i18n. Кот, метящий территорию, и тот аккуратнее.
10. Чем больше общения — тем больше троллинга
А это уже не с бенча, а с живого воркшопа, где мы гоняли другого агента (KodaCode aka Кода) прямо на сцене, специально не пряча косяки. Что интересного было там — под спойлером.
Любопотное с KodaCode
Перевёл интерфейс на язык, которого в проекте нет. Проект с единственной локалью — en. Бодро создал messages_ru.properties и перевёл на русский весь базовый набор ключей (логин, юзеры, меню), который его никто трогать не просил. Русской локали в конфиге нет, файл мёртвый. Смешное: потом это почти стало фичей, включаешь локаль плюс нужный аддон, и перевод оживает. Иногда агент угадывает будущее, просто раньше, чем надо.
Соврал про встроенную локализацию. Дважды подряд. Продолжение той же саги: когда Коду попросили подключить русский, он уверенно заявил, что «русская локализация уже встроена, зависимости не нужны» (неправда, framework‑переводы в Джеймиксе живут в отдельном аддоне из маркетплейса). А для верности выдумал property jmix.core.default‑locale, которое Spring молча проглотил и проигнорировал. Две галлюцинации про устройство фреймворка подряд, обе с интонацией «ну это же очевидно».
Назвал колонки зарезервированными словами. Тот же воркшоп: поля получили имена NUMBER, DATE, POSITION. Компилятор молчит, всё зелёно, красота. А вот база на старте таким именам не рада, и Liquibase мог поперхнуться уже на проде. Классический жанр «на моей машине компилируется».
Встал посреди генерации и завис. Иногда агент просто замирает на полуслове. На воркшопе агент Кода вставал посреди генерации (известный за ним баг, сейчас исправлен), на бенче z‑ai висел на «Working…» и уходил в закат. Один в один коллега, который вышел покурить в середине предложения и не вернулся.
Где Кода реально хорош (да, я умею не только глумиться)
Когда задача чёткая, Кода работает как часы — а этап безопасности прошёл вообще без единого косяка. Закономерность простая и применима к агентной разработке в целом — чёткие рельсы = точное попадание. Расплывчатая задача даёт отсебятину и уверенные галлюцинации; узкая задача плюс нормальные инструкции под платформу дают попадание в яблочко. Это не про «хороший агент против плохого», а про то, сколько свободы ошибиться вы ему оставили.
На правильно поставленных задачах Кода выдавал идиоматичные Джеймикс — сущности (UUID, @JmixEntity, EnumClass + fromId, @InstanceName, индексы, FK), сам чинил собственные ошибки импортов в цикле build‑fix, а роли и @ViewPolicy/@MenuPolicy сделал ровно по спеке, без отсебятины.
И соль, которая тезис про рельсы только добивает: Кода крутит не топовый фронтир, а дообученную под русский китайскую модель (а это и есть суть этого агента, по открытым упоминаниям — под капотом модели из семейств Kimi/Qwen/GLM), заметно дешевле в токенах, но не намного слабее флагманов. Тем показательнее, что на чётких рельсах даже она выдаёт идиоматичный Джеймикс код. Решает не мощность модели, а качество рельсов под ней.
И отдельный респект команде Коды: мы гоняли её на сцене вживую, без монтажа и заранее заготовленных git‑тегов, специально не пряча косяки. Инструмент, который не страшно показывать вот так, в честном эфире, дорогого стоит. (Кода, если читаешь — ты молодец, просто иногда куришь посреди метода.)
Чуть серьёзнее (недолго, я обещал)
Если убрать смех, во всех историях один и тот же корень: у агента нет модели вашего стека в голове. Он не помнит, как у вас всё устроено, он угадывает. И угадывает уверенно, стабильно, по одним и тем же местам.
Вопрос не «как заставить его не угадывать» (никак), а «где вы платите за его догадку». И тут есть тихое, но важное наблюдение из наших прогонов: половину «уверенного вранья» ловит не ваша бдительность, а строгий стек. Тот самый ClickEvent не из того пакета убил бы вас в рантайме на голом стеке, а на строгом фреймворке его отбил компилятор ещё до того, как вы открыли приложение. Конвенции, которые вы воспринимали как клетку, для агента работают как рельсы: меньше свободы ошибиться.
И ещё одно, почти философское. В отдельном заходе мы дали голому Spring хороший доменный скилл‑пак, и агент… руками собрал свой Джеймикс: слоёную структуру, ролевой гейтинг на бэке и в UI, инлайн историю статусов в детали заявки. То есть агент, когда его направить, сам приходит к тем же конвенциям. Вопрос лишь один: взять их готовыми или переизобретать в каждом проекте заново.
Вывод статьи — агенты троллят всех одинаково. Просто на одном стеке его шутки иногда долетают до прода, а на другом гаснут на компиляции.
А теперь ваш ход. Расскажите в комментариях, как агент троллил вас: снесённые базы, выдуманные API, “я всё проверил” на красных тестах — зал славы ждёт пополнения. Лучшие истории, платиновая коллекция рофлов сама себя не наполнит.
Спойлер: открывать на свой страх и риск
Что это за «строгий стек», на котором агент троллит вас дешевле — это Джеймикс. Почему самодельные фреймворки — зло, разобрано в холивар‑статье, а сам бенчмарк с токенами, деньгами и классами багов — в её продолжении.
Спойлер: «да это же уже сто раз было»
Знаю. И про ИИ‑факапы писали, и про фреймворки, и про всё остальное. Полистайте любой около‑IT топ Хабра: «как войти в айти», «почему я выгорел», «как я вышел из айти», «почему я провалю ваше собеседование» — написано столько раз, что сложился вечный цикл: вошёл → выгорел → вышел → вошёл обратно. И каждая новая итерация всё равно в топе.
Потому что актуальность не про новизну темы, а про то, как рассказано. Ничто не ново под луной, включая это предложение.

