# Plan: Banner-Check auf Dokumentenpruefungs-Qualitaet upgraden ## Ziel Die 22 bestehenden Banner-Checks auf das gleiche Qualitaetsniveau bringen wie die 138 Dokumenten-Checks: L1/L2-Hierarchie, Expert-Level Hints mit EuGH/CNIL/DSK-Referenzen, strukturiertes CheckItem-Format. ## Bestehende 22 Checks (Inventar) ### Banner Text & Verhalten (1-11) 1. `impressum_link` — Impressum aus Banner erreichbar 2. `dse_link` — DSE-Link im Banner 3. `wrong_dse_consent` — Falsche Formulierung ("Zustimmung zur DSE") 4. `reject_button_visible` — Ablehnen-Button sichtbar 5. `pre_ticked_checkboxes` — Vorausgewaehlte Checkboxen (EuGH Planet49) 6. `dark_pattern_button_size` — Akzeptieren groesser als Ablehnen 7. `cookie_wall` — Seite nach Ablehnung nutzbar 8. `re_access_settings` — Einstellungen erneut zugaenglich 9. `third_party_dse_link` — DSE zeigt auf eigene Seite 10. `dark_pattern_language` — Manipulative Sprache 11. `non_modal_dismiss` — Klick ausserhalb = keine Einwilligung ### Advanced Compliance (12-20) 12. `click_count_asymmetry` — Gleiche Klickanzahl fuer Accept/Reject 13. `color_contrast_dark_pattern` — Ablehnen-Button nicht unsichtbar 14. `google_consent_mode_defaults` — GCM Default = denied 15. `cookies_before_consent` — Keine Cookies vor Consent 16. `registration_consent_coupling` — Koppelungsverbot Art. 7(4) 17. `banner_language_mismatch` — Sprache = Seitensprache 18. `consent_cookie_expiry_13m` — Max 13 Monate (CNIL) 19. `nudging_reject_hidden` — Ablehnen nicht versteckt 20. `stirring_emotional_language` — Emotionale Manipulation ### Phasen-basiert (21-22) 21. `tracking_before_consent` — Tracking vor Einwilligung 22. `tracking_after_reject` — Tracking nach Ablehnung ## Geplante L1/L2-Struktur ### L1: Banner-Grundanforderungen (6 Checks) | ID | Label | Prueft | |----|-------|--------| | banner_present | Banner vorhanden | Wird ein Cookie-Banner angezeigt? | | banner_choices | Wahlmoeglichkeit | Akzeptieren UND Ablehnen moeglich? | | banner_legal_links | Rechtliche Links | Impressum + DSE erreichbar? | | banner_consent_valid | Gueltige Einwilligung | Keine Pre-Ticked Boxes, kein Auto-Consent? | | banner_pre_consent | Keine Vorab-Cookies | Keine Tracking-Cookies vor Consent? | | banner_post_reject | Ablehnung respektiert | Tracking stoppt nach Ablehnung? | ### L2: Detail-Checks pro L1 (30+ Checks) #### Unter "banner_choices" (Wahlmoeglichkeit): - reject_visible — Ablehnen-Button sichtbar auf erster Ebene - reject_same_clicks — Gleiche Klickanzahl wie Akzeptieren - reject_same_size — Gleiche Buttongroesse (kein Dark Pattern) - reject_same_prominence — Gleiche Farbgebung/Kontrast - reject_no_scroll — Ablehnen ohne Scrollen erreichbar - reject_no_nudging — Kein Nudging/Stirring #### Unter "banner_legal_links": - impressum_accessible — Impressum trotz Overlay erreichbar - dse_link_present — DSE-Link im Banner vorhanden - dse_link_own — DSE zeigt auf eigene Seite (nicht Drittanbieter) - dse_readable — DSE ist vor Einwilligung einsehbar #### Unter "banner_consent_valid": - no_pre_ticked — Keine vorausgewaehlten Checkboxen - no_wrong_wording — Keine "Zustimmung zur DSE" - no_modal_dismiss — Klick ausserhalb != Einwilligung - no_coupling — Kein Koppelungsverbot-Verstoss - no_emotional_language — Keine manipulative Sprache - consent_revocable — Einstellungen erneut zugaenglich (Art. 7(3)) - consent_expiry — Consent-Cookie max 13 Monate (CNIL) #### Unter "banner_pre_consent": - no_tracking_scripts — Keine Tracking-Scripts vor Consent - no_tracking_cookies — Keine Tracking-Cookies vor Consent - gcm_default_denied — Google Consent Mode Default = denied - no_facebook_pixel — Kein Meta Pixel vor Consent - no_google_analytics — Kein GA vor Consent #### Unter "banner_post_reject": - tracking_stops — Tracking-Scripts entfernt nach Ablehnung - cookies_removed — Tracking-Cookies entfernt nach Ablehnung - no_new_tracking — Keine neuen Tracker nach Ablehnung - site_functional — Seite bleibt nutzbar (kein Cookie-Wall) #### Unter "banner_present": - banner_language — Sprache = Seitensprache - banner_provider_named — CMP-Anbieter identifizierbar ## Expert-Level Hints (Beispiele) ### Dark Pattern Button-Groesse: "EDPB Guidelines 3/2022 (Deceptive Design Patterns), Rn. 62: Akzeptieren und Ablehnen muessen 'gleichwertig praesentiert' werden. Konkret: Gleiche Schriftgroesse, Buttongroesse und Farbprominenz. Die CNIL hat Google (150 Mio. EUR) und Facebook (60 Mio. EUR) u.a. wegen Klick-Asymmetrie bestraft." ### Pre-Consent Tracking: "§25 Abs. 1 TDDDG: Zugriff auf Endgeraet (Cookie setzen, Script laden) erst NACH informierter Einwilligung. Tracking vor Banner-Interaktion ist ein Verstoss. Haeufig: Google Tag Manager laedt GA4 bereits beim Seitenaufruf — GTM selbst ist erlaubt, die darin konfigurierten Tags muessen aber consent-gesteuert sein." ### Cookie-Wall: "EDPB Guidelines 05/2020, Rn. 39: Verweigerung der Einwilligung darf nicht dazu fuehren, dass die Website nicht mehr nutzbar ist (sog. 'Cookie Wall'). Ausnahme: Paywall-Modelle ('Consent or Pay') sind nach EDPB Opinion 08/2024 unter engen Bedingungen zulaessig." ### Consent-Cookie Laufzeit: "CNIL-Leitlinie (Dez. 2020): Consent-Entscheidung darf max. 13 Monate gespeichert werden. Danach muss erneut gefragt werden. Viele CMPs setzen Default auf 365 Tage — das ist noch im Rahmen. Ueber 395 Tage ist ein Verstoss." ## Technische Umsetzung ### Phase 1: Banner-Check Datenmodell (Backend) - Neues Package `consent-tester/checks/` mit L1/L2-Struktur - Jeder Check bekommt: id, label, level, parent, severity, hint - Runner aggregiert Checks und berechnet Scores - Response-Format analog zu DocCheckResult (completeness_pct, correctness_pct) ### Phase 2: Consent-Tester Integration - Bestehende Checks (banner_text_checker, banner_advanced_checks) mappen auf neue L1/L2-Struktur - Phasen-Violations als L2-Checks unter banner_pre_consent / banner_post_reject - Tracking-Services als Evidence (matched_text) ### Phase 3: Frontend - BannerCheckTab zeigt L1/L2 hierarchisch (wie ChecklistView) - 3-Phasen-Zusammenfassung oben - Fortschrittsbalken (gruen/blau) - Hints unter fehlgeschlagenen Checks ### Phase 4: Email-Report - Gleiche HTML-Formatierung wie Dokumentenpruefung - Hints + Evidence + Phase-Zuordnung ## Dateien | Datei | Aktion | |-------|--------| | consent-tester/checks/__init__.py | Neu: L1/L2 Check-Definitionen | | consent-tester/checks/banner_checks.py | Neu: 6 L1 + 30 L2 Checks mit Hints | | consent-tester/checks/runner.py | Neu: Aggregation + Scoring | | consent-tester/services/consent_scanner.py | Anpassen: Neues Response-Format | | backend-compliance/compliance/api/agent_doc_check_routes.py | Erweitern: Banner-Result-Mapping | | admin-compliance/app/sdk/agent/_components/BannerCheckTab.tsx | Erweitern: ChecklistView-Integration | ## Geschaetzter Aufwand ~3-4 Stunden: - 1h: L1/L2 Check-Definitionen + 36 Expert-Level Hints - 1h: Consent-Tester Mapping + Runner - 0.5h: Backend Response-Mapping - 0.5h: Frontend Integration - 0.5h: Test + Deploy + Ground Truth