Detail for a workout UUID from sessions. Includes source/device, indoor flag, pool length, elevation gain, laps, classified segments, paired pause intervals, a swimming summary and reduced series when accessible in HealthKit. Summaries, events and zones are permanent; only raw series expire after 30 days. The iPhone must sync with a version that collects detail. raw_available and summary_available distinguish coverage. synced_at is the server ingestion time when recorded; older summaries fall back to the R2 object upload time (which may be the storage migration time). not_available means not synced. HR zones estimate active bucket time (excluding pauses) using one unambiguous HR source and six percent-max bands, including zone 0 below 50%. max_hr can override the observed personal workout maximum; observed maximum is an estimate, not a tested physiological maximum. Missing buckets are excluded and coverage is reported. Values[i] covers seconds [(offset+i)*interval_s, (offset+i+1)interval_s) from workout start, clipped at elapsed_s; null is missing. Each series has its own source, do not sum or average duplicate metrics across sources. Averages are weighted by sample overlap; sums are prorated across buckets. Gaps and sampling limit precision, including time in HR zones. Events are normalized before pagination: pause/resume pairs become one pause with pause_kind and end_reason; unmatched resumes are marked, and trailing pauses end at workout end. Segment distance_basis distinguishes metadata from bucket estimates; distance_split labels are distance matches, not guaranteed native types. swimming_summary uses lap intervals minus the union of recorded pauses; gaps outside laps count as inferred rest. It preserves swimming_s, total_rest_s and pace_s_per_100m. wall_gaps exposes every consecutive unique lap transition (after_lap is 1-based, gap_s is next start minus previous end, manual_pause includes boundary/spanning pauses). sets contains HealthKit segments covering complete laps, with segment_kind=set and distance_m=pool_length_mlaps (null without pool length), never series estimates. Continuity joins gaps without manual pauses at or below tolerance: nearest-rank P90 of non-manual gaps from 0 to 15s plus 1s, clamped to 3–12s; fewer than 6 candidates falls back to 10s. wall_tolerance_s overrides this with a fixed 0–300s value. continuity_rule returns method, tolerance_s and candidate count. This is a heuristic, not proof that short gaps were turns. longest_continuous selects maximum distance, fastest duration on ties (tie_count includes the winner); otherwise selects duration, retaining selected_by. It adds laps and pace_s_per_100m. Continuous duration and pace include tolerated wall gaps, while swimming/rest totals retain their existing meaning. Pauses within laps still split them, with distance prorated by active time; laps counts contributing lengths, including partial ones. continuous_stretches lists all stretches >=100m chronologically with offset_s, distance_m, duration_s, pace_s_per_100m and laps. healthkit_set_disagrees flags a set split by this rule when its internal gaps have no manual pause and none exceeds 15s; diagnostic only. Continuity is recalculated from permanent events on every request, including after raw expiry. Distance uses lap/pool length or one distance series, with its basis exposed. Missing or overlapping/legacy point laps make the summary unavailable, not zero. The full summary is repeated on every page, even with metrics: []. Active duration does not measure moving time. Follow next_offset and next_event_offset independently. No GPS route/altitude series or inferred sensor identity is included.