{"abstract":"Rows facing south get their pitch from a northern sun.","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.","contract_signature":"length, tilt, sun_el, sun_az, row_az","evaluation_group":"w2-solar_tracker_geometry-fixed-tilt-row-pitch","failed_approach":"Ignoring the row azimuth only works for north-facing rows.","family":"w2-solar_tracker_geometry-fixed-tilt-row-pitch-relative-azimuth-reference","id":"FA-93576","implementations":{"attempt":{"sha256":"ee60d57edd73cbde8659ad3fca17c199c263ffa6a05343e19136628863b3bb0d","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))\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: relative azimuth reference', [1700, 10, 15, 340, 200], [1674.173, 1.0154]],\n  ['regression: relative azimuth reference (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: relative azimuth reference', [1700, 20, 10, 300, 180], [1597.477, 1.0642]],\n  ['regression: relative azimuth reference (partial repair)', [1700, 25, 10, 60, 180],\n   [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: relative azimuth reference', [2300, 35, 20, 200, 200], [5508.593, 0.4175]],\n  ['regression: relative azimuth reference (partial repair)', [1700, 25, 30, 340, 170],\n   [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: relative azimuth reference', [2000, 10, 15, 200, 180], [3187.577, 0.6274]],\n  ['regression: relative azimuth reference (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: relative azimuth reference', [2300, 30, 30, 60, 200], [1991.858, 1.1547]],\n  ['regression: relative azimuth reference (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":"4a7b12ab913f5f3a7ffcad9dc1f2588e022beb92b8828e0069ab49749402129c","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 - 180))\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: relative azimuth reference', [1700, 10, 15, 340, 200], [1674.173, 1.0154]],\n  ['regression: relative azimuth reference (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: relative azimuth reference', [1700, 20, 10, 300, 180], [1597.477, 1.0642]],\n  ['regression: relative azimuth reference (partial repair)', [1700, 25, 10, 60, 180],\n   [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: relative azimuth reference', [2300, 35, 20, 200, 200], [5508.593, 0.4175]],\n  ['regression: relative azimuth reference (partial repair)', [1700, 25, 30, 340, 170],\n   [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: relative azimuth reference', [2000, 10, 15, 200, 180], [3187.577, 0.6274]],\n  ['regression: relative azimuth reference (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: relative azimuth reference', [2300, 30, 30, 60, 200], [1991.858, 1.1547]],\n  ['regression: relative azimuth reference (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-relative-azimuth-reference","generated_at":"2026-09-29T14:51:56.365007+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.","root_cause":"The row azimuth is treated as the direction the rows face away from.","sha256":"a8c7b037ae4a7b8fa8b537202f8d4dd51b158c9c4e64a9728538b5349f4a8e63","title":"Fixed-tilt row pitch for a design sun: relative azimuth reference · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":37.799,"exit_code":1,"observations":[{"actual":[1732.051,1.1547],"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":[5464.102,0.366],"check":"boundary: sun behind the rows","expected":[1732.051,1.1547],"passed":false},{"actual":[2709.441,0.6274],"check":"regression: relative azimuth reference","expected":[1674.173,1.0154],"passed":false},{"actual":[3983.717,0.5774],"check":"regression: relative azimuth reference (partial repair)","expected":[1991.858,1.1547],"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\": [1732.051, 1.1547], \"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\": [5464.102, 0.366], \"expected\": [1732.051, 1.1547], \"passed\": false}, {\"check\": \"regression: relative azimuth reference\", \"actual\": [2709.441, 0.6274], \"expected\": [1674.173, 1.0154], \"passed\": false}, {\"check\": \"regression: relative azimuth reference (partial repair)\", \"actual\": [3983.717, 0.5774], \"expected\": [1991.858, 1.1547], \"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":38.665,"exit_code":1,"observations":[{"actual":[1732.051,1.1547],"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":[5464.102,0.366],"check":"boundary: sun behind the rows","expected":[1732.051,1.1547],"passed":false},{"actual":[2518.131,0.6751],"check":"regression: relative azimuth reference","expected":[1674.173,1.0154],"passed":false},{"actual":[3983.717,0.5774],"check":"regression: relative azimuth reference (partial repair)","expected":[1991.858,1.1547],"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\": [1732.051, 1.1547], \"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\": [5464.102, 0.366], \"expected\": [1732.051, 1.1547], \"passed\": false}, {\"check\": \"regression: relative azimuth reference\", \"actual\": [2518.131, 0.6751], \"expected\": [1674.173, 1.0154], \"passed\": false}, {\"check\": \"regression: relative azimuth reference (partial repair)\", \"actual\": [3983.717, 0.5774], \"expected\": [1991.858, 1.1547], \"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"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}