diff --git a/backend-compliance/compliance/api/agent_doc_check_critical.py b/backend-compliance/compliance/api/agent_doc_check_critical.py index b4def9b0..89c38824 100644 --- a/backend-compliance/compliance/api/agent_doc_check_critical.py +++ b/backend-compliance/compliance/api/agent_doc_check_critical.py @@ -184,45 +184,66 @@ def build_critical_findings_html( scorecard: dict | None, results: list, ) -> str: - """Render der Critical-Findings-Box. Leerer String wenn keine Issues.""" + """Render der Audit-Zusammenfassung fuer die Geschaeftsfuehrung. + + P89: Co-Pilot-Tonalitaet statt Panik-Rot. + - Sachlich blau statt alarmistisch rot + - "Themen die besprochen werden sollten" statt "VERSTOESSE" + - Realistische Zeitschaetzung (4-8 Wochen) + - Buessgeld-Risiko in separater, dezenter Section ganz unten + - Konfidenz-Hinweis "False-Positives moeglich" + """ issues = _detect_critical_issues(banner_result, scorecard, results) if not issues: return "" items = [] - for i in issues: + for idx, i in enumerate(issues, 1): + # P87-Vorbereitung: keine HIGH-Badges mehr — wir nummerieren stattdessen items.append( - f'
' - f'
' + f'
' - f'{i["severity"]}{i["title"]}
' - f'
' - f'Sofortmassnahme: {i["action"]}
' - f'
Rechtsgrundlage: {i.get("source","")}' - + (f' · Praezedenz: {i["bussgeld"]}' - if i.get("bussgeld") else "") + - f'
' + f'Thema {idx}' + f'{i["title"]}
' + f'
' + f'Empfehlung: {i["action"]}
' + f'
Hintergrund: {i.get("source","")}
' + f'' ) n = len(issues) + plural = "Themen" if n != 1 else "Thema" return ( '
' - '
' - '🚨 Sofortmassnahmen erforderlich
' - f'

' - f'{n} kritische Compliance-Risiken mit Bussgeldpotenzial

' - '

' - 'Die folgenden Verstoesse sind durch Tool-Analyse belegt und ' - 'erfordern Sofortmassnahmen. Bussgeldrahmen nach Art. 83 DSGVO: ' - 'bis 4% des weltweiten Jahresumsatzes.

' + 'background:#f0f9ff;border:1px solid #bfdbfe;border-radius:10px">' + '
' + 'Zusammenfassung fuer die Geschaeftsfuehrung
' + f'

' + f'{n} {plural} zur Besprechung mit DSB, Marketing und Entwicklung

' + '

' + 'Wir haben Datenschutzerklaerung, Cookie-Banner, Impressum und ' + 'eingebundene Anbieter technisch analysiert. Die folgenden Punkte ' + 'sollten in den naechsten Wochen geklaert werden — typische ' + 'Umsetzungsdauer 4-8 Wochen (DSB-Review → Marketing-Agentur ' + '→ Entwicklung → Freigabe). Detaillierte technische ' + 'Analyse mit weiteren Findings finden Sie unten.

' + "".join(items) + + '
' + 'Hinweis: Automatisierte ' + 'Audits enthalten False-Positives. Wo unsicher, bitte mit DSB pruefen ' + 'oder uns Feedback geben — wir lernen daraus. ' + 'Rechtliche Risiken (Bussgeld-Rahmen Art. 83 DSGVO bis 4 % des ' + 'weltweiten Jahresumsatzes, realistisch 0,1-1 % bei Erstverstoss ' + 'nach CNIL/LfDI-Massstab) werden weiter unten pro Finding eingeordnet.' + '
' '
' ) diff --git a/backend-compliance/compliance/api/vvt_table_renderer.py b/backend-compliance/compliance/api/vvt_table_renderer.py index 0a8b2640..2d9cb06e 100644 --- a/backend-compliance/compliance/api/vvt_table_renderer.py +++ b/backend-compliance/compliance/api/vvt_table_renderer.py @@ -161,14 +161,26 @@ def build_vvt_table_html(vendors: list[dict]) -> str: 'max-width:760px;margin:0 auto 16px;padding:12px 16px;' 'background:#fafafa;border:1px solid #e5e7eb;border-radius:8px">', '

' - 'VVT-Vorschlag: Verarbeitungstaetigkeiten und Empfaenger aus der ' - 'Cookie-Richtlinie

', - f'

{summary}. ' - 'Gruppiert nach Empfaengerkategorie (Art. 30(1)(d) DSGVO). Innerhalb ' - 'jeder Gruppe nach Compliance-Score sortiert. Bei eigenen ' - 'Verarbeitungen (INTERNAL/GROUP) werden Opt-Out und Privacy-Link ' + 'Vorschlag fuer das Verarbeitungsverzeichnis (Art. 30 DSGVO)', + # P91: Co-Pilot-Tonalitaet — Wahrscheinlichkeit statt Garantie, + # Empfehlung statt "Verstoss-Liste". + f'

' + f'Wir haben {n_total} Verarbeitungen aus dem ' + f'Cookie-Banner abgeleitet, mit unserer globalen Anbieter-Bibliothek ' + f'abgeglichen und nach Empfaengerkategorie (Art. 30(1)(d) DSGVO) ' + f'gruppiert. Bei einer Reduktion der eingebundenen Anbieter, dem ' + f'Wechsel zu europaeischen Alternativen und konsequenter Pruefung ' + f'der tatsaechlich benoetigten Cookies ist eine Reduktion des ' + f'Tracking-Footprints sowie Lizenz-Einsparungen wahrscheinlich. ' + f'Eine fundierte Bewertung erfordert die Abstimmung mit dem ' + f'Datenschutzbeauftragten.

' + f'

' + f'{summary}. Innerhalb jeder Gruppe nach Verbesserungspotenzial ' + f'sortiert. Bei eigenen Verarbeitungen (INTERNAL/GROUP) sind ' + f'Opt-Out und Privacy-Link ' 'NICHT als Pflicht gewertet — der Widerruf erfolgt ueber das ' - 'Cookie-Banner, Privacy ist in der Haupt-DSI dokumentiert.

', + 'nicht erforderlich (Widerruf ueber Banner, Privacy in der ' + 'Haupt-Datenschutzerklaerung dokumentiert).

', pattern_notice, ] diff --git a/consent-tester/services/banner_dom_walkers.py b/consent-tester/services/banner_dom_walkers.py index e0c1400f..d9b1eea2 100644 --- a/consent-tester/services/banner_dom_walkers.py +++ b/consent-tester/services/banner_dom_walkers.py @@ -30,6 +30,38 @@ SHADOW_BANNER_WALKER_JS = """() => { for (const k of LEGAL_KW.dse) if (t.includes(k)) return 'dse'; return null; } + // P76: EXTENDED — scan ANY clickable element by label, not just + // or named web-components. Mercedes uses small secondary + // buttons below the main 3 actions: "Datenschutzerklaerung" + "Impressum" + // as /