# Sprint 6G-A.2 – Laborquellenabgleich und Dokumentprovenienz

**Basis:** `05c5e51a488cc9c621516fec140325daaa65670b`
**Auditdatum:** 2026-07-17
**Datenklasse dieses Dokuments:** ausschließlich aggregierte Zähler, Vertragsnamen und SHA-256-Digests

## Ergebnis

V4 und V5 besitzen keine vollständige Laborparität. V4 liest eine Excel-Arbeitsmatrix. V5 veröffentlicht nur Beobachtungen, welche gleichzeitig die kanonischen Validierungs-, Original-, Referenzquellen-, Einheiten-, Eindeutigkeits- und Katalogverträge erfüllen. Die Differenz bleibt bewusst sichtbar und wird nicht durch einen automatischen Import verdeckt.

## Reproduzierbarer read-only Audit

Werkzeug: `scripts/health/lab_source_reconciliation.py`

Standardverhalten:

- SQLite wird im URI-Modus `mode=ro` geöffnet und zusätzlich auf `query_only` gesetzt.
- V4 wird über `best_reference_xlsx()`, `parse_reference_xlsx()` und `get_lab_matrix()` gelesen.
- Dezimalkomma, Parameter, Datum, Einheit und numerischer Wert werden ausschließlich für den Vergleich normalisiert.
- Detailbericht, Stagingplan und Backups werden unter einem festen privaten Root atomar mit Modus `0600` gespeichert; Symlinks und Repository-Ziele schlagen fehl.
- Versionierte Ausgabe enthält keine Werte, Parameternamen, Dokumentnamen, Originaldateinamen oder lokalen Pfade.
- Fehlende oder mehrdeutige Verknüpfungen bleiben unbekannt beziehungsweise manuell zu prüfen.

## Aggregierter Real-Data-Abgleich

| Vertrag | Anzahl |
| --- | ---: |
| V4-/Excel-Arbeitswerte | 247 |
| Zeilen in `laborwerte` | 480 |
| Zeilen in `laborwerte_staging` | 0 |
| freigegebene kanonische V5-Beobachtungen | 19 |
| exakte Excel-Treffer in der Rohdatenbank | 219 |
| ausschließlich in Excel, ohne Rohdatenbankfall | 0 |
| exakte Excel-Treffer in der kanonischen V5-Selektion | 19 |
| Excel-Arbeitswerte nicht in der kanonischen V5-Selektion | 228 |
| validiert, aber nicht katalogisiert | 91 |
| katalogisiert, aber ohne verifizierte Daten | 1 |
| Wertkonflikte | 28 |
| Einheitenkonflikte | 1 |
| Staging-only-Fälle | 0 |

Die Zahl `228` ist die fachlich relevante V4/V5-Differenz. Beide Quellen werden dafür zuerst über dieselbe Labor-Allowlist in denselben kanonischen Parameter-/Einheitenraum abgebildet. Diese Arbeitswerte dürfen nicht automatisch als bestätigte V5-Beobachtungen erscheinen. `workbook_only=0` bedeutet lediglich, dass jeder Excel-Fall einen Rohdatenbankfall mit gleichem normalisiertem Parameter und Tag besitzt; es bedeutet keine kanonische Freigabe und keine Wertparität.

## Dokumentabdeckung

| Vertrag | Anzahl |
| --- | ---: |
| registrierte Dokumente | 70 |
| geprüftes Original technisch verfügbar | 3 |
| Text extrahiert | 67 |
| Inhalt geprüft | 4 |
| bestätigt volltextdurchsuchbar | 4 |
| Laborzeilen mit bestehender Dokumentrelation | 120 |
| davon mit geprüftem Dokument | 6 |
| davon mit ungeprüftem Dokument | 114 |
| Laborzeilen ohne Dokumentrelation | 360 |
| mehrdeutige bestehende Relationen | 0 |
| sichere exakte Backfill-Kandidaten | 0 |
| manuell zu prüfende Verknüpfungsfälle | 360 |

Es wurde keine Linkmigration ausgeführt, weil der Audit keine sichere exakte Backfillrelation fand. Insbesondere wurden keine Zuordnungen anhand von Dateiname, Tag, Institution, Kategorie, OCR-Text oder Ähnlichkeit erzeugt.

## Digests

- V4-/Workbook-Normalform: `f6afbddd59139e1e73657cb54ce54dd72bc299fd122ae5d5c45ecff294ea147f`
- `laborwerte`-Normalform: `03bab8670b28d006610116c243dd12773abed4462d95bcae58e8e10826daf22d`
- `laborwerte_staging`-Normalform: `4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945`
- kanonische V5-Selektion: `5704c56a44bf48c590eb619365d4587937a030559b25429c88b04cf0e55f1089`

## Import- und Linkplan

Der private Importplan enthält `204` eindeutige, numerisch und zeitlich vollständige Reviewkandidaten aus den insgesamt `228` Excel-/V4-Differenzen zur kanonischen V5-Selektion. Die übrigen `24` Differenzen bleiben mit einem expliziten Ausschlussgrund (`incomplete_date_or_numeric_value` oder `duplicate_normalized_candidate`) im privaten Plan nachverfolgbar; es wird keine Differenz stillschweigend verworfen. Der Plan ist idempotent über eine aus der normalisierten Kandidatenidentität abgeleitete Kennung. Ein Kandidat würde ausschließlich erhalten:

- Status `zur_pruefung`;
- Provenienz `legacy_reference_xlsx`;
- `verified_against_original=0`;
- keine Referenzquelle `scanned_original`.

Der Plan ist in diesem Sprint read-only. Gegen die produktive Datenbank wurde kein Stagingimport ausgeführt.

Ein exakter Link-Backfill ist nur für eine bereits vorhandene eindeutige `dokument_id` oder einen eindeutigen unveränderlichen Hash zulässig. Der Migrationspfad prüft zuerst eine private Datenbankkopie und führt danach Updates, Zeilenzahl-, Idempotenz-, Integritäts-, Fremdschlüssel- und Schutzfelddigests in einer expliziten Transaktion aus. Bei jedem fehlgeschlagenen Nachvertrag erfolgt ein Rollback vor Commit. Ein separat wiederhergestelltes Backup wird gegen den Vorzustand geprüft. Mangels sicherer Kandidaten wurde er produktiv nicht aktiviert.

## Unveränderte medizinische Zustände

Der Sprint ändert weder automatisch noch manuell:

- `review_status`;
- `validierungsstatus`;
- `verified_against_original`;
- `reference_range_source`;
- Laborwerte oder Referenzbereiche.

Dokumentprüfung beeinflusst die Sichtbarkeit einer Quellenaktion und die bestätigte Volltextsuche, aber nicht die Zahl der kanonischen Laborpunkte.
