Przejdź do treści

Ochrona danych

Gdzie we wdrożeniu mieszkają dane osobowe, co je opuszcza i przy jakiej konfiguracji, które kontrole istnieją w kodzie i mają za sobą test, a które są wciąż otwartymi zgłoszeniami. Napisane dla osoby, która odpowiada na przegląd ochrony danych jednego wdrożenia — inspektora ochrony danych, oficera bezpieczeństwa, operatora — i uczciwe co do różnicy między tym, co oprogramowanie potrafi, a tym, co wdrożenie faktycznie postanowiło.

Strona to nie zgodność

Nic tutaj nie jest dowodem, że wdrożenie jest zgodne z RODO. Kod da się wdrożyć wewnątrz zgodnego środowiska; czy dane wdrożenie jest zgodne, zależy od skonfigurowanych providerów, ustalonej retencji, podpisanych umów i operatora, który je prowadzi. Każdy taki warunek jest poniżej nazwany jako coś do zdobycia i zweryfikowania, nigdy jako coś założonego.

Domyślnie nic nie wychodzi

Świeże wdrożenie trzyma wszystko we własnym PostgreSQL-u i na własnym dysku, i nigdzie nic nie wysyła. Każdy skok na zewnątrz to wiersz albo ustawienie, które ktoś dodał później: profil modelu wskazujący providera, kolekcja wybierająca parser, metoda wyszukiwania w specu, token Logfire, host mem0, serwer MCP, bot kanału. Usuń wiersz i skok znika.

Wdrożenie, które nie chce żadnej trzeciej strony w łańcuchu, konfiguruje się tak i oprogramowanie współpracuje:

Zagadnienie Lokalna odpowiedź
Model czatowy Profil ollama albo litellm — bezkluczowy, wskazujący endpoint, który hostujesz. Każdy z 28 providerów z base_url przyjmie też Twój gateway
Parsowanie dokumentów pymupdf, wartość domyślna, działa w workerze. OCR LiteParse też działa w workerze albo na serwerze OCR zarejestrowanym jako usługa lokalna. LlamaParse to wybór per kolekcja, wymagający klucza w vault; bez niego nic nie jest parsowane poza wdrożeniem
Embeddingi Ollama, którą hostujesz, zarejestrowana jako usługa lokalna w Knowledge → Integrations i wybrana per kolekcja jako provider ollama. Bezkluczowa i jedyny provider, którego może użyć kolekcja app-scoped
Trace'y Zostaw LOGFIRE_TOKEN nieustawiony i nie wiąż żadnego tokenu observability ze specem ani ze środowiskiem. Runy dalej zapisują id trace'u lokalnie
Wyszukiwanie, przeglądanie, pamięć, narzędzia Nie wiąż sekretu search, żadnej capability web_fetch, browser_use ani memory_mem0, żadnego połączenia MCP. Przeglądarka może zostać, gdy każda strona, którą może otworzyć, jest na allowed_domains, a jej kroki idą do modelu, który sam hostujesz
Poczta Twój własny relay SMTP
Mowa, obrazy i wideo Dla zamiany mowy na tekst żaden provider: zostaw dyktowanie na off albo browser i wyłączone boty kanałów, bo własnego serwera zamiany mowy na tekst nie da się jeszcze wskazać (planowany kolejny krok). Dla syntezy mowy i wideo brak capability text_to_speech ani video_generation. Dla obrazów profil u providera, którego hostujesz, albo brak takich profili

Embeddingi w to wliczone: katalog wymienia OpenRouter i OpenAI, do których kolekcja sięga kluczem z vaultu, oraz ollama, do której kolekcja sięga przez usługę lokalną — wiersz wskazujący serwer prowadzony przez organizację albo wdrożenie. Kolekcja na ollama wysyła swoje chunki i zapytania wyłącznie na ten host i nikomu nie płaci. Wdrożenie, które musi trzymać dokumenty na własnym sprzęcie, tam tworzy każdą kolekcję.

Kto za co odpowiada

Strona Rola Co to tutaj znaczy
Organizacja, która to wdraża (miasto, firma) Administrator danych Decyduje o celach, retencji, o tym, do których providerów agent może sięgać, i podpisuje z nimi umowy
Vstorm jako autor oprogramowania Żadna z tych ról, dla wdrożenia self-hosted Kod działa na Twojej infrastrukturze i nic nie dzwoni do domu. Vstorm nigdy nie widzi Twoich danych
Vstorm, jeśli prowadzi wdrożenie za Ciebie Podmiot przetwarzający Umowa powierzenia przetwarzania to kontrakt między nami, a nie ustawienie. Musi istnieć przed opublikowaniem pierwszego agenta
Provider modelu, embeddingów, parsowania, wyszukiwania albo obserwowalności Podprzetwarzający, wybrany konfiguracją Platforma zapisuje, którego providera i który endpoint używa każdy agent. Ich lokalizacja, retencja i warunki treningu są ich, i weryfikuje się je per wdrożenie

Platforma niczego nie trenuje ani nie dostraja. Wysyła prompty, dokumenty i wyniki narzędzi do providerów, których wdrożenie skonfigurowało, i zapisuje to, co wraca. To, czy provider używa ruchu API do treningu, jest własnością konta i warunków providera, a lista kontrolna na końcu prosi o oświadczenie, zamiast je zakładać.

Gdzie mieszkają dane osobowe

Wszystko poniżej jest we własnym PostgreSQL-u wdrożenia, na jego własnym dysku albo w usłudze, którą wdrożenie wybrało. Każda tabela należąca do organizacji niesie organization_id; wiersz podrzędny — wiadomość, załącznik, ocena — jest ograniczany przez konwersację albo użytkownika, przy którym wisi, a odczyt idzie przez sprawdzenie rodzica.

Baza danych

