Granice, których nie egzekwuje agent

przez Łukasz | wrz 2, 2026

Zdanie w prompcie jest życzeniem. Odcięty ruch wychodzący jest faktem. Cała reszta tego artykułu wynika z tej różnicy.

Najczęstszy sposób ograniczania agenta polega na napisaniu mu, czego ma nie robić. Nie sięgaj do produkcji. Nie wysyłaj niczego na zewnątrz. Nie modyfikuj plików poza katalogiem roboczym.

To działa dokładnie tak długo, jak długo nie występuje sytuacja, w której zakazana droga jest jedyną drogą do celu. Agent poproszony o dane, których nie ma, będzie ich szukał każdą dostępną drogą — nie ze złej woli, tylko dlatego, że dostał zadanie i próbuje je wykonać.

Zakaz w prompcie konkuruje z zadaniem w prompcie. Czasem wygrywa, czasem nie, i nie wiadomo z góry kiedy.

Dlaczego graf zmienia stawkę

W pętli był jeden wykonawca z jednym zestawem uprawnień. Ograniczenie polegało na tym, co mu dałeś — a czego nie dałeś, tego nie miał.

W grafie wykonawców jest kilku i każdy potrzebuje czegoś innego. Węzeł badawczy potrzebuje internetu. Węzeł redagujący nie. Węzeł zapisujący potrzebuje dostępu do bazy, ale tylko do zapisu wyniku, nie do odczytu wszystkiego.

Jeśli nadasz wszystkim ten sam zestaw — a to jest domyślne, bo prościej — to uprawnienia całego grafu są sumą uprawnień wszystkich węzłów, i każdy z nich może zrobić wszystko, co może zrobić najbardziej uprzywilejowany.

Wtedy podział na role istnieje wyłącznie w prompcie. Czyli w warstwie, która jest życzeniem.

Heterogeniczność jako konsekwencja, nie funkcja

Tu jest własność architektoniczna, którą warto zobaczyć, bo bywa opisywana jako ograniczenie, a jest przewagą.

Jeśli każdy węzeł uruchamiany jest jako osobny proces — z własnym środowiskiem, katalogiem roboczym i konfiguracją — to różne modele, różni dostawcy i różne polityki sieciowe per węzeł nie są funkcją, którą ktoś musiał zaimplementować. Są konsekwencją tego, jak zbudowano wykonanie.

Scenariusz, który z tego wynika i którego nie złożysz w stosie jednego dostawcy:

Większość zespołu — role analityczne, redakcyjne, kontrolne — działa na modelu lokalnym, na plikach, w kontenerze bez wyjścia do sieci. Jeden węzeł ma dostęp do internetu, odpytuje publiczne źródła i zapisuje wyniki do współdzielonego katalogu. Węzeł analizujący czyta ten katalog i nie ma jak niczego wysłać, bo jego kontener nie ma ścieżki na zewnątrz.

Zwróć uwagę, gdzie mieszka granica. Nie w instrukcji dla węzła analizującego. W braku trasy.

Cztery warstwy, na których da się postawić granicę

W kolejności od najsłabszej do najmocniejszej.

Prompt. Zakaz sformułowany słowami. Konkuruje z zadaniem, więc bywa przegrywa. Użyteczny jako wskazówka, bezużyteczny jako zabezpieczenie.

Zestaw narzędzi. Węzeł nie dostaje narzędzia, którego nie ma używać. Znacznie mocniejsze, bo agent nie wywoła czegoś, czego nie ma na liście. Ograniczenie: narzędzia bywają szersze, niż potrzeba — jedno wykonaj_zapytanie obejmuje i odczyt, i DROP TABLE.

Uprawnienia po stronie zasobu. Konto z prawem odczytu, klucz z ograniczonym zakresem, katalog tylko do odczytu. Granica przestaje zależeć od tego, co agent wywoła, a zaczyna od tego, na co pozwoli druga strona.

