Show evidence behind readiness signals#233
Conversation
The previous recovery-coach direction duplicated the readiness model, which upstream rightly declined. This keeps the value in the existing ReadinessEngine instead: every signal now carries the exact value-vs-baseline or load evidence behind the call. The Today readiness card shows that evidence inline on macOS and Android without adding a second recovery surface, so users can see why the engine is leaning primed, balanced, strained, or rundown.
|
This is a lovely addition, @khalilkm01 — surfacing the actual numbers behind each readiness signal ("48 vs 52 ms", the acute:chronic split, "monotony 2.1") makes the call far more trustworthy than a bare label, and the shape is clean (an optional Two things before it lands: it's Swift-only, so I'll mirror the same |
… iOS Explore nav (#199) - Readiness evidence (#233, khalilkm01, reimplemented under project identity): each Signal carries an optional `evidence` string with the numbers behind it (HRV "72 vs 60 ms", ACWR "7d/28d", monotony) rendered under the signal. Swift + Android parity (matched formats; Android fmt 0-decimal uses Math.round to match Swift's Int(rounded())). Tests both lanes. - Health Connect distance (#215, pilleuspulcher-blip): per-workout DistanceRecord matching is now overlap-tolerant — a buffered read window catches a relay app's offset cumulative record, clipped to the session so a neighbour can't over-count. - iOS Explore navigation (#199, sebastianwoo): MetricExplorerView wrapped itself in a NavigationStack, which nested inside the More tab's stack on iOS and bounced a metric tap back to More. NavigationStack is now macOS-only; iOS uses the ambient stack so drill-in works. Bumps to 2.8.7 (macOS CFBundle 95 / iOS 50 / Android versionCode 137).
|
Shipped in v2.8.7 🎉 — reimplemented under the project identity with full Android parity, and the evidence line now renders under each signal on both platforms. Credit's in the release notes. Thank you, @khalilkm01 — seeing the numbers behind a flag (HRV 72 vs 60 ms, the 7d/28d split) is a genuinely more honest readiness read. Closing as done. |
Summary
Issue / root cause
The earlier recovery-coach direction duplicated an engine the app already has. The useful part was not a second model; it was clearer driver attribution so users can understand why Readiness says primed, balanced, strained, or rundown.
Impact
Users get exact, local, non-medical context for each readiness signal without changing the scoring algorithm or adding a new surface to maintain.
Checks
swift test --package-path Packages/StrandAnalyticsgit diff --checkxcodegen generatexcodebuild build -scheme Strand -configuration Debug -destination 'platform=macOS,arch=arm64' CODE_SIGNING_ALLOWED=NO./gradlew --no-daemon --console=plain :app:testFullDebugUnitTest --tests 'com.noop.analytics.ReadinessEngineTest'