NOOP AI 10.1.1
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 ambiguouspostbucket 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 theirnoop: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.noopbakbackups 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.