# RC115 · Pass player scale cleanup QA

## Scope

RC115 builds directly on RC114. The release is intentionally narrow:

- Fix desktop active-pass media-card vertical stretching after RC114.
- Keep the pass media-card contract from RC114: media column is media-only, info column owns exercise text/dose/cues/context.
- Retire the obsolete mobile/iOS “Tryck för att starta film” overlay now that RC113 provides explicit Play/Paus/10 sek controls under the film.
- Fix mobile video-control contrast so control labels remain light on dark blue buttons.

No new renderer, image model, cutout/layered image model, video-source model, timer lifecycle or player lifecycle was introduced.

## Reused code paths / classes

RC115 keeps using:

- `preview.html` active pass structure.
- `.next-pass-screen`
- `.next-pass-layout`
- `.next-pass-media-card`
- `#videoWrap.next-pass-video-wrap`
- `#passVideoControls.next-pass-video-controls`
- `.next-pass-info-card`
- `.next-pass-progress-below`
- `assets/js/renderers/pass-player-renderer.js`
- `app.js` player lifecycle: `startWorkout`, `renderStep`, `renderVideo`, `renderRest`, `primeWorkoutStart`, YouTube iframe API helpers, native video helpers.

## Changes

### Desktop scaling / proportions

RC114 still allowed the desktop media-card to stretch vertically to match the taller right-side info-card. RC115 changes desktop alignment so the media-card keeps its own content height:

- `.next-pass-layout` uses `align-items:start` on desktop.
- `.next-pass-media-card` uses auto height and grid rows for media + controls.
- The active film wrapper keeps true 16:9 aspect ratio.
- The exercise list gets a bounded desktop max-height so it does not dominate the pass page.

### Mobile/iOS overlay

The old `#iosPlayBtn.video-tap-fallback` overlay is retired in active pass mode because RC113 controls now own manual playback. The JS function `showIOSPlayButton()` now keeps the element hidden instead of re-showing it after autoplay attempts.

### Video-control contrast

The video-control labels/icons are explicitly restyled for light text on the dark blue button background.

## Real-DOM QA

Real-DOM QA was run with actual `preview.html`, actual CSS and actual JS via Playwright `page.set_content()`. External network/iframe requests were blocked/mocked as in RC108–RC114 QA.

Generated screenshots:

- `qa_screenshots/rc115_pass_player_video_mobile_390x844.png`
- `qa_screenshots/rc115_pass_player_video_ipad_820x1180.png`
- `qa_screenshots/rc115_pass_player_video_desktop_1440x1024.png`
- `qa_screenshots/rc115_pass_player_video_desktop_superset_1440x1024.png`
- `qa_screenshots/rc115_pass_player_video_desktop_1632x920_superset.png`
- RC114 image-state regression screenshots re-run in RC115 work folder:
  - `qa_screenshots/rc114_pass_player_image_mobile_390x844.png`
  - `qa_screenshots/rc114_pass_player_image_ipad_820x1180.png`
  - `qa_screenshots/rc114_pass_player_image_desktop_1440x1024.png`

Measured checks in `qa_screenshots/rc115_pass_player_scale_dom_metrics.json`:

- Video controls visible for video-state.
- Video wrapper remains 16:9.
- Desktop media-card does not stretch below the video-control rail.
- Mobile overlay remains hidden even after `showIOSPlayButton()` is invoked.
- Mobile Play label color is light (`rgb(234, 250, 255)`).
- No broken local images.

## Commands run

```bash
node tests/rc115_pass_player_scale_smoke.js
node tests/rc114_pass_media_contract_smoke.js
node tests/rc113_pass_video_controls_smoke.js
node tests/rc112_pass_chrome_reposition_smoke.js
node tests/rc111_pass_player_standardization_smoke.js
node tests/rc110_pass_page_standardization_smoke.js
node tests/rc109_asset_path_cleanup_smoke.js
node tests/rc107_asset_and_library_smoke.js
node tests/rc109_library_compactness_static_smoke.js
node tests/rc104_direct_composite_smoke.js
node tests/rc106_smoke.js assets/js/core/exercise-illustrations.js "$PWD"
find assets/js -name '*.js' -print0 | xargs -0 -n1 node --check
php -l ota_youtube_proxy.php
php -l video_backup_api.php
python3 tests/rc115_pass_player_scale_real_dom_qa.py
python3 tests/rc114_pass_media_contract_real_dom_qa.py --child image mobile 390 844
python3 tests/rc114_pass_media_contract_real_dom_qa.py --child image ipad 820 1180
python3 tests/rc114_pass_media_contract_real_dom_qa.py --child image desktop 1440 1024
```

## Caveat

The actual deployed host was not tested from this sandbox. Screenshots/metrics are real preview DOM/CSS/JS via the established `page.set_content()` QA path.
