- CLAUDE.md: Comprehensive documentation for Lehrer KI platform - docs-src: Klausur, Voice, Agent-Core, KI-Pipeline docs - mkdocs.yml: Lehrer-specific nav with blue theme - docker-compose: Added docs service (port 8010, profile: docs) - .claude/rules: testing, docs, open-source, abiturkorrektur, vocab-worksheet, multi-agent, experimental-dashboard Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
23 KiB
Abiturkorrektur-System - Entwicklerdokumentation
WICHTIG: Diese Datei wird bei jedem Compacting gelesen. Alle Implementierungsdetails hier dokumentieren!
1. Projektziel
Entwicklung eines KI-gestützten Korrektur-Systems für Deutsch-Abiturklausuren:
- Zielgruppe: Lehrer in Niedersachsen (Pilot), später alle Bundesländer
- Kernproblem: Erstkorrektur dauert 6 Stunden pro Arbeit
- Lösung: KI schlägt Bewertungen vor, Lehrer bestätigt/korrigiert
2. Architektur-Übersicht
┌─────────────────────────────────────────────────────────────┐
│ Frontend (Next.js) │
│ /website/app/admin/klausur-korrektur/ │
│ - page.tsx (Klausur-Liste) │
│ - [klausurId]/page.tsx (Studenten-Liste) │
│ - [klausurId]/[studentId]/page.tsx (Korrektur-Workspace) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ klausur-service (FastAPI) │
│ Port 8086 - /klausur-service/backend/main.py │
│ - Klausur CRUD (/api/v1/klausuren) │
│ - Student Work (/api/v1/students) │
│ - Annotations (/api/v1/annotations) [NEU] │
│ - Gutachten Generation │
│ - Fairness Analysis │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Infrastruktur │
│ - Qdrant (Vektor-DB für RAG) │
│ - MinIO (Datei-Storage) │
│ - PostgreSQL (Metadaten) │
│ - Embedding-Service (Port 8087) │
└─────────────────────────────────────────────────────────────┘
3. Bestehende Backend-Komponenten (NUTZEN!)
3.1 Klausur-Service API (main.py)
# Bereits implementiert:
GET/POST /api/v1/klausuren # Klausur CRUD
GET /api/v1/klausuren/{id} # Klausur Details
POST /api/v1/klausuren/{id}/students # Student Work hochladen
GET /api/v1/klausuren/{id}/students # Studenten-Liste
PUT /api/v1/students/{id}/criteria # Kriterien bewerten
PUT /api/v1/students/{id}/gutachten # Gutachten speichern
POST /api/v1/students/{id}/gutachten/generate # Gutachten generieren (KI)
GET /api/v1/klausuren/{id}/fairness # Fairness-Analyse
GET /api/v1/grade-info # Notensystem-Info
3.2 Datenmodelle (main.py)
@dataclass
class Klausur:
id: str
title: str
subject: str = "Deutsch"
year: int = 2025
semester: str = "Abitur"
modus: str = "abitur" # oder "vorabitur"
eh_id: Optional[str] = None # Erwartungshorizont-Referenz
@dataclass
class StudentKlausur:
id: str
klausur_id: str
anonym_id: str
file_path: str
ocr_text: str = ""
criteria_scores: Dict[str, int] = field(default_factory=dict)
gutachten: str = ""
status: str = "UPLOADED"
raw_points: int = 0
grade_points: int = 0
# Status-Workflow:
# UPLOADED → OCR_PROCESSING → OCR_COMPLETE → ANALYZING →
# FIRST_EXAMINER → SECOND_EXAMINER → COMPLETED
3.3 Notensystem (15-Punkte)
GRADE_THRESHOLDS = {
15: 95, 14: 90, 13: 85, 12: 80, 11: 75,
10: 70, 9: 65, 8: 60, 7: 55, 6: 50,
5: 45, 4: 40, 3: 33, 2: 27, 1: 20, 0: 0
}
DEFAULT_CRITERIA = {
"rechtschreibung": {"name": "Rechtschreibung", "weight": 15},
"grammatik": {"name": "Grammatik", "weight": 15},
"inhalt": {"name": "Inhalt", "weight": 40},
"struktur": {"name": "Struktur", "weight": 15},
"stil": {"name": "Stil", "weight": 15}
}
4. NEU ZU IMPLEMENTIEREN
Phase 1: Korrektur-Workspace MVP
4.1 Frontend-Struktur
/website/app/admin/klausur-korrektur/
├── page.tsx # Klausur-Übersicht (Liste aller Klausuren)
├── types.ts # TypeScript Interfaces
├── [klausurId]/
│ ├── page.tsx # Studenten-Liste einer Klausur
│ └── [studentId]/
│ └── page.tsx # Korrektur-Workspace (2/3-1/3)
└── components/
├── KlausurCard.tsx # Klausur in Liste
├── StudentList.tsx # Studenten-Übersicht
├── DocumentViewer.tsx # PDF/Bild-Anzeige (links, 2/3)
├── AnnotationLayer.tsx # SVG-Overlay für Markierungen
├── AnnotationToolbar.tsx # Werkzeuge
├── CorrectionPanel.tsx # Bewertungs-Panel (rechts, 1/3)
├── CriteriaScoreCard.tsx # Einzelnes Kriterium
├── EHSuggestionPanel.tsx # EH-Vorschläge via RAG
├── GutachtenEditor.tsx # Gutachten bearbeiten
└── StudentNavigation.tsx # Prev/Next Navigation
4.2 Annotations-Backend (NEU in main.py)
# Neues Datenmodell:
@dataclass
class Annotation:
id: str
student_work_id: str
page: int
position: dict # {x, y, width, height} in % (0-100)
type: str # 'rechtschreibung' | 'grammatik' | 'inhalt' | 'struktur' | 'stil' | 'comment'
text: str # Kommentar-Text
severity: str # 'minor' | 'major' | 'critical'
suggestion: str # Korrekturvorschlag (bei RS/Gram)
created_by: str # User-ID (EK oder ZK)
created_at: datetime
role: str # 'first_examiner' | 'second_examiner'
linked_criterion: Optional[str] # Verknüpfung zu Kriterium
# Neue Endpoints:
POST /api/v1/students/{id}/annotations # Erstellen
GET /api/v1/students/{id}/annotations # Abrufen
PUT /api/v1/annotations/{id} # Ändern
DELETE /api/v1/annotations/{id} # Löschen
4.3 UI-Layout Spezifikation
┌──────────────────────────────────────────────────────────────────────┐
│ Header: Klausur-Titel | Student: Anonym-123 | [← Prev] [5/24] [Next →]│
├─────────────────────────────────────────┬────────────────────────────┤
│ │ Tabs: [Kriterien] [Gutachten]│
│ ┌─────────────────────────────────┐ │ │
│ │ │ │ ▼ Rechtschreibung (15%) │
│ │ Dokument-Anzeige │ │ [====|====] 70/100 │
│ │ (PDF/Bild mit Zoom) │ │ 12 Fehler markiert │
│ │ │ │ │
│ │ + Annotation-Overlay │ │ ▼ Grammatik (15%) │
│ │ (SVG Layer) │ │ [====|====] 80/100 │
│ │ │ │ │
│ │ │ │ ▼ Inhalt (40%) │
│ │ │ │ [====|====] 65/100 │
│ │ │ │ EH-Vorschläge: [Laden] │
│ └─────────────────────────────────┘ │ │
│ │ ▼ Struktur (15%) │
│ Toolbar: [RS] [Gram] [Kommentar] │ [====|====] 75/100 │
│ [Zoom+] [Zoom-] [Fit] │ │
│ │ ▼ Stil (15%) │
│ Seiten: [1] [2] [3] [4] [5] │ [====|====] 70/100 │
│ │ │
│ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │ Gesamtnote: 10 Punkte (2-) │
│ │ [Gutachten generieren] │
│ │ [Speichern] [Abschließen] │
├─────────────────────────────────────────┴────────────────────────────┤
│ 2/3 Breite │ 1/3 Breite │
└──────────────────────────────────────────────────────────────────────┘
5. Implementierungs-Reihenfolge
Phase 1.1: Grundgerüst (AKTUELL)
- ✅ Dokumentation erstellen
/website/app/admin/klausur-korrektur/page.tsx- Klausur-Liste/website/app/admin/klausur-korrektur/types.ts- TypeScript Types- Navigation in AdminLayout.tsx hinzufügen
- Deploy + Test
Phase 1.2: Korrektur-Workspace
[klausurId]/page.tsx- Studenten-Liste[klausurId]/[studentId]/page.tsx- Workspacecomponents/DocumentViewer.tsx- Bild/PDF Anzeigecomponents/CorrectionPanel.tsx- Bewertungs-Panel- Deploy + Test mit Lehrer
Phase 1.3: Annotations-System
- Backend: Annotations-Endpoints in main.py
components/AnnotationLayer.tsx- SVG Overlaycomponents/AnnotationToolbar.tsx- Werkzeuge- Farbkodierung: RS=rot, Gram=blau, Inhalt=grün
- Deploy + Test
Phase 1.4: EH-Integration
components/EHSuggestionPanel.tsx- Backend:
/api/v1/students/{id}/eh-suggestions - RAG-Query mit Student-Text
- Deploy + Test
Phase 1.5: Gutachten-Editor
components/GutachtenEditor.tsx- Beleg-Verlinkung zu Annotations
- Gutachten-Generierung Button
- Deploy + Test
6. API-Konfiguration
// Frontend API Base URLs
const KLAUSUR_SERVICE = process.env.NEXT_PUBLIC_KLAUSUR_SERVICE_URL || 'http://localhost:8086'
// Endpoints:
// Klausuren
GET ${KLAUSUR_SERVICE}/api/v1/klausuren
POST ${KLAUSUR_SERVICE}/api/v1/klausuren
GET ${KLAUSUR_SERVICE}/api/v1/klausuren/{id}
GET ${KLAUSUR_SERVICE}/api/v1/klausuren/{id}/students
// Studenten
GET ${KLAUSUR_SERVICE}/api/v1/students/{id}
GET ${KLAUSUR_SERVICE}/api/v1/students/{id}/file // Dokument-Download
PUT ${KLAUSUR_SERVICE}/api/v1/students/{id}/criteria
PUT ${KLAUSUR_SERVICE}/api/v1/students/{id}/gutachten
POST ${KLAUSUR_SERVICE}/api/v1/students/{id}/gutachten/generate
// Annotations (NEU)
GET ${KLAUSUR_SERVICE}/api/v1/students/{id}/annotations
POST ${KLAUSUR_SERVICE}/api/v1/students/{id}/annotations
PUT ${KLAUSUR_SERVICE}/api/v1/annotations/{id}
DELETE ${KLAUSUR_SERVICE}/api/v1/annotations/{id}
// System
GET ${KLAUSUR_SERVICE}/api/v1/grade-info
7. Deployment-Prozess
# 1. Dateien auf Mac Mini synchronisieren
rsync -avz --delete \
--exclude 'node_modules' --exclude '.next' --exclude '.git' \
/Users/benjaminadmin/Projekte/breakpilot-pwa/website/ \
macmini:/Users/benjaminadmin/Projekte/breakpilot-pwa/website/
# 2. Website-Container neu bauen
ssh macmini "/usr/local/bin/docker compose \
-f /Users/benjaminadmin/Projekte/breakpilot-pwa/docker-compose.yml \
build --no-cache website"
# 3. Container neu starten
ssh macmini "/usr/local/bin/docker compose \
-f /Users/benjaminadmin/Projekte/breakpilot-pwa/docker-compose.yml \
up -d website"
# 4. Testen unter:
# http://macmini:3000/admin/klausur-korrektur
8. Bundesland-Spezifika (Niedersachsen Pilot)
// /klausur-service/backend/policies/bundeslaender.json
{
"NI": {
"name": "Niedersachsen",
"grading_mode": "points_15",
"requires_gutachten": true,
"zk_visibility": "full", // ZK sieht EK-Korrektur
"third_correction_threshold": 4, // Ab 4 Punkte Diff
"colors": {
"first_examiner": "#dc2626", // Rot
"second_examiner": "#16a34a" // Grün
},
"criteria_weights": {
"rechtschreibung": 15,
"grammatik": 15,
"inhalt": 40,
"struktur": 15,
"stil": 15
}
}
}
9. Wichtige Dateien (Referenz)
| Datei | Beschreibung |
|---|---|
/klausur-service/backend/main.py |
Haupt-API, alle Endpoints |
/klausur-service/backend/eh_pipeline.py |
BYOEH Verarbeitung |
/klausur-service/backend/qdrant_service.py |
RAG Vector-Suche |
/klausur-service/backend/hybrid_search.py |
Hybrid Search |
/website/components/admin/AdminLayout.tsx |
Admin Navigation |
/website/app/admin/ocr-labeling/page.tsx |
Referenz für 2/3-1/3 Layout |
10. Testing-Checkliste
Nach jeder Phase:
- Seite lädt ohne Fehler
- API-Calls funktionieren (DevTools Network)
- Responsives Layout korrekt
- Lehrer kann Workflow durchführen
Lehrer-Test-Szenarien:
- Klausur erstellen
- 3+ Studentenarbeiten hochladen
- Erste Arbeit korrigieren (alle Kriterien)
- Annotations setzen
- Gutachten generieren
- Zur nächsten Arbeit navigieren
- Fairness-Check nach allen Arbeiten
11. Phase 2: Zweitkorrektur-System (NEU)
11.1 Neue Backend-Endpoints (main.py)
# Zweitkorrektur Workflow
POST /api/v1/students/{id}/start-zweitkorrektur # ZK starten (nach EK)
POST /api/v1/students/{id}/submit-zweitkorrektur # ZK-Ergebnis abgeben
# Einigung (bei Diff 3 Punkte)
POST /api/v1/students/{id}/einigung # Einigung einreichen
# Drittkorrektur (bei Diff >= 4 Punkte)
POST /api/v1/students/{id}/assign-drittkorrektor # DK zuweisen
POST /api/v1/students/{id}/submit-drittkorrektur # DK-Ergebnis (final)
# Workflow-Status & Visibility-Filtering
GET /api/v1/students/{id}/examiner-workflow # Workflow-Status abrufen
GET /api/v1/students/{id}/annotations-filtered # Policy-gefilterte Annotations
11.2 Workflow-Status
class ExaminerWorkflowStatus(str, Enum):
NOT_STARTED = "not_started"
EK_IN_PROGRESS = "ek_in_progress"
EK_COMPLETED = "ek_completed"
ZK_ASSIGNED = "zk_assigned"
ZK_IN_PROGRESS = "zk_in_progress"
ZK_COMPLETED = "zk_completed"
EINIGUNG_REQUIRED = "einigung_required"
EINIGUNG_COMPLETED = "einigung_completed"
DRITTKORREKTUR_REQUIRED = "drittkorrektur_required"
DRITTKORREKTUR_ASSIGNED = "drittkorrektur_assigned"
DRITTKORREKTUR_IN_PROGRESS = "drittkorrektur_in_progress"
COMPLETED = "completed"
11.3 Visibility-Regeln (aus bundeslaender.json)
| Modus | ZK sieht EK-Annotations | ZK sieht EK-Note | ZK sieht EK-Gutachten |
|---|---|---|---|
blind |
Nein | Nein | Nein |
semi (Bayern) |
Ja | Nein | Nein |
full (NI, Default) |
Ja | Ja | Ja |
11.4 Konsens-Regeln
| Differenz EK-ZK | Aktion |
|---|---|
| 0-2 Punkte | Auto-Konsens (Durchschnitt) |
| 3 Punkte | Einigung erforderlich |
| >= 4 Punkte | Drittkorrektur erforderlich |
12. Aktueller Stand
Datum: 2026-01-21 Phase: Alle Phasen abgeschlossen Status: MVP komplett - bereit fuer Produktionstest
Abgeschlossen:
- Phase 1: Korrektur-Workspace MVP
- Phase 1.1: Grundgerüst (Klausur-Liste, Studenten-Liste)
- Phase 1.2: Annotations-System
- Phase 1.3: RS/Grammatik Overlays
- Phase 1.4: EH-Vorschläge via RAG
- Phase 2.1 Backend: Zweitkorrektur-Endpoints
- Phase 2.2 Backend: Einigung-Endpoint
- Phase 2.3 Backend: Drittkorrektur-Trigger
- Phase 2.1 Frontend: ZK-Modus UI
- Phase 2.2 Frontend: Einigung-Screen
- Phase 3.1: Fairness-Dashboard Frontend
- Phase 3.2: Ausreißer-Liste mit Quick-Adjust
- Phase 3.3: Noten-Histogramm & Heatmap
- Phase 4.1: PDF-Export Backend (reportlab)
- Phase 4.2: PDF-Export Frontend
- Phase 4.3: Vorabitur-Modus mit EH-Templates
URLs:
- Klausur-Korrektur:
/admin/klausur-korrektur - Fairness-Dashboard:
/admin/klausur-korrektur/[klausurId]/fairness
PDF-Export Endpoints:
GET /api/v1/students/{id}/export/gutachten- Einzelnes Gutachten als PDFGET /api/v1/students/{id}/export/annotations- Anmerkungen als PDFGET /api/v1/klausuren/{id}/export/overview- Notenübersicht als PDFGET /api/v1/klausuren/{id}/export/all-gutachten- Alle Gutachten als PDF
Vorabitur-Modus Endpoints:
GET /api/v1/vorabitur/templates- Liste aller EH-TemplatesGET /api/v1/vorabitur/templates/{aufgabentyp}- Template-DetailsPOST /api/v1/klausuren/{id}/vorabitur-eh- Custom EH erstellenGET /api/v1/klausuren/{id}/vorabitur-eh- Verknuepften EH abrufenPUT /api/v1/klausuren/{id}/vorabitur-eh- EH aktualisieren
Verfuegbare Aufgabentypen:
textanalyse_pragmatisch- Sachtexte, Reden, Kommentaregedichtanalyse- Lyrik/Gedichteprosaanalyse- Romane, Kurzgeschichtendramenanalyse- Dramatische Texteeroerterung_textgebunden- Textgebundene Eroerterung
13. Lehrer-Anleitung (Schritt-fuer-Schritt)
13.1 Zugang zum System
Weg 1: Ueber das Haupt-Dashboard
- Oeffnen Sie
http://macmini:8000/appim Browser - Klicken Sie auf die Kachel "Abiturklausuren"
- Sie werden automatisch zur Korrektur-Oberflaeche weitergeleitet
Weg 2: Direkter Zugang
- Oeffnen Sie direkt
http://macmini:3000/admin/klausur-korrektur
13.2 Zwei Einstiegs-Optionen
Beim ersten Besuch sehen Sie die Willkommens-Seite mit zwei Optionen:
Option A: Schnellstart (Direkt hochladen)
- Ideal wenn Sie sofort loslegen moechten
- Keine manuelle Klausur-Erstellung erforderlich
- System erstellt automatisch eine Klausur im Hintergrund
Schritte:
- Klicken Sie auf "Schnellstart - Direkt hochladen"
- Schritt 1: Ziehen Sie Ihre eingescannten Arbeiten (PDF/JPG/PNG) in den Upload-Bereich
- Schritt 2: Optional - Waehlen Sie den Aufgabentyp und beschreiben Sie die Aufgabenstellung
- Schritt 3: Pruefen Sie die Zusammenfassung und klicken "Korrektur starten"
- Sie werden automatisch zur Korrektur-Ansicht weitergeleitet
Option B: Neue Klausur erstellen (Standard)
- Empfohlen fuer regelmaessige Nutzung
- Volle Metadaten (Fach, Jahr, Kurs, Modus)
- Unterstuetzt Zweitkorrektur-Workflow
Schritte:
- Klicken Sie auf "Neue Klausur erstellen"
- Geben Sie Titel, Fach, Jahr und Semester ein
- Waehlen Sie den Modus:
- Abitur: Fuer offizielle Abitur-Pruefungen mit NiBiS-EH
- Vorabitur: Fuer Uebungsklausuren mit eigenem EH
- Bei Vorabitur: Waehlen Sie Aufgabentyp und beschreiben Sie die Aufgabenstellung
- Klicken Sie "Klausur erstellen"
13.3 Arbeiten hochladen
Nach Erstellung der Klausur:
- Oeffnen Sie die Klausur aus der Liste
- Klicken Sie "Arbeiten hochladen"
- Waehlen Sie die eingescannten Dateien (PDF oder Bilder)
- Geben Sie optional anonyme IDs (z.B. "Arbeit-1", "Arbeit-2")
- Das System startet automatisch die OCR-Erkennung
13.4 Korrigieren
Korrektur-Workspace (2/3-1/3 Layout):
- Links (2/3): Das Originaldokument mit Zoom-Funktion
- Rechts (1/3): Bewertungspanel mit Kriterien
Schritt fuer Schritt:
- Oeffnen Sie eine Arbeit durch Klick auf "Korrigieren"
- Lesen Sie die Arbeit im linken Bereich (Zoom mit +/-)
- Setzen Sie Anmerkungen durch Klick auf das Dokument
- Waehlen Sie den Anmerkungstyp:
- RS (rot): Rechtschreibfehler
- Gram (blau): Grammatikfehler
- Inhalt (gruen): Inhaltliche Anmerkungen
- Kommentar: Allgemeine Bemerkungen
- Bewerten Sie die 5 Kriterien im rechten Panel:
- Rechtschreibung (15%)
- Grammatik (15%)
- Inhalt (40%)
- Struktur (15%)
- Stil (15%)
- Klicken Sie "EH-Vorschlaege laden" fuer KI-Unterstuetzung
- Klicken Sie "Gutachten generieren" fuer einen KI-Vorschlag
- Bearbeiten Sie das Gutachten nach Bedarf
- Klicken Sie "Speichern" und dann "Naechste Arbeit"
13.5 Fairness-Analyse
Nach Korrektur mehrerer Arbeiten:
- Klicken Sie auf "Fairness-Dashboard" in der Klausur-Ansicht
- Pruefen Sie:
- Noten-Histogramm: Ist die Verteilung realistisch?
- Ausreisser: Gibt es ungewoehnlich hohe/niedrige Noten?
- Kriterien-Heatmap: Sind Kriterien konsistent bewertet?
- Nutzen Sie "Quick-Adjust" um Anpassungen vorzunehmen
13.6 PDF-Export
- In der Klausur-Ansicht klicken Sie "PDF-Export"
- Waehlen Sie:
- Einzelgutachten: PDF fuer einen Schueler
- Alle Gutachten: Gesamtes PDF fuer alle Arbeiten
- Notenuebersicht: Uebersicht aller Noten
- Anmerkungen: Alle Annotationen als PDF
13.7 Zweitkorrektur (Optional)
Fuer offizielle Abitur-Klausuren:
- Erstkorrektur abschliessen (Status: "Abgeschlossen")
- Klicken Sie "Zweitkorrektur starten"
- Der Zweitkorrektor bewertet unabhaengig
- Bei Differenz >= 3 Punkte: Einigung erforderlich
- Bei Differenz >= 4 Punkte: Drittkorrektur wird automatisch ausgeloest
13.8 Haeufige Fragen
F: Kann ich eine Korrektur unterbrechen und spaeter fortsetzen? A: Ja, alle Aenderungen werden automatisch gespeichert.
F: Was passiert mit meinen Daten? A: Alle Daten werden lokal auf dem Schulserver gespeichert. Keine Cloud-Speicherung.
F: Kann ich den KI-Vorschlag komplett ueberschreiben? A: Ja, das Gutachten ist frei editierbar. Der KI-Vorschlag ist nur ein Startpunkt.
F: Wie funktioniert die OCR-Erkennung? A: Das System erkennt Handschrift automatisch. Bei schlechter Lesbarkeit koennen Sie manuell nachbessern.
14. Integration Dashboard (Port 8000)
14.1 Aenderungen in dashboard.py
Die Funktion openKlausurService() wurde aktualisiert:
// Alte Version: Oeffnete Port 8086 (Backend)
// Neue Version: Oeffnet Port 3000 (Next.js Frontend)
function openKlausurService() {
let baseUrl;
if (window.location.hostname === 'macmini') {
baseUrl = 'http://macmini:3000';
} else {
baseUrl = 'http://localhost:3000';
}
window.open(baseUrl + '/admin/klausur-korrektur', '_blank');
}
14.2 Neue Frontend-Features
- Willkommens-Tab: Erster Tab fuer neue Benutzer mit Workflow-Erklaerung
- Direktupload-Wizard: 3-Schritt-Wizard fuer Schnellstart
- Drag & Drop: Arbeiten per Drag & Drop hochladen
- localStorage-Persistenz: System merkt sich wiederkehrende Benutzer