Merge branch 'train-days' into integration

# Conflicts:
#	apps/train/halkyon_train_flutter/lib/src/app/train_paths.dart
#	docs/adr/0030-halkyon-train.md
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-03 23:14:02 +01:00
commit 81adeb91cc
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1625,6 +1625,47 @@ Strava. What was found, 27 Oct:
(`lastWorkoutStart`, of the 5 newest), else on the region as before; the phone's
fix then sets the first waypoint as before (D44). From expanded windows on, the
route's details beside its map (400 px). It ran without the bar already (D60).
- **D64 A day's page, its figures, held charts and the weight** (the developer's
feedback of 3 Nov 2026; the weight's sources the developer's answer, the rest the
agent's on that feedback):
- **A day over the tabs**: Home's day (`/days/<date>`) is a route of its own above
the shell, without the navigation bar, back at the top left, each section in a
`SectionCard` over the top gradient. A section's explanation (what Nightly
Recharge's figures mean, the nervous system's −10 to +10) sits behind
halkyon_ui's `HelpButton` beside its title; the person's own values stay in sight.
- **The night's chart**: the cause of the rows drawn over Nightly Recharge and the
skin temperature was a phase starting at or after the night's end: its right edge
was clamped to `left + 1 .. width` with `left + 1` above `width`, `clamp` threw
while painting, and the canvas was left translated for everything painted after it.
The left edge now stays inside the box first.
- **Polar's no-value marks**: Nightly Recharge writes −100 or −1 where it has no
value; `Recharge.known` drops what lies outside each figure's range (the nervous
system's status outside −10..10, the recovery level outside 1..6, rates, intervals
and deviations not above or at zero), and the page shows only what remains.
- **Charts held**: a long press on a line chart (`WorkoutChart`, shared by the day's,
the workouts' and the weight's) shows a line, a dot and the exact value under the
finger, and its time where the chart knows it, following the drag, with a tick of
haptic feedback as the press takes hold.
- **Sync in Settings**: Settings' first card says where syncing stands and offers
*Sync now*, halkyon_app's `SyncStatusCard` as Learn's and Todo's, the cog badged
when syncing fails.
- **Weight**: a sealed synced table, `body_weight`, as the days' and the places':
the weight, when it was measured, and where it came from are the payload (grams as
a whole number, the time in UTC, a Health Connect record's id and app), the
server sees only the space and the ciphertext. Its migration creates the table
(`id` a UUID v7 by default, `spaceId`, `keyId`, `payload` not null, `nonce`), an
index on `spaceId` for a space's rows, and a foreign key to `offline_sync_spaces`
cascading on delete, so that an account's deletion takes its weights with its
space; then the version rows of every module. Nothing existing is changed, so
nothing is lost. Entered on Progress's *Weight* card (the plus; a comma taken as
a point, 20 to 400 kg, when measured, today by default), with its line over time
and *All* to delete one; the latest weight is also *Your body*'s, which the
band's and the zones' figures work from. Health Connect's weight records are read
in when switched on in its screen (its own permission, asked as the others), each
record once (its id kept, also after deletion), not Train's own, and not one
within 10 minutes and 0.1 kg of a weight entered here. **In kilograms alone**:
Train is metric throughout and has no units setting yet; pounds come with one,
for every figure at once.
## Consequences