Repository navigation
Description
NOOP version
4.0
Platform
iOS
OS version
IOS 26.6
WHOOP strap model
WHOOP 4.0
Where the data is coming from
Live Bluetooth (strap connected)
Test Centre profile
Not a test-mode bug
What happens
I conncet the whoop 4.0 bout a week ago to noop. I also have a 5.0 that I have on my other wrist which is connected to the whoop software. I keep both softwares open at the same time and have started a workout on both noop and whoop to compare. It was an intense workout, but on the noop my max heart rate was around 115. During this exercise I beat a record of mine, so I was sure I was in zone 4, which was shown on WHOOP. Furthermore, the noop hasn't been syncing regularly . I imported all my previous whoop data and cannot see my vo2 max or step count still. Also, it doesn't register any workouts.
one thing to note is that the 4.0 strap was used one year ago for an entire yr (2 years old), doesn't seem like it should be an issue
noop-master-iOS-v10.5.0-260830-1034.zip
What you expected instead
I expect it to match the heart rate that my whoop 5.0 gets, or atleast be similar
Steps to reproduce
- Update accordingly
- Produce more accurate results
Strap log
[10:29:48] Strap newest banked record: 2026-08-30 14:29:47 (from data range)
[connection] clockDrift newest=2026-08-30 14:29:47 wall=2026-08-30 14:29:48 newestVsWall=-1s clockOk
[10:29:48] Get Data Range raw frame (#451 — for offset analysis): aa4c00a724282271010100a20100d1a10100daa10100d1a10100190000000000020009000000a6ff1300ac7bd368e8580000a73b946a20510000a73b946a205100005b3e946ab87900000000093289e5
[10:29:48] Strap backlog pages behind: 9 (#689 — GET_DATA_RANGE ring backlog, diagnostic only)
[10:29:48] Strap newest banked record: 2026-08-30 14:29:47 (from data range)
[connection] clockDrift newest=2026-08-30 14:29:47 wall=2026-08-30 14:29:48 newestVsWall=-1s clockOk
[10:29:48] Get Data Range raw frame (#451 — for offset analysis): aa4c00a724292271010100a20100d1a10100daa10100d1a10100190000000000020009000000a6ff1300ac7bd368e8580000a73b946a20510000a73b946a205100005b3e946ab87900000000e1ecb03f
[10:29:48] Strap backlog pages behind: 9 (#689 — GET_DATA_RANGE ring backlog, diagnostic only)
[10:29:48] Strap newest banked record: 2026-08-30 14:29:47 (from data range)
[connection] clockDrift newest=2026-08-30 14:29:47 wall=2026-08-30 14:29:48 newestVsWall=-1s clockOk
[10:29:48] Notify active 61080003-8D6D-82B8-614A-1C8CB0F8DCC6
[10:29:48] Notify active 61080004-8D6D-82B8-614A-1C8CB0F8DCC6
[10:29:49] → Send Historical Data payload=00
[10:29:49] Backfill: session started — historical offload requested
[10:29:49] Notify active 61080005-8D6D-82B8-614A-1C8CB0F8DCC6
[10:29:49] Notify active 2A37
[10:29:49] Notify active Battery Level
Command response: SEND_HISTORICAL_DATA(22) → PENDING(2)
raw frame (#900 — [seq][result] provenance): aa0c00fc242a1672020b000054a01283
[connection] offload progress trim=106962 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:29:50] → Historical Data Result payload=01d2a1010019000000
[connection] offload progress trim=106963 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:29:50] → Historical Data Result payload=01d3a1010019000000
[connection] offload progress trim=106964 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:29:52] → Historical Data Result payload=01d4a1010019000000
[connection] offload progress trim=106965 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:29:52] → Historical Data Result payload=01d5a1010019000000
[connection] offload progress trim=106966 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:29:53] → Historical Data Result payload=01d6a1010019000000
[10:29:53] Backfill: session ended — reason=HISTORY_COMPLETE
[connection] offload result=empty (console only, no sensor records)
[10:29:53] Watchdog: behind + frontier frozen — recovery (exit high-freq + SET_CLOCK)
[10:29:53] → Exit High-Freq Sync payload=00
[10:29:53] → Set Clock payload=613e946a00000000
[10:29:53] → Set Clock payload=613e946a0000000000
[connection] frameTiming type=EVENT t=1788100193s
[10:29:53] Backfill: strap skipped (rate-limited; last 4s ago)
Backfill: refreshing dashboard cache from completed sync
re-score: trigger=post-offload newData=no — skipped (nothing changed since last run)
[10:30:41] Disconnected — The connection has timed out unexpectedly.
[connection] connect down (uptime ends after 54.5s)
[connection] reconnect n=8 reason=connectionTimeout
[10:30:41] Reconnecting in 3s (attempt 1)
[10:30:44] Connecting to selected strap <device> — targeted
[10:30:45] Connected — discovering services
[connection] connect up gen=8 latencyMs=920 uptimeStart=1788100245
[10:30:45] Services discovered: 61080001-8D6D-82B8-614A-1C8CB0F8DCC6, 180D, 180F, 180A
[10:30:45] Bonding: confirmed write GET_BATTERY_LEVEL to 61080002
[10:30:45] Notify requested 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[10:30:45] Notify requested 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[10:30:45] Notify requested 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[10:30:45] Notify requested 2A37 (discovery)
[10:30:45] Notify requested Battery Level (discovery)
[connection] bondState encryptedBond family=whoop4 (confirmed write acked)
[10:30:46] BONDED (confirmed write acknowledged) — custom channels should now flow
[10:30:46] → Get Hello (Harvard) payload=00
[10:30:46] → Get Advertising Name (Harvard) payload=00
[10:30:46] → Report Version Info payload=00
[10:30:46] → Set Clock payload=963e946a00000000
[10:30:46] → Set Clock payload=963e946a0000000000
[10:30:46] → R10/R11 Realtime (raw stream) payload=00
[10:30:46] → Get Data Range payload=00
[10:30:46] Notify requested 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 (post-bond)
[10:30:46] Notify requested 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 (post-bond)
[10:30:46] Notify requested 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 (post-bond)
[10:30:46] Notify requested 2A37 (post-bond)
[10:30:46] Notify requested Battery Level (post-bond)
[10:30:46] Notify active 61080003-8D6D-82B8-614A-1C8CB0F8DCC6
[10:30:46] Connect settled: handshake done + cmd-notify confirmed — alarm re-arm (if due) can fire now
[10:30:46] Notify active 61080004-8D6D-82B8-614A-1C8CB0F8DCC6
[10:30:46] Notify active 61080005-8D6D-82B8-614A-1C8CB0F8DCC6
[10:30:46] Notify active 2A37
[10:30:46] Notify active Battery Level
[10:30:46] Notify active 61080003-8D6D-82B8-614A-1C8CB0F8DCC6
[connection] frameTiming type=COMMAND_RESPONSE t=1788100246s
[10:30:46] Get Data Range raw frame (#451 — for offset analysis): aa4c00a7243e2282010100a20100d6a10100dca10100d6a10100190000000000020006000000c4ff1300ac7bd368e8580000d13d946aa0610000d13d946aa06100006c3e946af84100000000db927eaf
[10:30:46] Strap backlog pages behind: 6 (#689 — GET_DATA_RANGE ring backlog, diagnostic only)
[10:30:46] Strap newest banked record: 2026-08-30 14:30:04 (from data range)
[connection] clockDrift newest=2026-08-30 14:30:04 wall=2026-08-30 14:30:46 newestVsWall=-42s clockOk
[10:30:46] Get Data Range raw frame (#451 — for offset analysis): aa4c00a7243f2282010100a20100d6a10100dca10100d6a10100190000000000020006000000c4ff1300ac7bd368e8580000d13d946aa0610000d13d946aa06100006c3e946af84100000000334c4775
[10:30:46] Strap backlog pages behind: 6 (#689 — GET_DATA_RANGE ring backlog, diagnostic only)
[10:30:46] Strap newest banked record: 2026-08-30 14:30:04 (from data range)
[connection] clockDrift newest=2026-08-30 14:30:04 wall=2026-08-30 14:30:46 newestVsWall=-42s clockOk
[10:30:46] Notify active 61080004-8D6D-82B8-614A-1C8CB0F8DCC6
[10:30:46] Notify active 61080005-8D6D-82B8-614A-1C8CB0F8DCC6
[10:30:47] Notify active 2A37
[10:30:47] Notify active Battery Level
[10:30:47] Backfill: connect skipped (rate-limited; last 58s ago)
[10:31:16] → Get Battery Level payload=
[connection] frameTiming type=EVENT t=1788100290s
[10:31:30] Backfill: strap skipped (rate-limited; last 101s ago)
[10:32:16] → Get Battery Level payload=
[10:33:02] → Disable Alarm payload=01
[10:33:02] Alarm: disarmed
[10:33:02] → Send Historical Data payload=00
[10:33:02] Backfill: session started — historical offload requested
[connection] frameTiming type=COMMAND_RESPONSE t=1788100382s
Command response: SEND_HISTORICAL_DATA(22) → PENDING(2)
raw frame (#900 — [seq][result] provenance): aa0c00fc24411686020b0000d64e17b7
[connection] offload progress trim=106967 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:33:03] → Historical Data Result payload=01d7a1010019000000
[connection] offload progress trim=106970 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:33:04] → Historical Data Result payload=01daa1010019000000
[10:33:04] Backfill: 33 frame(s) this chunk carried no sensor records (strap console/diagnostic output) — normal, nothing to persist (trim=106971).
[connection] offload progress trim=106971 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:33:04] → Historical Data Result payload=01dba1010019000000
[connection] offload progress trim=106972 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:33:05] → Historical Data Result payload=01dca1010019000000
[connection] offload progress trim=106973 chunkRows=0 sessionRows=0 sessionMotion=0 nights=0
[10:33:07] → Historical Data Result payload=01dda1010019000000
[10:33:07] Backfill: session ended — reason=HISTORY_COMPLETE
[connection] offload result=empty (console only, no sensor records)
[10:33:07] Watchdog: behind + frontier frozen — recovery (exit high-freq + SET_CLOCK)
[10:33:07] → Exit High-Freq Sync payload=00
[10:33:07] → Set Clock payload=233f946a00000000
[10:33:07] → Set Clock payload=233f946a0000000000
[connection] frameTiming type=EVENT t=1788100387s
[10:33:07] Backfill: strap skipped (rate-limited; last 5s ago)
[10:33:07] Extended-battery probe (#592):
#592 EXTENDED-BATTERY PROBE — WHOOP 4.0
Verdict: opcode 98 ACCEPTED — 9-byte payload
Raw frame (20 B):
aa100057303f6200233f946a883d00005cf88579
Payload (9 B, CRC excluded):
@00 00 23 3f 94 6a 88 3d 00
@08 00
Voltage: 0.00 V (mV=0 @07) — the field NOOP already reads
Δ vs previous capture: @01:37→23 @02:39→3f @05:18→88 @06:1e→3d
(a byte tracking battery % = SoC/capacity; drifting with wear = temperature; only ever climbing = cycle count)
[connection] frameTiming type=COMMAND_RESPONSE t=1788100388s
[connection] frameTiming type=EVENT t=1788100388s
[10:33:08] Backfill: strap skipped (rate-limited; last 5s ago)
Backfill: refreshing dashboard cache from completed sync
re-score: trigger=post-offload newData=no — skipped (nothing changed since last run)
[10:33:16] → Get Battery Level payload=
[universal] strapClock newest=2026-08-30 14:30:04 wall=2026-08-30 14:34:05 newestVsWall=-241s firmware=unknown clockOk
----------------------------------------
Capture check
[OK] connection: 44 trace lines (clockDrift / bondState)
[OK] universal: 41 trace lines (dayOwner / strapClock )
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, and this isn't an already-known limit (e.g. SpO₂, or recovery/sleep on the 5/MG).
- I've left out anything personal (strap serial, account email, raw export).
Activity
ryanbr commentedon Aug 31, 2026
Thanks — the export plus a full strap log is what made this readable, and it turned up something worth changing in NOOP regardless of your strap.
What your log shows
Your 4.0 is connecting and bonding fine, and the offloads complete. They just hand over console output and no sensor records:
I decoded the ring pointers out of your two
GET_DATA_RANGEframes, 58 seconds apart:So the flash is working, the write pointer is advancing, and NOOP is reading everything the strap offers. The pages simply contain no sensor data. Your last actual record is
14:30:04, and the growing-241slater in the log is just wall time moving on without new records.Your clock is fine, which matters:
newestVsWall=-1s clockOkwhile records were still being written. If NOOP showed you the "charge it to 100%, its clock has lost sync" message, that message is wrong for your case — I have raised #1754 to fix it. It is written for a different failure (trim=0xFFFFFFFF, no flash cursor) and your log is not that.What that means for the rest
Almost everything else follows from the strap not recording:
reconnect n=8 reason=connectionTimeoutwith links lasting about 54 seconds. Most of an intense session is simply missing.Steps is a separate, known gap and not caused by any of the above: #1149 tracks WHOOP 4.0 steps and calories reading zero. Importing history will not populate it.
One thing about the comparison itself: a 4.0 on one wrist against a 5.0 on the other are two different sensors on two different limbs, and one of them is currently not recording — so the 115-vs-zone-4 difference cannot be read as NOOP versus WHOOP.
What would help
Get Battery Levelthree times but the excerpt is cut before the answers.If the write pointer still advances with zero sensor rows at 100% charge, that points at the strap's sensor rather than its charge, and that is a useful result in itself.
ccchaney04 commentedon Aug 31, 2026
Ok thanks, I will charge the 4.0 to 100%, confirm it's not connected to WHOOP, and update to 10.6.0.
Thanks for your help, I will give you an update and hope you do the same if anything new comes.
Thanks again
ccchaney04 commentedon Sep 11, 2026
I tried the suggestions and still doesn't work.
here is new log:
noop-connection-iOS-v11.5.0-260910-2258.zip
===== previous app session, 199 line(s), rolled at 2026-09-11T02:52:08Z (this launch) =====
[22:48:18] Central state: 5 (5 = poweredOn)
[22:48:18] Scanning for WHOOP 4.0…
[22:48:18] send(Disable Alarm) ignored — not connected
[22:48:18] Alarm: disarm NOT sent — not connected; will retry on connect (strap may still be armed)
Read spine re-pointed to active device after registry change (#814).
[adv] flags=none connectable=true svc=61080001-8d6d-82b8-614a-1c8cb0f8dcc6 svcData=none mfg=none tx=none nameLen=15
[22:48:18] Discovered WHOOP (rssi -87) — connecting
re-score: trigger=forced newData=yes
[22:48:19] Attributing this link to my-whoop — the strap that connected, not the active device (#1881)
[22:48:19] Connected — discovering services
[connection] connect up gen=1 latencyMs=1674 uptimeStart=1789094899
[22:48:20] Services discovered: 61080001-8D6D-82B8-614A-1C8CB0F8DCC6, 180D, 180F, 180A
[22:48:20] Bonding: confirmed write GET_BATTERY_LEVEL to 61080002
[22:48:20] Notify requested 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:48:20] Notify requested 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:48:20] Notify requested 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:48:20] Notify requested 2A37 (discovery)
[22:48:20] Notify requested Battery Level (discovery)
[connection] GATT tree: 4 service(s)
[connection] service 61080001-8D6D-82B8-614A-1C8CB0F8DCC6 (4 char)
[connection] 61080002-8D6D-82B8-614A-1C8CB0F8DCC6 props=0xc (WriteNoResponse+Write)
[connection] 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 props=0x10 (Notify)
[connection] 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 props=0x10 (Notify)
[connection] 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 props=0x10 (Notify)
[connection] service 180D (1 char)
[connection] 2A37 props=0x10 (Notify)
[connection] service 180F (1 char)
[connection] 2A19 props=0x12 (Read+Notify)
[connection] service 180A (1 char)
[connection] 2A29 props=0x2 (Read)
[connection] bondState encryptedBond family=whoop4 (confirmed write acked)
[22:48:20] BONDED (confirmed write acknowledged) — custom channels should now flow
[22:48:20] → Get Hello (Harvard) payload=00
[22:48:20] → Get Advertising Name (Harvard) payload=00
[22:48:20] → Report Version Info payload=00
[22:48:20] → Set Clock payload=f46ba36a00000000
[22:48:20] → Set Clock payload=f46ba36a0000000000
[22:48:20] → Get Clock payload=
[22:48:20] → Get Clock payload=00
[22:48:20] → R10/R11 Realtime (raw stream) payload=00
[22:48:20] → Get Data Range payload=00
[22:48:20] Notify requested 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 (post-bond)
[22:48:20] Notify requested 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 (post-bond)
[22:48:20] Notify requested 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 (post-bond)
[22:48:20] Notify requested 2A37 (post-bond)
[22:48:20] Notify requested Battery Level (post-bond)
[22:48:20] Notify active 61080003-8D6D-82B8-614A-1C8CB0F8DCC6
[22:48:20] → Disable Alarm payload=01
[22:48:20] Alarm: disarmed
[22:48:20] Connect settled: handshake done + cmd-notify confirmed — alarm re-arm (if due) can fire now
[22:48:20] Notify active 61080004-8D6D-82B8-614A-1C8CB0F8DCC6
[22:48:21] Notify active 61080005-8D6D-82B8-614A-1C8CB0F8DCC6
[22:48:21] Notify active 2A37
[22:48:21] Notify active Battery Level
[22:48:21] Notify active 61080003-8D6D-82B8-614A-1C8CB0F8DCC6
[connection] frameTiming type=COMMAND_RESPONSE t=1789094901s
[22:48:21] Get Data Range raw frame (#451 — for offset analysis): aa4c00a72428220a0101c0cf0100aba8010083cf0100aaa801001900000000000200d9260000867b12006f25d568d04f000013bf966a9804000022bf966ad8080000006ba36af017000000004f8581b0
[22:48:21] Strap backlog pages behind: 9945 (#689 — GET_DATA_RANGE ring backlog, diagnostic only)
[22:48:21] Strap newest banked record: 2026-09-11 02:44:16 (from data range)
[connection] clockDrift newest=2026-09-11 02:44:16 wall=2026-09-11 02:48:21 newestVsWall=-245s clockOk
[22:48:21] Get Data Range raw frame (#451 — for offset analysis): aa4c00a72429220a0101c0cf0100aba8010083cf0100aaa801001900000000000200d9260000867b12006f25d568d04f000013bf966a9804000022bf966ad8080000006ba36af01700000000a75bb86a
[22:48:21] Strap backlog pages behind: 9945 (#689 — GET_DATA_RANGE ring backlog, diagnostic only)
[22:48:21] Strap newest banked record: 2026-09-11 02:44:16 (from data range)
[connection] clockDrift newest=2026-09-11 02:44:16 wall=2026-09-11 02:48:21 newestVsWall=-245s clockOk
[22:48:21] Notify active 61080004-8D6D-82B8-614A-1C8CB0F8DCC6
[22:48:22] Notify active 61080005-8D6D-82B8-614A-1C8CB0F8DCC6
[22:48:22] Notify active 2A37
[22:48:22] Clock: no correlation yet — re-sending GET_CLOCK (retry 1/3)
[22:48:22] → Get Clock payload=
[22:48:22] → Get Clock payload=00
[22:48:22] → Send Historical Data payload=00
[22:48:22] Backfill: session started — historical offload requested
[22:48:22] Notify active Battery Level
[connection] clock: GET_CLOCK(11) reply byte@resultOffset=0x01 frame=aa140003242a0b0d01ed6ba36a085700000000008e4d0e28
[22:48:22] Clock correlated: device=1789094893 wall=1789094902 (after retry 1)
[22:48:22] Clock drift detected — issuing SET_CLOCK
[22:48:22] → Set Clock payload=f66ba36a00000000
[22:48:22] → Set Clock payload=f66ba36a0000000000
Command response: SEND_HISTORICAL_DATA(22) → PENDING(2)
raw frame (#900 — [seq][result] provenance): aa0c00fc242b160e020b00002ea64719
[connection] clock: SET_CLOCK(10) reply byte@resultOffset=0x01 frame=aa0c00fc242c0a1001000000ac33c469
sleep SKIPPED 12 day(s) — need ≥200 hrSamples: hrSamples=0 on 12 day(s): 2026-08-21, 2026-08-22, 2026-09-01, 2026-09-02, 2026-09-03, 2026-09-04, 2026-09-05, 2026-09-06, 2026-09-07, 2026-09-08, 2026-09-09, 2026-09-10
analyzeRecent dayCache reused=0/9 size=9 days=21
analyzeRecent cost prep=5084ms score=3284ms
analyzeRecent windows hr[read=525948 served=543551 truncated=0] rr[read=229745 served=223132 truncated=0]
resp day=2026-08-31 rpm=nil
rhr day=2026-08-30 floor=43 nightMean=51 inBedSamples=33910 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-30 rpm=11.4
rhr day=2026-08-29 floor=45 nightMean=54 inBedSamples=28603 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-29 rpm=11.4
rhr day=2026-08-28 floor=46 nightMean=52 inBedSamples=30742 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-28 rpm=10.9
resp day=2026-08-27 rpm=nil
rhr day=2026-08-26 floor=49 nightMean=59 inBedSamples=29850 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-26 rpm=11.7
rhr day=2026-08-25 floor=48 nightMean=52 inBedSamples=30890 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-25 rpm=10.9
rhr day=2026-08-24 floor=48 nightMean=54 inBedSamples=29346 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-24 rpm=11.4
resp day=2026-08-23 rpm=nil
[22:48:32] Device removed — released the strap: stopped auto-reconnect, dropped the link, cleared targeting. Put it in pairing mode (blue LEDs) to re-pair if you want it back. (#78)
[22:48:32] Link epitaph: up 12218ms, inbound 8 frames / 321 bytes (cmd-channel 6), realtime armed=no, ended=intentional
[22:48:32] banked this link: live hr=0 rr=0 | offload none
[22:48:32] Disconnected (intentional)
[connection] connect down (intentional)
sleep day=2026-08-31 totalSleepMin=nil stages=nil eff=nil matched=0 source=computed
hrv day=2026-08-31 window=whole avgHrv=nil
sleep-detect day=2026-08-31 NO-NIGHT hr=52228 rr=31213 resp=52257 grav=52257 skin=52257 steps=0 provided=0 window=54h reason=staged-none
effort score day=2026-08-31 hr=0 enough=false hrMax=200.0(provided) rhr=60.0 reserve=140.0 method=edwards trimp=n/a strain=n/a
[universal] dayOwner day=2026-08-31 readId=whoop- writeActiveId=whoop- hrRows=52228 provenance=measured
workout detect day=2026-08-31 hr=0 motion=0 restHR=nil floor=nil motionOK=0 hrMissing=0 hrTooLow=0 active=0 runs=0 bridged=0 longestRunS=0 meanRunS=0 short=0 noHR=0 lowIntensity=0 kept=0
sleep day=2026-08-30 totalSleepMin=474 stages=138+143+193=474 eff=0.84 matched=1 source=computed
hrv day=2026-08-30 window=whole avgHrv=95.2
hrv diag day=2026-08-30 rmssd=98ms sdnn=141ms meanNN=1219ms rr=23947/22734 rejected=5% coverage=0.86 collapsedCov=0.85 dupBeats=17 beatAccurate=0.71 rrIntegrity=underCovered
effort score day=2026-08-30 hr=30967 enough=true hrMax=200.0(provided) rhr=43.0 reserve=157.0 method=edwards trimp=0.0 strain=0.0
[universal] dayOwner day=2026-08-30 readId=whoop- writeActiveId=whoop- hrRows=135141 provenance=measured
workout detect day=2026-08-30 hr=30967 motion=30967 restHR=43 floor=58 motionOK=1117 hrMissing=0 hrTooLow=298 active=819 runs=26 bridged=26 longestRunS=1201 meanRunS=96 short=24 noHR=0 lowIntensity=2 kept=0
sleep day=2026-08-29 totalSleepMin=438 stages=140+130+168=438 eff=0.92 matched=1 source=computed
hrv day=2026-08-29 window=whole avgHrv=73.9
hrv diag day=2026-08-29 rmssd=74ms sdnn=127ms meanNN=1141ms rr=22693/21828 rejected=4% coverage=0.90 collapsedCov=0.89 dupBeats=57 beatAccurate=0.78 rrIntegrity=plausible
effort score day=2026-08-29 hr=85534 enough=true hrMax=200.0(provided) rhr=45.0 reserve=155.0 method=edwards trimp=13.2 strain=29.9
[universal] dayOwner day=2026-08-29 readId=whoop- writeActiveId=whoop- hrRows=189716 provenance=measured
workout detect day=2026-08-29 hr=85534 motion=85572 restHR=45 floor=60 motionOK=27741 hrMissing=13 hrTooLow=214 active=27514 runs=77 bridged=57 longestRunS=14285 meanRunS=801 short=42 noHR=0 lowIntensity=15 kept=0
sleep day=2026-08-28 totalSleepMin=486 stages=134+171+182=486 eff=0.95 matched=1 source=computed
hrv day=2026-08-28 window=whole avgHrv=80.5
hrv diag day=2026-08-28 rmssd=81ms sdnn=106ms meanNN=1169ms rr=24558/24226 rejected=1% coverage=0.93 collapsedCov=0.93 dupBeats=6 beatAccurate=0.76 rrIntegrity=plausible
effort score day=2026-08-28 hr=82610 enough=true hrMax=200.0(provided) rhr=46.0 reserve=154.0 method=edwards trimp=78.8 strain=49.3
[universal] dayOwner day=2026-08-28 readId=whoop- writeActiveId=whoop- hrRows=114744 provenance=measured
workout detect day=2026-08-28 hr=82610 motion=82629 restHR=46 floor=61 motionOK=24773 hrMissing=9 hrTooLow=256 active=24508 runs=61 bridged=41 longestRunS=16748 meanRunS=1190 short=34 noHR=0 lowIntensity=7 kept=0
sleep day=2026-08-27 totalSleepMin=nil stages=nil eff=nil matched=0 source=computed
hrv day=2026-08-27 window=whole avgHrv=nil
sleep-detect day=2026-08-27 NO-NIGHT hr=32134 rr=9582 resp=32161 grav=32161 skin=32161 steps=0 provided=0 window=54h reason=staged-none
effort score day=2026-08-27 hr=32133 enough=true hrMax=200.0(provided) rhr=60.0 reserve=140.0 method=edwards trimp=112.8 strain=53.3
[universal] dayOwner day=2026-08-27 readId=whoop- writeActiveId=whoop- hrRows=32134 provenance=measured
workout detect day=2026-08-27 hr=32133 motion=32160 restHR=55 floor=70 motionOK=9176 hrMissing=11 hrTooLow=1196 active=7969 runs=37 bridged=33 longestRunS=4454 meanRunS=514 short=22 noHR=0 lowIntensity=10 kept=1
effort bout day=2026-08-27 durMin=74 hrmax=200 src=caller avgHRR=50 cover=100 effort=50.4
sleep day=2026-08-26 totalSleepMin=465 stages=117+135+213=465 eff=0.93 matched=1 source=computed
hrv day=2026-08-26 window=whole avgHrv=55.4
hrv diag day=2026-08-26 rmssd=56ms sdnn=117ms meanNN=1005ms rr=27945/26474 rejected=5% coverage=0.94 collapsedCov=0.91 dupBeats=218 beatAccurate=0.88 rrIntegrity=plausible
effort score day=2026-08-26 hr=86367 enough=true hrMax=200.0(provided) rhr=49.0 reserve=151.0 method=edwards trimp=9.8 strain=26.8
[universal] dayOwner day=2026-08-26 readId=my-whoop writeActiveId=whoop- hrRows=193664 provenance=measured
workout detect day=2026-08-26 hr=86367 motion=86377 restHR=49 floor=64 motionOK=17834 hrMissing=5 hrTooLow=708 active=17121 runs=89 bridged=52 longestRunS=7134 meanRunS=872 short=30 noHR=0 lowIntensity=22 kept=0
sleep day=2026-08-25 totalSleepMin=480 stages=154+159+167=480 eff=0.93 matched=1 source=computed
hrv day=2026-08-25 window=whole avgHrv=73.3
hrv diag day=2026-08-25 rmssd=76ms sdnn=116ms meanNN=1166ms rr=24828/23669 rejected=5% coverage=0.93 collapsedCov=0.92 dupBeats=83 beatAccurate=0.76 rrIntegrity=plausible
effort score day=2026-08-25 hr=86396 enough=true hrMax=200.0(provided) rhr=48.0 reserve=152.0 method=edwards trimp=144.1 strain=56.0
[universal] dayOwner day=2026-08-25 readId=my-whoop writeActiveId=whoop- hrRows=193687 provenance=measured
workout detect day=2026-08-25 hr=86396 motion=86396 restHR=48 floor=63 motionOK=21428 hrMissing=0 hrTooLow=294 active=21134 runs=70 bridged=36 longestRunS=14112 meanRunS=1339 short=23 noHR=0 lowIntensity=13 kept=0
sleep day=2026-08-24 totalSleepMin=458 stages=133+154+171=458 eff=0.94 matched=1 source=computed
hrv day=2026-08-24 window=whole avgHrv=86.9
hrv diag day=2026-08-24 rmssd=87ms sdnn=107ms meanNN=1141ms rr=24109/23235 rejected=4% coverage=0.93 collapsedCov=0.92 dupBeats=24 beatAccurate=0.79 rrIntegrity=plausible
effort score day=2026-08-24 hr=85697 enough=true hrMax=200.0(provided) rhr=48.0 reserve=152.0 method=edwards trimp=16.3 strain=32.1
[universal] dayOwner day=2026-08-24 readId=my-whoop writeActiveId=whoop- hrRows=121941 provenance=measured
workout detect day=2026-08-24 hr=85697 motion=85727 restHR=48 floor=63 motionOK=18556 hrMissing=15 hrTooLow=797 active=17744 runs=81 bridged=54 longestRunS=8210 meanRunS=762 short=35 noHR=0 lowIntensity=19 kept=0
sleep day=2026-08-23 totalSleepMin=nil stages=nil eff=nil matched=0 source=imported:whoop
hrv day=2026-08-23 window=whole avgHrv=nil
sleep-detect day=2026-08-23 NO-NIGHT hr=36244 rr=9928 resp=36273 grav=36273 skin=36273 steps=0 provided=0 window=54h reason=staged-none
effort score day=2026-08-23 hr=36243 enough=true hrMax=200.0(provided) rhr=60.0 reserve=140.0 method=edwards trimp=107.4 strain=52.8
[universal] dayOwner day=2026-08-23 readId=my-whoop writeActiveId=whoop- hrRows=36244 provenance=imported:whoop
workout detect day=2026-08-23 hr=36243 motion=36272 restHR=62 floor=77 motionOK=13728 hrMissing=6 hrTooLow=2956 active=10766 runs=37 bridged=36 longestRunS=6227 meanRunS=475 short=26 noHR=0 lowIntensity=10 kept=0
analyzeRecent stepsMotion reused=0/60 size=60
analyzeRecent storeProbes total=45ms dayOwner=81/4ms ownerHr=81/5ms gravityFp=60/36ms
Dedup(#1284): dropped [1788064760 -> 1788092060] min=455 segs=54 json=2873 kept [1788058148 -> 1788092060] min=565 segs=61 json=3251 - heal
Dedup(#899): swept 3 device id(s), removed 1 overlapping duplicate session(s).
Dedup(#899): removed 1 overlapping duplicate sleep session(s) re-banked under a shifted strap timebase; re-scoring the affected days.
analyzeRecent postLoop total=1951ms dayReplay=3ms baselines=88ms score2=1065ms watchFold=0ms persist=72ms weekly=1ms steps=610ms sleepWrite=74ms sleepHeal=7ms workouts=29ms tail=1ms
re-score: done — scored 9 night(s) in 13680 ms (#1005)
re-score: trigger=forced newData=yes
sleep SKIPPED 15 day(s) — need ≥200 hrSamples: hrSamples=0 on 15 day(s): 2026-08-21, 2026-08-22, 2026-08-29, 2026-08-30, 2026-08-31, 2026-09-01, 2026-09-02, 2026-09-03, 2026-09-04, 2026-09-05, 2026-09-06, 2026-09-07, 2026-09-08, 2026-09-09, 2026-09-10
analyzeRecent dayCache reused=0/6 size=6 days=21
analyzeRecent cost prep=3425ms score=690ms
analyzeRecent windows hr[read=347598 served=433262 truncated=0] rr[read=157576 served=189607 truncated=0]
resp day=2026-08-28 rpm=nil
rhr day=2026-08-27 floor=47 nightMean=54 inBedSamples=30078 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-27 rpm=10.9
rhr day=2026-08-26 floor=49 nightMean=59 inBedSamples=29850 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-26 rpm=11.7
rhr day=2026-08-25 floor=48 nightMean=52 inBedSamples=30890 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-25 rpm=10.9
rhr day=2026-08-24 floor=48 nightMean=54 inBedSamples=29346 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-24 rpm=11.4
resp day=2026-08-23 rpm=nil
sleep day=2026-08-28 totalSleepMin=nil stages=nil eff=nil matched=0 source=computed
hrv day=2026-08-28 window=whole avgHrv=nil
sleep-detect day=2026-08-28 NO-NIGHT hr=74462 rr=36120 resp=74481 grav=74481 skin=74481 steps=0 provided=0 window=54h reason=staged-none
effort score day=2026-08-28 hr=0 enough=false hrMax=200.0(provided) rhr=60.0 reserve=140.0 method=edwards trimp=n/a strain=n/a
[universal] dayOwner day=2026-08-28 readId=my-whoop writeActiveId=my-whoop hrRows=74462 provenance=measured
workout detect day=2026-08-28 hr=0 motion=0 restHR=nil floor=nil motionOK=0 hrMissing=0 hrTooLow=0 active=0 runs=0 bridged=0 longestRunS=0 meanRunS=0 short=0 noHR=0 lowIntensity=0 kept=0
sleep day=2026-08-27 totalSleepMin=477 stages=148+159+171=477 eff=0.95 matched=1 source=computed
hrv day=2026-08-27 window=whole avgHrv=71.9
hrv diag day=2026-08-27 rmssd=70ms sdnn=168ms meanNN=1132ms rr=25710/22247 rejected=13% coverage=0.94 collapsedCov=0.92 dupBeats=380 beatAccurate=0.77 rrIntegrity=plausible
effort score day=2026-08-27 hr=52895 enough=true hrMax=200.0(provided) rhr=47.0 reserve=153.0 method=edwards trimp=0.0 strain=0.0
[universal] dayOwner day=2026-08-27 readId=my-whoop writeActiveId=my-whoop hrRows=160862 provenance=measured
workout detect day=2026-08-27 hr=52895 motion=52904 restHR=47 floor=62 motionOK=8960 hrMissing=4 hrTooLow=143 active=8813 runs=51 bridged=32 longestRunS=12570 meanRunS=739 short=25 noHR=0 lowIntensity=7 kept=0
sleep day=2026-08-26 totalSleepMin=465 stages=117+135+213=465 eff=0.93 matched=1 source=computed
hrv day=2026-08-26 window=whole avgHrv=55.4
hrv diag day=2026-08-26 rmssd=56ms sdnn=117ms meanNN=1005ms rr=27945/26474 rejected=5% coverage=0.94 collapsedCov=0.91 dupBeats=218 beatAccurate=0.88 rrIntegrity=plausible
effort score day=2026-08-26 hr=86367 enough=true hrMax=200.0(provided) rhr=49.0 reserve=151.0 method=edwards trimp=9.8 strain=26.8
[universal] dayOwner day=2026-08-26 readId=my-whoop writeActiveId=my-whoop hrRows=193664 provenance=measured
===== current app session =====
[22:52:08] Central state: 5 (5 = poweredOn)
[22:52:08] Found existing WHOOP 4.0 connection — attaching
[22:52:08] send(Disable Alarm) ignored — not connected
[22:52:08] Alarm: disarm NOT sent — not connected; will retry on connect (strap may still be armed)
[22:52:08] Connected — discovering services
[connection] connect up gen=1 latencyMs=31 uptimeStart=1789095128
[22:52:08] Services discovered: 61080001-8D6D-82B8-614A-1C8CB0F8DCC6, 180D, 180F, 180A
[22:52:08] Bonding: confirmed write GET_BATTERY_LEVEL to 61080002
[22:52:08] Notify requested 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:52:08] Notify requested 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:52:08] Notify requested 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:52:08] Notify requested 2A37 (discovery)
[22:52:08] Notify requested Battery Level (discovery)
[connection] GATT tree: 4 service(s)
[connection] service 61080001-8D6D-82B8-614A-1C8CB0F8DCC6 (4 char)
[connection] 61080002-8D6D-82B8-614A-1C8CB0F8DCC6 props=0xc (WriteNoResponse+Write)
[connection] 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 props=0x10 (Notify)
[connection] 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 props=0x10 (Notify)
[connection] 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 props=0x10 (Notify)
[connection] service 180D (1 char)
[connection] 2A37 props=0x10 (Notify)
[connection] service 180F (1 char)
[connection] 2A19 props=0x12 (Read+Notify)
[connection] service 180A (1 char)
[connection] 2A29 props=0x2 (Read)
Read spine re-pointed to active device after registry change (#814).
re-score: trigger=forced newData=no (nothing changed since last run)
[connection] bondState encryptedBond family=whoop4 (confirmed write acked)
[22:52:11] BONDED (confirmed write acknowledged) — custom channels should now flow
[22:52:11] → Get Hello (Harvard) payload=00
[22:52:11] → Get Advertising Name (Harvard) payload=00
[22:52:11] → Report Version Info payload=00
[22:52:11] → Set Clock payload=db6ca36a00000000
[22:52:11] → Set Clock payload=db6ca36a0000000000
[22:52:11] → Get Clock payload=
[22:52:11] → Get Clock payload=00
[22:52:11] → R10/R11 Realtime (raw stream) payload=00
[22:52:11] → Get Data Range payload=00
[22:52:11] Notify requested 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 (post-bond)
[22:52:11] Notify requested 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 (post-bond)
[22:52:11] Notify requested 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 (post-bond)
[22:52:11] Notify requested 2A37 (post-bond)
[22:52:11] Notify requested Battery Level (post-bond)
[22:52:12] Clock: no correlation yet — re-sending GET_CLOCK (retry 1/3)
[22:52:12] → Get Clock payload=
[22:52:12] → Get Clock payload=00
[22:52:12] → Send Historical Data payload=00
[22:52:12] Backfill: session started — historical offload requested
[22:52:13] Notify active 61080003-8D6D-82B8-614A-1C8CB0F8DCC6
[22:52:13] → Disable Alarm payload=01
[22:52:13] Alarm: disarmed
[22:52:13] Connect settled: handshake done + cmd-notify confirmed — alarm re-arm (if due) can fire now
[22:52:15] Notify active 61080004-8D6D-82B8-614A-1C8CB0F8DCC6
[22:52:17] Notify active 61080005-8D6D-82B8-614A-1C8CB0F8DCC6
sleep SKIPPED 12 day(s) — need ≥200 hrSamples: hrSamples=0 on 12 day(s): 2026-08-21, 2026-08-22, 2026-09-01, 2026-09-02, 2026-09-03, 2026-09-04, 2026-09-05, 2026-09-06, 2026-09-07, 2026-09-08, 2026-09-09, 2026-09-10
analyzeRecent dayCache reused=0/9 size=9 days=21
analyzeRecent cost prep=4466ms score=3028ms
analyzeRecent windows hr[read=525948 served=543551 truncated=0] rr[read=229745 served=223132 truncated=0]
resp day=2026-08-31 rpm=nil
rhr day=2026-08-30 floor=43 nightMean=51 inBedSamples=33910 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-30 rpm=11.4
rhr day=2026-08-29 floor=45 nightMean=54 inBedSamples=28603 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-29 rpm=11.4
rhr day=2026-08-28 floor=46 nightMean=52 inBedSamples=30742 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-28 rpm=10.9
resp day=2026-08-27 rpm=nil
rhr day=2026-08-26 floor=49 nightMean=59 inBedSamples=29850 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-26 rpm=11.7
rhr day=2026-08-25 floor=48 nightMean=52 inBedSamples=30890 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-25 rpm=10.9
rhr day=2026-08-24 floor=48 nightMean=54 inBedSamples=29346 (floor = WHOOP-style lowest-sustained = NOOP RHR; mean = sleeping-HR-app number)
resp day=2026-08-24 rpm=11.4
resp day=2026-08-23 rpm=nil
[22:52:19] Notify active 2A37
sleep day=2026-08-31 totalSleepMin=nil stages=nil eff=nil matched=0 source=computed
hrv day=2026-08-31 window=whole avgHrv=nil
sleep-detect day=2026-08-31 NO-NIGHT hr=52228 rr=31213 resp=52257 grav=52257 skin=52257 steps=0 provided=0 window=54h reason=staged-none
effort score day=2026-08-31 hr=0 enough=false hrMax=200.0(provided) rhr=60.0 reserve=140.0 method=edwards trimp=n/a strain=n/a
[universal] dayOwner day=2026-08-31 readId=whoop- writeActiveId=whoop- hrRows=52228 provenance=measured
workout detect day=2026-08-31 hr=0 motion=0 restHR=nil floor=nil motionOK=0 hrMissing=0 hrTooLow=0 active=0 runs=0 bridged=0 longestRunS=0 meanRunS=0 short=0 noHR=0 lowIntensity=0 kept=0
sleep day=2026-08-30 totalSleepMin=474 stages=138+143+193=474 eff=0.84 matched=1 source=computed
hrv day=2026-08-30 window=whole avgHrv=95.2
hrv diag day=2026-08-30 rmssd=98ms sdnn=141ms meanNN=1219ms rr=23947/22734 rejected=5% coverage=0.86 collapsedCov=0.85 dupBeats=17 beatAccurate=0.71 rrIntegrity=underCovered
effort score day=2026-08-30 hr=30967 enough=true hrMax=200.0(provided) rhr=43.0 reserve=157.0 method=edwards trimp=0.0 strain=0.0
[universal] dayOwner day=2026-08-30 readId=whoop- writeActiveId=whoop- hrRows=135141 provenance=measured
workout detect day=2026-08-30 hr=30967 motion=30967 restHR=43 floor=58 motionOK=1117 hrMissing=0 hrTooLow=298 active=819 runs=26 bridged=26 longestRunS=1201 meanRunS=96 short=24 noHR=0 lowIntensity=2 kept=0
sleep day=2026-08-29 totalSleepMin=438 stages=140+130+168=438 eff=0.92 matched=1 source=computed
hrv day=2026-08-29 window=whole avgHrv=73.9
hrv diag day=2026-08-29 rmssd=74ms sdnn=127ms meanNN=1141ms rr=22693/21828 rejected=4% coverage=0.90 collapsedCov=0.89 dupBeats=57 beatAccurate=0.78 rrIntegrity=plausible
effort score day=2026-08-29 hr=85534 enough=true hrMax=200.0(provided) rhr=45.0 reserve=155.0 method=edwards trimp=13.2 strain=29.9
[universal] dayOwner day=2026-08-29 readId=whoop- writeActiveId=whoop- hrRows=189716 provenance=measured
workout detect day=2026-08-29 hr=85534 motion=85572 restHR=45 floor=60 motionOK=27741 hrMissing=13 hrTooLow=214 active=27514 runs=77 bridged=57 longestRunS=14285 meanRunS=801 short=42 noHR=0 lowIntensity=15 kept=0
sleep day=2026-08-28 totalSleepMin=486 stages=134+171+182=486 eff=0.95 matched=1 source=computed
hrv day=2026-08-28 window=whole avgHrv=80.5
hrv diag day=2026-08-28 rmssd=81ms sdnn=106ms meanNN=1169ms rr=24558/24226 rejected=1% coverage=0.93 collapsedCov=0.93 dupBeats=6 beatAccurate=0.76 rrIntegrity=plausible
effort score day=2026-08-28 hr=82610 enough=true hrMax=200.0(provided) rhr=46.0 reserve=154.0 method=edwards trimp=78.8 strain=49.3
[universal] dayOwner day=2026-08-28 readId=whoop- writeActiveId=whoop- hrRows=114744 provenance=measured
workout detect day=2026-08-28 hr=82610 motion=82629 restHR=46 floor=61 motionOK=24773 hrMissing=9 hrTooLow=256 active=24508 runs=61 bridged=41 longestRunS=16748 meanRunS=1190 short=34 noHR=0 lowIntensity=7 kept=0
sleep day=2026-08-27 totalSleepMin=nil stages=nil eff=nil matched=0 source=computed
hrv day=2026-08-27 window=whole avgHrv=nil
sleep-detect day=2026-08-27 NO-NIGHT hr=32134 rr=9582 resp=32161 grav=32161 skin=32161 steps=0 provided=0 window=54h reason=staged-none
effort score day=2026-08-27 hr=32133 enough=true hrMax=200.0(provided) rhr=60.0 reserve=140.0 method=edwards trimp=112.8 strain=53.3
[universal] dayOwner day=2026-08-27 readId=whoop- writeActiveId=whoop- hrRows=32134 provenance=measured
workout detect day=2026-08-27 hr=32133 motion=32160 restHR=55 floor=70 motionOK=9176 hrMissing=11 hrTooLow=1196 active=7969 runs=37 bridged=33 longestRunS=4454 meanRunS=514 short=22 noHR=0 lowIntensity=10 kept=1
effort bout day=2026-08-27 durMin=74 hrmax=200 src=caller avgHRR=50 cover=100 effort=50.4
sleep day=2026-08-26 totalSleepMin=465 stages=117+135+213=465 eff=0.93 matched=1 source=computed
hrv day=2026-08-26 window=whole avgHrv=55.4
hrv diag day=2026-08-26 rmssd=56ms sdnn=117ms meanNN=1005ms rr=27945/26474 rejected=5% coverage=0.94 collapsedCov=0.91 dupBeats=218 beatAccurate=0.88 rrIntegrity=plausible
effort score day=2026-08-26 hr=86367 enough=true hrMax=200.0(provided) rhr=49.0 reserve=151.0 method=edwards trimp=9.8 strain=26.8
[universal] dayOwner day=2026-08-26 readId=my-whoop writeActiveId=whoop- hrRows=193664 provenance=measured
workout detect day=2026-08-26 hr=86367 motion=86377 restHR=49 floor=64 motionOK=17834 hrMissing=5 hrTooLow=708 active=17121 runs=89 bridged=52 longestRunS=7134 meanRunS=872 short=30 noHR=0 lowIntensity=22 kept=0
sleep day=2026-08-25 totalSleepMin=480 stages=154+159+167=480 eff=0.93 matched=1 source=computed
hrv day=2026-08-25 window=whole avgHrv=73.3
hrv diag day=2026-08-25 rmssd=76ms sdnn=116ms meanNN=1166ms rr=24828/23669 rejected=5% coverage=0.93 collapsedCov=0.92 dupBeats=83 beatAccurate=0.76 rrIntegrity=plausible
effort score day=2026-08-25 hr=86396 enough=true hrMax=200.0(provided) rhr=48.0 reserve=152.0 method=edwards trimp=144.1 strain=56.0
[universal] dayOwner day=2026-08-25 readId=my-whoop writeActiveId=whoop- hrRows=193687 provenance=measured
workout detect day=2026-08-25 hr=86396 motion=86396 restHR=48 floor=63 motionOK=21428 hrMissing=0 hrTooLow=294 active=21134 runs=70 bridged=36 longestRunS=14112 meanRunS=1339 short=23 noHR=0 lowIntensity=13 kept=0
sleep day=2026-08-24 totalSleepMin=458 stages=133+154+171=458 eff=0.94 matched=1 source=computed
hrv day=2026-08-24 window=whole avgHrv=86.9
hrv diag day=2026-08-24 rmssd=87ms sdnn=107ms meanNN=1141ms rr=24109/23235 rejected=4% coverage=0.93 collapsedCov=0.92 dupBeats=24 beatAccurate=0.79 rrIntegrity=plausible
effort score day=2026-08-24 hr=85697 enough=true hrMax=200.0(provided) rhr=48.0 reserve=152.0 method=edwards trimp=16.3 strain=32.1
[universal] dayOwner day=2026-08-24 readId=my-whoop writeActiveId=whoop- hrRows=121941 provenance=measured
workout detect day=2026-08-24 hr=85697 motion=85727 restHR=48 floor=63 motionOK=18556 hrMissing=15 hrTooLow=797 active=17744 runs=81 bridged=54 longestRunS=8210 meanRunS=762 short=35 noHR=0 lowIntensity=19 kept=0
sleep day=2026-08-23 totalSleepMin=nil stages=nil eff=nil matched=0 source=imported:whoop
hrv day=2026-08-23 window=whole avgHrv=nil
sleep-detect day=2026-08-23 NO-NIGHT hr=36244 rr=9928 resp=36273 grav=36273 skin=36273 steps=0 provided=0 window=54h reason=staged-none
effort score day=2026-08-23 hr=36243 enough=true hrMax=200.0(provided) rhr=60.0 reserve=140.0 method=edwards trimp=107.4 strain=52.8
[universal] dayOwner day=2026-08-23 readId=my-whoop writeActiveId=whoop- hrRows=36244 provenance=imported:whoop
workout detect day=2026-08-23 hr=36243 motion=36272 restHR=62 floor=77 motionOK=13728 hrMissing=6 hrTooLow=2956 active=10766 runs=37 bridged=36 longestRunS=6227 meanRunS=475 short=26 noHR=0 lowIntensity=10 kept=0
analyzeRecent stepsMotion reused=56/60 size=60
analyzeRecent storeProbes total=42ms dayOwner=81/3ms ownerHr=81/4ms gravityFp=60/35ms
Dedup(#899): swept 3 device id(s), removed 0 overlapping duplicate session(s).
analyzeRecent postLoop total=1351ms dayReplay=2ms baselines=300ms score2=593ms watchFold=0ms persist=77ms weekly=1ms steps=277ms sleepWrite=76ms sleepHeal=6ms workouts=19ms tail=0ms
re-score: done — scored 9 night(s) in 10937 ms (#1005)
[22:52:24] Notify active Battery Level
[connection] frameTiming type=COMMAND_RESPONSE t=1789095144s
[22:52:24] Get Data Range raw frame (#451 — for offset analysis): aa4c00a72430220a0101c0cf0100aba8010090cf0100aaa801001900000000000200e6260000047b12006f25d568d04f000013bf966a9804000022bf966ad8080000dd6ca36ac029000000001e41d8e5
[22:52:24] Strap backlog pages behind: 9958 (#689 — GET_DATA_RANGE ring backlog, diagnostic only)
[22:52:24] Strap newest banked record: 2026-09-11 02:52:13 (from data range)
[connection] clockDrift newest=2026-09-11 02:52:13 wall=2026-09-11 02:52:24 newestVsWall=-11s clockOk
[22:52:24] Get Data Range raw frame (#451 — for offset analysis): aa4c00a72431220a0101c0cf0100aba8010090cf0100aaa801001900000000000200e6260000047b12006f25d568d04f000013bf966a9804000022bf966ad8080000dd6ca36ac02900000000f69fe13f
[22:52:24] Strap backlog pages behind: 9958 (#689 — GET_DATA_RANGE ring backlog, diagnostic only)
[22:52:24] Strap newest banked record: 2026-09-11 02:52:13 (from data range)
[connection] clockDrift newest=2026-09-11 02:52:13 wall=2026-09-11 02:52:24 newestVsWall=-11s clockOk
[22:52:24] Get Data Range raw frame (#451 — for offset analysis): aa4c00a72432220a0101c0cf0100aba8010090cf0100aaa801001900000000000200e6260000047b12006f25d568d04f000013bf966a9804000022bf966ad8080000dd6ca36ac029000000008ffada8a
[22:52:24] Strap backlog pages behind: 9958 (#689 — GET_DATA_RANGE ring backlog, diagnostic only)
[22:52:24] Strap newest banked record: 2026-09-11 02:52:13 (from data range)
[connection] clockDrift newest=2026-09-11 02:52:13 wall=2026-09-11 02:52:24 newestVsWall=-11s clockOk
[22:52:24] Notify active 61080003-8D6D-82B8-614A-1C8CB0F8DCC6
[22:52:24] Notify active 61080004-8D6D-82B8-614A-1C8CB0F8DCC6
[22:52:24] Notify active 61080005-8D6D-82B8-614A-1C8CB0F8DCC6
[22:52:24] Notify active 2A37
[22:52:24] Notify active Battery Level
Command response: SEND_HISTORICAL_DATA(22) → PENDING(2)
raw frame (#900 — [seq][result] provenance): aa0c00fc2433160d020b0000570ed60a
[22:52:59] → R10/R11 Realtime (raw stream) payload=01
[22:52:59] → Toggle Realtime HR payload=01
[22:52:59] → Get Battery Level payload=00
[22:53:43] Backfill: session ended — reason=timeout
[connection] offload result=stalled (idle timeout, rows=0)
[22:53:53] → R10/R11 Realtime (raw stream) payload=00
[22:53:53] → Toggle Realtime HR payload=00
[connection] frameTiming type=EVENT t=1789095233s
[22:53:53] Clock: no correlation yet — re-sending GET_CLOCK (retry 2/3)
[22:53:53] → Get Clock payload=
[22:53:53] → Get Clock payload=00
[22:53:53] → Send Historical Data payload=00
[22:53:53] Backfill: session started — historical offload requested
[22:53:53] Get Data Range raw frame (#451 — for offset analysis): aa10005730b52200416da36a484e0000a5c2706d
[22:53:53] Strap backlog pages behind: not decodable from this frame (#689 — offsets may have moved; the raw frame above is the input). Diagnostic only, sync is unaffected.
[22:53:53] Strap newest banked record: 2026-09-11 02:53:53 (from data range)
[connection] clockDrift newest=2026-09-11 02:53:53 wall=2026-09-11 02:53:53 newestVsWall=+0s clockOk
[connection] frameTiming type=COMMAND_RESPONSE t=1789095233s
Command response: TOGGLE_REALTIME_HR(3) → PENDING(2)
raw frame (#900 — [seq][result] provenance): aa0c00fc24370313020000006e7f077e
Command response: SEND_HISTORICAL_DATA(22) → PENDING(2)
[22:54:03] → R10/R11 Realtime (raw stream) payload=01
[22:54:03] → Toggle Realtime HR payload=01
[22:54:03] → Get Battery Level payload=00
[22:54:37] → R10/R11 Realtime (raw stream) payload=00
[22:54:37] → Toggle Realtime HR payload=00
Command response: TOGGLE_REALTIME_HR(3) → PENDING(2)
[22:55:37] Backfill: session ended — reason=timeout
[connection] offload result=stalled (idle timeout, rows=0)
[connection] frameTiming type=EVENT t=1789095351s
[22:55:51] Clock: no correlation yet — re-sending GET_CLOCK (retry 3/3)
[22:55:51] → Get Clock payload=
[22:55:51] → Get Clock payload=00
[22:55:51] → Send Historical Data payload=00
[22:55:51] Backfill: session started — historical offload requested
[connection] frameTiming type=COMMAND_RESPONSE t=1789095351s
Command response: SEND_HISTORICAL_DATA(22) → PENDING(2)
[22:56:08] Already connected to WHOOP 4.0 — refreshing services and notifications
[22:56:08] Services discovered: 61080001-8D6D-82B8-614A-1C8CB0F8DCC6, 180D, 180F, 180A
[22:56:08] Bonding: confirmed write GET_BATTERY_LEVEL to 61080002
[22:56:08] Notify already active 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:56:08] Notify already active 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:56:08] Notify already active 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:56:08] Notify already active 2A37 (discovery)
[22:56:08] Notify already active Battery Level (discovery)
[22:56:09] Already connected to WHOOP 4.0 — refreshing services and notifications
[22:56:09] Services discovered: 61080001-8D6D-82B8-614A-1C8CB0F8DCC6, 180D, 180F, 180A
[22:56:09] Bonding: confirmed write GET_BATTERY_LEVEL to 61080002
[22:56:09] Notify already active 61080003-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:56:09] Notify already active 61080004-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:56:09] Notify already active 61080005-8D6D-82B8-614A-1C8CB0F8DCC6 (discovery)
[22:56:09] Notify already active 2A37 (discovery)
[22:56:09] Notify already active Battery Level (discovery)