chore(release): v1.28.23 — sleep disagreement on the dashboard; Apple Health medication groundwork

The sleep source-discrepancy annotation now reaches the surfaces: SleepNight
carries the MAIN session's annotation (naps never cross-compare), the analytics
slim slice / dashboard snapshot / iOS summary thread it additively, and the
dashboard sleep tile renders the shared discreet marker (extracted from the
sleep panel — one implementation, two surfaces). Served totals unchanged,
pinned by tests.

Apple Health medications groundwork (server side of the medication-import
request): IntakeSource gains APPLE_HEALTH; medications accept an external
mirror identity (source-exclusive by policy) and dose imports carry the HK
dose-event UUID — both idempotent per stable key, with the concurrent-create
race resolved to the winner. Migration 0239, additive only. Entries without
the new fields behave byte-identically.

Hardening: doctor-report aggregation + PDF charts compute ranges with loops
instead of spread calls — a report over a sample-dense year cannot overflow
the call stack (the class fixed for the Google Health full sync).
This commit is contained in:
Marc-André Bombeck committed 2026-07-11 00:18:23 +02:00
1 parent 755da41019
commit c400e2aa88
29 files changed
+1585 -276

No files matched your search

+12
View File
@@ -34,6 +34,7 @@
* shape loses it.
*/
import type { DataSummary } from "@/lib/analytics/trends";
import type { SleepSourceDiscrepancy } from "@/lib/analytics/sleep-night";
import type { CorrelationResult } from "@/lib/insights/correlations";
/** Shape consumed by every `/insights/<metric>/page.tsx`. */
@@ -107,6 +108,17 @@ export interface DashboardAnalyticsData {
string,
{ lastSeenAt: string; daysAgo: number } | null
>;
/**
* v1.28.x — source-discrepancy annotation for the latest night behind
* `summaries.SLEEP_DURATION.latest` (carried by both the slim
* `?slice=summaries` branch and the thick slice; the dashboard snapshot
* mirrors it under `tiles.sleepSourceDiscrepancy`). Non-null when two
* writer buckets reported clearly different asleep totals for that
* night's main session; the sleep tile marks the headline with a
* discreet "sources disagree" hint. Additive — absent/null keeps the
* tile rendering exactly as before.
*/
sleepSourceDiscrepancy?: SleepSourceDiscrepancy | null;
}
/**