# HANDOVER — V385 Minimal Resolved Figure four Proof

## Outcome

The minimal bake/playback architecture is technically viable and materially reduces continuous CPU load.

V384E129 remains untouched. V385 adds a parallel proof path:

```text
V384E129 live authoring solve
→ capture actual Nex local bone transforms
→ resolved JSON asset
→ transform-only playback
```

## Added files

- `assets/nexprod/nexprod01-resolved-playback.mjs`
- `assets/nexprod/nexprod01-resolved-player-v385.html`
- `assets/nexprod/resolved/figure-fours-v385-proof.resolved.json`
- `tools/nexprod/export_resolved_figure_four_v385.mjs`
- `tools/nexprod/qa_resolved_figure_four_v385.mjs`
- `config/visual_qa/v385_resolved_figure_four_cases.json`
- `diagnostics/v385/V385_RESOLVED_FIGURE_FOUR_NUMERIC_QA.json`

## Asset format

The proof asset stores:

- exact model/root transform per phase sample;
- ordered local bone quaternion per phase sample;
- invariant local bone position and scale once per rig;
- ordered bone-name contract;
- model/spec/runtime SHA-256 hashes;
- authored keypose event metadata;
- Figure four dual-grip bake evidence.

The ordered rig contract is validated before playback. A bone count or order mismatch stops playback instead of guessing a mapping.

## What playback does

At each render update, resolved playback performs only root transform interpolation, local quaternion slerp and `updateMatrixWorld(true)`. Its result explicitly reports `liveSolverCalls: 0`.

No calls are made to:

- IK/normalization;
- body CCD;
- generic grip solver;
- finger-contact solver;
- floor/contact/biomechanical QA gates.

## QA result

`NEXT11_V385_RESOLVED_FIGURE_FOUR_NUMERIC_QA_V1`: PASS.

```text
exact sample max error:      0.0000000834 m
between-sample max error:    0.0053224242 m
event-window max error:      0.0080859109 m
live solve average:          18.7783 ms
resolved playback average:   0.0850 ms
measured speedup:            220.86x
```

The QA sweep checks all 480 between-sample midpoints, 16 exact baked samples and both sides of all authored event windows.

The browser-free Node test loads the actual 67 MB Nex FBX and the actual V384E129 runtime. Overall legacy `liveResult.pass` remains false in this Node harness because browser/source QA gates are not authoritative there, but the two locked Figure four grip peaks independently report generic multi-grip PASS with both hands and four-finger contact PASS.

## Critical discovery

Naively interpolating every adjacent frame is invalid. The first run produced 17.29 cm world-space error immediately after grip peaks because the live runtime enables grip rules only within `±0.001` of authored keypose phases.

The corrected proof treats all authored keyposes as discrete event boundaries:

- the exact authored frame is applied inside its declared activation window;
- neighboring continuous playback interpolates between the nearest non-event frames;
- no new contact duration or exercise-specific solver is introduced.

## Remaining gate

The supplied Chromium/Xvfb/SwiftShader runbook was followed. Xvfb and Google Chrome 152 were installed successfully, but this execution sandbox rejects every `AF_UNIX` socket creation with `EPERM`. Chromium therefore terminates in `ProcessSingleton` before DevTools starts; the Nex page and renderer are never reached. This is an environment gate, not a Nex/runtime failure. Evidence is recorded in:

- `diagnostics/v385/V385_CHROMIUM_ENVIRONMENT_GATE.json`

The visual-QA config remains prepared:

```bash
node tools/nexprod/run_chromium_opengl_visual_qa.mjs \
  --config config/visual_qa/v385_resolved_figure_four_cases.json \
  --tag V385_RESOLVED_FIGURE4 \
  --cases right_peak,left_peak \
  --views front,rear,left_side,right_side,rear_three_quarter
```

## Recommended next decision

Run the prepared Chromium visual QA. If the resolved peak poses match V384E128 visually, lock the small bake/playback mechanism and return to exercise completion. Do not build the full bank/status-management architecture yet.

Separately, decide whether Figure four's existing `±0.001` grip activation is the intended motion timing. V385 preserves it exactly and does not silently extend it.
