docs(train): Health Connect, written and read (ADR 0030, D31)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
2fae7e4f3b
commit
d1dc833aa6
1 changed files with 34 additions and 1 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
# ADR 0030: Halkyon Train, what it does and where its data comes from
|
# ADR 0030: Halkyon Train, what it does and where its data comes from
|
||||||
|
|
||||||
- **Status:** decided 27–28 Oct 2026, by the developer (D1–D30 below). The shell (D12)
|
- **Status:** decided 27–28 Oct 2026, by the developer (D1–D31 below). The shell (D12)
|
||||||
is built; recording (D13–D28) is built on Android, iOS waiting for a Mac; Health
|
is built; recording (D13–D28) is built on Android, iOS waiting for a Mac; Health
|
||||||
Connect (D29) comes next.
|
Connect (D29) comes next.
|
||||||
- **Numbering:** 0025 is held by the federation draft (stashed), 0026–0029 by the .NET
|
- **Numbering:** 0025 is held by the federation draft (stashed), 0026–0029 by the .NET
|
||||||
|
|
@ -484,6 +484,39 @@ Strava. What was found, 27 Oct:
|
||||||
again replaces, deleted deletes) and each record's origin. Its logic is tested on the
|
again replaces, deleted deletes) and each record's origin. Its logic is tested on the
|
||||||
JVM, the Dart side on a fake platform; Apple Health needs Swift of its own later,
|
JVM, the Dart side on a fake platform; Apple Health needs Swift of its own later,
|
||||||
as iOS waits for a Mac anyway (D25).
|
as iOS waits for a Mac anyway (D25).
|
||||||
|
- **D31 Health Connect, from turning it on to the workouts** (the developer's; 28 Oct):
|
||||||
|
- *Turning it on*: a *Health Connect* row in the account sheet (Train has no settings
|
||||||
|
yet) opens a screen with two switches, both off: *Write my workouts* and *Read from
|
||||||
|
other apps*. They are this phone's, as Health Connect is, kept per person in their
|
||||||
|
folder (`health_connect.json`, with what was written and the changes token), not
|
||||||
|
synced. Each permission is asked as its switch is turned on. Built into Android from
|
||||||
|
14; below, the row says it needs the Health Connect app. `connect-client` 1.1.0, the
|
||||||
|
stable one. The rationale Health Connect asks for is a short screen of Train's,
|
||||||
|
linked from the system's permission dialog.
|
||||||
|
- *Writing*: every workout of the person this phone holds, synced and earlier ones too;
|
||||||
|
Train's workout ID is the record's client ID and a counter its version, so an edit
|
||||||
|
replaces and a deletion deletes; imported ones are never written back. As a workout
|
||||||
|
is saved, edited or deleted, and as the app opens (what a sync brought). The session
|
||||||
|
(type, name, notes, its pauses as pause segments), its route with altitude and
|
||||||
|
accuracy, heart rate, speed and the rower's watts as samples, distance and elevation
|
||||||
|
gained as totals. No calories (no weight, no energy model yet); stroke rate has no
|
||||||
|
type there.
|
||||||
|
- *Reading*: the screen lists each app that wrote workouts there (Gadgetbridge,
|
||||||
|
Christopeit Connect), each with its own switch, off, new ones appearing as they
|
||||||
|
write; Train's permissions are per type, the filtering by app its own. As the app
|
||||||
|
opens and comes to the front, through the changes token; nothing in the background.
|
||||||
|
Turning it on asks for the history too, so older than 30 days comes in; refused, the
|
||||||
|
last 30 days only. Each session becomes a workout of Train's own store (D7: sealed,
|
||||||
|
synced), named by its app, with the samples Health Connect holds for it (heart rate,
|
||||||
|
distance, power). Another app's route asks consent per session, so none comes by
|
||||||
|
itself: an imported workout's page offers *Bring in the track*. An imported one's
|
||||||
|
name and notes can be edited, and it can be deleted, remembered on this phone so it
|
||||||
|
doesn't come back. Doubles: a session mostly overlapping one of Train's own of the
|
||||||
|
same kind isn't added; where Train's has no heart rate, the other's is added to it,
|
||||||
|
otherwise it is left out. Weight and resting heart rate wait for what uses them
|
||||||
|
(calories, zones), with the synced model they need.
|
||||||
|
- No migration: an imported workout is a workout, its origin one more field of the
|
||||||
|
sealed, versioned payload.
|
||||||
|
|
||||||
## Consequences
|
## Consequences
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue