feat: Plan B + A + C — DSE-Versions-MCs + Legacy-URL + Multi-Version
CI / detect-changes (push) Successful in 7s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / loc-budget (push) Failing after 11s
CI / python-lint (push) Has been skipped
CI / test-python-backend (push) Successful in 28s
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / build-sha-integrity (push) Failing after 4s
CI / validate-canonical-controls (push) Successful in 10s
CI / go-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped

Drei verwandte Mechanismen für DSE-Beweisbarkeit + URL-Hygiene.

Plan B + PDF — Versions-Beweisbarkeit-MCs (dse_checks.py):
  - mc-dse_version_date (HIGH) — sichtbares Stand/Versionsdatum
    Pflicht. 12 Regex-Pattern: "Stand: April 2024", ISO-Datum,
    "Letzte Aktualisierung", "Version 3.2", englische
    Varianten ("Last updated", "Effective date as of …").
    Norm: Art. 7 Abs. 1 DSGVO (Nachweisbarkeit Einwilligung).
  - mc-dse_version_proof (MED) — PDF-Download oder
    versionierte Archiv-URL. Reine HTML-DSE ohne Snapshot ist
    juristisch fragil. 8 Pattern: .pdf, Download-Hinweis,
    web.archive.org, /dse-vNNN.html.
    Norm: DSK-Orientierungshilfe 2024.

Plan A — Legacy-URL-Discovery (legacy_url_discovery.py + B20):
  Vier komplementäre Quellen:
    A.1 /sitemap.xml + Sub-Sitemaps parsen, auf compliance-
        relevante Slugs filtern
    A.2 archive.org/wayback/available pro Slug — wenn Wayback
        zeigt ≥18 Monate alten Snapshot UND Seite heute noch
        200 liefert UND nicht im Footer → Legacy-Verdacht
    A.3 Slug-Permutations: 6 doc_types × 6 Slug-Varianten ×
        5 Lang-Prefixe × 4 Brand-Parameter
    A.4 Banner-Modal-Links (über consent-tester Stufe 4 Tour)
  Mail-Block "🗂️ Legacy-URL-Inventar" mit Tabelle: URL · HTTP ·
  Wayback-Alter · Footer · Empfehlung (301/Offline/Behalten).
  Engine entscheidet NICHT was Legacy ist — präsentiert das
  Inventar, Kunde wählt.

  Real-World-Smoke Elli:
    /en/cookies → HTTP 200, Wayback 69 Mo alt, nicht im Footer
                  → "Legacy-Verdacht, 301 setzen"
    /en/impressum → HTTP 302, redirected → "behalten"

Plan C — Multi-Version-DSE-Analyse (multi_version_dse.py):
  Wenn ≥2 DSE-URLs reachable: pro Variante DSB-Name + Datum +
  Wortzahl + SHA-256 extrahieren, Inkonsistenzen flaggen
  (date_divergent, dsb_divergent, no_date_count).
  Mail-Block "📑 Mehrere DSE-Versionen erkannt" mit
  Vergleichstabelle + rotem Hinweis "Nur eine Version kann
  gültig sein". Beispiel Elli: /de/datenschutz (Mollstr-DSB,
  2022) vs /de/datenschutzerklaerung?brand=elli (Proliance,
  ohne Datum).

API-Response erweitert um legacy_url_inventory +
html_blocks.legacy_urls + multi_version_dse_html im V2-Layout.

