From 7938e377b6c2180c724060a2b55def3e0cb1fd92 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 21 May 2026 11:24:57 +0200 Subject: [PATCH] =?UTF-8?q?feat(audit-tonality):=20P89/P76/P91=20=E2=80=94?= =?UTF-8?q?=20Co-Pilot=20statt=20Roboter-Anwalt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User-Feedback in einer Session: "Wir erzeugen nur Panik. Egal was da steht, es dauert Wochen. Wir sind Tool an der Seite von CMO/GF/CIO, nicht Gegner." Memory: feedback_breakpilot_tonalitaet.md (gilt fuer ALLE Module + Marketing). P89 Critical-Findings-Block ENTFERNT/UMGEBAUT — keine Panik-Rot-Box mehr. - Statt "🚨 SOFORTMASSNAHMEN ERFORDERLICH" -> "Zusammenfassung fuer die Geschaeftsfuehrung", blauer dezenter Block - Statt "VERSTOSSE" -> "Themen zur Besprechung mit DSB, Marketing und Entwicklung" - Statt "Bussgeldrahmen 4% Weltumsatz" als Erstes -> realistische Einordnung (0,1-1%) in dezenter Schluss-Notiz mit Konfidenz-Hinweis - "Sofortmassnahme" -> "Empfehlung" - "Themen 1, 2, 3..." statt "HIGH"-Badges (P87-Vorbereitung) - Explizite Zeitschaetzung "4-8 Wochen (DSB -> Agentur -> Dev -> Freigabe)" P76 Mercedes-Sekundaer-Buttons (Datenschutzerklaerung + Impressum klein unter den 3 Haupt-Buttons) erkennen. Walker scant jetzt label-basiert ALLE klickbaren Elemente im Shadow-DOM (wb7-link, wb7-link-secondary, wb7-button-text, span[onclick], small a, [role=button], etc.). Vermeidet Mercedes-Impressum-False-Positive der Phase 1. P91 VVT-Tabellen-Renderer in neuer Co-Pilot-Tonalitaet. Statt "Verstoss-Liste mit Bussgeldpotenzial" -> Wahrscheinlichkeits-Aussage: "Bei Anbieter-Reduktion + Wechsel zu europaeischen Alternativen ist Reduktion des Tracking-Footprints + Lizenz-Einsparung wahrscheinlich. Fundierte Bewertung erfordert DSB-Abstimmung." BMW-Bug B1-B4 (P90) bewusst nicht in diesem Commit: BMW-Lauf hat ePaaS 4x captured im consent-tester, aber Backend bekommt 0 cmp_payloads. Wiring-Bug zwischen consent-tester /dsi-discovery und Backend _fetch_text — eigene Diagnose-Session noetig (siehe Task P90). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../api/agent_doc_check_critical.py | 73 ++++++++++++------- .../compliance/api/vvt_table_renderer.py | 26 +++++-- consent-tester/services/banner_dom_walkers.py | 51 +++++++++---- 3 files changed, 101 insertions(+), 49 deletions(-) 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 /