# V266 RIGHT_GOLDEN_REGRESSION_NO_IMAGEGEN

Created: 2026-08-19T09:19:38.993817+00:00

## Executive finding

Höger är **inte tur**, men den är en höger-specialiserad pipeline. Den fungerar eftersom flera steg ligger i rätt ordning och med rätt handflats-punkter; den är däremot inte formellt generaliserad till `side=L`.

Den korrekta högerkedjan är:

```text
sourceContact / gripSide=R
→ V189 neutral R handframe från R handbranch
→ V198 approved R translation/snap delta
→ V199 två fasta R palm-punkter + wrist roll + green lock
→ V238/V239 R finger close z+ efter att palm/hand sitter
```

Det som gick fel på vänster var att vi började välja/mäta nya punkter i vänster i stället för att först kopiera denna kedja som process.

## Höger source-of-truth steg för steg

### 1. Source contact selects right grip route
- Authority: `sourceContact / v68GripRule`
- Operation: Right case v94_right_full at phase 0.75 enters shin grip route. Generic distal-finger/arm infrastructure can see gripSide=R.

After / evidence:
```json
{
  "v69": {
    "schema": "V94_SPACE_CONTROL_FINGERTIP_TARGET_RUNTIME_META",
    "v84TipArc": {
      "schema": "NEXPROD01_V200_LOCKED_HAND_FINGER_CLOSE_LAYER",
      "active": true,
      "reason": "initial palm/wrist contact accepted from V199; now rotate fingers only",
      "policy": "V200: no hand/arm/leg writer in finger phase; only finger bone rotations from locked V199 hand state."
    },
    "version": "BioRig_V126_43_HAND05_PLUS_MEDIAPIPE_21PT_FRAME",
    "handPreset": "v83_compact_heel_hook",
    "curl": [
      0.72,
      0.88,
      0.62
    ],
    "thumbCurl": [
      0.54,
      0.38,
      0.26
    ],
    "spread": -0.03,
    "blend": 0.78,
    "thumbDownRoll": 1.16,
    "contactStyle": "V92_thumb_down_lock_compact_hook_fingers_wrap_heel_shoe_not_side_clamp",
    "contactPriority": "grip_shape_first__surface_no_penetration__thumb_opposition__neutral_wrist",
    "axisMap": {
      "L": {
        "forward": "yPos",
        "normal": "xNeg",
        "thumb": "index_side_down"
      },
      "R": {
        "forward": "yPos",
        "normal": "xPos",
        "thumb": "index_side_down"
      }
    },
    "enabled": true,
    "active": true,
    "gripSide": "R",
    "freeSide": "L",
    "ruleType": "v94_space_control_right_finger_grip",
    "wristPolicy": "lock_v86_v91_roll_no_v87_90deg_compensation",
    "mediapipeHandFrame": null,
    "thumbVectorConstraint": "thumb_tip_world_y_negative_down_opposition",
    "policy": "V81_HEEL_CUP_HOOK_RUNTIME_META: V81 uses the user reference as a heel-cup hook: palm cups heel/ankle volume, fingers cross shoe/heel, thumb opposes down/in, wrist stays near forearm line and the hand reads as pulling the lower leg forward. V80 used the first facit heel-hook; V79 made thumb direction first-class. Finger layer remains child-layer curl after body IK.",
    "grip": {
      "schema": "NEXPROD01_V239_WIRING_FIXED_APPROVED_GRIP",
      "active": true,
      "side": "R",
      "source": "V236_ALL_Z_STOP_INDEX_MCP_0p36",
      "terms": {
        "index": [
          {
            "seg": 0,
            "axis": "z",
            "sign": 1,
            "amount": 0.36,
            "role": "V238_INDEX_MCP_VISUAL_AUDIT_APPROVED"
          },
          {
            "seg": 1,
            "axis": "z",
            "sign": 1,
            "amount": 0.72,
            "role": "V234_STOP_ON_CONTACT_PIP"
          },
          {
            "seg": 2,
            "axis": "z",
            "sign": 1,
            "amount": 0.36,
            "role": "V234_STOP_ON_CONTACT_DIP"
          }
        ],
        "middle": [
          {
            "seg": 0,
            "axis": "z",
            "sign": 1,
            "amount": 0.84,
            "role": "V234_STOP_ON_CONTACT_MCP"
          },
          {
            "seg": 1,
            "axis": "z",
            "sign": 1,
            "amount": 0.72,
            "role": "V234_STOP_ON_CONTACT_PIP"
          },
          {
            "seg": 2,
            "axis": "z",
            "sign": 1,
            "amount": 0.36,
            "role": "V234_STOP_ON_CONTACT_DIP"
          }
        ],
        "ring": [
          {
            "seg": 0,
            "axis": "z",
            "sign": 1,
            "amount": 0.84,
            "role": "V234_STOP_ON_CONTACT_MCP"
          },
          {
            "seg": 1,
            "axis": "z",
            "sign": 1,
            "amount": 0.72,
            "role": "V234_STOP_ON_CONTACT_PIP"
          },
          {
            "seg": 2,
            "axis": "z",
            "sign": 1,
            "amount": 0.06,
            "role": "V234_STOP_ON_CONTACT_DIP"
          }
        ],
        "pinky": [
          {
            "seg": 0,
            "axis": "z",
            "sign": 1,
            "amount": 0.84,
            "role": "V234_STOP_ON_CONTACT_MCP"
          },
          {
            "seg": 1,
            "axis": "z",
            "sign": 1,
            "amount": 0.68,
            "role": "V234_STOP_ON_CONTACT_PIP"
          }
        ]
      },
      "rows": [
        {
          "finger": "thumb",
          "active": false,
          "reason": "V238 approved grip keeps thumb writer off; V199 wrist/palm/leg lock remains authority"
        },
        {
          "finger": "index",
          "bone": "R_Index1",
          "segment": 0,
          "axis": "z",
          "sign": 1,
          "amount": 0.36,
          "active": true,
          "role": "V238_INDEX_MCP_VISUAL_AUDIT_APPROVED"
        },
        {
          "finger": "index",
          "bone": "R_Index2",
          "segment": 1,
          "axis": "z",
          "sign": 1,
          "amount": 0.72,
          "active": true,
          "role": "V234_STOP_ON_CONTACT_PIP"
        },
        {
          "finger": "index",
          "bone": "R_Index3",
          "segment": 2,
          "axis": "z",
          "sign": 1,
          "amount": 0.36,
          "active": true,
          "role": "V234_STOP_ON_CONTACT_DIP"
        },
        {
          "finger": "middle
```
Blockers before left/general use:
- Need the same route to pass side=L without later R-only fallbacks.

