2.6 KiB
Sleep awake selection and PDF V1 evidence
TRAINLOG_SLEEP_AWAKE_SELECTION_PDF_V1=PASS on 2026-09-24.
The Web now derives the agenda, selected-night heart-rate overlay, and vector
PDF rows from one pure temporal projection. It retains every structured
long_awake interval separately from point-in-time night_get_up events,
medication intakes, and sleep ranges. Factual sleep intervals determine sleep
duration when present. Otherwise the displayed Couché +45 minutes to Levé -10
minutes range supplies a presentation-only duration after subtracting the union
of overlapping structured awakenings; no estimate is persisted.
One agenda row is the effective selection. A click updates the detail dates, editor snapshot, and HR context in memory without issuing a write. PDF preview and download receive the same one-entry snapshot, and all observations are recomputed from that subset. Before an explicit click, the active night or the first deterministically ordered row is the documented fallback.
Automated validation
- Web targeted suites: 34/34 passed.
- Complete Web suite: 208/208 passed.
npm run typecheck: passed.npm run build: passed.- Embedded production bundle
meson compile -C build: passed. - The tests cover multiple awakening intervals in agenda/HR projection, exact factual sleep duration, estimated duration with awakening subtraction, selection dates/HR identity, no write on selection, identical preview/export subsets, PDF interval geometry, medications, point markers, and no-HR fallback without an invented BPM curve.
Read-only real-data smoke
The rebuilt user Web service was exercised through real headless Firefox at
http://trainlog.perf/analyse?section=sleep without a Sleep mutation.
- The real 2026-09-23 → 2026-09-24 row contains no factual
sleepinterval; its displayed estimated band now reports5 h 14 min 16 s, not—. - The real 2026-09-22 → 2026-09-23 row renders its structured awakening in both the agenda and the no-invented-HR detail overlay.
- Selecting that row updates the detail inputs to exactly 2026-09-22 and 2026-09-23.
- Firefox export produced one PDF page whose extracted text contains only
22/09/2026,au 23/09/2026, and1 nuit; it contains no 24/09 row. - The selected-subset observation is
Sommeil déclaré : 6 h,Longs réveils : 1,Siestes : 1, andPrises de médicaments : 7. - Raster inspection confirms the long-awake band remains visibly distinct inside the sleep timeline and point/medication markers retain their positions.
The change affects no database schema, synchronization artifact, frozen format, or Android behavior.