{"abstract":"A tracker mounted too low is forced to a steep angle.","category":"Solar tracker geometry","checks":7,"contract":"Hub height h and module width w in mm. Maximum rotation keeps the low edge at least clear above flat ground: asin((h - clear)/(w/2)), 90 when that ratio >= 1, 0 when <= 0. The command is theta clamped to +-max. Reported clearance is h - (w/2)|sin cmd| minus the ground rise under the low edge, side*(w/2)cos(cmd)tan(slope), where side is the sign of cmd or, at 0, the sign of slope (>= 0 counts positive). Return [cmd rounded 3, clearance rounded 1].","evaluation_group":"w2-solar_tracker_geometry-edge-ground-clearance","failed_approach":"Treating it as unconstrained drives the edge into the ground.","family":"w2-solar_tracker_geometry-edge-ground-clearance-hub-below-clearance","id":"FA-93746","implementations":{"attempt":{"sha256":"5e852c402fff666623f0880a3182ec9d197af5f359d1543684a3284399747264","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(theta, h, w, clear, slope):\n    half = w / 2\n    lim = (h - clear) / half\n    if lim >= 1:\n        amax = 90.0\n    elif lim <= 0:\n        amax = 90.0\n    else:\n        amax = math.degrees(math.asin(lim))\n    cmd = max(-amax, min(amax, theta))\n    r = math.radians(cmd)\n    low = h - half * abs(math.sin(r))\n    if cmd != 0:\n        side = 1 if cmd > 0 else -1\n    else:\n        side = 1 if slope >= 0 else -1\n    ground = side * half * math.cos(r) * math.tan(math.radians(slope))\n    return [round(cmd, 3), round(low - ground, 1)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [20, 2500, 2000, 2600, -10], [-0.0, 2323.7]],\n  ['regression: hub below clearance (partial repair)', [20, 1200, 2000, 1300, 3], [-0.0, 1147.6]],\n  ['control 1', [-45, 1200, 2384, 300, -10], [-45, 208.5]],\n  ['control 2', [45, 1500, 2256, 2600, 0], [-0.0, 1500.0]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [20, 2500, 2000, 2600, 0], [-0.0, 2500.0]],\n  ['regression: hub below clearance (partial repair)', [20, 2500, 2256, 2600, 8], [-0.0, 2341.5]],\n  ['control 1', [20, 2000, 2256, 500, -10], [20, 1801.1]],\n  ['control 2', [0, 2500, 2000, 300, -5], [0, 2412.5]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [0, 2000, 2384, 2600, 3], [-0.0, 1937.5]],\n  ['regression: hub below clearance (partial repair)', [20, 2500, 1133, 2600, 8], [-0.0, 2420.4]],\n  ['control 1', [60, 2500, 1133, 1300, 8], [60, 1969.6]],\n  ['control 2', [20, 1200, 2000, 1300, 3], [-0.0, 1147.6]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [45, 1200, 2384, 1300, 0], [-0.0, 1200.0]],\n  ['regression: hub below clearance (partial repair)', [-30, 1200, 4000, 2600, 0], [-0.0, 1200.0]],\n  ['control 1', [45, 1200, 1133, 300, 3], [45, 778.4]],\n  ['control 2', [-45, 2000, 2000, 1300, 8], [-44.427, 1400.4]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [60, 1200, 4000, 1300, -5], [-0.0, 1025.0]],\n  ['regression: hub below clearance (partial repair)', [-45, 2500, 1133, 2600, 0], [-0.0, 2500.0]],\n  ['control 1', [-30, 1500, 2384, 500, -5], [-30, 813.7]],\n  ['control 2', [-30, 1200, 4000, 2600, 0], [-0.0, 1200.0]]]]\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":"cef44f0b8180d2bfa6928d2df8dd39e220138cceed0bc4b1530ba3f376328b6f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(theta, h, w, clear, slope):\n    half = w / 2\n    lim = (h - clear) / half\n    if lim >= 1:\n        amax = 90.0\n    else:\n        amax = math.degrees(math.asin(lim))\n    cmd = max(-amax, min(amax, theta))\n    r = math.radians(cmd)\n    low = h - half * abs(math.sin(r))\n    if cmd != 0:\n        side = 1 if cmd > 0 else -1\n    else:\n        side = 1 if slope >= 0 else -1\n    ground = side * half * math.cos(r) * math.tan(math.radians(slope))\n    return [round(cmd, 3), round(low - ground, 1)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [20, 2500, 2000, 2600, -10], [-0.0, 2323.7]],\n  ['regression: hub below clearance (partial repair)', [20, 1200, 2000, 1300, 3], [-0.0, 1147.6]],\n  ['control 1', [-45, 1200, 2384, 300, -10], [-45, 208.5]],\n  ['control 2', [45, 1500, 2256, 2600, 0], [-0.0, 1500.0]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [20, 2500, 2000, 2600, 0], [-0.0, 2500.0]],\n  ['regression: hub below clearance (partial repair)', [20, 2500, 2256, 2600, 8], [-0.0, 2341.5]],\n  ['control 1', [20, 2000, 2256, 500, -10], [20, 1801.1]],\n  ['control 2', [0, 2500, 2000, 300, -5], [0, 2412.5]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [0, 2000, 2384, 2600, 3], [-0.0, 1937.5]],\n  ['regression: hub below clearance (partial repair)', [20, 2500, 1133, 2600, 8], [-0.0, 2420.4]],\n  ['control 1', [60, 2500, 1133, 1300, 8], [60, 1969.6]],\n  ['control 2', [20, 1200, 2000, 1300, 3], [-0.0, 1147.6]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [45, 1200, 2384, 1300, 0], [-0.0, 1200.0]],\n  ['regression: hub below clearance (partial repair)', [-30, 1200, 4000, 2600, 0], [-0.0, 1200.0]],\n  ['control 1', [45, 1200, 1133, 300, 3], [45, 778.4]],\n  ['control 2', [-45, 2000, 2000, 1300, 8], [-44.427, 1400.4]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [60, 1200, 4000, 1300, -5], [-0.0, 1025.0]],\n  ['regression: hub below clearance (partial repair)', [-45, 2500, 1133, 2600, 0], [-0.0, 2500.0]],\n  ['control 1', [-30, 1500, 2384, 500, -5], [-30, 813.7]],\n  ['control 2', [-30, 1200, 4000, 2600, 0], [-0.0, 1200.0]]]]\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":"e34ddd64f193b7b445faca9a05336d39fd4fdb987045b59c9c1c0a6c08a8568a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(theta, h, w, clear, slope):\n    half = w / 2\n    lim = (h - clear) / half\n    if lim >= 1:\n        amax = 90.0\n    elif lim <= 0:\n        amax = 0.0\n    else:\n        amax = math.degrees(math.asin(lim))\n    cmd = max(-amax, min(amax, theta))\n    r = math.radians(cmd)\n    low = h - half * abs(math.sin(r))\n    if cmd != 0:\n        side = 1 if cmd > 0 else -1\n    else:\n        side = 1 if slope >= 0 else -1\n    ground = side * half * math.cos(r) * math.tan(math.radians(slope))\n    return [round(cmd, 3), round(low - ground, 1)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [20, 2500, 2000, 2600, -10], [-0.0, 2323.7]],\n  ['regression: hub below clearance (partial repair)', [20, 1200, 2000, 1300, 3], [-0.0, 1147.6]],\n  ['control 1', [-45, 1200, 2384, 300, -10], [-45, 208.5]],\n  ['control 2', [45, 1500, 2256, 2600, 0], [-0.0, 1500.0]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [20, 2500, 2000, 2600, 0], [-0.0, 2500.0]],\n  ['regression: hub below clearance (partial repair)', [20, 2500, 2256, 2600, 8], [-0.0, 2341.5]],\n  ['control 1', [20, 2000, 2256, 500, -10], [20, 1801.1]],\n  ['control 2', [0, 2500, 2000, 300, -5], [0, 2412.5]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [0, 2000, 2384, 2600, 3], [-0.0, 1937.5]],\n  ['regression: hub below clearance (partial repair)', [20, 2500, 1133, 2600, 8], [-0.0, 2420.4]],\n  ['control 1', [60, 2500, 1133, 1300, 8], [60, 1969.6]],\n  ['control 2', [20, 1200, 2000, 1300, 3], [-0.0, 1147.6]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [45, 1200, 2384, 1300, 0], [-0.0, 1200.0]],\n  ['regression: hub below clearance (partial repair)', [-30, 1200, 4000, 2600, 0], [-0.0, 1200.0]],\n  ['control 1', [45, 1200, 1133, 300, 3], [45, 778.4]],\n  ['control 2', [-45, 2000, 2000, 1300, 8], [-44.427, 1400.4]]],\n [['normal: rotation limited by clearance', [60, 1500, 2256, 500, 0], [60, 523.1]],\n  ['boundary: hub below required clearance', [30, 1200, 2000, 1300, 0], [-0.0, 1200.0]],\n  ['boundary: flat on sloped ground', [0, 1500, 2000, 500, -5], [0, 1412.5]],\n  ['regression: hub below clearance', [60, 1200, 4000, 1300, -5], [-0.0, 1025.0]],\n  ['regression: hub below clearance (partial repair)', [-45, 2500, 1133, 2600, 0], [-0.0, 2500.0]],\n  ['control 1', [-30, 1500, 2384, 500, -5], [-30, 813.7]],\n  ['control 2', [-30, 1200, 4000, 2600, 0], [-0.0, 1200.0]]]]\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 stipulated toy contract for teaching; no claim of conformance with any standard, vendor protocol or production controller. 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-solar_tracker_geometry-edge-ground-clearance-hub-below-clearance","generated_at":"2026-09-29T14:51:58.058299+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Single-axis and dual-axis solar trackers turn a sun direction into actuator commands; a sign, frame or limit mistake points a whole plant away from the sun or into a mechanical stop.","repair":"Hold the tracker flat when h <= clear.","root_cause":"The case where the hub is below the required clearance is not special-cased, so a negative limit inverts the clamp.","sha256":"fca66a8ccb7774a1823089b1baa3688a5dc41a839df8ef3357aba38812678370","title":"Module edge ground clearance limit: hub below clearance · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.505,"exit_code":1,"observations":[{"actual":[60,523.1],"check":"normal: rotation limited by clearance","expected":[60,523.1],"passed":true},{"actual":[30,700.0],"check":"boundary: hub below required clearance","expected":[-0.0,1200.0],"passed":false},{"actual":[0,1412.5],"check":"boundary: flat on sloped ground","expected":[0,1412.5],"passed":true},{"actual":[20,2323.7],"check":"regression: hub below clearance","expected":[-0.0,2323.7],"passed":false},{"actual":[20,808.7],"check":"regression: hub below clearance (partial repair)","expected":[-0.0,1147.6],"passed":false},{"actual":[-45,208.5],"check":"control 1","expected":[-45,208.5],"passed":true},{"actual":[45,702.4],"check":"control 2","expected":[-0.0,1500.0],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: rotation limited by clearance\", \"actual\": [60, 523.1], \"expected\": [60, 523.1], \"passed\": true}, {\"check\": \"boundary: hub below required clearance\", \"actual\": [30, 700.0], \"expected\": [-0.0, 1200.0], \"passed\": false}, {\"check\": \"boundary: flat on sloped ground\", \"actual\": [0, 1412.5], \"expected\": [0, 1412.5], \"passed\": true}, {\"check\": \"regression: hub below clearance\", \"actual\": [20, 2323.7], \"expected\": [-0.0, 2323.7], \"passed\": false}, {\"check\": \"regression: hub below clearance (partial repair)\", \"actual\": [20, 808.7], \"expected\": [-0.0, 1147.6], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [-45, 208.5], \"expected\": [-45, 208.5], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [45, 702.4], \"expected\": [-0.0, 1500.0], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.449,"exit_code":1,"observations":[{"actual":[60,523.1],"check":"normal: rotation limited by clearance","expected":[60,523.1],"passed":true},{"actual":[5.739,1100.0],"check":"boundary: hub below required clearance","expected":[-0.0,1200.0],"passed":false},{"actual":[0,1412.5],"check":"boundary: flat on sloped ground","expected":[0,1412.5],"passed":true},{"actual":[5.739,2575.4],"check":"regression: hub below clearance","expected":[-0.0,2323.7],"passed":false},{"actual":[5.739,1047.9],"check":"regression: hub below clearance (partial repair)","expected":[-0.0,1147.6],"passed":false},{"actual":[-45,208.5],"check":"control 1","expected":[-45,208.5],"passed":true},{"actual":[77.207,400.0],"check":"control 2","expected":[-0.0,1500.0],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: rotation limited by clearance\", \"actual\": [60, 523.1], \"expected\": [60, 523.1], \"passed\": true}, {\"check\": \"boundary: hub below required clearance\", \"actual\": [5.739, 1100.0], \"expected\": [-0.0, 1200.0], \"passed\": false}, {\"check\": \"boundary: flat on sloped ground\", \"actual\": [0, 1412.5], \"expected\": [0, 1412.5], \"passed\": true}, {\"check\": \"regression: hub below clearance\", \"actual\": [5.739, 2575.4], \"expected\": [-0.0, 2323.7], \"passed\": false}, {\"check\": \"regression: hub below clearance (partial repair)\", \"actual\": [5.739, 1047.9], \"expected\": [-0.0, 1147.6], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [-45, 208.5], \"expected\": [-45, 208.5], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [77.207, 400.0], \"expected\": [-0.0, 1500.0], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.811,"exit_code":0,"observations":[{"actual":[60,523.1],"check":"normal: rotation limited by clearance","expected":[60,523.1],"passed":true},{"actual":[-0.0,1200.0],"check":"boundary: hub below required clearance","expected":[-0.0,1200.0],"passed":true},{"actual":[0,1412.5],"check":"boundary: flat on sloped ground","expected":[0,1412.5],"passed":true},{"actual":[-0.0,2323.7],"check":"regression: hub below clearance","expected":[-0.0,2323.7],"passed":true},{"actual":[-0.0,1147.6],"check":"regression: hub below clearance (partial repair)","expected":[-0.0,1147.6],"passed":true},{"actual":[-45,208.5],"check":"control 1","expected":[-45,208.5],"passed":true},{"actual":[-0.0,1500.0],"check":"control 2","expected":[-0.0,1500.0],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: rotation limited by clearance\", \"actual\": [60, 523.1], \"expected\": [60, 523.1], \"passed\": true}, {\"check\": \"boundary: hub below required clearance\", \"actual\": [-0.0, 1200.0], \"expected\": [-0.0, 1200.0], \"passed\": true}, {\"check\": \"boundary: flat on sloped ground\", \"actual\": [0, 1412.5], \"expected\": [0, 1412.5], \"passed\": true}, {\"check\": \"regression: hub below clearance\", \"actual\": [-0.0, 2323.7], \"expected\": [-0.0, 2323.7], \"passed\": true}, {\"check\": \"regression: hub below clearance (partial repair)\", \"actual\": [-0.0, 1147.6], \"expected\": [-0.0, 1147.6], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [-45, 208.5], \"expected\": [-45, 208.5], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [-0.0, 1500.0], \"expected\": [-0.0, 1500.0], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}