Systemowy model łączenia junior agentów w spójne workflow — oparty na jednej kanonicznej sprawie, warstwie intencji i agentach-normalizatorach. Dokument jest żywym planem: agenty oznaczone ⚠ DO ZBUDOWANIA wynikają z analizy use case'ów.
Agenty działają poprawnie lokalnie, ale globalnie się rozjeżdżają — bo brakuje wspólnej struktury sprawy i warstwy intencji.
System pyta o KRS, potem o nazwę, potem o PESEL — bo każdy junior agent ma własne wejście bez wiedzy o tym, co już zebrały poprzednie. Użytkownik nie rozumie, dlaczego te pytania się pojawiają.
Jeden agent produkuje beneficjenci (lista), następny oczekuje płaskiego pesel. Nie ma konwencji kluczy, więc agenty nie widzą nawzajem swoich danych.
Zielony przycisk „przekazuje" to akcja techniczna, a nie krok rozumiany przez użytkownika. System nie pyta „co chcesz osiągnąć?" — od razu uruchamia agenty, zanim wiadomo dla kogo i po co.
Canonical Case Model — jeden słownik kluczy ctx dla wszystkich agentów. Intake Agent — jeden agent zbierający dane na starcie. Szablony intencji — gotowe senior agenty dla każdego celu, zamiast ręcznego składania.
Każdy agent (istniejący i nowy) trzyma się tego zestawu nazw kluczy ctx. To README-owa konwencja — nie nowa baza danych, nie migracje.
// ── Identyfikacja podmiotu ──────────────────────────────────
"podmiot_typ" // "osoba" | "spolka" | "nieznany"
"podmiot_nazwa" // pełna nazwa firmy lub osoby
"podmiot_krs" // numer KRS (gdy spółka)
"podmiot_pesel" // PESEL (gdy osoba fizyczna)
"podmiot_nip" // NIP (opcjonalnie)
// ── Intencja i zakres ───────────────────────────────────────
"intencja" // "screening" | "due_diligence" | "monitoring" | "onboarding"
"zakres_analizy" // ["knf", "krz", "policja", "crbr", ...]
// ── Dane beneficjenta (po CRBR + wyodrębnieniu) ─────────────
"podmiot_nazwa_osoby" // "Kowalski Jan" — dla checków osobowych
"query" // alias: imię+nazwisko lub nazwa — dla agentów bez canonical klucza
// ── Wyniki checków (produkowane przez istniejące agenty) ─────
"knf_status" // "brak_ostrzezen" | "ostrzezenie" | "blad"
"poszukiwani_status" // "brak_wynikow" | "znaleziono" | "blad"
"krz_status" // "brak_wynikow" | "znaleziono" | "blad"
"beneficjenci" // lista z CRBR: [{imie, nazwisko, pesel, ...}]
// ── Wynik syntetyczny (produkowany przez konsolidację) ───────
"ryzyko_poziom" // "niskie" | "srednie" | "wysokie" | "krytyczne"
"alerty" // [{zrodlo, opis, powaga}]
"podsumowanie" // jeden akapit po polsku
Istniejące agenty już produkują te dane — tylko pod różnymi nazwami. Nowe agenty piszemy pod ten słownik od razu. Pole pipeline_source w manifestach pozwala mapować stary klucz na nowy bez zmiany kodu agenta.
Każdy rozwiązuje konkretny problem systemowy — nie tylko AML. Działają razem lub osobno.
Jedno pole swobodne — może być KRS, PESEL, NIP, nazwa, opis. Agent sam wykrywa typ.
beneficjenci do płaskich kluczy ctx. Rozwiązuje systemowo problem lista→skalar dla każdego pipeline'u z listą obiektów.Z poprzedniego agenta (CRBR). Jeśli beneficjentów > 1, disambiguation pyta użytkownika który wybrać — reużywając istniejący mechanizm pipeline.
source_list (domyślnie: beneficjenci) · source_index (domyślnie: 0) · pola: field_pesel, field_imie, field_nazwisko. Konfigurowalny dla innych typów list.Zbiera automatycznie co znajdzie w ctx — agnostyczny wobec tego, które checki zostały uruchomione.
status = "znaleziono" → ryzyko_poziom = "wysokie". Mnożenie alertów z wielu źródeł → "krytyczne". Python stdlib.Zamiast budować skomplikowany router kodu — każdy cel użytkownika ma swój senior agent z gotowym pipeline'em. Biblioteka rośnie razem z use case'ami.
Konwencja: każdy nowy use case = nowy senior agent. Nie zmieniane są istniejące agenty — tylko dodawane nowe szablony. Pole
intencje w manifeście każdego junior agenta
(np. ["screening", "aml_spolka"])
stanie się podstawą pod przyszły auto-composer pipeline'u.
Co wchodzi, co wychodzi, gdzie ctx jest gotowy bez przerywania użytkownika.
podmiot_nazwa jako query. Daje pelna_nazwa i wybrany_krs.wybrany_krs jako numer_krs (pipeline_source — bez pytania człowieka).podmiot_pesel i query (Nazwisko Imię). Disambiguation jeśli >1.pelna_nazwa z ctx — bez pytania człowieka.query (Nazwisko Imię) z ctx — bez pytania człowieka.podmiot_pesel (alias: pesel) z ctx — bez pytania człowieka.*_status. Produkuje jedno ryzyko, listę alertów i podsumowanie po polsku.Efekt: zero przerwań w trakcie
Po wdrożeniu kroków 1–4 użytkownik jest pytany raz na starcie (przez intake) — a następnie pipeline przechodzi wszystkie 8 kroków bez dodatkowych pytań.
Use case'y AML wskazują co dalej. Każdy brakujący agent to sygnał do rozbudowy bazy junior agentów.
pipeline_source: "wybrany_krs" do pola numer_krs. Infrastruktura już to obsługuje.intencje: [...] do każdego manifest.json. Podstawa pod przyszły auto-composer.