session["end"].nil? was the active signal since this was first built, on the assumption Garmin leaves it unset until the activity actually stops. Checked directly against a real still-recording session today (2026-09-20): end was already non-nil, set to exactly start + 24h — the share link's own expiry, not an end time — so every currently-active session was showing as "Ended". A genuinely ended session's end does hold its real end time (confirmed against the 2026-09-06 session this was originally, and only, verified against), which is what made the bug easy to miss. Recency of the last track point is a directly-observable signal instead of reverse-engineering what a given `end` value means: Garmin posts one roughly every postTrackPointFrequency seconds (~15, observed) while genuinely still recording.