ENV-Override: LEGACY_URL_DISABLED=1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-08 10:04:14 +02:00
parent 663a1c3e38
commit 5c5d676f01
7 changed files with 715 additions and 0 deletions
@@ -411,4 +411,75 @@ ART13_CHECKLIST = [
"severity": "LOW",
"hint": "Vollstaendigen Namen, Adresse und Website der Aufsichtsbehoerde angeben. Haeufiger Fehler: 'die zustaendige Aufsichtsbehoerde' ohne Konkretisierung. Korrekt z.B.: 'LfDI BW, Koenigstrasse 10a, 70173 Stuttgart, www.baden-wuerttemberg.datenschutz.de'.",
},
# ── L1: Versionsdatum / Nachweisbarkeit der Einwilligung ─────────
#
# Art. 7 Abs. 1 DSGVO verlangt vom Verantwortlichen, die Einwilligung
# NACHWEISEN zu koennen — inkl. WELCHEM Stand der DSE der Nutzer
# zugestimmt hat. Ohne Datum/Versionsnummer ist das nicht moeglich.
{
"id": "dse_version_date",
"label": "Stand/Versionsdatum der DSE auffindbar",
"level": 1, "parent": None,
"patterns": [
# "Stand: April 2024", "Stand Januar 2026"
r"stand:?\s*(?:januar|februar|m(?:ae|ä)rz|april|mai|juni|juli|"
r"august|september|oktober|november|dezember)\s+\d{4}",
# "Stand: 01.04.2024", "Stand 04/2024", "Stand 2024-04-01"
r"stand:?\s*\d{1,2}[./-]\d{1,2}[./-]\d{2,4}",
r"stand:?\s*\d{4}-\d{2}(?:-\d{2})?",
r"stand:?\s*\d{1,2}/\d{2,4}",
# "Letzte Aktualisierung: …", "Zuletzt geaendert: …"
r"letzte\s+(?:aktualisierung|(?:ae|ä)nderung|anpassung)",
r"zuletzt\s+(?:ge)?(?:ae|ä)ndert",
r"g(?:ue|ü)ltig\s+(?:ab|seit|f(?:ue|ü)r)",
r"version\s+\d+[.\d]*",
r"version:?\s*v?\d+\.\d+",
# Englisch
r"last\s+(?:updated|modified|revised|amended)",
r"effective\s+(?:date|as\s+of)",
r"as\s+of\s+(?:january|february|march|april|may|june|july|"
r"august|september|october|november|december)\s+\d{4}",
],
"severity": "HIGH",
"hint": (
"Art. 7 Abs. 1 DSGVO: Verantwortlicher muss NACHWEISEN koennen, "
"welcher DSE-Version der Nutzer zugestimmt hat. Ohne ein "
"sichtbares Versionsdatum / 'Stand: …' ist die Einwilligung "
"nicht beweisbar — Aufsichtsbehoerden + Verbraucherzentralen "
"stossen genau hier nach. Korrekt: 'Stand: Januar 2026' oder "
"'Version 3.2 — gueltig ab 01.01.2026' sichtbar am Anfang oder "
"Ende der DSE."
),
},
{
"id": "dse_version_proof",
"label": "Versions-eindeutige Beweis-Verankerung (PDF / Download / Archiv-Link)",
"level": 2, "parent": "dse_version_date",
"patterns": [
# PDF-Download verfuegbar
r"\.pdf\b",
r"(?:dse|datenschutz|privacy)[\w\-]*\.pdf",
# Download-Hinweis
r"(?:dse|datenschutzerkl(?:ae|ä)rung|datenschutzhinweis(?:e)?)"
r"[^.]{0,80}herunterladen",
r"als\s+pdf\s+(?:herunterladen|speichern|laden|verf(?:ue|ü)gbar)",
r"download[^.]{0,40}(?:dse|datenschutzerkl|privacy|policy)",
# Konkrete Versions-URL (Wayback / Archiv / versionierte URL)
r"web\.archive\.org",
r"version[\-_]?archive",
r"(?:dse|privacy)-v?\d+[.\d]*\.html?",
],
"severity": "MEDIUM",
"hint": (
"Beste-Praxis nach DSK-Orientierungshilfe 2024: fuer den Beweis "
"der konkreten DSE-Version sollte zusaetzlich zur Web-Version "
"ein PDF-Download oder ein versionierter Archiv-Link verfuegbar "
"sein. Reine HTML-DSE ohne Snapshot ist juristisch fragil — "
"der Anbieter kann die DSE jederzeit aendern und das Original "
"ist nicht mehr nachweisbar. Empfehlung: 'Aktuelle DSE als PDF "
"herunterladen' im Kopfbereich, oder eindeutige Versions-URLs "
"(z.B. /dse/v2026-01.html)."
),
},
]