Compare commits
4 Commits
main
...
feature/be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
57462899f6 | ||
|
|
f23b872c54 | ||
|
|
55f7195edd | ||
|
|
b14be8583d |
284
control-pipeline/scripts/ingest_bag_urteile.py
Normal file
284
control-pipeline/scripts/ingest_bag_urteile.py
Normal file
@@ -0,0 +1,284 @@
|
||||
"""Ingest BAG (Bundesarbeitsgericht) court decisions into RAG.
|
||||
|
||||
Downloads PDFs from bundesarbeitsgericht.de and uploads them to the
|
||||
bp_compliance_datenschutz Qdrant collection via the RAG-Service API.
|
||||
|
||||
These decisions are curated for IT/KI-Mitbestimmung relevance (§87 BetrVG).
|
||||
|
||||
Usage:
|
||||
python scripts/ingest_bag_urteile.py [--rag-url https://macmini:8097] [--dry-run]
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
|
||||
import httpx
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Curated BAG decisions for IT/AI works council co-determination
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
BAG_DECISIONS = [
|
||||
# --- M365 / Copilot / Standardsoftware ---
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-20-21/",
|
||||
"case_number": "1 ABR 20/21",
|
||||
"date": "2022-03-08",
|
||||
"subject": "Microsoft Office 365 — Mitbestimmung",
|
||||
"keywords": ["Microsoft 365", "Standardsoftware", "Ueberwachung", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abn-36-18/",
|
||||
"case_number": "1 ABN 36/18",
|
||||
"date": "2018-10-23",
|
||||
"subject": "Excel / Standardsoftware — keine Geringfuegigkeitsschwelle",
|
||||
"keywords": ["Excel", "Standardsoftware", "Geringfuegigkeit", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-45-11/",
|
||||
"case_number": "1 ABR 45/11",
|
||||
"date": "2012-09-25",
|
||||
"subject": "SAP ERP im Personalwesen",
|
||||
"keywords": ["SAP", "ERP", "Personalwesen", "Verhaltenskontrolle", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-31-19/",
|
||||
"case_number": "1 ABR 31/19",
|
||||
"date": "2021-01-27",
|
||||
"subject": "E-Mail-Kommunikationssoftware — Mitbestimmung",
|
||||
"keywords": ["E-Mail", "Kommunikation", "Software", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-13-17/",
|
||||
"case_number": "1 ABR 13/17",
|
||||
"date": "2019-07-09",
|
||||
"subject": "IT-System fuer Mitarbeiterbefragung",
|
||||
"keywords": ["Mitarbeiterbefragung", "Feedback", "technische Einrichtung", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-16-23/",
|
||||
"case_number": "1 ABR 16/23",
|
||||
"date": "2024-07-16",
|
||||
"subject": "Headset-System — Geraetenutzungsdaten",
|
||||
"keywords": ["Headset", "Geraetenutzung", "Ueberwachung", "§87 BetrVG"],
|
||||
},
|
||||
# --- Ueberwachung, Social, Drittplattformen ---
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-7-15/",
|
||||
"case_number": "1 ABR 7/15",
|
||||
"date": "2016-12-13",
|
||||
"subject": "Facebook-Seite — indirekte Leistungsueberwachung",
|
||||
"keywords": ["Facebook", "Social Media", "Besucherbeitraege", "Ueberwachung", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-43-12/",
|
||||
"case_number": "1 ABR 43/12",
|
||||
"date": "2013-12-10",
|
||||
"subject": "Google Maps — indirekte Ueberwachung / Definition Ueberwachung",
|
||||
"keywords": ["Google Maps", "Routenplaner", "indirekte Ueberwachung", "Definition", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-68-13/",
|
||||
"case_number": "1 ABR 68/13",
|
||||
"date": "2015-07-21",
|
||||
"subject": "Ueberwachung durch technische Einrichtung eines Dritten (SaaS/Cloud)",
|
||||
"keywords": ["Drittsystem", "SaaS", "Cloud", "Ueberwachung", "§87 BetrVG"],
|
||||
},
|
||||
# --- Video, Belastung, Leistungskennzahlen ---
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-78-11/",
|
||||
"case_number": "1 ABR 78/11",
|
||||
"date": "2012-12-11",
|
||||
"subject": "Videoueberwachung — Grundsatzentscheidung",
|
||||
"keywords": ["Videoueberwachung", "Kamera", "Arbeitsplatz", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-46-15/",
|
||||
"case_number": "1 ABR 46/15",
|
||||
"date": "2017-04-25",
|
||||
"subject": "Belastungsstatistik — dauerhafte Kennzahlenueberwachung",
|
||||
"keywords": ["Belastungsstatistik", "Kennzahlen", "Analytics", "Persoenlichkeitsrecht", "§87 BetrVG"],
|
||||
},
|
||||
# --- Negative / abgrenzende Faelle ---
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-32-16/",
|
||||
"case_number": "1 ABR 32/16",
|
||||
"date": "2017-12-19",
|
||||
"subject": "Anti-Terror-Listen — keine Mitbestimmung",
|
||||
"keywords": ["Anti-Terror", "Sanktionsliste", "keine Mitbestimmung", "Abgrenzung", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-22-21/",
|
||||
"case_number": "1 ABR 22/21",
|
||||
"date": "2022-09-13",
|
||||
"subject": "Elektronische Arbeitszeiterfassung — Initiativrecht",
|
||||
"keywords": ["Arbeitszeiterfassung", "Initiativrecht", "digitale Systeme", "§87 BetrVG"],
|
||||
},
|
||||
# --- Historische Grundsatzentscheidungen ---
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-43-81/",
|
||||
"case_number": "1 ABR 43/81",
|
||||
"date": "1983-12-06",
|
||||
"subject": "Grundsatz technische Ueberwachung — Eignung genuegt",
|
||||
"keywords": ["Grundsatz", "Eignung", "technische Einrichtung", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-23-82/",
|
||||
"case_number": "1 ABR 23/82",
|
||||
"date": "1984-09-14",
|
||||
"subject": "Erste Grundlinie IT-Systeme",
|
||||
"keywords": ["IT-System", "Grundlinie", "technische Einrichtung", "§87 BetrVG"],
|
||||
},
|
||||
# --- E-Mail / Internet ---
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-46-10/",
|
||||
"case_number": "1 ABR 46/10",
|
||||
"date": "2012-02-07",
|
||||
"subject": "Internet- und E-Mail-Nutzung — Kommunikationsdaten",
|
||||
"keywords": ["Internet", "E-Mail", "Kommunikationsdaten", "Auswertung", "§87 BetrVG"],
|
||||
},
|
||||
# --- HR / Bewertungssysteme ---
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-40-07/",
|
||||
"case_number": "1 ABR 40/07",
|
||||
"date": "2008-07-22",
|
||||
"subject": "Beurteilungssysteme — §94/§95 BetrVG",
|
||||
"keywords": ["Beurteilung", "Bewertungssystem", "HR", "§94 BetrVG", "§95 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-16-07/",
|
||||
"case_number": "1 ABR 16/07",
|
||||
"date": "2008-03-18",
|
||||
"subject": "Personalfrageboegen — Bewertung",
|
||||
"keywords": ["Personalfragebogen", "Bewertung", "HR-Tools", "§94 BetrVG"],
|
||||
},
|
||||
# --- Video / physische Ueberwachung ---
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-21-03/",
|
||||
"case_number": "1 ABR 21/03",
|
||||
"date": "2004-06-29",
|
||||
"subject": "Videoueberwachung Arbeitsplatz",
|
||||
"keywords": ["Video", "Kamera", "Arbeitsplatz", "Ueberwachung", "§87 BetrVG"],
|
||||
},
|
||||
# --- Zustaendigkeit ---
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-2-05/",
|
||||
"case_number": "1 ABR 2/05",
|
||||
"date": "2006-05-03",
|
||||
"subject": "Zustaendigkeit Betriebsrat bei konzernweiten Tools",
|
||||
"keywords": ["Zustaendigkeit", "Konzern", "Gesamtbetriebsrat", "§87 BetrVG"],
|
||||
},
|
||||
{
|
||||
"url": "https://www.bundesarbeitsgericht.de/entscheidung/1-abr-58-04/",
|
||||
"case_number": "1 ABR 58/04",
|
||||
"date": "2006-03-28",
|
||||
"subject": "Mitbestimmung bei Einfuehrung technischer Systeme",
|
||||
"keywords": ["Systemeinführung", "technische Systeme", "Mitbestimmung", "§87 BetrVG"],
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def normalize_case_number(case_number: str) -> str:
|
||||
"""Normalize case number for use as regulation_id."""
|
||||
return re.sub(r"[^a-z0-9]", "_", case_number.lower()).strip("_")
|
||||
|
||||
|
||||
def download_decision(url: str, client: httpx.Client) -> bytes:
|
||||
"""Download a BAG decision page as HTML."""
|
||||
resp = client.get(url, follow_redirects=True)
|
||||
resp.raise_for_status()
|
||||
return resp.content
|
||||
|
||||
|
||||
def upload_to_rag(
|
||||
file_bytes: bytes,
|
||||
filename: str,
|
||||
metadata: dict,
|
||||
rag_url: str,
|
||||
client: httpx.Client,
|
||||
) -> dict:
|
||||
"""Upload a document to the RAG service."""
|
||||
files = {"file": (filename, file_bytes, "text/html")}
|
||||
data = {
|
||||
"collection": "bp_compliance_datenschutz",
|
||||
"data_type": "compliance_datenschutz",
|
||||
"bundesland": "bund",
|
||||
"use_case": "court_decision",
|
||||
"year": metadata.get("date", "2024")[:4],
|
||||
"chunk_strategy": "legal",
|
||||
"chunk_size": "512",
|
||||
"chunk_overlap": "50",
|
||||
"metadata_json": json.dumps(metadata),
|
||||
}
|
||||
resp = client.post(f"{rag_url}/api/v1/documents/upload", files=files, data=data)
|
||||
resp.raise_for_status()
|
||||
return resp.json()
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Ingest BAG court decisions into RAG")
|
||||
parser.add_argument("--rag-url", default="https://macmini:8097", help="RAG service URL")
|
||||
parser.add_argument("--dry-run", action="store_true", help="Download only, don't upload")
|
||||
args = parser.parse_args()
|
||||
|
||||
client = httpx.Client(timeout=60, verify=False)
|
||||
stats = {"downloaded": 0, "uploaded": 0, "errors": 0}
|
||||
|
||||
for decision in BAG_DECISIONS:
|
||||
case_id = normalize_case_number(decision["case_number"])
|
||||
print(f"\n--- {decision['case_number']}: {decision['subject']} ---")
|
||||
|
||||
# Download
|
||||
try:
|
||||
html_bytes = download_decision(decision["url"], client)
|
||||
stats["downloaded"] += 1
|
||||
print(f" Downloaded: {len(html_bytes)} bytes")
|
||||
except Exception as e:
|
||||
print(f" ERROR downloading: {e}")
|
||||
stats["errors"] += 1
|
||||
continue
|
||||
|
||||
if args.dry_run:
|
||||
continue
|
||||
|
||||
# Upload
|
||||
metadata = {
|
||||
"regulation_id": f"bag_{case_id}",
|
||||
"regulation_name_de": f"BAG {decision['case_number']} — {decision['subject']}",
|
||||
"category": "arbeitsrecht",
|
||||
"source": "bundesarbeitsgericht.de",
|
||||
"doc_type": "court_decision",
|
||||
"license": "public_domain_§5_UrhG",
|
||||
"court": "BAG",
|
||||
"case_number": decision["case_number"],
|
||||
"date": decision["date"],
|
||||
"subject_matter": decision["subject"],
|
||||
"keywords": decision["keywords"],
|
||||
}
|
||||
|
||||
try:
|
||||
result = upload_to_rag(
|
||||
html_bytes,
|
||||
f"bag_{case_id}.html",
|
||||
metadata,
|
||||
args.rag_url,
|
||||
client,
|
||||
)
|
||||
stats["uploaded"] += 1
|
||||
print(f" Uploaded: {result.get('chunks_count', '?')} chunks, doc_id={result.get('document_id', '?')}")
|
||||
except Exception as e:
|
||||
print(f" ERROR uploading: {e}")
|
||||
stats["errors"] += 1
|
||||
|
||||
time.sleep(1) # Rate limiting
|
||||
|
||||
print(f"\n=== Done: {stats['downloaded']} downloaded, {stats['uploaded']} uploaded, {stats['errors']} errors ===")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
214
document-templates/generators/betriebsvereinbarung_template.py
Normal file
214
document-templates/generators/betriebsvereinbarung_template.py
Normal file
@@ -0,0 +1,214 @@
|
||||
"""Betriebsvereinbarung template generator — creates BV draft from UCCA assessment.
|
||||
|
||||
Generates a modular works council agreement (Betriebsvereinbarung) based on:
|
||||
- UCCA Assessment result (triggered rules, risk score, obligations)
|
||||
- Company profile (name, location, works council)
|
||||
- System details (name, type, modules)
|
||||
|
||||
Sections A-M follow the template in migration 006.
|
||||
"""
|
||||
|
||||
from typing import Optional
|
||||
|
||||
# -- Default verbotene Nutzungen nach BAG-Rechtsprechung --------------------
|
||||
|
||||
DEFAULT_VERBOTENE_NUTZUNGEN = [
|
||||
"Verdeckte Leistungs- oder Verhaltenskontrolle einzelner Beschaeftigter",
|
||||
"Erstellung individueller Persoenlichkeitsprofile oder Verhaltensanalysen",
|
||||
"Nutzung von Nutzungshistorien zu disziplinarischen Zwecken",
|
||||
"Automatisierte Personalentscheidungen ohne menschliche Ueberpruefung (Art. 22 DSGVO)",
|
||||
"Personenbezogene Rankings oder Leistungsvergleiche ohne gesonderte Mitbestimmung",
|
||||
"Korrelation von Systemnutzungsdaten mit Leistungsbeurteilungen",
|
||||
]
|
||||
|
||||
AI_VERBOTENE_NUTZUNGEN = [
|
||||
"Einsatz von KI-Funktionen zur biometrischen Echtzeit-Identifizierung am Arbeitsplatz",
|
||||
"KI-gestuetztes Social Scoring von Beschaeftigten",
|
||||
"Nutzung von KI-generierten Bewertungen als alleinige Grundlage fuer Personalentscheidungen",
|
||||
]
|
||||
|
||||
# -- Standard-TOM Massnahmen ------------------------------------------------
|
||||
|
||||
DEFAULT_TOM = [
|
||||
"Rollen- und Rechtekonzept mit Least-Privilege-Prinzip",
|
||||
"Verschluesselung der Daten bei Uebertragung (TLS 1.2+) und Speicherung (AES-256)",
|
||||
"Protokollierung aller administrativen Zugriffe",
|
||||
"Pseudonymisierung personenbezogener Daten, wo technisch moeglich",
|
||||
"Deaktivierung nicht benoetigter Telemetrie- und Diagnosefunktionen",
|
||||
"Getrennte Umgebungen fuer Test und Produktion",
|
||||
"Regelmaessige Sicherheitsupdates und Patch-Management",
|
||||
"Zugangsschutz durch Multi-Faktor-Authentifizierung fuer Administratoren",
|
||||
]
|
||||
|
||||
# -- Standard erlaubte Reports ----------------------------------------------
|
||||
|
||||
DEFAULT_ERLAUBTE_REPORTS = [
|
||||
"Systemgesundheit und Verfuegbarkeit (ohne Personenbezug)",
|
||||
"Lizenznutzung auf aggregierter Ebene (Abteilung/Standort, nicht Person)",
|
||||
"Sicherheitsereignisse und Anomalien",
|
||||
"Speicherplatznutzung (ohne Personenbezug)",
|
||||
"Fehlerstatistiken (technisch, nicht personenbezogen)",
|
||||
]
|
||||
|
||||
# -- Standard Datenarten bei IT/KI-Systemen ---------------------------------
|
||||
|
||||
DATENARTEN_MAP = {
|
||||
"email": "E-Mail-Metadaten (Absender, Empfaenger, Zeitstempel — NICHT Inhalte)",
|
||||
"chat": "Chat-/Messaging-Metadaten (Teilnehmer, Zeitstempel)",
|
||||
"document": "Dokumentenmetadaten (Ersteller, Aenderungsdatum, Dateiname)",
|
||||
"login": "Anmeldedaten (Benutzername, Zeitstempel, IP-Adresse)",
|
||||
"usage": "Nutzungsdaten (aufgerufene Funktionen, Nutzungsdauer — aggregiert)",
|
||||
"prompt": "KI-Eingaben und -Ausgaben (Prompts, Antworten)",
|
||||
"calendar": "Kalendereintraege (Betreff, Teilnehmer, Zeiten)",
|
||||
"hr": "Personalstammdaten (Name, Abteilung, Position, Eintrittsdatum)",
|
||||
"performance": "Leistungsdaten (Kennzahlen, Bewertungen, Zielvereinbarungen)",
|
||||
"video": "Videoaufnahmen (Arbeitsplatz, Zugangsbereiche)",
|
||||
"location": "Standortdaten (GPS, WLAN-basierte Ortung, Gebaeudezutritt)",
|
||||
}
|
||||
|
||||
|
||||
def generate_betriebsvereinbarung_draft(ctx: dict) -> dict:
|
||||
"""Generate a Betriebsvereinbarung draft from company + assessment context.
|
||||
|
||||
Args:
|
||||
ctx: Dict with keys:
|
||||
Required:
|
||||
- company_name: str
|
||||
- system_name: str
|
||||
- system_description: str
|
||||
Optional:
|
||||
- company_address: str
|
||||
- employer_representative: str
|
||||
- works_council_chair: str
|
||||
- system_vendor: str
|
||||
- locations: list[str]
|
||||
- departments: list[str]
|
||||
- modules: list[str]
|
||||
- purposes: list[str]
|
||||
- data_types: list[str] — keys from DATENARTEN_MAP
|
||||
- is_ai_system: bool
|
||||
- has_employee_monitoring: bool
|
||||
- has_hr_features: bool
|
||||
- has_video: bool
|
||||
- dpo_name: str
|
||||
- dpo_contact: str
|
||||
- audit_interval: str — e.g. "12 Monate"
|
||||
- duration: str — e.g. "unbefristet"
|
||||
- notice_period: str — e.g. "3 Monate"
|
||||
- retention_audit_logs: str — e.g. "90 Tage"
|
||||
- retention_usage_data: str — e.g. "30 Tage"
|
||||
- retention_prompts: str — e.g. "deaktiviert"
|
||||
- additional_forbidden: list[str]
|
||||
- additional_tom: list[str]
|
||||
- additional_reports: list[str]
|
||||
- betrvg_conflict_score: int — 0-100
|
||||
|
||||
Returns:
|
||||
Dict with placeholder values ready for template substitution.
|
||||
"""
|
||||
result = {}
|
||||
|
||||
# Basic info
|
||||
result["UNTERNEHMEN_NAME"] = ctx.get("company_name", "{{UNTERNEHMEN_NAME}}")
|
||||
result["UNTERNEHMEN_SITZ"] = ctx.get("company_address", "{{UNTERNEHMEN_SITZ}}")
|
||||
result["ARBEITGEBER_VERTRETER"] = ctx.get("employer_representative", "{{ARBEITGEBER_VERTRETER}}")
|
||||
result["BETRIEBSRAT_VORSITZ"] = ctx.get("works_council_chair", "{{BETRIEBSRAT_VORSITZ}}")
|
||||
result["SYSTEM_NAME"] = ctx.get("system_name", "{{SYSTEM_NAME}}")
|
||||
result["SYSTEM_BESCHREIBUNG"] = ctx.get("system_description", "{{SYSTEM_BESCHREIBUNG}}")
|
||||
result["SYSTEM_HERSTELLER"] = ctx.get("system_vendor", "")
|
||||
result["DSB_NAME"] = ctx.get("dpo_name", "{{DSB_NAME}}")
|
||||
result["DSB_KONTAKT"] = ctx.get("dpo_contact", "{{DSB_KONTAKT}}")
|
||||
|
||||
# B. Geltungsbereich
|
||||
locations = ctx.get("locations", [])
|
||||
result["GELTUNGSBEREICH_STANDORTE"] = _bullet_list(locations) if locations else "Alle Standorte der {{UNTERNEHMEN_NAME}}"
|
||||
|
||||
departments = ctx.get("departments", [])
|
||||
result["GELTUNGSBEREICH_BEREICHE"] = _bullet_list(departments) if departments else "Alle Beschaeftigten"
|
||||
|
||||
modules = ctx.get("modules", [])
|
||||
result["GELTUNGSBEREICH_MODULE"] = _bullet_list(modules) if modules else "Alle Module und Dienste von {{SYSTEM_NAME}}"
|
||||
|
||||
# C. Zweck
|
||||
purposes = ctx.get("purposes", [])
|
||||
result["ZWECK_BESCHREIBUNG"] = _bullet_list(purposes) if purposes else "{{ZWECK_BESCHREIBUNG}}"
|
||||
|
||||
# C.2 Verbotene Nutzungen
|
||||
forbidden = list(DEFAULT_VERBOTENE_NUTZUNGEN)
|
||||
if ctx.get("is_ai_system"):
|
||||
forbidden.extend(AI_VERBOTENE_NUTZUNGEN)
|
||||
forbidden.extend(ctx.get("additional_forbidden", []))
|
||||
result["VERBOTENE_NUTZUNGEN"] = _bullet_list(forbidden)
|
||||
|
||||
# D. Datenarten
|
||||
data_type_keys = ctx.get("data_types", [])
|
||||
datenarten = []
|
||||
for key in data_type_keys:
|
||||
if key in DATENARTEN_MAP:
|
||||
datenarten.append(DATENARTEN_MAP[key])
|
||||
else:
|
||||
datenarten.append(key)
|
||||
result["DATENARTEN_LISTE"] = _bullet_list(datenarten) if datenarten else "{{DATENARTEN_LISTE}}"
|
||||
|
||||
# E. Rollen
|
||||
result["ROLLEN_ADMIN"] = ctx.get("roles_admin", "IT-Administration: Systemkonfiguration, Benutzerverwaltung, Sicherheitsupdates")
|
||||
result["ROLLEN_FUEHRUNGSKRAFT"] = ctx.get("roles_manager", "Fuehrungskraefte: Nur aggregierte, nicht-personenbezogene Reports")
|
||||
result["ROLLEN_REPORTING"] = ctx.get("roles_reporting", "Controlling/Reporting: Nur freigegebene Standardreports (siehe Abschnitt G)")
|
||||
|
||||
# F. Transparenz
|
||||
result["TRANSPARENZ_INFO"] = ctx.get("transparency_info",
|
||||
"Die Information erfolgt schriftlich und in einer Informationsveranstaltung vor Einfuehrung des Systems.")
|
||||
|
||||
# G. Reports
|
||||
reports = list(DEFAULT_ERLAUBTE_REPORTS)
|
||||
reports.extend(ctx.get("additional_reports", []))
|
||||
result["ERLAUBTE_REPORTS"] = _bullet_list(reports)
|
||||
|
||||
# H. Speicherfristen
|
||||
result["SPEICHERFRIST_AUDIT_LOGS"] = ctx.get("retention_audit_logs", "90 Tage")
|
||||
result["SPEICHERFRIST_NUTZUNGSDATEN"] = ctx.get("retention_usage_data", "30 Tage")
|
||||
result["SPEICHERFRIST_CHAT_PROMPTS"] = ctx.get("retention_prompts", "deaktiviert")
|
||||
|
||||
# I. TOM
|
||||
tom = list(DEFAULT_TOM)
|
||||
tom.extend(ctx.get("additional_tom", []))
|
||||
# Intensivere Schutzmassnahmen bei hohem Konflikt-Score
|
||||
conflict_score = ctx.get("betrvg_conflict_score", 0)
|
||||
if conflict_score >= 50:
|
||||
tom.append("Automatische Anomalie-Erkennung bei ungewoehnlichen Admin-Zugriffen")
|
||||
tom.append("Quartalsweise Datenschutz-Audit durch externen Prueer")
|
||||
if conflict_score >= 75:
|
||||
tom.append("Betriebsrat erhaelt Leserechte auf Audit-Log-Dashboard")
|
||||
tom.append("Jede Sonderauswertung wird dem Betriebsrat innerhalb von 24h gemeldet")
|
||||
result["TOM_MASSNAHMEN"] = _bullet_list(tom)
|
||||
|
||||
# J. Change-Management
|
||||
result["CHANGE_MANAGEMENT_PROZESS"] = ctx.get("change_process",
|
||||
"Die Arbeitgeberin informiert den Betriebsrat schriftlich ueber geplante Aenderungen "
|
||||
"mindestens 14 Kalendertage vor Umsetzung. Bei sicherheitskritischen Updates kann die "
|
||||
"Frist auf 3 Werktage verkuerzt werden.")
|
||||
|
||||
# K. Audit
|
||||
result["AUDIT_INTERVALL"] = ctx.get("audit_interval", "12 Monate")
|
||||
|
||||
# L. Beschwerde
|
||||
result["BESCHWERDE_ANSPRECHPARTNER"] = ctx.get("complaint_contacts",
|
||||
"- Direkter Vorgesetzter\n- Betriebsrat ({{BETRIEBSRAT_VORSITZ}})\n"
|
||||
"- Datenschutzbeauftragter ({{DSB_NAME}}, {{DSB_KONTAKT}})")
|
||||
|
||||
# M. Schluss
|
||||
result["LAUFZEIT"] = ctx.get("duration", "unbefristet")
|
||||
result["KUENDIGUNGSFRIST"] = ctx.get("notice_period", "3 Monate")
|
||||
result["DATUM_UNTERZEICHNUNG"] = ctx.get("signing_date", "{{DATUM_UNTERZEICHNUNG}}")
|
||||
|
||||
# Conditional flags
|
||||
result["AI_SYSTEM"] = ctx.get("is_ai_system", False)
|
||||
result["VIDEO_UEBERWACHUNG"] = ctx.get("has_video", False)
|
||||
result["HR_SYSTEM"] = ctx.get("has_hr_features", False)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def _bullet_list(items: list) -> str:
|
||||
"""Format a list as markdown bullet points."""
|
||||
return "\n".join(f"- {item}" for item in items)
|
||||
@@ -330,6 +330,28 @@ def _generate_risk_assessment(ctx: dict) -> str:
|
||||
if any(ctx.get(k) for k in ["third_country_transfer", "processes_in_third_country"]):
|
||||
risks.append(("Zugriff durch Behoerden in Drittlaendern", "mittel", "hoch", "hoch"))
|
||||
|
||||
# Domain-spezifische Risiken (AI Act Annex III)
|
||||
domain = ctx.get("domain", "")
|
||||
if domain in ("hr", "recruiting") or ctx.get("has_hr_context"):
|
||||
risks.append(("AGG-Verstoss: Diskriminierung bei Bewerberauswahl (§ 1 AGG)", "mittel", "hoch", "hoch"))
|
||||
risks.append(("Beweislastumkehr bei Diskriminierungsklagen (§ 22 AGG)", "mittel", "hoch", "hoch"))
|
||||
risks.append(("Art. 22 DSGVO: Unzulaessige automatisierte Einzelentscheidung", "mittel", "hoch", "hoch"))
|
||||
risks.append(("Proxy-Diskriminierung durch Name/Foto/Alter-Erkennung", "mittel", "hoch", "hoch"))
|
||||
|
||||
if domain in ("education", "higher_education", "vocational_training"):
|
||||
risks.append(("Chancenungleichheit durch KI-gestuetzte Bewertung", "mittel", "hoch", "hoch"))
|
||||
risks.append(("Benachteiligung Minderjaehriger ohne Lehrkraft-Kontrolle", "niedrig", "gross", "hoch"))
|
||||
risks.append(("Fehlbewertung mit Auswirkung auf Bildungschancen", "mittel", "hoch", "hoch"))
|
||||
|
||||
if domain in ("healthcare", "medical_devices", "pharma", "elderly_care"):
|
||||
risks.append(("Fehldiagnose durch KI mit gesundheitlichen Folgen", "niedrig", "gross", "hoch"))
|
||||
risks.append(("Falsche Triage-Priorisierung (lebenskritisch)", "niedrig", "gross", "hoch"))
|
||||
risks.append(("Verletzung der Patientenautonomie", "mittel", "hoch", "hoch"))
|
||||
|
||||
if domain in ("finance", "banking", "insurance", "investment"):
|
||||
risks.append(("Diskriminierendes Kredit-Scoring", "mittel", "hoch", "hoch"))
|
||||
risks.append(("Ungerechtfertigte Verweigerung von Finanzdienstleistungen", "mittel", "hoch", "hoch"))
|
||||
|
||||
lines.append("| Risiko | Eintrittswahrscheinlichkeit | Schwere | Gesamt |")
|
||||
lines.append("|--------|----------------------------|---------|--------|")
|
||||
for risk_name, likelihood, severity, overall in risks:
|
||||
|
||||
227
document-templates/generators/fria_template.py
Normal file
227
document-templates/generators/fria_template.py
Normal file
@@ -0,0 +1,227 @@
|
||||
"""FRIA template generator — creates Fundamental Rights Impact Assessment from UCCA context.
|
||||
|
||||
Generates a FRIA (Art. 27 AI Act) based on:
|
||||
- UCCA Assessment result (risk level, triggered rules, domain)
|
||||
- AI Act Decision Tree classification
|
||||
- Company profile
|
||||
|
||||
Automatically maps domains to affected fundamental rights.
|
||||
"""
|
||||
|
||||
from typing import Optional
|
||||
|
||||
# -- Domain → Fundamental Rights Mapping ------------------------------------
|
||||
|
||||
DOMAIN_RIGHTS_MAP = {
|
||||
"education": [
|
||||
{"right": "Recht auf Bildung", "charter": "Art. 14", "gg": "Art. 12",
|
||||
"risk": "Chancengleichheit bei KI-gestuetzter Bewertung oder Auswahl"},
|
||||
{"right": "Nicht-Diskriminierung", "charter": "Art. 21", "gg": "Art. 3",
|
||||
"risk": "Bias bei Leistungsbewertung nach Herkunft, Sprache oder Geschlecht"},
|
||||
{"right": "Rechte des Kindes", "charter": "Art. 24", "gg": "Art. 6 Abs. 2",
|
||||
"risk": "Besonderer Schutz Minderjaehriger vor automatisierten Bewertungen"},
|
||||
],
|
||||
"hr": [
|
||||
{"right": "Berufsfreiheit / Recht zu arbeiten", "charter": "Art. 15", "gg": "Art. 12",
|
||||
"risk": "KI-gestuetzte Auswahl kann Zugang zum Arbeitsmarkt einschraenken"},
|
||||
{"right": "Nicht-Diskriminierung", "charter": "Art. 21", "gg": "Art. 3",
|
||||
"risk": "Bias bei Recruiting, Befoerderung oder Kuendigung"},
|
||||
{"right": "Schutz personenbezogener Daten", "charter": "Art. 8", "gg": "Art. 2 Abs. 1",
|
||||
"risk": "Umfangreiche Verarbeitung von Beschaeftigtendaten"},
|
||||
],
|
||||
"healthcare": [
|
||||
{"right": "Menschenwuerde", "charter": "Art. 1", "gg": "Art. 1",
|
||||
"risk": "KI-Diagnosen koennen existenzielle Auswirkungen haben"},
|
||||
{"right": "Schutz personenbezogener Daten", "charter": "Art. 8", "gg": "Art. 2 Abs. 1",
|
||||
"risk": "Gesundheitsdaten sind besondere Kategorien (Art. 9 DSGVO)"},
|
||||
{"right": "Nicht-Diskriminierung", "charter": "Art. 21", "gg": "Art. 3",
|
||||
"risk": "Bias bei Behandlungsempfehlungen nach Alter, Geschlecht oder Ethnie"},
|
||||
],
|
||||
"finance": [
|
||||
{"right": "Recht auf soziale Sicherheit", "charter": "Art. 34", "gg": "Art. 20",
|
||||
"risk": "Zugang zu Finanzdienstleistungen und Versicherungen"},
|
||||
{"right": "Nicht-Diskriminierung", "charter": "Art. 21", "gg": "Art. 3",
|
||||
"risk": "Scoring-Bias bei Kreditvergabe oder Versicherungspraemien"},
|
||||
{"right": "Recht auf wirksamen Rechtsbehelf", "charter": "Art. 47", "gg": "Art. 19 Abs. 4",
|
||||
"risk": "Anfechtbarkeit automatisierter Finanzentscheidungen"},
|
||||
],
|
||||
"law_enforcement": [
|
||||
{"right": "Recht auf Freiheit und Sicherheit", "charter": "Art. 6", "gg": "Art. 2 Abs. 2",
|
||||
"risk": "KI-gestuetzte Ueberwachung oder Vorhersage"},
|
||||
{"right": "Unschuldsvermutung", "charter": "Art. 48", "gg": "Art. 20 Abs. 3",
|
||||
"risk": "Predictive Policing kann Vorverurteilung erzeugen"},
|
||||
{"right": "Recht auf Privatsphaere", "charter": "Art. 7", "gg": "Art. 2 Abs. 1",
|
||||
"risk": "Biometrische Identifizierung im oeffentlichen Raum"},
|
||||
],
|
||||
"public_sector": [
|
||||
{"right": "Recht auf eine gute Verwaltung", "charter": "Art. 41", "gg": "Art. 20 Abs. 3",
|
||||
"risk": "Automatisierte Verwaltungsentscheidungen muessen nachvollziehbar sein"},
|
||||
{"right": "Nicht-Diskriminierung", "charter": "Art. 21", "gg": "Art. 3",
|
||||
"risk": "Gleichbehandlung aller Buerger bei KI-gestuetzten Verwaltungsakten"},
|
||||
{"right": "Recht auf wirksamen Rechtsbehelf", "charter": "Art. 47", "gg": "Art. 19 Abs. 4",
|
||||
"risk": "Widerspruchsmoeglichkeit gegen KI-gestuetzte Bescheide"},
|
||||
],
|
||||
}
|
||||
|
||||
# Universal rights (always relevant for High-Risk AI)
|
||||
UNIVERSAL_RIGHTS = [
|
||||
{"right": "Schutz personenbezogener Daten", "charter": "Art. 8", "gg": "Art. 2 Abs. 1 i.V.m. Art. 1 Abs. 1",
|
||||
"risk": "Datenverarbeitung durch KI-System"},
|
||||
{"right": "Menschenwuerde", "charter": "Art. 1", "gg": "Art. 1",
|
||||
"risk": "KI darf Menschen nicht auf Datenpunkte reduzieren"},
|
||||
]
|
||||
|
||||
# -- Default measures -------------------------------------------------------
|
||||
|
||||
DEFAULT_MEASURES = [
|
||||
"Human-in-the-Loop: Menschliche Ueberpruefung aller KI-Empfehlungen vor Umsetzung",
|
||||
"Transparenz: Betroffene werden ueber den Einsatz von KI informiert",
|
||||
"Erklaerbarkeit: KI-Ergebnisse koennen nachvollzogen und begruendet werden",
|
||||
"Beschwerdemechanismus: Betroffene koennen KI-Entscheidungen anfechten",
|
||||
"Logging: Alle Eingaben und Ausgaben werden fuer Audit-Zwecke protokolliert",
|
||||
"Regelmaessige Bias-Audits: Systematische Pruefung auf Diskriminierung",
|
||||
]
|
||||
|
||||
HR_MEASURES = [
|
||||
"AGG-konforme Gestaltung: Kein Bias bei Geschlecht, Alter, Herkunft, Behinderung",
|
||||
"Betriebsrat gemaess §87 Abs.1 Nr.6 und §95 BetrVG beteiligt",
|
||||
"Keine automatisierte Endentscheidung bei Personalangelegenheiten",
|
||||
]
|
||||
|
||||
EDUCATION_MEASURES = [
|
||||
"Lehrkraft ueberprueft und verantwortet alle KI-generierten Bewertungen",
|
||||
"Chancengleichheit unabhaengig von sozioekonomischem Hintergrund",
|
||||
"Schueler/Eltern koennen KI-gestuetzte Bewertungen anfechten",
|
||||
]
|
||||
|
||||
|
||||
def generate_fria_draft(ctx: dict) -> dict:
|
||||
"""Generate a FRIA draft from UCCA assessment context.
|
||||
|
||||
Args:
|
||||
ctx: Dict with keys:
|
||||
Required:
|
||||
- organisation_name: str
|
||||
- system_name: str
|
||||
- system_description: str
|
||||
- einsatzzweck: str
|
||||
Optional:
|
||||
- organisation_address: str
|
||||
- system_version: str
|
||||
- system_provider: str
|
||||
- domain: str (education, hr, healthcare, finance, etc.)
|
||||
- affected_groups: list[str]
|
||||
- affected_count: str
|
||||
- ai_act_classification: str (high_risk, limited_risk, etc.)
|
||||
- annex_iii_category: str
|
||||
- is_public_entity: bool
|
||||
- has_hr_context: bool
|
||||
- has_education_context: bool
|
||||
- risk_score: int
|
||||
- dpo_name: str
|
||||
- dpo_contact: str
|
||||
- review_interval: str
|
||||
|
||||
Returns:
|
||||
Dict with placeholder values for template substitution.
|
||||
"""
|
||||
result = {}
|
||||
|
||||
# Section 1: Basic info
|
||||
result["ORGANISATION_NAME"] = ctx.get("organisation_name", "{{ORGANISATION_NAME}}")
|
||||
result["ORGANISATION_ADRESSE"] = ctx.get("organisation_address", "{{ORGANISATION_ADRESSE}}")
|
||||
result["VERANTWORTLICHER"] = ctx.get("responsible_person", "{{VERANTWORTLICHER}}")
|
||||
result["ERSTELLT_VON"] = ctx.get("created_by", "{{ERSTELLT_VON}}")
|
||||
result["ERSTELLT_AM"] = ctx.get("created_at", "{{ERSTELLT_AM}}")
|
||||
result["SYSTEM_NAME"] = ctx.get("system_name", "{{SYSTEM_NAME}}")
|
||||
result["SYSTEM_VERSION"] = ctx.get("system_version", "1.0")
|
||||
result["SYSTEM_BESCHREIBUNG"] = ctx.get("system_description", "{{SYSTEM_BESCHREIBUNG}}")
|
||||
result["SYSTEM_ANBIETER"] = ctx.get("system_provider", "{{SYSTEM_ANBIETER}}")
|
||||
result["EINSATZZWECK"] = ctx.get("einsatzzweck", "{{EINSATZZWECK}}")
|
||||
result["EINSATZKONTEXT"] = ctx.get("einsatzkontext", "{{EINSATZKONTEXT}}")
|
||||
result["AI_ACT_KLASSIFIKATION"] = ctx.get("ai_act_classification", "High-Risk")
|
||||
result["ANNEX_III_KATEGORIE"] = ctx.get("annex_iii_category", "")
|
||||
result["DSB_NAME"] = ctx.get("dpo_name", "{{DSB_NAME}}")
|
||||
result["DSB_KONTAKT"] = ctx.get("dpo_contact", "{{DSB_KONTAKT}}")
|
||||
|
||||
# Section 1.5: Affected groups
|
||||
groups = ctx.get("affected_groups", [])
|
||||
result["BETROFFENE_GRUPPEN"] = _bullet_list(groups) if groups else "{{BETROFFENE_GRUPPEN}}"
|
||||
result["BETROFFENE_ANZAHL"] = ctx.get("affected_count", "{{BETROFFENE_ANZAHL}}")
|
||||
|
||||
# Section 2: Fundamental rights mapping
|
||||
domain = ctx.get("domain", "")
|
||||
rights = list(UNIVERSAL_RIGHTS)
|
||||
if domain in DOMAIN_RIGHTS_MAP:
|
||||
rights.extend(DOMAIN_RIGHTS_MAP[domain])
|
||||
|
||||
rights_table = []
|
||||
for i, r in enumerate(rights, 1):
|
||||
rights_table.append(
|
||||
f"| {i} | {r['right']} | {r['charter']} | {r['gg']} | Ja | {r['risk']} |"
|
||||
)
|
||||
result["GRUNDRECHTE_ANALYSE"] = "\n".join(rights_table) if rights_table else "{{GRUNDRECHTE_ANALYSE}}"
|
||||
|
||||
# Section 3: Risk matrix
|
||||
risk_rows = []
|
||||
risk_score = ctx.get("risk_score", 0)
|
||||
base_likelihood = min(3, 1 + risk_score // 30)
|
||||
for r in rights:
|
||||
severity = 3 if "Diskriminierung" in r["risk"] or "existenz" in r["risk"].lower() else 2
|
||||
likelihood = base_likelihood
|
||||
level = _risk_level(likelihood * severity)
|
||||
risk_rows.append(
|
||||
f"| {r['right']} | {r['risk']} | {likelihood} | {severity} | {level} | Basierend auf Systemanalyse |"
|
||||
)
|
||||
result["RISIKOMATRIX"] = "\n".join(risk_rows) if risk_rows else "{{RISIKOMATRIX}}"
|
||||
|
||||
# Section 4: Measures
|
||||
measures = list(DEFAULT_MEASURES)
|
||||
if ctx.get("has_hr_context") or domain == "hr":
|
||||
measures.extend(HR_MEASURES)
|
||||
if ctx.get("has_education_context") or domain == "education":
|
||||
measures.extend(EDUCATION_MEASURES)
|
||||
result["MASSNAHMEN_LISTE"] = _bullet_list(measures)
|
||||
|
||||
result["HUMAN_OVERSIGHT_BESCHREIBUNG"] = ctx.get("human_oversight",
|
||||
"Das System unterstuetzt menschliche Entscheidungen, trifft jedoch keine eigenstaendigen Entscheidungen. "
|
||||
"Alle KI-generierten Empfehlungen werden von qualifiziertem Personal geprueft.")
|
||||
|
||||
result["TRANSPARENZ_MASSNAHMEN"] = ctx.get("transparency_measures",
|
||||
"Betroffene Personen werden ueber den Einsatz des KI-Systems informiert. "
|
||||
"KI-generierte Ergebnisse werden als solche gekennzeichnet.")
|
||||
|
||||
# Section 5: Consultation
|
||||
result["KONSULTATION_ERGEBNISSE"] = ctx.get("consultation_results",
|
||||
"Konsultation steht aus — bitte vor Freigabe durchfuehren.")
|
||||
|
||||
# Section 6: Approval
|
||||
result["GENEHMIGT_VON"] = ctx.get("approved_by", "{{GENEHMIGT_VON}}")
|
||||
result["GENEHMIGT_AM"] = ctx.get("approved_at", "{{GENEHMIGT_AM}}")
|
||||
|
||||
# Section 7: Monitoring
|
||||
result["NAECHSTE_UEBERPRUEFUNG"] = ctx.get("review_interval", "12 Monate nach Inbetriebnahme")
|
||||
|
||||
# Conditional flags
|
||||
result["BILDUNGSKONTEXT"] = ctx.get("has_education_context", False) or domain == "education"
|
||||
result["HR_KONTEXT"] = ctx.get("has_hr_context", False) or domain == "hr"
|
||||
result["OEFFENTLICHE_STELLE"] = ctx.get("is_public_entity", False)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def _risk_level(score: int) -> str:
|
||||
"""Map risk score to level label."""
|
||||
if score <= 6:
|
||||
return "Niedrig"
|
||||
elif score <= 12:
|
||||
return "Mittel"
|
||||
elif score <= 19:
|
||||
return "Hoch"
|
||||
else:
|
||||
return "Kritisch"
|
||||
|
||||
|
||||
def _bullet_list(items: list) -> str:
|
||||
"""Format a list as markdown bullet points."""
|
||||
return "\n".join(f"- {item}" for item in items)
|
||||
158
document-templates/generators/test_betriebsvereinbarung.py
Normal file
158
document-templates/generators/test_betriebsvereinbarung.py
Normal file
@@ -0,0 +1,158 @@
|
||||
"""Tests for Betriebsvereinbarung template generator."""
|
||||
|
||||
import pytest
|
||||
from betriebsvereinbarung_template import (
|
||||
generate_betriebsvereinbarung_draft,
|
||||
DEFAULT_VERBOTENE_NUTZUNGEN,
|
||||
AI_VERBOTENE_NUTZUNGEN,
|
||||
DEFAULT_TOM,
|
||||
DATENARTEN_MAP,
|
||||
)
|
||||
|
||||
|
||||
class TestGenerateBetriebsvereinbarung:
|
||||
"""Tests for generate_betriebsvereinbarung_draft()."""
|
||||
|
||||
def test_minimal_context(self):
|
||||
"""Minimal context should produce valid output with placeholders."""
|
||||
ctx = {
|
||||
"company_name": "Test GmbH",
|
||||
"system_name": "Microsoft 365",
|
||||
"system_description": "Office-Suite mit KI-Funktionen",
|
||||
}
|
||||
result = generate_betriebsvereinbarung_draft(ctx)
|
||||
|
||||
assert result["UNTERNEHMEN_NAME"] == "Test GmbH"
|
||||
assert result["SYSTEM_NAME"] == "Microsoft 365"
|
||||
assert "{{BETRIEBSRAT_VORSITZ}}" in result["BETRIEBSRAT_VORSITZ"]
|
||||
|
||||
def test_full_context(self):
|
||||
"""Full context should fill all placeholders."""
|
||||
ctx = {
|
||||
"company_name": "Acme Corp",
|
||||
"company_address": "Hamburg",
|
||||
"employer_representative": "Dr. Schmidt",
|
||||
"works_council_chair": "Fr. Mueller",
|
||||
"system_name": "Copilot",
|
||||
"system_description": "KI-Assistent",
|
||||
"system_vendor": "Microsoft",
|
||||
"locations": ["Hamburg", "Berlin"],
|
||||
"departments": ["IT", "HR"],
|
||||
"modules": ["Teams", "Outlook", "Word"],
|
||||
"purposes": ["Texterstellung", "Zusammenfassung"],
|
||||
"data_types": ["email", "chat", "login"],
|
||||
"is_ai_system": True,
|
||||
"dpo_name": "Dr. Datenschutz",
|
||||
"dpo_contact": "dsb@acme.de",
|
||||
"audit_interval": "6 Monate",
|
||||
"duration": "2 Jahre",
|
||||
"notice_period": "6 Monate",
|
||||
}
|
||||
result = generate_betriebsvereinbarung_draft(ctx)
|
||||
|
||||
assert result["ARBEITGEBER_VERTRETER"] == "Dr. Schmidt"
|
||||
assert result["BETRIEBSRAT_VORSITZ"] == "Fr. Mueller"
|
||||
assert "Hamburg" in result["GELTUNGSBEREICH_STANDORTE"]
|
||||
assert "Berlin" in result["GELTUNGSBEREICH_STANDORTE"]
|
||||
assert "Teams" in result["GELTUNGSBEREICH_MODULE"]
|
||||
assert result["AUDIT_INTERVALL"] == "6 Monate"
|
||||
assert result["LAUFZEIT"] == "2 Jahre"
|
||||
assert result["AI_SYSTEM"] is True
|
||||
|
||||
def test_verbotene_nutzungen_default(self):
|
||||
"""Default forbidden uses should always be included."""
|
||||
ctx = {"company_name": "Test", "system_name": "Tool", "system_description": "x"}
|
||||
result = generate_betriebsvereinbarung_draft(ctx)
|
||||
|
||||
for nutzung in DEFAULT_VERBOTENE_NUTZUNGEN:
|
||||
assert nutzung in result["VERBOTENE_NUTZUNGEN"]
|
||||
|
||||
def test_verbotene_nutzungen_ai_system(self):
|
||||
"""AI-specific forbidden uses should be added for AI systems."""
|
||||
ctx = {
|
||||
"company_name": "Test",
|
||||
"system_name": "Tool",
|
||||
"system_description": "x",
|
||||
"is_ai_system": True,
|
||||
}
|
||||
result = generate_betriebsvereinbarung_draft(ctx)
|
||||
|
||||
for nutzung in AI_VERBOTENE_NUTZUNGEN:
|
||||
assert nutzung in result["VERBOTENE_NUTZUNGEN"]
|
||||
|
||||
def test_verbotene_nutzungen_no_ai(self):
|
||||
"""AI-specific forbidden uses should NOT be added for non-AI systems."""
|
||||
ctx = {
|
||||
"company_name": "Test",
|
||||
"system_name": "Tool",
|
||||
"system_description": "x",
|
||||
"is_ai_system": False,
|
||||
}
|
||||
result = generate_betriebsvereinbarung_draft(ctx)
|
||||
|
||||
for nutzung in AI_VERBOTENE_NUTZUNGEN:
|
||||
assert nutzung not in result["VERBOTENE_NUTZUNGEN"]
|
||||
|
||||
def test_datenarten_mapping(self):
|
||||
"""Data types should be resolved from DATENARTEN_MAP."""
|
||||
ctx = {
|
||||
"company_name": "Test",
|
||||
"system_name": "Tool",
|
||||
"system_description": "x",
|
||||
"data_types": ["email", "prompt", "hr"],
|
||||
}
|
||||
result = generate_betriebsvereinbarung_draft(ctx)
|
||||
|
||||
assert DATENARTEN_MAP["email"] in result["DATENARTEN_LISTE"]
|
||||
assert DATENARTEN_MAP["prompt"] in result["DATENARTEN_LISTE"]
|
||||
assert DATENARTEN_MAP["hr"] in result["DATENARTEN_LISTE"]
|
||||
|
||||
def test_tom_high_conflict_score(self):
|
||||
"""High conflict score should add extra TOM measures."""
|
||||
ctx_low = {
|
||||
"company_name": "Test",
|
||||
"system_name": "Tool",
|
||||
"system_description": "x",
|
||||
"betrvg_conflict_score": 20,
|
||||
}
|
||||
ctx_high = {
|
||||
"company_name": "Test",
|
||||
"system_name": "Tool",
|
||||
"system_description": "x",
|
||||
"betrvg_conflict_score": 80,
|
||||
}
|
||||
|
||||
result_low = generate_betriebsvereinbarung_draft(ctx_low)
|
||||
result_high = generate_betriebsvereinbarung_draft(ctx_high)
|
||||
|
||||
# High score should have more TOM items
|
||||
low_count = result_low["TOM_MASSNAHMEN"].count("- ")
|
||||
high_count = result_high["TOM_MASSNAHMEN"].count("- ")
|
||||
assert high_count > low_count, f"High conflict ({high_count} TOMs) should have more than low ({low_count})"
|
||||
|
||||
def test_speicherfristen_defaults(self):
|
||||
"""Default retention periods should be set."""
|
||||
ctx = {"company_name": "Test", "system_name": "Tool", "system_description": "x"}
|
||||
result = generate_betriebsvereinbarung_draft(ctx)
|
||||
|
||||
assert result["SPEICHERFRIST_AUDIT_LOGS"] == "90 Tage"
|
||||
assert result["SPEICHERFRIST_NUTZUNGSDATEN"] == "30 Tage"
|
||||
assert result["SPEICHERFRIST_CHAT_PROMPTS"] == "deaktiviert"
|
||||
|
||||
def test_custom_retention(self):
|
||||
"""Custom retention periods should override defaults."""
|
||||
ctx = {
|
||||
"company_name": "Test",
|
||||
"system_name": "Tool",
|
||||
"system_description": "x",
|
||||
"retention_audit_logs": "180 Tage",
|
||||
"retention_prompts": "7 Tage",
|
||||
}
|
||||
result = generate_betriebsvereinbarung_draft(ctx)
|
||||
|
||||
assert result["SPEICHERFRIST_AUDIT_LOGS"] == "180 Tage"
|
||||
assert result["SPEICHERFRIST_CHAT_PROMPTS"] == "7 Tage"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pytest.main([__file__, "-v"])
|
||||
@@ -0,0 +1,350 @@
|
||||
-- Migration 006: Betriebsvereinbarung Template V1
|
||||
-- Modulare Vorlage fuer Betriebsvereinbarungen zu KI/IT-Systemen
|
||||
-- Rechtsgrundlage: §87 Abs.1 Nr.6 BetrVG, DSGVO, BDSG
|
||||
|
||||
INSERT INTO compliance.compliance_legal_templates (
|
||||
tenant_id, document_type, title, description, language, jurisdiction,
|
||||
version, status, license_name, source_name, attribution_required,
|
||||
is_complete_document, placeholders, content
|
||||
) VALUES (
|
||||
'9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid,
|
||||
'betriebsvereinbarung',
|
||||
'Betriebsvereinbarung — Einfuehrung und Nutzung von KI-/IT-Systemen',
|
||||
'Modulare Vorlage fuer eine Betriebsvereinbarung gemaess §87 Abs.1 Nr.6 BetrVG zur Einfuehrung und Nutzung von IT-Systemen und KI-Anwendungen. Umfasst Datenschutz, Ueberwachungsschutz, Change-Management und Kontrollrechte des Betriebsrats. Basiert auf BAG-Rechtsprechung zu Microsoft 365, SAP ERP und Standardsoftware.',
|
||||
'de',
|
||||
'DE',
|
||||
'1.0',
|
||||
'published',
|
||||
'MIT',
|
||||
'BreakPilot Compliance',
|
||||
false,
|
||||
true,
|
||||
CAST('[
|
||||
"{{UNTERNEHMEN_NAME}}",
|
||||
"{{UNTERNEHMEN_SITZ}}",
|
||||
"{{ARBEITGEBER_VERTRETER}}",
|
||||
"{{BETRIEBSRAT_VORSITZ}}",
|
||||
"{{SYSTEM_NAME}}",
|
||||
"{{SYSTEM_BESCHREIBUNG}}",
|
||||
"{{SYSTEM_HERSTELLER}}",
|
||||
"{{GELTUNGSBEREICH_STANDORTE}}",
|
||||
"{{GELTUNGSBEREICH_BEREICHE}}",
|
||||
"{{GELTUNGSBEREICH_MODULE}}",
|
||||
"{{ZWECK_BESCHREIBUNG}}",
|
||||
"{{DATENARTEN_LISTE}}",
|
||||
"{{VERBOTENE_NUTZUNGEN}}",
|
||||
"{{ROLLEN_ADMIN}}",
|
||||
"{{ROLLEN_FUEHRUNGSKRAFT}}",
|
||||
"{{ROLLEN_REPORTING}}",
|
||||
"{{TRANSPARENZ_INFO}}",
|
||||
"{{ERLAUBTE_REPORTS}}",
|
||||
"{{SPEICHERFRIST_AUDIT_LOGS}}",
|
||||
"{{SPEICHERFRIST_NUTZUNGSDATEN}}",
|
||||
"{{SPEICHERFRIST_CHAT_PROMPTS}}",
|
||||
"{{TOM_MASSNAHMEN}}",
|
||||
"{{CHANGE_MANAGEMENT_PROZESS}}",
|
||||
"{{AUDIT_INTERVALL}}",
|
||||
"{{BESCHWERDE_ANSPRECHPARTNER}}",
|
||||
"{{LAUFZEIT}}",
|
||||
"{{KUENDIGUNGSFRIST}}",
|
||||
"{{DATUM_UNTERZEICHNUNG}}",
|
||||
"{{DSB_NAME}}",
|
||||
"{{DSB_KONTAKT}}"
|
||||
]' AS jsonb),
|
||||
$template$# Betriebsvereinbarung
|
||||
|
||||
**ueber die Einfuehrung und Nutzung von {{SYSTEM_NAME}}**
|
||||
|
||||
zwischen
|
||||
|
||||
**{{UNTERNEHMEN_NAME}}**, {{UNTERNEHMEN_SITZ}},
|
||||
vertreten durch {{ARBEITGEBER_VERTRETER}}
|
||||
(nachfolgend "Arbeitgeberin")
|
||||
|
||||
und dem
|
||||
|
||||
**Betriebsrat** der {{UNTERNEHMEN_NAME}},
|
||||
vertreten durch den/die Vorsitzende/n {{BETRIEBSRAT_VORSITZ}}
|
||||
(nachfolgend "Betriebsrat")
|
||||
|
||||
---
|
||||
|
||||
## A. Praeambel und Rechtsgrundlagen
|
||||
|
||||
Diese Betriebsvereinbarung regelt die Einfuehrung und Nutzung von **{{SYSTEM_NAME}}** ({{SYSTEM_BESCHREIBUNG}}) im Betrieb der {{UNTERNEHMEN_NAME}}.
|
||||
|
||||
**Rechtsgrundlagen:**
|
||||
- §87 Abs.1 Nr.6 BetrVG (Mitbestimmung bei technischen Ueberwachungseinrichtungen)
|
||||
- §90 BetrVG (Unterrichtung bei Planung technischer Anlagen)
|
||||
- Art. 5, 6, 32 DSGVO (Datenschutzgrundsaetze, Rechtsgrundlage, TOM)
|
||||
- §26 BDSG (Beschaeftigtendatenschutz)
|
||||
{{#IF AI_SYSTEM}}
|
||||
- Verordnung (EU) 2024/1689 (KI-Verordnung / AI Act)
|
||||
{{/IF}}
|
||||
|
||||
Die Parteien sind sich einig, dass {{SYSTEM_NAME}} eine technische Einrichtung im Sinne des §87 Abs.1 Nr.6 BetrVG darstellt, die geeignet ist, das Verhalten oder die Leistung der Beschaeftigten zu ueberwachen. Die Einigung erfolgt in Kenntnis der Rechtsprechung des Bundesarbeitsgerichts (vgl. BAG 1 ABR 20/21 — Microsoft Office 365; BAG 1 ABN 36/18 — Standardsoftware).
|
||||
|
||||
---
|
||||
|
||||
## B. Geltungsbereich
|
||||
|
||||
### B.1 Raeumlicher Geltungsbereich
|
||||
Diese Betriebsvereinbarung gilt fuer folgende Standorte:
|
||||
{{GELTUNGSBEREICH_STANDORTE}}
|
||||
|
||||
### B.2 Persoenlicher Geltungsbereich
|
||||
Die Betriebsvereinbarung gilt fuer alle Beschaeftigten der folgenden Bereiche:
|
||||
{{GELTUNGSBEREICH_BEREICHE}}
|
||||
|
||||
### B.3 Sachlicher Geltungsbereich
|
||||
Die Betriebsvereinbarung umfasst folgende Module und Dienste des Systems:
|
||||
{{GELTUNGSBEREICH_MODULE}}
|
||||
|
||||
{{#IF SYSTEM_HERSTELLER}}
|
||||
**Systemhersteller/-anbieter:** {{SYSTEM_HERSTELLER}}
|
||||
{{/IF}}
|
||||
|
||||
---
|
||||
|
||||
## C. Zweckbestimmung
|
||||
|
||||
### C.1 Erlaubte Nutzungszwecke
|
||||
{{SYSTEM_NAME}} darf ausschliesslich zu folgenden Zwecken eingesetzt werden:
|
||||
{{ZWECK_BESCHREIBUNG}}
|
||||
|
||||
### C.2 Verbotene Nutzungen
|
||||
Folgende Nutzungen sind ausdruecklich untersagt:
|
||||
|
||||
{{VERBOTENE_NUTZUNGEN}}
|
||||
|
||||
Darueber hinaus ist generell untersagt:
|
||||
- Verdeckte Leistungs- oder Verhaltenskontrolle einzelner Beschaeftigter
|
||||
- Erstellung individueller Persoenlichkeitsprofile
|
||||
- Nutzung von Prompt-, Chat- oder Nutzungshistorien zu disziplinarischen Zwecken
|
||||
- Automatisierte Personalentscheidungen ohne menschliche Ueberpruefung
|
||||
- Personenbezogene Rankings oder Leistungsvergleiche ohne gesonderte Mitbestimmung
|
||||
{{#IF AI_SYSTEM}}
|
||||
- Einsatz von KI-Funktionen zur biometrischen Echtzeit-Identifizierung
|
||||
- KI-gestuetztes Social Scoring von Beschaeftigten
|
||||
{{/IF}}
|
||||
|
||||
---
|
||||
|
||||
## D. Datenarten und Verarbeitungszwecke
|
||||
|
||||
### D.1 Verarbeitete Datenarten
|
||||
Im Rahmen der Nutzung von {{SYSTEM_NAME}} werden folgende Datenarten verarbeitet:
|
||||
{{DATENARTEN_LISTE}}
|
||||
|
||||
### D.2 Rechtsgrundlage
|
||||
Die Verarbeitung der Beschaeftigtendaten erfolgt auf Grundlage von:
|
||||
- §26 Abs.1 BDSG i.V.m. Art. 6 Abs.1 lit. b DSGVO (Durchfuehrung des Arbeitsverhaeltnisses)
|
||||
- §26 Abs.4 BDSG i.V.m. Art. 88 DSGVO (diese Betriebsvereinbarung als Kollektivvereinbarung)
|
||||
|
||||
### D.3 Keine Verarbeitung besonderer Kategorien
|
||||
Daten gemaess Art. 9 DSGVO (Gesundheitsdaten, Gewerkschaftszugehoerigkeit, biometrische Daten etc.) werden nicht verarbeitet, es sei denn, dies ist in einem gesonderten Anhang zu dieser Betriebsvereinbarung ausdruecklich geregelt.
|
||||
|
||||
---
|
||||
|
||||
## E. Rollen- und Zugriffskonzept
|
||||
|
||||
### E.1 Administratoren
|
||||
{{ROLLEN_ADMIN}}
|
||||
|
||||
### E.2 Fuehrungskraefte
|
||||
{{ROLLEN_FUEHRUNGSKRAFT}}
|
||||
|
||||
Fuehrungskraefte erhalten **keinen** Zugriff auf:
|
||||
- individuelle Nutzungsprotokolle
|
||||
- Prompt-/Chat-Historien einzelner Beschaeftigter
|
||||
- Produktivitaetskennzahlen auf Personenebene
|
||||
|
||||
### E.3 Reporting-Zugriff
|
||||
{{ROLLEN_REPORTING}}
|
||||
|
||||
### E.4 Vier-Augen-Prinzip
|
||||
Sonderauswertungen mit Personenbezug beduerfen:
|
||||
- der Zustimmung des Betriebsrats
|
||||
- der Beteiligung des Datenschutzbeauftragten ({{DSB_NAME}}, {{DSB_KONTAKT}})
|
||||
- einer dokumentierten Begruendung
|
||||
|
||||
---
|
||||
|
||||
## F. Transparenz gegenueber Beschaeftigten
|
||||
|
||||
Die Arbeitgeberin informiert alle Beschaeftigten vor Einfuehrung von {{SYSTEM_NAME}} ueber:
|
||||
{{TRANSPARENZ_INFO}}
|
||||
|
||||
Insbesondere:
|
||||
- Welche Daten verarbeitet werden
|
||||
- Welche KI-Funktionen aktiviert sind
|
||||
- Welche Protokollierung stattfindet
|
||||
- Wer Zugriff auf welche Daten hat
|
||||
- Wie lange Daten gespeichert werden
|
||||
- An wen sich Beschaeftigte bei Fragen oder Beschwerden wenden koennen
|
||||
|
||||
{{#IF AI_SYSTEM}}
|
||||
Bei KI-gestuetzten Funktionen wird zusaetzlich transparent gemacht:
|
||||
- Ob und wie KI-generierte Inhalte gekennzeichnet werden
|
||||
- Ob Eingaben fuer Modelltraining verwendet werden (Standard: Nein)
|
||||
- Welche Entscheidungsunterstuetzung die KI leistet
|
||||
{{/IF}}
|
||||
|
||||
---
|
||||
|
||||
## G. Auswertungen und Reports
|
||||
|
||||
### G.1 Erlaubte Reports
|
||||
Folgende Auswertungen sind ohne gesonderte Zustimmung zulaessig:
|
||||
{{ERLAUBTE_REPORTS}}
|
||||
|
||||
### G.2 Unzulaessige Reports
|
||||
Ohne ausdrueckliche, vorherige Zustimmung des Betriebsrats sind unzulaessig:
|
||||
- individuelle Produktivitaetsreports
|
||||
- Teamvergleiche mit Personenbezug
|
||||
- Verhaltensprofile oder Nutzungsmuster einzelner Beschaeftigter
|
||||
- Rankinglisten (auch anonymisierte, wenn Re-Identifikation moeglich)
|
||||
- Korrelation von Nutzungsdaten mit Leistungsbeurteilungen
|
||||
|
||||
### G.3 Neue Reporttypen
|
||||
Die Einfuehrung neuer Reporttypen bedarf der vorherigen Zustimmung des Betriebsrats.
|
||||
|
||||
---
|
||||
|
||||
## H. Speicher- und Loeschfristen
|
||||
|
||||
| Datenkategorie | Speicherfrist | Loeschverfahren |
|
||||
|----------------|---------------|-----------------|
|
||||
| Audit-/Admin-Logs | {{SPEICHERFRIST_AUDIT_LOGS}} | Automatische Loeschung |
|
||||
| Nutzungsdaten (aggregiert) | {{SPEICHERFRIST_NUTZUNGSDATEN}} | Automatische Loeschung |
|
||||
| Prompt-/Chat-Historien | {{SPEICHERFRIST_CHAT_PROMPTS}} | Automatische Loeschung oder deaktiviert |
|
||||
| Exportdateien | 30 Tage | Automatische Loeschung |
|
||||
|
||||
Die Speicherdauer der Audit-Logs orientiert sich am berechtigten Interesse der Arbeitgeberin an der Systemsicherheit und wird auf das erforderliche Minimum begrenzt.
|
||||
|
||||
{{#IF AI_SYSTEM}}
|
||||
**KI-spezifisch:**
|
||||
- Trainingsdaten aus Beschaeftigten-Interaktionen: **nicht zulaessig** ohne gesonderte Vereinbarung
|
||||
- Feedback-Daten zur Modellverbesserung: nur anonymisiert und aggregiert
|
||||
{{/IF}}
|
||||
|
||||
---
|
||||
|
||||
## I. Technische und organisatorische Massnahmen (TOM)
|
||||
|
||||
Zum Schutz der Beschaeftigtendaten werden folgende Massnahmen umgesetzt:
|
||||
|
||||
{{TOM_MASSNAHMEN}}
|
||||
|
||||
Ergaenzend gelten mindestens:
|
||||
- Rollen- und Rechtekonzept mit Least-Privilege-Prinzip
|
||||
- Verschluesselung der Daten bei Uebertragung und Speicherung
|
||||
- Protokollierung aller administrativen Zugriffe
|
||||
- Pseudonymisierung, wo technisch moeglich
|
||||
- Deaktivierung nicht benoetigter Telemetrie- und Diagnosefunktionen
|
||||
- Getrennte Umgebungen fuer Test und Produktion
|
||||
|
||||
---
|
||||
|
||||
## J. Change-Management
|
||||
|
||||
### J.1 Aenderungspflicht
|
||||
Folgende Aenderungen an {{SYSTEM_NAME}} beduerfen der vorherigen Information und ggf. erneuten Mitbestimmung des Betriebsrats:
|
||||
|
||||
{{CHANGE_MANAGEMENT_PROZESS}}
|
||||
|
||||
Insbesondere:
|
||||
- Aktivierung neuer Module oder Funktionen
|
||||
- Anbindung neuer Datenquellen oder Konnektoren
|
||||
- Aenderung der Reporting-Funktionalitaet
|
||||
- Updates mit neuen KI-Modellen oder -Funktionen
|
||||
- Aenderung der Datenverarbeitungsstandorte
|
||||
- Erweiterung des Nutzerkreises
|
||||
|
||||
### J.2 Informationsfrist
|
||||
Die Arbeitgeberin informiert den Betriebsrat mindestens **14 Kalendertage** vor geplanten Aenderungen schriftlich. Bei sicherheitskritischen Updates kann die Frist auf 3 Werktage verkuerzt werden.
|
||||
|
||||
### J.3 Bewertungsverfahren
|
||||
Jede Aenderung wird anhand folgender Kriterien bewertet:
|
||||
- Aendert sich die Ueberwachungseignung?
|
||||
- Werden neue Datenarten verarbeitet?
|
||||
- Aendert sich der Personenbezug?
|
||||
|
||||
Bei positiver Beantwortung einer dieser Fragen ist eine erneute Mitbestimmung erforderlich.
|
||||
|
||||
---
|
||||
|
||||
## K. Kontroll- und Audit-Rechte des Betriebsrats
|
||||
|
||||
### K.1 Laufende Kontrolle
|
||||
Der Betriebsrat hat das Recht auf:
|
||||
- Einsicht in die Systemdokumentation
|
||||
- Einsicht in den Katalog aktiver Reports und Auswertungen
|
||||
- Information ueber alle Administrationszugriffe
|
||||
- Teilnahme an Schulungen zum System
|
||||
|
||||
### K.2 Regelmaessige Reviews
|
||||
Arbeitgeberin und Betriebsrat fuehren alle **{{AUDIT_INTERVALL}}** einen gemeinsamen Review durch. Gegenstand:
|
||||
- Aktuelle Nutzung und Funktionsumfang
|
||||
- Eingehaltene/verletzte Regelungen
|
||||
- Eingegangene Beschwerden
|
||||
- Geplante Aenderungen
|
||||
- Aktualitaet der TOM
|
||||
|
||||
### K.3 Anlassbezogene Pruefung
|
||||
Bei begruendetem Verdacht auf Verstoss gegen diese Betriebsvereinbarung kann der Betriebsrat jederzeit eine Sonderpruefung verlangen. Die Arbeitgeberin stellt innerhalb von 5 Werktagen die angeforderten Informationen bereit.
|
||||
|
||||
---
|
||||
|
||||
## L. Beschwerden und Eskalation
|
||||
|
||||
### L.1 Beschwerderecht
|
||||
Beschaeftigte koennen sich bei Bedenken hinsichtlich der Datenverarbeitung wenden an:
|
||||
{{BESCHWERDE_ANSPRECHPARTNER}}
|
||||
|
||||
### L.2 Eskalation
|
||||
Bei Meinungsverschiedenheiten ueber die Auslegung oder Anwendung dieser Betriebsvereinbarung gilt:
|
||||
1. Gespraech zwischen Arbeitgeberin und Betriebsrat (Frist: 2 Wochen)
|
||||
2. Hinzuziehung des Datenschutzbeauftragten
|
||||
3. Einigungsstelle gemaess §76 BetrVG
|
||||
|
||||
### L.3 Sofortmassnahmen
|
||||
Bei schwerwiegenden Verstoessen (insbesondere unzulaessige Ueberwachung, Datenmissbrauch) kann der Betriebsrat die sofortige Aussetzung der betroffenen Funktion verlangen. Die Arbeitgeberin setzt die Funktion bis zur Klaerung aus.
|
||||
|
||||
---
|
||||
|
||||
## M. Schlussbestimmungen
|
||||
|
||||
### M.1 Inkrafttreten und Laufzeit
|
||||
Diese Betriebsvereinbarung tritt am {{DATUM_UNTERZEICHNUNG}} in Kraft und gilt fuer die Dauer von {{LAUFZEIT}}.
|
||||
|
||||
### M.2 Kuendigung
|
||||
Die Betriebsvereinbarung kann von jeder Seite mit einer Frist von {{KUENDIGUNGSFRIST}} zum Monatsende schriftlich gekuendigt werden.
|
||||
|
||||
### M.3 Nachwirkung
|
||||
Die Betriebsvereinbarung wirkt nach Kuendigung bis zum Abschluss einer neuen Vereinbarung nach (§77 Abs.6 BetrVG).
|
||||
|
||||
### M.4 Salvatorische Klausel
|
||||
Sollten einzelne Bestimmungen unwirksam sein, bleibt die Wirksamkeit der uebrigen Bestimmungen unberuehrt. Die Parteien verpflichten sich, unwirksame Bestimmungen durch wirksame zu ersetzen, die dem wirtschaftlichen Zweck am naechsten kommen.
|
||||
|
||||
### M.5 Anlagen
|
||||
Folgende Anlagen sind Bestandteil dieser Betriebsvereinbarung:
|
||||
- Anlage 1: Detaillierte Systemdokumentation
|
||||
- Anlage 2: Rollen- und Rechtekonzept
|
||||
- Anlage 3: TOM-Dokumentation
|
||||
- Anlage 4: Reportkatalog
|
||||
{{#IF AI_SYSTEM}}
|
||||
- Anlage 5: KI-Transparenzbericht
|
||||
{{/IF}}
|
||||
|
||||
---
|
||||
|
||||
**{{UNTERNEHMEN_SITZ}}, den {{DATUM_UNTERZEICHNUNG}}**
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| _________________________ | _________________________ |
|
||||
| {{ARBEITGEBER_VERTRETER}} | {{BETRIEBSRAT_VORSITZ}} |
|
||||
| fuer die Arbeitgeberin | fuer den Betriebsrat |
|
||||
$template$
|
||||
) ON CONFLICT DO NOTHING;
|
||||
330
document-templates/migrations/007_fria_template.sql
Normal file
330
document-templates/migrations/007_fria_template.sql
Normal file
@@ -0,0 +1,330 @@
|
||||
-- Migration 007: FRIA Template V1 — Grundrechte-Folgenabschaetzung (Art. 27 KI-VO)
|
||||
-- Fundamental Rights Impact Assessment fuer Hochrisiko-KI-Systeme
|
||||
-- Rechtsgrundlage: Art. 27 Verordnung (EU) 2024/1689 (KI-Verordnung / AI Act)
|
||||
|
||||
INSERT INTO compliance.compliance_legal_templates (
|
||||
tenant_id, document_type, title, description, language, jurisdiction,
|
||||
version, status, license_name, source_name, attribution_required,
|
||||
is_complete_document, placeholders, content
|
||||
) VALUES (
|
||||
'9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid,
|
||||
'fria',
|
||||
'Grundrechte-Folgenabschaetzung (FRIA) gemaess Art. 27 KI-Verordnung',
|
||||
'Vorlage fuer eine Grundrechte-Folgenabschaetzung (Fundamental Rights Impact Assessment) gemaess Art. 27 der Verordnung (EU) 2024/1689 (KI-Verordnung). Erforderlich fuer Hochrisiko-KI-Systeme, insbesondere bei oeffentlichen Stellen und in den Bereichen Beschaeftigung, Bildung und Zugang zu wesentlichen Dienstleistungen.',
|
||||
'de',
|
||||
'EU/KI-VO',
|
||||
'1.0',
|
||||
'published',
|
||||
'MIT',
|
||||
'BreakPilot Compliance',
|
||||
false,
|
||||
true,
|
||||
CAST('[
|
||||
"{{ORGANISATION_NAME}}",
|
||||
"{{ORGANISATION_ADRESSE}}",
|
||||
"{{VERANTWORTLICHER}}",
|
||||
"{{ERSTELLT_VON}}",
|
||||
"{{ERSTELLT_AM}}",
|
||||
"{{SYSTEM_NAME}}",
|
||||
"{{SYSTEM_VERSION}}",
|
||||
"{{SYSTEM_BESCHREIBUNG}}",
|
||||
"{{SYSTEM_ANBIETER}}",
|
||||
"{{EINSATZZWECK}}",
|
||||
"{{EINSATZKONTEXT}}",
|
||||
"{{BETROFFENE_GRUPPEN}}",
|
||||
"{{BETROFFENE_ANZAHL}}",
|
||||
"{{GRUNDRECHTE_ANALYSE}}",
|
||||
"{{RISIKOMATRIX}}",
|
||||
"{{MASSNAHMEN_LISTE}}",
|
||||
"{{HUMAN_OVERSIGHT_BESCHREIBUNG}}",
|
||||
"{{TRANSPARENZ_MASSNAHMEN}}",
|
||||
"{{KONSULTATION_ERGEBNISSE}}",
|
||||
"{{GENEHMIGT_VON}}",
|
||||
"{{GENEHMIGT_AM}}",
|
||||
"{{NAECHSTE_UEBERPRUEFUNG}}",
|
||||
"{{DSB_NAME}}",
|
||||
"{{DSB_KONTAKT}}",
|
||||
"{{AI_ACT_KLASSIFIKATION}}",
|
||||
"{{ANNEX_III_KATEGORIE}}"
|
||||
]' AS jsonb),
|
||||
$template$# Grundrechte-Folgenabschaetzung (FRIA)
|
||||
|
||||
**gemaess Art. 27 der Verordnung (EU) 2024/1689 (KI-Verordnung)**
|
||||
|
||||
---
|
||||
|
||||
| Feld | Wert |
|
||||
|------|------|
|
||||
| Organisation | {{ORGANISATION_NAME}} |
|
||||
| Adresse | {{ORGANISATION_ADRESSE}} |
|
||||
| KI-System | {{SYSTEM_NAME}} (Version {{SYSTEM_VERSION}}) |
|
||||
| Erstellt von | {{ERSTELLT_VON}} |
|
||||
| Erstellt am | {{ERSTELLT_AM}} |
|
||||
| Status | Entwurf |
|
||||
|
||||
---
|
||||
|
||||
## 1. Systembeschreibung und Einsatzkontext
|
||||
|
||||
### 1.1 KI-System
|
||||
|
||||
**Systemname:** {{SYSTEM_NAME}}
|
||||
**Version:** {{SYSTEM_VERSION}}
|
||||
**Anbieter:** {{SYSTEM_ANBIETER}}
|
||||
**Beschreibung:** {{SYSTEM_BESCHREIBUNG}}
|
||||
|
||||
### 1.2 AI Act Klassifikation
|
||||
|
||||
**Risikoklasse:** {{AI_ACT_KLASSIFIKATION}}
|
||||
{{#IF ANNEX_III_KATEGORIE}}
|
||||
**Annex III Kategorie:** {{ANNEX_III_KATEGORIE}}
|
||||
{{/IF}}
|
||||
|
||||
### 1.3 Einsatzzweck
|
||||
|
||||
{{EINSATZZWECK}}
|
||||
|
||||
### 1.4 Einsatzkontext
|
||||
|
||||
{{EINSATZKONTEXT}}
|
||||
|
||||
Folgende Fragen sind zu beantworten:
|
||||
- In welchem organisatorischen Kontext wird das System eingesetzt?
|
||||
- Welche Entscheidungen werden durch das System unterstuetzt oder automatisiert?
|
||||
- Wie haeufig wird das System eingesetzt?
|
||||
- Welche Rolle spielt das System im Gesamtprozess?
|
||||
|
||||
### 1.5 Betroffene Personengruppen
|
||||
|
||||
{{BETROFFENE_GRUPPEN}}
|
||||
|
||||
**Geschaetzte Anzahl betroffener Personen:** {{BETROFFENE_ANZAHL}}
|
||||
|
||||
{{#IF BILDUNGSKONTEXT}}
|
||||
**Besonderer Schutz:** Schueler, Studierende und Auszubildende geniessen als besonders schutzbeduerftiger Personenkreis erhoehten Schutz.
|
||||
{{/IF}}
|
||||
|
||||
{{#IF HR_KONTEXT}}
|
||||
**Besonderer Schutz:** Beschaeftigte und Bewerber befinden sich in einem Abhaengigkeitsverhaeltnis und beduerfen besonderen Schutzes vor diskriminierenden KI-Entscheidungen.
|
||||
{{/IF}}
|
||||
|
||||
---
|
||||
|
||||
## 2. Grundrechte-Mapping
|
||||
|
||||
### 2.1 Betroffene Grundrechte
|
||||
|
||||
Die folgenden Grundrechte der EU-Grundrechtecharta und des Grundgesetzes wurden auf Betroffenheit geprueft:
|
||||
|
||||
{{GRUNDRECHTE_ANALYSE}}
|
||||
|
||||
### 2.2 Referenz-Grundrechte
|
||||
|
||||
| Nr. | Grundrecht | EU-Charta | GG | Betroffen | Begruendung |
|
||||
|-----|-----------|-----------|-----|-----------|-------------|
|
||||
| 1 | Menschenwuerde | Art. 1 | Art. 1 | | |
|
||||
| 2 | Recht auf Privatsphaere | Art. 7 | Art. 2 Abs. 1 | | |
|
||||
| 3 | Schutz personenbezogener Daten | Art. 8 | Art. 2 Abs. 1 i.V.m. Art. 1 Abs. 1 | | |
|
||||
| 4 | Nicht-Diskriminierung | Art. 21 | Art. 3 | | |
|
||||
| 5 | Gleichheit von Frauen und Maennern | Art. 23 | Art. 3 Abs. 2 | | |
|
||||
| 6 | Rechte des Kindes | Art. 24 | Art. 6 Abs. 2 | | |
|
||||
| 7 | Recht auf Bildung | Art. 14 | Art. 12 | | |
|
||||
| 8 | Berufsfreiheit / Recht zu arbeiten | Art. 15 | Art. 12 | | |
|
||||
| 9 | Recht auf wirksamen Rechtsbehelf | Art. 47 | Art. 19 Abs. 4 | | |
|
||||
| 10 | Meinungs- und Informationsfreiheit | Art. 11 | Art. 5 | | |
|
||||
| 11 | Versammlungs- und Vereinigungsfreiheit | Art. 12 | Art. 8, 9 | | |
|
||||
| 12 | Recht auf soziale Sicherheit | Art. 34 | Art. 20 | | |
|
||||
|
||||
{{#IF OEFFENTLICHE_STELLE}}
|
||||
|
||||
### 2.3 Besondere Pflichten oeffentlicher Stellen
|
||||
|
||||
Als oeffentliche Stelle gelten zusaetzliche Anforderungen:
|
||||
- Erweiterte Transparenzpflicht gegenueber Buergern
|
||||
- Pflicht zur Barrierefreiheit des Systems
|
||||
- Beruecksichtigung des Gleichheitsgrundsatzes (Art. 3 GG)
|
||||
- Demokratische Kontrolle und Rechenschaftspflicht
|
||||
{{/IF}}
|
||||
|
||||
---
|
||||
|
||||
## 3. Risikoanalyse
|
||||
|
||||
### 3.1 Risikobewertung pro Grundrecht
|
||||
|
||||
Fuer jedes betroffene Grundrecht wird das Risiko bewertet:
|
||||
|
||||
**Eintrittswahrscheinlichkeit:**
|
||||
- 1 = Sehr unwahrscheinlich
|
||||
- 2 = Unwahrscheinlich
|
||||
- 3 = Moeglich
|
||||
- 4 = Wahrscheinlich
|
||||
- 5 = Sehr wahrscheinlich
|
||||
|
||||
**Schadensausmass:**
|
||||
- 1 = Geringfuegig
|
||||
- 2 = Begrenzt
|
||||
- 3 = Erheblich
|
||||
- 4 = Schwerwiegend
|
||||
- 5 = Katastrophal
|
||||
|
||||
### 3.2 Risikomatrix
|
||||
|
||||
{{RISIKOMATRIX}}
|
||||
|
||||
| Grundrecht | Risikoszenario | Wahrscheinlichkeit | Schwere | Risiko-Level | Begruendung |
|
||||
|-----------|----------------|--------------------:|--------:|:------------:|-------------|
|
||||
| | | | | | |
|
||||
|
||||
**Risiko-Level Berechnung:** Wahrscheinlichkeit × Schwere
|
||||
|
||||
| Risiko-Level | Punktzahl | Bedeutung |
|
||||
|:------------:|:---------:|-----------|
|
||||
| Niedrig | 1-6 | Akzeptables Risiko, Standardmassnahmen |
|
||||
| Mittel | 7-12 | Erhoehte Aufmerksamkeit, zusaetzliche Massnahmen |
|
||||
| Hoch | 13-19 | Erhebliches Risiko, umfassende Massnahmen erforderlich |
|
||||
| Kritisch | 20-25 | Nicht akzeptabel ohne fundamentale Aenderungen |
|
||||
|
||||
---
|
||||
|
||||
## 4. Massnahmen zur Risikominderung
|
||||
|
||||
### 4.1 Uebersicht der Massnahmen
|
||||
|
||||
{{MASSNAHMEN_LISTE}}
|
||||
|
||||
### 4.2 Human Oversight (Art. 14 KI-VO)
|
||||
|
||||
{{HUMAN_OVERSIGHT_BESCHREIBUNG}}
|
||||
|
||||
Folgende Massnahmen zur menschlichen Aufsicht werden umgesetzt:
|
||||
- [ ] Mensch kann KI-Entscheidung jederzeit uebersteuern
|
||||
- [ ] Mensch versteht KI-Output vollstaendig
|
||||
- [ ] Keine automatisierten Entscheidungen ohne menschliche Ueberpruefung
|
||||
- [ ] Schulung der Nutzer zu Systemgrenzen und Risiken
|
||||
- [ ] Eingriffsprotokolle werden gefuehrt
|
||||
|
||||
### 4.3 Transparenz (Art. 13 KI-VO)
|
||||
|
||||
{{TRANSPARENZ_MASSNAHMEN}}
|
||||
|
||||
Folgende Transparenzmassnahmen werden umgesetzt:
|
||||
- [ ] Betroffene werden ueber KI-Nutzung informiert
|
||||
- [ ] KI-generierte Outputs sind als solche gekennzeichnet
|
||||
- [ ] Erklaerbarkeit der Entscheidungslogik sichergestellt
|
||||
- [ ] Kontaktmoeglichkeit fuer Betroffene vorhanden
|
||||
- [ ] Informationen sind verstaendlich und zugaenglich
|
||||
|
||||
### 4.4 Logging und Audit (Art. 12 KI-VO)
|
||||
|
||||
- [ ] Alle Eingaben und Ausgaben werden protokolliert
|
||||
- [ ] Logs sind manipulationssicher
|
||||
- [ ] Aufbewahrungsfristen definiert
|
||||
- [ ] Audit-Trail fuer Entscheidungsnachvollziehbarkeit
|
||||
|
||||
### 4.5 Bias-Pruefung und Nicht-Diskriminierung
|
||||
|
||||
- [ ] Trainingsdaten auf Bias geprueft
|
||||
- [ ] Regelmaessige Bias-Audits geplant
|
||||
- [ ] Beschwerdemechanismus fuer Diskriminierungsfaelle
|
||||
{{#IF HR_KONTEXT}}
|
||||
- [ ] AGG-konforme Gestaltung (kein Bias bei Geschlecht, Alter, Herkunft, Behinderung)
|
||||
- [ ] Betriebsrat gemaess §95 BetrVG beteiligt (bei Auswahlrichtlinien)
|
||||
{{/IF}}
|
||||
{{#IF BILDUNGSKONTEXT}}
|
||||
- [ ] Chancengleichheit unabhaengig von sozioekonomischem Hintergrund
|
||||
- [ ] Keine Benachteiligung aufgrund von Sprachkenntnissen oder Behinderung
|
||||
{{/IF}}
|
||||
|
||||
---
|
||||
|
||||
## 5. Konsultation
|
||||
|
||||
### 5.1 Einbeziehung Betroffener
|
||||
|
||||
{{KONSULTATION_ERGEBNISSE}}
|
||||
|
||||
Folgende Stakeholder wurden konsultiert:
|
||||
- [ ] Datenschutzbeauftragter ({{DSB_NAME}}, {{DSB_KONTAKT}})
|
||||
- [ ] Betroffene Personengruppen oder deren Vertreter
|
||||
{{#IF HR_KONTEXT}}
|
||||
- [ ] Betriebsrat / Personalrat
|
||||
{{/IF}}
|
||||
{{#IF OEFFENTLICHE_STELLE}}
|
||||
- [ ] Buergervertreter / Ombudsstelle
|
||||
- [ ] Zustaendige Aufsichtsbehoerde
|
||||
{{/IF}}
|
||||
- [ ] Fachexperten fuer betroffene Grundrechte
|
||||
|
||||
### 5.2 Ergebnisse der Konsultation
|
||||
|
||||
| Stakeholder | Datum | Ergebnis | Massnahme |
|
||||
|------------|-------|----------|-----------|
|
||||
| | | | |
|
||||
|
||||
---
|
||||
|
||||
## 6. Gesamtbewertung und Freigabe
|
||||
|
||||
### 6.1 Gesamtrisiko-Bewertung
|
||||
|
||||
| Kriterium | Bewertung |
|
||||
|-----------|-----------|
|
||||
| Hoechstes Einzelrisiko | |
|
||||
| Anzahl betroffene Grundrechte | |
|
||||
| Anzahl betroffene Personen | {{BETROFFENE_ANZAHL}} |
|
||||
| Massnahmen ausreichend | Ja / Nein / Teilweise |
|
||||
| Restrisiko akzeptabel | Ja / Nein |
|
||||
|
||||
### 6.2 Entscheidung
|
||||
|
||||
- [ ] **Freigabe** — Restrisiko akzeptabel, Massnahmen ausreichend
|
||||
- [ ] **Freigabe mit Auflagen** — Zusaetzliche Massnahmen erforderlich (siehe unten)
|
||||
- [ ] **Ablehnung** — Grundrechtsrisiken nicht akzeptabel mitigierbar
|
||||
|
||||
### 6.3 Auflagen (falls zutreffend)
|
||||
|
||||
| Nr. | Auflage | Frist | Verantwortlich |
|
||||
|-----|---------|-------|----------------|
|
||||
| | | | |
|
||||
|
||||
---
|
||||
|
||||
## 7. Laufende Ueberwachung
|
||||
|
||||
### 7.1 Naechste Ueberpruefung
|
||||
|
||||
**Geplante Ueberpruefung:** {{NAECHSTE_UEBERPRUEFUNG}}
|
||||
|
||||
### 7.2 Trigger fuer ausserplanmaessige Ueberpruefung
|
||||
|
||||
Eine erneute FRIA ist durchzufuehren bei:
|
||||
- Wesentlicher Aenderung des KI-Systems oder seines Einsatzzwecks
|
||||
- Erweiterung auf neue Personengruppen oder Anwendungsbereiche
|
||||
- Beschwerden oder Vorfaellen mit Grundrechtsbezug
|
||||
- Aenderung der Rechtsgrundlage oder Risikoklassifikation
|
||||
- Neuen wissenschaftlichen Erkenntnissen zu Risiken
|
||||
- Aenderung des KI-Modells oder der Trainingsdaten
|
||||
|
||||
### 7.3 Dokumentation und Archivierung
|
||||
|
||||
Diese FRIA wird mindestens fuer die Dauer des Einsatzes des KI-Systems und darueberhinaus fuer 10 Jahre archiviert (Art. 18 KI-VO).
|
||||
|
||||
---
|
||||
|
||||
## 8. Unterschriften
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| _________________________ | _________________________ |
|
||||
| {{ERSTELLT_VON}} | {{GENEHMIGT_VON}} |
|
||||
| Erstellt am {{ERSTELLT_AM}} | Genehmigt am {{GENEHMIGT_AM}} |
|
||||
|
||||
---
|
||||
|
||||
**Anhang A:** Vollstaendige Systemdokumentation (Art. 11 KI-VO)
|
||||
**Anhang B:** AI Act Decision Tree Ergebnis
|
||||
**Anhang C:** Verknuepfte DSFA (falls vorhanden)
|
||||
**Anhang D:** Konsultationsprotokolle
|
||||
$template$
|
||||
) ON CONFLICT DO NOTHING;
|
||||
Reference in New Issue
Block a user