### 2. V189 neutral handframe
- Authority: `targets + restTargetPoints R_Hand/R_PalmBase/R_PalmIndexBase/R_PalmPinkyBase`
- Operation: Build palm plate from forearm continuation. Roll source is raw I-P projected. No object snap, no fingers.

After / evidence:
```json
{
  "beforeAngles": {
    "palmRay_vs_forearm": 68.28,
    "mcpCenter_vs_forearm": 65.66,
    "mcpAxis_vs_forearm": 134.88,
    "palmNormal_vs_forearm": 119.49
  },
  "afterAngles": {
    "palmRay_vs_forearm": 10.68,
    "mcpCenter_vs_forearm": 6.37,
    "mcpAxis_vs_forearm": 90,
    "palmNormal_vs_forearm": 90
  },
  "pass": true
}
```
Blockers before left/general use:
- Function is hardcoded const side=R in V239. Must be side-parametric before left.

### 3. V198 approved translation snap
- Authority: `hard-coded deltaV195 from approved right visual iteration`
- Operation: Move R_Hand/R_PalmBase/R_PalmIndexBase/R_PalmPinkyBase by armDelta. If arm reach clamps, move R_Calf/R_Foot/R_ToeBase by legDelta.

After / evidence:
```json
{
  "deltaV195": {
    "x": 0.04303,
    "y": -0.00036,
    "z": -0.02451
  },
  "armDelta": {
    "x": 0.04273,
    "y": 0.00722,
    "z": -0.02048
  },
  "legDelta": {
    "x": -0.0003,
    "y": 0.00758,
    "z": 0.00403
  },
  "reach": {
    "desiredDistance": 0.46,
    "minReach": 0.0105,
    "maxReach": 0.45141,
    "missing": 0.00859
  },
  "afterAngles": {
    "palmRay_vs_forearm": 12.56,
    "mcpCenter_vs_forearm": 8.31,
    "mcpAxis_vs_forearm": 85.36,
    "palmNormal_vs_forearm": 78.92
  },
  "pass": true
}
```
Blockers before left/general use:
- This is not a reusable object-contact derivation. For new exercises/left it must be derived from target limb surface/contact spec.

