Trzy agenty, jeden system, jeden dzień. Kto kogo złapał.

Dzień się nie zaczął od bezpieczeństwa. Zaczął się od tego, że siadłem odchudzić obrazy kontenerów, bo dysk pokazał, że jeden warsztat AI waży u mnie 24,6 GB i pora coś z tym zrobić. To ważne, bo o dziurze, którą znaleźliśmy dwie godziny później, nikt tego dnia nie miał zamiaru szukać.

Trzy agenty pracowały równolegle. Jeden siedział w panelu CRM. Drugi w aplikacji na Androida. Trzeci w stacku na lokalnym serwerze AI. Ja widziałem całość i podejmowałem decyzje, oni widzieli swoje wycinki. Właśnie z tego wzięło się to, o czym jest ten wpis: każdy widział co innego i dlatego każdy łapał coś, czego inny nie widział.

Zwrot

Przy sprawdzaniu, co siedzi w kontenerze modelu, wyszło, że jeden z asystentów wystawia się do internetu bez uwierzytelnienia. Dało się z zewnątrz wyciągnąć treść prywatnej notatki. Nie z audytu bezpieczeństwa. Przypadkiem, w trakcie zupełnie innej pracy.

Do tego momentu tego dnia audytu bezpieczeństwa nie było w planie.

Kto co złapał

To jest środek tej relacji. Poniżej zestawienie z jednego dnia. Nazwy usług sobie darowuję, bo wpis zostaje w sieci dłużej niż aktualny kształt mojego stacku.

  • agent CRM: brama asystenta notowała token zamiast go walidować. Dowód poprawnej migracji nie mógł się nigdy pojawić, bo nikt niczego nie sprawdzał
  • agent CRM: nowa zakładka w panelu jest pusta, bo agent od mózgu napisał sondę i nie dołożył wysyłki
  • agent CRM: jeden workflow wciąż używa starego wspólnego sekretu, mimo że agent od mózgu twierdził, że nie
  • agent od mózgu: droga alarmowa monitoringu nie zadziałała ani razu od powstania
  • agent od mózgu: własny skaner sekretów ma dwa martwe wzorce
  • agent od mózgu: jeden watchdog od miesięcy puka martwym tokenem i raportuje przy tym sukces
  • ja: agent zaniżył mi ocenę dojrzałości mojego własnego produktu, bo działał na nieaktualnej wiedzy

Ten ostatni wiersz zostawiam osobno, bo on jest tu najważniejszy. Agent trzy razy pod rząd mylił się w tę samą stronę. Za każdym razem musiałem go poprawić. Kiedy piszesz o wieloagentowej pracy, łatwo pominąć taki wiersz i pokazać tylko sukcesy. Wtedy z relacji robi się reklama. Więc zostawiam jak było: człowiek pilnował faktów o produkcie, agent nadążał.

Jedno pytanie, które złapało trzy martwe zabezpieczenia

Trzy z tych znalezisk mają wspólny mianownik. Wystarczyło zadać jedno pytanie:

Co musi się zepsuć, żeby to zaświeciło na czerwono?

Zabezpieczenie, którego nikt nigdy nie widział w akcji, jest hipotezą. Nie zabezpieczeniem.

Najlepszy przykład z tego dnia: ten sam plik wiedział o pułapce. Monitoring stosował obejście dla znanego problemu w trzech miejscach i za każdym razem był komentarz wyjaśniający dlaczego. Wszędzie poza jedną funkcją. Tą, która służy do zgłaszania awarii. Alarm ostatniej szansy odpala się rzadko, więc nikt nie miał okazji zauważyć, że jest martwy. Człowiek, który dokładał obejścia, zapomniał o tym miejscu, bo tam się nigdy nie zaglądało. Automat, który mógłby wyłapać niespójność, nie istniał.

Trzy rzeczy, które ten dzień pokazał

Mierz to, co działa, nie to, co zadeklarowane. W przepisie na jeden z kontenerów stoi pięć nazw pakietów. W działającym kontenerze siedzi dwadzieścia cztery. Reszta doszła jako zależności zależności. Tam siedzi większość problemów, których nie widać z listy w pliku konfiguracyjnym.