Magazyn Trzyma Dane osobowe w nim Cel
users, sessions, organization_members Konta i logowania E-mail, imię, awatar, zahaszowane hasło albo id konta Google, hash refresh tokenu, adres IP i user agent na sesję; to, co osoba powiedziała agentom o sobie - język konsoli, strefa czasowa, rola, czym się zajmuje, godziny pracy - oraz pierwsze wiadomości napisane dla jej pustego czatu Uwierzytelnianie i autoryzacja; to, co każdy agent słyszy o osobie
browser_sign_ins Zapisane logowania osoby do stron, dla przeglądarki Strona, organizacja, kiedy ostatnio użyte, i sama sesja (ciasteczka i localStorage strony) zapieczętowana w vaulcie w zakresie tej osoby Kolejne przeglądanie w jej imieniu zaczyna się już zalogowane. Eksport danych osobowych podaje strony, nigdy sesji
conversations, messages, tool_calls Każdy czat na każdej powierzchni Tekst, który ludzie napisali, odpowiedzi i rozumowanie modelu, argumenty i wyniki narzędzi, kroczące podsumowanie długich wątków Podstawowa funkcja produktu; historia, do której człowiek wraca
voice_calls Każde połączenie rozmowy głosowej Id użytkownika rozmówcy (brak dla odwiedzającego), agent, run, konwersacja i embed, do których należała, provider i model, id rozmowy u providera, id klucza z vaultu, którym była prowadzona, worker, który ją trzyma, jej heartbeat, czasy startu, końca i rozłączenia, jej koszt, sekundy i liczba trafień guardraili. Bez dźwięku i bez transkrypcji - słowa rozmowy to zwykłe wiersze w messages, każdy oznaczony turn_id i, gdy rozmówca wszedł agentowi w słowo, interrupted Rozłączanie rozmowy, której proces umarł, i liczenie miesięcznych minut rozmów organizacji
chat_files Załączniki do wiadomości Nazwa pliku, typ, rozmiar, wyciągnięty tekst (parsed_content) i ścieżka bajtów na dysku Odpowiadanie o pliku
generated_media Jeden wiersz na każdy obraz, klip mowy lub wideo wygenerowane przez agenta Organizacja, konwersacja, w której powstał, jeśli run ją miał, nazwa pliku, ścieżka w magazynie i rozmiar - nie jego treść, która jest plikiem pod MEDIA_DIR Liczenie wygenerowanych mediów każdej organizacji względem jej limitu oraz usuwanie ich razem z konwersacją albo po okresie retencji
context_files Stała wiedza, którą builder napisał dla agentów Cokolwiek autor tam umieścił — i trafia to do promptu dosłownie. Zobacz Pliki kontekstu Instrukcje i fakty, które agent zawsze ma znać
artifacts, artifact_versions i ich pliki Strony opublikowane przez agentów — raporty, dashboardy Cokolwiek strona pokazuje, a run zbudował ją z tego, co mógł przeczytać; właściciel, run, który zapisał każdą wersję, i — gdy jest włączony — klucz publicznego linku, jego ustawienia (hasło jako hash bcrypt) i to, ile razy go otwarto — liczba i czas, nic o odwiedzającym. Zobacz Aplikacje Udostępnienie wyniku pod stałym linkiem
agent_memory_files Notatki, które agent napisał o osobie albo o czacie grupowym Cokolwiek agent uznał za warte zapamiętania, kluczowane przez person:<user_id> albo pokój czatu Ciągłość między rozmowami
rag_documents, knowledge_bases i jedna tabela wektorowa na kolekcję Wgrane i zsynchronizowane dokumenty, ich chunki i embeddingi Tekst dokumentu i jego wektory, oryginalna ścieżka pliku w źródle Wyszukiwanie
agent_runs, tool_approvals, run_manifests Ile każdy run kosztował i co zrobił Prompt systemowy i ostatnie żądanie podane modelowi, argumenty narzędzi czekające na zatwierdzenie, osoba decydująca i jej notatka Budżety, zatwierdzenia, historia runów
agent_triggers Runy zaplanowane i wyzwalane zdarzeniem Prompt oraz konfiguracja i filtr źródła zdarzeń Uruchamianie agenta bez człowieka
app_admin_audit_logs Kto zmienił dostęp albo wydał pieniądze — ślad organizacji i ślad administratora wdrożenia dzielą jedną tabelę Aktor, podszywający się, adres IP, akcja i mapa details. Mapa przeważnie nazywa pola, ale niektóre wpisy trzymają wartości: e-mail konta, pod które się podszyto, e-mail konta usuniętego przez administratora, notatka publikacji Rozliczalność. Zobacz Nadzór
notifications, notification_deliveries Każde powiadomienie zaadresowane do kogoś oraz jego dostarczenie mailem. Wiersz powstaje nawet wtedy, gdy odbiorca wyłączył dla tego zdarzenia wszystkie kanały — to on nie pozwala zapisać tego samego wystąpienia dwa razy — i po prostu nigdy nie jest pokazywany ani wysyłany; warunkowy jest tylko wiersz dostawy Odbiorca, wyrenderowane wcześniej podsumowanie (nigdy surowy komentarz albo wartość sekretu) oraz otypowane zmienne, z których e-mail się odtwarza; wiersz dostawy dodaje swój kanał, status, liczbę prób i oczyszczony powód niepowodzenia — nigdy tekst błędu od providera Alerty, które ktoś czyta raz, bez asysty. Zobacz Nadzór
notification_preferences, announcements Przełączniki kanału per zdarzenie oraz własne ogłoszenia administratora aplikacji Id użytkownika na przełącznik; nadawca ogłoszenia, jego treść oraz organizacje i rola, do których było zaadresowane — nigdy rozwiązana lista odbiorców, którą można odtworzyć z notifications tylko dopóki ten wiersz nie wypadnie w ramach zamiatania retencji powiadomień — po czym wpis audytowy zachowuje tylko liczbę, nigdy odbiorców Rezygnacja z powiadomień i własny zapis autora
embed_visitors, channel_identities, channel_sessions Obcy na hostowanej stronie oraz ludzie na Slacku, Teams, Telegramie albo Mattermoście Losowy klucz odwiedzającego; id użytkownika platformy, nazwa użytkownika i nazwa wyświetlana; id czatu Wznowienie właściwego wątku
message_ratings Kciuki i komentarze pod odpowiedziami Oceniający i jego komentarz Przegląd jakości
suggestions Co praca z własnej inicjatywy zaproponowała osobie i czy to przyjęła Osoba, tytuł i linijka opisu wzięte z jej ostatnich próśb, prompt rutyny albo profil, który by ustawiła, i klucz, który nie pozwala zaproponować ponownie czegoś odrzuconego Propozycje, o których osoba decyduje
watches Co osoba kazała pracy z własnej inicjatywy obserwować na swoich połączeniach Osoba, które z jej połączeń, czego szukać i co pomijać jej własnymi słowami, jak często i kiedy ostatnio sprawdzono Obserwacje, które osoba ustawia
ml_service_calls Każde wywołanie usług ML i każda transkrypcja: dyktowanie, wiadomość głosowa z kanału, API, dyktowanie odwiedzającego na hostowanej stronie albo w widgecie Organizacja, kto poprosił, która usługa, liczby bajtów i jednostek, czas trwania i sposób zakończenia; przy transkrypcji także provider i model, identyfikator klucza z vaultu, z którym ją wysłano, skąd przyszła, agent i bot kanału, dla których była, oraz długość nagrania. Wiersz wiadomości głosowej z kanału wskazuje osobę, z którą powiązane jest konto nadawcy, a przy niepowiązanym nadawcy nikogo. Wiersz odwiedzającego nie wskazuje nikogo - ani odwiedzającego, który nie ma konta, ani tego, kto opublikował stronę. Usunięcie osoby, agenta, bota albo klucza czyści powiązanie i zostawia wiersz - nic z tego, co wysłano, i nic z tego, co wróciło Raportowanie zużycia i wgląd operatora w integrację, która się psuje
agent_workspaces, sandbox_operations Pliki, na których pracował agent, i log tego, co uruchomił Dla backendu state same pliki, jako JSON; dla kontenera id sesji oraz każda komenda, cel i podsumowanie wyniku Sandbox. Zobacz Sandbox
organization_secrets, model_profiles, mcp_connections, channel_bots Poświadczenia i to, gdzie wskazują Wyłącznie zapieczętowany szyfrogram, z podpowiedzią; provider, model i base_url jawnie Sięganie do providerów. Zobacz Sekrety

