Skip to content

NOOP AI 10.1.1

Choose a tag to compare

@github-actions github-actions released this 17 Aug 19:12

NOOP AI 10.1.1

This is a launch-performance and analysis-correctness release for people with large local histories.
The app now gets a bounded recent snapshot onto the screen before it starts maintenance, while the
analysis cache tracks every input that can change a score instead of treating heart rate alone as
proof that a day is unchanged.

Faster, bounded launch

  • The first screen reads 120 recent days, not the entire archive. Root views no longer start their
    own competing full refreshes. Plans, goals, coach indexing, HealthKit work and historical maintenance
    begin only after the recent snapshot has been published.
  • Concurrent refresh requests share one flight. Equal and covered ranges join the same repository
    work instead of materialising the same database rows more than once.
  • Historical repairs left the synchronous launch path. Timestamp healing is bounded to affected
    intervals, and the Effort migration walks small newest-first batches without hiding old scores.
  • Workout heart-rate reconciliation is budgeted. Only visible workouts receive the expensive
    per-workout heart-rate read; plan and goal queries use the stored workout rows directly.

On the 1.7 GB test library that prompted this work, the recent refresh completed in about 1.3 seconds
in the observed debug run. That is a measurement from one device, not a universal launch-time promise.

Correct incremental analysis

  • One serialized coordinator owns analysis. Launch, device adoption, backfill and HealthKit requests
    merge into ordered generations. A caller waits for the generation that covers its request, and a
    migration is marked complete only after its work succeeds.
  • Every scoring input can invalidate a day. The store now maintains transactional revisions for
    heart rate and PPG heart rate, R-R, respiration, gravity, steps, skin temperature, SpO₂, wrist/sleep
    state, V18 auxiliary inputs and externally supplied or user-edited sleep sessions.
  • Fingerprints include semantics, not only rows. Device ownership, scoring version, profile and
    configuration values, learned traits and baseline carry state participate. Old HR-only fingerprints
    are treated as stale rather than trusted indefinitely.
  • Duplicate input stays a no-op. Replaying an already-banked offload, persisting computed outputs or
    writing back to HealthKit does not advance the raw-input revision.

Complete dense streams and less repeated work

  • The semantic 200,000-row limits are gone. A regression fixture with 200,001 R-R rows proves that
    the newest tail is processed instead of silently disappearing.
  • The largest repeated array scans are linearized. Sleep and recovery windows use sorted slices,
    bucket distribution and one-pass aggregation rather than filtering a complete 100k–250k stream for
    every epoch or five-minute window.
  • Workout de-duplication is time ordered. Large collections of similar walking workouts no longer
    compare every row with every other row.
  • Diagnostics name their real phases. Raw reads and the analysis pipeline are reported separately;
    the old ambiguous post bucket is gone.

HealthKit and compatibility

  • NOOP writes carry a stable origin marker. Imports reject the current app source and the marker;
    older NOOP samples remain excluded client-side through their noop: external UUID.
  • HealthKit imports remain anchored. Relaunches continue from the saved anchor rather than querying
    the complete Health history.
  • The database migration is additive. Analysis-revision tables and nullable fingerprint fields are
    added without deleting or rewriting user history. A compatibility test opens the migrated database
    with RyanBR's v37 migrator, so existing Apple .noopbak backups remain readable there.

What to expect after updating

The first 10.1.1 launch can perform a one-time 21-day refresh in the background because legacy
fingerprints are intentionally not trusted. The interface is available while it runs, and subsequent
passes reuse unchanged days. Very dense histories can still make that first background pass CPU-heavy;
cursor-paged raw reads and the planned three-day raw chunk cache remain follow-up work.

No stored history is removed, and the release does not require a fresh import.

Validation

  • StrandAnalytics: 1,450 tests passed.
  • WhoopStore: 426 tests passed, with one environment-dependent test skipped.
  • Dense R-R tail, scoring-stream invalidation, duplicate-offload, migration compatibility and HealthKit
    origin tests passed.
  • The macOS app and generic-device iOS app both built successfully.