This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
breakpilot-pwa/backend/PLAN_KLAUSURKORREKTUR.md
BreakPilot Dev 19855efacc
Some checks failed
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
ci/woodpecker/manual/build-ci-image Pipeline was successful
ci/woodpecker/manual/main Pipeline failed
feat: BreakPilot PWA - Full codebase (clean push without large binaries)
All services: admin-v2, studio-v2, website, ai-compliance-sdk,
consent-service, klausur-service, voice-service, and infrastructure.
Large PDFs and compiled binaries excluded via .gitignore.
2026-02-11 13:25:58 +01:00

6.6 KiB

Klausurkorrektur - Privacy-by-Design Implementation Plan

Übersicht

Implementierung eines DSGVO-konformen Klausurkorrektur-Moduls mit QR-Code-basierter Pseudonymisierung. Keine personenbezogenen Daten werden an das LLM gesendet.

Architektur-Prinzipien

  1. Pseudonymisierung (Art. 4 Nr. 5 DSGVO): doc_token (128-bit random) als einziger Join-Key
  2. Teacher Namespace Isolation: Jeder Lehrer hat isolierten Workspace
  3. Privacy by Architecture: Backend kann Schüler nicht identifizieren
  4. Self-hosted LLM: SysEleven, kein OpenAI/externe Datenübertragung

Phase 1: Backend-Infrastruktur

1.1 Datenmodelle erstellen

Datei: /backend/klausur/db_models.py (NEU)

# Modelle:
- ExamSession: teacher_id, session_id, created_at, status
- PseudonymizedDocument: doc_token (UUID), session_id, ocr_text, ai_feedback, created_at
- TeacherVault: teacher_id, encrypted_identity_map (lokal verschlüsselt)

1.2 Repository-Klasse

Datei: /backend/klausur/repository.py (NEU)

  • CRUD für ExamSession, PseudonymizedDocument
  • Teacher-Isolation durch teacher_id Filter
  • Keine Speicherung von Klarnamen im Backend

1.3 Pseudonymisierung-Service

Datei: /backend/klausur/services/pseudonymizer.py (NEU)

class PseudonymizationService:
    def generate_doc_token() -> str  # 128-bit UUID
    def generate_qr_overlay(doc_token: str) -> bytes  # QR-Code PNG
    def redact_header(image: bytes) -> bytes  # Entfernt Kopfzeile mit Namen
    def extract_doc_token_from_qr(image: bytes) -> str  # QR-Code lesen

1.4 OCR-Integration erweitern

Datei: /backend/services/file_processor.py (ERWEITERN)

  • Neue Methode: process_exam_page(image, redact_header=True)
  • Integration mit PaddleOCR für Handschrift
  • Header-Redaction vor OCR

1.5 LLM-Korrektur-Service

Datei: /backend/klausur/services/correction_service.py (NEU)

class ExamCorrectionService:
    def correct_answer(doc_token: str, question: str, student_answer: str, rubric: str) -> CorrectionResult
    def batch_correct(session_id: str) -> List[CorrectionResult]
  • Nutzt bestehenden LLM-Gateway (Ollama/vLLM)
  • Nur pseudonymisierte Texte werden gesendet
  • doc_token als einzige Referenz

Phase 2: API-Endpunkte

2.1 Klausur-API

Datei: /backend/klausur/routes.py (NEU)

POST /api/klausur/session                    # Neue Korrektur-Session erstellen
GET  /api/klausur/session/{session_id}       # Session-Status abrufen
POST /api/klausur/session/{session_id}/upload # Gescannte Seiten hochladen
GET  /api/klausur/session/{session_id}/qr-sheet # QR-Overlay-Bogen generieren
POST /api/klausur/session/{session_id}/process # OCR + KI-Korrektur starten
GET  /api/klausur/session/{session_id}/results # Pseudonymisierte Ergebnisse
DELETE /api/klausur/session/{session_id}     # Session löschen

2.2 Teacher Vault API (Client-seitig)

Datei: /backend/klausur/routes.py

POST /api/klausur/vault/encrypt   # Identity-Map clientseitig verschlüsseln
POST /api/klausur/vault/decrypt   # Identity-Map clientseitig entschlüsseln
  • Server speichert nur verschlüsselte Blobs
  • Schlüssel bleibt beim Lehrer (Browser/LocalStorage)