### 4. V199 wrist roll with two palm markers
- Authority: `fixed localGreen/localPink in hand branch basis`
- Operation: Compute green/pink from local branch frame. Roll palm plate about wrist/forearm axis by +55 deg. In default wristPivotMoveLeg mode, wrist stays, palm plate rotates, and lower leg translates by green residual plus micro-correction to keep green contact consistent.

After / evidence:
```json
{
  "localGreen": "{x:0.93966,y:0.70339,z:0.42636}",
  "localPink": "{x:-0.08284,y:0.62487,z:0.34506}",
  "rollDeg": 55,
  "mode": "wristPivotMoveLeg",
  "greenBefore": {
    "x": -0.10797,
    "y": 0.93192,
    "z": -0.29516
  },
  "greenAfter": {
    "x": -0.14997,
    "y": 0.91566,
    "z": -0.26801
  },
  "pinkBefore": {
    "x": -0.15422,
    "y": 0.9504,
    "z": -0.32392
  },
  "pinkAfter": {
    "x": -0.14868,
    "y": 0.94665,
    "z": -0.31645
  },
  "pinkLegTargetBefore": {
    "x": -0.10186,
    "y": 0.76352,
    "z": -0.33015
  },
  "pinkLegTargetAfter": {
    "x": -0.14936,
    "y": 0.74386,
    "z": -0.3046
  },
  "legDelta": {
    "x": -0.0475,
    "y": -0.01966,
    "z": 0.02555
  },
  "pinkDistanceBefore": 0.19417,
  "pinkDistanceAfter": 0.20313
}
```
Blockers before left/general use:
- V199 is hardcoded R and uses a fixed right pinkLegTarget. Must be replaced by active-side target limb patch.

### 5. Handpoint anatomy proof
- Authority: `actual skinned mesh vertices`
- Operation: Approved right green/pink correspond to concrete mesh vertices, not arbitrary semantic guesses.

After / evidence:
```json
{
  "R_green_vertex_58174": {
    "ok": true,
    "idx": 58174,
    "p": {
      "x": -0.14917,
      "y": 0.71196,
      "z": -0.26927
    },
    "skin": [
      [
        "R_Thumb2",
        1
      ],
      [
        "Pelvis",
        0
      ],
      [
        "Pelvis",
        0
      ],
      [
        "Pelvis",
        0
      ]
    ],
    "top": [
      "R_Thumb2",
      1
    ],
    "mesh": "Body"
  },
  "R_pink_vertex_58358": {
    "ok": true,
    "idx": 58358,
    "p": {
      "x": -0.14789,
      "y": 0.74294,
      "z": -0.31771
    },
    "skin": [
      [
        "R_Hand",
        0.984
      ],
      [
        "R_Thumb1",
        0.016
      ],
      [
        "Pelvis",
        0
      ],
      [
        "Pelvis",
        0
      ]
    ],
    "top": [
      "R_Hand",
      0.984
    ],
    "mesh": "Body"
  },
  "contract_distances_after_final": {
    "contract_green_to_v199_greenAfter": null,
    "contract_pink_to_v199_pinkAfter": null,
    "vertex58174_to_contract_green": null,
    "vertex58358_to_contract_pink": null
  }
}
```
Blockers before left/general use:
- Left homologs must be mapped anatomically from these vertices/signatures; not same world coords, not nearest runtime point.

### 6. V238/V239 fingers
- Authority: `finger bones only after palm/hand/wrist/leg state is locked`
- Operation: Apply approved z+ terms to R index/middle/ring/pinky. Thumb remains neutral/off. No hand, wrist, arm, leg translation in finger layer.

