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
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:
@@ -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>'
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user