What problem does this solve?
PulseLoop has goals, activity rings and a readiness score, but no answer to "how well did I move today?" — the thing Oura calls an Activity Score and Ultrahuman a Movement Index. And nothing weighs this week's effort against recent normal, which is the metric WHOOP built a company on.
Every input already exists: ActivityDaily, the intraday ActivityBucketSample buckets, HR-zone boundaries, and editable goals.
Proposed solution
Movement score — four contributors scored against the user's own goals, not a population target: steps (35), active minutes (30), active energy (20), and movement spread through the day (15). The goals already exist and are already editable; a score built on a fixed 10,000 steps would tell a marathoner and someone recovering from surgery the same thing.
Exceeding a goal should never be penalised — overreaching is what training load is for.
The regularity contributor is what separates a day that hit its step goal in one gym session from one that moved throughout. 250 steps/hour (the stand-hour convention) over 08:00–22:00, judged against the hours the ring actually reported buckets for so a ring taken off at lunch isn't scored for the afternoon.
Training load — Edwards' summated heart-rate zones rather than Banister's TRIMP. Banister needs a reliable average HR over a bounded session; all-day ring data is sparse, irregularly spaced and has no session boundaries, so Edwards degrades far better. Zone floors should match the ones the workout summary already draws.
Each reading credited the gap to the next, capped adaptively — otherwise two all-day readings 12 h apart become "12 hours of zone-1 work".
Acute (7-day) vs chronic (28-day) mean daily load. Days with no readings must be excluded from both means, never counted as rest — averaging in zeros would manufacture a "detraining" reading out of a charging cable.
Belongs on the Activity tab under the rings it summarises, not on Today.
Area
UI / DesignSystem
What problem does this solve?
PulseLoop has goals, activity rings and a readiness score, but no answer to "how well did I move today?" — the thing Oura calls an Activity Score and Ultrahuman a Movement Index. And nothing weighs this week's effort against recent normal, which is the metric WHOOP built a company on.
Every input already exists:
ActivityDaily, the intradayActivityBucketSamplebuckets, HR-zone boundaries, and editable goals.Proposed solution
Movement score — four contributors scored against the user's own goals, not a population target: steps (35), active minutes (30), active energy (20), and movement spread through the day (15). The goals already exist and are already editable; a score built on a fixed 10,000 steps would tell a marathoner and someone recovering from surgery the same thing.
Exceeding a goal should never be penalised — overreaching is what training load is for.
The regularity contributor is what separates a day that hit its step goal in one gym session from one that moved throughout. 250 steps/hour (the stand-hour convention) over 08:00–22:00, judged against the hours the ring actually reported buckets for so a ring taken off at lunch isn't scored for the afternoon.
Training load — Edwards' summated heart-rate zones rather than Banister's TRIMP. Banister needs a reliable average HR over a bounded session; all-day ring data is sparse, irregularly spaced and has no session boundaries, so Edwards degrades far better. Zone floors should match the ones the workout summary already draws.
Each reading credited the gap to the next, capped adaptively — otherwise two all-day readings 12 h apart become "12 hours of zone-1 work".
Acute (7-day) vs chronic (28-day) mean daily load. Days with no readings must be excluded from both means, never counted as rest — averaging in zeros would manufacture a "detraining" reading out of a charging cable.
Belongs on the Activity tab under the rings it summarises, not on Today.
Area
UI / DesignSystem