## Ergebnis ### Bestehende V5-Bausteine - **Dokumenten-Arbeitsbereich bereits vorhanden** - `scripts/health/assets/health-assets/dashboard-v5-record.js` - Routing: `route()`, `setRoute()`, `render()` (Z. 98–123, 601–658) - Desktop/Mobile Master-Detail: `renderDocuments()` (Z. 336–393) - Selektoren: `.document-workspace`, `.document-master-item`, `[data-document-detail]` - Mobile Zurück/Fokus: `.document-detail-back` - `dashboard-v5.css` - Desktop-Spalten: Z. 460–469 - Mobile Liste → Detail: Z. 499–507 - Damit ist **keine neue Workspace-Architektur nötig**. - **Kompakter Dokumentstatus ebenfalls vorhanden** - `documentStatusLine()` (Z. 269–279) - `.document-status-line` - Trennt Original, Extraktion, Inhaltsprüfung und Suchbarkeit korrekt. - **Original und ungeprüfte Vorschau** - Original: `/api/v1/documents/{opaque}/original` - Geprüfter Inhalt: `/api/v1/documents/{opaque}` - Ungeprüfte Vorschau: `/extracted-preview` - Sicherheitsgrenzen liegen in: - `dashboard_v5/read_api.py::_record_document_detail()` - `::_record_document_extracted_preview()` - `health_dashboard_server.py` Z. 1467–1501 - Originale haben bewusst `X-Frame-Options: DENY`; ein eingebettetes PDF/iframe-Vergleichsfenster ist daher nicht möglich, ohne die Schutzgrenze zu schwächen. - **Heute-Aufgaben** - Rendering: `dashboard-v5.js::renderToday()` / `dispatchTaskAction()` (Z. 456–531) - Selektor: `#today-tasks`, `[data-task-action]` - Dokument-Handler existiert bereits: `action === "documents"` öffnet `review_status=nicht_geprueft`. - Der aktuelle Provider erzeugt jedoch **keine Dokument-Prüfaufgabe**; ungeprüfte Dokumente landen als Systemarbeit in `data_preparation`: - `dashboard_v5/data_provider.py` Z. 401–420. - **Globale Suche** - UI: `dashboard-v5-global-search.js` - Selektoren: `[data-global-search-open]`, `-dialog`, `-input`, `-results` - API: `read_api.py::_search()`, `_fts_search_documents()`, `_machine_search_documents()`. ### Wesentliche Lücken/Risiken 1. **Ungeprüfte Volltextsuche ist aktuell nicht opt-in.** `_search()` hängt Ergebnisse aus `health_document_machine_fts` standardmäßig an geprüfte Treffer an (Z. 1141–1145). `_machine_search_documents()` hat zudem keinen aktuellen `review_status`-Join. Für Sprint 6I-A muss Standard = **nur geprüft** sein; Maschinenextraktion erst nach expliziter, klar beschrifteter Zustimmung. 2. **Dokumentsuche zeigt Treffer nicht sinnvoll an.** - API liefert `snippet`, aber `resultLabel()` ignoriert Snippet und Prüfstatus. - `openMatches()` in `dashboard-v5-record.js` ist praktisch unverdrahtet. - Die Suche im geöffneten Dokument springt nur zu Abschnitten; sie erzeugt kein ``-Highlight. 3. **Keine Dokument-Review-Schreibgrenze vorhanden.** - Es gibt keinen `/health-actions/document-review`-Vertrag und keinen Workerpfad. - Der bestehende Capture-Upload akzeptiert nur quarantänisierte Bilder für Beobachtungen, keine PDFs/Dokumentimporte. - `#open-capture-hub` darf deshalb nicht irreführend als Dokument-Upload wiederverwendet werden. 4. **Vergleichsansicht kann Original nicht einbetten.** - Wegen `frame-ancestors 'none'`/`X-Frame-Options: DENY`. - Sicherste Minimalvariante: extrahierten Text und Kandidatenmetadaten im Detail zeigen, Original über „Original öffnen“ in separatem Fenster. Ein echter eingebetteter Vergleich benötigt einen neuen, streng begrenzten Raster-/Preview-Endpunkt. 5. **Historische Playwright-Spezifikationen widersprechen sich.** - `dashboard_v5_sprint6f_b.spec.js` erwartet ausdrücklich **keine** Aufgabe „Dokumente prüfen“. - `dashboard_v5_sprint6g_a2.spec.js` erwartet eine Dokument-Aufgabe und veraltete Selektoren wie `.document-entry`/„Prüfstatus“. - Aktueller Vertrag wird besser durch `dashboard_v5_sprint6g_b1.spec.js`, `dashboard_v5_sprint6g_a3.spec.js` und `dashboard_v5_record_original_6e4b.spec.js` abgebildet. ## Kleinster Implementierungspfad 1. **Bestehendes `renderDocuments()` erweitern**, nicht neu bauen: - ausgewähltes Dokument als einzige Detail-/Review-Fläche; - Desktop bestehende zwei Spalten; - Mobile bestehendes Liste → Dokument → Review mit kanonischem Zurück-Zustand. 2. **Dokumentroute erweitern** - z. B. allowlisted `mode=view|review|compare`; - Filter/Sortierung und Auswahl in einer kanonischen Route halten; - Suchtext weiterhin nicht in die URL schreiben. 3. **Suche härten** - `/api/v1/search` standardmäßig nur `_fts_search_documents()`; - expliziter Parameter wie `include_unreviewed=1`, nur nach UI-Checkbox „Ungeprüfte Maschinenextraktion durchsuchen“; - Maschinen-FTS immer mit aktuellem `d.review_status<>'geprueft'` und literal gequoteten Tokens; - geprüfte Ergebnisse zuerst und klar getrennte Gruppe für ungeprüfte Kandidaten. 4. **Highlight verdrahten** - `snippet` und `review_label` in der Trefferliste darstellen; - `openMatches()` an Suchtreffer anbinden; - Treffer im Viewer ausschließlich über Textknoten/`` markieren, niemals `innerHTML`; - ungeprüfte Vorschau nur lokal innerhalb der explizit geöffneten Review-Ansicht durchsuchen. 5. **Review-Aktion als neue private Queue** - eigener `/health-actions/document-review`-Vertrag mit CSRF, opaque ID, exakter aktueller Pending-Prüfung und expliziter Entscheidung; - kein automatischer Übergang zu `geprueft`, keine medizinische Bewertung; - Worker revalidiert Dokumentstatus transaktional. - Bis dieser Vertrag existiert: Kandidatenansicht **read-only**. 6. **Upload getrennt implementieren** - eigener Dokument-Upload/Import-Queue-Vertrag mit PDF/Bild-Allowlist, Quarantäne und generischen Anzeigenamen; - nicht den Beobachtungs-/Foto-Upload umetikettieren. ## Maximal sechs fokussierte Browserfälle 1. **Desktop Dokument-Master-Detail** `.document-master-item` auswählen; genau ein `[data-document-detail]`; kompakte Statuszeile; erlaubte Aktionen. 2. **390px Liste → Dokument → Review → Zurück** URL, Reload, Back/Forward, Fokus-Rückgabe, 44-px-Ziele und kein horizontaler Overflow. 3. **Heute-Deep-Link** `[data-task-action='documents']` öffnet explizit offene Kandidaten; Reload/Back/Forward erhalten Filter und Auswahl; keine Aufgabe für reine OCR-Systemarbeit. 4. **Geprüfte Suche und Highlight** Standardmäßig nur geprüfte Treffer; Snippet → Match → Viewer; `` und Vor/Zurück; XSS bleibt Text. 5. **Opt-in ungeprüfte Suche/Review** Ohne Checkbox kein Pending-Sentinel; mit Checkbox separate Warn-Gruppe; Original/Vorschau erlaubt, keine geprüfte FTS-/Berichtsfreigabe und keine automatische Statusänderung. 6. **Vergleich, Upload und Privacy-Gate** Vergleich öffnet Original sicher separat; Upload akzeptiert nur erlaubte Typen; DOM/URL enthalten keine Pfade, Dateinamen oder numerischen IDs; keine externen Requests/Console-Fehler. ## Auditstatus - Basis geprüft: `main` bei `d666b9a4abb54c5adcb378a22e09e007f09f0d47`, Arbeitsbaum sauber. - Keine Produktionsdaten geöffnet und keine Dateien verändert/erstellt. - Kein Browserlauf gegen eine laufende Instanz; Audit erfolgte read-only anhand der V5-Quellen und synthetischen Playwright-Spezifikationen.