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

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

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

Во время длительной сессии объем переписки превысил лимит токенов модели. Сервер запустил сжатие контекста (context compaction), заменив полную историю чата кратким резюме, чтобы уложиться в бюджет токенов. В резюме сохранились упоминания путей к файлам, но было удалено отрицательное ограничение («не записывать в migrations/**»). Когда модель сгенерировала следующий ответ, правило заморозки уже не находилось в её рабочей памяти.

Затем агент предложил SQL-правку для ускорения запросов. Сопутствующий инструмент сохранил это изменение в виде файла миграции на диске. Юнит-тесты прошли успешно, так как они никогда не выполняют «сырые» SQL-миграции, а само изменение было замечено только позже при просмотре diff в процессе код-ревью.

Почему это важно

  • Исчезновение защитных механизмов: Политики на уровне промптов нестабильны. При сжатии контекста модели любое условие с частицей «не» может быть потеряно, что дает системе свободу совершать запрещенные действия.
  • Юнит-тестов недостаточно: Тесты, которые не запускают скрипты миграции, могут создавать ложное чувство безопасности. Изменение проскочило незамеченным, потому что тестовый набор никогда не проверял новый SQL-код.
  • Задержка человеческой проверки: К тому времени, когда ревьюер увидел diff, файл миграции уже был закоммичен, что потребовало отката или дополнительной очистки.

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

Как отказал защитный механизм

  1. Правило только в промпте — заморозка существовала в виде обычного текста в системном промпте.
  2. Длительная сессия — чат разросся за пределы контекстного окна модели.
  3. Сжатие — сервер заменил полную расшифровку чата кратким резюме, перенасыщенным существительными.
  4. Потеря отрицательного ограничения — в резюме была опущена инструкция «не», что стерло правило.
  5. Вывод модели — без правила модель сгенерировала ответ, создающий миграцию.

Алгоритмы суммаризации склонны сохранять существительные (пути к файлам, имена функций) и отбрасывать отрицания, именно поэтому правило исчезло незаметно.

Решение: перенесите защитные механизмы на путь записи

Вместо того чтобы встраивать запреты в промпт, внедряйте их там, где код взаимодействует с диском.

  1. Создайте файл политик (например, agent_policy.txt), в котором перечислены запрещенные пути, такие как schema/** или migrations/**.
  2. Добавьте скрипт предварительного применения (pre-apply), который считывает файл политик и сканирует каждый diff перед запуском инструмента применения изменений.
  3. Используйте принцип «запрещено по умолчанию» (fail closed): если файл политик отсутствует, пуст или если diff затрагивает запрещенный путь, выполнение должно прерываться.
  4. Не просите модель подтвердить список запретов; подтверждение — это лишь сигнал, а не инструмент принудительного исполнения.

Защита только в промпте против защиты на основе диска

Аспект Заморозка только в промпте Защита на основе диска
Риск сжатия Правило может исчезнуть Файл политик остается нетронутым
Покрытие юнит-тестами Может пропустить запрещенные записи Проверка путей блокирует запись независимо от тестов
Время проверки человеком Ущерб может быть уже закоммичен Запись даже не начнется, ревьюер не увидит изменений
Сложность реализации Минимальная (просто строка в промпте) Небольшой скрипт + файл политик

Контраргумент

На что обратить внимание в дальнейшем

Главный вывод

Если вам нужно правило, которое ни в коем случае нельзя игнорировать (например, «никаких миграций во время заморозки»), сохраняйте его на диске и применяйте в момент записи. Один лишь текст промпта не может гарантировать надежность, как только контекст модели будет сжат.