Podział narzędzi na te, które czytają, i te, które zmieniają świat, jest najważniejszym podziałem w całej architekturze agenta. Wszystkie zabezpieczenia zaczynają się od niego.
Czym jest skutek uboczny
Skutek uboczny to trwała zmiana stanu poza agentem: wysłany mail, zapis w bazie, obciążenie karty, utworzone zamówienie, usunięty plik, opublikowana treść. Narzędzie odczytujące zwraca informację i nie zostawia śladu. Narzędzie ze skutkiem ubocznym zostawia ślad, który istnieje niezależnie od tego, czy przebieg agenta się powiódł.
Dlaczego rozdzielenie jest konieczne
Model nie odróżnia jednego od drugiego — dla niego oba są prośbą o wywołanie funkcji, złożoną z nazwy i argumentów. Rozróżnienie musi istnieć w pętli i pociąga za sobą inne traktowanie: inne uprawnienia, inną walidację, inne reguły ponawiania, inne wymagania wobec zgody użytkownika i inne podejście do zrównoleglania.
Trzy stopnie
Odwracalny: zapis, który da się cofnąć, na przykład zmiana statusu w wewnętrznym systemie.
Odwracalny kosztownie: operacja, którą technicznie da się wycofać, ale która zdążyła wywołać skutki u innych — na przykład opublikowana i zauważona treść.
Nieodwracalny: wysłany mail, wykonany przelew, trwale usunięte dane. Tu jedynym zabezpieczeniem jest niedopuszczenie do wykonania.
Praktyka
Narzędzia warto oznaczać w kodzie w sposób jawny — deklarowanie, czy narzędzie ma skutki uboczne i jakiego stopnia, pozwala pętli podejmować decyzje automatycznie, zamiast polegać na tym, że ktoś pamiętał o dodatkowym sprawdzeniu przy każdym nowym narzędziu.