Как я удалил базу данных с помощью AI-агента (и почему это было неизбежно)

 Публичный пост
20 марта 2026  853

Я снёс QA-базу данных AI-агентом. Не потому что что-то сломалось — а потому что всё работало. Тесты прошли. CI зелёный. Ревью апрувнуто. А потом QA пустое.

Что произошло

Я дебажил CI-пайплайн. Миграции не поднимались, тесты падали. Где-то в N-ном коммите насмерть упавшего CI, Cursor-агент предложил решение: добавить db:drop в таргет db-prepare Makefile'а.

# Было
db-prepare:
    bundle exec rails db:create db:migrate

# Стало
db-prepare:
    @echo "=== Starting db-prepare ==="
    bundle exec rails db:drop db:create db:migrate --trace

Это деструктивная команда. Она удаляет всю базу. В Make-таргете, который также запускается при деплое. В этот момент система уже была обречена — но по приборам всё было чисто.

Я посмотрел diff. Апрувнул.

Потом, в следующем коммите, второй агент увидел db:drop и решил, что в проекте так принято. Добавил комментарий и пошёл дальше. Изменение нормализовалось — выглядело как осознанное решение, а не дебаг-артефакт.

Тесты прошли в фиче-ветке. CI зелёный.

Через час в слаке:

"Андрей, а ты ничего случайно не снёс нам в qa? Всю базу, например?"

Я смотрел на сообщение несколько секунд. Потом открыл Makefile. Потом понял.

db-prepare использовался не только для тестов в CI. Тот же таргет запускался при деплое на QA-окружение. Первый агент этого не знал. Я не помнил. Человеческое ревью не поймало. AI-ревью не подсветило. Все посмотрели на diff и увидели разумное изменение.

По приборам всё отлично. По факту — пустая база, нули в count.

Дальше — хуже

Следующее утро. Коллега разбирается с упавшим Elasticsearch:

"Андрей, ты решил совсем сломать db-prepare? Там теперь rake elastic:reindex_all. CI падает на пустой базе."

Агент продолжал "чинить" Makefile. Каждый следующий агент видел то, что оставил предыдущий, и строил поверх. Никто не откатил к оригиналу.

А потом, вечером следующего дня, уже я:

"Погодите — мы же не починили db:drop. При следующем деплое на QA она опять дропнется."

Мы чуть не снесли базу дважды.

Один агент добавил деструктивную команду. Второй её нормализовал. Третий добавил сверху ещё повреждений. Каждый действовал локально, рационально, правильно — в рамках тех трёх строчек кода, которые он видел.

Код должен делать то, что написано

В нашем CI был шаг db_prepare. Он не просто запускал миграции. Он ещё и создавал базу — неявное допущение от первого деплоя. Коллега сказал: это конвенция. Я сказал: два отдельных шага, db_create и db_migrate. Если не знаешь мета-контекст, имя врёт.

Человек может догадаться, что db_prepare делает больше чем migrate. LLM доверяет тексту на 100%. Если имя говорит migrate, агент считает — migrate. Если таргет в Makefile называется db_prepare, агент считает — подготовка для тестов. Не деплой.

Каждая неявная конвенция в кодобазе — мина для AI-агента. У агента нет устной истории команды. У него есть имена файлов, имена функций и комментарии. Если они врут — хоть даже по умолчанию — агент построит на вранье.

Что на самом деле пошло не так

Простой ответ: я апрувнул плохой diff. Человеческая ошибка.

Настоящий ответ: когда я писал код руками, у меня было время подумать. Пока набираешь db:drop, в голове успевает мелькнуть: "А где ещё это используется?" Медленность создавала пространство для рефлексии. Сейчас агент выдаёт готовое решение за секунды. Я переключаюсь с написания кода на принятие кода. Из автора — в валидатора. А валидатор видит то, что ему показывают. Он не видит того, чего нет в diff'е.

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

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

Почему мы не потеряли бизнес

Эта ошибка обошлась нам в ~30 минут. Вот почему:

QA-окружение существует. Мы не вайбкодим на прод. Есть место, где можно сломать — и это не production.

Автоматические бекапы работают. Утренний снэпшот RDS был на месте. Илья нашёл его за минуту.

Команда знает, как восстанавливать. Terraform, импорт состояния, переименование instance'ов — рутина, которую отрабатывали.

Ирония: за месяц до инцидента мы обсуждали, не убрать ли QA-окружение. "Зачем отдельное QA? Feature flags и сразу в прод, как все современные команды." Не убрали. Лень было мигрировать. Эта лень, возможно, сэкономила нам клиентские данные и репутацию.

Всё это — "скучные" практики. Бекапы, staging, runbooks, disaster recovery. То, от чего хочется избавиться, когда "мы же теперь с AI, всё быстрее".

Стандарты SDLC существуют не просто так

CI/CD, тестовые окружения, code review, disaster recovery — всё это формулировалось десятилетиями. Не потому что "так принято". А потому что люди теряли данные, деньги, клиентов, компании.

AI-агенты не отменяют эти практики. Они делают их важнее.

Раньше можно было вносить 5 изменений в день и пропускать одну ошибку из пяти. Сейчас — 50 изменений в день, и одна ошибка из пятидесяти. Но одна ошибка в день вместо одной в неделю — это радикально другой риск-профиль.

