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 underruns/(copy the template). The⬜here mean "case exists," not "not yet run." Seeruns/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
pytestagainst the live Notion API (verification/tests/; report inreport.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-acceptedtag marking the accepted baseline. Verify withgit tag -v vv-accepted.
On sign-off: git tag vv-accepted, then proceed to Phase 6 (Release).