# UCCA Gap-Mapping v1.0
# Deterministische Zuordnung: Facts → Gaps → Controls → Escalation
# Keine LLM-Abhängigkeit in der Entscheidungslogik

version: "1.0"
description: "Gap-Mapping für Use-Case Compliance Assessment"
last_updated: "2026-01-29"

# =============================================================================
# GAP DEFINITIONS
# Jeder Gap wird durch Fakten ausgelöst und führt zu Controls + Escalation
# =============================================================================

gaps:

  # ---------------------------------------------------------------------------
  # VERTRAGSBASIERTE GAPS
  # ---------------------------------------------------------------------------

  GAP_AVV_MISSING:
    name: "Auftragsverarbeitungsvertrag fehlt"
    description: "Kein AVV mit dem KI-Anbieter vorhanden oder Status unbekannt"
    severity: critical
    
    trigger_conditions:
      # Wird ausgelöst wenn EINER dieser Conditions true ist
      - field: "contracts.avv.present"
        operator: "equals"
        value: false
      - field: "contracts.avv.present"
        operator: "equals"
        value: "unknown"
    
    required_controls:
      - CTRL_AVV
    
    escalation:
      level: E2
      reason: "Verarbeitung ohne AVV ist DSGVO-Verstoß (Art. 28)"
      auto_assign_to: "dpo"
    
    legal_refs:
      - "DSGVO Art. 28"
      - "DSGVO Art. 82 Abs. 1"

  GAP_AVV_INCOMPLETE:
    name: "AVV unvollständig"
    description: "AVV vorhanden, aber ohne erforderliche Klauseln"
    severity: high
    
    trigger_conditions:
      - field: "contracts.avv.present"
        operator: "equals"
        value: true
      - field: "contracts.avv.complete"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_AVV
    
    escalation:
      level: E1
      reason: "AVV muss Art. 28 Abs. 3 DSGVO Mindestinhalte enthalten"
      auto_assign_to: "legal"
    
    legal_refs:
      - "DSGVO Art. 28 Abs. 3"

  # ---------------------------------------------------------------------------
  # DRITTLAND-TRANSFER GAPS
  # ---------------------------------------------------------------------------

  GAP_TRANSFER_NO_SCC:
    name: "Drittlandtransfer ohne SCC"
    description: "Datenübermittlung in Drittland ohne Standardvertragsklauseln"
    severity: critical
    
    trigger_conditions:
      - field: "provider.location"
        operator: "in"
        value: ["us", "non_eu", "unknown"]
      - field: "contracts.scc.present"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_SCC
      - CTRL_TIA
    
    escalation:
      level: E2
      reason: "Drittlandtransfer ohne Garantien ist unzulässig (Schrems II)"
      auto_assign_to: "dpo"
    
    legal_refs:
      - "DSGVO Art. 44-49"
      - "EuGH Schrems II (C-311/18)"

  GAP_TRANSFER_NO_TIA:
    name: "Drittlandtransfer ohne TIA"
    description: "SCC vorhanden, aber kein Transfer Impact Assessment"
    severity: high
    
    trigger_conditions:
      - field: "provider.location"
        operator: "in"
        value: ["us", "non_eu"]
      - field: "contracts.scc.present"
        operator: "equals"
        value: true
      - field: "contracts.tia.present"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_TIA
    
    escalation:
      level: E1
      reason: "TIA erforderlich zur Bewertung des Schutzniveaus"
      auto_assign_to: "legal"
    
    legal_refs:
      - "EDPB Recommendations 01/2020"
      - "DSGVO Art. 46"

  GAP_SUBPROCESSORS_UNKNOWN:
    name: "Unterauftragsverarbeiter unbekannt"
    description: "Liste der Subprocessors nicht bekannt oder nicht dokumentiert"
    severity: high

    trigger_conditions:
      - field: "provider.subprocessors.known"
        operator: "equals"
        value: false

    required_controls:
      - CTRL_SUBPROCESSOR_LIST
      - CTRL_AVV

    escalation:
      level: E1
      reason: "Unterauftragsverarbeiter müssen gem. Art. 28 Abs. 2 DSGVO genehmigt werden"
      auto_assign_to: "legal"

    legal_refs:
      - "DSGVO Art. 28 Abs. 2"
      - "DSGVO Art. 28 Abs. 4"

  GAP_SCC_OUTDATED:
    name: "Veraltete SCC-Version"
    description: "Standardvertragsklauseln sind nicht die aktuelle Version (2021)"
    severity: high

    trigger_conditions:
      - field: "contracts.scc.present"
        operator: "equals"
        value: true
      - field: "contracts.scc.version"
        operator: "not_equals"
        value: "new_scc_2021"

    required_controls:
      - CTRL_SCC_UPDATE

    escalation:
      level: E1
      reason: "Alte SCC-Versionen sind seit Ende 2022 nicht mehr gültig"
      auto_assign_to: "legal"

    legal_refs:
      - "EU 2021/914"
      - "CNIL Transition Guidance"

  GAP_US_NO_DPF:
    name: "US-Provider ohne DPF-Zertifizierung"
    description: "US-Anbieter ist nicht unter Data Privacy Framework zertifiziert"
    severity: high

    trigger_conditions:
      - field: "provider.location"
        operator: "equals"
        value: "us"
      - field: "provider.dpf_certified"
        operator: "equals"
        value: false

    required_controls:
      - CTRL_SCC
      - CTRL_TIA
      - CTRL_DPF_CHECK

    escalation:
      level: E2
      reason: "US-Transfer ohne DPF erfordert SCC + TIA + ergänzende Maßnahmen"
      auto_assign_to: "dpo"

    legal_refs:
      - "DSGVO Art. 44ff"
      - "EuGH Schrems II (C-311/18)"
      - "EU-US DPF Beschluss 2023"

  GAP_SUPPORT_THIRD_COUNTRY:
    name: "Support-Zugriff aus Drittland"
    description: "Provider-Support kann von außerhalb des EWR auf Daten zugreifen"
    severity: medium

    trigger_conditions:
      - field: "provider.support_location"
        operator: "in"
        value: ["us", "non_eu", "global", "unknown"]
      - field: "data.contains_personal"
        operator: "equals"
        value: true

    required_controls:
      - CTRL_SCC
      - CTRL_ACCESS_LOGGING

    escalation:
      level: E1
      reason: "Remote-Zugriff aus Drittland = Datenübermittlung"
      auto_assign_to: "legal"

    legal_refs:
      - "DSGVO Art. 44"
      - "EDPB Guidelines on Data Transfers"

  GAP_SUBPROCESSOR_THIRD_COUNTRY:
    name: "Unterauftragsverarbeiter im Drittland"
    description: "Provider nutzt Subprozessoren außerhalb des EWR"
    severity: high

    trigger_conditions:
      - field: "provider.subprocessors.third_country"
        operator: "equals"
        value: true

    required_controls:
      - CTRL_SUBPROCESSOR_SCC
      - CTRL_TIA

    escalation:
      level: E1
      reason: "SCC-Kette zu Drittland-Subprozessoren erforderlich"
      auto_assign_to: "legal"

    legal_refs:
      - "DSGVO Art. 28 Abs. 4"
      - "DSGVO Art. 46"

  GAP_TIA_INADEQUATE:
    name: "TIA zeigt unzureichendes Schutzniveau"
    description: "Transfer Impact Assessment ergibt Defizite im Datenschutzniveau"
    severity: critical

    trigger_conditions:
      - field: "contracts.tia.result"
        operator: "equals"
        value: "inadequate"

    required_controls:
      - CTRL_TECHNICAL_SUPPLEMENTARY
      - CTRL_ENCRYPTION_E2E

    escalation:
      level: E2
      reason: "Zusätzliche technische Maßnahmen erforderlich um Transfer zu legitimieren"
      auto_assign_to: "dpo"

    legal_refs:
      - "EDPB Recommendations 01/2020"
      - "DSGVO Art. 32"

  GAP_TIA_NOT_FEASIBLE:
    name: "Transfer nicht möglich"
    description: "TIA ergibt: angemessenes Schutzniveau nicht erreichbar"
    severity: critical

    trigger_conditions:
      - field: "contracts.tia.result"
        operator: "equals"
        value: "not_feasible"

    required_controls: []

    escalation:
      level: E3
      reason: "Transfer muss unterbleiben - kein angemessenes Schutzniveau erreichbar"
      auto_assign_to: "dpo"
      requires_board_decision: true
      blocks_processing: true

    legal_refs:
      - "DSGVO Art. 44"
      - "EuGH Schrems II"

  GAP_LOCAL_HOSTING_NOT_VERIFIED:
    name: "Lokales Hosting nicht verifiziert"
    description: "Behauptung lokales Hosting, aber keine Verifizierung"
    severity: medium

    trigger_conditions:
      - field: "hosting.type"
        operator: "equals"
        value: "on_premises"
      - field: "hosting.verified"
        operator: "equals"
        value: false

    required_controls:
      - CTRL_HOSTING_VERIFICATION

    escalation:
      level: E0
      reason: "Hosting-Konfiguration sollte dokumentiert werden"
      auto_assign_to: null

    legal_refs:
      - "DSGVO Art. 5 Abs. 2 (Rechenschaftspflicht)"

  # ---------------------------------------------------------------------------
  # DATENMINIMIERUNG GAPS
  # ---------------------------------------------------------------------------

  GAP_NO_TRAINING_CLAUSE:
    name: "Keine Opt-Out-Klausel für KI-Training"
    description: "Provider kann Daten für Modelltraining verwenden"
    severity: high
    
    trigger_conditions:
      - field: "provider.uses_data_for_training"
        operator: "equals"
        value: true
      - field: "contracts.no_training_clause"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_NO_TRAINING_CLAUSE
    
    escalation:
      level: E1
      reason: "Zweckbindung verletzt wenn Daten für Training verwendet werden"
      auto_assign_to: "legal"
    
    legal_refs:
      - "DSGVO Art. 5 Abs. 1 lit. b"

  GAP_RETENTION_UNKNOWN:
    name: "Speicherdauer beim Provider unbekannt"
    description: "Prompt/Response Retention Policy nicht dokumentiert"
    severity: medium
    
    trigger_conditions:
      - field: "provider.prompt_retention.known"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_RETENTION_POLICY
    
    escalation:
      level: E0
      reason: "Speicherdauer muss dokumentiert werden"
      auto_assign_to: null
    
    legal_refs:
      - "DSGVO Art. 5 Abs. 1 lit. e"
      - "DSGVO Art. 13 Abs. 2 lit. a"

  GAP_CHAT_LOGS_RAW:
    name: "Chat-Logs im Klartext gespeichert"
    description: "Benutzerfragen werden ohne Anonymisierung gespeichert"
    severity: high
    
    trigger_conditions:
      - field: "logs.store_user_questions"
        operator: "equals"
        value: true
      - field: "logs.anonymization"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_PII_REDACTION_GATEWAY
      - CTRL_RETENTION_POLICY
    
    escalation:
      level: E1
      reason: "Klartext-Logs mit PII erfordern besondere Schutzmaßnahmen"
      auto_assign_to: "security"
    
    legal_refs:
      - "DSGVO Art. 5 Abs. 1 lit. c"
      - "DSGVO Art. 32"

  GAP_NO_PII_FILTER:
    name: "Kein PII-Filter vor LLM"
    description: "Personenbezogene Daten werden ungefiltert an LLM gesendet"
    severity: high
    
    trigger_conditions:
      - field: "data.contains_pii"
        operator: "equals"
        value: true
      - field: "technical.pii_filter.enabled"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_PII_REDACTION_GATEWAY
    
    escalation:
      level: E1
      reason: "PII-Minimierung vor LLM-Verarbeitung erforderlich"
      auto_assign_to: "security"
    
    legal_refs:
      - "DSGVO Art. 5 Abs. 1 lit. c"
      - "DSGVO Art. 25"

  # ---------------------------------------------------------------------------
  # CCTV / VIDEO GAPS
  # ---------------------------------------------------------------------------

  GAP_CCTV_PUBLIC_NO_SIGN:
    name: "CCTV im öffentlichen Bereich ohne Hinweisschild"
    description: "Videoüberwachung ohne transparente Information"
    severity: critical
    
    trigger_conditions:
      - field: "cctv.public_area"
        operator: "equals"
        value: true
      - field: "cctv.signage_present"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_CCTV_SIGNAGE
    
    escalation:
      level: E2
      reason: "Verstoß gegen Informationspflichten (Art. 13 DSGVO)"
      auto_assign_to: "dpo"
    
    legal_refs:
      - "DSGVO Art. 13"
      - "EDPB Guidelines 3/2019"

  GAP_CCTV_FACES_STORED:
    name: "Gesichtserkennung mit Speicherung"
    description: "CCTV erfasst Gesichter und speichert diese"
    severity: critical
    
    trigger_conditions:
      - field: "cctv.contains_faces"
        operator: "equals"
        value: true
      - field: "cctv.storage"
        operator: "in"
        value: ["local_7d", "local_30d", "cloud"]
    
    required_controls:
      - CTRL_FACE_BLURRING
      - CTRL_DSFA
      - CTRL_CCTV_POLICY
    
    escalation:
      level: E3
      reason: "Biometrische Daten erfordern DSFA und besondere Rechtsgrundlage"
      auto_assign_to: "dpo"
      requires_board_decision: true
    
    legal_refs:
      - "DSGVO Art. 9"
      - "DSGVO Art. 35"
      - "EDPB Guidelines 3/2019"

  GAP_CCTV_LICENSE_PLATES:
    name: "Kennzeichenerfassung ohne Rechtsgrundlage"
    description: "CCTV erfasst KFZ-Kennzeichen"
    severity: high
    
    trigger_conditions:
      - field: "cctv.contains_license_plates"
        operator: "equals"
        value: true
      - field: "cctv.license_plate_purpose"
        operator: "equals"
        value: "unknown"
    
    required_controls:
      - CTRL_ANPR_BLURRING
      - CTRL_CCTV_POLICY
    
    escalation:
      level: E2
      reason: "Kennzeichenerfassung erfordert spezifische Rechtsgrundlage"
      auto_assign_to: "dpo"
    
    legal_refs:
      - "DSGVO Art. 6"
      - "BDSG §4"

  GAP_CCTV_CLOUD_STORAGE:
    name: "CCTV-Aufnahmen in Cloud gespeichert"
    description: "Videoaufnahmen werden bei Cloud-Anbieter gespeichert"
    severity: high
    
    trigger_conditions:
      - field: "cctv.storage"
        operator: "equals"
        value: "cloud"
    
    required_controls:
      - CTRL_AVV
      - CTRL_ENCRYPTION_TRANSIT
      - CTRL_ENCRYPTION_REST
    
    escalation:
      level: E1
      reason: "Cloud-Speicherung von Videoaufnahmen erfordert zusätzliche Garantien"
      auto_assign_to: "security"
    
    legal_refs:
      - "DSGVO Art. 28"
      - "DSGVO Art. 32"

  # ---------------------------------------------------------------------------
  # AI ACT GAPS
  # ---------------------------------------------------------------------------

  GAP_AIACT_HIGHRISK_NO_CONFORMITY:
    name: "Hochrisiko-KI ohne Konformitätsbewertung"
    description: "KI-System fällt unter Hochrisiko-Kategorie ohne CE-Kennzeichnung"
    severity: critical
    
    trigger_conditions:
      - field: "aiact.risk_category"
        operator: "equals"
        value: "high"
      - field: "aiact.conformity_assessment"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_AI_CONFORMITY
      - CTRL_AI_DOCUMENTATION
      - CTRL_HITL_ENFORCED
    
    escalation:
      level: E3
      reason: "Hochrisiko-KI erfordert Konformitätsbewertung gem. AI Act"
      auto_assign_to: "dpo"
      requires_board_decision: true
    
    legal_refs:
      - "AI Act Art. 6"
      - "AI Act Annex III"

  GAP_AIACT_NO_HITL:
    name: "Hochrisiko-KI ohne Human Oversight"
    description: "Kein menschlicher Eingriff bei automatisierten Entscheidungen"
    severity: critical
    
    trigger_conditions:
      - field: "outputs.decision_with_legal_effect"
        operator: "equals"
        value: true
      - field: "processing.human_oversight"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_HITL_ENFORCED
    
    escalation:
      level: E2
      reason: "Automatisierte Entscheidungen mit rechtlicher Wirkung erfordern menschliche Aufsicht"
      auto_assign_to: "dpo"
    
    legal_refs:
      - "DSGVO Art. 22"
      - "AI Act Art. 14"

  GAP_AIACT_SYSTEMATIC_MONITORING:
    name: "Systematische Überwachung ohne Transparenz"
    description: "KI-System führt systematische Überwachung durch"
    severity: critical
    
    trigger_conditions:
      - field: "processing.systematic_monitoring"
        operator: "equals"
        value: true
      - field: "transparency.monitoring_disclosed"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_DSFA
      - CTRL_AI_TRANSPARENCY
    
    escalation:
      level: E3
      reason: "Systematische Überwachung ist hochriskant und muss offengelegt werden"
      auto_assign_to: "dpo"
      requires_board_decision: true
    
    legal_refs:
      - "DSGVO Art. 35 Abs. 3 lit. c"
      - "AI Act Art. 5"

  # ---------------------------------------------------------------------------
  # TRAINING / IMPROVEMENT GAPS
  # ---------------------------------------------------------------------------

  GAP_TRAINING_NO_CONSENT:
    name: "Nutzerdaten für Training ohne Einwilligung"
    description: "Chat-Logs werden für Modellverbesserung genutzt ohne explizite Zustimmung"
    severity: high
    
    trigger_conditions:
      - field: "improvement.strategy"
        operator: "in"
        value: ["finetune", "curated_samples"]
      - field: "improvement.user_consent"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_TRAINING_CONSENT
      - CTRL_DATA_SAMPLING_POLICY
    
    escalation:
      level: E2
      reason: "Training auf Nutzerdaten erfordert informierte Einwilligung"
      auto_assign_to: "dpo"
    
    legal_refs:
      - "DSGVO Art. 6 Abs. 1 lit. a"
      - "DSGVO Art. 7"

  GAP_TRAINING_NO_ANONYMIZATION:
    name: "Training ohne Anonymisierung"
    description: "Trainingsdaten enthalten personenbezogene Daten"
    severity: high
    
    trigger_conditions:
      - field: "improvement.strategy"
        operator: "in"
        value: ["finetune", "curated_samples"]
      - field: "improvement.anonymization"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_PII_REDACTION_GATEWAY
      - CTRL_SYNTHETIC_DATA
    
    escalation:
      level: E1
      reason: "Trainingsdaten sollten anonymisiert oder synthetisch sein"
      auto_assign_to: "security"
    
    legal_refs:
      - "DSGVO Art. 5 Abs. 1 lit. c"
      - "DSGVO Art. 89"

  # ---------------------------------------------------------------------------
  # GOVERNANCE GAPS
  # ---------------------------------------------------------------------------

  GAP_NO_DSFA:
    name: "Fehlende Datenschutz-Folgenabschätzung"
    description: "Hohes Risiko für Betroffene ohne DSFA"
    severity: critical
    
    trigger_conditions:
      - field: "risk.dsfa_required"
        operator: "equals"
        value: true
      - field: "governance.dsfa_completed"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_DSFA
    
    escalation:
      level: E2
      reason: "DSFA ist gesetzlich vorgeschrieben bei hohem Risiko"
      auto_assign_to: "dpo"
    
    legal_refs:
      - "DSGVO Art. 35"
      - "DSK Blacklist"

  GAP_NO_VVT_ENTRY:
    name: "Kein Eintrag im Verarbeitungsverzeichnis"
    description: "KI-Verarbeitung nicht im VVT dokumentiert"
    severity: medium
    
    trigger_conditions:
      - field: "governance.vvt_entry"
        operator: "equals"
        value: false
    
    required_controls:
      - CTRL_VVT_ENTRY
    
    escalation:
      level: E0
      reason: "VVT-Pflicht gem. Art. 30 DSGVO"
      auto_assign_to: null
    
    legal_refs:
      - "DSGVO Art. 30"

