# NEXT Athlete OS v96 RC97 QA Report

## Scope

RC97 builds on RC96 and focuses on exercise catalog cleanup. Pass page rebuild remains paused.

## Implemented

- Added central exercise catalog service.
- Folded clear exercise-name duplicates into master exercise keys.
- Kept pass-row prescriptions separate from master exercise identity.
- Updated video service to use canonical exercise keys.
- Kept alias-key fallback so existing/old backups can still resolve.
- Updated library UI copy: master exercise owns server backup; pass rows own reps/time/meters/rounds.
- Added visual alias/pass-use sections in exercise detail.

## Smoke test result

`tests/rc97_static_checks.sh`: OK

Checks include:

- JS syntax for all files.
- PHP lint for `ota_youtube_proxy.php` and `video_backup_api.php`.
- Exercise catalog smoke test.
- Canonical key resolution for duplicate examples.
- Server backup priority for canonical exercise keys.
- Required RC97 files and UI copy present.

## Catalog numbers from smoke test

- Source rows: 1220
- Master exercises after cleanup: 172
- Alias/name variants folded: 22

## QA screenshots

Fallback-rendered static QA screenshots:

- `qa_screenshots/rc97_exercise_catalog_mobile_390x844.png`
- `qa_screenshots/rc97_exercise_catalog_ipad_820x1180.png`
- `qa_screenshots/rc97_exercise_catalog_desktop_1440x1024.png`

## Screenshot method

Chromium/Playwright remains unreliable in the sandbox, so RC97 uses the established fallback path: deterministic static HTML fixture → WeasyPrint PDF → PNG via `pdftoppm`.

## Notes

RC97 does not add YouTube downloading. RC96 server upload remains the backup mechanism.
