**NOT APPROVED — 3 Important findings** 1. **Planned/missed/cancelled medication rows can appear as medication administrations** - `scripts/health/health_dashboard_v4.py:641-644` - The Arzttermin “Medikation” cards use unfiltered `medication_admins` and omit `event_type`. A `planned`, `cancelled`, or `missed` row therefore looks like an actual dose. - **Fix:** Build these cards from `administered_medications`, or create a visibly separate planning section that displays the event status explicitly. Add generated-HTML tests containing all positive and negative event types. - The actual symptom-chart overlay and main timeline correctly use the strict `administered`/`verabreicht` allowlist at lines 652 and 680–683. 2. **Nutrition missingness is rendered as numeric zero** - `scripts/health/health_dashboard_v4.py:526-565`, especially `526-534`, `556-558`, and `563-565` - Additional occurrences: `659`, `715` - Nullable kcal, macros, histamine load, amount, and nutrient fields use expressions such as `value or 0`. Missing observations consequently appear as measured `0`, violating missing-as-unknown. - **Fix:** Render nullable values as `unbekannt`/`—`; only display numeric zero when zero was explicitly observed. Histamine labels/load should also remain unknown when classification completeness is insufficient. Add a synthetic dashboard test with explicit zero and SQL `NULL` side by side. 3. **Freshness parsing accepts incomplete ISO datetimes** - `scripts/health/health_dashboard_v4.py:109-120` - The broad `"T" in text` branch delegates to permissive `datetime.fromisoformat()`. Synthetic probes showed both `2026-01-09T12` and `2026-01-09T12:34` classified as `aktuell`. - This is not the required strict, fail-closed handling of complete supported date/datetime formats. - **Fix:** Require a full-match allowlist for exact `YYYY-MM-DD` and complete datetime forms, including a defined timezone policy. Reject reduced-precision timestamps as `unbekannt`. Retain the current future classification as `prüfen`. **Other reviewed properties** - Apple stable canonical data day and import/process timestamp are separately presented at lines 738–745. - Future freshness dates are not clamped to age zero; they render as `prüfen`. - Legacy `compute_nutrition_features()` is not called by the current renderer, and synthetic generation left `nutrition_daily_features` empty. However, dead legacy scoring helpers and `makeBarChart` remain in the file/generated script; removal would reduce regression risk. - Personal-tolerance visible copy is neutral and explicitly says it is not a food-safety classification. - N-of-1 warning is direct, adjacent to the tracker, noncausal, and includes no-therapy/no-challenge guidance plus clinician alignment. - Complete symptom totals preserve gaps and distinguish explicit zero from absent/partial days. **Verification** - Focused tests: **36 passed** - Full suite: **100 passed** - Focused timestamp/static synthetic probes executed - Python compilation and `git diff --check`: passed - No production database/assets were opened. - No files were created or modified by this review.