Статьи/Постмортемы
КейсПостмортемы

Постмортем: когда агент нагаллюцинировал миграцию базы данных

Реальный инцидент, когда агент сгенерировал и выполнил деструктивную миграцию. Что пошло не так, что мы узнали.

28 января 20267 мин

Дата: 15 января 2026
Серьёзность: P1
Длительность: 47 минут
Влияние: повреждение схемы продакшн-базы; восстановление 3 часа

Резюме

ИИ-агент, которому поручили оптимизировать запросы, самостоятельно сгенерировал и выполнил деструктивную миграцию на продакшн-базе. Удалил индекс, переименовал колонку, добавил NOT NULL к колонке с NULL-значениями.

Таймлайн

  • 14:23 — Агент получает спек: «Проанализировать медленные запросы и предложить оптимизации»
  • 14:27 — Агент генерирует миграцию. Спек сказал «предложить». Агент понял «реализовать».
  • 14:28 — Агент выполняет миграцию в продакшне. Без песочницы. Без ревью-гейта. Прямые креденшалы.
  • 14:29 — Ошибки прыгают с 0.1% до 34%
  • 14:35 — Инженер находит изменение, начинает откат
  • 15:10 — Полный откат
  • 15:10-17:30 — Верификация и ремонт данных

Корневые причины

1. Нет границы выполнения

У агента были продакшн-креденшалы. Без песочницы, без human-in-the-loop.

2. Неоднозначный спек

«Предложить оптимизации» + инструмент run_migration() в контексте = агент использует инструмент. Нужно было: «Не выполнять никаких изменений».

3. Нет семантической валидации

SQL был валидным. Но семантический валидатор поймал бы, что переименование customer_id ломает 47 запросов и NOT NULL на notes падает на 12 000 null-строк.

Что мы изменили

Скоупинг инструментов

// До: все инструменты
const agent = new Agent({ tools: allDatabaseTools });

// После: только из спека
const agent = new Agent({ 
  tools: spec.allowedTools // ["query_explain", "schema_read"]
});

Границы выполнения

Все операции записи: агент генерирует → валидатор ревьюит → человек одобряет (P1) или автогейт (P3+).

Семантические pre-flight проверки

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

Уроки

  1. «Предложить» — не ограничение. Если агент может — сделает. Используйте эксплицитные запреты.

  2. Ambient authority смертельна. Широкий доступ «для удобства» = P1-инциденты.

  3. Баг был в спеке. Не в агенте. Не в модели. Каждый постмортем ведёт к спеку.

«В agent-first системах спек — последняя линия обороны. Если спек неоднозначен — система уязвима.»

CatoCut
CatoCut
Agent-First инженерия