# V417 Waiter's Bows — Final QA Report

**Status: PASS — machine, resolver and Chromium/OpenGL gates complete.**

## Canonical IK
- Profile: `warmup_waiters_bow_ik_v1`
- Correct movement: alternating straight-leg hamstring scoop
- Generic Nex solve: **5/5 PASS**
- New solver: **no**
- Runtime primitive: **no**
- Post-solve overrides: **0**

## Video timing
- Source MOV SHA-256: `640c166ede951c354238483842d889db669ab004b52216cc9ba6835fdc4c3d14`
- Source duration: 14.280013 s
- Animation loop: 3.20 s
- Left bottom: 0.80 s
- Switch: 1.60 s
- Right bottom: 2.40 s
- Resolved frames: 480
- Live solver calls: 0

## Chromium/OpenGL
Aggregate: **8/8 PASS**

- left bottom — front: PASS
- left bottom — rear: PASS
- left bottom — left side: PASS
- left bottom — right side: PASS
- right bottom — front: PASS
- right bottom — rear: PASS
- right bottom — left side: PASS
- right bottom — right side: PASS

Renderer: `WebGL 2.0 (OpenGL ES 3.0 Chromium)` via ANGLE/SwiftShader.

Each view reports `solvePass=true`, `oneWriter=true`, `resolvedPlayback=true`, `noLiveSolver=true`.

## Media/player
Resolver smoke: **PASS**

`waiters-bows` resolves to:
`assets/media/exercises/waiters-bows/waiters-bows.mp4`

The existing YouTube source remains present. No regular player or video-service modification was made.

## Diff audit
**PASS**

Canonical semantic changes versus V416:
- JSON: `warmup_waiters_bow_ik_v1` only
- JS: `warmup_waiters_bow_ik_v1` only

No approved prior Nex animation was semantically modified.

See `diagnostics/v417/V417_WAITERS_BOW_DIFF_AUDIT.json`.
