{"abstract":"Flat rows get a large shadow allowance and steep rows get almost none.","category":"Solar tracker geometry","checks":7,"contract":"Rows of slant length length (mm) tilted by tilt degrees face row_az. The shadow reaches forward height*max(cos(sun_az - row_az), 0)/tan(sun_el). Minimum unshaded pitch = length*cos(tilt) + shadow. Return [pitch rounded 3, length/pitch rounded 4]; None when sun_el <= 0.","evaluation_group":"w2-solar_tracker_geometry-fixed-tilt-row-pitch","failed_approach":"Using the full slant length as depth overstates the footprint of tilted rows.","family":"w2-solar_tracker_geometry-fixed-tilt-row-pitch-footprint-and-height-terms","id":"FA-93571","implementations":{"attempt":{"sha256":"59189821b29506c8b455133ddb3d13e7cd70fbf4cf240c16730dc35ed3732db4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(length, tilt, sun_el, sun_az, row_az):\n    if sun_el <= 0:\n        return None\n    t = math.radians(tilt)\n    rel = math.cos(math.radians(sun_az - row_az))\n    depth = length\n    height = length * math.sin(t)\n    shadow = height * max(rel, 0.0) / math.tan(math.radians(sun_el))\n    pitch = depth + shadow\n    return [round(pitch, 3), round(length / pitch, 4)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [1700, 10, 15, 340, 200], [1674.173, 1.0154]],\n  ['regression: footprint and height terms (partial repair)', [2300, 30, 30, 0, 180],\n   [1991.858, 1.1547]],\n  ['control 1', [1700, 30, 30, 90, 200], [1472.243, 1.1547]],\n  ['control 2', [1700, 30, 0, 90, 180], None]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [1000, 0, 10, 300, 0], [1000.0, 1.0]],\n  ['regression: footprint and height terms (partial repair)', [1700, 20, 10, 300, 180],\n   [1597.477, 1.0642]],\n  ['control 1', [1700, 30, 0, 225, 170], None],\n  ['control 2', [2000, 30, 30, 135, 180], [2956.796, 0.6764]]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [2300, 35, 20, 200, 200], [5508.593, 0.4175]],\n  ['regression: footprint and height terms (partial repair)', [1000, 30, 20, 60, 0],\n   [1552.895, 0.644]],\n  ['control 1', [2000, 0, -2, 315, 0], None], ['control 2', [2000, 30, 0, 30, 0], None]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [2000, 10, 15, 200, 180], [3187.577, 0.6274]],\n  ['regression: footprint and height terms (partial repair)', [1000, 25, 10, 135, 200],\n   [1919.234, 0.521]],\n  ['control 1', [2300, 35, 30, 60, 0], [3026.533, 0.7599]],\n  ['control 2', [1000, 30, 20, 250, 180], [1335.872, 0.7486]]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [2300, 30, 30, 60, 200], [1991.858, 1.1547]],\n  ['regression: footprint and height terms (partial repair)', [1700, 10, 20, 100, 180],\n   [1815.012, 0.9366]],\n  ['control 1', [2000, 35, -2, 225, 170], None],\n  ['control 2', [1700, 20, 20, 90, 170], [1874.877, 0.9067]]]]\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":"837d8f178b72785c39704fca419c228da4a55a0083028a40b814294b7e524ec2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(length, tilt, sun_el, sun_az, row_az):\n    if sun_el <= 0:\n        return None\n    t = math.radians(tilt)\n    rel = math.cos(math.radians(sun_az - row_az))\n    depth = length * math.sin(t)\n    height = length * math.cos(t)\n    shadow = height * max(rel, 0.0) / math.tan(math.radians(sun_el))\n    pitch = depth + shadow\n    return [round(pitch, 3), round(length / pitch, 4)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [1700, 10, 15, 340, 200], [1674.173, 1.0154]],\n  ['regression: footprint and height terms (partial repair)', [2300, 30, 30, 0, 180],\n   [1991.858, 1.1547]],\n  ['control 1', [1700, 30, 30, 90, 200], [1472.243, 1.1547]],\n  ['control 2', [1700, 30, 0, 90, 180], None]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [1000, 0, 10, 300, 0], [1000.0, 1.0]],\n  ['regression: footprint and height terms (partial repair)', [1700, 20, 10, 300, 180],\n   [1597.477, 1.0642]],\n  ['control 1', [1700, 30, 0, 225, 170], None],\n  ['control 2', [2000, 30, 30, 135, 180], [2956.796, 0.6764]]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [2300, 35, 20, 200, 200], [5508.593, 0.4175]],\n  ['regression: footprint and height terms (partial repair)', [1000, 30, 20, 60, 0],\n   [1552.895, 0.644]],\n  ['control 1', [2000, 0, -2, 315, 0], None], ['control 2', [2000, 30, 0, 30, 0], None]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [2000, 10, 15, 200, 180], [3187.577, 0.6274]],\n  ['regression: footprint and height terms (partial repair)', [1000, 25, 10, 135, 200],\n   [1919.234, 0.521]],\n  ['control 1', [2300, 35, 30, 60, 0], [3026.533, 0.7599]],\n  ['control 2', [1000, 30, 20, 250, 180], [1335.872, 0.7486]]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [2300, 30, 30, 60, 200], [1991.858, 1.1547]],\n  ['regression: footprint and height terms (partial repair)', [1700, 10, 20, 100, 180],\n   [1815.012, 0.9366]],\n  ['control 1', [2000, 35, -2, 225, 170], None],\n  ['control 2', [1700, 20, 20, 90, 170], [1874.877, 0.9067]]]]\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":"7c9cbd062cb37d3a50ea1bd9cde100c0ae0f4125d93e676228350dbb89de526b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(length, tilt, sun_el, sun_az, row_az):\n    if sun_el <= 0:\n        return None\n    t = math.radians(tilt)\n    rel = math.cos(math.radians(sun_az - row_az))\n    depth = length * math.cos(t)\n    height = length * math.sin(t)\n    shadow = height * max(rel, 0.0) / math.tan(math.radians(sun_el))\n    pitch = depth + shadow\n    return [round(pitch, 3), round(length / pitch, 4)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [1700, 10, 15, 340, 200], [1674.173, 1.0154]],\n  ['regression: footprint and height terms (partial repair)', [2300, 30, 30, 0, 180],\n   [1991.858, 1.1547]],\n  ['control 1', [1700, 30, 30, 90, 200], [1472.243, 1.1547]],\n  ['control 2', [1700, 30, 0, 90, 180], None]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [1000, 0, 10, 300, 0], [1000.0, 1.0]],\n  ['regression: footprint and height terms (partial repair)', [1700, 20, 10, 300, 180],\n   [1597.477, 1.0642]],\n  ['control 1', [1700, 30, 0, 225, 170], None],\n  ['control 2', [2000, 30, 30, 135, 180], [2956.796, 0.6764]]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [2300, 35, 20, 200, 200], [5508.593, 0.4175]],\n  ['regression: footprint and height terms (partial repair)', [1000, 30, 20, 60, 0],\n   [1552.895, 0.644]],\n  ['control 1', [2000, 0, -2, 315, 0], None], ['control 2', [2000, 30, 0, 30, 0], None]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [2000, 10, 15, 200, 180], [3187.577, 0.6274]],\n  ['regression: footprint and height terms (partial repair)', [1000, 25, 10, 135, 200],\n   [1919.234, 0.521]],\n  ['control 1', [2300, 35, 30, 60, 0], [3026.533, 0.7599]],\n  ['control 2', [1000, 30, 20, 250, 180], [1335.872, 0.7486]]],\n [['normal: winter noon design sun', [2000, 30, 15, 180, 180], [5464.102, 0.366]],\n  ['boundary: flat rows', [2000, 0, 15, 180, 180], [2000.0, 1.0]],\n  ['boundary: sun behind the rows', [2000, 30, 15, 0, 180], [1732.051, 1.1547]],\n  ['regression: footprint and height terms', [2300, 30, 30, 60, 200], [1991.858, 1.1547]],\n  ['regression: footprint and height terms (partial repair)', [1700, 10, 20, 100, 180],\n   [1815.012, 0.9366]],\n  ['control 1', [2000, 35, -2, 225, 170], None],\n  ['control 2', [1700, 20, 20, 90, 170], [1874.877, 0.9067]]]]\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-fixed-tilt-row-pitch-footprint-and-height-terms","generated_at":"2026-09-29T14:51:56.322211+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":"depth = length*cos(tilt), height = length*sin(tilt).","root_cause":"Horizontal depth and vertical height use swapped trigonometric functions.","sha256":"8ede73213c96df8a8c298a97264deefb1a3b2f7eb657d18a99e1dff38b0cc823","title":"Fixed-tilt row pitch for a design sun: footprint and height terms · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.713,"exit_code":1,"observations":[{"actual":[5732.051,0.3489],"check":"normal: winter noon design sun","expected":[5464.102,0.366],"passed":false},{"actual":[2000.0,1.0],"check":"boundary: flat rows","expected":[2000.0,1.0],"passed":true},{"actual":[2000.0,1.0],"check":"boundary: sun behind the rows","expected":[1732.051,1.1547],"passed":false},{"actual":[1700.0,1.0],"check":"regression: footprint and height terms","expected":[1674.173,1.0154],"passed":false},{"actual":[2300.0,1.0],"check":"regression: footprint and height terms (partial repair)","expected":[1991.858,1.1547],"passed":false},{"actual":[1700.0,1.0],"check":"control 1","expected":[1472.243,1.1547],"passed":false},{"actual":null,"check":"control 2","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: winter noon design sun\", \"actual\": [5732.051, 0.3489], \"expected\": [5464.102, 0.366], \"passed\": false}, {\"check\": \"boundary: flat rows\", \"actual\": [2000.0, 1.0], \"expected\": [2000.0, 1.0], \"passed\": true}, {\"check\": \"boundary: sun behind the rows\", \"actual\": [2000.0, 1.0], \"expected\": [1732.051, 1.1547], \"passed\": false}, {\"check\": \"regression: footprint and height terms\", \"actual\": [1700.0, 1.0], \"expected\": [1674.173, 1.0154], \"passed\": false}, {\"check\": \"regression: footprint and height terms (partial repair)\", \"actual\": [2300.0, 1.0], \"expected\": [1991.858, 1.1547], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [1700.0, 1.0], \"expected\": [1472.243, 1.1547], \"passed\": false}, {\"check\": \"control 2\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.789,"exit_code":1,"observations":[{"actual":[7464.102,0.2679],"check":"normal: winter noon design sun","expected":[5464.102,0.366],"passed":false},{"actual":[7464.102,0.2679],"check":"boundary: flat rows","expected":[2000.0,1.0],"passed":false},{"actual":[1000.0,2.0],"check":"boundary: sun behind the rows","expected":[1732.051,1.1547],"passed":false},{"actual":[295.202,5.7588],"check":"regression: footprint and height terms","expected":[1674.173,1.0154],"passed":false},{"actual":[1150.0,2.0],"check":"regression: footprint and height terms (partial repair)","expected":[1991.858,1.1547],"passed":false},{"actual":[850.0,2.0],"check":"control 1","expected":[1472.243,1.1547],"passed":false},{"actual":null,"check":"control 2","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: winter noon design sun\", \"actual\": [7464.102, 0.2679], \"expected\": [5464.102, 0.366], \"passed\": false}, {\"check\": \"boundary: flat rows\", \"actual\": [7464.102, 0.2679], \"expected\": [2000.0, 1.0], \"passed\": false}, {\"check\": \"boundary: sun behind the rows\", \"actual\": [1000.0, 2.0], \"expected\": [1732.051, 1.1547], \"passed\": false}, {\"check\": \"regression: footprint and height terms\", \"actual\": [295.202, 5.7588], \"expected\": [1674.173, 1.0154], \"passed\": false}, {\"check\": \"regression: footprint and height terms (partial repair)\", \"actual\": [1150.0, 2.0], \"expected\": [1991.858, 1.1547], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [850.0, 2.0], \"expected\": [1472.243, 1.1547], \"passed\": false}, {\"check\": \"control 2\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.691,"exit_code":0,"observations":[{"actual":[5464.102,0.366],"check":"normal: winter noon design sun","expected":[5464.102,0.366],"passed":true},{"actual":[2000.0,1.0],"check":"boundary: flat rows","expected":[2000.0,1.0],"passed":true},{"actual":[1732.051,1.1547],"check":"boundary: sun behind the rows","expected":[1732.051,1.1547],"passed":true},{"actual":[1674.173,1.0154],"check":"regression: footprint and height terms","expected":[1674.173,1.0154],"passed":true},{"actual":[1991.858,1.1547],"check":"regression: footprint and height terms (partial repair)","expected":[1991.858,1.1547],"passed":true},{"actual":[1472.243,1.1547],"check":"control 1","expected":[1472.243,1.1547],"passed":true},{"actual":null,"check":"control 2","expected":null,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: winter noon design sun\", \"actual\": [5464.102, 0.366], \"expected\": [5464.102, 0.366], \"passed\": true}, {\"check\": \"boundary: flat rows\", \"actual\": [2000.0, 1.0], \"expected\": [2000.0, 1.0], \"passed\": true}, {\"check\": \"boundary: sun behind the rows\", \"actual\": [1732.051, 1.1547], \"expected\": [1732.051, 1.1547], \"passed\": true}, {\"check\": \"regression: footprint and height terms\", \"actual\": [1674.173, 1.0154], \"expected\": [1674.173, 1.0154], \"passed\": true}, {\"check\": \"regression: footprint and height terms (partial repair)\", \"actual\": [1991.858, 1.1547], \"expected\": [1991.858, 1.1547], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [1472.243, 1.1547], \"expected\": [1472.243, 1.1547], \"passed\": true}, {\"check\": \"control 2\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}