Skip to content

backfill: name the unbonded-offload probe in the deferral diagnostic (#1802) - #1963

Merged
ryanbr merged 1 commit into
ryanbr:mainfrom
evoveotech:fix/1802-backfill-deferral-probe-discoverability
Sep 7, 2026
Merged

ryanbr merged 1 commit into
ryanbr:mainfrom
evoveotech:fix/1802-backfill-deferral-probe-discoverability

Conversation

@evoveotech

Copy link
Copy Markdown

Summary

  • On a WHOOP 5/MG that cannot bond, the backfill deferral diagnostic explains the dead end accurately and then stops, without naming the one action that exists: the "Try history sync without pairing" experiment in Test Centre, designed for precisely this strap in precisely this state. Its stage 3 is SET_CLOCK — the thing the diagnostic says never runs.
  • A field report showed an install that had gone weeks in this state while the strap sat in exactly the condition the probe requires. No motion, no steps, no workouts, no Rest, and no route to the one measurement that would settle whether any of it is recoverable.
  • The fix extends backfillDeferredLine with two new parameters (unbondedProbeOptedIn, unbondedProbeRetired) and appends a hint when the structural-unreachable case applies (WHOOP5, unbonded, no hello written):
  • The probe stays opt-in and self-limiting; this is about discoverability, not about running it automatically. The hint does not promise an answer — 5/MG unbonded-offload probe reads its own local teardown as a strap refusal, and latches on it #1804 showed a local teardown can produce a false negative — it says where the toggle is.

Files

  • StalledLinkDiagnostics.kt — backfillDeferredLine extended with unbondedProbeOptedIn and unbondedProbeRetired parameters (default false); appends probe hint on the structural-unreachable case.
  • WhoopBleClient.kt — the beginBackfill caller now passes the probe's opt-in and retired state.
  • StalledLinkDiagnosticsTest.kt — 5 new tests covering the probe hint (not opted in, opted in, retired, non-unreachable cases, default params).

Test plan

  • ./gradlew testFullDebugUnitTest --tests "com.noop.ble.StalledLinkDiagnosticsTest" — all existing + 5 new tests
  • ./gradlew compileFullDebugKotlin — no compile errors
  • Hardware: a 5/MG in the unbonded state should now see the probe toggle named in the backfill deferral line

Generated with Devin

…yanbr#1802)

On a WHOOP 5/MG that cannot bond, the backfill deferral diagnostic explains
the dead end accurately and then stops, without naming the one action that
exists: the "Try history sync without pairing" experiment in Test Centre,
designed for precisely this strap in precisely this state. Its stage 3 is
SET_CLOCK — the thing the diagnostic says never runs.

A field report showed an install that had gone weeks in this state while the
strap sat in exactly the condition the probe requires (`helloWrittenThisLink=
false` is a precondition of the probe, not an obstacle to it). No motion, no
steps, no workouts, no Rest, and no route to the one measurement that would
settle whether any of it is recoverable.

The fix extends `backfillDeferredLine` with two new parameters
(`unbondedProbeOptedIn`, `unbondedProbeRetired`) and appends a hint when the
structural-unreachable case applies (WHOOP5, unbonded, no hello written):

- Not opted in, not retired: names the toggle and says its stage 3 is SET_CLOCK.
- Opted in: suppressed — the probe's own lines report what it found.
- Retired: names the off/on retry path, referencing ryanbr#1804's false-negative fix.

The probe stays opt-in and self-limiting; this is about discoverability, not
about running it automatically. The hint does not promise an answer — ryanbr#1804
showed a local teardown can produce a false negative — it says where the
toggle is.

The default parameter values preserve the old behaviour for any caller that
has not been updated, plus the new hint on the unreachable case.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@ryanbr
ryanbr merged commit 5428c84 into ryanbr:main Sep 7, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants