{"abstract":"Mirrors facing the zenith are commanded to the horizon.","category":"Solar tracker geometry","checks":7,"contract":"mirror and receiver are [east, north, up] positions in metres. The mirror normal bisects the unit sun vector (east=cos(el)sin(az), north=cos(el)cos(az), up=sin(el)) and the unit vector from the mirror to the receiver. Return [normal azimuth 0..360 clockwise from north, normal elevation], rounded to 3; None when sun_el <= 0; 'invalid' when receiver equals mirror.","evaluation_group":"w2-solar_tracker_geometry-heliostat-bisector","failed_approach":"atan of the up component alone is not the elevation of a unit vector.","family":"w2-solar_tracker_geometry-heliostat-bisector-normal-elevation","id":"FA-93501","implementations":{"attempt":{"sha256":"e7f2c1538d6663eac4db2cbede3dda352c4e8edb68ed3d9f102c02c993199043","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(sun_az, sun_el, mirror, receiver):\n    if sun_el <= 0:\n        return None\n    dx = [receiver[i] - mirror[i] for i in range(3)]\n    d = math.sqrt(sum(v * v for v in dx))\n    if d == 0:\n        return 'invalid'\n    t = [v / d for v in dx]\n    az = math.radians(sun_az)\n    el = math.radians(sun_el)\n    s = [math.cos(el) * math.sin(az), math.cos(el) * math.cos(az), math.sin(el)]\n    h = [s[i] + t[i] for i in range(3)]\n    m = math.sqrt(sum(v * v for v in h))\n    h = [v / m for v in h]\n    n_az = math.degrees(math.atan2(h[0], h[1])) % 360\n    n_el = math.degrees(math.atan(h[2]))\n    return [round(n_az, 3), round(n_el, 3)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [270, 60, [6, -1, 1], [0, 5, 0]], [300.29, 28.278]],\n  ['regression: normal elevation (partial repair)', [270, 80, [-16, -19, 1], [0, 0, 0]],\n   [31.588, 46.473]],\n  ['control 1', [90, -3, [-12, 43, 1], [0, 0, 0]], None],\n  ['control 2', [200, 60, [-10, 12, 0], [0, 0, 60]], [180.839, 70.11]]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [315, 25, [47, -28, 0], [0, 0, 60]], [308.943, 36.527]],\n  ['regression: normal elevation (partial repair)', [90, 25, [-19, 40, 2], [-10, 5, 60]],\n   [116.262, 47.684]],\n  ['control 1', [135, 60, [31, 24, 2], [10, 0, 60]], [177.1, 67.63]],\n  ['control 2', [225, -3, [-22, -29, 0], [0, 5, 30]], None]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [60, 40, [7, -5, 0], [0, 0, 60]], [49.649, 66.233]],\n  ['regression: normal elevation (partial repair)', [315, 10, [-37, 26, 0], [0, -5, 60]],\n   [323.691, 69.061]],\n  ['control 1', [90, 10, [-6, -40, 0], [-10, 0, 30]], [48.617, 32.61]],\n  ['control 2', [30, 10, [-44, 5, 1], [-10, 0, 0]], [64.473, 5.033]]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [315, 60, [-28, -33, 2], [-10, 5, 60]], [353.399, 62.028]],\n  ['regression: normal elevation (partial repair)', [200, 80, [9, 42, 3], [-10, 0, 30]],\n   [203.614, 55.19]],\n  ['control 1', [150, 40, [16, -12, 0], [0, 0, 0]], [261.353, 56.729]],\n  ['control 2', [90, 0, [46, -4, 0], [0, -5, 0]], None]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [225, 40, [-5, 13, 2], [-10, -5, 30]], [212.668, 49.07]],\n  ['regression: normal elevation (partial repair)', [200, 10, [41, -47, 2], [0, 0, 30]],\n   [255.744, 31.113]],\n  ['control 1', [250, -3, [-49, 36, 3], [-10, 5, 60]], None],\n  ['control 2', [300, 80, [-27, -17, 1], [-10, 0, 60]], [18.225, 78.974]]]]\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":"8a9d7cbaa071fa0343f4124941453999b40b6dd13a6c69c72a819dd48617a3d9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(sun_az, sun_el, mirror, receiver):\n    if sun_el <= 0:\n        return None\n    dx = [receiver[i] - mirror[i] for i in range(3)]\n    d = math.sqrt(sum(v * v for v in dx))\n    if d == 0:\n        return 'invalid'\n    t = [v / d for v in dx]\n    az = math.radians(sun_az)\n    el = math.radians(sun_el)\n    s = [math.cos(el) * math.sin(az), math.cos(el) * math.cos(az), math.sin(el)]\n    h = [s[i] + t[i] for i in range(3)]\n    m = math.sqrt(sum(v * v for v in h))\n    h = [v / m for v in h]\n    n_az = math.degrees(math.atan2(h[0], h[1])) % 360\n    n_el = math.degrees(math.acos(h[2]))\n    return [round(n_az, 3), round(n_el, 3)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [270, 60, [6, -1, 1], [0, 5, 0]], [300.29, 28.278]],\n  ['regression: normal elevation (partial repair)', [270, 80, [-16, -19, 1], [0, 0, 0]],\n   [31.588, 46.473]],\n  ['control 1', [90, -3, [-12, 43, 1], [0, 0, 0]], None],\n  ['control 2', [200, 60, [-10, 12, 0], [0, 0, 60]], [180.839, 70.11]]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [315, 25, [47, -28, 0], [0, 0, 60]], [308.943, 36.527]],\n  ['regression: normal elevation (partial repair)', [90, 25, [-19, 40, 2], [-10, 5, 60]],\n   [116.262, 47.684]],\n  ['control 1', [135, 60, [31, 24, 2], [10, 0, 60]], [177.1, 67.63]],\n  ['control 2', [225, -3, [-22, -29, 0], [0, 5, 30]], None]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [60, 40, [7, -5, 0], [0, 0, 60]], [49.649, 66.233]],\n  ['regression: normal elevation (partial repair)', [315, 10, [-37, 26, 0], [0, -5, 60]],\n   [323.691, 69.061]],\n  ['control 1', [90, 10, [-6, -40, 0], [-10, 0, 30]], [48.617, 32.61]],\n  ['control 2', [30, 10, [-44, 5, 1], [-10, 0, 0]], [64.473, 5.033]]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [315, 60, [-28, -33, 2], [-10, 5, 60]], [353.399, 62.028]],\n  ['regression: normal elevation (partial repair)', [200, 80, [9, 42, 3], [-10, 0, 30]],\n   [203.614, 55.19]],\n  ['control 1', [150, 40, [16, -12, 0], [0, 0, 0]], [261.353, 56.729]],\n  ['control 2', [90, 0, [46, -4, 0], [0, -5, 0]], None]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [225, 40, [-5, 13, 2], [-10, -5, 30]], [212.668, 49.07]],\n  ['regression: normal elevation (partial repair)', [200, 10, [41, -47, 2], [0, 0, 30]],\n   [255.744, 31.113]],\n  ['control 1', [250, -3, [-49, 36, 3], [-10, 5, 60]], None],\n  ['control 2', [300, 80, [-27, -17, 1], [-10, 0, 60]], [18.225, 78.974]]]]\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":"ba3d45a4bb40fdaf865bb4c5e11d6376e647750789cbcb3547664d011a2a1ca9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(sun_az, sun_el, mirror, receiver):\n    if sun_el <= 0:\n        return None\n    dx = [receiver[i] - mirror[i] for i in range(3)]\n    d = math.sqrt(sum(v * v for v in dx))\n    if d == 0:\n        return 'invalid'\n    t = [v / d for v in dx]\n    az = math.radians(sun_az)\n    el = math.radians(sun_el)\n    s = [math.cos(el) * math.sin(az), math.cos(el) * math.cos(az), math.sin(el)]\n    h = [s[i] + t[i] for i in range(3)]\n    m = math.sqrt(sum(v * v for v in h))\n    h = [v / m for v in h]\n    n_az = math.degrees(math.atan2(h[0], h[1])) % 360\n    n_el = math.degrees(math.asin(h[2]))\n    return [round(n_az, 3), round(n_el, 3)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [270, 60, [6, -1, 1], [0, 5, 0]], [300.29, 28.278]],\n  ['regression: normal elevation (partial repair)', [270, 80, [-16, -19, 1], [0, 0, 0]],\n   [31.588, 46.473]],\n  ['control 1', [90, -3, [-12, 43, 1], [0, 0, 0]], None],\n  ['control 2', [200, 60, [-10, 12, 0], [0, 0, 60]], [180.839, 70.11]]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [315, 25, [47, -28, 0], [0, 0, 60]], [308.943, 36.527]],\n  ['regression: normal elevation (partial repair)', [90, 25, [-19, 40, 2], [-10, 5, 60]],\n   [116.262, 47.684]],\n  ['control 1', [135, 60, [31, 24, 2], [10, 0, 60]], [177.1, 67.63]],\n  ['control 2', [225, -3, [-22, -29, 0], [0, 5, 30]], None]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [60, 40, [7, -5, 0], [0, 0, 60]], [49.649, 66.233]],\n  ['regression: normal elevation (partial repair)', [315, 10, [-37, 26, 0], [0, -5, 60]],\n   [323.691, 69.061]],\n  ['control 1', [90, 10, [-6, -40, 0], [-10, 0, 30]], [48.617, 32.61]],\n  ['control 2', [30, 10, [-44, 5, 1], [-10, 0, 0]], [64.473, 5.033]]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [315, 60, [-28, -33, 2], [-10, 5, 60]], [353.399, 62.028]],\n  ['regression: normal elevation (partial repair)', [200, 80, [9, 42, 3], [-10, 0, 30]],\n   [203.614, 55.19]],\n  ['control 1', [150, 40, [16, -12, 0], [0, 0, 0]], [261.353, 56.729]],\n  ['control 2', [90, 0, [46, -4, 0], [0, -5, 0]], None]],\n [['boundary: receiver at mirror', [180, 40, [0, 0, 0], [0, 0, 0]], 'invalid'],\n  ['normal: receiver due north on tower', [180, 40, [0, -40, 0], [0, 0, 40]], [180.0, 87.5]],\n  ['boundary: night', [90, 0, [10, 10, 0], [0, 0, 50]], None],\n  ['regression: normal elevation', [225, 40, [-5, 13, 2], [-10, -5, 30]], [212.668, 49.07]],\n  ['regression: normal elevation (partial repair)', [200, 10, [41, -47, 2], [0, 0, 30]],\n   [255.744, 31.113]],\n  ['control 1', [250, -3, [-49, 36, 3], [-10, 5, 60]], None],\n  ['control 2', [300, 80, [-27, -17, 1], [-10, 0, 60]], [18.225, 78.974]]]]\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-heliostat-bisector-normal-elevation","generated_at":"2026-09-29T14:51:55.673878+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":"Elevation = asin(up component of the unit normal).","root_cause":"The elevation is computed with acos, which yields the zenith angle.","sha256":"a3c7bd425c3111cb7d9ba2b72240f7194039ccd69b9ecedeaac7bf595dd80531","title":"Heliostat mirror normal aiming: normal elevation · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.374,"exit_code":1,"observations":[{"actual":"invalid","check":"boundary: receiver at mirror","expected":"invalid","passed":true},{"actual":[180.0,44.973],"check":"normal: receiver due north on tower","expected":[180.0,87.5],"passed":false},{"actual":null,"check":"boundary: night","expected":null,"passed":true},{"actual":[300.29,25.349],"check":"regression: normal elevation","expected":[300.29,28.278],"passed":false},{"actual":[31.588,35.944],"check":"regression: normal elevation (partial repair)","expected":[31.588,46.473],"passed":false},{"actual":null,"check":"control 1","expected":null,"passed":true},{"actual":[180.839,43.239],"check":"control 2","expected":[180.839,70.11],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: receiver at mirror\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"normal: receiver due north on tower\", \"actual\": [180.0, 44.973], \"expected\": [180.0, 87.5], \"passed\": false}, {\"check\": \"boundary: night\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"regression: normal elevation\", \"actual\": [300.29, 25.349], \"expected\": [300.29, 28.278], \"passed\": false}, {\"check\": \"regression: normal elevation (partial repair)\", \"actual\": [31.588, 35.944], \"expected\": [31.588, 46.473], \"passed\": false}, {\"check\": \"control 1\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 2\", \"actual\": [180.839, 43.239], \"expected\": [180.839, 70.11], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.735,"exit_code":1,"observations":[{"actual":"invalid","check":"boundary: receiver at mirror","expected":"invalid","passed":true},{"actual":[180.0,2.5],"check":"normal: receiver due north on tower","expected":[180.0,87.5],"passed":false},{"actual":null,"check":"boundary: night","expected":null,"passed":true},{"actual":[300.29,61.722],"check":"regression: normal elevation","expected":[300.29,28.278],"passed":false},{"actual":[31.588,43.527],"check":"regression: normal elevation (partial repair)","expected":[31.588,46.473],"passed":false},{"actual":null,"check":"control 1","expected":null,"passed":true},{"actual":[180.839,19.89],"check":"control 2","expected":[180.839,70.11],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: receiver at mirror\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"normal: receiver due north on tower\", \"actual\": [180.0, 2.5], \"expected\": [180.0, 87.5], \"passed\": false}, {\"check\": \"boundary: night\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"regression: normal elevation\", \"actual\": [300.29, 61.722], \"expected\": [300.29, 28.278], \"passed\": false}, {\"check\": \"regression: normal elevation (partial repair)\", \"actual\": [31.588, 43.527], \"expected\": [31.588, 46.473], \"passed\": false}, {\"check\": \"control 1\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 2\", \"actual\": [180.839, 19.89], \"expected\": [180.839, 70.11], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.407,"exit_code":0,"observations":[{"actual":"invalid","check":"boundary: receiver at mirror","expected":"invalid","passed":true},{"actual":[180.0,87.5],"check":"normal: receiver due north on tower","expected":[180.0,87.5],"passed":true},{"actual":null,"check":"boundary: night","expected":null,"passed":true},{"actual":[300.29,28.278],"check":"regression: normal elevation","expected":[300.29,28.278],"passed":true},{"actual":[31.588,46.473],"check":"regression: normal elevation (partial repair)","expected":[31.588,46.473],"passed":true},{"actual":null,"check":"control 1","expected":null,"passed":true},{"actual":[180.839,70.11],"check":"control 2","expected":[180.839,70.11],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: receiver at mirror\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"normal: receiver due north on tower\", \"actual\": [180.0, 87.5], \"expected\": [180.0, 87.5], \"passed\": true}, {\"check\": \"boundary: night\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"regression: normal elevation\", \"actual\": [300.29, 28.278], \"expected\": [300.29, 28.278], \"passed\": true}, {\"check\": \"regression: normal elevation (partial repair)\", \"actual\": [31.588, 46.473], \"expected\": [31.588, 46.473], \"passed\": true}, {\"check\": \"control 1\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"control 2\", \"actual\": [180.839, 70.11], \"expected\": [180.839, 70.11], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}