Decyzje Prezesa UODO z oficjalnego API portalu orzeczeń
Skill do praktyki decyzyjnej polskiego organu ochrony danych (Prezesa UODO). Sięga do
oficjalnego API Portalu Orzeczeń UODO (https://orzeczenia.uodo.gov.pl, uruchomionego
w 2025 r.): decyzje administracyjne Prezesa UODO — kary pieniężne, upomnienia, nakazy — oraz
powiązane orzeczenia sądów w tych sprawach. Używaj go, gdy pytanie dotyczy tego, jak UODO
stosuje RODO w praktyce: wysokość kar, przesłanki upomnienia, wymagania wobec analizy ryzyka,
zgłaszania naruszeń, powierzenia przetwarzania.
Podział ról (który skill do czego)
- Decyzje Prezesa UODO → ten skill. Kary, upomnienia, nakazy, umorzenia — z pełną treścią.
- Treść RODO → prawo-eu-eurlex (rozporządzenie 2016/679, CELEX 32016R0679); polska ustawa
o ochronie danych osobowych → prawo-pl-eli (Dz.U.).
- Wyroki WSA/NSA ze skarg na decyzje UODO → prawo-pl-cbosa. Portal UODO zna FAKT kontroli
sądowej (
decyzja drukuje blok „Kontrola sądowa": data, uchylona / utrzymana / w toku, sygnatura
wyroku), ale NIE ma treści wyroków — zakres uchylenia (cała decyzja czy np. sama kara) czytaj
w CBOSA: prawo-pl-cbosa sygnatura "<sygnatura wyroku>". Rekordy wyroków w listach portalu
(ok. 200 z 700) są bez treści — silnik nie oferuje dla nich decyzja, tylko odsyła do CBOSA.
- Delegując research subagentowi, wpisz: „decyzje UODO pobieraj przez
scripts/uodo.py
(skill prawo-pl-uodo); treść RODO przez scripts/eurlex.py (prawo-eu-eurlex)".
Narzędzie
Wszystko robi helper scripts/uodo.py (tylko biblioteka standardowa Pythona — bez instalacji).
Skrypt leży obok tego pliku SKILL.md (<katalog skilla>/scripts/uodo.py) — NIE zakładaj, że to
~/.claude/skills/prawo-pl-uodo (skill zainstalowany jako plugin leży w katalogu pluginów; w Claude
Code: ${CLAUDE_PLUGIN_ROOT}/skills/prawo-pl-uodo). Uruchamiaj wyłącznie helper z bieżącego pakietu:
# 1) Claude Code: przy ładowaniu skilla podstawia ${CLAUDE_PLUGIN_ROOT} (pełna ścieżka poniżej).
UODO="${CLAUDE_PLUGIN_ROOT}/skills/prawo-pl-uodo/scripts/uodo.py"
# 2) Codex / Claude Desktop / instalacja ręczna: katalog TEGO pliku SKILL.md (Claude Code podaje go
# jako „Base directory for this skill”, Codex w liście skilli) — podstaw go zamiast <katalog skilla>.
[ -f "$UODO" ] || UODO="<katalog skilla>/scripts/uodo.py"
# 3) Piaskownica (Cowork, czat z code execution): katalog pluginu bywa NIEWIDOCZNY dla powłoki — wtedy
# pobierz DOKŁADNIE tę wersję helpera (tag = wersja z nagłówka tego pliku). Suma SHA-256 jest
# sprawdzana w kodzie przed zapisem i przed każdym uruchomieniem; niezgodna = helper nie startuje.
[ -f "$UODO" ] || UODO=$(python3 - <<'EOF'
import hashlib, os, sys, urllib.request
WERSJA, SHA256 = "2.0.1", "be2c37fc830ffae0f6cf2a5e9178d40b0a861094a084fd70260d6180ac77775e"
URL = f"https://raw.githubusercontent.com/jamarpl21/prawo-pl-eli/v{WERSJA}/plugins/prawo-pl-uodo/skills/prawo-pl-uodo/scripts/uodo.py"
p = os.path.join(os.environ.get("TMPDIR", "/tmp"), f"prawo-pl-uodo-{WERSJA}", "uodo.py")
try:
dane = open(p, "rb").read() if os.path.exists(p) else urllib.request.urlopen(URL, timeout=30).read()
except Exception as e:
sys.exit(f"BŁĄD: nie udało się pobrać helpera ({e}). Bez helpera NIE cytuj prawa z pamięci ani z portali — poinformuj użytkownika.")
if hashlib.sha256(dane).hexdigest() != SHA256:
os.path.exists(p) and os.remove(p)
sys.exit("BŁĄD: suma SHA-256 helpera nie zgadza się z SKILL.md — helper NIE zostanie uruchomiony. Nie cytuj prawa z pamięci ani z portali — poinformuj użytkownika.")
os.makedirs(os.path.dirname(p), exist_ok=True); open(p, "wb").write(dane); print(p)
EOF
) && [ -f "$UODO" ] || exit 1
python3 "$UODO" <komenda> [...]
Nie szukaj helpera przez find po katalogach użytkownika ani systemu i nie pobieraj go z żadnego innego źródła niż przypięty tag z sumą wyżej (żadnego main, żadnej innej wersji z cache) — inna wersja helpera to inne wyniki.
(W przykładach niżej python3 scripts/uodo.py oznacza python3 "$UODO", jeśli nie jesteś w katalogu skilla.)
Komendy
- najnowsze — ostatnio WYDANE dokumenty (API sortuje po dacie decyzji/orzeczenia, nie po
dacie publikacji w portalu; starsze decyzje dopisane niedawno tu nie trafią):
python3 scripts/uodo.py najnowsze --limit 10
- szukaj — wyszukiwanie pełnotekstowe / po tytule / po dacie DECYZJI (
--od/--do) / po dacie
PUBLIKACJI w portalu (--pub-od/--pub-do):
python3 scripts/uodo.py szukaj "biometr" --limit 5
python3 scripts/uodo.py szukaj --tytul "pieniężn" --od 2026-01-01
python3 scripts/uodo.py szukaj --pub-od 2026-01-01 --pub-do 2026-03-31 --limit 100 (co opublikowano w Q1)
--od/--do filtrują po dacie wydania decyzji (tak działa API) — decyzja z 2025 r. opublikowana
w 2026 r. NIE wpadnie w --od 2026-01-01; do „co nowego w portalu" służy --pub-od. --pub-od
idzie do API, gdy nie ma innego warunku; z frazą/tytułem filtr publikacji działa tylko w obrębie
pobranej strony (silnik to wypisuje) — wtedy zwiększ --limit i przeglądaj --strona.
Fraza działa jak regex bez rozróżniania wielkości liter, dopasowuje DOSŁOWNIE — szukaj
RDZENIA słowa („biometr" znajdzie „biometryczne/biometrii"). Tytuły to zdania w formie
ODMIENIONEJ („nałożenie kary pieniężnej…"), więc mianownik („kara pieniężna") nie trafia
w nic — zero wyników z mianownika to NIE dowód, że takich decyzji nie ma.
API stosuje jeden warunek na zapytanie (fraza ALBO tytuł; zakres dat można łączyć
z warunkiem). Zaawansowane: --warunek "indeks:operator:wartość" (indeksy i operatory: references/api.md). --limit N, --strona N.
- decyzja — pełna decyzja po sygnaturze albo URN:
python3 scripts/uodo.py decyzja DKN.5131.9.2025
Pokazuje metadane (status, data decyzji i publikacji), blok „Kontrola sądowa" (każdy wyrok
z meta: data, UCHYLONA / utrzymana / w toku, sygnatura + odsyłacz do prawo-pl-cbosa), przedmiot
i pełną treść (z body.html portalu: numeracja list i przypisy [1] jak na stronie portalu).
Decyzja uchylona (także w części, przy statusie final) zaczyna się od nagłówka
„DECYZJA UCHYLONA PRZEZ SĄD (w całości lub w części)" — treść poniżej to tekst PIERWOTNY;
zakres uchylenia ustal w sentencji wyroku (CBOSA), zanim zacytujesz karę.
Do długich decyzji: --fragment "pieniężn" (wycina okna wokół frazy; też podawaj rdzeń).
Sygnatura sądowa (decyzja "III OSK 377/23") to rekord bez treści — silnik to wyjaśnia i odsyła do CBOSA.
- każda komenda przyjmuje
--json oraz --strict; obie flagi działają przed komendą i po niej.
Kontrakt --strict: w decyzja kończy błędem (bez wyniku, także z --json) decyzję bez pełnej
treści ORAZ decyzję z wpisem uchylenia przez sąd (komunikat podaje sygnaturę wyroku i odsyła do
CBOSA); decyzja NIEPRAWOMOCNA przechodzi z ostrzeżeniem „UWAGA: decyzja NIEPRAWOMOCNA".
W najnowsze/szukaj --strict nic nie zmienia (listy to metadane, nie ma czego weryfikować).
Zero trafień / nierozpoznana odpowiedź API kończą się komunikatem i kodem wyjścia ≠ 0 — także z --json
(nie dostaniesz pustego JSON-a, który wyglądałby jak „sprawdzone, nic nie ma”).
Typowy przepływ: szukaj "<rdzeń frazy>" → wybierz sygnaturę → decyzja <sygnatura>
→ jeśli blok „Kontrola sądowa" pokazuje wyrok: prawo-pl-cbosa sygnatura "<sygnatura wyroku>"
(zakres uchylenia / utrzymania); jeśli nie — i tak sprawdź CBOSA (szukaj "<sygnatura decyzji>"),
bo portal nie musi znać każdej skargi.
Zasady (ważne — dlaczego)
- Portal jest młody (od 2025 r.) — publikowane są nowe decyzje oraz sukcesywnie starsze
(sygnatury 2018–2024 pojawiają się z opóźnieniem). Brak decyzji w portalu ≠ jej nieistnienie
(silnik to wypisuje przy 404); sprawdź wyszukiwarkę https://uodo.gov.pl (dawne adresy
uodo.gov.pl/decyzje/<sygnatura> już nie działają) — i zaznacz to w odpowiedzi.
- Status
final ≠ kara się ostała; inforce ≠ w obrocie. status ∈ final (prawomocna wg
portalu) / nonfinal (nieprawomocna — dopisz zastrzeżenie; przysługuje skarga do WSA) / repealed
(uchylona). Kontrolę sądową portal zapisuje w dates[] (uchylona / utrzymana / w toku) i przy
statusie final może istnieć wpis uchylenia części decyzji (ZSPR.421.3.2018: kara 943 470 zł
uchylona przez WSA II SA/Wa 1030/19, status nadal final). Pole inforce API jest true nawet
dla decyzji uchylonych — nie cytuj go jako „w obrocie". Zanim podasz karę z decyzji z blokiem
„Kontrola sądowa", przeczytaj sentencję wyroku w CBOSA.
- Zawsze podawaj sygnaturę + datę (np. „decyzja Prezesa UODO z 7.08.2025, DKN.5131.9.2025")
— sygnatura jest stabilnym identyfikatorem (URN w API).
- Kwoty kar i stan prawny weryfikuj w treści decyzji, nie w tytule — tytuł to opis redakcyjny.
- Pełna lista endpointów, indeksów i operatorów:
references/api.md.
Czego ten skill NIE obejmuje
- treści RODO i innych przepisów (RODO → prawo-eu-eurlex; polskie ustawy → prawo-pl-eli),
- wyroków sądów administracyjnych ze skarg na decyzje UODO (→ prawo-pl-cbosa),
- orzeczeń SN/TK/sądów powszechnych (→ prawo-pl-saos),
- decyzji innych organów (UOKiK, KNF), wytycznych EROD (te bierz z edpb.europa.eu — internet).
Jeśli zagadnienie wymaga tych źródeł — powiedz to wprost, nie udawaj, że portal UODO je pokryje.
Przykładowy przepływ
Pytanie: „czy UODO nakładał kary za brak zgłoszenia naruszenia ochrony danych i jak je uzasadnia?"
szukaj "zgłoszen" --tytul "kara" → jeśli pusto: szukaj "art. 33" (jeden warunek na raz).
decyzja <sygnatura> --fragment "art. 33" → argumentacja organu wokół obowiązku zgłoszenia.
- (opcjonalnie) treść art. 33 RODO: skill prawo-eu-eurlex
(
tekst 02016R0679-20160504 --fragment "art. 33").
- Kontrola sądowa: blok „Kontrola sądowa" z
decyzja → prawo-pl-cbosa sygnatura "<wyrok>"
(zakres uchylenia); bez wpisów w bloku — prawo-pl-cbosa szukaj "<sygnatura decyzji>".
- W odpowiedzi: sygnatura + data + status (nieprawomocna? uchylona — w jakim zakresie?) + kwota
kary z treści decyzji, skorygowana o wynik kontroli sądowej.
1---2name: prawo-pl-uodo3description: Odpytuje OFICJALNE API Portalu Orzeczeń UODO (orzeczenia.uodo.gov.pl) — decyzje Prezesa Urzędu Ochrony Danych Osobowych: kary pieniężne za naruszenia RODO, upomnienia, nakazy, oraz powiązane orzeczenia sądów. Używaj przy pytaniach o praktykę polskiego organu ochrony danych: „czy UODO karał za…", „decyzja UODO w sprawie…", „jak UODO interpretuje art. X RODO", „jaka kara za brak analizy ryzyka/zgłoszenia naruszenia", przy DPIA, analizie naruszeń ochrony danych, audytach RODO i pismach do UODO. Wyszukiwanie pełnotekstowe i po tytule/dacie decyzji lub publikacji; pełna treść decyzji po sygnaturze (np. DKN.5131.9.2025) wraz z historią kontroli sądowej (uchylona / utrzymana / w toku). Read-only, bez klucza. Treść RODO → skill prawo-eu-eurlex; wyroki WSA/NSA ze skarg na decyzje UODO → prawo-pl-cbosa. Decisions of the Polish DPA (UODO) from its official public API.4---56# Decyzje Prezesa UODO z oficjalnego API portalu orzeczeń78Skill do **praktyki decyzyjnej polskiego organu ochrony danych** (Prezesa UODO). Sięga do9oficjalnego API **Portalu Orzeczeń UODO** (`https://orzeczenia.uodo.gov.pl`, uruchomionego10w 2025 r.): decyzje administracyjne Prezesa UODO — kary pieniężne, upomnienia, nakazy — oraz11powiązane orzeczenia sądów w tych sprawach. Używaj go, gdy pytanie dotyczy tego, **jak UODO12stosuje RODO w praktyce**: wysokość kar, przesłanki upomnienia, wymagania wobec analizy ryzyka,13zgłaszania naruszeń, powierzenia przetwarzania.1415## Podział ról (który skill do czego)16171. **Decyzje Prezesa UODO → ten skill.** Kary, upomnienia, nakazy, umorzenia — z pełną treścią.182. **Treść RODO → prawo-eu-eurlex** (rozporządzenie 2016/679, CELEX 32016R0679); polska ustawa19 o ochronie danych osobowych → **prawo-pl-eli** (Dz.U.).203. **Wyroki WSA/NSA ze skarg na decyzje UODO → prawo-pl-cbosa.** Portal UODO zna FAKT kontroli21 sądowej (`decyzja` drukuje blok „Kontrola sądowa": data, uchylona / utrzymana / w toku, sygnatura22 wyroku), ale NIE ma treści wyroków — zakres uchylenia (cała decyzja czy np. sama kara) czytaj23 w CBOSA: `prawo-pl-cbosa sygnatura "<sygnatura wyroku>"`. Rekordy wyroków w listach portalu24 (ok. 200 z 700) są bez treści — silnik nie oferuje dla nich `decyzja`, tylko odsyła do CBOSA.254. **Delegując research subagentowi**, wpisz: „decyzje UODO pobieraj przez `scripts/uodo.py`26 (skill prawo-pl-uodo); treść RODO przez `scripts/eurlex.py` (prawo-eu-eurlex)".2728## Narzędzie2930Wszystko robi helper `scripts/uodo.py` (tylko biblioteka standardowa Pythona — bez instalacji).31Skrypt leży **obok tego pliku SKILL.md** (`<katalog skilla>/scripts/uodo.py`) — NIE zakładaj, że to32`~/.claude/skills/prawo-pl-uodo` (skill zainstalowany jako plugin leży w katalogu pluginów; w Claude33Code: `${CLAUDE_PLUGIN_ROOT}/skills/prawo-pl-uodo`). Uruchamiaj wyłącznie helper z bieżącego pakietu:3435```36# 1) Claude Code: przy ładowaniu skilla podstawia ${CLAUDE_PLUGIN_ROOT} (pełna ścieżka poniżej).37UODO="${CLAUDE_PLUGIN_ROOT}/skills/prawo-pl-uodo/scripts/uodo.py"38# 2) Codex / Claude Desktop / instalacja ręczna: katalog TEGO pliku SKILL.md (Claude Code podaje go39# jako „Base directory for this skill”, Codex w liście skilli) — podstaw go zamiast <katalog skilla>.40[ -f "$UODO" ] || UODO="<katalog skilla>/scripts/uodo.py"41# 3) Piaskownica (Cowork, czat z code execution): katalog pluginu bywa NIEWIDOCZNY dla powłoki — wtedy42# pobierz DOKŁADNIE tę wersję helpera (tag = wersja z nagłówka tego pliku). Suma SHA-256 jest43# sprawdzana w kodzie przed zapisem i przed każdym uruchomieniem; niezgodna = helper nie startuje.44[ -f "$UODO" ] || UODO=$(python3 - <<'EOF'45import hashlib, os, sys, urllib.request46WERSJA, SHA256 = "2.0.1", "be2c37fc830ffae0f6cf2a5e9178d40b0a861094a084fd70260d6180ac77775e"47URL = f"https://raw.githubusercontent.com/jamarpl21/prawo-pl-eli/v{WERSJA}/plugins/prawo-pl-uodo/skills/prawo-pl-uodo/scripts/uodo.py"48p = os.path.join(os.environ.get("TMPDIR", "/tmp"), f"prawo-pl-uodo-{WERSJA}", "uodo.py")49try:50 dane = open(p, "rb").read() if os.path.exists(p) else urllib.request.urlopen(URL, timeout=30).read()51except Exception as e:52 sys.exit(f"BŁĄD: nie udało się pobrać helpera ({e}). Bez helpera NIE cytuj prawa z pamięci ani z portali — poinformuj użytkownika.")53if hashlib.sha256(dane).hexdigest() != SHA256:54 os.path.exists(p) and os.remove(p)55 sys.exit("BŁĄD: suma SHA-256 helpera nie zgadza się z SKILL.md — helper NIE zostanie uruchomiony. Nie cytuj prawa z pamięci ani z portali — poinformuj użytkownika.")56os.makedirs(os.path.dirname(p), exist_ok=True); open(p, "wb").write(dane); print(p)57EOF58) && [ -f "$UODO" ] || exit 159python3 "$UODO" <komenda> [...]60```6162Nie szukaj helpera przez `find` po katalogach użytkownika ani systemu i nie pobieraj go z żadnego innego źródła niż przypięty tag z sumą wyżej (żadnego `main`, żadnej innej wersji z cache) — inna wersja helpera to inne wyniki.6364(W przykładach niżej `python3 scripts/uodo.py` oznacza `python3 "$UODO"`, jeśli nie jesteś w katalogu skilla.)6566### Komendy6768- **najnowsze** — ostatnio WYDANE dokumenty (API sortuje po dacie decyzji/orzeczenia, nie po69 dacie publikacji w portalu; starsze decyzje dopisane niedawno tu nie trafią):70 `python3 scripts/uodo.py najnowsze --limit 10`71- **szukaj** — wyszukiwanie pełnotekstowe / po tytule / po dacie DECYZJI (`--od/--do`) / po dacie72 PUBLIKACJI w portalu (`--pub-od/--pub-do`):73 `python3 scripts/uodo.py szukaj "biometr" --limit 5`74 `python3 scripts/uodo.py szukaj --tytul "pieniężn" --od 2026-01-01`75 `python3 scripts/uodo.py szukaj --pub-od 2026-01-01 --pub-do 2026-03-31 --limit 100` (co opublikowano w Q1)76 `--od/--do` filtrują po dacie wydania decyzji (tak działa API) — decyzja z 2025 r. opublikowana77 w 2026 r. NIE wpadnie w `--od 2026-01-01`; do „co nowego w portalu" służy `--pub-od`. `--pub-od`78 idzie do API, gdy nie ma innego warunku; z frazą/tytułem filtr publikacji działa tylko w obrębie79 pobranej strony (silnik to wypisuje) — wtedy zwiększ `--limit` i przeglądaj `--strona`.80 Fraza działa jak **regex bez rozróżniania wielkości liter**, dopasowuje DOSŁOWNIE — szukaj81 RDZENIA słowa („biometr" znajdzie „biometryczne/biometrii"). Tytuły to zdania w formie82 ODMIENIONEJ („nałożenie kary pieniężnej…"), więc mianownik („kara pieniężna") nie trafia83 w nic — zero wyników z mianownika to NIE dowód, że takich decyzji nie ma.84 API stosuje **jeden warunek na zapytanie** (fraza ALBO tytuł; zakres dat można łączyć85 z warunkiem). Zaawansowane: `--warunek86 "indeks:operator:wartość"` (indeksy i operatory: `references/api.md`). `--limit N`, `--strona N`.87- **decyzja** — pełna decyzja po sygnaturze albo URN:88 `python3 scripts/uodo.py decyzja DKN.5131.9.2025`89 Pokazuje metadane (status, data decyzji i publikacji), **blok „Kontrola sądowa"** (każdy wyrok90 z meta: data, UCHYLONA / utrzymana / w toku, sygnatura + odsyłacz do prawo-pl-cbosa), przedmiot91 i pełną treść (z `body.html` portalu: numeracja list i przypisy `[1]` jak na stronie portalu).92 Decyzja uchylona (także w części, przy statusie `final`) zaczyna się od nagłówka93 **„DECYZJA UCHYLONA PRZEZ SĄD (w całości lub w części)"** — treść poniżej to tekst PIERWOTNY;94 zakres uchylenia ustal w sentencji wyroku (CBOSA), zanim zacytujesz karę.95 Do długich decyzji: `--fragment "pieniężn"` (wycina okna wokół frazy; też podawaj rdzeń).96 Sygnatura sądowa (`decyzja "III OSK 377/23"`) to rekord bez treści — silnik to wyjaśnia i odsyła do CBOSA.97- każda komenda przyjmuje `--json` oraz `--strict`; obie flagi działają przed komendą i po niej.98 **Kontrakt `--strict`:** w `decyzja` kończy błędem (bez wyniku, także z `--json`) decyzję bez pełnej99 treści ORAZ decyzję z wpisem uchylenia przez sąd (komunikat podaje sygnaturę wyroku i odsyła do100 CBOSA); decyzja NIEPRAWOMOCNA przechodzi z ostrzeżeniem „UWAGA: decyzja NIEPRAWOMOCNA".101 W `najnowsze`/`szukaj` `--strict` nic nie zmienia (listy to metadane, nie ma czego weryfikować).102 Zero trafień / nierozpoznana odpowiedź API kończą się komunikatem i kodem wyjścia ≠ 0 — także z `--json`103 (nie dostaniesz pustego JSON-a, który wyglądałby jak „sprawdzone, nic nie ma”).104105Typowy przepływ: `szukaj "<rdzeń frazy>"` → wybierz sygnaturę → `decyzja <sygnatura>`106→ jeśli blok „Kontrola sądowa" pokazuje wyrok: `prawo-pl-cbosa sygnatura "<sygnatura wyroku>"`107(zakres uchylenia / utrzymania); jeśli nie — i tak sprawdź CBOSA (`szukaj "<sygnatura decyzji>"`),108bo portal nie musi znać każdej skargi.109110## Zasady (ważne — dlaczego)1111121. **Portal jest młody (od 2025 r.)** — publikowane są nowe decyzje oraz sukcesywnie starsze113 (sygnatury 2018–2024 pojawiają się z opóźnieniem). Brak decyzji w portalu ≠ jej nieistnienie114 (silnik to wypisuje przy 404); sprawdź wyszukiwarkę https://uodo.gov.pl (dawne adresy115 `uodo.gov.pl/decyzje/<sygnatura>` już nie działają) — i zaznacz to w odpowiedzi.1162. **Status `final` ≠ kara się ostała; `inforce` ≠ w obrocie.** `status` ∈ final (prawomocna wg117 portalu) / nonfinal (nieprawomocna — dopisz zastrzeżenie; przysługuje skarga do WSA) / repealed118 (uchylona). Kontrolę sądową portal zapisuje w `dates[]` (uchylona / utrzymana / w toku) i przy119 statusie `final` może istnieć wpis uchylenia części decyzji (ZSPR.421.3.2018: kara 943 470 zł120 uchylona przez WSA II SA/Wa 1030/19, status nadal `final`). Pole `inforce` API jest `true` nawet121 dla decyzji uchylonych — nie cytuj go jako „w obrocie". Zanim podasz karę z decyzji z blokiem122 „Kontrola sądowa", przeczytaj sentencję wyroku w CBOSA.1233. **Zawsze podawaj sygnaturę + datę** (np. „decyzja Prezesa UODO z 7.08.2025, DKN.5131.9.2025")124 — sygnatura jest stabilnym identyfikatorem (URN w API).1254. **Kwoty kar i stan prawny weryfikuj w treści decyzji**, nie w tytule — tytuł to opis redakcyjny.1265. Pełna lista endpointów, indeksów i operatorów: `references/api.md`.127128## Czego ten skill NIE obejmuje129130- **treści RODO i innych przepisów** (RODO → **prawo-eu-eurlex**; polskie ustawy → **prawo-pl-eli**),131- **wyroków sądów administracyjnych** ze skarg na decyzje UODO (→ **prawo-pl-cbosa**),132- **orzeczeń SN/TK/sądów powszechnych** (→ **prawo-pl-saos**),133- decyzji innych organów (UOKiK, KNF), wytycznych EROD (te bierz z edpb.europa.eu — internet).134Jeśli zagadnienie wymaga tych źródeł — powiedz to wprost, nie udawaj, że portal UODO je pokryje.135136## Przykładowy przepływ137138Pytanie: „czy UODO nakładał kary za brak zgłoszenia naruszenia ochrony danych i jak je uzasadnia?"1391. `szukaj "zgłoszen" --tytul "kara"` → jeśli pusto: `szukaj "art. 33"` (jeden warunek na raz).1402. `decyzja <sygnatura> --fragment "art. 33"` → argumentacja organu wokół obowiązku zgłoszenia.1413. (opcjonalnie) treść art. 33 RODO: skill prawo-eu-eurlex142 (`tekst 02016R0679-20160504 --fragment "art. 33"`).1434. Kontrola sądowa: blok „Kontrola sądowa" z `decyzja` → `prawo-pl-cbosa sygnatura "<wyrok>"`144 (zakres uchylenia); bez wpisów w bloku — `prawo-pl-cbosa szukaj "<sygnatura decyzji>"`.1455. W odpowiedzi: sygnatura + data + status (nieprawomocna? uchylona — w jakim zakresie?) + kwota146 kary z treści decyzji, skorygowana o wynik kontroli sądowej.