## Ergebnis: **NICHT FREIGEGEBEN** ### Important Findings 1. **Bundle-Vertrag ist nicht strikt genug** - `validate_bundle()` prüft nur unbekannte **Top-Level-Felder**. - Pflichtfelder und exakte Schemas für verschachtelte Objekte fehlen. - Synthetischer Gegencheck bestätigte, dass leere bzw. unbekannte Nested-Strukturen und sogar Pfadtexte akzeptiert werden: - `missing nested schemas ACCEPTED` - `unknown nested field ACCEPTED` - `raw path ACCEPTED` - Damit sind „strict bundle fields“ und „no raw paths/free text“ nicht erfüllt. 2. **Ungefilterte Freitexte gelangen in das Bundle** - Unter anderem Medikamentenname/-dosis, Laborparameter/-wert/-einheit, Lebensmittelname und Korrelationsbezeichner werden direkt aus DB-Zeilen übernommen. - Es fehlen feste Feld-Allow­lists, Längen-/Zeichenbegrenzungen und ein expliziter Schutz gegen Pfade/Dateinamen/sonstige Rohtexte. - Besonders relevant: `nutrition.mapping_review[].name`, Medikamenten- und Eventlabels sowie Laborfelder. 3. **DB-Injektion ist nicht Ende-zu-Ende abgesichert** - Der direkte Generator verwendet die übergebene DB read-only via SQLite `mode=ro`; der synthetische Isolationstest besteht. - Worker- und Pipeline-Regeneration rufen v5 jedoch ohne `--db` auf und fallen damit auf den fest eingebauten kanonischen DB-Pfad zurück. - Die systemd-Units definieren ebenfalls keinen expliziten v5-DB-Pfad. Ein vollständig injizierter synthetischer Worker-/Pipeline-Lauf ist daher nicht gewährleistet. ### Positiv verifiziert - **108 Pytest-Tests bestanden**. - Ruff, Python-Compile, `git diff --check` und `systemd-analyze --user verify` bestanden. - Atomarer Output über temporäre Datei und `os.replace()`; resultierender Modus `0600`. - Nicht-endliche Float-Werte werden abgewiesen; `<` wird für eingebettetes JSON zu `\u003c` escaped. - Exakte Asset-Routen; unbekannte Assetroute wird mit 404 abgewiesen. - Keine Nutzung von Storage, externem Fetch, `eval`, `Function`, `innerHTML` oder Inline-Handlern im v5-eigenen JS gefunden. - Privacy-Modus ist transient und wird nicht gespeichert. - Host-, CSRF-, Einmal-Token- und Queue-Grenzen blieben im geprüften Diff erhalten. - v4 bleibt Standardroute `/health-dashboard`; v5 ist eine optionale Parallelroute. - CSP ist statisch ohne `unsafe-inline`/externe Quellen aufgebaut. - Lokale Asset-Hashes wurden erhoben; verbindliche Hash-/Größenprüfungen im Test bzw. Server fehlen jedoch noch. - Browser-CSP-Lauf konnte nicht ausgeführt werden, da Playwright im Repository nicht installiert ist; Chromium ist vorhanden. ### Änderungen / Nebenwirkungen - **Keine Dateien erstellt oder verändert.** - Keine Produktionsdaten, Runtime, Deployments, Secrets, Commits oder Pushes berührt.