messages.search_vector to indeks pełnotekstowy nad tą samą treścią, a conversations.summary_messages to jej kompresja napisana przez model. Oba są kopiami czatu i idą razem z nim.

Wygenerowane media

Obraz, klip mowy albo wideo wygenerowane przez agenta to plik pod generated_<org>/ i nazywający go wiersz generated_media. Wiersz zapisuje organizację, konwersację, jeśli run ją miał, oraz rozmiar - więc suma organizacji jest ograniczona przez GENERATED_MEDIA_QUOTA_MB (5120), sprawdzane przed każdym płatnym wywołaniem generowania. Liczy się każdy plik, także utworzony bez konwersacji: z podglądu albo przebiegu testowego, z wtrącenia /btw w kanale, z runu API, który nie wskazuje konwersacji, albo plik, którego konwersację usunęła ścieżka, która go zostawiła.

Plik jest usuwany razem ze swoją konwersacją, razem z kontem, do którego ta konwersacja należała, przez codzienne zadanie sweep-generated-media, gdy jest starszy niż GENERATED_MEDIA_RETENTION_DAYS (90), nawet jeśli konwersacja wciąż istnieje, oraz po prefiksie razem ze swoją organizacją. 0 wyłącza każde z tych ograniczeń. Pliku bez konwersacji żaden członek nie może usunąć, żeby zwolnić miejsce, więc to samo zadanie usuwa go po 7 dniach, bez względu na GENERATED_MEDIA_RETENTION_DAYS, także przy 0. Link do niego - w odpowiedzi w kanale albo w odpowiedzi API - przestaje wtedy działać.

Usunięcie konwersacji, konta albo organizacji usuwa wiersze we własnej transakcji i w tej samej transakcji kolejkuje odpięcie bajtów jako zadanie w tle, więc bajty odchodzą tylko wtedy, gdy odchodzą wiersze, a restart po commicie nie gubi odpięcia. To zadanie ponawia prefiks, którego magazyn nie usunie w całości - prefiks organizacji - oraz pojedynczy plik usuniętej konwersacji albo konta, którego magazyn nie chce usunąć, bo nic innego nie znalazłoby już tych bajtów. Plik, którego magazyn nie usunie także przy ostatniej próbie zadania, zostaje bez wiersza pod generated_<org>/, dopóki nie odejdzie jego organizacja, a raport niżej go liczy.

Sweep usuwa najpierw plik, a jego wiersz dopiero wtedy, gdy pliku już nie ma; plik, którego magazyn nie chce usunąć, zachowuje wiersz, a następny sweep próbuje ponownie.

Pliki wygenerowane, zanim tabela powstała, nie mają wiersza. Nadal są serwowane, ale nie wliczają się do limitu, a sweep ich nie widzi: odchodzą razem ze swoją organizacją albo ręcznie, a raport ochrony danych liczy je wśród plików bez wiersza.

Poza bazą danych

Magazyn Trzyma Usuwane, gdy
MEDIA_DIR na hoście API (wolumen media_data) Załączniki czatu pod <user_id>/, awatary, logotypy embedów, obrazy, mowę i wideo wygenerowane przez agentów pod generated_<org>/ oraz tymczasową kopię każdego dokumentu pod _rag_tmp na czas parsowania Dokument zostaje usunięty przez produkt. Bajty załącznika czatu są odpinane po commicie, który usuwa jego konwersację albo jego właściciela. Wygenerowany plik odchodzi razem z konwersacją, w której powstał, po GENERATED_MEDIA_RETENTION_DAYS (90) bez względu na los konwersacji - po 7 dniach, gdy nie ma konwersacji - oraz razem ze swoją organizacją; zobacz Wygenerowane media. Zobacz Co obejmuje usunięcie
SANDBOXD_WORKSPACE_ROOT na hoście sandboksa Pliki każdego workspace'u opartego o kontener Konwersacja zostaje usunięta albo zamiata je SANDBOXD_WORKSPACE_TTL; nieustawiony — trzymane bezterminowo. Zobacz Jak długo cokolwiek przeżywa
Redis Kubełki rate limitu kluczowane wywołującym — dla powierzchni publicznej to jawny adres IP, w kluczu, na czas TTL okna; klucze deduplikacji triggerów i kanałów; stan wymiany OAuth; zaparkowane zaproszenia; podgląd przeglądania na żywo — ostatni zrzut ekranu, kroki oraz to, co osoba trzymająca przeglądarkę kliknęła i wpisała, dopóki przeglądanie tego nie odczyta; kroki do powtórzenia danej osoby — adresy i etykiety tego, co nacisnęły jej zakończone przeglądania, nigdy to, co wpisała Po wygaśnięciu: podgląd na żywo godzinę po ostatniej klatce przeglądania, kroki do powtórzenia dwa tygodnie po ostatnim wykonaniu zadania, wszystko inne w ciągu minut
background_jobs w PostgreSQL Payload każdego zadania w tle, jego ostatni błąd i odpowiedź asynchronicznego runu przez API Sweep retencji usuwa zakończone zadanie po BACKGROUND_JOB_RETENTION_DAYS (14). Payloady to id i ścieżki, z dwoma wyjątkami: event_context odpalenia wyzwolonego zdarzeniem — nadawca, temat i treść wiadomości Gmail, zgłoszenia GitHub, ładunku webhooka — oraz prompt i odpowiedź asynchronicznego runu przez API zostają w zadaniu do tego czasu. Logi workera przechodzą przez ten sam filtr redakcji co logi API
Logfire, jeśli skonfigurowany Trace'y każdego runu Retencja providera. Dziś trace niesie pełny prompt, wyjście i argumenty narzędzi — zobacz Trace'y
Twój relay SMTP Zaproszenia, magic linki, prośby o zatwierdzenie, alerty budżetowe, raporty użycia oraz własny mail skrzynki powiadomień - nienadzorowane zakończenie albo błąd runa, zakończenie albo błąd ingestii dokumentu, zdarzenie bezpieczeństwa albo zmiana konfiguracji, własne ogłoszenie administratora Cokolwiek relay zachowa. Mail o zatwierdzeniu nazywa agenta, narzędzie i link, a nie argumenty narzędzia
Kopie zapasowe pg_dump to cała baza; wolumen mediów to pliki Twoje wygaśnięcie kopii. Usunięcie nigdy nie sięga kopii już zrobionej — zobacz Kopie zapasowe

