Dismiss stale exercise flows on remote resolution; unfreeze the cover

Two stale-UI traps in the run flow (BULLETPROOFING.md M2, M3):

A log resolved remotely (completed or skipped on the other device) left
the open exercise screen live - its next recorded set wrote the log
back to in-progress, resurrecting it through the per-log merge. Both
platforms' ExerciseProgressView now observe the log's status and
dismiss on a remote terminal flip (a locallyResolved flag exempts the
screen's own Done / flow hand-off). The watch also gains the phone's
startsSkipped terminal page, so opening a skipped exercise shows a
static badge instead of a live flow.

The live-mirror cover ran the flow engine with no onAdvance host, so an
auto-advance split's terminal between-exercise rest completed the
exercise then froze at 0:00. With no hand-off host it now dismisses
instead; the driver's next-exercise frame re-presents the cover.

Claude-Session: https://claude.ai/code/session_01PVNBVKp5bcq52X722uMjwT
This commit is contained in:
2026-07-09 23:09:50 -04:00
parent 25a111a6b4
commit 62a2882f0e
4 changed files with 82 additions and 8 deletions
+6
View File
@@ -12,6 +12,12 @@ Putting the iPhone away with an editor still open no longer leaves the workout s
Syncing to the watch no longer silently stops when a large workout history makes the update too big to send.
An exercise finished or ended early on one device now closes its still-open timer screen on the other, instead of the stale screen reviving the exercise.
Opening a skipped exercise on the watch now shows a gray Skipped badge instead of dropping back into its timers.
The mirrored workout view no longer freezes on a spent rest countdown when the other device drives an auto-advancing split.
A new Cardio exercise and matching starter split let you log aerobic sessions, tracked on your Apple Watch as a cardio workout.
A new Auto-Advance option lets a split flow hands-free from one exercise to the next, resting automatically between them.