{"abstract":"Femur pitch is wrong whenever femur and tibia differ in length.","category":"Inverse kinematics solvers","checks":7,"contract":"Input [coxa,femur,tibia,x,y,z,fmin,fmax]: foot target in the leg root frame (z up). Coxa yaw is atan2(y,x); the femur/tibia pair works in the vertical plane at horizontal distance hypot(x,y)-coxa. With D the distance from the femur pivot to the foot, D>femur+tibia or D<|femur-tibia| or D==0 is \"unreachable\". Femur pitch is atan2(z,h) plus the triangle angle at the femur pivot (knee up); tibia angle is the interior knee angle minus 180 (0 = straight). Femur pitch outside [fmin,fmax] returns \"limit\". Degrees rounded to 4.","evaluation_group":"w2-inverse_kinematics_solvers-hexapod-leg","failed_approach":"Dividing by 2 femur tibia uses the wrong adjacent side product.","family":"w2-inverse_kinematics_solvers-hexapod-leg-femur-triangle-vertex","id":"FA-88161","implementations":{"attempt":{"sha256":"bbd79f6a13284f8627403e39d8fff17c0007038b0d9092b50f8361b1c8da8955","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    cx,fe,ti,px,py,pz,fmin,fmax=x\n    ca=math.atan2(py,px)\n    h=math.hypot(px,py)-cx\n    D=math.hypot(h,pz)\n    if D>fe+ti or D<abs(fe-ti) or D==0: return 'unreachable'\n    a1=math.atan2(pz,h)\n    a2=math.acos(max(-1.0,min(1.0,(fe*fe+D*D-ti*ti)/(2*fe*ti))))\n    fa=math.degrees(a1+a2)\n    ta=math.degrees(math.acos(max(-1.0,min(1.0,(fe*fe+ti*ti-D*D)/(2*fe*ti)))))-180.0\n    if fa<fmin or fa>fmax: return 'limit'\n    return [round(math.degrees(ca),4),round(fa,4),round(ta,4)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['nominal stance', [[3, 6, 8, 10, 2, -6, -90, 90]], [11.3099, 18.0529, -97.294]], ['foot straight out', [[3, 6, 8, 12, 0, -3, -90, 90]], [0.0, 38.5667, -95.9792]], ['foot to the side', [[2, 5, 7, 1, 9, -4, -90, 90]], [83.6598, 29.4436, -96.745]], ['foot behind', [[2, 5, 7, -8, -3, -5, -90, 90]], [-159.444, 20.4684, -95.0617]], ['foot out of reach', [[3, 6, 8, 18, 0, -2, -90, 90]], 'unreachable'], ['foot inside coxa reach', [[3, 6, 8, 16, 0, 0, -90, 90]], [0.0, 25.3317, -44.0486]], ['high foot', [[3, 6, 8, 9, 3, 4, -90, 90]], 'limit']], [['foot straight out', [[3, 6, 8, 12, 0, -3, -90, 90]], [0.0, 38.5667, -95.9792]], ['foot out of reach', [[3, 6, 8, 18, 0, -2, -90, 90]], 'unreachable'], ['foot inside coxa reach', [[3, 6, 8, 16, 0, 0, -90, 90]], [0.0, 25.3317, -44.0486]], ['high foot', [[3, 6, 8, 9, 3, 4, -90, 90]], 'limit'], ['femur limit exceeded', [[3, 6, 8, 5, 0, 6, -90, 30]], 'limit'], ['deep foot', [[3, 6, 8, 5, 5, -9, -90, 90]], [45.0, -11.6013, -91.4483]], ['tight femur limits', [[3, 6, 8, 10, 2, -6, -10, 10]], 'limit']], [['foot to the side', [[2, 5, 7, 1, 9, -4, -90, 90]], [83.6598, 29.4436, -96.745]], ['femur limit exceeded', [[3, 6, 8, 5, 0, 6, -90, 30]], 'limit'], ['deep foot', [[3, 6, 8, 5, 5, -9, -90, 90]], [45.0, -11.6013, -91.4483]], ['tight femur limits', [[3, 6, 8, 10, 2, -6, -10, 10]], 'limit'], ['long tibia near', [[2, 4, 9, 6, 1, -8, -90, 90]], [9.4623, 14.4416, -103.1099]], ['diagonal foot', [[2.5, 5, 6, -6, 6, -3, -90, 90]], [135.0, 33.0338, -105.6409]], ['hole too close', [[3, 6, 12, 4, 0, -1, -90, 90]], 'unreachable']], [['nominal stance', [[3, 6, 8, 10, 2, -6, -90, 90]], [11.3099, 18.0529, -97.294]], ['foot behind', [[2, 5, 7, -8, -3, -5, -90, 90]], [-159.444, 20.4684, -95.0617]], ['long tibia near', [[2, 4, 9, 6, 1, -8, -90, 90]], [9.4623, 14.4416, -103.1099]], ['diagonal foot', [[2.5, 5, 6, -6, 6, -3, -90, 90]], [135.0, 33.0338, -105.6409]], ['hole too close', [[3, 6, 12, 4, 0, -1, -90, 90]], 'unreachable'], ['foot far below', [[3, 6, 8, 15, 0, -10, -90, 90]], 'unreachable'], ['femur at lower bound', [[3, 6, 8, 11, 0, -8, -60, 90]], [0.0, -2.44, -73.0422]]], [['nominal stance', [[3, 6, 8, 10, 2, -6, -90, 90]], [11.3099, 18.0529, -97.294]], ['foot straight out', [[3, 6, 8, 12, 0, -3, -90, 90]], [0.0, 38.5667, -95.9792]], ['foot to the side', [[2, 5, 7, 1, 9, -4, -90, 90]], [83.6598, 29.4436, -96.745]], ['foot behind', [[2, 5, 7, -8, -3, -5, -90, 90]], [-159.444, 20.4684, -95.0617]], ['foot inside coxa reach', [[3, 6, 8, 16, 0, 0, -90, 90]], [0.0, 25.3317, -44.0486]], ['foot far below', [[3, 6, 8, 15, 0, -10, -90, 90]], 'unreachable'], ['femur at lower bound', [[3, 6, 8, 11, 0, -8, -60, 90]], [0.0, -2.44, -73.0422]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"2ef3fdbb795a09d536c3275aef262b081cda706cbb411791cba78a706dedc5e2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    cx,fe,ti,px,py,pz,fmin,fmax=x\n    ca=math.atan2(py,px)\n    h=math.hypot(px,py)-cx\n    D=math.hypot(h,pz)\n    if D>fe+ti or D<abs(fe-ti) or D==0: return 'unreachable'\n    a1=math.atan2(pz,h)\n    a2=math.acos(max(-1.0,min(1.0,(ti*ti+D*D-fe*fe)/(2*ti*D))))\n    fa=math.degrees(a1+a2)\n    ta=math.degrees(math.acos(max(-1.0,min(1.0,(fe*fe+ti*ti-D*D)/(2*fe*ti)))))-180.0\n    if fa<fmin or fa>fmax: return 'limit'\n    return [round(math.degrees(ca),4),round(fa,4),round(ta,4)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['nominal stance', [[3, 6, 8, 10, 2, -6, -90, 90]], [11.3099, 18.0529, -97.294]], ['foot straight out', [[3, 6, 8, 12, 0, -3, -90, 90]], [0.0, 38.5667, -95.9792]], ['foot to the side', [[2, 5, 7, 1, 9, -4, -90, 90]], [83.6598, 29.4436, -96.745]], ['foot behind', [[2, 5, 7, -8, -3, -5, -90, 90]], [-159.444, 20.4684, -95.0617]], ['foot out of reach', [[3, 6, 8, 18, 0, -2, -90, 90]], 'unreachable'], ['foot inside coxa reach', [[3, 6, 8, 16, 0, 0, -90, 90]], [0.0, 25.3317, -44.0486]], ['high foot', [[3, 6, 8, 9, 3, 4, -90, 90]], 'limit']], [['foot straight out', [[3, 6, 8, 12, 0, -3, -90, 90]], [0.0, 38.5667, -95.9792]], ['foot out of reach', [[3, 6, 8, 18, 0, -2, -90, 90]], 'unreachable'], ['foot inside coxa reach', [[3, 6, 8, 16, 0, 0, -90, 90]], [0.0, 25.3317, -44.0486]], ['high foot', [[3, 6, 8, 9, 3, 4, -90, 90]], 'limit'], ['femur limit exceeded', [[3, 6, 8, 5, 0, 6, -90, 30]], 'limit'], ['deep foot', [[3, 6, 8, 5, 5, -9, -90, 90]], [45.0, -11.6013, -91.4483]], ['tight femur limits', [[3, 6, 8, 10, 2, -6, -10, 10]], 'limit']], [['foot to the side', [[2, 5, 7, 1, 9, -4, -90, 90]], [83.6598, 29.4436, -96.745]], ['femur limit exceeded', [[3, 6, 8, 5, 0, 6, -90, 30]], 'limit'], ['deep foot', [[3, 6, 8, 5, 5, -9, -90, 90]], [45.0, -11.6013, -91.4483]], ['tight femur limits', [[3, 6, 8, 10, 2, -6, -10, 10]], 'limit'], ['long tibia near', [[2, 4, 9, 6, 1, -8, -90, 90]], [9.4623, 14.4416, -103.1099]], ['diagonal foot', [[2.5, 5, 6, -6, 6, -3, -90, 90]], [135.0, 33.0338, -105.6409]], ['hole too close', [[3, 6, 12, 4, 0, -1, -90, 90]], 'unreachable']], [['nominal stance', [[3, 6, 8, 10, 2, -6, -90, 90]], [11.3099, 18.0529, -97.294]], ['foot behind', [[2, 5, 7, -8, -3, -5, -90, 90]], [-159.444, 20.4684, -95.0617]], ['long tibia near', [[2, 4, 9, 6, 1, -8, -90, 90]], [9.4623, 14.4416, -103.1099]], ['diagonal foot', [[2.5, 5, 6, -6, 6, -3, -90, 90]], [135.0, 33.0338, -105.6409]], ['hole too close', [[3, 6, 12, 4, 0, -1, -90, 90]], 'unreachable'], ['foot far below', [[3, 6, 8, 15, 0, -10, -90, 90]], 'unreachable'], ['femur at lower bound', [[3, 6, 8, 11, 0, -8, -60, 90]], [0.0, -2.44, -73.0422]]], [['nominal stance', [[3, 6, 8, 10, 2, -6, -90, 90]], [11.3099, 18.0529, -97.294]], ['foot straight out', [[3, 6, 8, 12, 0, -3, -90, 90]], [0.0, 38.5667, -95.9792]], ['foot to the side', [[2, 5, 7, 1, 9, -4, -90, 90]], [83.6598, 29.4436, -96.745]], ['foot behind', [[2, 5, 7, -8, -3, -5, -90, 90]], [-159.444, 20.4684, -95.0617]], ['foot inside coxa reach', [[3, 6, 8, 16, 0, 0, -90, 90]], [0.0, 25.3317, -44.0486]], ['foot far below', [[3, 6, 8, 15, 0, -10, -90, 90]], 'unreachable'], ['femur at lower bound', [[3, 6, 8, 11, 0, -8, -60, 90]], [0.0, -2.44, -73.0422]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"341ce9afa9adab139d992a4e442101cf05b347c254797f0b86d7443a1941089c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    cx,fe,ti,px,py,pz,fmin,fmax=x\n    ca=math.atan2(py,px)\n    h=math.hypot(px,py)-cx\n    D=math.hypot(h,pz)\n    if D>fe+ti or D<abs(fe-ti) or D==0: return 'unreachable'\n    a1=math.atan2(pz,h)\n    a2=math.acos(max(-1.0,min(1.0,(fe*fe+D*D-ti*ti)/(2*fe*D))))\n    fa=math.degrees(a1+a2)\n    ta=math.degrees(math.acos(max(-1.0,min(1.0,(fe*fe+ti*ti-D*D)/(2*fe*ti)))))-180.0\n    if fa<fmin or fa>fmax: return 'limit'\n    return [round(math.degrees(ca),4),round(fa,4),round(ta,4)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['nominal stance', [[3, 6, 8, 10, 2, -6, -90, 90]], [11.3099, 18.0529, -97.294]], ['foot straight out', [[3, 6, 8, 12, 0, -3, -90, 90]], [0.0, 38.5667, -95.9792]], ['foot to the side', [[2, 5, 7, 1, 9, -4, -90, 90]], [83.6598, 29.4436, -96.745]], ['foot behind', [[2, 5, 7, -8, -3, -5, -90, 90]], [-159.444, 20.4684, -95.0617]], ['foot out of reach', [[3, 6, 8, 18, 0, -2, -90, 90]], 'unreachable'], ['foot inside coxa reach', [[3, 6, 8, 16, 0, 0, -90, 90]], [0.0, 25.3317, -44.0486]], ['high foot', [[3, 6, 8, 9, 3, 4, -90, 90]], 'limit']], [['foot straight out', [[3, 6, 8, 12, 0, -3, -90, 90]], [0.0, 38.5667, -95.9792]], ['foot out of reach', [[3, 6, 8, 18, 0, -2, -90, 90]], 'unreachable'], ['foot inside coxa reach', [[3, 6, 8, 16, 0, 0, -90, 90]], [0.0, 25.3317, -44.0486]], ['high foot', [[3, 6, 8, 9, 3, 4, -90, 90]], 'limit'], ['femur limit exceeded', [[3, 6, 8, 5, 0, 6, -90, 30]], 'limit'], ['deep foot', [[3, 6, 8, 5, 5, -9, -90, 90]], [45.0, -11.6013, -91.4483]], ['tight femur limits', [[3, 6, 8, 10, 2, -6, -10, 10]], 'limit']], [['foot to the side', [[2, 5, 7, 1, 9, -4, -90, 90]], [83.6598, 29.4436, -96.745]], ['femur limit exceeded', [[3, 6, 8, 5, 0, 6, -90, 30]], 'limit'], ['deep foot', [[3, 6, 8, 5, 5, -9, -90, 90]], [45.0, -11.6013, -91.4483]], ['tight femur limits', [[3, 6, 8, 10, 2, -6, -10, 10]], 'limit'], ['long tibia near', [[2, 4, 9, 6, 1, -8, -90, 90]], [9.4623, 14.4416, -103.1099]], ['diagonal foot', [[2.5, 5, 6, -6, 6, -3, -90, 90]], [135.0, 33.0338, -105.6409]], ['hole too close', [[3, 6, 12, 4, 0, -1, -90, 90]], 'unreachable']], [['nominal stance', [[3, 6, 8, 10, 2, -6, -90, 90]], [11.3099, 18.0529, -97.294]], ['foot behind', [[2, 5, 7, -8, -3, -5, -90, 90]], [-159.444, 20.4684, -95.0617]], ['long tibia near', [[2, 4, 9, 6, 1, -8, -90, 90]], [9.4623, 14.4416, -103.1099]], ['diagonal foot', [[2.5, 5, 6, -6, 6, -3, -90, 90]], [135.0, 33.0338, -105.6409]], ['hole too close', [[3, 6, 12, 4, 0, -1, -90, 90]], 'unreachable'], ['foot far below', [[3, 6, 8, 15, 0, -10, -90, 90]], 'unreachable'], ['femur at lower bound', [[3, 6, 8, 11, 0, -8, -60, 90]], [0.0, -2.44, -73.0422]]], [['nominal stance', [[3, 6, 8, 10, 2, -6, -90, 90]], [11.3099, 18.0529, -97.294]], ['foot straight out', [[3, 6, 8, 12, 0, -3, -90, 90]], [0.0, 38.5667, -95.9792]], ['foot to the side', [[2, 5, 7, 1, 9, -4, -90, 90]], [83.6598, 29.4436, -96.745]], ['foot behind', [[2, 5, 7, -8, -3, -5, -90, 90]], [-159.444, 20.4684, -95.0617]], ['foot inside coxa reach', [[3, 6, 8, 16, 0, 0, -90, 90]], [0.0, 25.3317, -44.0486]], ['foot far below', [[3, 6, 8, 15, 0, -10, -90, 90]], 'unreachable'], ['femur at lower bound', [[3, 6, 8, 11, 0, -8, -60, 90]], [0.0, -2.44, -73.0422]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Deterministic planar or low-dimensional teaching model with a stipulated convention; not a general robotics library. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-inverse_kinematics_solvers-hexapod-leg-femur-triangle-vertex","generated_at":"2026-09-29T14:51:05.595452+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Inverse kinematics code turns task-space goals into joint commands; a wrong branch, sign, limit or update order sends a real arm to the wrong pose.","repair":"Use (femur^2 + D^2 - tibia^2)/(2 femur D).","root_cause":"The law of cosines uses the tibia as the adjacent side, giving the angle at the foot vertex.","sha256":"0cfe2f755195bb1f9e3a5ed2375e761c6fce17faa109703e09fb477c75022bc3","title":"Hexapod femur triangle angle is taken at the foot · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.919,"exit_code":1,"observations":[{"actual":[11.3099,11.6483,-97.294],"check":"nominal stance","expected":[11.3099,18.0529,-97.294],"passed":false},{"actual":[0.0,31.3369,-95.9792],"check":"foot straight out","expected":[0.0,38.5667,-95.9792],"passed":false},{"actual":[83.6598,23.8057,-96.745],"check":"foot to the side","expected":[83.6598,29.4436,-96.745],"passed":false},{"actual":[-159.444,13.8583,-95.0617],"check":"foot behind","expected":[-159.444,20.4684,-95.0617],"passed":false},{"actual":"unreachable","check":"foot out of reach","expected":"unreachable","passed":true},{"actual":[0.0,0.0,-44.0486],"check":"foot inside coxa reach","expected":[0.0,25.3317,-44.0486],"passed":false},{"actual":"limit","check":"high foot","expected":"limit","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"nominal stance\", \"actual\": [11.3099, 11.6483, -97.294], \"expected\": [11.3099, 18.0529, -97.294], \"passed\": false}, {\"check\": \"foot straight out\", \"actual\": [0.0, 31.3369, -95.9792], \"expected\": [0.0, 38.5667, -95.9792], \"passed\": false}, {\"check\": \"foot to the side\", \"actual\": [83.6598, 23.8057, -96.745], \"expected\": [83.6598, 29.4436, -96.745], \"passed\": false}, {\"check\": \"foot behind\", \"actual\": [-159.444, 13.8583, -95.0617], \"expected\": [-159.444, 20.4684, -95.0617], \"passed\": false}, {\"check\": \"foot out of reach\", \"actual\": \"unreachable\", \"expected\": \"unreachable\", \"passed\": true}, {\"check\": \"foot inside coxa reach\", \"actual\": [0.0, 0.0, -44.0486], \"expected\": [0.0, 25.3317, -44.0486], \"passed\": false}, {\"check\": \"high foot\", \"actual\": \"limit\", \"expected\": \"limit\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.312,"exit_code":1,"observations":[{"actual":[11.3099,-0.3854,-97.294],"check":"nominal stance","expected":[11.3099,18.0529,-97.294],"passed":false},{"actual":[0.0,20.5425,-95.9792],"check":"foot straight out","expected":[0.0,38.5667,-95.9792],"passed":false},{"actual":[83.6598,8.1999,-96.745],"check":"foot to the side","expected":[83.6598,29.4436,-96.745],"passed":false},{"actual":[-159.444,-0.1705,-95.0617],"check":"foot behind","expected":[-159.444,20.4684,-95.0617],"passed":false},{"actual":"unreachable","check":"foot out of reach","expected":"unreachable","passed":true},{"actual":[0.0,18.717,-44.0486],"check":"foot inside coxa reach","expected":[0.0,25.3317,-44.0486],"passed":false},{"actual":[18.4349,76.7539,-115.8921],"check":"high foot","expected":"limit","passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"nominal stance\", \"actual\": [11.3099, -0.3854, -97.294], \"expected\": [11.3099, 18.0529, -97.294], \"passed\": false}, {\"check\": \"foot straight out\", \"actual\": [0.0, 20.5425, -95.9792], \"expected\": [0.0, 38.5667, -95.9792], \"passed\": false}, {\"check\": \"foot to the side\", \"actual\": [83.6598, 8.1999, -96.745], \"expected\": [83.6598, 29.4436, -96.745], \"passed\": false}, {\"check\": \"foot behind\", \"actual\": [-159.444, -0.1705, -95.0617], \"expected\": [-159.444, 20.4684, -95.0617], \"passed\": false}, {\"check\": \"foot out of reach\", \"actual\": \"unreachable\", \"expected\": \"unreachable\", \"passed\": true}, {\"check\": \"foot inside coxa reach\", \"actual\": [0.0, 18.717, -44.0486], \"expected\": [0.0, 25.3317, -44.0486], \"passed\": false}, {\"check\": \"high foot\", \"actual\": [18.4349, 76.7539, -115.8921], \"expected\": \"limit\", \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.065,"exit_code":0,"observations":[{"actual":[11.3099,18.0529,-97.294],"check":"nominal stance","expected":[11.3099,18.0529,-97.294],"passed":true},{"actual":[0.0,38.5667,-95.9792],"check":"foot straight out","expected":[0.0,38.5667,-95.9792],"passed":true},{"actual":[83.6598,29.4436,-96.745],"check":"foot to the side","expected":[83.6598,29.4436,-96.745],"passed":true},{"actual":[-159.444,20.4684,-95.0617],"check":"foot behind","expected":[-159.444,20.4684,-95.0617],"passed":true},{"actual":"unreachable","check":"foot out of reach","expected":"unreachable","passed":true},{"actual":[0.0,25.3317,-44.0486],"check":"foot inside coxa reach","expected":[0.0,25.3317,-44.0486],"passed":true},{"actual":"limit","check":"high foot","expected":"limit","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"nominal stance\", \"actual\": [11.3099, 18.0529, -97.294], \"expected\": [11.3099, 18.0529, -97.294], \"passed\": true}, {\"check\": \"foot straight out\", \"actual\": [0.0, 38.5667, -95.9792], \"expected\": [0.0, 38.5667, -95.9792], \"passed\": true}, {\"check\": \"foot to the side\", \"actual\": [83.6598, 29.4436, -96.745], \"expected\": [83.6598, 29.4436, -96.745], \"passed\": true}, {\"check\": \"foot behind\", \"actual\": [-159.444, 20.4684, -95.0617], \"expected\": [-159.444, 20.4684, -95.0617], \"passed\": true}, {\"check\": \"foot out of reach\", \"actual\": \"unreachable\", \"expected\": \"unreachable\", \"passed\": true}, {\"check\": \"foot inside coxa reach\", \"actual\": [0.0, 25.3317, -44.0486], \"expected\": [0.0, 25.3317, -44.0486], \"passed\": true}, {\"check\": \"high foot\", \"actual\": \"limit\", \"expected\": \"limit\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}