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

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:
Benjamin Admin
2026-05-07 14:51:09 +02:00
parent f59f810638
commit fa4fd87102
5 changed files with 207 additions and 8 deletions
@@ -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.",
},
]