Conversation
…taged the screen The funnel replays V1's classifier while every shipped install stages with V2 (default-on flag), and its summary read as an explanation of the displayed hypnogram. On a 5/MG the gap is maximal — V1's primary REM gate needs the raw resp channel that hardware never emits, while V2 recovers respiration from R-R — observed in the field as 46 min funnel vs 231 min screen for one night. Suffix the summary with both stager identities, byte-identical on both platforms, so the two readouts can no longer be mistaken for one fact. Refs ryanbr#2365
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The strap-log REM funnel replays the V1 classifier, while every shipped install stages the
displayed hypnogram with V2 (the selector flag is default-on). The funnel's summary therefore
reads as an explanation of a hypnogram the app does not show — and on a 5/MG the two numbers can be
far apart, because V1's primary REM gate needs the raw resp channel that hardware never emits, while
V2 recovers respiration regularity from R-R.
Field observation that motivated this (details in #2365): two consecutive nights on a WHOOP MG
(fw 50.39.1.0) where the funnel reported ~42–46 min REM against 4h54 / 3h51 on the sleep screen.
This PR makes the diagnostic name what it ran: the funnel line gains the suffix
· funnel replays V1; screen staged by V2 — totals can differ(V2 keyed off the actualPuffinExperimentflag; when the flag selects V1 the suffix names V1 and drops the caveat). Itchanges no analytics value and no displayed metric — only the diagnostic sentence, per the
"two readouts of one fact must not be able to disagree" rule.
Both platforms
The suffix is byte-identical in
Strand/System/DebugDataDiagnostics.swiftandandroid/…/testcentre/AndroidDiagnostics.kt, keyed off the same default-on flag on each side.Verification
Strand(macOS) scheme locally withxcodebuild … CODE_SIGNING_ALLOWED=NO build— succeeds. (The
NOOPiOSleg is not buildable on my machine — watchOS 26.2 SDK absent — the fileis shared and has no platform conditionals in the touched region.)
android.ymlcovers compile + unit tests on this PR.The change is a string suffix on an existing diagnostic line; no test asserts the summary's exact
tail (the partition-sum pins in
SleepStagerTests/ the Kotlin twin are untouched).Refs #2365.