After / evidence:
```json
{
  "active": true,
  "side": "R",
  "source": "V236_ALL_Z_STOP_INDEX_MCP_0p36",
  "terms": {
    "index": [
      {
        "seg": 0,
        "axis": "z",
        "sign": 1,
        "amount": 0.36,
        "role": "V238_INDEX_MCP_VISUAL_AUDIT_APPROVED"
      },
      {
        "seg": 1,
        "axis": "z",
        "sign": 1,
        "amount": 0.72,
        "role": "V234_STOP_ON_CONTACT_PIP"
      },
      {
        "seg": 2,
        "axis": "z",
        "sign": 1,
        "amount": 0.36,
        "role": "V234_STOP_ON_CONTACT_DIP"
      }
    ],
    "middle": [
      {
        "seg": 0,
        "axis": "z",
        "sign": 1,
        "amount": 0.84,
        "role": "V234_STOP_ON_CONTACT_MCP"
      },
      {
        "seg": 1,
        "axis": "z",
        "sign": 1,
        "amount": 0.72,
        "role": "V234_STOP_ON_CONTACT_PIP"
      },
      {
        "seg": 2,
        "axis": "z",
        "sign": 1,
        "amount": 0.36,
        "role": "V234_STOP_ON_CONTACT_DIP"
      }
    ],
    "ring": [
      {
        "seg": 0,
        "axis": "z",
        "sign": 1,
        "amount": 0.84,
        "role": "V234_STOP_ON_CONTACT_MCP"
      },
      {
        "seg": 1,
        "axis": "z",
        "sign": 1,
        "amount": 0.72,
        "role": "V234_STOP_ON_CONTACT_PIP"
      },
      {
        "seg": 2,
        "axis": "z",
        "sign": 1,
        "amount": 0.06,
        "role": "V234_STOP_ON_CONTACT_DIP"
      }
    ],
    "pinky": [
      {
        "seg": 0,
        "axis": "z",
        "sign": 1,
        "amount": 0.84,
        "role": "V234_STOP_ON_CONTACT_MCP"
      },
      {
        "seg": 1,
        "axis": "z",
        "sign": 1,
        "amount": 0.68,
        "role": "V234_STOP_ON_CONTACT_PIP"
      }
    ]
  },
  "rowCount": 12
}
```
Blockers before left/general use:
- Approved branch guarded by if(side===R). Left z- is not enough until steps 2-5 are side-parametric and pass camera truth.

## Handpunkterna på höger

De två godkända högerpunkterna är inte nya semantic guesses. De är verifierade som faktiska mesh/handpunkter:

```json
{
  "rightGreen": {
    "source": "R_green_approved_vertex_58174",
    "targetTop": "L_Thumb2",
    "targetGroup": "thumb",
    "dist": {
      "H_R_Hand": 0.08192,
      "M_R_Mid1": 0.06092,
      "I_R_Index1": 0.04422,
      "P_R_Pinky1": 0.08761,
      "T_R_Thumb1": 0.05407,
      "Fore_R_Forearm": 0.2851,
      "Index2_R_Index2": 0.06803,
      "Pinky2_R_Pinky2": 0.09449,
      "Thumb2_R_Thumb2": 0.01003
    },
    "skin": {
      "hand": 0,
      "thumb": 1,
      "index": 0,
      "mid": 0,
      "ring": 0,
      "pinky": 0,
      "forearm": 0,
      "other": 0,
      "top": "R_Thumb2",
      "topw": 1,
      "items": [
        [
          "R_Thumb2",
          1
        ],
        [
          "Pelvis",
          0
        ],
        [
          "Pelvis",
          0
        ],
        [
          "Pelvis",
          0
        ]
      ]
    },
    "rightLocal": {
      "x": 0.93966,
      "y": 0.70339,
      "z": 0.42636
    },
    "rightWorld": {
      "x": -0.14917,
      "y": 0.71196,
      "z": -0.26927
    },
    "rightVertex": {
      "idx": 58174,
      "d": 0,
      "p": {
        "x": -0.14917,
        "y": 0.71196,
        "z": -0.26927
      },
      "local": {
        "x": 0.93966,
        "y": 0.70339,
        "z": 0.42636
      },
      "skin": {
        "hand": 0,
        "thumb": 1,
        "index": 0,
        "mid": 0,
        "ring": 0,
        "pinky": 0,
        "forearm": 0,
        "other": 0,
        "top": "R_Thumb2",
        "topw": 1,
        "items": [
          [
            "R_Thumb2",
            1
          ],
          [
            "Pelvis",
            0
          ],
          [
            "Pelvis",
            0
          ],
          [
            "Pelvis",
            0
          ]
        ]
      }
    }
  },
  "rightPink": {
    "source": "R_pink_approved_vertex_58358",
    "targetTop": "L_Hand",
    "targetGroup": "hand",
    "dist": {
      "H_R_Hand": 0.05549,
      "M_R_Mid1": 0.0416,
      "I_R_Index1": 0.0481,
      "P_R_Pinky1": 0.04058,
      "T_R_Thumb1": 0.04187,
      "Fore_R_Forearm": 0.27509,
      "Index2_R_Index2": 0.06964,
      "Pinky2_R_Pinky2": 0.05245,
      "Thumb2_R_Thumb2": 0.0551
    },
    "skin": {
      "hand": 0.984,
      "thumb": 0.016,
      "index": 0,
      "mid": 0,
      "ring": 0,
      "pinky": 0,
      "forearm": 0,
      "other": 0,
      "top": "R_Hand",
      "topw": 0.984,
      "items": [
        [
          "R_Hand",
          0.984
        ],
        [
          "R_Thumb1",
          0.016
        ],
        [
          "Pelvis",
          0
        ],
        [
          "Pelvis",
          0
        ]
      ]
    },
    "rightLocal": {
      "x": -0.08284,
      "y": 0.62487,
      "z": 0.34506
    },
    "rightWorld": {
      "x": -0.14789,
      "y": 0.74294,
      "z": -0.31771
    },
    "rightVertex": {
      "idx": 58358,
      "d": 0,
      "p": {
        "x": -0.14789,
        "y": 0.74294,
        "z": -0.31771
      },
      "local": {
        "x": -0.08284,
        "y": 0.62487,
        "z": 0.34506
      },
      "skin": {
        "hand": 0.984,
        "thumb": 0.016,
        "index": 0,
        "mid": 0,
        "ring": 0,
        "pinky": 0,
        "forearm": 0,
        "other": 0,
        "top": "R_Hand",
        "topw": 0.984,
        "items": [
          [
            "R_Hand",
            0.984
          ],
          [
            "R_Thumb1",
            0.016
          ],
          [
            "Pelvis",
            0
          ],
          [
            "Pelvis",
            0
          ]
        ]
      }
    }
  }
}
```

