# V97 RC16 · Pose Motion Runtime Fallback QA

## Intent

RC16 connects the pose-sequence system to the pass player as an optional runtime fallback, behind an explicit pass-menu toggle. This is the first runtime bridge from Bildadmin pose curation into the actual pass media surface.

## What changed

- Added `assets/js/services/pose-motion-service.js`.
- Added pass settings toggle: **Motion fallback**.
- Added persistent setting `nextMotionFallback`.
- When enabled, `descriptiveExerciseVisual()` prefers a pose-sequence visual before the generic layered figure fallback.
- Pose fallback is used only when normal video paths fall back to descriptive visuals, for example:
  - no video / timer video
  - YouTube blocked in projector mode
  - local/server backup failure fallback
- Existing video, server backup, local backup, YouTube and OTA logic remains unchanged.

## Runtime priority after RC16

1. Server/local/YouTube/OTA video when available and allowed.
2. Pose-sequence fallback if `Motion fallback` is enabled and a sequence exists.
3. Layered exercise figure/default figure fallback.
4. Generic fallback art.

## Important constraints

- Motion fallback is behind the menu toggle and is off by default.
- Pass player lifecycle, timers, wake lock, preload and video source priority were not refactored.
- Bildadmin remains the curation/edit surface for pose sequences.
- Pass runtime only reads the current JSON pose library and pose sequence data.

## QA run

```bash
node tests/rc16_pose_motion_runtime_smoke.js
python3 tests/rc16_pose_motion_runtime_real_dom_qa.py
find assets/js -name '*.js' -print0 | xargs -0 -n1 node --check
php -l api/image-admin/health.php
php -l api/image-admin/status.php
php -l api/image-admin/templates.php
php -l api/image-admin/upload-draft.php
unzip -t next_v97_rc16_pose_motion_runtime_fallback.zip
```

## Real-DOM screenshot QA

The real-DOM QA loads actual `preview.html`, CSS and JS through `page.set_content()`, mocks the small backend JSON endpoints, enables the pass screen manually, renders `Linear Pogos` through `NEXTPoseMotionService`, and screenshots:

- mobile 390×844
- iPad 820×1180
- desktop 1440×1024

It verifies:

- pose motion service is loaded and ready
- `#videoWrap` receives `data-media-only="pose-motion"`
- runtime pose visual exists
- at least four runtime pose images render
- five slot guides render
- raster `*-real.webp` background is used
- no local images are broken

## Caveat

No deployed host or real iPhone Safari was tested here. The renderer is verified through local real-DOM QA with inlined app assets.