Co opuszcza wdrożenie

Nic nie wychodzi, dopóki wiersz albo ustawienie nie wskaże celu. To jest pełna lista celów, wraz z konfiguracją, która o każdym decyduje.

Cel Co jest wysyłane Decyduje o tym Lokalizacja i warunki
Model czatowy Rozmowa jak dotąd, załączniki wklejone albo opisane, pobrane chunki, wyniki narzędzi; raz na noc, dla pracy z własnej inicjatywy, ostatnie prośby osoby, jej profil i to, co zanotował o niej jej agent Profil modelu: provider, model, base_url i zapieczętowany klucz. Dwudziestu siedmiu providerów; ollama i litellm są bezkluczowe i sięgane pod endpointem, który hostujesz, a openai, anthropic, google, huggingface i inne przyjmują base_url, więc endpoint w UE albo gateway to pole, a nie rozwidlenie. Profil openai lub azure na Responses API wysyła store: false, więc provider nie trzyma zapisanej, możliwej do pobrania odpowiedzi, chyba że profil ustawi openai_store; retencja OpenAI na potrzeby monitorowania nadużyć nadal obowiązuje, chyba że konto ma zero data retention Providera. Weryfikuj per profil
Model embeddingowy Każdy chunk każdego dokumentu w kolekcji i każde zapytanie wyszukujące Per kolekcja i tylko tam: embedding_provider (openrouter, openai albo ollama, z katalogu), a dla dwóch pierwszych klucz z vaultu embedding_secret_id, który płaci. Nie ma klucza embeddingowego na poziomie wdrożenia; kolekcja z kluczem, ale bez wskazanego, odmawia indeksowania i wyszukiwania. ollama jest bezkluczowa i sięgana pod usługą lokalną, którą kolekcja wskazuje (embedding_endpoint_id), na hoście, który prowadzisz Providera albo Twój własny host. Wybór na stałe
LlamaCloud Cały dokument Kolekcja, której pdf_parser to llamaparse; musi wskazać klucz z vaultu (llamaparse_secret_id), nie ma klucza wdrożenia. Domyślny pymupdf parsuje w workerze LlamaCloud, jeśli użyty
Serwer OCR Wyrenderowane strony dokumentu Kolekcja, której pdf_parser to liteparse i której ocr_endpoint_id wskazuje usługę lokalną; bez tego OCR działa w workerze Twój własny host — usługa lokalna jest z definicji w sieci wdrożenia
Model opisujący obrazy Obrazy wewnątrz dokumentów image_description_model kolekcji Providera tego modelu
Web research Zapytanie wyszukiwania, które ułożył agent web_research.method w specu: duckduckgo (bez klucza), tavily, brave albo exa (każde z sekretem search), albo native, gdzie szuka provider modelu czatowego Dostawcy wyszukiwania albo providera modelu
Pobieranie stron i przeglądarka URL; dla przeglądarki to, co wpisuje na otwieranych stronach Capability w specu; przeglądarka potrzebuje też endpointu CDP na BROWSER_CDP_ALLOWED_HOSTS, domyślnie pustej Pobieranej strony; hosta przeglądarki i stron, które otwiera
Proxy przeglądarki agenta albo przeglądarka hostowana Wszystko, co przeglądarka ładuje i wysyła, tak jak inaczej robiłaby to przeglądarka we wdrożeniu - strony, treść formularzy, ciasteczka, logowania - oraz własny zapis proxy albo usługi browser_use.connection w spec (#2130); domyślnie built_in Proxy albo usługa przeglądarki hostowanej (Browserbase, Steel lub inna), na umowie organizacji z nią
Kroki przeglądarki Każdy krok przeglądania idzie do modelu tego agenta: adres strony, jej tytuł, etykiety widocznych elementów i do 4000 znaków jej widocznego tekstu, plus zrzut ekranu przy włączonym vision — co może być zawartością systemu wewnętrznego. To, co zawiera pole, nie jest powtarzane: tabela elementów podaje tylko, że pole jest wypełnione Capability browser_use w specu Dostawcy modelu agenta, tak jak przy rozmowie
Sandbox, ruch wychodzący Cokolwiek z workspace'u, do dowolnego hosta — runtime workbench ma sieć, powłokę i curl Capability sandbox i runtime z needs_network; zatwierdzanie komend bramkuje to, co się uruchamia, a nie to, dokąd się łączy Dokądkolwiek poszła komenda. Kontrola ruchu wychodzącego to firewall hosta sandboksa, a nie ustawienie tutaj
Serwer MCP Argumenty i wyniki narzędzi mcp_connections.url, per organizacja albo per osoba Operatora serwera
mem0 Wspomnienia zapisane dla osoby albo czatu base_url capability memory_mem0, który musi być w MEM0_ALLOWED_HOSTS Hosta mem0, na który pozwalasz
Logfire Spany każdego żądania i runu LOGFIRE_TOKEN na poziomie wdrożenia; token observability w specu albo logfire_token_secret_id na środowisku przekierowuje te runy do innego projektu. LOGFIRE_BASE_URL wybiera wdrożenie w USA albo w UE. Nieustawione wszędzie — nic nie jest wysyłane Pydantic, USA albo UE
Mowa na tekst, generowanie obrazów Notatka głosowa z kanału, nagranie podyktowane w /chat albo nagranie anonimowego odwiedzającego na hostowanej stronie lub w widgecie; prompt Provider, do którego rozwiązuje się nagranie - własna para bota, nadpisanie agenta albo domyślny provider organizacji, który bot dziedziczy, chyba że ma to wyłączone - wysyłane z kluczem z vaultu wskazanym obok tej pary - kluczem API dla groq, mistral albo openai, widocznym dla organizacji na poziomie organizacji i bota; przy dyktowaniu w /chat także silnik organizacji ustawiony na server, a dla strony albo widgetu jego własne dictation: server. Profil dla google albo openai przy obrazach. Dźwięk dyktowania nie jest tu przechowywany. Przy browser na stronie albo w widgecie przeglądarka odwiedzającego wysyła dźwięk do swojego dostawcy i nic z niego nie przechodzi przez ten deployment Providera albo, przy obrazach, twój własny host; przy browser dostawcy przeglądarki
Provider głosu realtime W trakcie rozmowy głosowej: dźwięk rozmówcy, instrukcje agenta i definicje narzędzi, wyniki narzędzi oraz wcześniejsze tury rozmowy jako tekst, gdy rozmowa się zaczyna albo łączy ponownie Sekcja Głos agenta: provider, model (albo wdrożenie Azure) i klucz z vaultu secret_id, opublikowana; bez sekcji Głos agent nie odbiera rozmów. Przez WebRTC (OpenAI) dźwięk płynie bezpośrednio między przeglądarką a providerem; przez relay (Azure, Gemini, xAI) przechodzi przez to wdrożenie, nie będąc przechowywanym. Dźwięk nie jest tu zatrzymywany, a sesja zachowuje tylko transkrypcje Providera
Zamiana tekstu na mowę Tekst do wypowiedzenia i ewentualna wskazówka, jak go wypowiedzieć provider capability text_to_speech: openai, elevenlabs albo google, z kluczem bindingu Providera
Generowanie wideo Prompt i ewentualny obraz początkowy provider capability video_generation: google, byteplus, xai albo alibaba, z kluczem bindingu. google zapisuje interakcję (store: true), bo Gemini dostarcza klip pod adresem tylko z zapisanej; pozostałych trzech nikt o to nie prosi Providera
Slack, Teams, Telegram, Mattermost Odpowiedzi agenta; adres e-mail nowego członka, żeby znaleźć go na powitanie w Slacku, Mattermost albo Teams Wiersz channel_bots z tokenem w vaulcie Dostawca komunikatora i tak ma już ten czat
Logowanie Google Nic wychodzącego; Google zwraca e-mail, imię, zdjęcie i id konta GOOGLE_CLIENT_ID Google
Twój relay SMTP Poczta wymieniona wyżej SMTP_HOST, SMTP_TLS Twoja

Konektory synchronizacji działają w drugą stronę: źródło Google Drive albo S3 zaciąga dokumenty do środka, uwierzytelnione sekretem connector, a od tej chwili dokumenty są kopią wdrożenia i podlegają regułom powyżej. To, kto może przeczytać, co zaciągnęło źródło, jest decyzją, którą podejmuje wiersz źródła.

Kontrole i gdzie każda jest dowiedziona

Każdy wiersz nazywa mechanizm w kodzie oraz test albo stronę, która go przypina, albo zgłoszenie, które to zrobi. Wiersz, którego ostatnia kolumna to zgłoszenie, jest luką — i tak jest nazwany.

Kontrola Mechanizm Dowiedziona przez
Izolacja tenantów organization_id w każdej tabeli należącej do organizacji, rozwiązywany z X-Organization-Id do członkostwa przy każdym żądaniu; wiersze podrzędne osiągalne tylko przez sprawdzenie rodzica tests/integration/test_conversation_tenant_isolation.py i jego rodzeństwo; Uprawnienia
Dostęp do wiersza Trzy warstwy: administrator wdrożenia, rola w organizacji, grant per zasób przez resolve_access. Kontrolka, której wywołujący nie może użyć, nie jest renderowana Testy odmów w tests/api/; Uprawnienia
Czytanie cudzego czatu Właściciel, jawne udostępnienie albo administrator aplikacji wdrożenia — nigdy rola w organizacji. Czat projektu czyta się wyłącznie przez projekt: każdy, kto może widzieć projekt, łącznie z osobą, która czat zaczęła, i nikt, kto przestał móc. Konwersacje mają własne sprawdzenie, ConversationService._may_read, a nie formułę grantów admin_conversations.py wymaga is_app_admin; tests/integration/test_conversation_tenant_isolation.py
Poświadczenia w spoczynku Szyfrowanie kopertowe per organizacja, wersjonowane klucze główne, rotacja z suchym przebiegiem Sekrety, cztery gwarancje przypięte testami
Treść w spoczynku Nieszyfrowana przez aplikację. Dane Postgresa, media_data i katalog główny workspace'ów sandboksa polegają na szyfrowaniu dysku albo wolumenu, które zapewniasz. Wyjątkiem są pliki z uploadu i czatu przy FILE_STORAGE_BACKEND=s3 i FILE_STORAGE_S3_ENCRYPTION ustawionym na sse-s3 (domyślnie) albo sse-kms pod kluczem, który trzymasz: każdy zapis prosi wtedy magazyn o ich zaszyfrowanie. Trzeci tryb, none, nie wysyła nagłówka szyfrowania i istnieje dla magazynu zgodnego z S3 bez KMS Kontrola operatora. Konfiguracja; agenticos cmd doctor wypisuje, na którym backendzie stoi działające wdrożenie
W tranzycie, przychodzące HTTPS na Twoim proxy; Strict-Transport-Security, gdy ENVIRONMENT=production; ciasteczka sesji httpOnly, a secure ze schematu żądania przy logowaniu i odświeżeniu. Trasa zmiany hasła ustawia secure tylko w buildzie produkcyjnym Wdrożenie; frontend/src/app/api/auth/login/route.ts
W tranzycie, do magazynów POSTGRES_SSLMODE i REDIS_SSL; agenticos cmd doctor raportuje, czy połączenie, które nawiązał, było szyfrowane Połączenia szyfrowane; tests/integration/test_store_tls.py
W tranzycie, do providerów HTTPS do każdego skatalogowanego endpointu. Własny base_url jest odrzucany bez hosta albo z poświadczeniami w środku, ale http:// jest przyjmowany, dla Ollamy albo gatewaya w sieci samego wdrożenia; profil na zwykłym HTTP wskazujący poza tę sieć wysyła prompty i klucz jawnie. Punkt 4 listy kontrolnej wypisuje każdy taki profil refused_field("base_url", ...) w serwisie profili modeli; schemat to kontrola operatora
Sekrety w odpowiedziach, logach, audycie, eksportach Żaden endpoint nie zwraca jawnego tekstu; SecretStr wszędzie; spece odwołują się do sekretów po id Sekrety
Dane osobowe w logach app/core/logging.py redaguje adresy e-mail, JWT, klucze API, tokeny bearer i pary password= z każdego rekordu logu, tak w API, jak i w workerze tests/test_logging.py; worker instaluje to w app/worker/__main__.py, a każdy proces potomny ingestii w app/worker/child.py (#440)
Dane osobowe docierające do modelu Capability guardrails redaguje numery IBAN, numery kart, amerykańskie numery ubezpieczenia społecznego, numery telefonów i adresy e-mail z promptów, odpowiedzi, wyników i argumentów narzędzi, jeśli jest skonfigurowana Capabilities; jej testy pod tests/
Dane osobowe w kolumnie błędu rag_documents.error_message i pokrewne zapisują etap i klasę, nigdy tekst klienta app/services/rag/failures.py (#423)
Rozliczalność Wpisy audytu dzielą transakcję działającą i zawodzą zamknięte; podszycie nazywa obie osoby; eksporty masowe są zapisywane Nadzór
Eksport audytu GET /audit/export, CSV albo JSONL w oknie czasu, bramkowany na audit:read i zapisywany w samym śladzie Governance (#1422)
Dowód nienaruszalności śladu Każdy wpis wchodzi w łańcuch haszy danej organizacji, a każdy łańcuch ma checkpoint na swoim najwyższym stanie, więc przepisany wpis, urwany koniec i skasowany łańcuch są wykrywalne. agenticos cmd audit-verify przechodzi je i kończy się kodem niezerowym przy naruszeniu Nadzór (#1622, #1648). Wykrywanie, nie zapobieganie: kto ma poświadczenia samej bazy, ten przekuje łańcuch od nowa albo zdejmie trigger pilnujący checkpointu
Trace'y observability.content per agent: full zapisuje wszystko, none tylko czas, tokeny, koszt i nazwy narzędzi, a tryb ten dziedziczy specjalista tego agenta Środowiska (#1413); stan pośredni redacted został odrzucony, #1616
Retencja według harmonogramu Na organizację i na klasę — rozmowy i ich pliki, runy i manifesty, workspace'y, pamięć agentów, wgrane dokumenty i audyt — w ramach domyślnej wartości, sufitu i podłogi audytu na poziomie wdrożenia. Codzienny sweep usuwa twardo i zapisuje liczniki, nigdy treść. Backupy i cokolwiek już wysłane do zewnętrznego kolektora są poza tym. notifications nie jest jedną z tych klas: zamiast tego jest zamiatane według własnego, stałego harmonogramu — wiersz przeczytany po 90 dniach, a każdy wiersz po roku bez względu na to. Same announcements są wyłączone, więc to, co zostało wysłane, pozostaje możliwe do sprawdzenia w śladzie audytu, nawet gdy jego dostawy się przedawnią. Nie jest nią też wygenerowane medium, które odchodzi po ogólnowdrożeniowym GENERATED_MEDIA_RETENTION_DAYS Retencja; test_retention.py, tests/integration/test_retention_sweep.py; zamiatanie powiadomień to tests/integration/test_notification_retention.py (#1598, Decision 8); wygenerowane media to test_generated_media.py i tests/integration/test_generated_media.py (#2310)
Usunięcie jednej osoby Usunięcie konta uzgadnia to, co by je zablokowało, odpina bajty załączników po commicie i czyści to, do czego nie sięga żadna kaskada — notatki, które agenci o niej zapisali, jej tożsamości platformowe, jej workspace'y. Usunięcie pamięci to również osobne wywołanie i sięga mem0 Co obejmuje usunięcie — co jest zatrzymywane celowo; test_personal_data.py
Dostęp do własnych danych Osoba czyta w Ustawienia → Pamięć wszystko, co każdy agent tutaj o niej zapisał, i może notatkę wyłączyć, przywrócić albo usunąć. Czytanie cudzego magazynu należy wyłącznie do administratora wdrożenia — nie do roli w organizacji — i jest audytowane z aktorem, tenantem, podmiotem i powodem, nigdy z treścią. Magazyny zewnętrzne (mem0) są nazwane, a nie listowane Jak to czytać i jak wymazać; test_memory_self_service.py. Wszystko inne, co jest o niej trzymane, wraca z GET /me/data/export, ograniczone rozmiarem i audytowane (#1421)
Tożsamość korporacyjna Logowanie Google, hasła, generyczne OIDC przeciwko dostawcy, którego już prowadzisz — konfigurowane samym discovery z OIDC_ISSUER — oraz własny katalog przez LDAP albo Kerberos. Adres z katalogu, nazwa wyświetlana i stabilny identyfikator są trzymane na koncie; grupy z katalogu są czytane przy każdym logowaniu i nie są przechowywane — przechowywane są tylko członkostwa, które tworzą z nich mapowania organizacji. Bez SAML i SCIM Logowanie katalogowe i grupy; OIDC_ISSUER, LDAP_URL
Macierz kontroli, którą czyta przegląd bezpieczeństwa Bezpieczeństwo mapuje każdą kontrolę na jej mechanizm i test, który go trzyma, w ramach HIPAA §164.312 i SOC 2 CC6–CC8; ta strona i Wdrażanie to reszta Bezpieczeństwo (#1412)
Powierzchnie publiczne Klucz odwiedzającego hostowanej strony jest losowy, nigdy wyprowadzony z osoby; wpuszczanie i wgrywanie są rate-limitowane per adres, a adres leży w kluczu Redisa na czas okna i nigdzie indziej Kanały
Noty prawne Własne adresy Regulaminu i Polityki prywatności wdrożenia zastępują strony wbudowane Wdrożenie

Trace'y

instrument_pydantic_ai() działa z domyślnym ustawieniem biblioteki, więc span trzyma wiadomość użytkownika, odpowiedź modelu oraz każdy argument i wynik narzędzia. Z nieustawionym LOGFIRE_TOKEN, bez tokenu observability w żadnym specu i bez logfire_token_secret_id na żadnym środowisku nic nie jest wysyłane, a id trace'u i tak jest zapisywane lokalnie. Wdrożenie, które potrzebuje trace'ów bez treści, ustawia agentowi observability.content na none: zapisywane są czas, tokeny, koszt i nazwy narzędzi, a żaden tekst wiadomości nie wychodzi — i tryb ten dziedziczy specjalista tego agenta, czy to napisany inline przez autora, czy wymyślony przez model w trakcie runu.

Trzeciego trybu pomiędzy nie ma. Eksport wyczyszczony filtrem PII to gwarancja, której nikt nie zaudytuje — jeden identyfikator, który filtr przepuści, już wyszedł, a operator sądzi, że nie — więc wybór jest świadomie między całą treścią a żadną (#1616).

Co obejmuje usunięcie

Usuwanie to to, co produkt robi dziś, gdy ktoś o to poprosi; retencja według harmonogramu to #1420.

Akcja Usuwa Zostawia
DELETE /conversations/{id} (właściciel) Konwersację, jej wiadomości, wywołania narzędzi, oceny, udostępnienia i wiersze chat_files, kaskadą - w tym transkrypcję rozmowy głosowej, bo jej tury są wiadomościami; bajty załączników pod MEDIA_DIR, zebrane przed usunięciem i odpięte po commicie; obrazy, mowę i wideo wygenerowane przez jej agentów - wiersze w usunięciu, bajty przez zadanie zakolejkowane razem z nim; obiekty mediów odciążone z tego wątku, po prefiksie; workspace kontenerowy przez purge_for_conversation Wiersze runów i manifesty, które nazywały tę konwersację, zachowują swoją kopię promptu; wiersz voice_calls zachowuje swoje czasy i koszt, z wyczyszczonym powiązaniem z konwersacją
DELETE /memory/person/{user_id} (osoba albo members:manage) Każdy wiersz agent_memory_files kluczowany na osobę we wszystkich agentach organizacji, i to samo w każdym związanym magazynie mem0 Notatki kluczowane na czat grupowy, w którym osoba się odzywała
DELETE /users/{id} Konto, jego sesje, jego osobistą organizację i osobiste kolekcje wraz z ich tabelami wektorowymi i plikami, jawnym teardownem; konwersacje poza projektami i pliki czatu kaskadą; ich bajty, odpięte po commicie; obrazy, mowę i wideo wygenerowane przez agentów w tych konwersacjach - wiersze w usunięciu, bajty przez zadanie zakolejkowane razem z nim; oraz to, do czego nie sięga żadna kaskada — notatki, które agenci zapisali o tej osobie (owner_key to string, nie klucz obcy), jej tożsamości platformowe i workspace'y przypisane do użytkownika Wpisy audytowe nazywające id aktora, a przy niektórych akcjach e-mail — zatrzymywane celowo, bo wpis z usuniętym aktorem jest gorszy niż wpis nazywający usunięte konto. Wiadomości w konwersacjach należących do kogoś innego oraz czaty projektów, które ta osoba zaczęła - zostają dla zespołu, bez autora, razem z wygenerowanymi w nich mediami; jej wiadomości są w nich pokazywane jako byłego członka. Media, które osoba wygenerowała bez konwersacji - podglądy i przebiegi testowe, wtrącenia /btw w kanałach, runy API, które nie wskazały konwersacji - których żaden wiersz z nią nie łączy; odchodzą po 7 dniach
Usunięcie dokumentu albo kolekcji Wiersze, tabelę wektorową i zapisany plik, przez trwały flow po commicie Nic, gdy flow już przebiegł; liczniki sync_logs zostają
Usunięcie organizacji Wszystko do niej ograniczone, tym samym odroczonym rozmontowaniem - jej wygenerowane media po prefiksie, łącznie z plikami zapisanymi, zanim zaczęto je rejestrować Kolekcje osobiste, które jedynie niosły to id

Żadne z tych nie sięga kopii zapasowej. Odtworzenie przywraca to, co usunięto, więc wygaśnięcie kopii jest częścią polityki retencji i jest spisane razem z nią.

Co wdrożenie musi rozstrzygnąć i zdobyć

Oprogramowanie nie może dostarczyć żadnej z tych rzeczy. Każda jest dowodem, o który poprosi przegląd, i jest czymś innym niż techniczna możliwość, która ją umożliwia.

  • Umowa powierzenia z każdym skonfigurowanym podprzetwarzającym — każdym providerem nazwanym przez wiersz model_profiles albo organization_secrets, providerem embeddingów, LlamaCloud, jeśli kolekcja go używa, dostawcą wyszukiwania nazwanym przez method agenta, hostem mem0, Logfire, relayem SMTP i Google, jeśli logowanie jest włączone.
  • Oświadczenie o lokalizacji danych dla każdego providera, dopasowane do base_url, którego faktycznie używa każdy profil. Provider z endpointem w UE jest w UE tylko wtedy, gdy profil tak mówi.
  • Wyłączenie z treningu dla każdego providera: ustawienie konta albo zapis umowny, na mocy którego dane z API nie są używane do treningu. Własne stanowisko platformy to jedno zdanie — niczego nie trenuje — a reszta jest ich.
  • Umowa powierzenia z Vstorm, tylko jeśli Vstorm prowadzi wdrożenie.
  • Harmonogram retencji dla konwersacji, plików, pamięci, dokumentów, runów i audytu, a obok niego wygaśnięcie kopii zapasowych. Dopóki #1420 nie wymusi harmonogramu, retencja jest ręcznym usuwaniem.
  • Szyfrowanie dysku albo wolumenu na hoście bazy, wolumenie mediów i hoście sandboksa, skoro aplikacja sama nie szyfruje treści — oraz reguła ruchu wychodzącego na hoście sandboksa, jeśli agenci mogą uruchamiać komendy.
  • Strony prawne, do których wdrożenie linkuje, i to, kto odpowiada na żądanie dostępu albo usunięcia. Mechanizmy są tutaj — GET /me/data/export i usunięcie konta — ale kto przyjmuje żądanie i w jakim terminie, należy do administratora danych.

Weryfikacja jednego wdrożenia

Powtarzalne sprawdzenia, z hosta, na działającym wdrożeniu. Każde wypisuje fakty, które przegląd może załączyć; żadne nie wypisuje poświadczenia ani danych osoby. Uruchamiaj je z backend/ albo przez docker compose exec api.

# 1. Czy to w ogóle ruszy i czy połączenia do magazynów są szyfrowane?
#    `postgres` raportuje stan TLS połączenia, które sam doctor nawiązał.
uv run agenticos cmd doctor

# 2. Każde zapieczętowane poświadczenie wciąż otwiera się pod skonfigurowanymi
#    kluczami głównymi.
uv run agenticos cmd vault-rotate --dry-run

# 3. Łańcuchy haszy śladu audytowego i ich checkpointy, przeliczone od nowa.
#    Kod wyjścia niezerowy, jeśli którykolwiek łańcuch został naruszony.
uv run agenticos cmd audit-verify

# 4. Wszystko, co to wdrożenie faktycznie skonfigurowało: ustawienia decydujące
#    o tym, co wychodzi na zewnątrz, każdy provider i endpoint, do którego może
#    sięgnąć agent, trzymane poświadczenia według przeznaczenia, kolekcje i to,
#    kto liczy dla nich embeddingi, serwery we własnej sieci, serwery MCP,
#    portale triggerów, źródła synchronizacji i boty kanałów, zdolności, które
#    sięgają pod własny adres, gdzie trafiają trace'y runów i ile treści niesie
#    span, ile w każdym magazynie objąłby okres retencji oraz pliki pod
#    `MEDIA_DIR`, na które nie wskazuje już żaden wiersz.
uv run agenticos cmd data-protection-report --older-than 365

Punkt 4 to ten do załączenia. Wypisuje konfigurację i liczby, nigdy treść: żadnego tekstu wiadomości, żadnego dokumentu, żadnej wartości sekretu ani jej podpowiedzi, a ustawienie trzymające poświadczenie jest raportowane jako ustawione albo nieustawione, nie wypisywane. --older-than to rozważany okres retencji, w dniach, a ostatnia kolumna jego tabeli retencji pokazuje, co ten okres już by usunął.

Jego ostatnia sekcja liczy bajty, których nie nazywa już żaden wiersz. Usunięcie konwersacji albo konta odpina teraz ich załączniki po commicie, więc ta ścieżka już do licznika nie dokłada; to, co jeszcze znajduje, pochodzi sprzed tamtych usunięć albo z odpięcia, którego zamiatanie best-effort nie dokończyło.

Katalog roboczy parsowania jest wyłączony, bo z założenia nie ma wiersza. Wygenerowane media są liczone, odkąd generated_media zapisuje każdy plik, więc to, co pojawia się pod katalogiem generated_<org>, to głównie plik wygenerowany, zanim ta tabela powstała, który odchodzi tylko razem ze swoją organizacją. Może to być też plik, którego odpięcie się nie udało po usunięciu jego wiersza, albo plik wciąż zapisywany, zanim powstał jego wiersz. Wszystko inne, co się tam liczy, to bajty, których produkt już nie znajdzie i nie umie usunąć. Raportuje katalog i liczbę, a nie nazwę pliku, bo zapisana ścieżka zachowuje nazwę, pod którą plik został wgrany.

Dwie sekcje czyta się z tego, co się wykonuje, a nie z tabeli. Cele zdolności wymieniają zdolności podpięte do agenta, które sięgają pod własny adres — web_research szuka przez DuckDuckGo bez żadnego poświadczenia, a więc bez wiersza gdziekolwiek indziej w raporcie — a Tracing czyta się z każdej wersji zdolnej do uruchomienia: domyślnej oraz tej, którą przypina każde nazwane środowisko, bo run przez to środowisko używa obserwowalności tamtej wersji, a nie domyślnej.

Czego żadna komenda nie wytworzy, to druga połowa tej strony: umowy, lokalizacje i wyłączenia z treningu z poprzedniej sekcji. Załącz je obok wyniku.

Otwarte warunki pierwszego wdrożenia

Spisane dla wdrożenia, pod które powstała ta strona, i prawdziwe dla każdego wdrożenia, dopóki każdy z nich się nie zamknie.

W kodzie, i trwałe:

  • Trace'y niosą pełną treść, chyba że agent ustawi observability.content na none. Nie ma stanu pośredniego z filtrem i nie będzie: częściowo wyczyszczony eksport to gwarancja, której nikt nie zaudytuje (#1616).
  • Treść w spoczynku należy do operatora. Treści wiadomości, dokumenty i ich wektory oraz workspace'y sandboksa to zwykłe kolumny i pliki; vault pieczętuje poświadczenia, nie treść. Pliki z uploadu mogą trafić do magazynu zgodnego z S3, który szyfruje je po swojej stronie, ale baza i wolumen mediów są chronione szyfrowaniem dysku albo wolumenu — albo wcale.

Zamknięte i opisane wyżej, a nie tutaj: dowód nienaruszalności śladu audytowego (#1622, #1648), tryb treści trace'u per agent i jego dziedziczenie przez specjalistów (#1413, #1699), trace'owanie w procesie wykonującym uruchomionego agenta (#1700), macierz kontroli HIPAA i SOC 2 w Bezpieczeństwie (#1412), usunięcie i eksport danych jednej osoby (#1421), backend S3 z szyfrowaniem po stronie serwera (#1423) oraz generyczne logowanie OIDC (#1419). Trace'y nie mają stanu pośredniego z filtrem i go nie dostaną (#1616); dla wdrożenia, które nie może eksportować treści, odpowiedzią jest none.

We wdrożeniu, rozstrzygane przez jego operatora: umowy, lokalizacje, wyłączenia z treningu, harmonogram retencji, wygaśnięcie kopii zapasowych, szyfrowanie dysku, ruch wychodzący sandboksa i strony prawne z poprzedniej sekcji. Każdy z nich to dowód, którego data-protection-report celowo nie wytwarza.

Przegląd, który zastanie każdy wiersz powyżej albo zamknięty, albo zaakceptowany na piśmie, ma to, co ta strona może mu dać. Reszta należy do wdrożenia.