Kort tolkning:
- `green` = höger thenar/tum-sida i handflatan, vertex `58174`, 100% `R_Thumb2`.
- `pink` = höger handflata/opposite palm, vertex `58358`, mest `R_Hand`.
- Båda ligger i/vid insidan av handen. Ingen av dem ska ersättas av “närmsta synliga meshpunkt”.

## Viktig korrigering av tidigare resonemang

Det är inte “vilken punkt som träffar först” som är authority. Höger använder två handflats-punkter för att definiera handens palm-kontrakt. En punkt kan vara kontaktlåset, men den andra måste också hamna korrekt efter wrist/palm-rotation. Båda måste bedömas mot kamera/occlusion och fysisk geometri.

## Vad måste implementeras för vänster

```text
1. Ta V189/V198/V199/V238 som process, inte som världskoordinater.
2. Gör V189 side-parametrisk: L handbranch ska byggas exakt som R handbranch.
3. Handpunkterna ska vara vänsterhomologer till R green/pink, inte nya gissningar.
4. Benets snap-punkt ska vara en enda punkt på utsidan av vänster underben.
5. Flytta/rotera handen så handflats-kontraktet hamnar mot den utsidan.
6. Inga fingrar förrän båda handflats-punkterna stämmer i kamera och geometri.
7. Först därefter kör vänster fingerplan z-.
```

## Saker vi fortfarande inte får låtsas veta

- V198:s `deltaV195` är en godkänd högerdelta, inte en generell snap-target-derivation.
- V199:s `pinkLegTarget` är hårdkodad för högerdiagnostik, inte en generell vänster target.
- V151/palmGapM har redan bevisats kunna säga pass/fail tvärtom mot kameran, så den är inte ensam authority.
- Vänster får inte använda same-local R-koordinater om homology-auditen visar annan anatomisk vänsterpunkt.

## Nästa patch efter denna audit

Nästa steg ska vara V266, men bara med denna avgränsning:

```text
Implementera applyRightGripProcess(side) så att side=R reproducerar V239/V236 utan drift.
Sedan körs side=L med samma process, med vänsterhomologa handpunkter och utsidespunkt på vänster underben.
Inga nya vänsterpunkter får väljas dynamiskt.
```