Asystent programowania oparty na AI w kolejce serwera w darmowym planie napisał plik migracji schematu po tym, jak reguła „freeze migrations” (zamrożenie migracji) zniknęła podczas automatycznej kompresji kontekstu. Incydent ten pokazuje, że poleganie na instrukcjach w prompcie w celu wymuszenia bezpieczeństwa może przynieść odwrotny skutek, gdy długie sesje czatu są streszczane.
Co się stało
Współdzielony agent programistyczny działał z promptem systemowym, który zawierał jedną regułę: nie twórz ani nie modyfikuj plików migracji. Reguła ta utrzymywała migracje schematu w stanie zamrożonym na gałęzi wydawniczej (release branch), podczas gdy programiści używali agenta do rutynowych edycji.
Podczas długiej sesji rozmowa przekroczyła limit tokenów modelu. Serwer uruchomił kompresję kontekstu (context compaction), zastępując pełną historię czatu krótkim podsumowaniem, aby zmieścić się w budżecie tokenów. Podsumowanie zachowało wzmianki o ścieżkach plików, ale usunęło ograniczenie negatywne („nie zapisuj do migrations/**”). Gdy model wygenerował kolejną odpowiedź, reguła zamrożenia nie znajdowała się już w jego pamięci operacyjnej.
Agent zasugerował wówczas poprawkę SQL w celu przyspieszenia zapytań. Towarzyszące mu narzędzie zapisało zmianę jako plik migracji na dysku. Testy jednostkowe przeszły pomyślnie, ponieważ nigdy nie wykonują surowych migracji SQL, a zmiana została zauważona dopiero później w różnicy (diff) podczas przeglądu kodu.
Dlaczego to jest ważne
- Zniknęły barierki ochronne: Polityki na poziomie promptu są nietrwałe. Gdy kontekst modelu jest kompresowany, każda klauzula „nie rób” może zostać utracona, co pozwala systemowi na wykonywanie zabronionych czynności.
- Testy jednostkowe to za mało: Testy, które nie uruchamiają skryptów migracji, mogą dawać fałszywe poczucie bezpieczeństwa. Zmiana przeszła niezauważona, ponieważ zestaw testów nigdy nie przetestował nowego zapytania SQL.
- Przegląd ludzki nastąpił z opóźnieniem: Zanim recenzent zobaczył diff, plik migracji został już zatwierdzony (committed), co wymagało wycofania zmian (rollback) lub dodatkowego sprzątania.
Błąd nie spowodował awarii, ale wymusił dodatkową pracę przy wycofywaniu niepotrzebnej migracji i zwiększył ryzyko podobnego przeoczenia, które mogłoby wpłynąć na produkcyjne bazy danych.
Jak zawiodła barierka ochronna
- Reguła tylko w prompcie – Zamrożenie istniało jako zwykły tekst w prompcie systemowym.
- Długa sesja – Czat przekroczył okno kontekstowe modelu.
- Kompresja – Serwer zamienił pełny zapis rozmowy na podsumowanie nasycone rzeczownikami.
- Utrata ograniczenia negatywnego – Podsumowanie pominęło instrukcję „nie rób”, usuwając regułę.
- Wynik modelu – Bez reguły model wygenerował odpowiedź tworzącą migrację.
Algorytmy streszczające mają tendencję do zachowywania rzeczowników (ścieżek plików, nazw funkcji) i pomijania zaprzeczeń, dlatego reguła zniknęła po cichu.
Rozwiązanie: przenieś barierki ochronne na ścieżkę zapisu
Zamiast osadzać zakazy w prompcie, wymuszaj je tam, gdzie kod dotyka dysku.
- Utwórz plik polityki (np.
agent_policy.txt), który zawiera listę ścieżek zabronionych, takich jakschema/**lubmigrations/**. - Dodaj skrypt pre-apply, który odczytuje plik polityki i skanuje każdy diff przed uruchomieniem narzędzia zapisu.
- Zastosuj zasadę „fail closed” (blokuj domyślnie), jeśli plik polityki nie istnieje, jest pusty lub jeśli diff dotyczy zabronionej ścieżki.
- Nie proś modelu o potwierdzenie listy zabronionych elementów; potwierdzenie to jedynie sygnał, a nie mechanizm wymuszania.
Barierki tylko w prompcie vs. barierki oparte na dysku
| Aspekt | Barierka tylko w prompcie | Bramka na dysku |
|---|---|---|
| Ryzyko kompresji | Reguła może zniknąć | Plik polityki pozostaje nienaruszony |
| Pokrycie testami jednostkowymi | Może przeoczyć zabronione zapisy | Sprawdzenie ścieżki blokuje zapis niezależnie od testów |
| Czas przeglądu ludzkiego | Szkody mogą zostać już zatwierdzone | Zapis nigdy się nie rozpoczyna, recenzent nie widzi zmian |
| Wysiłek implementacji | Minimalny (tylko linia w prompcie) | Mały skrypt + plik polityki |
Kontrargument
Na co zwrócić uwagę w przyszłości
Podsumowanie
Jeśli potrzebujesz reguły, której nigdy nie wolno ignorować — takiej jak „brak migracji podczas zamrożenia” — przechowuj ją na dysku i wymuszaj w momencie zapisu. Sam tekst promptu nie może zagwarantować trwałości, gdy kontekst modelu zostanie skompresowany.
