{"abstract":"Rows facing the morning sun report heavy shading while rows facing away report none.","category":"Solar tracker geometry","checks":7,"contract":"rot is the row rotation and proj the sun zenith projected on the plane perpendicular to the axis, both signed degrees. |proj| >= 90 or cos(rot - proj) <= 0 means no direct light: [1.0, True]. Otherwise shaded fraction = clip(1 - cos(proj)/(gcr*cos(rot - proj)), 0, 1). Return [fraction rounded 4, fraction > 0].","contract_signature":"rot, proj, gcr","evaluation_group":"w2-solar_tracker_geometry-row-shade-fraction","failed_approach":"Differencing magnitudes loses the sign when the sun is on the other side.","family":"w2-solar_tracker_geometry-row-shade-fraction-relative-sun-angle","id":"FA-93546","implementations":{"attempt":{"sha256":"73c3050dce7a2cfd7aab29cf851f966ac7803779d9c28adcbcc6004a1f6b53e0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(rot, proj, gcr):\n    if abs(proj) >= 90:\n        return [1.0, True]\n    c = math.cos(math.radians(abs(rot) - abs(proj)))\n    if c <= 0:\n        return [1.0, True]\n    fs = 1 - math.cos(math.radians(proj)) / (gcr * c)\n    fs = min(1.0, max(0.0, fs))\n    return [round(fs, 4), fs > 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [-30, -80, 0.5], [0.4597, True]],\n  ['regression: relative sun angle (partial repair)', [45, -70, 0.4], [1.0, True]],\n  ['control 1', [45, -45, 0.5], [0.0, False]], ['control 2', [45, 80, 0.6], [0.6467, True]]],\n [['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [-60, -70, 0.6], [0.4212, True]],\n  ['regression: relative sun angle (partial repair)', [20, -80, 0.5], [1.0, True]],\n  ['control 1', [-10, -45, 0.6], [0.0, False]], ['control 2', [30, 45, 0.5], [0.0, False]]],\n [['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [-60, -80, 0.6], [0.692, True]],\n  ['regression: relative sun angle (partial repair)', [60, -45, 0.4], [1.0, True]],\n  ['control 1', [-30, 0, 0.5], [0.0, False]], ['control 2', [30, -80, 0.6], [1.0, True]]],\n [['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [60, -60, 0.6], [1.0, True]],\n  ['regression: relative sun angle (partial repair)', [-45, 80, 0.4], [1.0, True]],\n  ['control 1', [-45, -30, 0.6], [0.0, False]], ['control 2', [-20, 45, 0.6], [0.0, False]]],\n [['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [30, -80, 0.5], [1.0, True]],\n  ['regression: relative sun angle (partial repair)', [-60, 70, 0.6], [1.0, True]],\n  ['control 1', [0, -95, 0.5], [1.0, True]], ['control 2', [-10, -70, 0.4], [0.0, False]]]]\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":"e70d45ebf05aed3c1cb447bff83e2971f2d306206dbe81f7dddb7316366080bb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(rot, proj, gcr):\n    if abs(proj) >= 90:\n        return [1.0, True]\n    c = math.cos(math.radians(rot + proj))\n    if c <= 0:\n        return [1.0, True]\n    fs = 1 - math.cos(math.radians(proj)) / (gcr * c)\n    fs = min(1.0, max(0.0, fs))\n    return [round(fs, 4), fs > 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [-30, -80, 0.5], [0.4597, True]],\n  ['regression: relative sun angle (partial repair)', [45, -70, 0.4], [1.0, True]],\n  ['control 1', [45, -45, 0.5], [0.0, False]], ['control 2', [45, 80, 0.6], [0.6467, True]]],\n [['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [-60, -70, 0.6], [0.4212, True]],\n  ['regression: relative sun angle (partial repair)', [20, -80, 0.5], [1.0, True]],\n  ['control 1', [-10, -45, 0.6], [0.0, False]], ['control 2', [30, 45, 0.5], [0.0, False]]],\n [['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [-60, -80, 0.6], [0.692, True]],\n  ['regression: relative sun angle (partial repair)', [60, -45, 0.4], [1.0, True]],\n  ['control 1', [-30, 0, 0.5], [0.0, False]], ['control 2', [30, -80, 0.6], [1.0, True]]],\n [['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [60, -60, 0.6], [1.0, True]],\n  ['regression: relative sun angle (partial repair)', [-45, 80, 0.4], [1.0, True]],\n  ['control 1', [-45, -30, 0.6], [0.0, False]], ['control 2', [-20, 45, 0.6], [0.0, False]]],\n [['normal: rows facing the sun at noon', [0, 0, 0.4], [0.0, False]],\n  ['boundary: steep morning sun', [-60, -70, 0.5], [0.3054, True]],\n  ['boundary: sun below horizon', [0, 95, 0.4], [1.0, True]],\n  ['regression: relative sun angle', [30, -80, 0.5], [1.0, True]],\n  ['regression: relative sun angle (partial repair)', [-60, 70, 0.6], [1.0, True]],\n  ['control 1', [0, -95, 0.5], [1.0, True]], ['control 2', [-10, -70, 0.4], [0.0, False]]]]\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-row-shade-fraction-relative-sun-angle","generated_at":"2026-09-29T14:51:56.195384+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 rotation and projected sun angle are added instead of differenced.","sha256":"865dee98fb407f8a79d519292758c3c3f710cab6216989108d5ffe8ff0809c39","title":"Tracker row-to-row shaded fraction: relative sun angle · 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":40.033,"exit_code":1,"observations":[{"actual":[0.0,false],"check":"normal: rows facing the sun at noon","expected":[0.0,false],"passed":true},{"actual":[0.3054,true],"check":"boundary: steep morning sun","expected":[0.3054,true],"passed":true},{"actual":[1.0,true],"check":"boundary: sun below horizon","expected":[1.0,true],"passed":true},{"actual":[0.4597,true],"check":"regression: relative sun angle","expected":[0.4597,true],"passed":true},{"actual":[0.0566,true],"check":"regression: relative sun angle (partial repair)","expected":[1.0,true],"passed":false},{"actual":[0.0,false],"check":"control 1","expected":[0.0,false],"passed":true},{"actual":[0.6467,true],"check":"control 2","expected":[0.6467,true],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: rows facing the sun at noon\", \"actual\": [0.0, false], \"expected\": [0.0, false], \"passed\": true}, {\"check\": \"boundary: steep morning sun\", \"actual\": [0.3054, true], \"expected\": [0.3054, true], \"passed\": true}, {\"check\": \"boundary: sun below horizon\", \"actual\": [1.0, true], \"expected\": [1.0, true], \"passed\": true}, {\"check\": \"regression: relative sun angle\", \"actual\": [0.4597, true], \"expected\": [0.4597, true], \"passed\": true}, {\"check\": \"regression: relative sun angle (partial repair)\", \"actual\": [0.0566, true], \"expected\": [1.0, true], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [0.0, false], \"expected\": [0.0, false], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [0.6467, true], \"expected\": [0.6467, true], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.546,"exit_code":1,"observations":[{"actual":[0.0,false],"check":"normal: rows facing the sun at noon","expected":[0.0,false],"passed":true},{"actual":[1.0,true],"check":"boundary: steep morning sun","expected":[0.3054,true],"passed":false},{"actual":[1.0,true],"check":"boundary: sun below horizon","expected":[1.0,true],"passed":true},{"actual":[1.0,true],"check":"regression: relative sun angle","expected":[0.4597,true],"passed":false},{"actual":[0.0566,true],"check":"regression: relative sun angle (partial repair)","expected":[1.0,true],"passed":false},{"actual":[0.0,false],"check":"control 1","expected":[0.0,false],"passed":true},{"actual":[1.0,true],"check":"control 2","expected":[0.6467,true],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal: rows facing the sun at noon\", \"actual\": [0.0, false], \"expected\": [0.0, false], \"passed\": true}, {\"check\": \"boundary: steep morning sun\", \"actual\": [1.0, true], \"expected\": [0.3054, true], \"passed\": false}, {\"check\": \"boundary: sun below horizon\", \"actual\": [1.0, true], \"expected\": [1.0, true], \"passed\": true}, {\"check\": \"regression: relative sun angle\", \"actual\": [1.0, true], \"expected\": [0.4597, true], \"passed\": false}, {\"check\": \"regression: relative sun angle (partial repair)\", \"actual\": [0.0566, true], \"expected\": [1.0, true], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [0.0, false], \"expected\": [0.0, false], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [1.0, true], \"expected\": [0.6467, true], \"passed\": false}], \"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."}}