feat: Fix DSFA dedup + expand all checklists to 56 total checks

Fixes:
- 'Risikoabwaegung' is sub-section of DSFA → added to SKIP_HEADINGS
- 'Social Media' standalone heading → recognized as social_media DSE
- Removed 'risikobew' from DSFA pattern (was too broad)

Expanded checklists:
- Widerruf: 4→7 checks (+Empfaenger, kein Grund, §312k Button)
- AGB: 4→9 checks (+Zahlung, Lieferung, Gewaehrleistung, Kuendigung, Datenschutz)
- Social Media: +1 (Social Bookmarks)
- DSFA: +1 (LFDI Richtlinie)

Total: 47→56 Regex-Checks across 7 document types:
DSI=9, Cookie=5, Social Media=10, DSFA=8, Impressum=6, Widerruf=7, AGB=9

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-07 11:55:29 +02:00
parent 58234ac18b
commit 3c12e06faf
2 changed files with 41 additions and 5 deletions
@@ -148,19 +148,43 @@ WIDERRUF_CHECKLIST = [
{"id": "form", "label": "Form des Widerrufs",
"patterns": [r"widerrufsformular", r"muster.?widerruf", r"withdrawal\s+form", r"formular"]},
{"id": "consequences", "label": "Folgen des Widerrufs",
"patterns": [r"folgen\s+des\s+widerrufs", r"consequences\s+of\s+withdrawal", r"rueckerstattung"]},
"patterns": [r"folgen\s+des\s+widerrufs", r"consequences\s+of\s+withdrawal", r"r(?:ue|ü)ckerstattung"]},
{"id": "recipient", "label": "Empfaenger des Widerrufs (Name + Anschrift)",
"patterns": [r"widerruf.*(?:richten|senden|erkl(?:ae|ä)ren)\s+(?:an|gegenueber|gegenüber)",
r"(?:name|firma|anschrift).*widerruf", r"widerruf.*(?:per|via|an)"]},
{"id": "no_reason", "label": "Hinweis: kein Grund erforderlich",
"patterns": [r"ohne\s+(?:angabe|nennung).*(?:grund|gr(?:ue|ü)nde)",
r"(?:kein|keine).*(?:begruendung|begründung|grund).*(?:erforderlich|noetig|nötig)"]},
{"id": "digital_button", "label": "Online-Kuendigungsbutton (§312k BGB)",
"patterns": [r"k(?:ue|ü)ndigungsbutton", r"§\s*312k", r"online.*k(?:ue|ü)ndig",
r"k(?:ue|ü)ndigung.*(?:button|link|formular|online)"]},
]
# AGB minimal requirements
# AGB requirements (§305ff BGB)
AGB_CHECKLIST = [
{"id": "scope", "label": "Geltungsbereich",
"patterns": [r"geltungsbereich", r"geltung", r"scope", r"diese\s+(?:agb|bedingungen)\s+gelten"]},
{"id": "contract", "label": "Vertragsschluss",
"patterns": [r"vertragsschluss", r"zustandekommen", r"contract\s+formation", r"angebot\s+und\s+annahme"]},
{"id": "liability", "label": "Haftung",
{"id": "liability", "label": "Haftung / Haftungsbeschraenkung",
"patterns": [r"haftung", r"liability", r"schadensersatz", r"haftungsbeschr(?:ae|ä)nkung"]},
{"id": "jurisdiction", "label": "Gerichtsstand / Anwendbares Recht",
"patterns": [r"gerichtsstand", r"anwendbares\s+recht", r"jurisdiction", r"governing\s+law"]},
{"id": "payment", "label": "Zahlungsbedingungen",
"patterns": [r"zahlungsbedingung", r"payment\s+terms", r"(?:preis|kosten|entgelt|vergütung)",
r"zahlungsweise", r"rechnungsstellung"]},
{"id": "delivery", "label": "Lieferung / Leistungserbringung",
"patterns": [r"lieferung", r"leistungserbringung", r"delivery", r"lieferfrist",
r"bereitstellung", r"(?:zugang|zugriff).*(?:dienst|leistung)"]},
{"id": "warranty", "label": "Gewaehrleistung / Maengelrechte",
"patterns": [r"gew(?:ae|ä)hrleistung", r"m(?:ae|ä)ngelrecht", r"warranty", r"sachm(?:ae|ä)ngel",
r"gew(?:ae|ä)hrleistungsfrist"]},
{"id": "termination", "label": "Kuendigung / Vertragsbeendigung",
"patterns": [r"k(?:ue|ü)ndigung", r"vertragsbeendigung", r"termination",
r"laufzeit.*(?:vertrag|abo)", r"k(?:ue|ü)ndigungsfrist"]},
{"id": "data_protection", "label": "Datenschutzhinweis in AGB",
"patterns": [r"datenschutz.*(?:agb|bedingung)", r"(?:agb|bedingung).*datenschutz",
r"personenbezogen.*daten.*(?:agb|vertrag)", r"dsgvo.*(?:agb|vertrag)"]},
]
# §5 TMG / §18 MStV Impressum requirements