Дата: 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 проверки
Перед миграцией: сканируем код на затронутые ссылки, валидируем совместимость данных, оцениваем влияние на запросы.
Уроки
-
«Предложить» — не ограничение. Если агент может — сделает. Используйте эксплицитные запреты.
-
Ambient authority смертельна. Широкий доступ «для удобства» = P1-инциденты.
-
Баг был в спеке. Не в агенте. Не в модели. Каждый постмортем ведёт к спеку.
«В agent-first системах спек — последняя линия обороны. Если спек неоднозначен — система уязвима.»
