Skip to content

docs(oura): recording is motion-gated, and 0x50 MET tracks a varying input - #1060

Open
pipiche38 wants to merge 1 commit into
ryanbr:mainfrom
pipiche38:docs/oura-motion-gating-met-validation
Open

docs(oura): recording is motion-gated, and 0x50 MET tracks a varying input#1060
pipiche38 wants to merge 1 commit into
ryanbr:mainfrom
pipiche38:docs/oura-motion-gating-met-validation

Conversation

@pipiche38

Copy link
Copy Markdown

Documents three findings about the Oura Gen 3 wire streams from a ground-truth session on 2026-08-02, and records why an earlier-looking correlation on 0x7E is an artifact rather than a result.

What this adds

Recording is motion-gated. The ring does not log on a fixed wall-clock cadence — it stops emitting when the wearer stops moving. On an 86-min flat 6.5 km walk containing a deliberate ~3-min standing stop, 0x7E/0x7F (174 s), 0x47 (150 s) and 0x50 (240 s) went silent together across the stop and resumed at their normal cadence. Three independent streams agreeing rules out a decode drop or a drain artifact.

The consequence matters to anything consuming these streams: a gap must be read as "no motion", not as missing data to interpolate over, and a "samples × cadence" product is not a wall-clock duration. It also re-explains the 0x50 logging holes noted earlier in §6.13 as quiet periods rather than dropped records.

0x47 low_intensity / motion_seconds saturate. Both cap at 29 within a 30 s record; across 168 records of continuous 4.6 km·h⁻¹ walking, 65 % and 82 % of samples sit at ≥ 27. They count seconds containing motion, not an amount or rate of motion — so a step count or cadence cannot be recovered from 0x47 at any scale factor. This is a structural reason independent of the ground-truth test already recorded, and it applies to a Tier-A stream, so a better decode will not fix it.

0x50 MET tracks a varying input. Against the deliberate stop, MET falls to a resting floor when the feet stop and recovers when they restart: r = 0.860 over 88 minutes, and — the part that matters — robust: dropping the 3 lowest-activity samples leaves r = 0.777, where the 0x7E field collapses 0.912 → 0.256 under the same test.

This is the transition evidence CLAUDE.md asks for ("prove the method tracks a varying input"), as distinct from the earlier level match which could not exclude a coincidental fit. Two caveats are kept explicit in the text: MET lags ~1 min on recovery, and this validates that MET tracks intensity, not that its absolute scale is calibrated. It stays Tier B and unscored.

Why the 0x7E r = 0.912 is not a result. Recorded so it is not rediscovered later and mistaken for validation: the input barely varied (98 % of samples effectively identical), and the one interval with real contrast produced no rows at all because recording is motion-gated. A useful step-decoder test needs cadence variation — mixed slow/fast walking, stairs, walk/jog intervals — not a longer metronomic walk.

Verification

  • Documentation only. No code, no stored data, no test changes — the diff is docs/OURA_PROTOCOL.md, +87 / −0.
  • Branched directly off main, so it is purely additive and does not touch 73c1dd8 (Say what the Oura SpO2 unit tag actually means, and correct the mapping table (#1043) #1045) or any other v9.3.1 work.
  • Findings come from a live Gen 3 ring paired to NOOP, with per-second cadence ground truth from a Suunto .fit for the same walk; every figure quoted is from that session's decoded streams.
  • No CI job covers docs/; swift-packages is unaffected as no package source changes.

…input

Records three findings from a 2026-08-02 ground-truth session on a live Gen 3
ring: an 86-min flat 6.5 km walk at 4.6 km/h containing a deliberate ~3-min
standing stop, against per-second cadence from a Suunto .fit.

RECORDING IS MOTION-GATED. The ring does not log on a fixed wall-clock cadence;
it stops emitting when the wearer stops moving. Across the stop, 0x7E/0x7F
(174 s), 0x47 (150 s) and 0x50 (240 s) went silent together and resumed at their
normal cadence. Three independent streams agreeing rules out a decode drop or a
drain artifact. The consequence matters to any consumer: a gap must be read as
"no motion", not as missing data to interpolate over, and a "samples x cadence"
product is not a wall-clock duration. It also re-explains the 0x50 logging holes
noted earlier as quiet periods rather than dropped records.

0x47 low_intensity / motion_seconds SATURATE. Both cap at 29 within a 30 s
record; over 168 records of continuous walking, 65% and 82% of samples sit at
>= 27. They count seconds containing motion, not an amount or rate of it, so a
step count or cadence cannot be recovered from 0x47 at any scale factor. This is
a structural reason independent of the ground-truth test already recorded, and it
applies to a Tier-A stream, so a better decode will not fix it.

0x50 MET TRACKS A VARYING INPUT. Against the deliberate stop, MET falls to a
resting floor when the feet stop and recovers when they restart: r = 0.860 over
88 minutes, and robust -- dropping the 3 lowest-activity samples leaves r = 0.777,
where the 0x7E field collapses 0.912 -> 0.256 under the same test. This is the
transition evidence the analytics guidance in CLAUDE.md asks for, as distinct from
the earlier level match. Two caveats stay explicit: MET lags ~1 min on recovery,
and this validates that MET tracks intensity, NOT that its absolute scale is
calibrated, so it remains Tier B and unscored.

Also records why that 0x7E r = 0.912 is an artifact rather than a result -- the
input barely varied, and the one interval with real contrast produced no rows
because recording is motion-gated -- so it is not rediscovered later and mistaken
for validation. A useful step-decoder test needs cadence VARIATION, not a longer
metronomic walk.

Documentation only: no code, no stored data, no test changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@pipiche38

Copy link
Copy Markdown
Author

@ryanbr would appreciate if you could review and merge it if possible ?

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.

1 participant