← All changes
Additions
- Chain workouts. From
WorkoutDetailView, queue multiple templates into one session. Warm-up blocks of every template after the first are filtered out so the warm-up isn’t repeated. OneHKWorkoutSession, one Strava upload, one summary. - Mid-session add-set. Once the planned sets for an exercise are
complete, the runner offers an “add another set” affordance; the new
SetLogis seeded from the last set’s actuals. TheSessionSummaryand the “SET N OF M” caption both render the extras correctly. - Repeat-previous cascade. Tapping the “Repeat previous ↖” ghost
now propagates the previous set’s reps / weight / duration to every
uncompleted set in the same exercise (reusing the existing
applyRepsToRemainingSets/applyWeightToRemainingSets/applyDurationToRemainingSetspropagators). - Drill into an exercise from a workout preview.
WorkoutDetailView’s exercise rows now tap intoExerciseDetailView(with the existing “Search on YouTube” fallback) so you can scout an exercise before starting. - Band preset on
WeightStepper. Empty weight cells inEditWorkoutViewget a “Band” chip that opens the same Light / Medium / HeavyBandPickergrid the runner uses. No schema or decode changes —Weight.band(String)was already wired end-to-end.
Watch HR resilience
- HealthKit fallback at save time. The phone now queries HealthKit
for HR samples in the workout window and merges them with the
live-streamed buffer (dedupe by timestamp), so dropped
WCSessionmessages no longer leave theHKWorkoutwithout a BPM timeline. - Queued HR transport. The watch switched from
sendMessageData/updateApplicationContext(last-write-wins) totransferUserInfo(queued, ordered, no overwrite) — short reachability drops no longer eat samples. - Watch link diagnostics. New
WatchLinkDiagnosticsservice: structured event ring buffer +os.Loggermirror + per-session JSON snapshot. Settings → Diagnostics → Watch link log shows reachability, HR streaming, transport, workout, and save events with category filters and a plain-text Share export.
Tests
Coverage for addSet, previousValues out-of-range fallback, and
chained-template synthesis.