fix: 7 regex bugs from IHK Konstanz ground truth analysis
Build + Deploy / build-admin-compliance (push) Successful in 9s
Build + Deploy / build-backend-compliance (push) Successful in 8s
Build + Deploy / build-ai-sdk (push) Successful in 42s
Build + Deploy / build-developer-portal (push) Successful in 8s
Build + Deploy / build-tts (push) Successful in 7s
Build + Deploy / build-document-crawler (push) Successful in 7s
Build + Deploy / build-dsms-gateway (push) Successful in 8s
Build + Deploy / build-dsms-node (push) Successful in 8s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / loc-budget (push) Failing after 18s
CI / secret-scan (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m57s
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Failing after 49s
CI / test-python-backend (push) Successful in 42s
CI / test-python-document-crawler (push) Successful in 28s
CI / test-python-dsms-gateway (push) Successful in 23s
CI / validate-canonical-controls (push) Successful in 15s
Build + Deploy / trigger-orca (push) Successful in 2m24s
Build + Deploy / build-admin-compliance (push) Successful in 9s
Build + Deploy / build-backend-compliance (push) Successful in 8s
Build + Deploy / build-ai-sdk (push) Successful in 42s
Build + Deploy / build-developer-portal (push) Successful in 8s
Build + Deploy / build-tts (push) Successful in 7s
Build + Deploy / build-document-crawler (push) Successful in 7s
Build + Deploy / build-dsms-gateway (push) Successful in 8s
Build + Deploy / build-dsms-node (push) Successful in 8s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / loc-budget (push) Failing after 18s
CI / secret-scan (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m57s
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Failing after 49s
CI / test-python-backend (push) Successful in 42s
CI / test-python-document-crawler (push) Successful in 28s
CI / test-python-dsms-gateway (push) Successful in 23s
CI / validate-canonical-controls (push) Successful in 15s
Build + Deploy / trigger-orca (push) Successful in 2m24s
Fixes based on manual verification of all 30 failed checks: 1. Cookie table: recognize "folgende cookies" + column headers as text 2. Cookie names: add JSESSIONID, cookieinfo, et_id, BT_* patterns 3. Essential justified: match "sitzung zuordnen", "betrieb der website" 4. Social bookmarks: recognize as 2-click alternative 5. DSFA plural: "kanaelen" now matches alongside "kanal" 6. Section splitter: skip-headings no longer lose subsequent text (Risikoabwaegung section was cut from DSFA, losing risk scores) 7. Cookie legal basis: accept Art. 6(1)(f) in cookie context Reduces false positives from 7 to ~1-2 for IHK Konstanz test case. Ground truth table: zeroclaw/docs/ground-truth-ihk-konstanz.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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.",
|
||||
},
|
||||
]
|
||||
|
||||
@@ -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." |
|
||||
Reference in New Issue
Block a user