# OCR Pipeline Regression Testing

**Stand:** 2026-03-23

---

## Uebersicht

Das Regression Framework stellt sicher, dass Aenderungen an der OCR-Pipeline keine bestehenden
Ergebnisse verschlechtern. Ground-Truth Sessions dienen als Referenz — nach jeder Code-Aenderung
wird die Pipeline neu ausgefuehrt und das Ergebnis mit der Referenz verglichen.

---

## Ground Truth markieren

### Via Admin-UI (empfohlen)

1. Oeffne die OCR Pipeline: [/ai/ocr-pipeline](https://macmini:3002/ai/ocr-pipeline)
2. Lade eine Session und fuehre alle Pipeline-Schritte aus
3. Pruefe das Ergebnis im Grid Editor (Schritt 10)
4. Korrigiere Fehler falls noetig (Inline-Edit)
5. Klicke **"Als Ground Truth markieren"**

### Via API

```bash
# Bestehende Session als Ground Truth markieren
curl -X POST "http://macmini:8086/api/v1/ocr-pipeline/sessions/{session_id}/mark-ground-truth"

# Ground Truth entfernen
curl -X DELETE "http://macmini:8086/api/v1/ocr-pipeline/sessions/{session_id}/mark-ground-truth"

# Alle Ground-Truth Sessions auflisten
curl "http://macmini:8086/api/v1/ocr-pipeline/ground-truth-sessions"
```

### Via Ground-Truth Review UI

Fuer die Massenpruefung von 50-100 Sessions:

1. Oeffne [/ai/ocr-ground-truth](https://macmini:3002/ai/ocr-ground-truth)
2. Filter auf "Offen" (ungeprueft)
3. Split-View: Bild links, Grid rechts pruefen
4. Korrekte Zeilen mit Haekchen bestaetigen
5. Fehler inline korrigieren
6. "Markieren & Weiter" fuer naechste Session

---

## Regression ausfuehren

### Via Shell-Script (CI/CD)

```bash
# Standard: macmini:8086
./scripts/run-regression.sh

# Custom URL
./scripts/run-regression.sh http://localhost:8086

# Exit-Codes:
# 0 = alle bestanden
# 1 = Fehler gefunden
# 2 = Verbindungsfehler
```

### Via Admin-UI

1. Oeffne [/ai/ocr-regression](https://macmini:3002/ai/ocr-regression)
2. Klicke **"Alle Tests starten"**
3. Ergebnis: Pass/Fail pro Session mit Diff-Details

### Via API

```bash
# Alle Ground-Truth Sessions testen
curl -X POST "http://macmini:8086/api/v1/ocr-pipeline/regression/run?triggered_by=script"

# Einzelne Session testen
curl -X POST "http://macmini:8086/api/v1/ocr-pipeline/sessions/{session_id}/regression/run"

# Verlauf abrufen
curl "http://macmini:8086/api/v1/ocr-pipeline/regression/history?limit=20"
```

---

## Ergebnisse lesen

### Diff-Typen

| Typ | Beschreibung |
|-----|-------------|
| `structural_changes` | Anzahl Zonen, Spalten oder Zeilen hat sich geaendert |
| `text_change` | Text einer Zelle hat sich geaendert |
| `cell_missing` | Zelle war in der Referenz, fehlt jetzt |
| `cell_added` | Neue Zelle die in der Referenz nicht existierte |
| `col_type_change` | Spaltentyp einer Zelle hat sich geaendert |

### Status-Bewertung

- **pass**: Keine Diffs → Code-Aenderung hat keine Auswirkung
- **fail**: Diffs gefunden → pruefen ob gewollt (Feature) oder ungewollt (Regression)
- **error**: Pipeline-Fehler → Build oder Config-Problem

### Verlauf

Alle Laeufe werden in der Tabelle `regression_runs` persistiert:

```sql
SELECT id, run_at, status, total, passed, failed, errors, duration_ms, triggered_by
FROM regression_runs
ORDER BY run_at DESC
LIMIT 10;
```

---

## Best Practices

### Ground-Truth Sessions waehlen

Decke verschiedene Seitentypen ab:

- Woerterbuchseiten (2-3 Spalten, IPA-Klammern)
- Uebungsseiten (Tabellen, Checkboxen)
- Seiten mit Illustrationen
- Seiten ohne IPA (reines Deutsch-Vokabular)
- Verschiedene Verlage und Layouts

### Workflow vor jedem Commit

```bash
# 1. Regression laufen lassen
./scripts/run-regression.sh

# 2. Bei Failure: Diff pruefen
#    - Gewollte Aenderung? → Ground Truth aktualisieren
#    - Ungewollte Regression? → Code fixen

# 3. Bei Pass: Commit
git add . && git commit -m "fix: ..."
```

---

## Datenbank-Schema

```sql
CREATE TABLE regression_runs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    run_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    status VARCHAR(20) NOT NULL,          -- pass, fail, error
    total INT NOT NULL DEFAULT 0,
    passed INT NOT NULL DEFAULT 0,
    failed INT NOT NULL DEFAULT 0,
    errors INT NOT NULL DEFAULT 0,
    duration_ms INT,
    results JSONB NOT NULL DEFAULT '[]',  -- Detail-Ergebnisse pro Session
    triggered_by VARCHAR(50) DEFAULT 'manual'
);
```

Ground-Truth Referenzen werden im `ground_truth` JSONB-Feld der
`ocr_pipeline_sessions` Tabelle gespeichert.
