# V302 LEFT FOOT IK SOURCE FIX

## Status

V302 fixes the left lifted foot at the correct layer: baked/source IK target data.

This is **not** a runtime foot-controller patch. It does not add a post-IK foot writer and does not let the grip solver move the foot or toe.

## Changed source target

- profile: `warmup_hurdle_stretch_right_pose_v50_ik_v1`
- keyframe: `v50_g_free_arm_up`
- phase: `0.25`
- target: `L_ToeBase`

```text
old L_ToeBase = [-0.168, 0.79, -0.245]
L_Foot        = [-0.108, 0.812, -0.325]
new L_ToeBase = [-0.048, 0.834, -0.405]
```

Correction formula:

```text
L_ToeBase = L_Foot - (oldL_ToeBase - L_Foot)
```

This mirrors the already-accepted foot basis instead of trusting the bad MediaPipe toe read that pointed the lifted foot toward the butt.

## Preserved contract

- V301 side/surface contact gate remains the active grip-entry gate.
- Fingers remain blocked by default.
- No `v292FitFootToeSoleFrame`.
- No runtime foot controller.
- No post-IK foot writer.
- No grip-solver foot/toe writer.

## Validation

See:

- `diagnostics/V302_STATIC_IK_SOURCE_FIX_AUDIT.json`
- `diagnostics/V302_BROWSER_RUNTIME_AUDIT.json`


## Runtime/browser audit result

```json
{
  "pass": true,
  "passBrowserRuntime": true,
  "passSideSurfaceGate": true,
  "passNoFingerReleaseByDefault": true,
  "passLeftFootSourceFix": true,
  "passRightFootStillMirrored": true
}
```

Left runtime raw authored foot vector after source conversion:

```text
L_Foot     = {'x': 0.108, 'y': 0.812, 'z': -0.325}
L_ToeBase  = {'x': 0.048, 'y': 0.834, 'z': -0.405}
Foot->Toe  = {'x': -0.06, 'y': 0.022, 'z': -0.08}
Dir        = {'x': -0.585987, 'y': 0.214862, 'z': -0.781316}
```
