Personal Training OS: Test Cases
Scope of this suite. TC-01 through TC-20 verify the v1.0 baseline (recorded baseline run 20/20 test cases Pass on 2026-07-05, plus 7/7 UAT Accept). TC-21 through TC-27 verify the post-release increments (2a-2c Garmin activities, Garmin daily wellness metrics, and Withings weight; 3 hockey auto-schedule; 4 MyFitnessPal nutrition at per-meal grain), added and executed in run-2 on 2026-07-10 (17/17 automated Pass). That run found and fixed defect D-08 (three sync scripts wrote rows without a Person relation) and hardened the baseline cases against live-data mutation. The increments are therefore formally verified, closing the operational-evidence-only gap noted at the v1.0 baseline. This element is a documentation note, not an executable test; it carries no Parent relation and asserts no result. See pm/project-state.md for the authoritative as-built state.
A hockey session with Attendance = Did Not Attend has Counts Toward Training (auto) = false.
A hockey session with Attendance = Attended has Counts Toward Training (auto) = true.
A non-hockey session with Status = Completed has Counts Toward Training (auto) = true.
A non-hockey session with Status = Planned has Counts = false; setting Status = Completed flips it to true.
an example running shoe Total Miles = 16 (sum of Distance from the two linked runs, 11 + 5).
Linking a new run to the shoe increases Total Miles; unlinking returns it to the prior value.
Secondary User exists in People and is selectable as Person on sessions/goals/metrics.
Filtering by Person = Primary User vs Secondary User returns only that person's rows.
A hand-created session has Source = Manual.
Kettlebells, Net, Barbell, Medicine ball = Not available; Stickhandling ball = Pending; the rest Available.
The seeded Workout Templates reference only Available equipment.
Example Half Marathon = Half Marathon / Goal 2:00:00; Example 5K = 5K.
11-mile long run = 11 mi / Long; 5-mile hill repeats = 5 mi / Hills.
The 11-mile run relates to Person, Running Shoe, Running Route, and Training Block.
The Sub-2:00 goal has a Race relation to the Example Half Marathon.
A hockey session can relate to a Team A/Team B game without altering the source game DB.
The Personal Training OS page is a child of Personal Dashboard, linked below Inbox.
A session/check-in can be logged with low effort in the Notion mobile app.
The OS data can be exported from Notion and is restorable.
At least one running, one strength, and one hockey Workout Template exist, plus Hockey Drills.
Each Metrics/Check-ins row sourced from Garmin carries a garmin-metrics-<date> Source ID, an Imported At timestamp, and at least one wellness value.
Each Metrics/Check-ins row sourced from Withings carries a withings-<grpid> Source ID, a Weight value, and an Imported At timestamp.
Each Training Session row sourced from Garmin carries a Garmin Activity ID and an Imported At timestamp.
Each Training Session row sourced from the Hockey DB links a source game (Gabagools or Bacon).
Each Nutrition Log row sourced from MyFitnessPal carries an mfp-<date>-<meal> Source ID, a Meal, a Calories value, and an Imported At timestamp.
No two synced rows within a database share a Source ID, confirming idempotent upserts across the Metrics, Nutrition, and Training Sessions databases.
Every synced row (Garmin, Withings, MyFitnessPal, Hockey DB) across Metrics, Nutrition, and Training Sessions relates to a Person. This case found defect D-08; the fix and a 54-row backfill landed in run-2.