mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 12:32:43 +00:00
The tag × metric crosstab summed cumulative metrics (steps, active energy, sleep duration) per day across every source with no canonical pick, so once two sources reported the same day — Fitbit + Apple steps, Fitbit + WHOOP sleep — the per-day total double-counted and inflated the with/without averages and the Welch delta the surface ranks on. Run the metric rows through the same per-day source-priority + device-type picker the analytics steps/sleep path uses before bucketing, keyed by the metric's priority ladder and the user's Berlin calendar day. Same-source per-stage rows still sum into the night total; only cross-source twins collapse. Thread the user's source-priority blob through the read so the pick honours the configured ladder. The cross-metric read was a flat `take: 5000` over the 365-day window ordered `measuredAt desc`, unioned across per-stage sleep + per-sample pulse/HRV; a multi-source, high-frequency user blew past it and silently dropped the oldest months, biasing the crosstab and the long-window correlations toward recent data. Lift the cap to cover the realistic worst case for the window and annotate a wide event when the cap is hit so a truncated read is observable rather than silently wrong. The read stays raw rather than moving to the DAY rollup tier because that tier buckets on UTC midnight while these aggregates key on the user's Berlin day, which would skew the day pairing at the boundary. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> (cherry picked from commit aa72ffba6e3bcac9f97be4adc26d689d4f352e98)