# =============================================================================
# ESCALATION LEVEL DEFINITIONS
# =============================================================================

escalation_levels:
  E0:
    name: "Self-Service"
    description: "Keine manuelle Prüfung erforderlich"
    sla_hours: null
    requires_approval: false
    
  E1:
    name: "Expert Review"
    description: "Fachliche Prüfung durch Legal/Security"
    sla_hours: 72
    requires_approval: true
    
  E2:
    name: "DPO Review"
    description: "Prüfung durch Datenschutzbeauftragten"
    sla_hours: 48
    requires_approval: true
    
  E3:
    name: "Advisory Board"
    description: "Entscheidung durch Datenschutz-Gremium"
    sla_hours: 120
    requires_approval: true
    requires_board_decision: true

# =============================================================================
# ROLE ASSIGNMENTS
# =============================================================================

role_assignments:
  dpo:
    name: "Datenschutzbeauftragter"
    can_approve: [E1, E2, E3]
    notification_channels: [email, webhook]
    
  legal:
    name: "Rechtsabteilung"
    can_approve: [E1]
    notification_channels: [email]
    
  security:
    name: "IT-Sicherheit"
    can_approve: [E1]
    notification_channels: [email, webhook]

# =============================================================================
# GAP AGGREGATION RULES
# =============================================================================

aggregation_rules:
  # Wenn mehrere Gaps vorliegen, wie wird das Gesamtrisiko berechnet?
  
  severity_order: [critical, high, medium, low]
  
  escalation_promotion:
    # Mehrere high-severity Gaps → höhere Escalation
    - condition: "count(severity=critical) >= 2"
      promote_to: E3
      reason: "Mehrere kritische Gaps erfordern Gremiumsentscheidung"
    
    - condition: "count(severity=high) >= 3"
      promote_to: E2
      reason: "Kumulation von Risiken erfordert DPO-Prüfung"

  control_deduplication:
    # Wenn derselbe Control von mehreren Gaps gefordert wird
    strategy: "unique"
    # Nur einmal in der finalen Liste aufführen
