{"abstract":"A northern design sun shrinks the pitch below the panel footprint.","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":"The absolute value casts a forward shadow from a sun behind the rows.","family":"w2-solar_tracker_geometry-fixed-tilt-row-pitch-sun-behind-rows","id":"FA-93566","implementations":{"attempt":{"sha256":"5c9fae67bc40df27555c132af87963a5b0706fb51a6c2e983585d511f09371a8","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 * abs(rel) / 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: sun behind rows', [1700, 10, 15, 340, 200], [1674.173, 1.0154]],\n  ['regression: sun behind rows (partial repair)', [2300, 10, 30, 340, 200], [2265.058, 1.0154]],\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: sun behind rows', [1700, 20, 10, 300, 180], [1597.477, 1.0642]],\n  ['regression: sun behind rows (partial repair)', [1700, 25, 10, 60, 180], [1540.723, 1.1034]],\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: sun behind rows', [1000, 30, 10, 200, 0], [866.025, 1.1547]],\n  ['regression: sun behind rows (partial repair)', [1700, 25, 30, 340, 170], [1540.723, 1.1034]],\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: sun behind rows', [2300, 35, 15, 0, 170], [1884.05, 1.2208]],\n  ['regression: sun behind rows (partial repair)', [1000, 20, 20, 45, 180], [939.693, 1.0642]],\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: sun behind rows', [2300, 30, 30, 60, 200], [1991.858, 1.1547]],\n  ['regression: sun behind rows (partial repair)', [2000, 30, 15, 45, 200], [1732.051, 1.1547]],\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":"5a72fec243e32bcb1b48799aaea40f3b6d2a26cc0a910c1cd23b6b513dc1a498","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 * rel / 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: sun behind rows', [1700, 10, 15, 340, 200], [1674.173, 1.0154]],\n  ['regression: sun behind rows (partial repair)', [2300, 10, 30, 340, 200], [2265.058, 1.0154]],\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: sun behind rows', [1700, 20, 10, 300, 180], [1597.477, 1.0642]],\n  ['regression: sun behind rows (partial repair)', [1700, 25, 10, 60, 180], [1540.723, 1.1034]],\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: sun behind rows', [1000, 30, 10, 200, 0], [866.025, 1.1547]],\n  ['regression: sun behind rows (partial repair)', [1700, 25, 30, 340, 170], [1540.723, 1.1034]],\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: sun behind rows', [2300, 35, 15, 0, 170], [1884.05, 1.2208]],\n  ['regression: sun behind rows (partial repair)', [1000, 20, 20, 45, 180], [939.693, 1.0642]],\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: sun behind rows', [2300, 30, 30, 60, 200], [1991.858, 1.1547]],\n  ['regression: sun behind rows (partial repair)', [2000, 30, 15, 45, 200], [1732.051, 1.1547]],\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":"5aab3d4f83c24be76440aeeeb3033eafb57516f3530821110f2618a7225b5757","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: sun behind rows', [1700, 10, 15, 340, 200], [1674.173, 1.0154]],\n  ['regression: sun behind rows (partial repair)', [2300, 10, 30, 340, 200], [2265.058, 1.0154]],\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: sun behind rows', [1700, 20, 10, 300, 180], [1597.477, 1.0642]],\n  ['regression: sun behind rows (partial repair)', [1700, 25, 10, 60, 180], [1540.723, 1.1034]],\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: sun behind rows', [1000, 30, 10, 200, 0], [866.025, 1.1547]],\n  ['regression: sun behind rows (partial repair)', [1700, 25, 30, 340, 170], [1540.723, 1.1034]],\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: sun behind rows', [2300, 35, 15, 0, 170], [1884.05, 1.2208]],\n  ['regression: sun behind rows (partial repair)', [1000, 20, 20, 45, 180], [939.693, 1.0642]],\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: sun behind rows', [2300, 30, 30, 60, 200], [1991.858, 1.1547]],\n  ['regression: sun behind rows (partial repair)', [2000, 30, 15, 45, 200], [1732.051, 1.1547]],\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-sun-behind-rows","generated_at":"2026-09-29T14:51:56.276269+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":"Clip the relative factor at zero.","root_cause":"Negative relative azimuth cosines are not clipped.","sha256":"c05ad62af4d3fee7f2bd52c629c613b8379dbe99dc8468a050c2e35297ac7ee9","title":"Fixed-tilt row pitch for a design sun: sun behind rows · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.531,"exit_code":1,"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":[5464.102,0.366],"check":"boundary: sun behind the rows","expected":[1732.051,1.1547],"passed":false},{"actual":[2518.131,0.6751],"check":"regression: sun behind rows","expected":[1674.173,1.0154],"passed":false},{"actual":[2794.981,0.8229],"check":"regression: sun behind rows (partial repair)","expected":[2265.058,1.0154],"passed":false},{"actual":[1975.78,0.8604],"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\": [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\": [5464.102, 0.366], \"expected\": [1732.051, 1.1547], \"passed\": false}, {\"check\": \"regression: sun behind rows\", \"actual\": [2518.131, 0.6751], \"expected\": [1674.173, 1.0154], \"passed\": false}, {\"check\": \"regression: sun behind rows (partial repair)\", \"actual\": [2794.981, 0.8229], \"expected\": [2265.058, 1.0154], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [1975.78, 0.8604], \"expected\": [1472.243, 1.1547], \"passed\": false}, {\"check\": \"control 2\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.607,"exit_code":1,"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":[-2000.0,-1.0],"check":"boundary: sun behind the rows","expected":[1732.051,1.1547],"passed":false},{"actual":[830.216,2.0477],"check":"regression: sun behind rows","expected":[1674.173,1.0154],"passed":false},{"actual":[1735.135,1.3255],"check":"regression: sun behind rows (partial repair)","expected":[2265.058,1.0154],"passed":false},{"actual":[968.706,1.7549],"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\": [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\": [-2000.0, -1.0], \"expected\": [1732.051, 1.1547], \"passed\": false}, {\"check\": \"regression: sun behind rows\", \"actual\": [830.216, 2.0477], \"expected\": [1674.173, 1.0154], \"passed\": false}, {\"check\": \"regression: sun behind rows (partial repair)\", \"actual\": [1735.135, 1.3255], \"expected\": [2265.058, 1.0154], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [968.706, 1.7549], \"expected\": [1472.243, 1.1547], \"passed\": false}, {\"check\": \"control 2\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.477,"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: sun behind rows","expected":[1674.173,1.0154],"passed":true},{"actual":[2265.058,1.0154],"check":"regression: sun behind rows (partial repair)","expected":[2265.058,1.0154],"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: sun behind rows\", \"actual\": [1674.173, 1.0154], \"expected\": [1674.173, 1.0154], \"passed\": true}, {\"check\": \"regression: sun behind rows (partial repair)\", \"actual\": [2265.058, 1.0154], \"expected\": [2265.058, 1.0154], \"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"}