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>
This commit is contained in:
Benjamin Admin
2026-05-12 23:14:54 +02:00
parent c867478791
commit 0326d5baab
8 changed files with 1359 additions and 0 deletions
@@ -0,0 +1,104 @@
"""
SCC (Standardvertragsklauseln / Standard Contractual Clauses) checks.
EU Commission Decision 2021/914 — the "new" SCCs.
Level 1: Pflichtbestandteil vorhanden?
Level 2: Bestandteil korrekt ausgefuellt?
"""
SCC_CHECKLIST = [
# ── L1: Modul-Wahl ──────────────────────────────────────────────
{
"id": "scc_module",
"label": "SCC-Modul gewaehlt (C2C, C2P, P2C, P2P)",
"level": 1, "parent": None,
"patterns": [
r"modul\s*(?:1|2|3|4|eins|zwei|drei|vier|i{1,3}v?)\s*[-:.]",
r"(?:module\s+(?:one|two|three|four|[1-4]))",
r"(?:controller|processor)\s+to\s+(?:controller|processor)",
r"verantwortliche[rn]?\s+(?:an|zu)\s+(?:auftragsverarbeiter|verantwortliche)",
],
"severity": "CRITICAL",
"hint": "Die EU SCC 2021 bestehen aus 4 Modulen. Das richtige Modul MUSS gewaehlt werden: Modul 1 (C2C), Modul 2 (C2P — haeufigster Fall), Modul 3 (P2P), Modul 4 (P2C). Falsches Modul = unwirksame SCC.",
},
# ── L1: Annex I — Vertragsparteien + Transfer ───────────────────
{
"id": "scc_annex_i",
"label": "Annex I: Vertragsparteien und Uebermittlung beschrieben",
"level": 1, "parent": None,
"patterns": [
r"(?:anhang|anlage|annex)\s*i\b",
r"(?:list\s+of\s+parties|verzeichnis\s+der\s+(?:vertrags)?parteien)",
r"(?:daten(?:ex|im)porteur|data\s+(?:ex|im)porter)",
],
"severity": "HIGH",
"hint": "Annex I der SCC muss benennen: Datenexporteur (Name, Adresse, Kontakt, Rolle), Datenimporteur (Name, Adresse, Kontakt, Rolle), Beschreibung der Uebermittlung (Kategorien, Empfaenger, Zweck, Dauer).",
},
{
"id": "scc_annex_i_parties",
"label": "Vertragsparteien identifiziert (Exporteur + Importeur)",
"level": 2, "parent": "scc_annex_i",
"patterns": [
r"(?:daten)?exporteur|data\s+exporter",
r"(?:daten)?importeur|data\s+importer",
],
"severity": "MEDIUM",
"hint": "Beide Parteien muessen vollstaendig identifiziert sein: Name, Adresse, Ansprechpartner, Rolle (Controller/Processor).",
},
# ── L1: Annex II — TOM ──────────────────────────────────────────
{
"id": "scc_annex_ii",
"label": "Annex II: Technische und organisatorische Massnahmen",
"level": 1, "parent": None,
"patterns": [
r"(?:anhang|anlage|annex)\s*ii\b",
r"technische[\s\S]{0,30}organisatorische[\s\S]{0,30}ma(?:ss|ß)nahmen[\s\S]{0,50}(?:anhang|anlage|annex)",
],
"severity": "HIGH",
"hint": "Annex II muss konkrete TOM beschreiben (nicht nur auf den Hauptvertrag verweisen). Die Massnahmen muessen dem Risiko der Uebermittlung angemessen sein.",
},
# ── L1: Annex III — Sub-Processors ───────────────────────────────
{
"id": "scc_annex_iii",
"label": "Annex III: Liste der Unterauftragsverarbeiter (bei Modul 2/3)",
"level": 1, "parent": None,
"patterns": [
r"(?:anhang|anlage|annex)\s*iii\b",
r"(?:liste|verzeichnis)\s+(?:der\s+)?(?:unter|sub)[\s-]?auftrags?",
],
"severity": "MEDIUM",
"hint": "Bei Modul 2 (C2P) und Modul 3 (P2P): Annex III muss alle Sub-Processors auflisten mit Name, Adresse, Taetigkeit. Bei Modul 1 (C2C) und 4 (P2C) nicht erforderlich.",
},
# ── L1: Transfer Impact Assessment (TIA) ────────────────────────
{
"id": "scc_tia",
"label": "Transfer Impact Assessment (TIA) durchgefuehrt/referenziert",
"level": 1, "parent": None,
"patterns": [
r"transfer\s+impact\s+assessment",
r"(?:uebermittlungs|transfer)[\s-]?(?:risiko|folgen)[\s-]?(?:bewertung|abschaetzung|analyse)",
r"(?:risikobewertung|risikoanalyse)[\s\S]{0,100}(?:drittland|uebermittlung|transfer)",
r"klausel\s*14\b|clause\s*14\b",
],
"severity": "HIGH",
"hint": "Klausel 14 der SCC verlangt ein Transfer Impact Assessment (TIA): Analyse der Rechtslage im Zielland, insbesondere Zugriffsbefugnisse der Behoerden. Ohne TIA sind die SCC unvollstaendig (EuGH Schrems II, C-311/18).",
},
# ── L1: Keine unzulaessigen Aenderungen ─────────────────────────
{
"id": "scc_no_modification",
"label": "Kernklauseln unmodifiziert (keine unzulaessigen Aenderungen)",
"level": 1, "parent": None,
"patterns": [
r"(?:standardvertragsklauseln|standard\s+contractual\s+clauses)[\s\S]{0,200}(?:unver(?:ae|ä)ndert|nicht\s+ge(?:ae|ä)ndert|2021/914|durchfuehrungsbeschluss)",
r"(?:durchf(?:ue|ü)hrungsbeschluss|implementing\s+decision)\s+(?:\(EU\)\s+)?2021/914",
],
"severity": "MEDIUM",
"hint": "Die Kernklauseln der SCC (Klauseln 1-18) duerfen nicht geaendert werden. Ergaenzende Klauseln sind erlaubt, solange sie nicht im Widerspruch stehen. Geaenderte SCC sind unwirksam.",
},
]