diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d41ca5..35e9ee7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ Development opened after stable v0.1.3 release. +- Implemented the loopback-only Web Analyse V1 workspace and shared bounded + Core read model. The 7/30/90-day and all-history filters, factual activity, + active-Program progress, compatible exercise metrics, explicit persisted + MAX results, primary BODY ZONE exposures, and fourteen body measurements are + calculated by the C17 backend. Dashboard summaries consume the same model + while preserving all existing tile identities and layout behavior. Deep + links, safe query fallbacks, null/empty states, French/English presentation, + keyboard focus, and responsive charts are covered without estimating 1RM, + readiness, fatigue, recovery, body fat, or performance. + ## 0.1.3 — 2026-09-20 - Decoupled the Android full-generation request from the strict legacy V3 diff --git a/README.md b/README.md index fc873f1..be511c1 100644 --- a/README.md +++ b/README.md @@ -350,7 +350,8 @@ As of 2026-09-18: `WEB_DASHBOARD_V1=PASS/FROZEN` and `TRAINLOG_WEB_SESSIONS_V1=PASS/FROZEN`; `/programmes` is an operational active-Program calendar, while Sessions → Programmes remains the administration surface; - `TRAINLOG_WEB_EXERCISES_V1=PASS`; Analyse remains a placeholder; + `TRAINLOG_WEB_EXERCISES_V1=PASS`; `/analyse` now provides the 0.1.4 factual + Dashboard/Analyse read-model foundation pending visual review; - `TRAINLOG_PROGRAMS_PRESENTATION_ANDROID_DELETE_V1=PASS`: the coordinated private desktop/Android deployment, real Firefox presentation, correlated `programs-v1` deletion ACK, restart/replay, and non-resurrection checks pass; diff --git a/docs/architecture.md b/docs/architecture.md index c8bd030..6d45bbf 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -61,6 +61,14 @@ long-term history. Core owns data, persistence, business logic, calculations, read models, command services, and versioned contracts. An interface must not query tables directly to reconstruct its own business rules. +The Web Dashboard and Analyse workspace share `GET /api/v1/analysis`, backed by +one C17 read model. Period filtering, active-Program progress, compatible +exercise metrics, explicit MAX results, primary BODY ZONE exposures, and body +measurement first/last/delta calculations occur in Core. React validates the +bounded response and presents it; it does not load raw history or issue SQL. +Absent values remain null, and the model never estimates physiological or +performance scores. + Android local SQLite is a capture store, not a synchronization format. ## 2. Components diff --git a/docs/current_state.md b/docs/current_state.md index f04329c..08311a9 100644 --- a/docs/current_state.md +++ b/docs/current_state.md @@ -141,7 +141,7 @@ parallel implementation of its rules. | Private full-generation rollout | `TRAINLOG_SYNC_FINALIZATION_AND_ROLLOUT_V1=PASS` (direct MTP, one authorized phone) | | Local Web | `TRAINLOG_WEB_V1=CONTRACT_FROZEN / IMPLEMENTATION_STARTED` | | Web Exercises V1 | `TRAINLOG_WEB_EXERCISES_V1=PASS` | -| Current operational cursor | `TRAINLOG_WEB_ANALYSIS_V1` | +| Current operational cursor | `TRAINLOG_WEB_ANALYSIS_V1` (implemented, visual review pending) | | Complete synchronization gap contract | Frozen dependency contract; operational USB/Drive slices required by v0.1.2 are delivered | | Isolated synchronization test environment | `TRAINLOG_SYNC_TEST_ENV_V1=PASS/FROZEN` | | Synchronization characterization | `TRAINLOG_SYNC_CHARACTERIZATION_V1=PASS/FROZEN` | @@ -291,7 +291,24 @@ explicit proposal derivation and generation-backed Android delivery. The top-level `/programmes` route is an operational daily active-Program calendar; Sessions → Programmes remains the technical administration/import, list, detail, archive, and delete surface. `/exercices` is the operational desktop -catalogue administration surface; Analyse remains an explicit placeholder. +catalogue administration surface. `/analyse` is implemented with Overview, +Exercises, Distribution, and Measurements sections over one bounded Core read +model. Its global 7/30/90-day/all filter is applied in the backend; Dashboard +uses the same 30-day calculations for activity, active-Program progress, +exercise progression, measurements, and BODY ZONE links. + +The Analyse API validates period, exercise identity, measurement metric and +page, rejects unknown or duplicate parameters, and bounds exercises and chart +points. Missing facts remain null. Exercise output respects persisted +tracking/load modes, explicit MAX rows are never estimated, and duration, +distance, speed, external load, and external volume appear only when their +source observations support them. BODY ZONES are labelled as recorded primary +zone exposures/associated sets rather than physiological percentages. All +fourteen stored body metrics expose period-first, period-last, and an absolute +delta only with at least two points. The route and Dashboard deep links have +safe invalid-query fallbacks, French/English labels, keyboard controls, and +responsive no-overflow layouts. Visual inspection remains pending before any +freeze marker. Exercises uses bounded Core-owned list/detail reads, canonical name normalization, BODY ZONES taxonomy, profiled creation/update commands and @@ -587,9 +604,8 @@ tests, Android debug assembly, and 211 Android tests (207 passed, four optional historical-fixture skips). Strict desktop builds use Clang 22.1.8; the compared pre-existing GCC 16.2.1 Web warning gate remains documented rather than green. -- `TRAINLOG_WEB_EXERCISES_V1=PASS`. The next planned work is - `TRAINLOG_ANDROID_UI_REDESIGN_V1`; it remains unimplemented. Analyse remains - a placeholder and is not a v0.1.3 priority. +- `TRAINLOG_WEB_EXERCISES_V1=PASS`. `TRAINLOG_WEB_ANALYSIS_V1` is implemented + on the 0.1.4 branch and awaits the requested Dashboard/Analyse visual review. - `APP_SHELL_V1` retains a recorded legacy visual/accessibility review gate; its observations are inputs to, not decisions for, the new 0.1.3 Android contract. - Session Generator V1 is hidden while V2 planning semantics are developed. diff --git a/docs/roadmap.md b/docs/roadmap.md index b261de6..557ca08 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -43,9 +43,9 @@ tile rendering exist. The Dashboard's bounded progression and BODY ZONES visualizations and Sessions V1 are implemented. The top-level `/programmes` route is an operational daily active-Program calendar, while Sessions → Programmes remains the technical administration/import, list, -detail, archive, and delete surface. Web Exercises V1 is implemented; Analyse -remains a placeholder outside this cycle unless a later explicit decision -changes that order. +detail, archive, and delete surface. Web Exercises V1 is implemented. The +0.1.4 `TRAINLOG_WEB_ANALYSIS_V1` branch now owns the factual Dashboard/Analyse +read-model foundation and stops before merge for visual inspection. The corrective prepared-item projection, bounded phase-owned MTP outbox, Sessions presentation correction, local date preference and durable preparation withdrawal are implemented. The withdrawal uses the separate versioned @@ -54,12 +54,12 @@ mobile snapshot or `TRAINLOG_FORMAT_V1` contracts. ## Current cursor -The v0.1.3 development cursor proceeds from the closed stable v0.1.2 baseline -and its validated Web, Program execution, USB/Drive generation, ACK, and -causal-deletion contracts without reopening those completed gates. +The v0.1.4 cursor proceeds from stable v0.1.3 and its validated Web, Program +execution, USB/Drive generation, ACK, and causal-deletion contracts without +reopening those completed gates. ```text -CURRENT_OPERATIONAL_CURSOR=TRAINLOG_ANDROID_UI_REDESIGN_V1_CONTRACT +CURRENT_OPERATIONAL_CURSOR=TRAINLOG_WEB_ANALYSIS_V1 ``` The focused `TRAINLOG_SYNC_CAUSAL_DELETE_V1_CLOSEOUT` is complete before this diff --git a/docs/tests.md b/docs/tests.md index 47c2233..1d296cc 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -1,5 +1,14 @@ # Tests and validation +`web_analysis` covers empty history, every 7/30/90/all period selector, +loaded and unloaded repetitions, continuous duration/distance/speed, explicit +persisted MAX, multiple primary BODY ZONES, partial measurements, one- and +multiple-point measurement semantics, and active-Program projection. The HTTP +suite exercises the real bounded endpoint plus invalid and duplicate query +parameters. Vitest validates the typed parser, null preservation, route and +section changes, period/exercise/metric selection, invalid deep-link fallback, +critical French/English labels, and Dashboard layout regressions. + `test_sync_drive_transport` proves Drive artifact-before-manifest and manifest-before-reference publication, rejects unsafe/AI namespaces, and keeps a partial generation invisible. Orchestrator coverage proves that Drive mirror