Izolacja infrastrukturalna. Kontener bez trasy do sieci, sieć wydzielona, brak montowania katalogów spoza obszaru roboczego. Agent może chcieć, może wywołać, może dostać token — i nadal nie ma jak.

Praktyczna zasada: granicę stawiaj tak nisko, jak się da przy zachowaniu funkcjonalności. Prompt niech tłumaczy, dlaczego czegoś nie robimy. Infrastruktura niech pilnuje, żeby się nie dało.

Budżet jako warunek uruchomienia

Ten sam mechanizm w wymiarze kosztowym, i ta sama różnica.

Sprawdzenie limitu przed uruchomieniem węzła jest granicą. Raport o przekroczeniu po fakcie jest sprawozdaniem.

W pętli koszt widziałeś na końcu i mogłeś ją zabić w każdej chwili. W grafie węzły mogą budzić się cyklicznie z kolejki, więc nie ma jednego momentu, w którym ktoś patrzy. Bez limitu sprawdzanego przed startem dowiesz się o problemie z faktury — a to jest ten syndrom, który u ciebie w Patologii nazywa się „rachunek eksplodował, a nic się nie zmieniło”.

Trzy poziomy, na których warto to mieć, bo każdy łapie co innego:

Na zadanie — sufit dla całej sprawy. Chroni przed jednym zadaniem, które wymknęło się spod kontroli.

Na węzeł — sufit dla pojedynczego wykonawcy w pojedynczym uruchomieniu. Chroni przed węzłem, który kręci się w kółko.

Na okno czasu — sufit dla całego grafu w ciągu godziny albo doby. Chroni przed sytuacją, w której każde pojedyncze zadanie mieści się w limicie, a jest ich nagle tysiąc.

Trzeci bywa pomijany i jest tym, który ratuje przy pętli sprzężenia zwrotnego — gdy wynik jednego zadania tworzy kolejne.

Zastrzeżenie, którego nie wolno pominąć

Wszystko powyżej opiera się na założeniu, że warstwa egzekwująca granice jest sama zabezpieczona.

Hamulec zewnętrzny jest wart tyle, ile zabezpieczenie panelu, który nim steruje. Opisywaliśmy na cyberflux.pl łańcuch wywołań dający nieuwierzytelnionemu atakującemu kontrolę nad instancją orkiestratora — a więc również nad wszystkimi budżetami, limitami i przypisaniami uprawnień, które w niej ustawiono.

To nie jest argument przeciwko orkiestratorom. To jest argument za tym, żeby traktować panel orkiestracji jak system o uprawnieniach administracyjnych, bo nim jest — niezależnie od tego, że w interfejsie wygląda jak narzędzie do zarządzania zadaniami.

Jak to sprawdzić u siebie

Test, który nie wymaga narzędzi: przy każdym węźle dopisz, czego mu nie wolno — i na której warstwie to jest egzekwowane.

Węzeł Czego nie wolno Gdzie stoi granica
prompt / narzędzia / uprawnienia / izolacja

Trzy sygnały do wychwycenia:

Jeśli przy którymś węźle w trzeciej kolumnie wpisujesz wyłącznie „prompt” — to węzeł bez granicy, tylko z prośbą.

Jeśli przy którymś nie umiesz nic wpisać w drugiej kolumnie — to znaczy, że wolno mu wszystko, i to jest świadoma decyzja albo przeoczenie. Warto wiedzieć która.

Jeśli wszystkie węzły mają identyczną drugą kolumnę — nie masz ról, masz jeden zestaw uprawnień rozdany kilku procesom.

I jeden test wykonawczy, który zajmuje kwadrans: weź węzeł, który nie powinien mieć dostępu do sieci, i każ mu pobrać stronę. Jeśli mu się uda, granica była w prompcie.

Co dalej

