## **NICHT APPROVED — 1 verbleibendes Important Finding** ### Important: Deduplizierung verwirft unterschiedliche Beobachtungswerte In `scripts/health/apple_health_analytics.py:215–227` enthält `_row_key()` zwar: - Metrik - Source-Class - kanonische UTC-Start-/Endzeit - kanonische Einheit aber **nicht den kanonisch normalisierten Wert**. Dadurch werden unterschiedliche Messungen mit identischer Zeit, Einheit und Source-Class fälschlich als Duplikate behandelt. Synthetisch reproduziert: - `100 count`, Quelle `Apple Watch Alpha` - `200 count`, Quelle `Apple Watch Beta` - gleiche Start-/Endzeit, beide Source-Class `watch` Ergebnis: ```text value=200 selected_records=1 deduplicated_records=1 ``` Erwartet für zwei unterschiedliche Samples derselben ausgewählten Source-Class: ```text value=300 selected_records=2 deduplicated_records=0 ``` Damit besteht auch eine Testlücke: Der Alias-Test verwendet unterschiedliche Zeitstempel, und der kcal/kJ-Test besteht derzeit selbst dann, wenn die Werte nicht äquivalent wären. Der Dedup-Key muss den **kanonisch normalisierten Wert** berücksichtigen; zusätzlich sollten ein positiver Test für äquivalente kcal/kJ-Werte und ein negativer Test für unterschiedliche Werte bei identischem Zeitstempel existieren. ### Übrige Verifikation - Gruppierte Annual-/Weekly-/Monthly-Dateien mit 1–2 Zeilen: korrekt deterministisch `÷7` beziehungsweise `÷30`; datierte Tagesdatei bleibt direkt. - Source-Class-Präzedenz Watch vor Phone: konservativ; Aliase werden grundsätzlich zusammengeführt. - Energie, Distanz, Körpermasse, Wasser und Dauer: synthetische Integrationswerte und `unit_for()` konsistent. - Dashboard-Fenster: `datetime.now(APPLE_LOCAL_TZ)` mit `Europe/Zurich`. - Coverage-SQL: nur Metadaten-Spalten, Datumsgrenzen inklusive ±1 Tag; `raw_json` wurde nicht gelesen. - `summary()`: ein einziger `_load_rows()`-Aufruf. - Gesamtsuite: **38 passed**. - Ruff auf Analytics-v2-Kern und v2-Tests: **pass**. - Compile/AST: **pass**. - `git diff --check`: **pass**. - Keine Quell- oder Repository-Dateien verändert; nur temporäre synthetische Datenbanken verwendet und automatisch entfernt.