{
  "schema": "NEXT11_GENERIC_GRIP_SOLVER_V1_CONTRACT",
  "version": "V335",
  "activePath": [
    "sourceContactAuthorityForCase",
    "genericGripIntentFromSourceContact",
    "applyOneWriterCommit",
    "solveGenericGripContact"
  ],
  "singleAuthority": true,
  "sidePolicy": "A complete source gripSide must be L or R. Missing or invalid side means no solve; there is no default side.",
  "contactContract": [
    "Commit canonical normalized IK to Nex before grip refinement.",
    "Reset only the active hand and finger children to captured rig rest.",
    "Use Index1/Pinky1 MCP positions shifted 10 mm proximally in the palm plane as the two fixed hand points.",
    "Use one explicit exercise snap point: 50 mm world-down from ankle/axisA and one existing cylinder radius toward the lateral outside.",
    "Move the whole arm so the nearest fixed hand point reaches the snap point.",
    "Align the line between the two hand points to the object cylinder axis while keeping the snap locked.",
    "Resolve palm side deterministically: the cylinder must lie in the hand's local -Z closing direction.",
    "Close Thumb/Index/Mid/Ring/Pinky MCP -> PIP -> DIP in local -Z, stopping each joint at the existing cylinder."
  ],
  "actualGeometry": {
    "palm": "Two fixed MCP-derived points, each 10 mm proximally toward the wrist in the palm plane",
    "target": "Explicit exercise snap point plus the existing source cylinderAxis/capsuleRadiusMeters collision primitive",
    "screenSpaceMarkersAreAuthority": false,
    "fixedVertexIdsAreAuthority": false,
    "broadMidPalmSphereIsAuthority": false
  },
  "blockingGates": {
    "firstSnapErrorMaxM": 0.012,
    "palmLineAngleMaxDeg": 8,
    "localNegativeZTowardCylinderMinDotExclusive": 0,
    "indexCylinderDistanceMaxM": 0.012,
    "pinkyCylinderDistanceMaxM": 0.012,
    "digitCylinderPenetrationMaxM": 0.003
  },
  "removedFromActiveCallGraph": [
    "gripV1ApplyPalmContract",
    "v327ProximalPalmPatchCollisionSearchSolve",
    "v324ActualCalfObjectMeetRestartSolve",
    "v330NeutralizeHands",
    "v169MoveRaisedLegTowardGluteOnly",
    "v175AngleRaisedLegOutward",
    "V332 explicit A/B candidate forcing",
    "genericGripCollectGeometry",
    "genericGripNearest",
    "genericGripChooseFirstContact",
    "genericGripLocalSkinClearance"
  ]
}
