Per-sample sustained-coast mask per output channel (speed/power/cadence), computed ONCE here (it's window-independent and the pond-fill pass is the expensive part) and reused by every channel build / zoom.
Whether the source carried timestamps (so speed is meaningful).
Whether the activity has a GPS track. False for GPS-less sources (indoor / GPS-off head units): no map, distance comes from the device stream.
Derived instantaneous speed (m/s); NaN where no timestamp delta.
Elapsed seconds since the first sample.
The canonical pond series — always present (GPS or GPS-less). hasTrack
says whether it carries positions.
The streams decoded once into the per-sample arrays every downstream metric reads — track, columns, cumulative distance, derived speed, relative time. Building the pond track + reading columns is the expensive part of the summary compute, so prepareActivity does it once and both the summary (summaryFromPrepared) and the zoom-resolution profiles (windowChannels) reuse it — no second decode per zoom. Opaque shape; treat it as a handle, not a public data contract.