Files
breakpilot-compliance/backend-compliance/compliance/services/doc_checks/avv_checks.py
T
Benjamin Admin 0326d5baab feat(vendor-assessment): AVV/SCC/TOM/Sub-Processor checklists + assessment service
Phase 1-3 of the Vendor Contract Assessment:

Backend checklists (Doc-Check L1/L2 engine compatible):
- avv_checks.py: 28 checks (11 L1 + 17 L2) for Art. 28(3) DSGVO
- scc_checks.py: 7 checks for EU SCC 2021 (modules, annexes, TIA)
- tom_annex_checks.py: 12 checks for Art. 32 (8 control objectives)
- sub_processor_checks.py: 7 checks for sub-processor list completeness

Assessment service:
- POST /vendor-compliance/assessments — async contract analysis
- GET /vendor-compliance/assessments/{id} — poll status
- Cross-check engine: detects missing SCC when AVV mentions third-country,
  missing TOM annex, missing sub-processor list

All checklists registered in runner.py CHECKLIST_MAP (27 doc_types total).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-12 23:14:54 +02:00

382 lines
21 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
AVV (Auftragsverarbeitungsvertrag) checks — Art. 28 DSGVO.
Level 1: Pflichtklausel nach Art. 28(3) vorhanden?
Level 2: Klausel korrekt/vollstaendig formuliert?
Source: checklists-data.ts AVV_CHECKLIST → Python portiert.
"""
AVV_CHECKLIST = [
# ── L1: Gegenstand und Dauer (Art. 28(3) Satz 1) ────────────────
{
"id": "avv_subject",
"label": "Gegenstand und Dauer der Verarbeitung (Art. 28(3) S. 1)",
"level": 1, "parent": None,
"patterns": [
r"gegenstand\s+(?:und|&)\s+dauer\s+der\s+verarbeitung",
r"gegenstand\s+de[rs]\s+(?:auftrag|vertrag)",
r"vertragsgegenstand",
r"dauer\s+der\s+(?:auftrags)?verarbeitung",
r"laufzeit\s+de[rs]\s+(?:auftrag|vertrag)",
],
"severity": "HIGH",
"hint": "Art. 28(3) Satz 1 DSGVO verlangt, dass der AVV den Gegenstand und die Dauer der Verarbeitung festlegt. Ohne diese Angabe ist der AVV unvollstaendig.",
},
{
"id": "avv_subject_purpose",
"label": "Art und Zweck der Verarbeitung beschrieben",
"level": 2, "parent": "avv_subject",
"patterns": [
r"art\s+(?:und|&)\s+zweck\s+der\s+verarbeitung",
r"zweck\s+der\s+(?:daten)?verarbeitung",
r"verarbeitungszweck",
r"(?:hosting|speicherung|analyse|support|wartung)\s+(?:von|der|personenbezogener)",
],
"severity": "MEDIUM",
"hint": "Die Art und der Zweck der Verarbeitung muessen konkret benannt sein (z.B. 'Hosting von Kundendaten', 'E-Mail-Versand'), nicht nur allgemein als 'Datenverarbeitung'.",
},
{
"id": "avv_subject_categories",
"label": "Kategorien betroffener Personen und Datenarten benannt",
"level": 2, "parent": "avv_subject",
"patterns": [
r"kategorie[n]?\s+(?:der\s+)?betroffene[nr]?\s+person",
r"art\s+der\s+personenbezogenen\s+daten",
r"datenkategorie",
r"(?:kunden|mitarbeiter|besch(?:ae|ä)ftigte|nutzer|bewerber)(?:daten|informationen)",
],
"severity": "MEDIUM",
"hint": "Der AVV muss die Kategorien betroffener Personen (z.B. Kunden, Mitarbeiter) und die Arten personenbezogener Daten (z.B. Name, E-Mail, IP-Adresse) konkret benennen.",
},
# ── L1: Weisungsgebundenheit (Art. 28(3)(a)) ────────────────────
{
"id": "avv_instruction",
"label": "Weisungsgebundenheit (Art. 28(3)(a))",
"level": 1, "parent": None,
"patterns": [
r"weisung(?:en|sgebunden|srecht|sbindung)",
r"(?:nur\s+)?auf\s+(?:dokumentierte\s+)?weisung\s+de[rs]\s+verantwortlichen",
r"documented\s+instructions?",
r"weisungsbefugnis",
],
"severity": "CRITICAL",
"hint": "Art. 28(3)(a) DSGVO: Der Auftragsverarbeiter darf Daten nur auf dokumentierte Weisung des Verantwortlichen verarbeiten. Ohne diese Klausel ist der AVV nichtig.",
},
{
"id": "avv_instruction_doc",
"label": "Dokumentierte Weisungen vorgesehen",
"level": 2, "parent": "avv_instruction",
"patterns": [
r"dokumentierte\s+weisung",
r"weisung(?:en)?\s+(?:schriftlich|per\s+e-?mail|in\s+textform)",
r"textform\s+(?:gem(?:ae|ä)(?:ss|ß)|nach)\s+",
],
"severity": "MEDIUM",
"hint": "Weisungen muessen dokumentiert erfolgen (Art. 28(3)(a) DSGVO). Best Practice: Schriftform oder Textform (E-Mail genuegt), nicht nur muendlich.",
},
{
"id": "avv_instruction_unlawful",
"label": "Hinweispflicht bei rechtswidrigen Weisungen",
"level": 2, "parent": "avv_instruction",
"patterns": [
r"(?:rechtswidrig|unzul(?:ae|ä)ssig|rechts(?:versto(?:ss|ß)|verletzend))\w*\s+weisung",
r"hinweis(?:pflicht)?\s+(?:bei|auf)\s+(?:versto(?:ss|ß)|rechtswidr)",
r"auftragsverarbeiter\s+(?:ist\s+)?(?:verpflichtet|hat)\s+(?:den\s+verantwortlichen\s+)?(?:zu\s+)?(?:informieren|hinzuweisen|unterrichten)",
],
"severity": "MEDIUM",
"hint": "Art. 28(3) Satz 3 DSGVO: Der Auftragsverarbeiter muss den Verantwortlichen informieren, wenn eine Weisung seiner Ansicht nach gegen Datenschutzrecht verstoesst.",
},
# ── L1: Vertraulichkeit (Art. 28(3)(b)) ─────────────────────────
{
"id": "avv_confidentiality",
"label": "Vertraulichkeitsverpflichtung (Art. 28(3)(b))",
"level": 1, "parent": None,
"patterns": [
r"vertraulichkeit(?:sverpflichtung)?",
r"verschwiegenheit(?:spflicht|sverpflichtung)?",
r"zur\s+vertraulichkeit\s+verpflichtet",
r"geheimhaltung(?:sverpflichtung)?",
r"confidentiality\s+(?:obligation|agreement)",
],
"severity": "HIGH",
"hint": "Art. 28(3)(b) DSGVO: Alle zur Verarbeitung befugten Personen muessen zur Vertraulichkeit verpflichtet sein oder einer gesetzlichen Verschwiegenheitspflicht unterliegen.",
},
{
"id": "avv_confidentiality_employees",
"label": "Verpflichtung erstreckt sich auf Mitarbeiter",
"level": 2, "parent": "avv_confidentiality",
"patterns": [
r"(?:mitarbeiter|besch(?:ae|ä)ftigte|personal|angestellte)\s+(?:zur|auf)\s+vertraulichkeit",
r"vertraulichkeit[\s\S]{0,100}(?:mitarbeiter|besch(?:ae|ä)ftigte|personal)",
r"verpflichtung\s+(?:der\s+)?(?:mitarbeiter|besch(?:ae|ä)ftigten)",
],
"severity": "MEDIUM",
"hint": "Die Vertraulichkeitsverpflichtung muss sich auf alle Personen erstrecken, die Zugang zu den Daten haben — nicht nur vertraglich, sondern auch faktisch (z.B. Reinigungspersonal mit Zugang zu Serverraeumen).",
},
# ── L1: TOM (Art. 28(3)(c)) ─────────────────────────────────────
{
"id": "avv_tom",
"label": "Technische und organisatorische Massnahmen (Art. 28(3)(c))",
"level": 1, "parent": None,
"patterns": [
r"technische[nr]?\s+(?:und|&)\s+organisatorische[nr]?\s+ma(?:ss|ß)nahmen",
r"(?:tom|to[ms])\s*[-:]",
r"art(?:ikel)?\s*\.?\s*32\s+(?:dsgvo|ds-?gvo|gdpr)",
r"sicherheit\s+der\s+verarbeitung",
],
"severity": "CRITICAL",
"hint": "Art. 28(3)(c) DSGVO i.V.m. Art. 32: Der AVV muss die TOM des Auftragsverarbeiters beschreiben oder auf eine Anlage verweisen. Fehlende TOM sind einer der haeufigsten Maengel bei AVV-Pruefungen.",
},
{
"id": "avv_tom_annex",
"label": "TOM-Anlage vorhanden oder referenziert",
"level": 2, "parent": "avv_tom",
"patterns": [
r"(?:anlage|anhang|annex)\s*(?:\d|[a-z])?\s*(?:[-:]\s*)?(?:technische|tom|sicherheit)",
r"tom[\s-]?anlage",
r"massnahmen\s+(?:gem(?:ae|ä)(?:ss|ß)|nach)\s+(?:art(?:ikel)?\s*\.?\s*)?32",
],
"severity": "HIGH",
"hint": "Best Practice: TOM als separate Anlage beifuegen (nicht nur im Fliesstext). Die Anlage muss konkrete Massnahmen benennen, nicht nur Art. 32-Kategorien wiederholen.",
},
{
"id": "avv_tom_update",
"label": "Aktualisierungspflicht fuer TOM vereinbart",
"level": 2, "parent": "avv_tom",
"patterns": [
r"(?:aktualisierung|anpassung|fortschreibung|ueberarbeitung)\s+(?:der\s+)?(?:technischen|tom|massnahmen)",
r"(?:tom|massnahmen)\s+(?:regelm(?:ae|ä)(?:ss|ß)ig|jaehrlich|j(?:ae|ä)hrlich)\s+(?:ueberpruefen|aktualisieren|anpassen)",
r"stand\s+der\s+technik",
],
"severity": "MEDIUM",
"hint": "Art. 32(1) DSGVO verlangt Massnahmen 'unter Beruecksichtigung des Stands der Technik'. Der AVV sollte eine regelmaessige Aktualisierungspflicht enthalten (mindestens jaehrlich).",
},
# ── L1: Unterauftragsverarbeitung (Art. 28(3)(d)) ────────────────
{
"id": "avv_subprocessor",
"label": "Unterauftragsverarbeitung (Art. 28(3)(d))",
"level": 1, "parent": None,
"patterns": [
r"(?:unter|sub)[\s-]?auftrags?(?:ver)?arbeiter",
r"sub[\s-]?processor",
r"weitere[rn]?\s+auftragsverarbeiter",
r"subunternehmer\s+(?:fuer|f(?:ue|ü)r)\s+(?:die\s+)?(?:daten)?verarbeitung",
],
"severity": "CRITICAL",
"hint": "Art. 28(2)+(3)(d) DSGVO: Ohne Genehmigungsklausel fuer Unterauftragsverarbeiter ist jeder Einsatz eines Sub-Processors rechtswidrig. Der AVV muss regeln: allgemeine oder spezifische Genehmigung, Informationspflicht, Widerspruchsrecht.",
},
{
"id": "avv_subprocessor_approval",
"label": "Genehmigungserfordernis (allgemein oder spezifisch)",
"level": 2, "parent": "avv_subprocessor",
"patterns": [
r"(?:vorherige|schriftliche|allgemeine|spezifische)\s+(?:schriftliche\s+)?genehmigung",
r"zustimmung\s+(?:des\s+verantwortlichen|zur\s+(?:unter|sub))",
r"(?:einwilligung|genehmigung)\s+(?:des\s+verantwortlichen|vor(?:ab|her))",
],
"severity": "CRITICAL",
"hint": "Art. 28(2) DSGVO: Entweder spezifische (namentlich) oder allgemeine (pauschal + Informationspflicht) Genehmigung. Bei allgemeiner Genehmigung MUSS der AV ueber Aenderungen informieren.",
},
{
"id": "avv_subprocessor_objection",
"label": "Widerspruchsrecht bei Aenderung der Unterauftragnehmer",
"level": 2, "parent": "avv_subprocessor",
"patterns": [
r"(?:widerspruch|einspruch|einwand)(?:srecht|smoeglichkeit)?[\s\S]{0,100}(?:unter|sub)[\s-]?auftrags?",
r"(?:unter|sub)[\s-]?auftrags?[\s\S]{0,200}(?:widerspruch|einspruch|ablehnung)",
r"(?:informieren|benachrichtigen|mitteilen)[\s\S]{0,100}(?:aenderung|wechsel|einsatz)",
],
"severity": "HIGH",
"hint": "Art. 28(2) Satz 2 DSGVO: Bei allgemeiner Genehmigung muss der Verantwortliche ueber jeden neuen Unterauftragsverarbeiter informiert werden und die Moeglichkeit haben, Einspruch zu erheben.",
},
{
"id": "avv_subprocessor_list",
"label": "Aktuelle Liste der Unterauftragnehmer",
"level": 2, "parent": "avv_subprocessor",
"patterns": [
r"(?:liste|verzeichnis|uebersicht|aufstellung)\s+(?:der\s+)?(?:aktuellen\s+)?(?:unter|sub)[\s-]?auftrags?",
r"(?:anlage|anhang|annex)\s*\d?\s*[-:]\s*(?:unter|sub)[\s-]?auftrags?",
r"(?:unter|sub)[\s-]?auftrags?[\s\S]{0,100}(?:anlage|anhang|liste)",
],
"severity": "HIGH",
"hint": "Best Practice: Aktuelle Sub-Processor-Liste als Anlage zum AVV. Sollte enthalten: Name, Anschrift, Land, Verarbeitungszweck, Datenkategorien. Viele Aufsichtsbehoerden fordern dies explizit.",
},
# ── L1: Betroffenenrechte (Art. 28(3)(e)) ────────────────────────
{
"id": "avv_data_subject_rights",
"label": "Unterstuetzung bei Betroffenenrechten (Art. 28(3)(e))",
"level": 1, "parent": None,
"patterns": [
r"betroffenenrecht",
r"(?:unterstuetzung|mithilfe|mitwirkung)\s+(?:bei|zur)\s+(?:erf(?:ue|ü)llung|wahrnehmung|gew(?:ae|ä)hrleistung)\s+(?:der\s+)?(?:rechte|pflichten)",
r"(?:auskunft|l(?:oe|ö)schung|berichtigung|einschr(?:ae|ä)nkung|daten(?:ue|ü)bertragbarkeit|widerspruch)",
r"art(?:ikel)?\s*\.?\s*(?:15|16|17|18|19|20|21|22)\s+(?:dsgvo|ds-?gvo)",
],
"severity": "HIGH",
"hint": "Art. 28(3)(e) DSGVO: Der Auftragsverarbeiter muss den Verantwortlichen bei der Erfuellung der Betroffenenrechte (Art. 15-22) unterstuetzen — insbesondere bei Auskunfts- und Loeschungsanfragen.",
},
{
"id": "avv_data_subject_forwarding",
"label": "Weiterleitung von Betroffenenanfragen geregelt",
"level": 2, "parent": "avv_data_subject_rights",
"patterns": [
r"(?:weiterleitung|weiterleiten|informieren)\s+(?:von\s+)?(?:anfragen|antraegen)\s+(?:betroffener|von\s+betroffenen)",
r"(?:betroffene|datensubjekt)[\s\S]{0,150}(?:weiterleiten|informieren|benachrichtigen)",
r"(?:anfrage|antrag|ersuchen)\s+(?:des|der|von)\s+(?:betroffenen|datensubjekt)",
],
"severity": "MEDIUM",
"hint": "Der AVV sollte regeln: Wer leitet Betroffenenanfragen weiter? In welcher Frist? Wer antwortet dem Betroffenen?",
},
# ── L1: DSFA-Unterstuetzung (Art. 28(3)(f)) ─────────────────────
{
"id": "avv_dpia",
"label": "Unterstuetzung bei DSFA und Konsultation (Art. 28(3)(f))",
"level": 1, "parent": None,
"patterns": [
r"datenschutz[\s-]?folgenabsch(?:ae|ä)tzung",
r"dsfa",
r"(?:dpia|data\s+protection\s+impact)",
r"art(?:ikel)?\s*\.?\s*(?:35|36)\s+(?:dsgvo|ds-?gvo)",
r"(?:unterstuetzung|mitwirkung)\s+(?:bei\s+)?(?:der\s+)?(?:einhaltung|erfuellung)\s+(?:der\s+)?(?:pflichten\s+)?(?:gem(?:ae|ä)(?:ss|ß)|nach)\s+art(?:ikel)?\s*\.?\s*(?:32|33|34|35|36)",
],
"severity": "MEDIUM",
"hint": "Art. 28(3)(f) DSGVO: Der Auftragsverarbeiter muss den Verantwortlichen bei der Durchfuehrung einer DSFA und bei der vorherigen Konsultation der Aufsichtsbehoerde (Art. 36) unterstuetzen.",
},
# ── L1: Loeschung/Rueckgabe (Art. 28(3)(g)) ─────────────────────
{
"id": "avv_deletion",
"label": "Loeschung/Rueckgabe nach Vertragsende (Art. 28(3)(g))",
"level": 1, "parent": None,
"patterns": [
r"(?:l(?:oe|ö)schung|rueckgabe|r(?:ue|ü)ckgabe)\s+(?:nach|bei|zum)\s+(?:vertragsende|beendigung|ablauf)",
r"(?:nach|bei)\s+(?:beendigung|ablauf|ende)\s+(?:des\s+)?(?:vertrag|auftrag)[\s\S]{0,100}(?:l(?:oe|ö)sch|rueckgabe|r(?:ue|ü)ckgabe|vernicht)",
r"(?:alle|saemtliche)\s+(?:personenbezogenen?\s+)?daten\s+(?:l(?:oe|ö)sch|vernicht|zurueckgeb|zur(?:ue|ü)ckgeb)",
],
"severity": "CRITICAL",
"hint": "Art. 28(3)(g) DSGVO: Nach Ende der Verarbeitung muessen alle personenbezogenen Daten geloescht oder zurueckgegeben werden — nach Wahl des Verantwortlichen. Ausnahme nur bei gesetzlicher Aufbewahrungspflicht.",
},
{
"id": "avv_deletion_deadline",
"label": "Frist fuer Loeschung/Rueckgabe definiert",
"level": 2, "parent": "avv_deletion",
"patterns": [
r"(?:\d+\s+(?:tage|werktage|wochen|monate)|(?:innerhalb|binnen)\s+(?:von\s+)?\d+)\s*[\s\S]{0,50}(?:l(?:oe|ö)sch|rueckgabe|r(?:ue|ü)ckgabe)",
r"(?:l(?:oe|ö)sch|rueckgabe|r(?:ue|ü)ckgabe)[\s\S]{0,100}(?:frist|innerhalb|binnen)\s+(?:von\s+)?\d+",
r"(?:unverz(?:ue|ü)glich|sofort|sp(?:ae|ä)testens)",
],
"severity": "HIGH",
"hint": "Best Practice: Loeschfrist von max. 30 Tagen nach Vertragsende. Viele Aufsichtsbehoerden beanstanden AVVs ohne konkrete Frist.",
},
{
"id": "avv_deletion_confirmation",
"label": "Loeschbestaetigung/Nachweis vorgesehen",
"level": 2, "parent": "avv_deletion",
"patterns": [
r"(?:l(?:oe|ö)sch|vernichtungs?)(?:best(?:ae|ä)tigung|nachweis|protokoll|zertifikat)",
r"(?:best(?:ae|ä)tigung|nachweis)\s+(?:der|ueber)\s+(?:die\s+)?(?:l(?:oe|ö)schung|vernichtung)",
r"schriftlich\s+best(?:ae|ä)tigen[\s\S]{0,50}(?:l(?:oe|ö)sch|vernicht)",
],
"severity": "MEDIUM",
"hint": "Best Practice: Schriftliche Loeschbestaetigung mit Datum und Umfang anfordern. Einige Aufsichtsbehoerden (z.B. LfDI BaWue) fordern dies als Nachweis der Pflichterfuellung.",
},
# ── L1: Audit-/Inspektionsrechte (Art. 28(3)(h)) ────────────────
{
"id": "avv_audit",
"label": "Audit- und Inspektionsrechte (Art. 28(3)(h))",
"level": 1, "parent": None,
"patterns": [
r"(?:audit|inspektion|ueberpruefung|ueberpr(?:ue|ü)fung|kontrolle|pruefung|pr(?:ue|ü)fung)(?:s)?(?:recht|rechte|moeglichkeit|befugnis)",
r"(?:vor[\s-]?ort|on[\s-]?site)[\s-]?(?:inspektion|kontrolle|pruefung|pr(?:ue|ü)fung)",
r"art(?:ikel)?\s*\.?\s*28\s*(?:\(3\)|abs(?:atz)?\s*\.?\s*3)\s*(?:(?:lit(?:era)?\s*\.?\s*)?h|buchst(?:abe)?\s*\.?\s*h)",
],
"severity": "HIGH",
"hint": "Art. 28(3)(h) DSGVO: Der Auftragsverarbeiter muss Ueberpruefungen (Audits, Inspektionen) durch den Verantwortlichen ermoeglichen und dazu beitragen. Dieses Recht darf vertraglich nicht ausgeschlossen oder unangemessen eingeschraenkt werden.",
},
{
"id": "avv_audit_onsite",
"label": "Vor-Ort-Inspektionen moeglich",
"level": 2, "parent": "avv_audit",
"patterns": [
r"vor[\s-]?ort[\s-]?(?:inspektion|kontrolle|pruefung|pr(?:ue|ü)fung|besichtigung)",
r"(?:inspektion|kontrolle|pruefung|pr(?:ue|ü)fung)\s+vor\s+ort",
r"(?:zugang|zutritt)\s+(?:zu\s+)?(?:den\s+)?(?:raeumen|r(?:ae|ä)umlichkeiten|betriebsstaetten|rechenzentren)",
],
"severity": "MEDIUM",
"hint": "Vor-Ort-Inspektionen sind ein Kernrecht nach Art. 28(3)(h) DSGVO. Einschraenkungen auf 'Remote Audits' oder 'nur Zertifikate' genuegen laut EuGH-Rechtsprechung nicht.",
},
{
"id": "avv_audit_independent",
"label": "Akzeptanz unabhaengiger Pruefer",
"level": 2, "parent": "avv_audit",
"patterns": [
r"(?:unabh(?:ae|ä)ngig|extern|dritte)\w*\s+(?:pruefer|pr(?:ue|ü)fer|auditor|sachverstaendig|gutachter|wirtschaftspruefer)",
r"(?:pruefer|pr(?:ue|ü)fer|auditor)\s+(?:des\s+verantwortlichen|des\s+auftraggebers|beauftragt)",
],
"severity": "LOW",
"hint": "Best Practice: AVV sollte ausdruecklich erwaehnen, dass der Verantwortliche auch unabhaengige Pruefer beauftragen kann. Dies ist besonders wichtig bei grossen Cloud-Anbietern (z.B. SOC2-Berichte als Ersatz).",
},
# ── L1: Datenschutzverletzungen (Art. 33(2)) ────────────────────
{
"id": "avv_breach",
"label": "Meldung von Datenschutzverletzungen (Art. 33(2))",
"level": 1, "parent": None,
"patterns": [
r"datenschutzverletzung",
r"(?:sicherheits)?vorfall",
r"data\s+breach",
r"(?:meld|benachrichtig|informier|unterricht)\w*[\s\S]{0,50}(?:verletzung|vorfall|sicherheit)",
r"art(?:ikel)?\s*\.?\s*33\s+(?:dsgvo|ds-?gvo)",
],
"severity": "CRITICAL",
"hint": "Art. 33(2) DSGVO: Der Auftragsverarbeiter muss den Verantwortlichen UNVERZUEGLICH ueber jede Datenschutzverletzung informieren. Die 72-Stunden-Frist des Verantwortlichen gegenueber der Aufsichtsbehoerde laeuft ab Kenntnis — daher sollte die Meldefrist im AVV enger sein (z.B. 24h).",
},
{
"id": "avv_breach_timeline",
"label": "Meldefrist fuer Datenschutzverletzungen definiert",
"level": 2, "parent": "avv_breach",
"patterns": [
r"(?:unverz(?:ue|ü)glich|ohne\s+(?:unangemessene|ungebuerliche)\s+verzoegerung|sofort|binnen\s+\d+\s+stunden|innerhalb\s+(?:von\s+)?\d+\s+stunden)",
r"\d+\s*(?:h|stunden|hours?)[\s\S]{0,50}(?:meld|benachrichtig|informier)",
r"(?:24|48|72)\s*(?:h|stunden)",
],
"severity": "HIGH",
"hint": "Best Practice: Meldefrist von max. 24 Stunden nach Kenntnis (nicht 72h — das ist die Frist des Verantwortlichen gegenueber der Behoerde). DSK empfiehlt in den Standard-AVV-Klauseln 'unverzueglich, spaetestens innerhalb von 48 Stunden'.",
},
{
"id": "avv_breach_content",
"label": "Mindestinhalt der Meldung definiert",
"level": 2, "parent": "avv_breach",
"patterns": [
r"(?:mindestinhalt|mindestangaben|informationen|inhalt)\s+(?:der|einer|zur)\s+(?:meldung|benachrichtigung|mitteilung)",
r"(?:art\s+der\s+verletzung|betroffene\s+datenkategorien|anzahl\s+betroffener|wahrscheinliche\s+folgen|ergriffene\s+massnahmen)",
],
"severity": "MEDIUM",
"hint": "Die Meldung sollte mindestens enthalten: Art der Verletzung, betroffene Datenkategorien, ungefaehre Anzahl Betroffener, wahrscheinliche Folgen, ergriffene Abhilfemassnahmen (Art. 33(3) DSGVO).",
},
# ── L1: Haftung ──────────────────────────────────────────────────
{
"id": "avv_liability",
"label": "Haftungsregelung",
"level": 1, "parent": None,
"patterns": [
r"haftung(?:s)?(?:regelung|beschraenkung|begrenzung|verteilung)?",
r"schadensersatz",
r"(?:freistellung|indemnit)",
r"art(?:ikel)?\s*\.?\s*82\s+(?:dsgvo|ds-?gvo)",
],
"severity": "MEDIUM",
"hint": "Art. 82 DSGVO regelt die Haftung bei Datenschutzverstoessen. Der AVV sollte eine klare Haftungsverteilung enthalten. Achtung: Haftungsausschluesse gegenueber Betroffenen sind unwirksam (Art. 82(4) DSGVO).",
},
]