Granice omówione dotyczą tego, co węzeł może zrobić sam. Zostaje typ węzła, którego uprawnienia działają odwrotnie: nie ogranicza go infrastruktura, tylko czyjaś uwaga — a uwaga ma tę własność, że wyczerpuje się z użyciem.

O tym jest artykuł ósmy: Człowiek jako węzeł.


Stan na sierpień 2026. Podział na cztery warstwy egzekwowania jest uogólnieniem — poszczególne narzędzia orkiestrujące udostępniają je w różnym zakresie, a część wyłącznie na dwóch najwyższych poziomach.

Agent kończy, ale zadania nie wykonał

Agent kończy, ale zadania nie wykonał

Objawy Agent odpowiada: „Przygotowałem i wysłałem potwierdzenie do klienta." Potwierdzenie nie zostało wysłane. Albo: „Zaktualizowałem wszystkie rekordy" — zaktualizował trzy z dwunastu. Albo: „Nie znalazłem żadnych zamówień" — bo narzędzie zwróciło błąd, którego nikt...

Agent zrobił coś, o co nikt nie prosił

Agent zrobił coś, o co nikt nie prosił

Objawy Operacja, której nikt nie zlecił. Dane wysłane pod adres, którego nie ma w żadnej konfiguracji. Rekord zmieniony poza zakresem zadania. Odpowiedź, z której wynika, że agent dostał instrukcje od kogoś innego niż ty. Cecha wspólna: technicznie wszystko zadziałało...

Agent zrobił to samo dwa razy

Agent zrobił to samo dwa razy

Objawy Ten syndrom różni się od pozostałych jedną rzeczą: objaw widzi klient, nie ty. Trzy identyczne wiadomości w skrzynce. Dwa zamówienia zamiast jednego. Podwójne obciążenie. Duplikaty rekordów, które ktoś zauważa tydzień później. W twoim dzienniku wszystko wygląda...

Agent gubi wątek w długim zadaniu

Agent gubi wątek w długim zadaniu

Objawy Pierwsze kroki idą wzorowo. Po kilkunastu agent zaczyna się rozjeżdżać. Przestaje przestrzegać reguły z promptu systemowego, której trzymał się na początku. Zmienia format odpowiedzi w połowie zadania. Wraca do czegoś, co już ustalił, i ustala to inaczej....

Agent podaje dane, których nie ma

Agent podaje dane, których nie ma

Objawy Numer zamówienia w idealnym formacie, którego nie ma w bazie. Kwota, której w dokumencie nie ma. Nazwa pola API, które nigdy nie istniało. Cytat z regulaminu, brzmiący dokładnie jak reszta regulaminu i w nim nieobecny. Cecha wspólna wszystkich tych przypadków:...

Działał wczoraj, dziś nie działa

Działał wczoraj, dziś nie działa

Objawy Nic się nie wywala. Nie ma wyjątków, nie ma timeoutów, dziennik wygląda tak samo jak zawsze. Po prostu odpowiedzi są gorsze. Postacie, w jakich to się objawia: Jakość. Agent zaczyna pomijać kroki, które wcześniej wykonywał, albo odpowiada ogólniej. Format....

Agent wybiera złe narzędzie

Agent wybiera złe narzędzie

Objawy Agent odpowiada nie na to pytanie. Pobiera listę zamówień, gdy pytano o jedno konkretne. Odpowiada z pamięci, choć miał sprawdzić w bazie. Albo sięga po właściwe narzędzie i wpisuje w argumenty coś, czego nie da się użyć. Sygnał, który odróżnia ten syndrom od...

Agent kręci się w kółko

Agent kręci się w kółko

Objawy Agent wykonuje kolejne obroty pętli, nie zbliżając się do zakończenia zadania. W dzienniku widać jedną z trzech postaci. Powtórzenie. To samo narzędzie, te same argumenty, raz za razem — czasem dziesiątki razy pod rząd. Oscylacja. Agent wywołuje na przemian dwa...