/** * UCCA Legal Metadata - Kompositorisches Bewertungssystem * * Jedes Feld trägt seine eigene Rechtsgrundlage. * Das Ergebnis ist die Aggregation aller ausgewählten Felder. * Bei Problemen werden Lösungsvorschläge angezeigt. */ // ============================================================================ // Types // ============================================================================ export interface LegalReference { article: string // z.B. "Art. 9 DSGVO" title: string // z.B. "Besondere Kategorien personenbezogener Daten" relevance: string // Warum relevant für dieses Feld } export interface RequiredControl { id: string title: string description: string effort: 'low' | 'medium' | 'high' } export interface FieldMetadata { // Identifikation id: string label: string labelSimple: string // Einfache Sprache // Rechtliche Einordnung legalRefs: LegalReference[] // Risikobewertung riskScore: number // 0-30 pro Feld severity: 'INFO' | 'WARN' | 'BLOCK' // Erforderliche Maßnahmen wenn ausgewählt requiredControls: string[] // Erklärungen explanation: string // Fachsprache explanationSimple: string // Einfache Sprache // Hinweis für Nutzer userHint?: string } export interface ProblemSolution { id: string title: string description: string // Was ändert sich wenn Lösung akzeptiert wird removes_fields?: string[] // Diese Felder werden "entschärft" adds_controls?: string[] // Diese Kontrollen werden hinzugefügt new_risk_score?: number // Neuer Risiko-Beitrag (meist 0) effort: 'low' | 'medium' | 'high' // Frage an das Team team_question: string } export interface Problem { id: string title: string description: string severity: 'WARN' | 'BLOCK' // Welche Feld-Kombination löst das Problem aus triggered_by: { all_of?: string[] // Alle müssen ausgewählt sein any_of?: string[] // Mindestens eins muss ausgewählt sein none_of?: string[] // Keins darf ausgewählt sein (z.B. fehlende Einwilligung) } // Rechtliche Grundlage legalRefs: LegalReference[] // Mögliche Lösungen solutions: ProblemSolution[] } // ============================================================================ // Erforderliche Kontrollen / Maßnahmen // ============================================================================ export const CONTROLS: Record = { explicit_consent: { id: 'explicit_consent', title: 'Ausdrückliche Einwilligung', description: 'Betroffene müssen aktiv und informiert einwilligen (Opt-in, keine vorausgefüllten Checkboxen).', effort: 'medium', }, parental_consent: { id: 'parental_consent', title: 'Einwilligung der Erziehungsberechtigten', description: 'Bei Minderjährigen muss die Einwilligung der Eltern/Erziehungsberechtigten eingeholt werden.', effort: 'high', }, age_verification: { id: 'age_verification', title: 'Altersverifikation', description: 'Mechanismus zur Prüfung des Alters der Nutzer implementieren.', effort: 'medium', }, dsfa: { id: 'dsfa', title: 'Datenschutz-Folgenabschätzung (DSFA)', description: 'Formale DSFA nach Art. 35 DSGVO durchführen und dokumentieren.', effort: 'high', }, human_in_the_loop: { id: 'human_in_the_loop', title: 'Menschliche Überprüfung (HITL)', description: 'Jede automatisierte Entscheidung muss von einem Menschen überprüft werden können.', effort: 'medium', }, contestation_right: { id: 'contestation_right', title: 'Anfechtungsrecht', description: 'Betroffene müssen automatisierte Entscheidungen anfechten können.', effort: 'low', }, data_minimization: { id: 'data_minimization', title: 'Datenminimierung', description: 'Nur die unbedingt notwendigen Daten erheben und verarbeiten.', effort: 'low', }, anonymization: { id: 'anonymization', title: 'Anonymisierung', description: 'Personenbezogene Daten vor der Verarbeitung anonymisieren.', effort: 'medium', }, pseudonymization: { id: 'pseudonymization', title: 'Pseudonymisierung', description: 'Direkte Identifikatoren durch Pseudonyme ersetzen.', effort: 'medium', }, encryption: { id: 'encryption', title: 'Verschlüsselung', description: 'Daten bei Übertragung und Speicherung verschlüsseln.', effort: 'low', }, access_logging: { id: 'access_logging', title: 'Zugriffs-Protokollierung', description: 'Alle Zugriffe auf personenbezogene Daten protokollieren.', effort: 'low', }, retention_policy: { id: 'retention_policy', title: 'Löschkonzept', description: 'Automatische Löschung nach definierter Aufbewahrungsfrist.', effort: 'medium', }, scc: { id: 'scc', title: 'Standardvertragsklauseln (SCC)', description: 'EU-Standardvertragsklauseln mit Drittland-Anbieter abschließen.', effort: 'medium', }, tia: { id: 'tia', title: 'Transfer Impact Assessment', description: 'Bewertung der Datenschutzrisiken bei Drittlandtransfer.', effort: 'high', }, purpose_limitation: { id: 'purpose_limitation', title: 'Zweckbindung dokumentieren', description: 'Verarbeitungszweck klar definieren und dokumentieren.', effort: 'low', }, transparency: { id: 'transparency', title: 'Transparenz-Information', description: 'Betroffene über die Verarbeitung informieren (Datenschutzerklärung).', effort: 'low', }, pixelization: { id: 'pixelization', title: 'Verpixelung/Unkenntlichmachung', description: 'Identifizierende Merkmale (Gesichter, Kennzeichen) automatisch verpixeln.', effort: 'medium', }, no_training: { id: 'no_training', title: 'Kein KI-Training mit Daten', description: 'Daten dürfen nur für Inferenz, nicht für Training verwendet werden.', effort: 'low', }, } // ============================================================================ // Feld-Metadaten: Datentypen // ============================================================================ export const DATA_TYPE_METADATA: Record = { personal_data: { id: 'personal_data', label: 'Personenbezogene Daten', labelSimple: 'Namen, E-Mails, Adressen', legalRefs: [ { article: 'Art. 4(1) DSGVO', title: 'Definition personenbezogener Daten', relevance: 'Grundlegende Definition' }, { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit der Verarbeitung', relevance: 'Rechtsgrundlage erforderlich' }, ], riskScore: 10, severity: 'INFO', requiredControls: ['purpose_limitation', 'transparency'], explanation: 'Personenbezogene Daten erfordern eine Rechtsgrundlage nach Art. 6 DSGVO.', explanationSimple: 'Wenn Sie Daten verarbeiten, mit denen man Personen identifizieren kann, brauchen Sie einen guten Grund dafür.', }, article_9_data: { id: 'article_9_data', label: 'Besondere Kategorien (Art. 9)', labelSimple: 'Gesundheit, Religion, politische Meinung', legalRefs: [ { article: 'Art. 9 DSGVO', title: 'Besondere Kategorien personenbezogener Daten', relevance: 'Grundsätzliches Verarbeitungsverbot' }, { article: 'Art. 9(2) DSGVO', title: 'Ausnahmen vom Verbot', relevance: 'Ausdrückliche Einwilligung oder andere Ausnahme erforderlich' }, ], riskScore: 25, severity: 'WARN', requiredControls: ['explicit_consent', 'dsfa', 'encryption'], explanation: 'Besondere Kategorien personenbezogener Daten sind grundsätzlich verboten. Ausnahmen nur bei ausdrücklicher Einwilligung oder anderen Art. 9(2) Gründen.', explanationSimple: 'Gesundheitsdaten, religiöse Überzeugungen und ähnlich sensible Daten dürfen nur in Ausnahmefällen verarbeitet werden.', userHint: '⚠️ Hohes Risiko - DSFA wahrscheinlich erforderlich', }, minor_data: { id: 'minor_data', label: 'Daten von Minderjährigen', labelSimple: 'Daten von Kindern/Jugendlichen (unter 18)', legalRefs: [ { article: 'Art. 8 DSGVO', title: 'Bedingungen für die Einwilligung eines Kindes', relevance: 'Besondere Anforderungen an Einwilligung' }, { article: 'ErwGr. 38', title: 'Besonderer Schutz für Kinder', relevance: 'Kinder verdienen besonderen Schutz' }, ], riskScore: 20, severity: 'WARN', requiredControls: ['parental_consent', 'age_verification', 'data_minimization'], explanation: 'Daten von Minderjährigen erfordern besondere Schutzmaßnahmen. Bei Onlinediensten: Einwilligung ab 16 Jahren (in DE), darunter Elterneinwilligung.', explanationSimple: 'Bei Kindern und Jugendlichen gelten strengere Regeln. Oft müssen die Eltern zustimmen.', userHint: '👶 Besonderer Schutz für Minderjährige erforderlich', }, license_plates: { id: 'license_plates', label: 'KFZ-Kennzeichen', labelSimple: 'Auto-Kennzeichen', legalRefs: [ { article: 'Art. 4(1) DSGVO', title: 'Personenbezogene Daten', relevance: 'Kennzeichen ermöglichen Identifikation des Halters' }, { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Rechtsgrundlage für Verarbeitung erforderlich' }, ], riskScore: 15, severity: 'WARN', requiredControls: ['purpose_limitation', 'retention_policy'], explanation: 'KFZ-Kennzeichen sind personenbezogene Daten, da sie die Identifikation des Halters ermöglichen.', explanationSimple: 'Über ein Kennzeichen kann man den Fahrzeughalter herausfinden - daher sind es persönliche Daten.', userHint: '🚗 Kennzeichen = personenbezogene Daten', }, images: { id: 'images', label: 'Bilder von Personen', labelSimple: 'Fotos mit erkennbaren Gesichtern', legalRefs: [ { article: 'Art. 4(14) DSGVO', title: 'Biometrische Daten', relevance: 'Gesichtsbilder können biometrische Daten sein' }, { article: '§ 22 KUG', title: 'Recht am eigenen Bild', relevance: 'Einwilligung für Bildveröffentlichung' }, ], riskScore: 15, severity: 'WARN', requiredControls: ['explicit_consent', 'purpose_limitation'], explanation: 'Bilder von Personen sind personenbezogene Daten. Bei Gesichtserkennung: biometrische Daten (Art. 9).', explanationSimple: 'Fotos von Menschen brauchen deren Erlaubnis. Gesichtserkennung hat noch strengere Regeln.', }, audio: { id: 'audio', label: 'Sprachaufnahmen', labelSimple: 'Gespräche, Telefonate, Sprachnachrichten', legalRefs: [ { article: 'Art. 4(1) DSGVO', title: 'Personenbezogene Daten', relevance: 'Stimme ermöglicht Identifikation' }, { article: '§ 201 StGB', title: 'Vertraulichkeit des Wortes', relevance: 'Heimliche Aufnahmen sind strafbar' }, ], riskScore: 15, severity: 'WARN', requiredControls: ['explicit_consent', 'transparency'], explanation: 'Sprachaufnahmen sind personenbezogene Daten. Heimliche Aufnahmen können strafbar sein.', explanationSimple: 'Gespräche aufzunehmen erfordert die Zustimmung aller Beteiligten.', userHint: '🎤 Aufnahme nur mit Wissen der Betroffenen', }, location_data: { id: 'location_data', label: 'Standortdaten', labelSimple: 'GPS, Aufenthaltsorte, Bewegungsdaten', legalRefs: [ { article: 'Art. 4(1) DSGVO', title: 'Personenbezogene Daten', relevance: 'Standorte ermöglichen Profilbildung' }, { article: 'ErwGr. 75', title: 'Risiken für Betroffene', relevance: 'Bewegungsprofile sind risikobehaftet' }, ], riskScore: 20, severity: 'WARN', requiredControls: ['explicit_consent', 'data_minimization', 'retention_policy'], explanation: 'Standortdaten ermöglichen detaillierte Bewegungsprofile. Hohes Risiko für Betroffene.', explanationSimple: 'Standortdaten zeigen, wo jemand wann war. Das ist sehr persönlich.', }, biometric_data: { id: 'biometric_data', label: 'Biometrische Daten', labelSimple: 'Fingerabdrücke, Gesichtserkennung', legalRefs: [ { article: 'Art. 9(1) DSGVO', title: 'Besondere Kategorien', relevance: 'Biometrische Daten zur Identifikation' }, { article: 'Art. 4(14) DSGVO', title: 'Definition biometrischer Daten', relevance: 'Technische Verarbeitung physischer Merkmale' }, ], riskScore: 30, severity: 'WARN', requiredControls: ['explicit_consent', 'dsfa', 'encryption', 'access_logging'], explanation: 'Biometrische Daten zur eindeutigen Identifikation fallen unter Art. 9 DSGVO.', explanationSimple: 'Fingerabdrücke und Gesichtserkennung sind besonders geschützt.', userHint: '⚠️ Art. 9 DSGVO - Besondere Kategorie', }, financial_data: { id: 'financial_data', label: 'Finanzdaten', labelSimple: 'Gehälter, Kontodaten, Kreditwürdigkeit', legalRefs: [ { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Rechtsgrundlage erforderlich' }, { article: '§ 31 BDSG', title: 'Schutz des Wirtschaftsverkehrs', relevance: 'Scoring-Regelungen' }, ], riskScore: 15, severity: 'INFO', requiredControls: ['encryption', 'access_logging', 'purpose_limitation'], explanation: 'Finanzdaten erfordern besondere Sicherheitsmaßnahmen.', explanationSimple: 'Kontodaten und Gehälter müssen besonders geschützt werden.', }, employee_data: { id: 'employee_data', label: 'Mitarbeiterdaten', labelSimple: 'Personalakten, Bewertungen, Gehälter', legalRefs: [ { article: '§ 26 BDSG', title: 'Beschäftigtendatenschutz', relevance: 'Besondere Regelungen für Arbeitsverhältnisse' }, { article: 'Art. 88 DSGVO', title: 'Datenverarbeitung im Beschäftigungskontext', relevance: 'Nationale Regelungen möglich' }, ], riskScore: 15, severity: 'INFO', requiredControls: ['purpose_limitation', 'access_logging', 'transparency'], explanation: 'Beschäftigtendaten unterliegen dem § 26 BDSG. Betriebsrat ggf. einzubinden.', explanationSimple: 'Bei Mitarbeiterdaten gelten besondere Regeln. Der Betriebsrat hat Mitspracherecht.', userHint: '👔 Betriebsrat einbinden', }, customer_data: { id: 'customer_data', label: 'Kundendaten', labelSimple: 'Bestellungen, Kontaktdaten, Kaufhistorie', legalRefs: [ { article: 'Art. 6(1)(b) DSGVO', title: 'Vertragserfüllung', relevance: 'Oft Rechtsgrundlage für Kundendaten' }, ], riskScore: 10, severity: 'INFO', requiredControls: ['transparency', 'retention_policy'], explanation: 'Kundendaten können oft auf Basis der Vertragserfüllung verarbeitet werden.', explanationSimple: 'Kundendaten brauchen Sie für Bestellungen - das ist meist erlaubt.', }, public_data: { id: 'public_data', label: 'Nur öffentliche Daten', labelSimple: 'Keine personenbezogenen Daten', legalRefs: [ { article: 'ErwGr. 26', title: 'Anonyme Informationen', relevance: 'DSGVO gilt nicht für anonyme Daten' }, ], riskScore: 0, severity: 'INFO', requiredControls: [], explanation: 'Wenn keine personenbezogenen Daten verarbeitet werden, ist die DSGVO nicht anwendbar.', explanationSimple: 'Ohne persönliche Daten gelten die strengen Regeln nicht.', userHint: '✅ Geringes Risiko', }, } // ============================================================================ // Feld-Metadaten: Automatisierung // ============================================================================ export const AUTOMATION_METADATA: Record = { assistive: { id: 'assistive', label: 'Assistierend (KI macht Vorschläge)', labelSimple: 'KI macht Vorschläge, Mensch entscheidet', legalRefs: [], riskScore: 0, severity: 'INFO', requiredControls: [], explanation: 'Bei assistierender KI bleibt der Mensch Entscheider. Art. 22 DSGVO nicht betroffen.', explanationSimple: 'Die KI schlägt vor, Sie entscheiden. Das ist die sicherste Variante.', userHint: '✅ Empfohlen', }, semi_automated: { id: 'semi_automated', label: 'Teilautomatisiert (Mensch prüft)', labelSimple: 'KI filtert vor, Mensch prüft', legalRefs: [ { article: 'ErwGr. 71', title: 'Profiling und automatisierte Entscheidungen', relevance: 'Menschliche Überprüfung empfohlen' }, ], riskScore: 10, severity: 'INFO', requiredControls: ['human_in_the_loop'], explanation: 'Teilautomatisierung mit menschlicher Kontrolle ist meist unproblematisch.', explanationSimple: 'Die KI arbeitet vor, aber ein Mensch schaut drüber.', }, fully_automated: { id: 'fully_automated', label: 'Vollautomatisiert (keine menschliche Prüfung)', labelSimple: 'KI entscheidet alleine', legalRefs: [ { article: 'Art. 22(1) DSGVO', title: 'Automatisierte Einzelentscheidungen', relevance: 'Grundsätzliches Verbot bei rechtlicher Wirkung' }, { article: 'Art. 22(2) DSGVO', title: 'Ausnahmen', relevance: 'Erlaubt bei Vertrag, Gesetz oder Einwilligung' }, ], riskScore: 25, severity: 'WARN', requiredControls: ['human_in_the_loop', 'contestation_right', 'transparency'], explanation: 'Vollautomatisierte Entscheidungen mit rechtlicher Wirkung sind nach Art. 22 DSGVO grundsätzlich verboten.', explanationSimple: 'Wenn die KI alleine entscheidet und das Auswirkungen auf Menschen hat, ist das problematisch.', userHint: '⚠️ Art. 22 DSGVO beachten', }, } // ============================================================================ // Feld-Metadaten: Zweck // ============================================================================ export const PURPOSE_METADATA: Record = { customer_support: { id: 'customer_support', label: 'Kundenservice', labelSimple: 'Fragen beantworten, Hilfe anbieten', legalRefs: [ { article: 'Art. 6(1)(b) DSGVO', title: 'Vertragserfüllung', relevance: 'Oft Rechtsgrundlage' }, ], riskScore: 5, severity: 'INFO', requiredControls: ['transparency'], explanation: 'Kundenservice kann meist auf Vertragserfüllung gestützt werden.', explanationSimple: 'Kunden zu helfen ist meist erlaubt.', }, evaluation_scoring: { id: 'evaluation_scoring', label: 'Bewertung/Scoring von Personen', labelSimple: 'Personen bewerten, Punkte vergeben, einstufen', legalRefs: [ { article: 'Art. 22 DSGVO', title: 'Automatisierte Einzelentscheidungen', relevance: 'Bei automatischem Scoring relevant' }, { article: '§ 31 BDSG', title: 'Scoring', relevance: 'Besondere Regelungen für Scoring' }, ], riskScore: 20, severity: 'WARN', requiredControls: ['transparency', 'contestation_right', 'dsfa'], explanation: 'Scoring von Personen unterliegt strengen Anforderungen. Bei automatisierten Entscheidungen: Art. 22.', explanationSimple: 'Menschen zu bewerten oder einzustufen ist sensibel. Betroffene müssen das anfechten können.', userHint: '⚠️ Scoring ist risikobehaftet', }, decision_making: { id: 'decision_making', label: 'Automatisierte Entscheidungen', labelSimple: 'Genehmigungen, Ablehnungen, Zugang', legalRefs: [ { article: 'Art. 22 DSGVO', title: 'Automatisierte Einzelentscheidungen', relevance: 'Kernartikel für automatisierte Entscheidungen' }, ], riskScore: 25, severity: 'WARN', requiredControls: ['human_in_the_loop', 'contestation_right', 'transparency'], explanation: 'Automatisierte Entscheidungen mit rechtlicher Wirkung erfordern besondere Schutzmaßnahmen.', explanationSimple: 'Wenn die KI über Menschen entscheidet (Kredit, Bewerbung, etc.), gelten strenge Regeln.', userHint: '⚠️ Art. 22 DSGVO prüfen', }, profiling: { id: 'profiling', label: 'Profiling', labelSimple: 'Personenprofile erstellen, Verhalten analysieren', legalRefs: [ { article: 'Art. 4(4) DSGVO', title: 'Definition Profiling', relevance: 'Automatisierte Verarbeitung zur Bewertung' }, { article: 'Art. 22 DSGVO', title: 'Automatisierte Entscheidungen einschl. Profiling', relevance: 'Bei Entscheidungen aufgrund von Profiling' }, ], riskScore: 20, severity: 'WARN', requiredControls: ['transparency', 'dsfa'], explanation: 'Profiling ist die automatisierte Bewertung persönlicher Aspekte. Erfordert Transparenz und oft DSFA.', explanationSimple: 'Profile über Menschen zu erstellen erfordert besondere Vorsicht.', }, marketing: { id: 'marketing', label: 'Marketing/Werbung', labelSimple: 'Werbung, Newsletter, Kampagnen', legalRefs: [ { article: 'Art. 6(1)(f) DSGVO', title: 'Berechtigte Interessen', relevance: 'Direktwerbung kann berechtigtes Interesse sein' }, { article: '§ 7 UWG', title: 'Unzumutbare Belästigung', relevance: 'E-Mail-Werbung nur mit Einwilligung' }, ], riskScore: 10, severity: 'INFO', requiredControls: ['explicit_consent', 'transparency'], explanation: 'E-Mail-Marketing erfordert i.d.R. Einwilligung (Opt-in).', explanationSimple: 'Für Werbe-E-Mails brauchen Sie die Erlaubnis der Empfänger.', }, analytics: { id: 'analytics', label: 'Analyse/Statistik', labelSimple: 'Auswertungen, Berichte, Trends', legalRefs: [ { article: 'Art. 6(1)(f) DSGVO', title: 'Berechtigte Interessen', relevance: 'Analysen oft auf berechtigtes Interesse stützbar' }, ], riskScore: 5, severity: 'INFO', requiredControls: ['data_minimization'], explanation: 'Statistische Analysen sind oft auf berechtigtes Interesse stützbar, wenn datenminimiert.', explanationSimple: 'Auswertungen für interne Zwecke sind meist unproblematisch.', }, research: { id: 'research', label: 'Forschung', labelSimple: 'Wissenschaftliche Untersuchungen', legalRefs: [ { article: 'Art. 89 DSGVO', title: 'Garantien für Forschungszwecke', relevance: 'Privilegierung von Forschung' }, ], riskScore: 5, severity: 'INFO', requiredControls: ['data_minimization', 'pseudonymization'], explanation: 'Forschung genießt gewisse Privilegien, erfordert aber Schutzmaßnahmen.', explanationSimple: 'Forschung hat Sonderregeln, wenn die Daten geschützt werden.', }, } // ============================================================================ // Feld-Metadaten: Hosting // ============================================================================ export const HOSTING_METADATA: Record = { eu: { id: 'eu', label: 'EU/EWR', labelSimple: 'In Deutschland oder EU', legalRefs: [], riskScore: 0, severity: 'INFO', requiredControls: [], explanation: 'Hosting in der EU ist datenschutzrechtlich unproblematisch.', explanationSimple: 'Daten in Europa zu speichern ist die einfachste Lösung.', userHint: '✅ Empfohlen', }, third_country: { id: 'third_country', label: 'Drittland (außerhalb EU)', labelSimple: 'USA, Schweiz, UK, andere', legalRefs: [ { article: 'Art. 44 DSGVO', title: 'Grundsatz für Übermittlung', relevance: 'Besondere Anforderungen an Drittlandtransfer' }, { article: 'Art. 46 DSGVO', title: 'Geeignete Garantien', relevance: 'SCC oder andere Garantien erforderlich' }, ], riskScore: 15, severity: 'WARN', requiredControls: ['scc', 'tia'], explanation: 'Drittlandtransfer erfordert zusätzliche Garantien (z.B. SCC) und ein Transfer Impact Assessment.', explanationSimple: 'Daten außerhalb der EU zu speichern braucht extra Verträge und Prüfungen.', userHint: '⚠️ Zusätzliche Maßnahmen erforderlich', }, on_prem: { id: 'on_prem', label: 'On-Premise (eigene Server)', labelSimple: 'Auf unseren eigenen Servern', legalRefs: [], riskScore: 0, severity: 'INFO', requiredControls: ['encryption'], explanation: 'On-Premise bietet volle Kontrolle, erfordert aber eigene Sicherheitsmaßnahmen.', explanationSimple: 'Eigene Server geben volle Kontrolle, aber Sie sind für die Sicherheit verantwortlich.', }, } // ============================================================================ // Feld-Metadaten: Modell-Nutzung // ============================================================================ export const MODEL_USAGE_METADATA: Record = { rag: { id: 'rag', label: 'RAG (Dokumentensuche)', labelSimple: 'KI durchsucht meine Dokumente', legalRefs: [], riskScore: 5, severity: 'INFO', requiredControls: [], explanation: 'RAG-Ansätze sind datenschutzfreundlich, da keine Daten ins Modell fließen.', explanationSimple: 'Die KI sucht in Ihren Dokumenten, lernt aber nicht daraus. Das ist sicher.', userHint: '✅ Datenschutzfreundlich', }, inference: { id: 'inference', label: 'Nur Inferenz', labelSimple: 'KI nur nutzen, ohne eigene Daten', legalRefs: [], riskScore: 0, severity: 'INFO', requiredControls: [], explanation: 'Reine Inferenz ohne Datenspeicherung ist unproblematisch.', explanationSimple: 'Die KI nutzen ohne eigene Daten einzugeben ist sicher.', userHint: '✅ Geringes Risiko', }, finetune: { id: 'finetune', label: 'Fine-Tuning', labelSimple: 'KI mit meinen Daten anpassen', legalRefs: [ { article: 'Art. 5(1)(b) DSGVO', title: 'Zweckbindung', relevance: 'Training ist neuer Zweck' }, ], riskScore: 20, severity: 'WARN', requiredControls: ['explicit_consent', 'purpose_limitation', 'no_training'], explanation: 'Fine-Tuning mit personenbezogenen Daten erfordert eigene Rechtsgrundlage.', explanationSimple: 'Wenn die KI aus Ihren Daten lernt, ist das ein eigener Verarbeitungsschritt.', userHint: '⚠️ Eigene Rechtsgrundlage erforderlich', }, training: { id: 'training', label: 'Vollständiges Training', labelSimple: 'KI komplett mit meinen Daten trainieren', legalRefs: [ { article: 'Art. 5(1)(b) DSGVO', title: 'Zweckbindung', relevance: 'Training ist neuer Zweck' }, { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Eigene Rechtsgrundlage erforderlich' }, ], riskScore: 25, severity: 'WARN', requiredControls: ['explicit_consent', 'dsfa', 'purpose_limitation'], explanation: 'KI-Training mit personenbezogenen Daten ist ein eigenständiger Verarbeitungszweck.', explanationSimple: 'Die KI komplett mit Ihren Daten zu trainieren braucht klare Einwilligung.', userHint: '⚠️ Hohes Risiko', }, } // ============================================================================ // Probleme & Lösungen // ============================================================================ export const PROBLEMS: Problem[] = [ // KFZ-Kennzeichen ohne Einwilligung { id: 'license_plates_no_consent', title: 'KFZ-Kennzeichen ohne Einwilligung', description: 'Sie möchten KFZ-Kennzeichen verarbeiten, aber haben keine Einwilligung der Fahrzeughalter.', severity: 'BLOCK', triggered_by: { all_of: ['license_plates'], none_of: ['explicit_consent_obtained'], }, legalRefs: [ { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Keine Rechtsgrundlage vorhanden' }, ], solutions: [ { id: 'pixelize_plates', title: 'Kennzeichen automatisch verpixeln', description: 'Die Kennzeichen werden vor der Speicherung automatisch unkenntlich gemacht. Dadurch sind es keine personenbezogenen Daten mehr.', removes_fields: ['license_plates'], adds_controls: ['pixelization'], new_risk_score: 0, effort: 'medium', team_question: 'Ist das Projekt auch mit verpixelten Kennzeichen (nicht lesbar) sinnvoll?', }, { id: 'obtain_consent', title: 'Einwilligung einholen', description: 'Die Fahrzeughalter um Einwilligung bitten (z.B. bei Parkhausbetreibern mit Dauerparker-Verträgen).', adds_controls: ['explicit_consent'], new_risk_score: 10, effort: 'high', team_question: 'Können Sie die Einwilligung der Fahrzeughalter einholen?', }, ], }, // Gesichtserkennung ohne Einwilligung { id: 'biometrics_no_consent', title: 'Biometrische Daten ohne Einwilligung', description: 'Sie möchten biometrische Daten (z.B. Gesichtserkennung) verarbeiten, aber haben keine ausdrückliche Einwilligung.', severity: 'BLOCK', triggered_by: { all_of: ['biometric_data'], none_of: ['explicit_consent_obtained'], }, legalRefs: [ { article: 'Art. 9(1) DSGVO', title: 'Verarbeitungsverbot', relevance: 'Biometrische Daten sind besondere Kategorie' }, { article: 'Art. 9(2)(a) DSGVO', title: 'Ausdrückliche Einwilligung', relevance: 'Einwilligung als Ausnahme' }, ], solutions: [ { id: 'anonymize_faces', title: 'Gesichter automatisch verpixeln/anonymisieren', description: 'Gesichter werden vor der Speicherung automatisch unkenntlich gemacht.', removes_fields: ['biometric_data'], adds_controls: ['pixelization'], new_risk_score: 0, effort: 'medium', team_question: 'Funktioniert Ihr Projekt auch ohne erkennbare Gesichter?', }, { id: 'explicit_biometric_consent', title: 'Ausdrückliche Einwilligung einholen', description: 'Betroffene müssen aktiv und informiert in die Gesichtserkennung einwilligen.', adds_controls: ['explicit_consent', 'dsfa'], new_risk_score: 20, effort: 'high', team_question: 'Können Sie eine ausdrückliche Einwilligung aller Betroffenen sicherstellen?', }, ], }, // Minderjährige + automatisiertes Scoring { id: 'minor_automated_scoring', title: 'Automatisiertes Scoring von Minderjährigen', description: 'Sie möchten Minderjährige automatisiert bewerten oder einstufen. Das ist besonders problematisch.', severity: 'BLOCK', triggered_by: { all_of: ['minor_data', 'evaluation_scoring', 'fully_automated'], }, legalRefs: [ { article: 'Art. 22(1) DSGVO', title: 'Verbot automatisierter Entscheidungen', relevance: 'Grundsätzliches Verbot' }, { article: 'Art. 8 DSGVO', title: 'Schutz von Kindern', relevance: 'Besonderer Schutz für Minderjährige' }, ], solutions: [ { id: 'add_human_review', title: 'Menschliche Überprüfung einführen', description: 'Jede Bewertung wird von einem Menschen geprüft bevor sie wirksam wird.', removes_fields: ['fully_automated'], adds_controls: ['human_in_the_loop'], new_risk_score: 15, effort: 'medium', team_question: 'Können Sie sicherstellen, dass ein Mensch jede Bewertung prüft?', }, { id: 'remove_scoring', title: 'Auf Scoring verzichten', description: 'Statt Scoring nur informative Auswertungen ohne Entscheidungscharakter.', removes_fields: ['evaluation_scoring'], new_risk_score: 10, effort: 'low', team_question: 'Funktioniert Ihr Projekt auch ohne Bewertung/Scoring der Minderjährigen?', }, ], }, // Drittland + sensible Daten { id: 'third_country_sensitive', title: 'Sensible Daten im Drittland', description: 'Sie möchten besonders sensible Daten außerhalb der EU verarbeiten. Das erfordert umfangreiche Schutzmaßnahmen.', severity: 'WARN', triggered_by: { all_of: ['third_country'], any_of: ['article_9_data', 'biometric_data', 'minor_data'], }, legalRefs: [ { article: 'Art. 44 DSGVO', title: 'Drittlandtransfer', relevance: 'Besondere Anforderungen' }, { article: 'Art. 9 DSGVO', title: 'Sensible Daten', relevance: 'Zusätzlicher Schutz erforderlich' }, ], solutions: [ { id: 'move_to_eu', title: 'Hosting in der EU', description: 'Wählen Sie einen Anbieter mit Rechenzentren in der EU.', removes_fields: ['third_country'], new_risk_score: 0, effort: 'medium', team_question: 'Können Sie zu einem EU-Anbieter wechseln?', }, { id: 'implement_safeguards', title: 'Umfangreiche Schutzmaßnahmen implementieren', description: 'SCC, TIA, zusätzliche technische Maßnahmen implementieren.', adds_controls: ['scc', 'tia', 'encryption'], new_risk_score: 15, effort: 'high', team_question: 'Können Sie die erforderlichen Verträge und Maßnahmen umsetzen?', }, ], }, // KI-Training mit personenbezogenen Daten { id: 'training_with_pii', title: 'KI-Training mit personenbezogenen Daten', description: 'Sie möchten ein KI-Modell mit personenbezogenen Daten trainieren. Das erfordert besondere Rechtsgrundlagen.', severity: 'WARN', triggered_by: { all_of: ['training'], any_of: ['personal_data', 'article_9_data', 'employee_data', 'customer_data'], }, legalRefs: [ { article: 'Art. 5(1)(b) DSGVO', title: 'Zweckbindung', relevance: 'Training ist eigener Zweck' }, { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Eigene Rechtsgrundlage erforderlich' }, ], solutions: [ { id: 'use_rag_instead', title: 'RAG statt Training verwenden', description: 'Statt Training: Dokumente in Vektordatenbank ablegen und bei Anfragen durchsuchen.', removes_fields: ['training'], new_risk_score: 5, effort: 'low', team_question: 'Reicht es, wenn die KI Ihre Dokumente durchsuchen kann statt daraus zu lernen?', }, { id: 'anonymize_training_data', title: 'Trainingsdaten anonymisieren', description: 'Personenbezogene Daten vor dem Training vollständig anonymisieren.', adds_controls: ['anonymization'], new_risk_score: 5, effort: 'high', team_question: 'Können die Trainingsdaten vor dem Training anonymisiert werden?', }, { id: 'get_training_consent', title: 'Einwilligung für Training einholen', description: 'Betroffene explizit um Einwilligung für das KI-Training bitten.', adds_controls: ['explicit_consent', 'dsfa'], new_risk_score: 15, effort: 'high', team_question: 'Können Sie die Einwilligung aller Betroffenen für das KI-Training einholen?', }, ], }, ] // ============================================================================ // Hilfsfunktionen // ============================================================================ /** * Aggregiert alle ausgewählten Felder und berechnet das Ergebnis */ export function evaluateSelection(selection: { dataTypes: string[] automation: string purposes: string[] hosting: string modelUsage: string[] acceptedSolutions: string[] }): { totalRiskScore: number allLegalRefs: LegalReference[] allRequiredControls: string[] problems: Problem[] severity: 'INFO' | 'WARN' | 'BLOCK' } { const allLegalRefs: LegalReference[] = [] const allRequiredControls: Set = new Set() let totalRiskScore = 0 let maxSeverity: 'INFO' | 'WARN' | 'BLOCK' = 'INFO' // Aggregiere Datentypen for (const dt of selection.dataTypes) { const meta = DATA_TYPE_METADATA[dt] if (meta) { totalRiskScore += meta.riskScore allLegalRefs.push(...meta.legalRefs) meta.requiredControls.forEach(c => allRequiredControls.add(c)) if (meta.severity === 'BLOCK') maxSeverity = 'BLOCK' else if (meta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN' } } // Aggregiere Automatisierung const autoMeta = AUTOMATION_METADATA[selection.automation] if (autoMeta) { totalRiskScore += autoMeta.riskScore allLegalRefs.push(...autoMeta.legalRefs) autoMeta.requiredControls.forEach(c => allRequiredControls.add(c)) if (autoMeta.severity === 'BLOCK') maxSeverity = 'BLOCK' else if (autoMeta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN' } // Aggregiere Zwecke for (const p of selection.purposes) { const meta = PURPOSE_METADATA[p] if (meta) { totalRiskScore += meta.riskScore allLegalRefs.push(...meta.legalRefs) meta.requiredControls.forEach(c => allRequiredControls.add(c)) if (meta.severity === 'BLOCK') maxSeverity = 'BLOCK' else if (meta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN' } } // Aggregiere Hosting const hostMeta = HOSTING_METADATA[selection.hosting] if (hostMeta) { totalRiskScore += hostMeta.riskScore allLegalRefs.push(...hostMeta.legalRefs) hostMeta.requiredControls.forEach(c => allRequiredControls.add(c)) if (hostMeta.severity === 'BLOCK') maxSeverity = 'BLOCK' else if (hostMeta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN' } // Aggregiere Model Usage for (const mu of selection.modelUsage) { const meta = MODEL_USAGE_METADATA[mu] if (meta) { totalRiskScore += meta.riskScore allLegalRefs.push(...meta.legalRefs) meta.requiredControls.forEach(c => allRequiredControls.add(c)) if (meta.severity === 'BLOCK') maxSeverity = 'BLOCK' else if (meta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN' } } // Finde zutreffende Probleme const allSelectedFields = [ ...selection.dataTypes, selection.automation, ...selection.purposes, selection.hosting, ...selection.modelUsage, ] const triggeredProblems = PROBLEMS.filter(problem => { // Prüfe all_of: alle müssen ausgewählt sein if (problem.triggered_by.all_of) { if (!problem.triggered_by.all_of.every(f => allSelectedFields.includes(f))) { return false } } // Prüfe any_of: mindestens eins muss ausgewählt sein if (problem.triggered_by.any_of) { if (!problem.triggered_by.any_of.some(f => allSelectedFields.includes(f))) { return false } } // Prüfe none_of: keins darf ausgewählt sein (außer durch Lösung) if (problem.triggered_by.none_of) { const hasNoneOf = problem.triggered_by.none_of.some(f => allSelectedFields.includes(f) || selection.acceptedSolutions.includes(f) ) if (hasNoneOf) { return false } } // Prüfe ob Problem durch akzeptierte Lösung gelöst wurde const isSolved = problem.solutions.some(solution => selection.acceptedSolutions.includes(solution.id) ) return !isSolved }) // Probleme beeinflussen Severity for (const problem of triggeredProblems) { if (problem.severity === 'BLOCK') maxSeverity = 'BLOCK' else if (problem.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN' } // Dedupliziere Legal Refs const uniqueLegalRefs = allLegalRefs.filter((ref, index, self) => index === self.findIndex(r => r.article === ref.article) ) return { totalRiskScore: Math.min(totalRiskScore, 100), allLegalRefs: uniqueLegalRefs, allRequiredControls: Array.from(allRequiredControls), problems: triggeredProblems, severity: maxSeverity, } }