Liczba, z którą nie da się nic zrobić, jest ignorowana. Pierwszy przebieg audytu podatności dał 486 pozycji. Po sklejeniu duplikatów zostało 253. Po odsianiu tego, czego w moim użyciu nie da się w ogóle wywołać, garść realnych. Raportowanie 486 byłoby gorsze niż nieraportowanie niczego. Uczy ignorowania.

Metadane pakietów kłamią. Jedna biblioteka deklarowała zgodność z wersją, z którą nie działa. Ta sama nie deklarowała zależności, bez której się nie uruchamia. Oba fakty wyszły dopiero przy starcie, nie przy budowie. Jeśli decydujesz o czymś na podstawie samego pliku z zależnościami, decydujesz na podstawie deklaracji autora, a nie stanu rzeczy.

Uczciwa porażka

Nie wszystko z tego dnia jest sukcesem. Skasowałem 33 obrazy kontenerów. Liczba obrazów spadła z 83 do 20. Miejsce na dysku stało.

Warstwy w obrazach są współdzielone. Kasowanie samego rekordu nazwy nie zwalnia bloków. Prawdziwe oszczędności zaczęły się dopiero przy przebudowach, bo tam znikają warstwy, których żaden inny obraz nie używa. Zanim to zauważyłem, byłem z siebie zadowolony przez dobre pół godziny.

Zostawiam to tu, bo bez tej sekcji cały wpis wygląda jak wypolerowana relacja. Nie była wypolerowana. Była mokra, w kilku miejscach głupia, i dopiero pod koniec dnia zaczęła się układać.

Co z tego wynika, jeśli sam pracujesz z agentami

Nie „AI zastąpi programistów". Nie „AI zrobiło wszystko za mnie". Mam z tego dnia coś skromniejszego i moim zdaniem bardziej użytecznego.

Wiele agentów nad jednym systemem działa nie dlatego, że każdy jest nieomylny. Działa dlatego, że każdy widzi co innego, a człowiek trzyma całość. Wszystkie trzy najgroźniejsze znaleziska tego dnia wyszły z konfrontacji dwóch perspektyw. Żaden agent w pojedynkę by ich nie zobaczył, żaden mi też ich nie zasugerował.

Do tego trzeba dwóch rzeczy, których żaden z tych agentów nie miał w sobie. Ja miałem oba: pełny obraz i pamięć o produkcie, którą aktualizuję szybciej niż jakikolwiek ich model.

Co mi z tego dnia zostało

  • Nauka, że zabezpieczenie, którego nigdy nie widziałem w akcji (jak działa), jest u mnie od dziś jak hipoteza a nie gotowe zabezpieczenie.
  • Plik z zależnościami przestałem traktować jako źródło prawdy o tym, co siedzi w kontenerze. Prawdę mówi to, co się uruchomi.
  • 486 podatności w raporcie nauczyło mnie, że liczba, z którą nikt nic nie zrobi, jest gorsza od zera.
  • Fakty o moim własnym produkcie muszę u siebie trzymać świeże, bo agent poprawiał je na starym stanie trzy razy z rzędu i za każdym razem zaniżał mi ocenę.
  • 33 skasowane obrazy nie zwolniły miejsca. Warstwy współdzielone same się nie kasują. Teraz to sprawdzam zanim się z siebie ucieszę.

Na koniec

To był jeden dzień. 56 commitów w głównym repozytorium, 26 sond monitoringu (z 21), 92 testy automatyczne w stacku plus 26 w drugim repozytorium, 19 adresów publicznych pod stałą kontrolą, zero otwartych bez powodu gdy zamykałem laptopa.

Nie piszę tego jako case study „patrz jak pięknie się z AI pracuje". Piszę jako relację z pracy, w której trzej agenci i ja przez większość dnia się nawzajem poprawialiśmy. Wynik jest lepszy niż to, co bym zrobił sam. Ale tylko dlatego, że pilnowałem, żeby żaden z nich nie został z ostatnim słowem.