# Handover · V387 smooth Figure Four transitions

## Root cause corrected

V386 inherited discrete grip peaks from V385 at exactly phase `0.25` and `0.75`. The neighboring resolved frames were non-grip frames. This produced one-frame jumps in the complete arm chain when the video-time mapper entered or left a peak hold.

The V386 neutral hand transforms were also approximately `113.8°` left and `115.7°` right away from the rig's actual FBX local rest orientation.

## V387 bake

V387 is a resolved-asset post-bake, not a live solver:

- begin with every original V386 frame
- set both non-contact hand nodes to their actual FBX rest quaternion
- identify the 23 grip-affected clavicle, upper-arm, forearm, hand and finger bones from the V385 peak discontinuity
- blend those bones by shortest-arc quaternion smootherstep through the complete entry and release half-cycle
- copy the exact original peak transform arrays back at phases `0.25` and `0.75`
- keep every non-transition bone byte-equivalent to V386

Transition phase windows:

- right: `0.00 → 0.25 → 0.50`
- left: `0.50 → 0.75 → 1.00`

The video-time mapper retains the original source timing and holds phase `0.25` and `0.75` during the measured grip intervals.

## Numeric result

- peak geometry exact: PASS
- non-transition bones unchanged: PASS
- hand neutral at FBX rest: PASS
- no live solver: PASS
- normal Dynamic Warm Up step 4 route: PASS
- packaged video mapping: PASS

Maximum grip-chain rotation per displayed frame:

| Playback | Hand | Clavicle/shoulder | Upper arm | Forearm |
|---|---:|---:|---:|---:|
| 24 fps | 21.89° | 16.98° | 14.97° | 7.23° |
| 30 fps | 17.59° | 13.78° | 11.96° | 5.90° |

These replace V386's isolated `123–169°` grip-frame jumps.

## Evidence

- `diagnostics/v387/V386_REJECTED_TWO_LOOP_CHROMIUM_FILM.mp4`
- `diagnostics/v387/V387_SMOOTH_TRANSITION_BUILD_REPORT.json`
- `diagnostics/v387/V387_SMOOTH_FIGURE_FOUR_TEMPORAL_NUMERIC_QA.json`
- `diagnostics/v387/V387_SMOOTH_FIGURE_FOUR_INTEGRATION_CHECK.json`
- `diagnostics/v387/5_6_local_render/V387_CPU_SKINNED_MESH_TWO_LOOP_QA.mp4`
- `diagnostics/v387/5_6_local_render/V386_CPU_SKINNED_MESH_ONE_LOOP_CONTROL.mp4`
- `diagnostics/v387/5_6_local_render/V387_5_6_LOCAL_RENDER_GATE.json`
- `diagnostics/v387/5_6_local_render/V387_LOCAL_RENDER_TEMPORAL_QA_REPORT.md`

## Bundled 5.6 rendering gate

Run `node tools/nexprod/run_v387_5_6_local_render_gate.mjs` from the checkpoint root. The gate uses the real Nex FBX, skeleton and skin weights and compares V387 against the known-failing V386 asset at 24 fps. It generated an 89.91% lower right grip-boundary frame change and a 90.73% lower left boundary change in V387. Human review of the two-loop film and contact sheets remains mandatory.

This is the permanent temporal fallback for 5.6 environments without local Chromium/Xvfb. It supplements but does not replace Chromium/WebGL parity.

## Production constraints

1. `resolvedPlayback=true`
2. `oneWriter=true`
3. `noLiveSolver=true`
4. `liveSolverCalls=0`
5. no exercise-specific solver
6. V385 peak geometry stays exact
7. two-loop film QA is mandatory before locking
