Skip to content

NOOP 10.6.0

Choose a tag to compare

@github-actions github-actions released this 25 Aug 06:54

NOOP v10.6.0

A release about choosing how your training is scored, giving hardware back the time it needs to do its
own job, and stopping the phone from doing work it was never going to finish.

Effort, on a scale you pick

Banister TRIMP, wired end to end and selectable (#1562, #1563). Effort has always been a
thresholded Edwards score. Banister TRIMP is now a first-class alternative, complete with its own
log-map denominator (#1561) rather than borrowed constants, and the docs no longer claim NOOP uses a
method it did not. The toggle sits where someone looking for it would look (#1580).

A workout is scored against the day's HRmax (#1565). A session used to be able to score against a
different maximum than the day containing it, which made a hard workout and a hard day disagree. The
strap log now also records what each workout's Effort was scored against, and whether the strap saw the
session at all (#1566) — and when a day detects no workout, it says which gate ate it (#1574).

The phone stops re-scoring all night

A background re-score that can finish (#1557). A re-score that ran out of background time restarted
from the beginning on the next attempt, so on some phones it never completed at all and days simply
refused to compute. It now runs where it can finish, and a pass that is owed is recorded durably so a
process killed mid-way leaves evidence the next one can read.

Diagnostics that name the pass (#1556, #1559). Every re-score now says what triggered it and whether
anything actually changed, and the cache ratio is counted honestly. An active trace no longer disables
the reuse cache it was meant to observe (#1575).

Hardware gets its time back

The Oura ring is handed out of daytime mode (#1526, #1550, thanks @pipiche38). The 15-second
keep-alive held the ring in live-HR daytime mode whenever the app was not on screen — which blocks the
ring's own overnight sleep suite. NOOP now suspends the re-engage and actively disables the mode, on
teardown as well as on suspend. Measured against the ring's own output across eleven nights.

The bond loop can escape while backgrounded (#1544, thanks @justinjor-bit). A pause with no
background escape cost a full night of banked data; it now has one.

Steps calibration asks the right straps (#1579, #1581, #1582, thanks @kavemang). A WHOOP 5 no longer
sees a prompt that cannot apply to it, and a blank Steps tile routes to calibration instead of nothing.

Sleep and Health Connect

The night's heart-rate line, in Classic (#1552, thanks @bartmuskala). The card that was missing its
chart has it. The stage breakdown is ramp-aware and the redundant, mis-ordered legend is gone (#1551).

VO₂max flows to Health Connect (#1553, #1554). NOOP already computed it; it now exports it, and
existing installs are asked once for the permission rather than silently lacking it.

Smaller things that were wrong

  • Pause and discard a live workout (#1533, thanks @bhelm), and the SDNN index ported to Android (#1535).
  • Back from More returns to More (#1571, thanks @SpurgtBror), not to Today.
  • No horizontal bounce on iOS (#1532, thanks @evoveotech), including the four ScrollViews the first sweep missed (#1549).
  • Home is localized on both platforms (#1490, thanks @bhelm).
  • PPG burst boundaries survive decoding (#1583, thanks @kvnloo).
  • A WHOOP 5/MG no longer logs a clock warning it cannot act on (#1609), and no longer derives a clock offset from how long it went unworn.
  • The phone smart alarm can skip chosen days (#1612) — a weekend off without turning the alarm off and having to remember to turn it back on.

Thanks

Thanks to @anwrgo6000-oss, @bartmuskala, @bhelm, @Dessalines39394, @evoveotech, @justinjor-bit,
@kavemang, @kvnloo, @mailingjash, @pipiche38, @SpurgtBror and @vishk23 — for the pull requests above and
for the reports behind them. A good bug report with a strap log attached is often the harder half, and
several of the fixes in this release exist because someone took the time to capture one.


What's Changed

  • Compare the whole workout key when an edit replaces a row (#1488) in #1489
  • Stop "Duplicate as manual" deleting the session it copied (both platforms) in #1500
  • Carry the waist into the post-offload pass, so VO₂max stops flipping estimator (#1493) in #1504
  • Edit a bridged night across all its fragments, not just the winning one (#1492) in #1506
  • Measure how a duplicated second's two copies compare (#1505) in #1510
  • Show the steps-calibration prompt to the users it was written for (#1491) in #1512
  • Give the Android Steps tile the caption it has been computing all along (#1513) in #1514
  • Stop telling a calibrated user they need 0 more days, on both platforms (#1515) in #1516
  • Fix broken Star History chart by @Dessalines39394 in #1517
  • Fix lifting note title delimiter parity by @bhelm in #1494
  • Count rejected Liftosaur history records on Swift by @bhelm in #1497
  • Fix Swift SpO2 capability token normalization by @bhelm in #1495
  • Fix activity route distance rounding parity by @bhelm in #1496
  • Fix trailing-dot activity format detection by @bhelm in #1498
  • Fix activity import distance half-tie rounding by @bhelm in #1499
  • Fix untimed single-point activity distance by @bhelm in #1508
  • Trim capability and key-metric tokens on read (#1518) in #1519
  • Hand off to the standing connect on the first drop, not the third (#1413) in #1520
  • Give the three hero columns one width, and the label back the space it lost (#1502) in #1507
  • perf: drop two redundant hot-path reads added in 10.5.1, plus two staleness/parity fixes found reviewing them in #1521
  • fix: stamp a device as seen when it connects, not when it was added (#1527) in #1530
  • Localize the Home experience on Android and iOS by @bhelm in #1490
  • Port the SDNN index to Android by @bhelm in #1535
  • fix: round the imported Apple step total on Apple, matching Android in #1540
  • Keep Android intelligence analysis JaCoCo-instrumentable by @bhelm in #1524
  • fix: give the bond-loop pause an escape that works while backgrounded in #1544
  • 5/MG haptics: carry the repeat count into overallLoop, on both platforms (#926) in #1548
  • Fix: stop horizontal bounce/swipe on Liquid Today (iOS) by @evoveotech in #1532
  • Finish the #1532 sweep: the four production ScrollViews it missed (iOS) in #1549
  • fix(oura): stop the ring's live-HR daytime-HR mode from running while nobody is looking by @pipiche38 in #1526
  • Oura: hand the ring out of daytime mode on teardown, not only on suspend in #1550
  • Sleep: drop the stage legend from the breakdown card, both platforms in #1551
  • Sleep: give Android's Classic view the night's heart-rate line in #1552
  • Health Connect: export VO₂ max, which NOOP already computes in #1553
  • Health Connect: ask existing installs for the VO₂ max permission, once in #1554
  • CI: prune branches that no longer have a reason to exist in #1555
  • Re-score diagnostics: attribute every pass, and count the cache ratio honestly in #1556
  • iOS: run a backgrounded re-score where it can finish, instead of restarting it in #1557
  • Correct what the day-cache signature comment claims, on both platforms in #1558
  • CLAUDE.md: the CI table said Android was disabled; it has not been in #1560
  • Measure where a re-score pass actually goes, before optimising the reads in #1559
  • Give Banister TRIMP its own log-map denominator in #1561
  • Wire the Effort TRIMP method end to end on both platforms in #1562
  • Make the Banister Effort scale selectable, and stop the docs claiming we use it in #1563
  • Correct stale cross-platform twin comments by @bhelm in #1531
  • The report-completeness "parity test" could not detect the drift it guarded in #1564
  • Score a workout against the same HRmax as the day containing it in #1565
  • Log what each workout's Effort was scored against, and whether the strap saw it in #1566
  • Give every scoring pass a device registry, and say so on both platforms when there isn't one in #1567
  • Say which gate ate the workout when a day detects none in #1574
  • Stop an active trace from disabling the re-score reuse cache in #1575
  • Stop rendering a one-way permission as a two-way switch in #1577
  • Coalesce HealthKit observer wakes, and measure the path while we're here in #1578
  • Put the exponential Effort toggle where someone looking for it would look in #1580
  • Fix WHOOP 5 steps calibration prompt (#1523) by @kavemang in #1579
  • A 5/MG never sees the steps-calibration prompt, coefficient or not in #1582
  • Route blank Android Steps tile to calibration (#1515) by @kavemang in #1581
  • Oura SpO2 candidate tile + Deep Timeline single-channel fix (rebase of #1568) in #1584
  • Detect Oura the same way on both platforms in #1585
  • fix(android): preserve More in back navigation by @SpurgtBror in #1571
  • Record VO₂max estimator provenance by @kavemang in #1586
  • Preserve PPG burst boundaries by @kvnloo in #1583
  • Assert the migration chain has no holes in #1588
  • Add pause and discard controls for live workouts by @bhelm in #1533
  • Android: keep "Keep NOOP alive overnight" a switch, with a working off in #1592
  • Android: make "Keep NOOP alive overnight" a one-way prompt in #1594
  • fix(oura): SpO2 candidate fallback missing from the "Your Cards" by @pipiche38 in #1590
  • Android: make the SpO₂-candidate display toggle take effect in #1595
  • Explorer: share the cross-catalog scan instead of redoing it per open in #1596
  • Diagnostics: hunt the 5/MG strap serial in the GET_HELLO block (#1303) in #1597
  • Effort funnel: report the longest and mean bridged run in #1603
  • Android: match the Workouts action-row buttons (#1602) in #1604
  • Android: fill imported workout HR under the active strap (#1601) in #1606
  • Android: name the day on a chart's scrub read-out (#1600) in #1607
  • Android: give the Blood Oxygen tile a trend to draw (#1599) in #1608
  • Don't derive or report a clock correlation on a WHOOP 5/MG in #1609
  • fix(oura): SpO2 candidate mean floors instead of rounds (Swift+Kotlin) by @pipiche38 in #1591
  • Keep the WHOOP 4.0 device key out of the strap log in #1610
  • Android: let the phone smart alarm skip chosen days in #1612
  • Trace the baseline fold, so a log can say why a spread never lifted in #1615
  • i18n audit: count plural entries as translated in the coverage summary in #1616

New Contributors

Full Changelog: v10.5.0...v10.6.0


Downloads — NOOP Staging identity, installs beside the official app (separate data):

  • Android — NOOP-android-v10.6.0.apk (com.noop.whoop.staging)
  • macOS — NOOP-macos-v10.6.0.zip (unzip, then right-click → Open)
  • iOS — NOOP-ios-unsigned-v10.6.0.ipa (AltStore / Sideloadly)