docs(train): the Loop's training sessions are workouts (ADR 0030, D39)

The sessions the band detects become sealed workouts with their heart
rate, origin Polar Loop; Train gains an activity Other workout; one
overlapping a recorded workout gives it its heart rate; deleted on the
band once sealed, as the days are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-28 20:03:34 +01:00
commit 06cc39025b
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1,9 +1,9 @@
# ADR 0030: Halkyon Train, what it does and where its data comes from
- **Status:** decided 27–28 Oct 2026, by the developer (D1–D38 below). The shell (D12)
- **Status:** decided 27–28 Oct 2026, by the developer (D1–D39 below). The shell (D12)
is built; recording (D13–D28) is built on Android, iOS waiting for a Mac; Health
Connect (D29–D31) is built; the Loop's setup and keeping (7a, D34–D36) and its
daily data (7b, D37, D38) are built.
daily data (7b, D37, D38) are built; its sessions (7c, D39) are being built.
- **Numbering:** 0025 is held by the federation draft (stashed), 0026–0029 by the .NET
rewrite on the local branch `rewrite-dotnet`, abandoned on 27 Oct; Train takes the next
free number so that neither is ever read as this one.
@ -689,6 +689,27 @@ Strava. What was found, 27 Oct:
yet tried with a Loop: whether the SDK's deletion includes its `until` day, and
whether the job connects to the band in the background, are for a real band.
- **D39 The Loop's training sessions are workouts** (recommended, the developer's; 28
Oct): the band records a session by itself when it detects one (at least ten minutes
of raised heart rate and movement, saved as *Other indoor* unless the person picks a
sport; Polar's manual, *Automatic training detection*), which Polar's SDK reads from
the band (`PolarTrainingSessionApi`: a summary with start, duration, sport,
calories, distance and ascent, and samples at an interval: heart rate, and speed,
distance and cadence where the band had them). Each becomes a sealed, synced
workout, its heart rate its series, its origin *Polar Loop* with the band's
reference of the session, as Health Connect's imports are (D31), so there is one
list and one page, written to Health Connect with the rest (over a model of its own
under *Days*). Train gains an activity *Other workout* for what it doesn't know,
which the person can change on the workout's page; Polar's running (sport 1),
cycling (2) and other outdoor (16, as *Other*) are the IDs the SDK itself names,
every other sport comes as *Other* until a band shows its IDs (over leaving out
what Train doesn't know, most of the band's sessions). A session overlapping a
workout Train recorded for at least half the shorter, whatever the sports, is that
workout's double: the recorded one stays and gains the band's heart rate where it
has none (over keeping both). Sessions are read with the days, by the open app and
the background job, and deleted on the band once sealed by the same rule (D38); one
deleted in Train is remembered, so it isn't brought back.
## Consequences
- Train's sensors are one pattern: open profiles read by the app itself, on the phone;