---
.../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).