Personal Training OS: Requirements & Traceability
Personal Training OS: Test Cases
1. Verification test cases
TC-NOTE-SCOPE
1.1. Suite scope note (2026-07-08; increments verified 2026-07-10 in run-2), not a test case UID: TC-NOTE-SCOPE METHOD: Analysis AUTOMATED: No STATEMENT:

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.

TC-01
1.2. Hockey not-attended does not count UID: TC-01 METHOD: Test AUTOMATED: Yes STATEMENT:

A hockey session with Attendance = Did Not Attend has Counts Toward Training (auto) = false.

RELATIONS (Parent):
TC-02
1.3. Hockey attended counts UID: TC-02 METHOD: Test AUTOMATED: Yes STATEMENT:

A hockey session with Attendance = Attended has Counts Toward Training (auto) = true.

RELATIONS (Parent):
TC-03
1.4. Completed run counts UID: TC-03 METHOD: Test AUTOMATED: Yes STATEMENT:

A non-hockey session with Status = Completed has Counts Toward Training (auto) = true.

RELATIONS (Parent):
TC-04
1.5. Planned session does not count UID: TC-04 METHOD: Test AUTOMATED: No STATEMENT:

A non-hockey session with Status = Planned has Counts = false; setting Status = Completed flips it to true.

RELATIONS (Parent):
TC-05
1.6. Shoe mileage rollup equals 16 UID: TC-05 METHOD: Test AUTOMATED: Yes STATEMENT:

an example running shoe Total Miles = 16 (sum of Distance from the two linked runs, 11 + 5).

RELATIONS (Parent):
TC-06
1.7. Rollup updates on new run UID: TC-06 METHOD: Test AUTOMATED: No STATEMENT:

Linking a new run to the shoe increases Total Miles; unlinking returns it to the prior value.

RELATIONS (Parent):
TC-07
1.8. Secondary User is first-class UID: TC-07 METHOD: Test AUTOMATED: Yes STATEMENT:

Secondary User exists in People and is selectable as Person on sessions/goals/metrics.

RELATIONS (Parent):
TC-08
1.9. Person filter isolates data UID: TC-08 METHOD: Test AUTOMATED: No STATEMENT:

Filtering by Person = Primary User vs Secondary User returns only that person's rows.

RELATIONS (Parent):
TC-09
1.10. Manual source default UID: TC-09 METHOD: Inspection AUTOMATED: No STATEMENT:

A hand-created session has Source = Manual.

RELATIONS (Parent):
TC-10
1.11. Equipment availability correct UID: TC-10 METHOD: Test AUTOMATED: Yes STATEMENT:

Kettlebells, Net, Barbell, Medicine ball = Not available; Stickhandling ball = Pending; the rest Available.

RELATIONS (Parent):
TC-11
1.12. Templates use available gear only UID: TC-11 METHOD: Inspection AUTOMATED: No STATEMENT:

The seeded Workout Templates reference only Available equipment.

RELATIONS (Parent):
TC-12
1.13. Race seeds correct UID: TC-12 METHOD: Test AUTOMATED: Yes STATEMENT:

Example Half Marathon = Half Marathon / Goal 2:00:00; Example 5K = 5K.

RELATIONS (Parent):
TC-13
1.14. Historical runs correct UID: TC-13 METHOD: Test AUTOMATED: Yes STATEMENT:

11-mile long run = 11 mi / Long; 5-mile hill repeats = 5 mi / Hills.

RELATIONS (Parent):
TC-14
1.15. Session relationships wired UID: TC-14 METHOD: Inspection AUTOMATED: No STATEMENT:

The 11-mile run relates to Person, Running Shoe, Running Route, and Training Block.

RELATIONS (Parent):
TC-15
1.16. Goal linked to Race UID: TC-15 METHOD: Test AUTOMATED: Yes STATEMENT:

The Sub-2:00 goal has a Race relation to the Example Half Marathon.

RELATIONS (Parent):
TC-16
1.17. Source-of-truth game link UID: TC-16 METHOD: Demonstration AUTOMATED: No STATEMENT:

A hockey session can relate to a Team A/Team B game without altering the source game DB.

RELATIONS (Parent):
TC-17
1.18. Page placement UID: TC-17 METHOD: Inspection AUTOMATED: No STATEMENT:

The Personal Training OS page is a child of Personal Dashboard, linked below Inbox.

RELATIONS (Parent):
TC-18
1.19. Mobile capture UID: TC-18 METHOD: Demonstration AUTOMATED: No STATEMENT:

A session/check-in can be logged with low effort in the Notion mobile app.

RELATIONS (Parent):
TC-19
1.20. Backup and recovery UID: TC-19 METHOD: Demonstration AUTOMATED: No STATEMENT:

The OS data can be exported from Notion and is restorable.

RELATIONS (Parent):
TC-20
1.21. Training materials present UID: TC-20 METHOD: Test AUTOMATED: Yes STATEMENT:

At least one running, one strength, and one hockey Workout Template exist, plus Hockey Drills.

RELATIONS (Parent):
TC-21
1.22. Garmin daily wellness metrics provenance (Increment 2b) UID: TC-21 METHOD: Test AUTOMATED: Yes STATEMENT:

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.

RELATIONS (Parent):
TC-22
1.23. Withings weight provenance (Increment 2c) UID: TC-22 METHOD: Test AUTOMATED: Yes STATEMENT:

Each Metrics/Check-ins row sourced from Withings carries a withings-<grpid> Source ID, a Weight value, and an Imported At timestamp.

RELATIONS (Parent):
TC-23
1.24. Garmin activities into Training Sessions (Increment 2a) UID: TC-23 METHOD: Test AUTOMATED: Yes STATEMENT:

Each Training Session row sourced from Garmin carries a Garmin Activity ID and an Imported At timestamp.

RELATIONS (Parent):
TC-24
1.25. Hockey games auto-scheduled (Increment 3) UID: TC-24 METHOD: Test AUTOMATED: Yes STATEMENT:

Each Training Session row sourced from the Hockey DB links a source game (Gabagools or Bacon).

RELATIONS (Parent):
TC-25
1.26. MyFitnessPal nutrition at per-meal grain (Increment 4) UID: TC-25 METHOD: Test AUTOMATED: Yes STATEMENT:

Each Nutrition Log row sourced from MyFitnessPal carries an mfp-<date>-<meal> Source ID, a Meal, a Calories value, and an Imported At timestamp.

RELATIONS (Parent):
TC-26
1.27. Idempotent upsert, unique Source IDs UID: TC-26 METHOD: Test AUTOMATED: Yes STATEMENT:

No two synced rows within a database share a Source ID, confirming idempotent upserts across the Metrics, Nutrition, and Training Sessions databases.

RELATIONS (Parent):
TC-27
1.28. Synced rows relate to a Person UID: TC-27 METHOD: Test AUTOMATED: Yes STATEMENT:

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.

RELATIONS (Parent):