# ADR-0004: Guardraile w dwóch warstwach - prompt nie jest zabezpieczeniem - Status: przyjęty - Data: 2026-08-28 ## Kontekst Instrukcje w promptcie ("nie modyfikuj .gitlab-ci.yml") działają w większości przypadków, ale są miękkie: zależą od modelu, długości kontekstu i sformułowania zadania. W repozytorium bankowym pytanie audytora nie brzmi "czy model zwykle tego nie robi", tylko "co się stanie, jeśli spróbuje". ## Decyzja Każdy istotny guardrail istnieje dwukrotnie: - jako instrukcja APM dla modelu (`security.instructions.md`) - żeby agent w ogóle nie próbował, - jako mechanizm w kodzie (`WorkspaceTools`, `Settings.deny_globs`, budżety, brak powłoki) - żeby próba zakończyła się błędem narzędzia zapisanym w śladzie audytowym. Ta sama zasada dotyczy oceny wyniku: werdykt agenta `reviewer` jest uzupełniany niezależną kontrolą mechaniczną (pliki objęte zakazem, zmiany w testach, budżet zakresu, status weryfikacji). ## Konsekwencje **Pozytywne** - Naruszenie guardraila jest zdarzeniem obserwowalnym, a nie niewidoczną zmianą w diffie. - Da się odpowiedzieć na pytanie "co system uniemożliwia", a nie tylko "o co prosi". - Testy zabezpieczeń (`test_workspace_tools.py`) są testami jednostkowymi, nie ćwiczeniem z promptowania. **Negatywne** - Duplikacja reguł w dwóch miejscach - trzeba je świadomie utrzymywać razem. - Zbyt ciasne budżety potrafią zablokować poprawną, ale szeroką zmianę; wartości są konfigurowalne przez zmienne środowiskowe i powinny być dostrajane per klasa repozytoriów.