feat: initial commit
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user