What problem does this solve?
Oura has Symptom Radar; Ultrahuman has the Sleep Screener. PulseLoop has every input and reads none of them together.
Skin temperature, resting HR, HRV, respiratory rate and SpO₂ are all stored, and personal baselines already exist in spirit (RestingHRBaselineService, BaselineStats). CoachAnomalyDetector even has a placeholder comment reserving space for a baseline-aware detector.
Individually these signals are too noisy to alert on — a warm room moves temperature, HRV swings night to night in healthy people. Together they're the earliest warning a consumer ring can give.
Proposed solution
Judge five overnight signals against their own 30-day baselines, counting only the strain direction of each — a resting HR below baseline or an HRV above it is good news, and flagging it would turn that into an alert.
Score each 0/1/2 and require agreement: a single notable signal never counts (that's a duvet), two notable or one strong is minor, three is major. Only major should fire an alert — minor happens after a glass of wine often enough that alerting would train people to dismiss the ones that matter.
Baselines should be the median of per-night figures, not a mean of every sample: one night the ring recorded 4× as often would otherwise dominate, and a single feverish night would drag the very baseline it needs judging against.
Signals without a baseline simply aren't judged, so a ring with fewer sensors still gets a useful answer from the three it has.
Nothing here should ever name a condition, and the copy should name alcohol, heat and yesterday's hard session before anything else. The Today card should be conditional — a clear night renders nothing, so it never becomes an "all clear" tile people learn to ignore.
Depends on
restingHRDrift (#112) — shares the notification-packet baseline plumbing, and this detector should outrank it since drift is one of its own signals.
Area
AI Coach (tools, prompts, on-device LLM)
What problem does this solve?
Oura has Symptom Radar; Ultrahuman has the Sleep Screener. PulseLoop has every input and reads none of them together.
Skin temperature, resting HR, HRV, respiratory rate and SpO₂ are all stored, and personal baselines already exist in spirit (
RestingHRBaselineService,BaselineStats).CoachAnomalyDetectoreven has a placeholder comment reserving space for a baseline-aware detector.Individually these signals are too noisy to alert on — a warm room moves temperature, HRV swings night to night in healthy people. Together they're the earliest warning a consumer ring can give.
Proposed solution
Judge five overnight signals against their own 30-day baselines, counting only the strain direction of each — a resting HR below baseline or an HRV above it is good news, and flagging it would turn that into an alert.
Score each 0/1/2 and require agreement: a single notable signal never counts (that's a duvet), two notable or one strong is minor, three is major. Only major should fire an alert — minor happens after a glass of wine often enough that alerting would train people to dismiss the ones that matter.
Baselines should be the median of per-night figures, not a mean of every sample: one night the ring recorded 4× as often would otherwise dominate, and a single feverish night would drag the very baseline it needs judging against.
Signals without a baseline simply aren't judged, so a ring with fewer sensors still gets a useful answer from the three it has.
Nothing here should ever name a condition, and the copy should name alcohol, heat and yesterday's hard session before anything else. The Today card should be conditional — a clear night renders nothing, so it never becomes an "all clear" tile people learn to ignore.
Depends on
restingHRDrift (#112) — shares the notification-packet baseline plumbing, and this detector should outrank it since drift is one of its own signals.
Area
AI Coach (tools, prompts, on-device LLM)