# QA RC60 Report

## Scope
Correct the Programs page so it is model-driven instead of example-driven.

## Implemented changes
- Removed hardcoded/example program definitions such as Snabbhetsmix, Explosiv hockeygrund, Rörlighet & kontroll and Helkropp Bas from the actual app logic.
- Programs are now derived from the program model when present:
  - `PROGRAM_MODEL`
  - `PROGRAM_LIBRARY`
  - `PROGRAMS`
  - `NEXT_PROGRAMS`
- If no explicit model is present, the app derives one program per stage from existing `DATA` and `PROGRAM_SCHEDULE_RULES`.
- Current fallback model renders the real three programs:
  - `7–9 år · Grund` — 24 pass, 12 weeks, 2 pass/week
  - `9–12 år · Utveckling` — 36 pass, 12 weeks, 3 pass/week
  - `12–16 år · Avancerad` — 48 pass, 12 weeks, 4 pass/week
- `Alla program` now displays every program in the model, including a small count.
- Program selection still works with active/started/resume/restart logic.
- Program selection no longer overwrites profile sport, goal, focus or equipment; it updates active program + age/level only.
- Cache bumped to `96rc60`.

## Validation
- JavaScript syntax: OK (`node --check assets/js/app.js`)
- PHP lint: OK (`ota_youtube_proxy.php`)
- Removed fake program names from app JS/CSS/HTML: OK
- Visual fallback QA screenshots produced via static fixture → WeasyPrint → PNG.

## QA screenshots
- `qa_screenshots/rc60_program_mobile_390x844.png`
- `qa_screenshots/rc60_program_full_mobile_390x1600.png`
- `qa_screenshots/rc60_program_preview_mobile_390x844.png`
- `qa_screenshots/rc60_program_resume_modal_mobile_390x844.png`
- `qa_screenshots/rc60_program_ipad_820x1180.png`
- `qa_screenshots/rc60_program_desktop_1440x1024.png`

## Notes
The page is no longer tied to today’s three programs. If more programs are later added to an explicit model array, the library renders them automatically.
