# Sprint 6E.2 – Korrektheit von Aktenpagination und Navigation

**Basis:** `97b2131e2dd5f607144aa45cf408520af26e21e0`

## Korrekturen

### FTS-Dokumentpagination

FTS-Treffer werden vor `LIMIT` in materialisierten SQL-CTEs auf exakt eine Zeile pro Dokument reduziert. Pro Dokument gewinnt der niedrigste `bm25`-Rang; bei Ranggleichheit wird der kleinste Abschnitt deterministisch gewählt. Cursor verwenden Dokumentrang und stabile Dokument-ID. Globale Suche nutzt denselben deduplizierten Vertrag. Kategorie und Institution verwenden in Sortierung und Keyset-Bedingung konsistent `COLLATE NOCASE`.

Der synthetische Regressionstest umfasst 162 Dokumente, gemischte Groß-/Kleinschreibung sowie Dokumente mit mindestens drei FTS-Abschnitten. Alle 160 passenden Dokumente werden über sämtliche Cursorseiten genau einmal geliefert.

### Labor und Medikation

Laborvergleiche werden chronologisch pro Parameter und Einheit aufgebaut. `previous` ist die unmittelbar vorherige Beobachtung. Die Übersicht dedupliziert auf den neuesten Wert je Parameter und zeigt daraus die drei aktuellsten Parameter. Arztbericht-Zeiträume werden bereits in SQL vor dem Quelllimit angewandt. Trunkierung und Datenvollständigkeit sind Bestandteil von API und UI.

Medikationskategorien werden separat SQL-seitig gefiltert und begrenzt. Geplante Einträge verwenden ihr effektives Plandatum, andere Kategorien ihr Ereignisdatum. `next_planned` besitzt eine eigene, nach `scheduled_next_date` sortierte Abfrage und bleibt daher auch bei mindestens 130 neueren verabreichten Ereignissen vollständig.

### Viewer und Router

Der Viewer konsumiert `next_cursor`, kann weitere Abschnitte anhängen und lädt für einen Treffer außerhalb der ersten Seite gezielt Folgeseiten. Der Zielabschnitt erhält Fokus und wird in den sichtbaren Bereich gescrollt. Sämtliche Datenbanktexte bleiben Textknoten.

Initialisierung und `popstate` schreiben keine History. Benutzeraktionen schreiben gezielt; die Hauptnavigation ersetzt lediglich den bereits vom zentralen Router erzeugten Eintrag. Filter und Dokumentseitencursor werden im History-State wiederhergestellt. Dokumentseiten sind ausdrücklich als Seitennavigation bezeichnet. Jede asynchrone Antwort prüft unmittelbar nach Session, Fetch und JSON-Parsing sowie vor DOM-Änderungen ihre Request-Version.

### Arztbericht

Die ausgewählte Übersicht wird tatsächlich gerendert. Nicht ausgewählte Abschnitte bleiben vollständig aus. Jeder ausgewählte Abschnitt zeigt Datenvollständigkeit und Trunkierung. Die Druckansicht bleibt frei von Navigation und Formularen. Es werden keine Diagnose-, Kausalitäts- oder Therapieaussagen erzeugt.

### Originalroute

Nicht reguläre Dateien werden mit `O_NONBLOCK` und anschließendem `fstat` fail-closed behandelt. Automatisierte Tests decken FIFO, finalen und intermediären Symlink, echten Pfadaustausch unmittelbar vor dem Öffnen, einen Clientabbruch während eines Mehrblockstreams, ungültige Session-Cookies und Cross-Site-Requests ab.

## Abnahme

- fokussierte Python-/Vertragsgates: **43 bestanden**;
- fokussierte Aktenbrowserabnahme: **13 bestanden in 2 Gruppen**;
- vollständige Python-Suite: **213 bestanden**;
- isolierte Browsermatrix: **51 bestanden in 8 Gruppen**;
- ausschließlich synthetische Testdaten;
- kein Deployment und kein Beginn von Sprint 6F.

Maschinenlesbare Evidenz: `docs/test-results/sprint6e2-integration-gate-20260715.json`.
