# QA RC95 Report

## Scope
Server video backup import / IndexedDB / per-exercise video mapping. Keep pass layout stable.

## Verified
- JavaScript syntax check for all files: OK
- PHP lint for `ota_youtube_proxy.php`: OK
- Static RC95 checks: OK
  - `local-video-backup-service.js` is loaded before `video-service.js`
  - `projectorNoYoutubeBtn` exists in pass menu
  - `server_backup` source is present in video resolver
  - Exercise library contains `Server backup saknas` / `Lägg till server backup`
  - Projector fallback text is present in player logic
- ZIP integrity: OK after package build

## Screenshot QA
Chromium/Playwright was attempted but blocked by sandbox administrator policy (`ERR_BLOCKED_BY_ADMINISTRATOR`). Following the project fallback rule, static visual QA screenshots were generated through WeasyPrint HTML -> PDF -> `pdftoppm` PNG.

Generated screenshots:
- `qa_screenshots/rc95_video_backup_import_mobile_390x844.png`
- `qa_screenshots/rc95_video_backup_import_ipad_820x1180.png`
- `qa_screenshots/rc95_projector_no_youtube_desktop_1440x1024.png`

## Manual smoke-test targets
1. Open menu -> Övningar.
2. Select any exercise.
3. Confirm the detail card shows the exercise name directly above the backup mapping controls.
4. Tap `Lägg till server backup` and choose a video from iPad/Filer.
5. Confirm the status changes to `Server backup` and the file metadata appears.
6. Start a pass containing the same exercise and confirm native video plays before YouTube.
7. Enable `Projektor: YouTube av` from the pass menu.
8. Confirm YouTube/OTA is not embedded; if no backup exists, a descriptive animated fallback is shown.

## Known limits
- IndexedDB video storage is browser/device-local. It is a reliable iPad/projector workaround, not a cloud sync feature.
- Large video files depend on iPad/browser storage quota.
- Built-in YouTube downloading is not implemented in RC95.
