Background ring re-syncs + fresh-data-gated coach notifications - #94
Merged
Merged
Conversation
2 tasks
foureight84
added a commit
to foureight84/PulseLoop
that referenced
this pull request
Jul 25, 2026
One conflict, in RingSyncCoordinator.handle(_:). Upstream (saksham2001#94/saksham2001#95/saksham2001#73) moved the "store and done" live-value cases out into a mirrorLiveValue(_:) helper reached via `default:`, while this branch had added a .wearState case to the same switch. Resolved by taking upstream's refactor and keeping only .wearState in handle(): it isn't a store-and-done mirror — it gates on family and mutates measurement flags — so it belongs in the switch proper, ahead of the default that delegates. 780 tests pass.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
AI coach check-ins fired in the background on stale data because the store was only refreshed at app open. This PR keeps the store fresh in the background —
ColmiSyncEngine.syncHistory()is now implemented, andRingSyncCoordinatorkicks a re-sync from all-day BLE data events (the wakes a suspended app actually gets) when the last completed sync is >30 min old — and gates notifications on fresh data:StaleDataPolicydefaults to.skip, and a newCoachNotificationDataTriggerfires the due slot right after a background sync completes, so check-ins become data-driven instead of time-driven-with-stale-data.Type of change
How was this tested?
PulseLoopTests) — skip-on-stale default, in-flight guard, Colmi re-sync re-entry guardPrivacy & data
Checklist