ШІ-асистент для написання коду на сервері з безкоштовною чергою створив файл міграції схеми після того, як правило «заморозки міграцій» зникло під час автоматичного стиснення контексту. Цей інцидент показує, що покладання на інструкції в промптах для забезпечення безпеки може мати зворотний ефект, коли довгі сесії чату узагальнюються.
Що сталося
Спільний кодинг-агент працював із системним промптом, який містив одне правило: не створювати та не змінювати файли міграцій. Це правило тримало міграції схеми замороженими у гілці релізу, поки розробники використовували агента для повсякденних правок.
Під час тривалої сесії розмова перевищила ліміт токенів моделі. Сервер запустив стиснення контексту (context compaction), замінивши повну історію чату коротким резюме, щоб вписатися в бюджет токенів. Резюме зберегло згадки шляхів до файлів, але видалило негативне обмеження («не записувати в migrations/**»). Коли модель згенерувала наступну відповідь, правило заморозки вже не було в її робочій пам'яті.
Потім агент запропонував зміну SQL-запиту для підвищення швидкості виконання. Супутній інструмент зберіг зміну як файл міграції на диску. Юніт-тести пройшли успішно, оскільки вони ніколи не виконують сирі SQL-міграції, а зміна була помічена лише пізніше під час перегляду коду (code-review diff).
Чому це важливо
- Засоби захисту зникли: Політики на рівні промптів є нестабільними. Коли контекст моделі стискається, будь-яка застережна умова «не роби» може бути втрачена, що дозволяє системі виконувати заборонені дії.
- Юніт-тестів недостатньо: Тести, які не запускають скрипти міграцій, можуть створювати хибне відчуття безпеки. Зміна пройшла непоміченою, тому що тестовий набір ніколи не перевіряв новий SQL-код.
- Людська перевірка запізнилася: На той час, коли рецензент побачив diff, файл міграції вже було зафіксовано (committed), що вимагало відкату або додаткового очищення.
Помилка не призвела до збою в роботі системи, але змусила витратити додатковий час на скасування непотрібної міграції та підвищила ризик подібних помилок, що можуть вплинути на робочі бази даних.
Як не спрацював захист
- Правило лише в промпті – заморозка існувала як звичайний текст у системному промпті.
- Тривала сесія – чат перевищив контекстне вікно моделі.
- Стиснення – сервер замінив повну розмову стислим резюме, насиченим іменниками.
- Втрата негативного обмеження – у резюме було пропущено інструкцію «не роби», що призвело до видалення правила.
- Результат моделі – без правила модель згенерувала відповідь, що створює міграцію.
Узагальнювачі (summarizers) схильні зберігати іменники (шляхи до файлів, назви функцій) і відкидати заперечення, саме тому правило зникло непомітно.
Виправлення: перенесіть засоби захисту на шлях запису
Замість того, щоб вбудовувати заборони в промпт, забезпечуйте їх виконання там, де код взаємодіє з диском.
- Створіть файл політики (наприклад,
agent_policy.txt), у якому перелічено шляхи, що заборонені для запису, такі якschema/**абоmigrations/**. - Додайте скрипт попереднього застосування (pre-apply), який зчитує файл політики та сканує кожен diff перед запуском інструменту застосування.
- Використовуйте принцип «fail closed» (блокуйте дію за замовчуванням), якщо файл політики відсутній, порожній або якщо diff торкається забороненого шляху.
- Не просіть модель підтвердити список заборонених шляхів; підтвердження — це лише сигнал, а не механізм примусового виконання.
Захист лише через промпт проти захисту на основі диска
| Аспект | Заморозка лише через промпт | Шлюз на основі диска |
|---|---|---|
| Ризик стиснення | Правило може зникнути | Файл політики залишається цілим |
| Покриття юніт-тестами | Може пропустити заборонені записи | Перевірка шляху блокує запис незалежно від тестів |
| Час людської перевірки | Зміни можуть бути вже зафіксовані | Запис ніколи не розпочнеться, рецензент не побачить змін |
| Зусилля на впровадження | Мінімальні (просто рядок у промпті) | Невеликий скрипт + файл політики |
Контраргумент
На що звернути увагу далі
Головний висновок
Якщо вам потрібне правило, яке ніколи не можна ігнорувати — наприклад, «ніяких міграцій під час заморозки» — зберігайте його на диску та забезпечуйте його виконання в момент запису. Одного лише тексту промпта недостатньо, щоб гарантувати стабільність, коли контекст моделі стискається.
