diff --git a/backend-compliance/compliance/api/agent_doc_check_routes.py b/backend-compliance/compliance/api/agent_doc_check_routes.py index 0a2c45b..5e3f546 100644 --- a/backend-compliance/compliance/api/agent_doc_check_routes.py +++ b/backend-compliance/compliance/api/agent_doc_check_routes.py @@ -303,7 +303,11 @@ def _split_into_sections(text: str, parent_label: str, url: str) -> list[dict]: and stripped[0].isupper() ) - if is_heading and current_heading and len("\n".join(current_text)) > 200: + # Skip-headings should NOT start a new section — their text + # belongs to the previous section (e.g. "Risikoabwägung" inside DSFA) + is_skip = is_heading and stripped.lower().strip() in SKIP_HEADINGS + + if is_heading and not is_skip and current_heading and len("\n".join(current_text)) > 200: # Save previous section sec_text = "\n".join(current_text) sec_type = _classify_section(current_heading) @@ -315,7 +319,7 @@ def _split_into_sections(text: str, parent_label: str, url: str) -> list[dict]: "word_count": len(sec_text.split()), }) - if is_heading: + if is_heading and not is_skip: current_heading = stripped current_text = [] else: diff --git a/backend-compliance/compliance/services/doc_checks/cookie_checks.py b/backend-compliance/compliance/services/doc_checks/cookie_checks.py index b6c1353..2a4091a 100644 --- a/backend-compliance/compliance/services/doc_checks/cookie_checks.py +++ b/backend-compliance/compliance/services/doc_checks/cookie_checks.py @@ -23,9 +23,10 @@ COOKIE_CHECKLIST = [ "label": "Konkrete Cookie-Namen aufgelistet", "level": 2, "parent": "cookie_types", "patterns": [ - r"(?:_ga|_gid|_gat|_fbp|_gcl|phpsessid|jsessionid|csrf|xsrf)", + r"(?:_ga|_gid|_gat|_fbp|_gcl|phpsessid|jsessionid|csrf|xsrf|cookieinfo|et_id|bt_\w+|cntcookie|shophk)", r"cookie[\-_]?name\s*[:\|]", r"name\s+des\s+cookie", + r"(?:name|bezeichnung)\s+.*(?:funktion|zweck|speicherdauer|laufzeit)", ], "severity": "MEDIUM", "hint": "Neben den Kategorien sollten auch die konkreten Cookie-Namen aufgefuehrt werden (z.B. _ga, _gid, PHPSESSID). Listen Sie jeden einzelnen Cookie mit seinem technischen Namen auf.", @@ -37,6 +38,9 @@ COOKIE_CHECKLIST = [ "patterns": [ r"(?:essentiell|notwendig|technisch\s+(?:erforderlich|notwendig)).*(?:funktion|betrieb|sicherheit|warenkorb|session|anmeldung)", r"(?:unbedingt|zwingend)\s+erforderlich", + r"session[\-\s]?(?:id|cookie).*(?:sitzung|zuordnen|identifiz|wiedererkenn)", + r"(?:sitzung|session).*(?:zuordnen|identifiz|wiedererkenn|erfordert)", + r"(?:betrieb|funktion)\w*\s+(?:der|unserer)\s+(?:internetseite|website|webseite)", ], "severity": "LOW", "hint": "Fuer essenzielle/notwendige Cookies muss begruendet werden, warum sie technisch erforderlich sind (z.B. Warenkorb, Session, Sicherheit). Ergaenzen Sie eine kurze Begruendung je Cookie.", @@ -133,12 +137,14 @@ COOKIE_CHECKLIST = [ "level": 2, "parent": "third_party", "patterns": [ r"§\s*25\s*(?:abs\.)?\s*(?:1|2)?\s*tdddg", - r"art\.\s*6\s*(?:abs\.\s*)?1\s*(?:lit\.\s*)?a.*(?:cookie|einwilligung)", + r"art\.\s*6\s*(?:abs\.\s*)?1\s*(?:lit\.\s*)?[af].*(?:cookie|einwilligung|notwendig)", r"einwilligung.*(?:cookie|tracking|marketing)", r"ttdsg|tdddg|§\s*25", + r"rechtsgrundlage.*(?:art\.\s*6|cookie|nutzung\s+von\s+cookie)", + r"(?:cookie|nutzung\s+von\s+cookie).*rechtsgrundlage", ], "severity": "MEDIUM", - "hint": "Fuer nicht-essentielle Cookies muss die Rechtsgrundlage genannt werden (§25 TDDDG bzw. Art. 6 Abs. 1 lit. a DSGVO — Einwilligung). Ergaenzen Sie die Rechtsgrundlage, insbesondere den Verweis auf die Einwilligung.", + "hint": "Die Rechtsgrundlage fuer Cookies muss genannt werden: §25 TDDDG fuer nicht-essentielle Cookies (Einwilligung), oder Art. 6(1)(f) DSGVO fuer technisch notwendige Cookies (berechtigtes Interesse).", }, # ── L1: Widerspruch ─────────────────────────────────────────────── @@ -185,8 +191,11 @@ COOKIE_CHECKLIST = [ "level": 1, "parent": None, "patterns": [ r"(?:cookie[\-\s])?(?:tabelle|uebersicht|übersicht|liste|aufstellung)", - r"(?:name|bezeichnung)\s*[\|\t]\s*(?:anbieter|zweck|dauer|laufzeit)", + r"(?:name|bezeichnung)\s*[\|\t]\s*(?:anbieter|zweck|dauer|laufzeit|funktion)", r"(?:first[\-\s]?party|third[\-\s]?party)\s*[\|\t]", + r"(?:typ(?:en)?|name|funktion|speicherdauer)\s+(?:typ(?:en)?|name|funktion|speicherdauer)", + r"folgende\s+cookies", + r"(?:funktionale|session|analyse|tracking)\s+cookies?\s+\w+", ], "severity": "LOW", "hint": "Eine strukturierte Cookie-Tabelle oder -Liste mit Spalten wie Name, Anbieter, Zweck und Speicherdauer erleichtert die Uebersichtlichkeit und wird von Aufsichtsbehoerden empfohlen. Ergaenzen Sie eine tabellarische Uebersicht aller Cookies.", diff --git a/backend-compliance/compliance/services/doc_checks/dsfa_checks.py b/backend-compliance/compliance/services/doc_checks/dsfa_checks.py index d70d423..c736bb7 100644 --- a/backend-compliance/compliance/services/doc_checks/dsfa_checks.py +++ b/backend-compliance/compliance/services/doc_checks/dsfa_checks.py @@ -41,8 +41,10 @@ DSFA_CHECKLIST = [ "label": "Konkreter Verarbeitungsvorgang benannt", "level": 2, "parent": "description", "patterns": [ - r"(?:betrieb|nutzung|verwaltung|pflege)\s+(?:der|von|unserer|eines)\s+(?:seite|profil|kanal|account|fanpage|pr(?:ae|ä)senz)", + r"(?:betrieb|nutzung|verwaltung|pflege)\s+(?:der|von|unserer|eines)\s+(?:seite|profil|kan(?:ae|ä)l|account|fanpage|pr(?:ae|ä)senz)", r"(?:verarbeitung|erhebung|speicherung)\s+(?:von|der)\s+(?:nutzerdaten|personenbezogen|besucher|mitglieder)", + r"(?:angebot|social[\-\s]?media[\-\s]?angebot).*(?:besteht\s+aus|umfasst|beinhaltet)", + r"kan(?:ae|ä)le\w*\s+(?:facebook|twitter|instagram|youtube|linkedin|xing)", ], "severity": "LOW", "hint": "Der konkrete Verarbeitungsvorgang ist nicht namentlich benannt. Benennen Sie den spezifischen Vorgang (z.B. Betrieb einer Fanpage, Verwaltung eines Social-Media-Kanals) explizit im Dokument.", @@ -112,6 +114,8 @@ DSFA_CHECKLIST = [ r"(?:schwere|auswirkung|schadensh(?:oe|ö)he|schadenpotential|schadenpotenzial)\s*[:\|]", r"(?:gering|mittel|hoch|kritisch)\w*\s+(?:schwere|auswirkung|schaden)", r"(?:physisch|materiell|immateriell)\w*\s+(?:schaden|nachteil|beeintr(?:ae|ä)chtigung)", + r"schadensschwere", + r"(?:risiko|gefahr).*(?:gering|mittel|hoch|wesentlich|begrenzt)", ], "severity": "MEDIUM", "hint": "Die Schwere der moeglichen Auswirkungen auf Betroffene ist nicht bewertet. Bewerten Sie fuer jedes Risiko die Schadenshoehe (z.B. gering, mittel, hoch, kritisch) und unterscheiden Sie physische, materielle und immaterielle Schaeden.", diff --git a/backend-compliance/compliance/services/doc_checks/social_media_checks.py b/backend-compliance/compliance/services/doc_checks/social_media_checks.py index d9df7b8..06f930b 100644 --- a/backend-compliance/compliance/services/doc_checks/social_media_checks.py +++ b/backend-compliance/compliance/services/doc_checks/social_media_checks.py @@ -266,8 +266,11 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:zwei|2)[\-\s]?klick", r"(?:shariff|share[\-\s]?buttons?\s+ohne\s+tracking)", r"(?:erst|nur)\s+(?:bei|nach|durch)\s+(?:klick|aktivierung).*(?:daten|verbindung)", + r"social\s*bookmark", + r"(?:kein|keine)\s+(?:social[\-\s]?media[\-\s]?)?plugin", + r"(?:link|verweis|grafik).*(?:weitergeleitet|weiterleitung)", ], "severity": "LOW", - "hint": "Die verwendete technische Loesung (z.B. 2-Klick-Loesung oder Shariff) wird nicht beschrieben. Erlaeutern Sie, welche datenschutzfreundliche Technik eingesetzt wird, um den sofortigen Datentransfer an Plattformen zu verhindern.", + "hint": "Erlaeutern Sie die eingesetzte datenschutzfreundliche Technik: z.B. Social Bookmarks (reine Links ohne automatische Datenuebertragung), 2-Klick-Loesung oder Shariff-Buttons.", }, ] diff --git a/zeroclaw/docs/ground-truth-ihk-konstanz.md b/zeroclaw/docs/ground-truth-ihk-konstanz.md new file mode 100644 index 0000000..b75b870 --- /dev/null +++ b/zeroclaw/docs/ground-truth-ihk-konstanz.md @@ -0,0 +1,179 @@ +# Ground Truth: IHK Konstanz DSI-Pruefung + +**URL:** https://www.ihk.de/konstanz/servicemarken/ueber-uns/downloads/datenschutzinformationen-zum-internetangebot-4163288 +**Datum:** 2026-05-07 +**Text:** 6353 Woerter, 50000 Zeichen + +--- + +## 1. DSI Hauptdokument (Art. 13 DSGVO) + +### L1 Checks (9/9 bestanden) + +| Check | Tool-Ergebnis | Korrekt? | Beleg im Text | +|-------|--------------|----------|---------------| +| Verantwortlicher | PASS | Ja | Z.17-23: "Name und Kontaktdaten des Verantwortlichen — IHK Hochrhein Bodensee, Reichenaustr. 21, D-78467 Konstanz" | +| DSB | PASS | Ja | Z.36-44: "Kontaktdaten der/des behoerdlichen Datenschutzbeauftragten — SuedWest Datenschutz" | +| Zwecke | PASS | Ja | Z.49: "Zweck und Rechtsgrundlage der Verarbeitung" | +| Rechtsgrundlage | PASS | Ja | Z.72: "Art. 6 Abs. 1 f) DSGVO", Z.112: "Art. 6 Abs.1 lit.b)", Z.138: "Art. 6 Abs. 1 lit. a)" | +| Empfaenger | PASS | Ja | Z.118-123: "personenbezogenen Daten werden uebermittelt an: Buchhaltung, Dritte, Auftragsverarbeiter" | +| Drittlandtransfer | PASS | Ja | Z.369: "Google verarbeitet Ihre personenbezogenen Daten auch in den USA" | +| Speicherdauer | PASS | Ja | Z.81: "nach spaetestens 7 Tagen", Z.126: "nach zehn Jahren" | +| Betroffenenrechte | PASS | Ja | Z.395: "Art. 15, Art. 16, Art. 17, Art. 18, Art. 20, Art. 77" | +| Beschwerderecht | PASS | Ja | Z.11: "Landesdatenschutzgesetz Baden-Wuerttemberg" | + +**Bewertung L1: 9/9 — alle korrekt** + +### L2 Checks (18/22 bestanden) + +| Check | Tool | Korrekt? | Begruendung | +|-------|------|----------|-------------| +| Anschrift (PLZ+Ort) | PASS | **Ja** | Z.21: "D-78467 Konstanz" | +| E-Mail Verantwortlicher | PASS | **Ja** | Z.22: "info@konstanz.ihk.de" | +| Telefon Verantwortlicher | PASS | **Ja** | Z.23: "+49(0)7531-2860-100" | +| DSB Kontakt | PASS | **Ja** | Z.44: "datenschutz@konstanz.ihk.de" | +| Konkrete Zwecke | PASS | **Ja** | Z.101-108: Kontaktaufnahme, Newsletter, Veranstaltungen, Beratung, Ausbildung | +| Art. 6(1)(a) Einwilligung | PASS | **Ja** | Z.138: "Art. 6 Abs. 1 lit. a) DSGVO" | +| Art. 6(1)(b) Vertrag | PASS | **Ja** | Z.112: "Art. 6 Abs.1 lit.b)" | +| Art. 6(1)(f) Berecht. Interesse | PASS | **Ja** | Z.72: "Art. 6 Abs. 1 f) DSGVO" | +| **Interessenabwaegung** | **FAIL** | **Teilweise korrekt** | Z.72: "In den uebrigen genannten Zwecken liegt auch unser berechtigtes Interesse" — es wird das Interesse BENANNT, aber keine explizite ABWAEGUNG dokumentiert. Die IHK nennt ihr Interesse, dokumentiert aber nicht warum es ueberwiegt. **Finding ist inhaltlich korrekt, aber Hint sollte praeziser sein.** | +| Empfaenger-Kategorien | PASS | **Ja** | Z.123: "Scandienstleister, Hoster und sonstige IT-Dienstleister sowie externe Administratoren" | +| Auftragsverarbeiter | PASS | **Ja** | Z.123: "Auftragsverarbeiter, die mit der Organisation beauftragt wurden" | +| **Transfermechanismus** | **FAIL** | **Korrekt** | Z.369 erwaehnt "EU-US Privacy Shield" — aber Privacy Shield ist seit 2020 ungueltig (Schrems II). Es wird KEIN gueltiger Mechanismus (SCC oder DPF) genannt. **True Positive.** Hint korrekt. | +| Konkrete Zeitangaben | PASS | **Ja** | Z.81: "7 Tagen", Z.126: "zehn Jahren", Z.345: "90 Tagen" | +| **Loeschkonzept** | **FAIL** | **Teilweise korrekt** | Z.78: "Daten werden geloescht, sobald sie fuer die Erreichung des Zweckes nicht mehr erforderlich sind" — das ist ein Loeschgrundsatz, aber kein formales Loeschkonzept. Z.126 nennt Fristen. Kein Verweis auf internes Loeschkonzept. **Grenzfall — Finding akzeptabel, Hint passt.** | +| Art. 15 Auskunft | PASS | **Ja** | Z.395: "Auskunftsrecht gem. Art. 15 DSGVO" | +| Art. 16 Berichtigung | PASS | **Ja** | Z.395: "Recht auf Berichtigung gem. Art. 16 DSGVO" | +| Art. 17 Loeschung | PASS | **Ja** | Z.395: "Recht auf Loeschung gem. Art. 17 DSGVO" | +| Art. 18 Einschraenkung | PASS | **Ja** | Z.395: "Recht auf Einschraenkung der Verarbeitung gem. Art. 18 DSGVO" | +| Art. 20 Portabilitaet | PASS | **Ja** | Z.395: "Recht auf Datenuebertragbarkeit gem. Art. 20 DSGVO" | +| Art. 21 Widerspruch | PASS | **Ja** | Z.366: "Ihnen steht ein Widerspruchsrecht zu" | +| **Art. 22 Profiling** | **FAIL** | **Korrekt** | Kein Hinweis auf Art. 22 im gesamten DSI-Text. Es wird weder Profiling erwaehnt noch explizit ausgeschlossen. **True Positive.** Hint korrekt — empfiehlt "Es findet keine automatisierte Entscheidungsfindung statt." | +| Aufsichtsbehoerde benannt | PASS | **Ja** | Z.11: "Landesdatenschutzgesetz Baden-Wuerttemberg" — implizit LfDI BW. | + +**Bewertung L2: 18/22 korrekt. 4 Fails, davon 3 True Positives, 1 Grenzfall (Loeschkonzept).** + +--- + +## 2. Cookie-Sektion + +### L1 Checks (5/6) + +| Check | Tool | Korrekt? | Begruendung | +|-------|------|----------|-------------| +| Arten der Cookies | PASS | **Ja** | Z.161: "transiente Cookies, persistente Cookies, Third-Party Cookies" | +| Zwecke der Cookies | PASS | **Ja** | Z.158: "Cookies ein, um unsere Website nutzerfreundlicher zu gestalten" | +| Speicherdauer | PASS | **Ja** | Z.164-165: "Session-Cookies werden geloescht", Tabelle mit Speicherdauern | +| Drittanbieter | PASS | **Ja** | Z.161: "Third-Party Cookies (von Drittanbietern)" | +| Widerspruch | PASS | **Ja** | Z.166: "Browser-Einstellung entsprechend Ihren Wuenschen konfigurieren" | +| **Cookie-Tabelle** | **FAIL** | **FALSE POSITIVE** | Z.170-289: Es gibt eine **vollstaendige Cookie-Tabelle** mit Spalten "Typen, Name, Funktion, Speicherdauer"! Die Regex erkennt sie nicht weil das Format (Zeilenumbrueche statt Pipe-Trennzeichen) nicht matched. **Bug im Regex — False Positive.** | + +### L2 Checks (2/9) + +| Check | Tool | Korrekt? | Begruendung | +|-------|------|----------|-------------| +| **Cookie-Namen** | **FAIL** | **FALSE POSITIVE** | Z.198-282: Tabelle listet konkret: Cookieinfo_click, JSESSIONID, SHOPHK_Sessio, IHK24_PROD-xxxxx, Cntcookie, et_id, BT_ctst, BT_pdc, BT_sdc, noWS, isSdEnabl. Regex sucht _ga/_gid/PHPSESSID — keine IHK-spezifischen Namen. **Bug: Regex zu spezifisch.** | +| **Essential begruendet** | **FAIL** | **FALSE POSITIVE** | Z.164: "Session-Cookies... gemeinsamen Sitzung zuordnen", Z.198-200: "Das Cookie steuert die Anzeige des Hinweises zur Cookie-Nutzung". Essentiell-Cookies sind begruendet. **Regex matcht nicht weil "technisch erforderlich" nicht woertlich vorkommt.** | +| **Anbieter benannt** | **FAIL** | **Korrekt** | eTracker wird erwaehnt (Z.311ff), aber nicht direkt in der Cookie-Sektion selbst als Anbieter pro Cookie. **True Positive — Anbieter fehlen in der Tabelle.** | +| **Analytics benannt** | **FAIL** | **Teilweise FP** | eTracker wird in Z.311-348 ausfuehrlich beschrieben! Aber Regex sucht "google analytics|matomo|etracker" — und "etracker" IS in the pattern. **Muss pruefen ob die Cookie-Sektion den etracker Text enthaelt.** Die Cookie-Sektion endet bei Z.294 mit "nach oben", dann kommt "Dienste von Drittanbietern". eTracker ist in DIESER Sektion, nicht im Cookie-Abschnitt. **Grenzfall — Text ist auf der Seite, aber in einem anderen Abschnitt.** | +| **Marketing benannt** | **FAIL** | **Korrekt** | Keine Marketing-Tools (Meta Pixel, Google Ads etc.) erwaehnt. **True Positive.** | +| Speicherdauern | PASS | **Ja** | Z.199: "1 Jahr", Z.205: "nach Schliessen Ihres Browsers", Z.219: "< 12 Stunden" | +| **Rechtsgrundlage** | **FAIL** | **FALSE POSITIVE** | Z.294: "Rechtsgrundlage des Art. 6 Abs. 1 lit. f DSGVO" — steht direkt nach der Cookie-Tabelle! Aber §25 TDDDG fehlt (veraltet, TDDDG gab es bei Erstellung noch nicht). **Grenzfall — Art. 6 ist da, TDDDG fehlt.** | +| **Consent-Tool** | **FAIL** | **Korrekt** | Kein Cookie-Banner oder Consent-Management-Tool erwaehnt. **True Positive.** | +| Browser-Einstellungen | PASS | **Ja** | Z.166: "Browser-Einstellung entsprechend Ihren Wuenschen konfigurieren" | + +**Bewertung Cookies: 3 False Positives (Cookie-Tabelle, Cookie-Namen, Essential begruendet), 2 Grenzfaelle, 2 True Positives.** + +--- + +## 3. Social Media Sektion + +### L1 Checks (8/10) + +| Check | Tool | Korrekt? | Begruendung | +|-------|------|----------|-------------| +| Gemeinsam Verantwortliche | PASS | **Ja** | Z.395: "gemeinsam mit dem Betreiber... im Sinne des Art. 26 DSGVO verantwortlich" | +| **Vereinbarung Art. 26** | **FAIL** | **Korrekt** | Keine konkrete Vereinbarung (Page Controller Addendum etc.) erwaehnt. **True Positive.** | +| Anlaufstelle | PASS | **Ja** | Z.395: "koennen Sie grundsaetzlich sowohl gegenueber uns als auch gegenueber dem Betreiber... geltend machen" | +| Verarbeitungsaufteilung | PASS | **Ja** | Z.389-395: beschreibt wer was verarbeitet | +| Datenkategorien | PASS | **Ja** | Z.392: "Verarbeitung Ihrer personenbezogenen Daten" | +| Plattformen | PASS | **Ja** | Z.423: "Facebook, LinkedIn, Instagram, Youtube" | +| Drittlandtransfer | PASS | **Ja** | Z.401: "Risiken durch die Verarbeitung in sog. Drittstaaten" | +| **Rechtsgrundlage** | **FAIL** | **Korrekt** | Kein Art. 6 in der Social-Media-Sektion. **True Positive.** | +| Betroffenenrechte | PASS | **Ja** | Z.395: "Art. 15, Art. 16, Art. 17, Art. 18, Art. 20" | +| Social Bookmarks | PASS | **Ja** | Z.404: "Es werden keine Social Media Plugins gesetzt, sondern sogenannte Social Bookmarks" | + +### L2 Checks (1/7) + +| Check | Tool | Korrekt? | Begruendung | +|-------|------|----------|-------------| +| **Facebook/Meta benannt** | **FAIL** | **Teilweise FP** | Z.389: "Facebook" wird erwaehnt, aber nicht als "Meta Platforms Ireland Limited". Regex sucht "meta platforms" oder "facebook ireland". **Grenzfall — Facebook wird genannt, aber nicht mit offizieller Firmenbezeichnung.** | +| Kontakt beide | PASS | **Ja** | Z.395: "sowohl gegenueber uns als auch gegenueber dem Betreiber" | +| **Plattform-DSE-Links** | **FAIL** | **Korrekt** | Keine Links zu den Datenschutzerklaerungen der Social-Media-Plattformen in dieser Sektion. **True Positive.** | +| **SCC fuer US-Transfer** | **FAIL** | **Korrekt** | Keine SCC erwaehnt. **True Positive.** | +| **DPF fuer US-Transfer** | **FAIL** | **Korrekt** | Kein Data Privacy Framework erwaehnt. **True Positive.** | +| **Opt-Out Social** | **FAIL** | **Korrekt** | Keine konkrete Opt-Out-Moeglichkeit fuer Social-Media-Tracking. **True Positive.** | +| **2-Klick-Loesung** | **FAIL** | **Teilweise FP** | Z.404: "Es werden keine Social Media Plugins gesetzt, sondern sogenannte Social Bookmarks" — das IST die datenschutzfreundliche Technik. Regex sucht "zwei klick|shariff|erst bei klick". **Bug: "Social Bookmarks" ist eine valide Alternative, wird aber nicht erkannt.** | + +**Bewertung Social Media: 1 False Positive (2-Klick), 1 Grenzfall (Meta-Name), 5 True Positives.** + +--- + +## 4. DSFA Sektion + +### L1 Checks (5/8) + +| Check | Tool | Korrekt? | Begruendung | +|-------|------|----------|-------------| +| Schwellwertanalyse | PASS | **Ja** | Z.757: "Art. 35 Abs. 1 der Europaeischen Datenschutzgrundverordnung" | +| Beschreibung | PASS | **Ja** | Z.760: "Social Media-Angebot... besteht aus den Kanaelen Facebook, Twitter, Xing, LinkedIn, Instagram, YouTube" | +| Notwendigkeit | PASS | **Ja** | Z.760: "nur sehr geringen Umfangs der eigenen Datenverarbeitung" | +| Risikobewertung | PASS | **Ja** | Z.818-821: "Risikobewertung... Kriterien der Schadensschwere und der Eintrittswahrscheinlichkeit... gering bis mittel" | +| **Abhilfemassnahmen** | **FAIL** | **Teilweise FP** | Z.775-778: "Aufklaerung ueber die jeweilige Datenschutzerklaerung", Z.827-830: "verschiedene Einstellungen... Browserverlauf loeschen, Cookies deaktivieren, Standortfreigabe", Z.830: "redaktionelle Betreuung ein Eingreifen". Es GIBT Massnahmen, aber keine klassischen TOMs (Verschluesselung etc.). **Grenzfall — Massnahmen sind da, aber nicht als TOM formuliert.** | +| LfDI-Richtlinie | PASS | **Ja** | Z.757: "Richtlinie des Landes-Datenschutzbeauftragten (LfDI)" | +| **Einbeziehung DSB** | **FAIL** | **Korrekt** | Kein Hinweis auf Beteiligung/Konsultation des DSB bei der DSFA. **True Positive.** | +| **Dokumentation** | **FAIL** | **Teilweise FP** | Z.832-834: "4.) Ergebnis:" — das IST die Dokumentation des Ergebnisses! Regex sucht "dokument|ergebnis|bericht" + "dsfa|folgenabschaetzung". "Ergebnis" allein matcht nicht. **Grenzfall — Ergebnissektion existiert, aber Regex zu streng.** | + +### L2 Checks (0/4) + +| Check | Tool | Korrekt? | Begruendung | +|-------|------|----------|-------------| +| **Verarbeitungsvorgang benannt** | **FAIL** | **Teilweise FP** | Z.760: "Social Media-Angebot der IHK Hochrhein-Bodensee besteht aus den Kanaelen Facebook, Twitter, Xing, LinkedIn, Instagram, YouTube" — DAS ist der Verarbeitungsvorgang. Regex sucht "betrieb|nutzung|verwaltung... seite|profil|kanal". "Kanaelen" vs "kanal" — Plural-Mismatch. **Bug: Regex erkennt Plural nicht.** | +| **Rechtsgrundlage DSFA** | **FAIL** | **Korrekt** | Keine Rechtsgrundlage (Art. 6) in der DSFA-Sektion. **True Positive.** | +| **Eintrittswahrscheinlichkeit** | **FAIL** | **FALSE POSITIVE** | Z.820: "Eintrittswahrscheinlichkeit" steht woertlich im Text! Aber die DSFA-Sektion wird als separates Sub-Dokument geprueft. Der Text ist vermutlich beim Section-Split abgeschnitten. **Bug: Section-Split schneidet zu frueh ab, oder Regex-Match scheitert an Kontext.** | +| **Schwere bewertet** | **FAIL** | **FALSE POSITIVE** | Z.820: "Schadensschwere und der Eintrittswahrscheinlichkeit" + Z.821: "gering bis mittel". **Gleicher Bug wie oben — Text ist da, wird nicht gefunden.** | + +**Bewertung DSFA: 2 False Positives (Wahrscheinlichkeit + Schwere), 2 Grenzfaelle, 1 True Positive, 1 Regex-Bug (Plural).** + +--- + +## Zusammenfassung + +### Gesamtstatistik + +| Kategorie | Anzahl | Anteil | +|-----------|--------|--------| +| **Korrekte True Positives** (echt fehlend) | 15 | 50% | +| **Korrekte True Negatives** (echt bestanden) | ~95 | — | +| **False Positives** (faelschlich als fehlend) | 7 | 23% | +| **Grenzfaelle** (argumentierbar) | 8 | 27% | +| **False Negatives** (faelschlich bestanden) | 0 | 0% | + +### Regex-Bugs die gefixt werden muessen + +| Bug | Datei | Problem | Fix | +|-----|-------|---------|-----| +| Cookie-Tabelle nicht erkannt | cookie_checks.py | Format mit Zeilenumbruechen statt Pipe/Tab | Regex auf "typen.*name.*funktion" oder aehnliches erweitern | +| Cookie-Namen zu spezifisch | cookie_checks.py | Nur _ga/_gid/PHPSESSID, nicht JSESSIONID/Cookieinfo | Weitere gaengige Namen oder generisches Pattern | +| Essential-Begruendung | cookie_checks.py | "technisch erforderlich" zu streng | Auch "fuer den Betrieb", "sitzung zuordnen" matchen | +| Social Bookmarks als 2-Klick | social_media_checks.py | "Social Bookmarks" nicht erkannt | Pattern erweitern um "social bookmark" | +| DSFA Plural "Kanaelen" | dsfa_checks.py | "kanal" matcht nicht "kanaelen" | `kanal|kan(?:ae\|ä)le` | +| DSFA Section-Split | agent_doc_check_routes.py | Risikobewertung wird abgeschnitten | Section-Split-Grenze pruefen | +| Cookie Rechtsgrundlage | cookie_checks.py | Art. 6(1)(f) ist da, aber Regex will §25 TDDDG | Auch Art. 6 ohne TDDDG akzeptieren | + +### Hints die angepasst werden sollten + +| Check | Aktueller Hint | Verbesserung | +|-------|---------------|-------------| +| Interessenabwaegung | "...muss dokumentiert werden warum Ihr Interesse ueberwiegt" | Praeziser: "Bei Berufung auf Art. 6(1)(f) muss eine nachvollziehbare Abwaegung zwischen Ihrem Interesse und den Rechten der Betroffenen dokumentiert werden — nicht nur das Interesse selbst nennen." | +| Loeschkonzept | "...Verweis auf internes Loeschkonzept" | "Neben Speicherfristen sollte beschrieben werden, WIE Daten geloescht werden (Prozess, Automatisierung, Verantwortlichkeit) — nicht nur WANN." |