# RC120 / v97 Layered Exercise Visual Standard QA

## Purpose

RC120 starts the v97 exercise image architecture cleanup.

The old runtime image model mixed several concepts in one large JS file:

- generated SVG fallback foregrounds
- sport/theme-specific fallbacks
- S2P1 direct-composite premium images
- theme background lookup repeated per exercise

This release removes that model from active runtime and replaces it with one convention-based visual standard:

```text
next-exercise-visual
├─ next-exercise-visual-bg      -> assets/img/themes/exercise-backgrounds/<theme asset>
└─ next-exercise-visual-figure  -> assets/img/exercises/figures/<exerciseKey>.webp
                                  fallback: assets/img/exercises/figures/_default.webp
```

## What changed

### Removed from active runtime/package

- `assets/js/core/exercise-illustrations.js`
- `assets/img/exercises/fallback/svg/`
- `assets/img/exercises/premium/s2p1/`
- runtime references to `NEXTExerciseIllustrations`
- runtime references to `fallback/svg`
- runtime references to `premium/s2p1`
- direct-composite specific runtime classes such as `next-premium-composite`

### Added / standardized

- `assets/img/exercises/figures/_default.webp`
- `NEXTExerciseIllustrationService.version = v97-layered-visual`
- convention resolver:
  - `assets/img/exercises/figures/<exerciseKey>.webp`
  - fallback `_default.webp` via image `onerror`
- shared visual component classes:
  - `.next-exercise-visual`
  - `.next-exercise-visual-stage`
  - `.next-exercise-visual-bg`
  - `.next-exercise-visual-figure`
  - `.next-exercise-visual-meta`

## Important product note

No new exercise images were generated in this release.

Because approved transparent per-exercise figures do not exist yet, exercises currently fall back to the single neutral `_default.webp` figure. This is intentional: RC120 updates the app architecture first, then future image batches can drop transparent figures into:

```text
assets/img/exercises/figures/<exerciseKey>.webp
```

without requiring a new 4000-line manifest.

The previous S2P1 direct-composite images were not used as the new figure layer because they are RGB composites with embedded backgrounds, not transparent athlete/figure assets.

## QA performed

### Static / smoke tests

Passed:

```bash
find assets/js -name '*.js' -print0 | xargs -0 -n1 node --check
for t in tests/*.js; do node "$t"; done
for t in tests/*.sh; do bash "$t"; done
php -l ota_youtube_proxy.php
php -l video_backup_api.php
node tests/rc120_layered_exercise_visual_smoke.js
```

### Active runtime grep

Verified no active runtime references in `assets/` or `preview.html` to:

```text
fallback/svg
premium/s2p1
NEXTExerciseIllustrations
exercise-illustrations.js
```

### Real-DOM visual checks

Screenshots were produced with actual `preview.html`, actual `next-system.css`, actual JS and the new visual service.

The full multi-context Playwright runner timed out in this sandbox after producing several captures, so final desktop/mobile captures were also produced as isolated real-DOM runs. The individual captures verified:

- library visual renders `.next-exercise-visual`
- pass fallback image renders `.next-exercise-visual`
- background and figure are two `<img>` layers in the same `.next-exercise-visual-stage`
- figure falls back to `_default.webp` when no per-exercise transparent figure exists
- old manifest is not loaded
- pass figure does not overlap the info-card
- no broken local images in the checked views

## Screenshots

- `qa_screenshots/rc120_layered_visual_library_mobile_390x844.png`
- `qa_screenshots/rc120_layered_visual_library_ipad_820x1180.png`
- `qa_screenshots/rc120_layered_visual_library_desktop_1440x1024.png`
- `qa_screenshots/rc120_layered_visual_pass_mobile_390x844.png`
- `qa_screenshots/rc120_layered_visual_pass_ipad_820x1180.png`
- `qa_screenshots/rc120_layered_visual_pass_desktop_1440x1024.png`

## Known caveats

- The release intentionally displays the generic default figure until real transparent exercise figures are generated.
- Theme backgrounds are still the existing background assets under `assets/img/themes/exercise-backgrounds/`.
- Real device / deploy-host test is still required, especially iPhone Safari.
- Future image generation must follow the new figure-only spec: transparent WebP, no embedded background, no text, no logo, consistent scale/baseline/shadow.
