# V412 — continuous traveling lateral lunge with camera follow

Base: V411.

## Outcome

The lateral-lunge animation now advances continuously in motion space while Nex remains centered in the exercise presentation. The rise after the right-knee lunge retains V410's planted-left-foot locomotion authority. The animation phase can repeat indefinitely without teleporting the character or camera at the loop boundary.

## Preserved exactly

- all 720 V411 `boneLocalQuaternions`;
- all 720 V411 `modelTransform` display poses;
- V410 planted-foot locomotion and V409 foot/ankle orientation;
- V408 lateral-lunge geometry, arms, depth and source-timed 6.6 s cycle;
- the existing profile identity `warmup_lateral_lunge_ik_v1`.

No new IK profile, no new biomechanical solver and no live solver calls were introduced.

## V412 change

V411 contained the correct motion-space information but its start-side phase rotation left one hidden reset inside the stored cycle. The older player also fell back to a generic 0.28 cycles/s timing when phase knots were absent.

V412:

1. unwraps the single hidden motion-space reset;
2. declares a displacement of `0.251394036 m` per 6.6 s cycle;
3. accumulates that displacement per completed loop;
4. bakes `cameraTrackX = motionSpaceX - displaySpaceX` per frame;
5. uses the asset's own 6.6 s duration when no explicit phase knots exist;
6. scrolls a repeating floor camera-relatively, which is equivalent to following the character without per-frame camera/frustum churn.

The invariant is:

`displaySpaceX = motionSpaceX - cameraTrackX`

## Runtime wiring

- resolved asset: `assets/nexprod/resolved/lateral-lunges-v412-continuous-travel-camera-follow.resolved.json`
- playback: `assets/nexprod/nexprod01-resolved-playback-v412.mjs`
- player: `assets/nexprod/nexprod01-resolved-player-v412.html`
- profile and sequence JSON/JS both point to V412;
- recommended low-power URL uses 12 fps and zero live solvers.

## QA evidence

- build report: `diagnostics/v412/V412_CONTINUOUS_TRAVEL_CAMERA_FOLLOW_BUILD_REPORT.json`
- integration gate: `diagnostics/v412/V412_CONTINUOUS_TRAVEL_CAMERA_FOLLOW_INTEGRATION_GATE.json`
- actual Nex FBX three-loop render: `diagnostics/v412/V412_CONTINUOUS_TRAVEL_CAMERA_FOLLOW_THREE_LOOP_QA.mp4`
- chronological contact sheet: `diagnostics/v412/V412_CONTINUOUS_TRAVEL_CAMERA_FOLLOW_CONTACT_SHEET.png`
- seam frames: `diagnostics/v412/V412_LOOP_SEAM_BEFORE.png` and `V412_LOOP_SEAM_AFTER.png`

Measured integration result:

- three-loop travel: `0.754182108 m`;
- maximum motion-space seam jump: `0 m`;
- maximum camera seam jump: `0 m`;
- maximum loop travel error: `0 m`;
- maximum centered invariant residual: approximately `2.4e-17 m`;
- live solver calls: `0`.

The render uses the actual bundled Nex FBX, Three.js CPU skinning and all four visible Nex skinned meshes. Chromium is not installed in the current executor, so a Chromium/SwiftShader scene capture was not possible here. That is an environment limitation, not a substitute-image approval; the included non-Chromium evidence is a real rendered Nex sequence.

## Acceptance boundary

Machine gates pass. Human visual acceptance remains pending. If presentation needs adjustment, change the baked camera/floor policy. Do not mutate the accepted V411 pose or foot geometry unless a new biomechanics task is explicitly opened.
