## BLOCK Vier der fünf früheren Blocker sind behoben. **Die geforderte Mapping-Schema-Parität ist jedoch noch nicht vollständig erfüllt.** ### Verbleibender Release-Blocker - **`nutrition_composite_product_review.status` unterscheidet sich zwischen kanonischem und Upgrade-Schema:** - Kanonisch erzwingt `database/schema.sql:474-478`: `CHECK(status IN ('needs_ingredient_review','reviewed'))` - Der Worker erzeugt die Tabelle bei Upgrades ohne diesen Constraint: `scripts/health/health_dashboard_action_worker.py:466-470` - Synthetischer Vergleich ergab: - Spalten-/Default-Parität: bestanden - `CHECK(status ...)`: **kanonisch vorhanden, Upgrade-Schema nicht** - `PRAGMA integrity_check`: `ok` - Folge: Eine aktualisierte DB akzeptiert beliebige Statuswerte, während eine frisch kanonisch erzeugte DB sie fail-closed ablehnt. Damit fehlen Mapping-Schema-Parität und identische Klassifikationsgrenzen. ### Bestätigt behoben 1. **Legacy `safe`/`problematic` exakt erhalten** - Erweiterter Constraint: `health_dashboard_action_worker.py:457-465` - Additive Migration mit Erhalt von Status, Evidence, Notes und Timestamp: `:497-531` - Synthetischer Probe bestätigte sowohl `safe` als auch `problematic` unverändert und idempotent. 2. **Nullable Histamin-Defaults und Summary-Parität** - Kanonisch nullable: `database/schema.sql:306-319`, `:382-395` - Upgrade-Rebuild und vollständige Zeilenübernahme: `health_dashboard_action_worker.py:345-410` - Synthetischer PRAGMA-Vergleich: beide Summary-Tabellen vollständig parity; vorhandene Scores erhalten. 3. **Ungültige/unbekannte Klassifikationen fail-closed** - Validierung von Score, Canonical Food, Traffic-Light und Confidence: `health_dashboard_action_worker.py:535-548` - Unklassifizierbare Einträge werden als unknown gezählt und erzeugen `histamine_score=NULL`: `:578-608` - Gegenprobe: `tests/test_dashboard_v5_sprint6g_nutrition.py:418-440` 4. **Kollisionssichere Queue-/Item-Identität und Mapping-Erhalt** - Opaque SHA-256-Key: `dashboard_v5/contracts.py:18-21` - Exakter Queue-Key, Alias und Kandidaten-Eindeutigkeit: `health_dashboard_action_worker.py:630-663` - Vorhandene abweichende/ungültige Mappings werden nicht überschrieben: `:696-708` - Kollisions-Gegenprobe: `tests/test_dashboard_v5_sprint6g_nutrition.py:443-498` 5. **Vertrauenswürdige lokale SIGHi-Regel und Provenienz** - Serverseitiger Lookup in `histamine_food_rules`, exakter Score-Abgleich und lokale Provenienzübernahme: `health_dashboard_action_worker.py:668-684` - Gegenprobe für manipulierten Score und Client-Provenienz: `tests/test_dashboard_v5_sprint6g_nutrition.py:501-535` ### Verifikation - `tests/test_dashboard_v5_sprint6g_nutrition.py`: **14 passed** - AST-Prüfung der relevanten Python-Dateien: **OK** - `git diff --check`: **OK** - Ausschließlich synthetische In-Memory-/Temp-DB-Probes; keine Produktionsdaten oder Secrets geöffnet. - **Keine Dateien erstellt oder verändert.**