Skip to content

Test Plan — Personal Training OS (Phase 5: Verification & Validation)

Artifact: V&V test plan · Owner: Delivery Manager (Primary User) · Version: v1.1 · Date: 2026-07-05

Changelog v1.1 (2026-07-05): reworded TC-08, TC-11, TC-19 for testability after defects D-01/D-02/D-03 surfaced ambiguity during run 2026-07-04-run-1 (case-quality fixes, not scope changes). Traces to: spec/requirements/ptos.sdoc (by UID) · Gate: exits at G5 (tests pass + UAT accepted)

⚠️ This is the master baseline — read-only. Do not record run results in the cells below. Each execution creates a dated run record under runs/ (copy the template). The here mean "case exists," not "not yet run." See runs/README.md.

Verification = "did we build it right?" (against the spec). Validation = "did we build the right thing?" (against user needs). This plan formalizes the checks that were deliberately deferred from Build into runnable test cases. Claude authored this plan; Primary User executes it (with Secondary User for multi-person UAT) — keeping the human-in-the-loop V&V discipline intact.

1. Scope

The live Notion Personal Training OS (page b3bcfff6…, under Personal Dashboard) built in Phase 4. In scope: MVP (Must/Should/Could) behaviour. Out of scope: deferred integrations (Garmin/MFP/Strava/ Calendar sync) and RAG — those are gated later phases (Won't-this-release).

2. Approach & methods

Per requirement verification method: T = Test (do X, assert Y) · I = Inspection (look/confirm) · D = Demonstration (show it works) · A = Analysis. Environment = the live workspace on desktop and the Notion mobile app (for NFR-USE).

3. Entry / exit criteria

  • Entry: Phase 4 build complete (G4 passed); this plan reviewed.
  • Exit (G5): every priority test case Pass; UAT accepted by Primary User (+ Secondary User for multi-person); any defects triaged (fixed or accepted with rationale).

4. Test cases

Result: ⬜ not run · ✅ Pass · ❌ Fail. Fill Result + Notes as you run each.

Automated run 2026-07-05 — ✅ 10/10 PASS — TC-01, 02, 03, 05, 07, 10, 12, 13, 15, 20 verified via pytest against the live Notion API (verification/tests/; report in report.html). The remaining cases below are manual (inspection / demonstration / mobile / backup) + the UAT section.

ID Traces Title M Steps Expected Result
TC-01 HOK-004/006/008 Hockey NOT attended doesn't count T Open Team A game (missed) (Attendance = Did Not Attend) Counts Toward Training (auto) = unchecked/false
TC-02 HOK-007 Hockey attended counts T Open Team A game (attended) Counts Toward Training (auto) = checked/true
TC-03 HOK-004 (else branch) Completed run counts T Open 11-mile long run (Run, Completed) Counts = true
TC-04 HOK-004 (else branch) Planned session doesn't count T Create a Run with Status = Planned Counts = false; then set Status = Completed → true
TC-05 SHO-004 Shoe mileage rollup T Open an example running shoe Total Miles = 16 (11 + 5 from the two linked runs)
TC-06 SHO-004 Rollup updates on new run T Add a 3-mi run linked to an example running shoe Total Miles → 19; then delete/unlink → back to 16
TC-07 PEO-005, TS-005 Secondary User is first-class T Create a Training Session; set Person = Secondary User Secondary User selectable; session saves & shows under her
TC-08 REL-002 Person filter isolates data T In Training Sessions and Metrics, filter Person = Primary User, then = Secondary User Each filter shows only that person's rows (no cross-leak). Scope: these two person-DBs, not an exhaustive sweep of all DBs
TC-09 AUTO-004 Manual source default I Inspect a hand-created session's Source Defaults to / set to Manual
TC-10 EQP-004/005 Equipment availability I Open Equipment DB Kettlebells/Net/Barbell/Medicine ball = Not available; Stickhandling ball = Pending; rest Available
TC-11 EQP-006 Seeded templates link only Available gear I Open the 3 seeded Workout Templates' Equipment relation The seeded links reference only Available equipment (no barbell/kettlebell/net). Note: a Notion relation can't enforce availability — this verifies the seed data, not a schema constraint
TC-12 RACE-003/004 Race seeds correct I Open Races SF 1st Half = 2026-07-26, Half Marathon, Goal 2:00:00; Example 5K = 2026-07-25
TC-13 HIST-001/002 Historical runs correct I Open the two seeded runs 11-mi = 2026-06-28 / Long; 5-mi hill repeats = 2026-07-01 / Hills
TC-14 REL-001, TS-008 Session relationships wired I Open 11-mile long run Related to Person, Running Shoe, Running Route, Training Block ("Example Half Marathon Build")
TC-15 GOL-003 Goal linked to Race I Open goal Sub-2:00 at Example Half Marathon Race relation = Example Half Marathon; Person = Primary User
TC-16 HOK-002 Source-of-truth game link D On a hockey session, add a Team A Game relation → pick a real game Links to the Team A Games DB without altering that DB
TC-17 NAV-002/003 Placement I Locate the OS page Child of Personal Dashboard, link below Inbox
TC-18 NFR-USE-001 Mobile capture D Log a session/check-in on the Notion mobile app Low-effort capture works on mobile
TC-19 NFR-BKP-001 Backup/recovery D Export the OS page: ••• → Export → format Markdown & CSV, Include subpages = Yes, Create folders for subpages = Yes Export .zip downloads and contains a .csv per database with its rows (spot-check Training Sessions + Running Shoes). Optional deeper check: re-import the zip into a scratch page and confirm rows land = "restorable"
TC-20 SC5 Training materials present I Open Workout Templates / Hockey Drills ≥1 running + 1 strength + 1 hockey plan; drills present

5. UAT — validation against user stories

Primary User (and Secondary User) confirm each delivers the intended value (accept / reject + comment).

UAT Story Accept?
UAT-1 US1 — every run/race/hockey game in one place
UAT-2 US2 — capture is low-effort
UAT-3 US3/SC6 — shoe mileage tracked automatically
UAT-4 US4 — hockey counts only when attended
UAT-5 US5 — Secondary User's training tracked (Secondary User confirms)
UAT-6 US7/SC5 — training plans/drills usable
UAT-7 US8 — data feels private + is backed up

6. Defect log

ID Test Severity Description Status
(log failures here)

7. Sign-off — Gate G5

Role Name Decision Date
Delivery Manager / PO Primary User APPROVED 2026-07-05

Basis: V&V cycle complete — 20/20 test cases Pass, 7/7 UAT Accept, 0 open defects (see runs/2026-07-04-run-1.md + runs/2026-07-05-summary.md). Gate G5 passed; MVP accepted for release.

Signature: this approval is authenticated by the SSH-signed commit that records it and the signed vv-accepted tag marking the accepted baseline. Verify with git tag -v vv-accepted.

On sign-off: git tag vv-accepted, then proceed to Phase 6 (Release).