package ucca func init() { AllRules = append(AllRules, rulesFJ()...) } // rulesFJ returns rules for categories F–J (R-050 to R-100) func rulesFJ() []Rule { return []Rule{ // ========================================================================= // F. Hosting (R-050 bis R-052) // ========================================================================= { Code: "R-050", Category: "F. Hosting", Title: "Third Country Transfer with PII", TitleDE: "Drittlandtransfer mit PII", Description: "Transferring PII to third countries requires safeguards", DescriptionDE: "Übermittlung von PII in Drittländer erfordert Schutzmaßnahmen", Severity: SeverityWARN, ScoreDelta: 20, GDPRRef: "Art. 44-49 DSGVO", Controls: []string{"C-SCC", "C-ENCRYPTION"}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return intake.Hosting.Region == "third_country" && intake.DataTypes.PersonalData }, Rationale: func(intake *UseCaseIntake) string { return "Übermittlung personenbezogener Daten in Drittländer erfordert Standardvertragsklauseln oder andere geeignete Garantien." }, }, { Code: "R-051", Category: "F. Hosting", Title: "EU Hosting - Compliant", TitleDE: "EU-Hosting - Konform", Description: "Hosting within EU is compliant with GDPR", DescriptionDE: "Hosting innerhalb der EU ist DSGVO-konform", Severity: SeverityINFO, ScoreDelta: 0, GDPRRef: "", Controls: []string{}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return intake.Hosting.Region == "eu" }, Rationale: func(intake *UseCaseIntake) string { return "Hosting innerhalb der EU/EWR erfüllt grundsätzlich die DSGVO-Anforderungen an den Datenstandort." }, }, { Code: "R-052", Category: "F. Hosting", Title: "On-Premise Hosting", TitleDE: "On-Premise-Hosting", Description: "On-premise hosting gives most control", DescriptionDE: "On-Premise-Hosting gibt die meiste Kontrolle", Severity: SeverityINFO, ScoreDelta: 0, GDPRRef: "", Controls: []string{"C-ENCRYPTION"}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return intake.Hosting.Region == "on_prem" }, Rationale: func(intake *UseCaseIntake) string { return "On-Premise-Hosting bietet maximale Kontrolle über Daten, erfordert aber eigene Sicherheitsmaßnahmen." }, }, // ========================================================================= // G. Transparenz (R-060 bis R-062) // ========================================================================= { Code: "R-060", Category: "G. Transparenz", Title: "No Human Review for Decisions", TitleDE: "Keine menschliche Überprüfung bei Entscheidungen", Description: "Decisions affecting individuals need human review option", DescriptionDE: "Entscheidungen, die Personen betreffen, benötigen menschliche Überprüfungsoption", Severity: SeverityWARN, ScoreDelta: 15, GDPRRef: "Art. 22(3) DSGVO", Controls: []string{"C-HITL", "C-DSR-PROCESS"}, Patterns: []string{"P-HITL-ENFORCED"}, Condition: func(intake *UseCaseIntake) bool { return (intake.Outputs.LegalEffects || intake.Outputs.AccessDecisions || intake.Purpose.DecisionMaking) && intake.Automation != AutomationAssistive }, Rationale: func(intake *UseCaseIntake) string { return "Betroffene haben das Recht auf menschliche Überprüfung bei automatisierten Entscheidungen." }, }, { Code: "R-061", Category: "G. Transparenz", Title: "External Recommendations", TitleDE: "Externe Empfehlungen", Description: "Recommendations to users need transparency", DescriptionDE: "Empfehlungen an Nutzer erfordern Transparenz", Severity: SeverityINFO, ScoreDelta: 5, GDPRRef: "Art. 13/14 DSGVO", Controls: []string{"C-TRANSPARENCY"}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return intake.Outputs.RecommendationsToUsers && intake.DataTypes.PersonalData }, Rationale: func(intake *UseCaseIntake) string { return "Personalisierte Empfehlungen erfordern Information der Nutzer über die KI-Verarbeitung." }, }, { Code: "R-062", Category: "G. Transparenz", Title: "Content Generation without Disclosure", TitleDE: "Inhaltsgenerierung ohne Offenlegung", Description: "AI-generated content should be disclosed", DescriptionDE: "KI-generierte Inhalte sollten offengelegt werden", Severity: SeverityINFO, ScoreDelta: 5, GDPRRef: "EU-AI-Act Art. 52", Controls: []string{"C-TRANSPARENCY"}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return intake.Outputs.ContentGeneration }, Rationale: func(intake *UseCaseIntake) string { return "KI-generierte Inhalte sollten als solche gekennzeichnet werden (EU-AI-Act Transparenzpflicht)." }, }, // ========================================================================= // H. Domain-spezifisch (R-070 bis R-074) // ========================================================================= { Code: "R-070", Category: "H. Domain-spezifisch", Title: "Education + Scoring = Blocked", TitleDE: "Bildung + Scoring = Blockiert", Description: "Automated scoring of students is prohibited", DescriptionDE: "Automatisches Scoring von Schülern ist verboten", Severity: SeverityBLOCK, ScoreDelta: 50, GDPRRef: "Art. 8, Art. 22 DSGVO", Controls: []string{}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return intake.Domain == DomainEducation && intake.DataTypes.MinorData && (intake.Purpose.EvaluationScoring || intake.Outputs.RankingsOrScores) }, Rationale: func(intake *UseCaseIntake) string { return "Automatisches Scoring oder Ranking von Schülern/Minderjährigen ist aufgrund des besonderen Schutzes unzulässig." }, }, { Code: "R-071", Category: "H. Domain-spezifisch", Title: "Healthcare + Automated Diagnosis", TitleDE: "Gesundheit + Automatische Diagnose", Description: "Automated medical decisions require strict controls", DescriptionDE: "Automatische medizinische Entscheidungen erfordern strenge Kontrollen", Severity: SeverityBLOCK, ScoreDelta: 45, GDPRRef: "Art. 9, Art. 22 DSGVO", Controls: []string{"C-HITL", "C-DSFA", "C-ART9-BASIS"}, Patterns: []string{"P-HITL-ENFORCED"}, Condition: func(intake *UseCaseIntake) bool { return intake.Domain == DomainHealthcare && intake.Automation == AutomationFullyAutomated && intake.Purpose.DecisionMaking }, Rationale: func(intake *UseCaseIntake) string { return "Vollautomatisierte medizinische Diagnosen oder Behandlungsentscheidungen sind ohne ärztliche Überprüfung unzulässig." }, }, { Code: "R-072", Category: "H. Domain-spezifisch", Title: "Finance + Automated Credit Scoring", TitleDE: "Finanzen + Automatisches Credit-Scoring", Description: "Automated credit decisions require transparency", DescriptionDE: "Automatische Kreditentscheidungen erfordern Transparenz", Severity: SeverityWARN, ScoreDelta: 20, GDPRRef: "Art. 22 DSGVO", Controls: []string{"C-HITL", "C-TRANSPARENCY", "C-DSR-PROCESS"}, Patterns: []string{"P-HITL-ENFORCED"}, Condition: func(intake *UseCaseIntake) bool { return intake.Domain == DomainFinance && (intake.Purpose.EvaluationScoring || intake.Outputs.RankingsOrScores) && intake.DataTypes.FinancialData }, Rationale: func(intake *UseCaseIntake) string { return "Automatische Kreditwürdigkeitsprüfung erfordert Erklärbarkeit und Widerspruchsmöglichkeit." }, }, { Code: "R-073", Category: "H. Domain-spezifisch", Title: "Utilities + RAG Chatbot = Low Risk", TitleDE: "Versorgungsunternehmen + RAG-Chatbot = Niedriges Risiko", Description: "RAG-based customer service chatbot is low risk", DescriptionDE: "RAG-basierter Kundenservice-Chatbot ist risikoarm", Severity: SeverityINFO, ScoreDelta: 0, GDPRRef: "", Controls: []string{}, Patterns: []string{"P-RAG-ONLY"}, Condition: func(intake *UseCaseIntake) bool { return intake.Domain == DomainUtilities && intake.ModelUsage.RAG && intake.Purpose.CustomerSupport && !intake.DataTypes.PersonalData }, Rationale: func(intake *UseCaseIntake) string { return "Ein RAG-basierter Kundenservice-Chatbot ohne Speicherung personenbezogener Daten ist ein Best-Practice-Beispiel." }, }, { Code: "R-074", Category: "H. Domain-spezifisch", Title: "Public Sector + Automated Decisions", TitleDE: "Öffentlicher Sektor + Automatische Entscheidungen", Description: "Public sector automated decisions need special care", DescriptionDE: "Automatische Entscheidungen im öffentlichen Sektor erfordern besondere Sorgfalt", Severity: SeverityWARN, ScoreDelta: 20, GDPRRef: "Art. 22 DSGVO", Controls: []string{"C-HITL", "C-TRANSPARENCY", "C-DSFA"}, Patterns: []string{"P-HITL-ENFORCED"}, Condition: func(intake *UseCaseIntake) bool { return intake.Domain == DomainPublic && intake.Purpose.DecisionMaking && intake.Automation != AutomationAssistive }, Rationale: func(intake *UseCaseIntake) string { return "Verwaltungsentscheidungen, die Bürger betreffen, erfordern besondere Transparenz und Überprüfungsmöglichkeiten." }, }, // ========================================================================= // I. Aggregation (R-090 bis R-092) - Implicit in Evaluate() // ========================================================================= { Code: "R-090", Category: "I. Aggregation", Title: "Block Rules Triggered", TitleDE: "Blockierungsregeln ausgelöst", Description: "Any BLOCK severity results in NO feasibility", DescriptionDE: "Jede BLOCK-Schwere führt zu NEIN-Machbarkeit", Severity: SeverityBLOCK, ScoreDelta: 0, GDPRRef: "", Controls: []string{}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return false // handled in aggregation logic }, Rationale: func(intake *UseCaseIntake) string { return "Eine oder mehrere kritische Regelverletzungen führen zur Einstufung als nicht umsetzbar." }, }, { Code: "R-091", Category: "I. Aggregation", Title: "Warning Rules Only", TitleDE: "Nur Warnungsregeln", Description: "Only WARN severity results in CONDITIONAL", DescriptionDE: "Nur WARN-Schwere führt zu BEDINGT", Severity: SeverityWARN, ScoreDelta: 0, GDPRRef: "", Controls: []string{}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return false // handled in aggregation logic }, Rationale: func(intake *UseCaseIntake) string { return "Warnungen erfordern Maßnahmen, blockieren aber nicht die Umsetzung." }, }, { Code: "R-092", Category: "I. Aggregation", Title: "Info Only - Clear Path", TitleDE: "Nur Info - Freier Weg", Description: "Only INFO severity results in YES", DescriptionDE: "Nur INFO-Schwere führt zu JA", Severity: SeverityINFO, ScoreDelta: 0, GDPRRef: "", Controls: []string{}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return false // handled in aggregation logic }, Rationale: func(intake *UseCaseIntake) string { return "Keine kritischen oder warnenden Regeln ausgelöst - Umsetzung empfohlen." }, }, // ========================================================================= // J. Erklärung (R-100) // ========================================================================= { Code: "R-100", Category: "J. Erklärung", Title: "Rejection Must Include Reason and Alternative", TitleDE: "Ablehnung muss Begründung und Alternative enthalten", Description: "When feasibility is NO, provide reason and alternative", DescriptionDE: "Bei Machbarkeit NEIN, Begründung und Alternative angeben", Severity: SeverityINFO, ScoreDelta: 0, GDPRRef: "", Controls: []string{}, Patterns: []string{}, Condition: func(intake *UseCaseIntake) bool { return false // handled in summary generation }, Rationale: func(intake *UseCaseIntake) string { return "Jede Ablehnung enthält eine klare Begründung und einen alternativen Ansatz." }, }, } }