Repository navigation
Description
NOOP version
12.1.0
Platform
iOS
OS version
Ios 26.4.1
WHOOP strap / Oura ring model
WHOOP 5.0
Where the data is coming from
Live Bluetooth (WHOOP strap connected)
Test Centre profile
Sleep & Rest
What happens
NOOP iOS v12.1.0 fails to detect sleep on October 25, 2026, during the daylight saving time transition in the Netherlands. Sensor data is available, but sleep detection returns NO-NIGHT reason=staged-none. Could this be a DST-related issue?
What you expected instead
NOOP should automatically detect and process my sleep session, including sleep duration, sleep stages, HRV, and recovery score, as it normally does.
The daylight saving time transition should not prevent sleep detection or cause an entire night to be missing. Since the sensor data is available, I would expect NOOP to correctly process it and assign the sleep session to October 25, 2026.
Steps to reproduce
- Use NOOP iOS v12.1.0 with a WHOOP 5.0 connected.
- Wear the WHOOP overnight during the daylight saving time transition on October 25, 2026, in the Netherlands (clocks move backward from 03:00 to 02:00).
- Open NOOP the following morning and allow the device to synchronize.
- Navigate to the Sleep section and check the sleep data for October 25.
- Observe that no sleep session, sleep stages, nightly HRV, or recovery score are displayed.
- Check the sleep diagnostics. Sensor data is present, but the sleep detector reports NO-NIGHT reason=staged-none.
Note: The issue may be related to the daylight saving time transition, but this has not been confirmed. Similar missing-night entries were also observed on earlier dates.
Strap log
NOOP iOS – Sleep Detection Bug (October 25, 2026)
App: NOOP iOS v12.1.0 (438)
Device: WHOOP 5.0 / MG
Timezone: Europe/Amsterdam
Date: 2026-10-25
Issue: Sleep not detected following daylight saving time transition.
Relevant diagnostic log:
sleep-detect day=2026-10-25 NO-NIGHT
hr=70351 rr=45535 resp=0 grav=69851
window=38h reason=staged-none
sleep day=2026-10-25
totalSleepMin=nil stages=nil eff=nil
matched=0 source=computed
hrv day=2026-10-25
window=whole avgHrv=nil
[hrv] hrv nightSummary reported=nil
wholeNight=nil deepOnly=nil
lastSWS=nil nWin=0 nDeep=0
Additional observations:
* Heart rate, RR interval and movement samples are available.
* No valid sleep session is produced for October 25.
* Sleep stages and nightly HRV are missing.
* Similar NO-NIGHT errors appear for October 20 and October 23.
* The issue occurred during the Netherlands daylight saving time transition, but a causal connection is not confirmed.
Expected behavior:
NOOP should detect and process the overnight sleep session correctly, including across daylight saving time transitions.
Privacy note:
This is a manually minimized diagnostic excerpt. Raw sensor streams, exact measurement timestamps and device identifiers have been excluded.
Before you submit
- I attached my exported NOOP .zip (not a screenshot of the Live screen). If my bug is a clearly reproducible UI issue I described exactly how to see it instead.
- I attached or pasted a strap log above — or my bug is a clearly reproducible UI issue that doesn't need one (e.g. a typo, a button that does nothing) and I've described exactly how to see it.
- I checked the Troubleshooting guide — especially "history syncs but no data" (most often the strap isn't banking history to flash; charge it to 100% and reconnect).
- I checked the FAQ and — if I'm on a WHOOP 5.0 / MG — the 5.0/MG status page, or — if I'm on an Oura ring — the Oura ring support table, and this isn't an already-known limit (e.g. SpO₂, recovery/sleep on the 5/MG, or no Recovery / HRV on a ring-only day).
- I've left out anything personal (strap serial, account email, raw export).
Activity
ryanbr commentedon Oct 25, 2026
Thank you for the minimised log, and for saying the DST link was unconfirmed rather than asserting it. Two answers below: what your night is not, and the one line that will say what it is.
DST is not the cause of your missing night
Your own report rules it out before any code does: you also see NO-NIGHT on October 20 and October 23, and neither is a transition day. Anything that only happens when the clocks move cannot explain those.
The code agrees. The local-day window maths is daylight-saving-aware and pinned by a shared cross-platform oracle that includes both a 23-hour and a 25-hour day (America/New_York 2025-03-09 at 82,800 s and 2025-11-02 at 90,000 s), so a 25-hour Sunday produces a 25-hour day window on both platforms.
Your
window=38his also exactly what it should be: the read is 30 hours of lookback plus however far into the day you are, and 30 + 8 puts your log at about 08:00 local. Nothing about it is short.Your question did surface a real DST defect, though, somewhere else
Worth saying plainly because it is yours: asking the question sent me to that maths, and the sleep read window's END is computed with a fixed day length.
IntelligenceEngine.sleepReadWindowEndtakes the day's end asdayStart + 86400. On a 25-hour day that is one hour BEFORE local midnight, and on a 23-hour day it is one hour INTO the next day. The repository already has the correct version of this exact function,LocalDayWindows.sleepReadWindowEnd, which takes the real next local day start and is itself tested against 2025-11-02, the 25-hour day. It has test callers only; all three production call sites use the arithmetic one.So on a transition day a past day's read window is off by an hour at its far end. That is a real bug and it is being handled separately. It is NOT what emptied your night, for three reasons: the branch that uses the fixed length only runs for a day that is already over, your log was taken during October 25 and so took the other branch (
window=38hproves it), and it cannot touch October 20 or 23 at all.What
staged-noneactually saysThat token is specific. It means motion WAS present and the stager still produced nothing, which the code's own comment calls the case most worth investigating. Your counts bear that out: 70,351 heart-rate, 45,535 R-R and 69,851 gravity samples is not a thin night.
Two known mechanisms produce exactly this, and they need different work:
Both are survivable; which one you are in decides what changes.
The one line that tells them apart
You already have the right Test Centre profile on, Sleep and Rest, which is exactly what enables these traces, so this should already be in your log rather than needing a new capture. Please paste just the
sparseBridgelines for one affected day:plus any per-pair lines beside it, which each carry one of
bridged,gapTooLong,hrOutOfBand,overlaporactiveTooLong, and the[sleep] hr-only gateline if one is present.That is counts and tokens only: no timestamps, no sensor values, nothing identifying. Please do NOT attach your export here, and no need to post the raw streams.
What each answer would mean:
runsBefore=0: no sleep run was built at all, so the question moves upstream to stillness classification and the heart-rate baseline, not to the bridge.runsBeforeof several withrunsAfterthe same, and a per-pairgapTooLongorhrOutOfBand: the rescue was attempted and refused, and the refusing rule is named.sparse=false fragmentedToNothing=falsewith several runs: the rescue was never enabled on a night that needed it, which is the Last night sleep not captured. Same results as previous day. Also for effort. #1937 shape one step further out.If you can paste the same lines for October 20 and October 23, that is more useful than three separate reports: identical trace shapes across all three mean one cause rather than three, and that is the difference between one change and an investigation per night.
Sammy-2213 commentedon Oct 25, 2026
feat(analytics): record the hour a flat 24-hour day window misplaces