## Audit-Ergebnis v4 → Implementierungsmap v5 - **Geprüft:** v4-Generator, Apple-Analytics, multimodale Korrelationen, kanonisches Schema, HTTP-Server und fokussierte Tests am Commit `5e4ea0b`. - **Verifikation:** `48 passed in 14.04s` für `test_health_dashboard_v4.py` und `test_multimodal_correlations_v1.py`. ### Wiederverwendbare pure/helper-nahe Bausteine - `health_dashboard_v4.py`: - `calendar_axis`, `sparse_calendar_series` - `rolling_median_baseline` - `source_freshness` - `complete_histamine`, `item_histamine_label` - `is_administered_event` - `parse_comparison_value`, `evaluate_lab_warning` - `apple_series` bei explizit übergebenen Rows - `multimodal_correlations.py`: - sichere Loader mit übergebener Connection: `load_symptom_targets`, `load_nutrition_features`, `load_lab_features`, `load_apple_features` - `medication_phase_function`, `compute_results` - BH-Korrektur, Kalenderwochen-Blockpermutation - strikte Persistenzgrenze `_validate_result_for_storage` vor destruktivem Refresh - Diese Funktionen sollten für v5 in DB-unabhängige Query-/ViewModel-Module extrahiert werden. ### Riskante globale Datenpfade `health_dashboard_v4.main()` ist nicht vollständig isolierbar: - `db_counts()` aus `health_pipeline.py` öffnet dessen globales `DB`. - `best_reference_xlsx()` und `parse_reference_xlsx()` lesen globale produktionsnahe XLSX-Kandidaten. - `load_doctor_report_meta()` und PDF-Prüfungen lesen globale `REPORTS`. - `conn()` wird mehrfach neu über globales `DB` geöffnet; abschließend schreibt der Renderer nach `report_runs`. - `resolve_doc_path()` probiert mehrere globale/home-basierte Pfade. - Apple-Aggregation ist dagegen korrekt isoliert, weil v4 Rows explizit als `_rows` übergibt. - Apple-Analytics selbst fällt ohne `_rows` über `_load_rows()` auf sein globales `DB` zurück. **v5-Grenze:** Renderer nur mit injizierter Connection/Repository, expliziten Labor-/Report-Inputs und ohne versteckte Schreiboperation. Report-Run-Logging separat nach erfolgreicher Ausgabe. ### Labor: einzig geeignete validierte Quelle Für analytische v5-Aussagen ausschließlich `laborwerte` verwenden, mit exakt denselben Gates wie `load_lab_features()`: - `lower(trim(validierungsstatus)) = 'validiert'` - `verified_against_original = 1` - `reference_range_source = 'scanned_original'` - nichtleere Einheit - kanonischer Parameter-und-Einheiten-Allowlist-Match - strikt numerischer, nicht zensierter Einzelwert - gültiges `abnahme_datum`, nur ersatzweise gültiges `befund_datum` - Mehrfachwerte desselben Features am selben Tag verwerfen Die aktuell dargestellte XLSX-Matrix (`best_reference_xlsx`) ist ausdrücklich nur Arbeitsübersicht und darf nicht als validierte Laborquelle in v5 weitergeführt werden. ### Medikation und nächster Termin Schemafelder: `datum`, `medication_name`, `dose`, `route`, `event_type`, `scheduled_next_date`, `notes`, `source`, `created_at`. Beobachtete Statussemantik: - tatsächliche Gabe: exakt `administered` oder `verabreicht` - bekannte Nicht-Gaben: `scheduled`/`planned`, `missed`, `cancelled` - Phasenunterbrechungen: `stopped`, `paused`, `restart`, `dose_change` sowie deutsche Varianten - mehrdeutige Werte wie `injection` starten keine Phase **Konkreter v4-Fehler:** `health_dashboard_v4.py:768` nimmt den ersten nach `datum DESC` geladenen Datensatz mit beliebigem `scheduled_next_date`. Das kann ein vergangenes Datum oder einen geplanten/verpassten/stornierten Datensatz auswählen. **Korrekte v5-Logik:** nur kanonisch parsebare `scheduled_next_date >= today`, fachlich zulässige Quellereignisse festlegen, anschließend Minimum nach geplantem Datum wählen; ungültige/vergangene Werte ignorieren. Diese Auswahl als pure Funktion testen. ### Ernährung und Mapping Relevante Tabellen: - Rohitems: `nutrition_items` - Item-Nährstoffe: `nutrition_item_nutrients` - Histaminbewertung: `nutrition_histamine_scores` - Tages-/Mahlzeitaggregate: `nutrition_daily_summary_v2`, `nutrition_meal_summary` - Regelwerk/Aliase: `histamine_food_rules`, `histamine_food_aliases` - Mapping-Review: `nutrition_review_queue` - persönliche Beobachtung: `personal_food_tolerance` - Legacy/riskant: `nutrition_daily_features`, `nutrition_food_insights`, `nutrition_action_recommendations`, `nutrition_treatment_phase_summary` v4 regeneriert die Legacy-Keyword-Heuristik bewusst nicht. Für v5 fehlen Makro-/Nährstoff-Unit-Gates; die Korrelationsengine erlaubt derzeit deshalb ausschließlich den vollständig klassifizierten `nutrition:histamine_score`. Unknown Items bleiben fehlend, nicht null bzw. grün. ### Korrelationsvertrag Persistierte Ergebnisfelder: `predictor`, `target`, `lag_days`, `medication_phase`, `n`, `eligible_target_days`, `expected_target_days`, `target_coverage`, `missing_pairs`, `rho`, `p_value`, `q_value`, `status`, `method`, `quality_flags`, `interpretation`, `computed_at`. Dashboard v4 zeigt nicht alle Felder: insbesondere `p_value`, `missing_pairs`, `method`, `quality_flags` und `computed_at` fehlen. v5 kann diese als Methodik-/Qualitätsdetails übernehmen, ohne Rohwerte oder Datumslisten zu persistieren. ### Server-, Route- und CSP-Grenzen Aktuell erlaubte Routen/Assets: - `/` → Redirect - `/health-dashboard` - `/health-assets/chart.umd.min.js` — einziges statisches Asset - `/health-doc/` - `/health-report/` - POST `/health-actions/symptom-checkin` CSP: - `default-src 'none'` - `script-src 'self' 'nonce-…'` - `style-src 'self' 'nonce-…'` - `img-src 'self' data:` - `font-src 'self'` - `connect-src 'none'` - `object-src 'none'` - `base-uri 'none'` - `frame-ancestors 'none'` - `form-action 'self'` v5 muss neue JS/CSS/Bild-/Font-Assets sowohl im exakten Server-Routen-Allowlist als auch minimal in der CSP ergänzen; keine generische Verzeichnisfreigabe. Der Server schreibt keine DB, sondern legt validierte Aktionen atomar mit Modus `0600` in eine Inbox. ### Konkrete Test-Seams für v5 - Renderer erhält ausschließlich temporäre DB/Repository-Objekte; globale DB-Pfade auf „darf nicht geöffnet werden“ setzen. - Sicherstellen, dass Rendering weder Quelldaten noch Aggregate verändert. - Nächste Medikation: Vergangenheit, Heute, Zukunft, ungültiges Datum, mehrere Medikamente sowie planned/missed/cancelled/administered. - Labor: jeder Provenienz-Gate einzeln negativ, freie Parameter-/Einheitentexte, zensierte Werte und Tagesduplikate. - Ernährung: explizite Null gegen Missing/Unknown; ungemappte Items; unvalidierte Nährstoffeinheiten. - Korrelation: Persistenz-Allowlist, Invarianten und „invalid batch leaves prior rows intact“. - HTML-End-to-End: echte Kalenderlücken als JSON `null`; alle Datasets gleich lang. - Server: jede neue v5-Assetroute positiv, Traversal/Symlink/Prefix-Sibling negativ; CSP exakt ohne `unsafe-inline`; Host-/Methoden-/CSRF-Gates. - Schema-Migration vom exakten v4-Stand, zweimal idempotent, danach erster echter synthetischer Write. ### Workspace - **Keine Dateien erstellt oder verändert.** - Während des Audits erschienen parallel unversionierte v5-Artefakte: - `scripts/health/assets/health-assets/dashboard-v5.js` - `scripts/health/dashboard_v5/` - Diese wurden gemäß Read-only-Auftrag nicht geöffnet oder verändert.