feat(audit): A Audit-Transparenz + B Tabellen-Parse + D HTML-Tables aus DOM
CI / detect-changes (push) Successful in 10s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / test-python-backend (push) Successful in 45s
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 20s
CI / loc-budget (push) Failing after 17s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped

Drei zusammenhaengende Fixes fuer den VW-Befund (6 Vendors statt 100+):

A — audit_quality_checks.py: drei systemische Vorbehalte die IMMER prominent
gezeigt werden:
* banner_detected=False trotz Cookie-Doc → HIGH 'CMP-Tool ungeladen'
* cookie_doc >= 30k chars aber cmp_vendors < 15 → HIGH/MEDIUM
  'Vendor-Liste auffaellig kurz fuer Doc-Groesse'
* submitted URL aber 0/Mini-Text → MEDIUM 'URL nicht ladbar'
Rote Audit-Vorbehalt-Box ueber dem GF-1-Pager. GF-Summary sagt
'Audit unvollstaendig' statt faelschlich 'Keine kritischen Themen'.
gf_one_pager nimmt audit_quality_findings in top_findings auf
(BEVOR andere Findings).

B — cookies_table_parser laeuft jetzt auch auf gecrawltem Cookie-Doc-
Text (nicht nur bei User-Paste). Wenn der dsi-discovery-Response Tab/
Pipe-getrennte Tabellen-Reihen liefert, parsen wir sie deterministisch.

D — consent-tester/dsi-discovery extrahiert jetzt zusaetzlich zum
Text die <table>-Elemente aus dem DOM als list[str] (Tab-getrennt pro
Zeile, mind. 2 Zellen, mind. 3 Zeilen, max 10 Tabellen pro Doc). Backend
schleust diese als 'html_table'-cmp_payload ein und jagt sie zuerst durch
cookies_table_parser → 100% deterministische Vendor-Extraktion ohne LLM.

VW-Erwartung: aus der 65k-Cookie-Tabelle werden jetzt 30-50 Vendors
deterministisch geparst statt 6 vom LLM-Cascade.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-21 20:21:28 +02:00
parent e411c4f0d3
commit cb5dad1a2f
5 changed files with 382 additions and 16 deletions
@@ -77,10 +77,23 @@ def _collect_top_findings(
banner_result: dict | None,
scorecard: dict | None,
library_mismatch_findings: list[dict] | None,
audit_quality_findings: list[dict] | None = None,
limit: int = 5,
) -> list[dict]:
out: list[dict] = []
# 0) Audit-Quality-Vorbehalte (Banner-Detect-Fail, Vendor-thin) zuerst —
# die sind WICHTIGER als alle anderen Findings weil sie den Audit
# selbst infrage stellen.
for aq in (audit_quality_findings or []):
if isinstance(aq, dict):
out.append({
"severity": aq.get("severity", "HIGH"),
"label": aq.get("label", "Audit-Vorbehalt"),
"area": aq.get("area", "Audit-Qualitaet"),
"owner": aq.get("owner", "DSB + Web-Team"),
})
# 1) Banner deep-check findings (HIGH zuerst)
if banner_result:
for ph in (banner_result.get("phases") or {}).values():
@@ -172,6 +185,7 @@ def build_gf_one_pager_html(
banner_result: dict | None = None,
library_mismatch_findings: list[dict] | None = None,
scan_context: dict | None = None,
audit_quality_findings: list[dict] | None = None,
) -> str:
"""5-7-Bullet-Zusammenfassung. Leere Top-Findings: nur Status-Bullet."""
score = None
@@ -186,8 +200,10 @@ def build_gf_one_pager_html(
banner_result=banner_result,
scorecard=scorecard,
library_mismatch_findings=library_mismatch_findings,
limit=5,
audit_quality_findings=audit_quality_findings,
limit=6,
)
audit_warn = bool(audit_quality_findings)
n_high = sum(1 for f in top if f["severity"] == "HIGH")
n_med = sum(1 for f in top if f["severity"] == "MEDIUM")
@@ -243,12 +259,21 @@ def build_gf_one_pager_html(
)
if not bullets:
bullets.append(
'<li style="margin-bottom:4px;font-size:12px;color:#475569">'
'Keine kritischen Themen erkannt — der Audit-Lauf hat fuer '
'die geprueften Dokumente keine HIGH-Findings produziert. '
'Details im weiteren Verlauf der Mail.</li>'
)
if audit_warn:
bullets.append(
'<li style="margin-bottom:4px;font-size:12px;color:#991b1b">'
'<strong>Audit selbst war unvollstaendig</strong> — siehe '
'roten Audit-Vorbehalt-Block weiter unten. Eine pauschale '
'"alles ok"-Aussage ist auf Basis dieser Datenlage nicht '
'moeglich.</li>'
)
else:
bullets.append(
'<li style="margin-bottom:4px;font-size:12px;color:#475569">'
'Keine kritischen Themen erkannt — der Audit-Lauf hat fuer '
'die geprueften Dokumente keine HIGH-Findings produziert. '
'Details im weiteren Verlauf der Mail.</li>'
)
return (
'<div style="font-family:-apple-system,BlinkMacSystemFont,sans-serif;'
@@ -279,13 +304,22 @@ def build_gf_one_pager_html(
'<div style="font-size:11px;color:#475569;line-height:1.5;'
'padding:8px 10px;background:#fff;border:1px solid #e2e8f0;'
'border-radius:4px">'
'<strong>Realistische Einordnung:</strong> Wir analysieren das '
'Aussenbild Ihrer Website automatisiert — einzelne Findings koennen '
'durch interne Dokumentation bereits abgedeckt sein. Empfohlenes '
'Vorgehen: priorisierte Punkte mit DSB / Marketing / IT in einem '
'Termin durchsprechen (4-8 Wochen sind ein realistischer Zeitrahmen '
'fuer die Umsetzung). Eine pauschale Bussgeld-Erwartung leiten wir '
'aus diesem Audit nicht ab.'
'</div>'
+ (
'<strong style="color:#991b1b">Wichtig — Audit unvollstaendig:'
'</strong> An mindestens einer Stelle ist unser Crawler an '
'Grenzen gestossen (siehe roter Audit-Vorbehalt-Block weiter '
'unten). Diese Bereiche sollten manuell oder im Copy-Paste-Modus '
'nachgereicht werden, bevor eine belastbare Compliance-Aussage '
'getroffen wird.'
if audit_warn else
'<strong>Realistische Einordnung:</strong> Wir analysieren das '
'Aussenbild Ihrer Website automatisiert — einzelne Findings '
'koennen durch interne Dokumentation bereits abgedeckt sein. '
'Empfohlenes Vorgehen: priorisierte Punkte mit DSB / Marketing / '
'IT in einem Termin durchsprechen (4-8 Wochen sind ein '
'realistischer Zeitrahmen fuer die Umsetzung). Eine pauschale '
'Bussgeld-Erwartung leiten wir aus diesem Audit nicht ab.'
)
+ '</div>'
'</div>'
)