Skip to content

Show evidence behind readiness signals#233

Closed
khalilkm01 wants to merge 1 commit into
NoopApp:mainfrom
khalilkm01:feature/readiness-driver-detail
Closed

Show evidence behind readiness signals#233
khalilkm01 wants to merge 1 commit into
NoopApp:mainfrom
khalilkm01:feature/readiness-driver-detail

Conversation

@khalilkm01

Copy link
Copy Markdown

Summary

  • add evidence text to ReadinessEngine signals, such as HRV vs baseline, resting HR vs baseline, respiratory rate vs baseline, and 7d/28d load
  • show that evidence inside the existing Today Readiness card on macOS and Android
  • keep the change inside the current readiness abstraction instead of adding a parallel recovery coach

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/StrandAnalytics
  • git diff --check
  • xcodegen generate
  • xcodebuild 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'

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.
@NoopApp

NoopApp commented Jun 13, 2026

Copy link
Copy Markdown
Owner

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 evidence on Signal, populated at each site).

Two things before it lands: it's Swift-only, so I'll mirror the same evidence onto the Android ReadinessEngine for cross-platform parity (we keep the two byte-aligned) and wire it through the signal UI on both. And as with every contribution here, I'll reimplement it under the project identity rather than merge the branch — that keeps authorship single-source for the project's anonymity, and is no reflection on the patch, which is spot on. It'll ship in an upcoming release with credit to you. Thank you — this is exactly the honesty-first kind of touch NOOP is for.

NoopApp added a commit that referenced this pull request Jun 13, 2026
… 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).
@NoopApp

NoopApp commented Jun 13, 2026

Copy link
Copy Markdown
Owner

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.

@NoopApp NoopApp closed this Jun 13, 2026
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