Можно ли добавить вайб-кодинг в существующие процессы? Да. Мы это делаем. Можно ли построить всё на вайб-кодинге без процессов? Нет. Вайб-кодинг — это турбонаддув. Турбонаддув на машине без тормозов — это не скорость. Это авария с ускорением.

Прежде чем доверять агентам

Вечером того дня я написал команде:

"Кароче, пацаны, всячески извините, довайбкодился."

Ответы:

"Пацаны не извиняются."

"Ниче, отработаем рестор. Мы не часто их отрабатываем."

Это здоровая инженерная культура. Не "у нас нет ошибок", а "у нас есть система, которая переживает ошибки".

AI не сломает вашу систему. Он покажет, что в ней уже было хрупким.


P.S. Если кажется, что "это же очевидно" — отлично. Значит, вы из тех, кто не потеряет прод. Но я видел достаточно команд, которые решили, что CI/CD — это легаси, а staging — лишние расходы. Им и адресую этот текст.

Связанные посты
56 комментариев 👇
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
Evgenii Afanasiev DevOps / Cloud / System Engineer 20 марта в 17:55

Ребзя, я конечно все понимаю, но вы со своими «аи трансформациями бизнеса» скоро не то что базы хранить и тексты писать, но и какать разучитесь.
И тоже поддерживаю не пропускать нейротексты в клуб.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Почему ощущение, что текст написан с помощью ИИ?

  Развернуть 1 комментарий

@sergbeatl, там выше уже есть ветка на эту тему, где автор объясняет причины своего стиля. Думаю, можно ее почитать, а в остальных комментариях все же обсуждать пост, а не его стиль. Если прямо очень хочется - на главной как раз батл про ИИ текст)

  Развернуть 1 комментарий

@sergbeatl, Да потому что текст написан с помощью ИИ, невозможно читать.

Так хочется, чтобы в клубе этого не было...

  Развернуть 1 комментарий

Прямо мой недавний опыт, состоялся такой диалог, в котором просил просто обновить данные в базе:

GPT>: нужно выполнить rm <путь к файлу бд> и перезапустить основной алгоритм
Я>: Это же уничтожит мои существующие данные?
GPT>: Да, уничтожит
Я>: Можно обновить без уничтожения предыдущих данных?
GPT>: Можно, вот команда для обновления без уничтожения ..
Я>: 🤦‍♂️

  Развернуть 1 комментарий
Evgenii Afanasiev DevOps / Cloud / System Engineer 20 марта в 20:05

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

Ваш опыт подсвечивает три фундаментальных сдвига в разработке, к которым индустрия ещё не до конца адаптировалась.


1. Проблема «Локального Максимума»

AI-агент работает в рамках контекстного окна. Для него задача «почини падение тестов в CI» — это изолированная математическая проблема.

  • Логика агента: Тесты падают, потому что база грязная -> db:drop гарантирует чистоту -> Задача решена.
  • Проблема: Агент не знает о существовании QA-среды, которая использует тот же Makefile, потому что в его «мире» (диффе и текущих файлах) этой связи нет.

2. Эрозия ответственности: От Автора к Валидатору

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

  • Ловушка: Мы подсознательно доверяем работающему решению. Если тесты стали зелеными, наш мозг помечает задачу как «безопасную».
  • Результат: Ревью превращается в проверку синтаксиса и стиля, а не архитектурных последствий.

3. Накопление «Генетического брака»

Ваш пример с Elasticsearch и вторым агентом, который «нормализовал» деструктивный код, — это чистая биология. Ошибка в ДНК первого поколения становится стандартом для второго.

  • Если AI видит в коде db:drop, он не думает: «О боже, какой идиот это написал?».
  • Он думает: «Ага, здесь принято радикально чистить окружение перед подготовкой. Добавлю-ка я сюда еще и очистку индексов».

Почему ваши «скучные» практики — это теперь единственный барьер

Раньше CI/CD и бэкапы были защитой от человеческой невнимательности. Теперь это защита от масштабируемой глупости.

Эпоха Скорость изменений Тип ошибки Главная защита
До AI Низкая Опечатка, логическая ошибка Unit-тесты, Code Review
С AI-агентами Экстремальная Архитектурный сдвиг, удаление данных Staging, Бэкапы, IaC, Ограничение прав (IAM)

Что делать, чтобы не снести Прод?

Ваш кейс показывает, что «вайб-кодинг» требует ужесточения инфраструктуры, а не её упрощения:

  1. Принцип наименьших привилегий для CI: Технический пользователь, под которым идет деплой на QA/Prod, не должен иметь прав на DROP DATABASE. Только на MIGRATE. Тогда db:drop просто упадет с ошибкой доступа.
  2. Явное над неявным: Если таргет делает деструктивные действия, он должен называться db:reset_dangerously. AI отлично считывает семантику страха.
  3. Check-lists для AI-ревью: Нужно просить агента-ревьюера специально искать деструктивные команды (drop, delete_all, rm -rf) и проверять их контекст.

Ирония судьбы: Вы спаслись благодаря «лени» и нежеланию удалять QA-окружение. В мире, где код генерируется за секунды, дистанция между кодом и реальными пользователями (в виде лишних окружений) становится единственным временем на раздумья.

Это была очень дорогая (в плане нервов) бесплатная лекция.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

😎

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

Что вообще здесь происходит?


Войти  или  Вступить в Клуб