{"abstract":"Row spacing is too tight and rows shade each other in winter.","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":"Multiplying by cos(elevation) gives a length that shrinks as the sun gets lower.","family":"w2-solar_tracker_geometry-fixed-tilt-row-pitch-shadow-length-function","id":"FA-93561","implementations":{"attempt":{"sha256":"cd2e4497862181951e602a6524a5a6ca09f575ec13e91d39d32bbe80937fb8e9","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.cos(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: shadow length function', [2300, 25, 15, 250, 180], [3325.232, 0.6917]],\n  ['regression: shadow length function (partial repair)', [2000, 25, 20, 225, 200],\n   [3917.305, 0.5106]],\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: shadow length function', [2300, 10, 10, 100, 170], [3039.753, 0.7566]],\n  ['regression: shadow length function (partial repair)', [2000, 30, 30, 135, 180],\n   [2956.796, 0.6764]],\n  ['control 1', [1700, 30, 0, 225, 170], None],\n  ['control 2', [1700, 30, 20, 315, 0], [3123.589, 0.5442]]],\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: shadow length function', [2300, 35, 20, 200, 200], [5508.593, 0.4175]],\n  ['regression: shadow length function (partial repair)', [1000, 30, 20, 60, 0], [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: shadow length function', [2000, 10, 15, 200, 180], [3187.577, 0.6274]],\n  ['regression: shadow length function (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: shadow length function', [1700, 10, 20, 100, 180], [1815.012, 0.9366]],\n  ['regression: shadow length function (partial repair)', [2000, 20, 10, 100, 170],\n   [3206.213, 0.6238]],\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":"4519eaef77ba10bb435eb274f661edce558ef79f80f34ea46f4746fc1d98ebaa","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.sin(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: shadow length function', [2300, 25, 15, 250, 180], [3325.232, 0.6917]],\n  ['regression: shadow length function (partial repair)', [2000, 25, 20, 225, 200],\n   [3917.305, 0.5106]],\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: shadow length function', [2300, 10, 10, 100, 170], [3039.753, 0.7566]],\n  ['regression: shadow length function (partial repair)', [2000, 30, 30, 135, 180],\n   [2956.796, 0.6764]],\n  ['control 1', [1700, 30, 0, 225, 170], None],\n  ['control 2', [1700, 30, 20, 315, 0], [3123.589, 0.5442]]],\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: shadow length function', [2300, 35, 20, 200, 200], [5508.593, 0.4175]],\n  ['regression: shadow length function (partial repair)', [1000, 30, 20, 60, 0], [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: shadow length function', [2000, 10, 15, 200, 180], [3187.577, 0.6274]],\n  ['regression: shadow length function (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: shadow length function', [1700, 10, 20, 100, 180], [1815.012, 0.9366]],\n  ['regression: shadow length function (partial repair)', [2000, 20, 10, 100, 170],\n   [3206.213, 0.6238]],\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":"8bd3ec1f09f679e07aa28756fe2b0b1baf8c50b772d4248347276a9b25dfefb9","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: shadow length function', [2300, 25, 15, 250, 180], [3325.232, 0.6917]],\n  ['regression: shadow length function (partial repair)', [2000, 25, 20, 225, 200],\n   [3917.305, 0.5106]],\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: shadow length function', [2300, 10, 10, 100, 170], [3039.753, 0.7566]],\n  ['regression: shadow length function (partial repair)', [2000, 30, 30, 135, 180],\n   [2956.796, 0.6764]],\n  ['control 1', [1700, 30, 0, 225, 170], None],\n  ['control 2', [1700, 30, 20, 315, 0], [3123.589, 0.5442]]],\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: shadow length function', [2300, 35, 20, 200, 200], [5508.593, 0.4175]],\n  ['regression: shadow length function (partial repair)', [1000, 30, 20, 60, 0], [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: shadow length function', [2000, 10, 15, 200, 180], [3187.577, 0.6274]],\n  ['regression: shadow length function (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: shadow length function', [1700, 10, 20, 100, 180], [1815.012, 0.9366]],\n  ['regression: shadow length function (partial repair)', [2000, 20, 10, 100, 170],\n   [3206.213, 0.6238]],\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-shadow-length-function","generated_at":"2026-09-29T14:51:56.237520+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":"Shadow length = height / tan(elevation).","root_cause":"The shadow uses the sine of the elevation instead of the tangent.","sha256":"05cc66a89e5c65f12ba4f67bf9d121bf03d1520b1d695b437a61a248670a1c24","title":"Fixed-tilt row pitch for a design sun: shadow length function · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.226,"exit_code":1,"observations":[{"actual":[2697.977,0.7413],"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":[1732.051,1.1547],"check":"boundary: sun behind the rows","expected":[1732.051,1.1547],"passed":true},{"actual":[2405.631,0.9561],"check":"regression: shadow length function","expected":[3325.232,0.6917],"passed":false},{"actual":[2532.462,0.7897],"check":"regression: shadow length function (partial repair)","expected":[3917.305,0.5106],"passed":false},{"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":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: winter noon design sun\", \"actual\": [2697.977, 0.7413], \"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\": [1732.051, 1.1547], \"expected\": [1732.051, 1.1547], \"passed\": true}, {\"check\": \"regression: shadow length function\", \"actual\": [2405.631, 0.9561], \"expected\": [3325.232, 0.6917], \"passed\": false}, {\"check\": \"regression: shadow length function (partial repair)\", \"actual\": [2532.462, 0.7897], \"expected\": [3917.305, 0.5106], \"passed\": false}, {\"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\": false}\n"},"broken":{"elapsed_ms":39.665,"exit_code":1,"observations":[{"actual":[5595.754,0.3574],"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":[1732.051,1.1547],"check":"boundary: sun behind the rows","expected":[1732.051,1.1547],"passed":true},{"actual":[3369.0,0.6827],"check":"regression: shadow length function","expected":[3325.232,0.6917],"passed":false},{"actual":[4052.38,0.4935],"check":"regression: shadow length function (partial repair)","expected":[3917.305,0.5106],"passed":false},{"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":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: winter noon design sun\", \"actual\": [5595.754, 0.3574], \"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\": [1732.051, 1.1547], \"expected\": [1732.051, 1.1547], \"passed\": true}, {\"check\": \"regression: shadow length function\", \"actual\": [3369.0, 0.6827], \"expected\": [3325.232, 0.6917], \"passed\": false}, {\"check\": \"regression: shadow length function (partial repair)\", \"actual\": [4052.38, 0.4935], \"expected\": [3917.305, 0.5106], \"passed\": false}, {\"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\": false}\n"},"fixed":{"elapsed_ms":39.97,"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":[3325.232,0.6917],"check":"regression: shadow length function","expected":[3325.232,0.6917],"passed":true},{"actual":[3917.305,0.5106],"check":"regression: shadow length function (partial repair)","expected":[3917.305,0.5106],"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: shadow length function\", \"actual\": [3325.232, 0.6917], \"expected\": [3325.232, 0.6917], \"passed\": true}, {\"check\": \"regression: shadow length function (partial repair)\", \"actual\": [3917.305, 0.5106], \"expected\": [3917.305, 0.5106], \"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"}