Skip to main content

Tracking app requirements (TRK-*)

@enode/tracking — the coach-facing "Pro app" for running enode velocity-based training sessions, shipped as a Capacitor iOS/Android app and PWA. Shared behavior (auth flow, i18n, units, error engine) lives in shared.md; this catalog only states what is specific to the app.

See the overview for the ID scheme and status legend. Test cases: tracking-system-tests.md.

Areas: AUTH · SCHED (today's schedule) · STATION (multi-station shell) · WORKOUT (start & pre-start editing) · LIB (template library & sharing) · LIVE (sensors & live tracking) · VIDEO · INSIGHT · FINISH · OFFLINE · SET (settings) · PLATFORM.

Auth & entry (TRK-AUTH)​

IDRequirementStatusTests
TRK-AUTH-01Sign-in and registration use the shared Pro auth flow (SHR-AUTH-01..03); on success an animated transition lands on /workouts/today.stableTRK-ST-1.1
TRK-AUTH-02A "One" user attempting to sign in is blocked (backend 314) with a message directing them to the One app.stableTRK-ST-1.2

Today's schedule (TRK-SCHED)​

IDRequirementStatusTests
TRK-SCHED-01The today pane lists the current week's scheduled and recurring workouts for the signed-in coach.stableTRK-ST-2.1
TRK-SCHED-02Pull-to-refresh reloads the schedule.stableTRK-ST-2.2
TRK-SCHED-03An empty day shows an explicit empty state; a failed load shows a "Try again" state that recovers on retry.stableTRK-ST-2.3, TRK-ST-2.4

Stations (TRK-STATION)​

IDRequirementStatusTests
TRK-STATION-01The training shell supports multiple parallel stations: one full-viewport station on phones, up to three columns on tablets.stableTRK-ST-3.1
TRK-STATION-02The user can open and close stations from the rail/spine sidebar; closing stations that no longer fit asks for confirmation.stableTRK-ST-3.2
TRK-STATION-03The number of stations allowed to record is licensed via the device-session weight; over-limit stations show a "request another slot" overlay instead of recording.stableTRK-ST-3.3
TRK-STATION-04An athlete-role user is limited to a single station.stableTRK-ST-3.4

Starting & editing workouts (TRK-WORKOUT)​

IDRequirementStatusTests
TRK-WORKOUT-01From the FAB the user can start a scheduled workout, create a new workout from scratch, or start from a template via the Library. The Library is the FAB's only template entry — there is no second flat start picker.stableTRK-ST-4.1..4.3
TRK-WORKOUT-02Before starting, the workout can be edited in the prep drawer: participants, tags, exercises and supersets, notes.stableTRK-ST-4.4
TRK-WORKOUT-03A feedback-only (sensor-only, no plan) training can be started.stableTRK-ST-4.5
TRK-WORKOUT-04A past workout can be logged after the fact (retrospective input): pick a source workout, fill in sets, upload through its own path. Flag: RETROSPECTIVE_INPUT (on).flagTRK-ST-4.6
TRK-WORKOUT-05A licence-blocked athlete can be added to a workout and is shown as a participant, but no data is ever recorded for them: the athlete picker warns before they are added, their chip is badged, and they never appear in the in-session athlete switcher. A workout whose participants are all blocked can't be started.stableTRK-ST-4.7, TRK-ST-4.8

Template library & sharing (TRK-LIB)​

Sharing model: sharing.md.

IDRequirementStatusTests
TRK-LIB-01The template Library opens as a drawer from the create FAB, the sidebar panel and the collapsed sidebar spine. It lists the coach's own workout templates and the ones colleagues share with them, and is the single template surface in the start flow (TRK-WORKOUT-01).stable
TRK-LIB-02A Mine / Internal / Public segmented picker scopes the list. It is shown only when the loaded feed can actually fill more than one segment — with nothing shared, the Library is a flat list of the user's own templates.stable
TRK-LIB-03A template the user does not own is marked with its reach glyph (building = internal, globe = public) and the author's name when the backend supplies one; without a name the badge degrades to icon-only.stable
TRK-LIB-04Search matches a template's name, its tags and the names of the exercises it contains, so a shared template can be found by its content rather than its title. An empty result offers "did you mean" suggestions.stable
TRK-LIB-05Tapping a template opens a read-only detail view: provenance, note, tags and the exercise list. Nothing on it is editable.stable
TRK-LIB-06The detail view's only action is Use template, which closes the Library and opens the normal prep drawer on an editable copy of it — deliberately not called "Start", since the actual start is the prep drawer's own button. There is no "Save a copy" — the tracking app never adds to the user's own template list; that is portal work. On a tablet, opening the Library from a station column prepares the workout in that column.stable
TRK-LIB-07A template that stops being shared while the detail view is open flips to a "No longer shared" notice with Start and Save disabled, instead of blanking or failing silently.stable
TRK-LIB-08Templates are not part of the offline snapshot: with no cached list and no connection the Library states that plainly; with a warm cache and a failed refresh it shows a staleness hint over a usable list.stable

Sensors & live tracking (TRK-LIVE)​

BLE integration details: ble.md.

IDRequirementStatusTests
TRK-LIVE-01The user can connect one or two enode SmartBar sensors to a station; pairing status is visible and a placement prompt guides sensor positioning.stableTRK-ST-5.1, TRK-ST-5.2
TRK-LIVE-02During a set, reps are detected live from the sensor stream and shown as they happen (pending-rep overlay/flash).stableTRK-ST-5.3
TRK-LIVE-03Live feedback shows the configured focus metric and a rest timer between sets.stableTRK-ST-5.4
TRK-LIVE-04Completing a set opens the complete-set sheet with detected reps, load, measurement values, and rest target; values are editable before saving.stableTRK-ST-6.1
TRK-LIVE-05The user can edit a participant's 1RM in-session, including bodyweight-based exercises.stableTRK-ST-6.2
TRK-LIVE-06Sets can be moved/reordered within the session via drag & drop.stableTRK-ST-6.3
TRK-LIVE-07The session can recommend switching exercise or stopping for rest based on performance. Flag: SWITCH_RECOMMENDATIONS.flagTRK-ST-6.4
TRK-LIVE-08Rep feedback can be spoken aloud via text-to-speech, in both active training and feedback training. Switched on per device in the Local settings sheet. Flag-gated.flagTRK-ST-6.5, TRK-ST-6.8
TRK-LIVE-11Exactly one station speaks at a time: a speaker symbol marks the station that owns the voice, tapping a muted one moves it, and the sole active station owns it without a tap.stableTRK-ST-6.8
TRK-LIVE-09A muscle-quality body view visualizes muscle load quality during the session.stableTRK-ST-6.6
TRK-LIVE-10Technique feedback mode shows the latest rep's sagittal + frontal bar path next to the focus-metric values, both over the camera and without it. Reps that carry no bar path (flywheel, or a missing raw-data stream) omit the trajectory instead of drawing an empty grid.stableTRK-ST-6.7

Video (TRK-VIDEO)​

See video-recording.md.

IDRequirementStatusTests
TRK-VIDEO-01The user can record video clips of sets with the native camera overlay during a session.stableTRK-ST-5.5
TRK-VIDEO-02Recorded clips can be reviewed in-session with a scrubbable player.stableTRK-ST-5.6

Insights (TRK-INSIGHT)​

IDRequirementStatusTests
TRK-INSIGHT-01The insights sheet shows an Overview tab summarizing the session.stableTRK-ST-7.1
TRK-INSIGHT-02The Performance tab charts per-metric / per-rep values for the session.stableTRK-ST-7.2
TRK-INSIGHT-03The Technique tab shows orientation/velocity traces; 3D force vectors are flag-gated (FORCE_VECTORS).flagTRK-ST-7.3
TRK-INSIGHT-04While history/metrics load, the insight tabs render placeholder skeletons (SKELETON_PREVIEW) — these are visual placeholders, not real data.mocked— (known behaviour)
TRK-INSIGHT-05The Technique tab opens on the most recently recorded set and follows every newly recorded set, so the split-view detail pane (tablet) stays on the set that just finished.stableTRK-ST-7.6

Finishing (TRK-FINISH)​

IDRequirementStatusTests
TRK-FINISH-01Finishing a training opens the set-review overlay where results are confirmed.stableTRK-ST-7.4
TRK-FINISH-02Confirmed results are persisted to the backend (queued offline if needed) and appear in history/portal afterwards.stableTRK-ST-7.5
TRK-FINISH-03Finishing with no completed sets asks for confirmation first — it uploads nothing and tears the station down like a discard, and the workout composition is never persisted server-side, so it would otherwise be lost silently.stableTRK-ST-7.7
TRK-FINISH-04The "Keep sensor connected?" prompt can always be backed out of (the corner close ✕, backdrop, Escape, hardware Back), returning to the training with nothing torn down.stableTRK-ST-7.8

Offline & recovery (TRK-OFFLINE)​

See offline-and-sync.md and ADR 0002-offline-training-persistence.

IDRequirementStatusTests
TRK-OFFLINE-01Losing connectivity shows the offline banner; cached "offline-ready" day bundles let cached workouts start with no network.stableTRK-ST-8.1, TRK-ST-8.2
TRK-OFFLINE-02Trainings completed offline are queued and uploaded automatically on launch, foreground, or reconnect; a pending-uploads indicator shows queued items.stableTRK-ST-8.3
TRK-OFFLINE-03After a crash or force-kill mid-training, relaunching offers to resume the interrupted training with its state restored.stableTRK-ST-8.4
TRK-OFFLINE-04Navigating back mid-training prompts a discard confirmation instead of silently leaving the session.stableTRK-ST-8.5

Settings (TRK-SET)​

IDRequirementStatusTests
TRK-SET-01Settings and profile drawers are reachable from the station spine/header; the app version is displayed.stableTRK-ST-9.1
TRK-SET-02Unit system and language switching per SHR-UNITS / SHR-I18N apply throughout the app.stableTRK-ST-9.2, TRK-ST-9.3
TRK-SET-03A cross-app link to the enode Portal exists but is hidden. Flags: PORTAL_LINK_ENABLED = false, PORTAL_WEBVIEW_ENABLED = false.flag (off)—

Platform (TRK-PLATFORM)​

IDRequirementStatusTests
TRK-PLATFORM-01The screen stays awake during an active training session.stableTRK-ST-10.1
TRK-PLATFORM-02The app runs as a standalone PWA / Capacitor app with iOS safe-area handling; API calls go through the native HTTP stack in the shell.stableTRK-ST-10.3
TRK-PLATFORM-03Debug screens (/debug/*) are unavailable in production builds (NEXT_PUBLIC_ENABLE_DEBUG_VIEW off → 404).stableTRK-ST-10.4