Phase 3: PWA Frontend-Modul

3.1 Klausurkorrektur-Modul ersetzen

Datei: /backend/frontend/modules/klausur_korrektur.py (ÜBERSCHREIBEN)

Tabs im Modul:

  1. Neue Session: QR-Bogen generieren, Schülerliste eingeben
  2. Upload: Gescannte Klausuren hochladen (Drag & Drop)
  3. Verarbeitung: OCR + KI-Korrektur Status
  4. Ergebnisse: Pseudonymisierte Bewertungen → Re-Join mit lokaler Identity-Map
  5. Export: Excel/PDF Export der Ergebnisse

3.2 Identity-Map (Teacher Vault)

Client-seitig in JavaScript:

class TeacherVault {
    constructor(teacherId)
    generateIdentityMap(studentNames) // Erstellt doc_token → Name Mapping
    encrypt(password) // AES-256 Verschlüsselung im Browser
    decrypt(password) // Entschlüsselung im Browser
    rejoinResults(pseudonymizedResults) // Verknüpft Ergebnisse mit Namen
    exportToLocalStorage()
    importFromLocalStorage()
}

3.3 QR-Code Workflow

UI-Flow:

  1. Lehrer gibt Schülerliste ein (Namen)
  2. System generiert für jeden Schüler einen doc_token
  3. Identity-Map wird lokal im Browser verschlüsselt gespeichert
  4. QR-Bogen wird zum Ausdrucken generiert (jeder QR = ein doc_token)
  5. Schüler kleben QR auf ihre Klausur
  6. Nach Scan: QR wird erkannt, Header redacted, nur Text an LLM

Phase 4: Admin-Panel Integration

4.1 GPU/LLM-Tab erweitern

Datei: /backend/frontend/components/admin_gpu.py (ERWEITERN)

Neue Abschnitte:

  • Klausur-Queue: Warteschlange der Korrektur-Jobs
  • LLM-Status: Verbindung zu SysEleven vLLM
  • OCR-Status: PaddleOCR Verfügbarkeit
  • Session-Übersicht: Aktive Korrektur-Sessions (nur Anzahl, keine Namen)

Phase 5: Sicherheits-Features

5.1 Zero-Knowledge Design

  • Backend speichert niemals Klarnamen
  • Identity-Map nur verschlüsselt (Client-Key)
  • doc_token ist kryptografisch zufällig (UUID4)
  • Keine Korrelation zwischen Sessions möglich

5.2 Daten-Retention

  • Pseudonymisierte Daten: 30 Tage, dann auto-delete
  • Verschlüsselte Vault-Daten: Lehrer kann jederzeit löschen
  • Audit-Log ohne PII

5.3 Teacher-Isolation

  • Alle Queries gefiltert nach teacher_id
  • Kein Cross-Teacher-Zugriff möglich
  • Row-Level Security in PostgreSQL

Implementierungs-Reihenfolge

  1. Backend-Modelle (/backend/klausur/db_models.py)
  2. Repository (/backend/klausur/repository.py)
  3. Pseudonymizer-Service (/backend/klausur/services/pseudonymizer.py)
  4. Correction-Service (/backend/klausur/services/correction_service.py)
  5. API-Routes (/backend/klausur/routes.py)
  6. PWA-Modul (/backend/frontend/modules/klausur_korrektur.py)
  7. TeacherVault JS (eingebettet in Modul)
  8. Admin-Panel (/backend/frontend/components/admin_gpu.py)
  9. Tests (/backend/klausur/tests/)
  10. Migration (Alembic für neue Tabellen)

Technologie-Stack

Komponente Technologie
QR-Code qrcode + Pillow
OCR PaddleOCR (bereits vorhanden)
Verschlüsselung (Client) Web Crypto API (AES-256-GCM)
Verschlüsselung (Server) cryptography (Fernet)
LLM vLLM @ SysEleven (via llm_gateway)
DB PostgreSQL + SQLAlchemy

Datenschutz-Garantien

Keine Schülernamen im Backend gespeichert Keine Schülernamen an LLM gesendet Identity-Map nur verschlüsselt (Client-Schlüssel) Teacher-Namespace-Isolation Automatische Daten-Löschung nach 30 Tagen Vergleichbar mit lokaler PC-Verarbeitung (Art. 4 Nr. 5 DSGVO)