You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fixed — thanks for the clear screenshots, the "asleep" being larger than "in bed" is exactly what pinned it.
What was happening: you'd corrected the bedtime to 06:15, but the strap's motion was too sparse to re-stage the night, so the stored stages still covered the 01:58→06:15 stretch. The card summed that full span for "asleep" while "in bed" used your corrected 06:15 — so asleep came out larger than time-in-bed, and the score rode on the inflated number.
The stages (the asleep number, the stage bars, the hypnogram) and the score now all clamp to your corrected bedtime, so asleep can never exceed time-in-bed. It applies to the night as soon as you're on a build with the fix — no re-sync needed, it recomputes from what's already stored.
One thing this does NOT change: why the strap detected the start at ~01:58 so you had to edit at all. That's a separate WHOOP 4.0 detection quirk (it can read a long "lying still" stretch as sleep) — I've opened #271 to chase it. Your night's numbers are honest now either way.
I put up a fix for this in #269. The likely cause is a small sleep fragment before your real sleep getting folded into the night and setting the displayed bedtime hours early (1am), while the edit picker correctly anchors on the main block (6am). #269 drops such a minor pre-onset fragment when its sleep is small relative to the main block.
To confirm it matches your night and to tune the threshold precisely, could you share the Sleep tab for that night (the naps card, if one shows) or an export? Mainly how much sleep the ~1am fragment carried versus the 6am block. Thanks.
Activity
sleep: also clamp the DISPLAYED stage minutes to the effective onset (#…
sleep: clamp the Android hypnogram timeline to the effective onset too (
sleep: clamp edited-night stages to the effective onset so asleep can…
ryanbr commentedon Jul 11, 2026
Fixed — thanks for the clear screenshots, the "asleep" being larger than "in bed" is exactly what pinned it.
What was happening: you'd corrected the bedtime to 06:15, but the strap's motion was too sparse to re-stage the night, so the stored stages still covered the 01:58→06:15 stretch. The card summed that full span for "asleep" while "in bed" used your corrected 06:15 — so asleep came out larger than time-in-bed, and the score rode on the inflated number.
The stages (the asleep number, the stage bars, the hypnogram) and the score now all clamp to your corrected bedtime, so asleep can never exceed time-in-bed. It applies to the night as soon as you're on a build with the fix — no re-sync needed, it recomputes from what's already stored.
One thing this does NOT change: why the strap detected the start at ~01:58 so you had to edit at all. That's a separate WHOOP 4.0 detection quirk (it can read a long "lying still" stretch as sleep) — I've opened #271 to chase it. Your night's numbers are honest now either way.
fix(sleep): don't let a minor pre-onset fragment hijack the displayed…
tanarchytan commentedon Jul 11, 2026
I put up a fix for this in #269. The likely cause is a small sleep fragment before your real sleep getting folded into the night and setting the displayed bedtime hours early (1am), while the edit picker correctly anchors on the main block (6am). #269 drops such a minor pre-onset fragment when its sleep is small relative to the main block.
To confirm it matches your night and to tune the threshold precisely, could you share the Sleep tab for that night (the naps card, if one shows) or an export? Mainly how much sleep the ~1am fragment carried versus the 6am block. Thanks.
fix(sleep): headline "Asleep" reflects the whole bridged night, not j…
Fix Sleep tab bedtime skipping a real first-sleep fragment on compute…
docs(sleep): displayed-onset headline spans the bridged night (floor …
feat(android): Kotlin twin of sleep-tab bedtime fix (parity with PR #466
sleep: clamp edited-night stages to the effective onset so asleep can…
fix(sleep): don't let a minor pre-onset fragment hijack the displayed…
fix(sleep): headline "Asleep" reflects the whole bridged night, not j…
Fix Sleep tab bedtime skipping a real first-sleep fragment on compute…
docs(sleep): displayed-onset headline spans the bridged night (floor …
feat(android): Kotlin twin of sleep-tab bedtime fix (parity with PR r…
sleep: clamp edited-night stages to the effective onset so asleep can…
fix(sleep): don't let a minor pre-onset fragment hijack the displayed…
fix(sleep): headline "Asleep" reflects the whole bridged night, not j…
Fix Sleep tab bedtime skipping a real first-sleep fragment on compute…
docs(sleep): displayed-onset headline spans the bridged night (floor …
feat(android): Kotlin twin of sleep-tab bedtime fix (parity with PR r…