# START HERE — V417 Waiter's Bows canonical + video timing

Base checkpoint: **V416 Exercise Media Backfill Full Root**.

## Locked result

Exercise 09 `waiters-bows` now uses the corrected canonical profile:

- `warmup_waiters_bow_ik_v1`
- movement: alternating straight-leg hamstring scoop
- front heel presented / front toe dorsiflexed
- support knee flexed
- deep hip hinge
- both hands scoop toward the front foot
- left and right sides alternate in one loop

The prior stationary waiter-bow/hip-hinge canonical was rejected because it did not match the supplied OTA MOV.

## Authority

1. Canonical IK owns geometry.
2. Supplied MOV owns animation timing after canonical geometry is validated.
3. No new solver, no exercise-specific runtime primitive, no post-solve pose override.
4. Existing accepted exercises are untouched.

Timing authority:
- left bottom: ~0.80 s
- upright/switch: ~1.60 s
- right bottom: ~2.40 s
- full L+R loop: 3.20 s

Resolved playback:
- 480 frames
- 3.20 s
- `liveSolverCalls = 0`

## Chromium/OpenGL QA

PASS: 8/8 views.

Both left-bottom (phase 0.25) and right-bottom (phase 0.75) were rendered from front, rear, left side and right side in Chromium/WebGL2 via ANGLE/SwiftShader.

All eight reports pass:
- canonical solve
- `oneWriter=true`
- `resolvedPlayback=true`
- `noLiveSolver=true`

Aggregate:
`diagnostics/v417/V417_WAITERS_BOW_CHROMIUM_OPENGL_AGGREGATE_QA.json`

Multiview contact:
`diagnostics/v417/V417_WAITERS_BOW_CHROMIUM_OPENGL_MULTIVIEW_CONTACT.jpg`

## Exercise media

The normal exercise player is unchanged.

Existing media pattern is reused:
- local source MOV in `assets/media/exercises/waiters-bows/source/`
- local MP4 playback first
- existing YouTube source retained after/fallback
- existing video registry/service path only

## Diff boundary

Read:
`diagnostics/v417/V417_WAITERS_BOW_DIFF_AUDIT.json`

It proves the only semantic canonical IK change versus V416 is `warmup_waiters_bow_ik_v1`.
