{"abstract":"The final scheduled angle is never commanded.","category":"Solar tracker geometry","checks":7,"contract":"table lists [minute, angle] entries in any order; for duplicate minutes the last listed entry wins. Outside [first, last] minute the tracker is flat (0.0). Inside, the angle is linearly interpolated between neighbouring entries and rounded to 2. Return the angle.","contract_signature":"table, t","evaluation_group":"w2-solar_tracker_geometry-angle-schedule-table","failed_approach":"Dropping the evening check leaves the tracker at a stale angle after the schedule ends.","family":"w2-solar_tracker_geometry-angle-schedule-table-evening-range-end","id":"FA-93651","implementations":{"attempt":{"sha256":"5eb17668fdbce776714a912e3d11b2d96186bff284212a11c9d6633de90eb5d6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(table, t):\n    pts = {}\n    for m, a in table:\n        pts[m] = a\n    keys = sorted(pts)\n    if not keys or t < keys[0]:\n        return 0.0\n    for m0, m1 in zip(keys, keys[1:]):\n        if m0 <= t <= m1:\n            a0, a1 = pts[m0], pts[m1]\n            return round(a0 + (a1 - a0) * (t - m0) / (m1 - m0), 2)\n    return round(float(pts[keys[0]]), 2)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[540, 60]], 540], 60.0],\n  ['regression: evening range end (partial repair)', [[[420, 60]], 1110], 0.0],\n  ['control 1', [[[840, 45], [1140, -60]], 300], 0.0],\n  ['control 2', [[[540, -60], [600, 60], [480, 45]], 870], 0.0]],\n [['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[360, -30], [1140, 30], [840, -15]], 1140], 30.0],\n  ['regression: evening range end (partial repair)',\n   [[[600, 15], [420, -60], [360, 30], [540, 60]], 690], 0.0],\n  ['control 1', [[[540, 30], [1020, 45]], 945], 42.66],\n  ['control 2', [[[1140, -60], [360, -30], [900, 30], [900, 15], [480, 0]], 855], 13.39]],\n [['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[360, -30], [1140, 30], [840, -15]], 1140], 30.0],\n  ['regression: evening range end (partial repair)', [[[660, 15], [1020, -45]], 1095], 0.0],\n  ['control 1', [[[1080, -45], [540, 45]], 1110], 0.0],\n  ['control 2', [[[600, 45], [1020, 45]], 585], 0.0]],\n [['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[540, 60]], 540], 60.0],\n  ['regression: evening range end (partial repair)', [[[480, 60], [480, -30], [720, -15]], 840],\n   0.0],\n  ['control 1', [[[600, -15], [1080, 30], [1080, 0]], 420], 0.0],\n  ['control 2', [[[1140, 0], [480, -15]], 1110], -0.68]],\n [['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[540, 60]], 540], 60.0],\n  ['regression: evening range end (partial repair)',\n   [[[600, 0], [540, 0], [480, -60], [840, -30]], 1200], 0.0],\n  ['control 1', [[[1080, 0]], 345], 0.0], ['control 2', [[[1080, 45]], 600], 0.0]]]\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":"ef1662104f702f2db5de467e783f44d6acb3c2b4775a7855a571db0db78f7c03","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(table, t):\n    pts = {}\n    for m, a in table:\n        pts[m] = a\n    keys = sorted(pts)\n    if not keys or t < keys[0] or t >= keys[-1]:\n        return 0.0\n    for m0, m1 in zip(keys, keys[1:]):\n        if m0 <= t <= m1:\n            a0, a1 = pts[m0], pts[m1]\n            return round(a0 + (a1 - a0) * (t - m0) / (m1 - m0), 2)\n    return round(float(pts[keys[0]]), 2)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[540, 60]], 540], 60.0],\n  ['regression: evening range end (partial repair)', [[[420, 60]], 1110], 0.0],\n  ['control 1', [[[840, 45], [1140, -60]], 300], 0.0],\n  ['control 2', [[[540, -60], [600, 60], [480, 45]], 870], 0.0]],\n [['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[360, -30], [1140, 30], [840, -15]], 1140], 30.0],\n  ['regression: evening range end (partial repair)',\n   [[[600, 15], [420, -60], [360, 30], [540, 60]], 690], 0.0],\n  ['control 1', [[[540, 30], [1020, 45]], 945], 42.66],\n  ['control 2', [[[1140, -60], [360, -30], [900, 30], [900, 15], [480, 0]], 855], 13.39]],\n [['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[360, -30], [1140, 30], [840, -15]], 1140], 30.0],\n  ['regression: evening range end (partial repair)', [[[660, 15], [1020, -45]], 1095], 0.0],\n  ['control 1', [[[1080, -45], [540, 45]], 1110], 0.0],\n  ['control 2', [[[600, 45], [1020, 45]], 585], 0.0]],\n [['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[540, 60]], 540], 60.0],\n  ['regression: evening range end (partial repair)', [[[480, 60], [480, -30], [720, -15]], 840],\n   0.0],\n  ['control 1', [[[600, -15], [1080, 30], [1080, 0]], 420], 0.0],\n  ['control 2', [[[1140, 0], [480, -15]], 1110], -0.68]],\n [['boundary: at last entry', [[[360, -60], [720, 0], [1080, 60]], 1080], 60.0],\n  ['normal: midway', [[[360, -60], [720, 0], [1080, 60]], 540], -30.0],\n  ['boundary: before first entry', [[[360, -60], [720, 0]], 300], 0.0],\n  ['regression: evening range end', [[[540, 60]], 540], 60.0],\n  ['regression: evening range end (partial repair)',\n   [[[600, 0], [540, 0], [480, -60], [840, -30]], 1200], 0.0],\n  ['control 1', [[[1080, 0]], 345], 0.0], ['control 2', [[[1080, 45]], 600], 0.0]]]\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-angle-schedule-table-evening-range-end","generated_at":"2026-09-29T14:51:57.048271+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 last table minute is treated as outside the schedule.","sha256":"ec151c911c786f417c9970cdad0a64f6808e0df54b2e3347fc0cf2588f5b7b7d","title":"Precomputed tracker angle table: evening range end · 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.259,"exit_code":1,"observations":[{"actual":60.0,"check":"boundary: at last entry","expected":60.0,"passed":true},{"actual":-30.0,"check":"normal: midway","expected":-30.0,"passed":true},{"actual":0.0,"check":"boundary: before first entry","expected":0.0,"passed":true},{"actual":60.0,"check":"regression: evening range end","expected":60.0,"passed":true},{"actual":60.0,"check":"regression: evening range end (partial repair)","expected":0.0,"passed":false},{"actual":0.0,"check":"control 1","expected":0.0,"passed":true},{"actual":45.0,"check":"control 2","expected":0.0,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: at last entry\", \"actual\": 60.0, \"expected\": 60.0, \"passed\": true}, {\"check\": \"normal: midway\", \"actual\": -30.0, \"expected\": -30.0, \"passed\": true}, {\"check\": \"boundary: before first entry\", \"actual\": 0.0, \"expected\": 0.0, \"passed\": true}, {\"check\": \"regression: evening range end\", \"actual\": 60.0, \"expected\": 60.0, \"passed\": true}, {\"check\": \"regression: evening range end (partial repair)\", \"actual\": 60.0, \"expected\": 0.0, \"passed\": false}, {\"check\": \"control 1\", \"actual\": 0.0, \"expected\": 0.0, \"passed\": true}, {\"check\": \"control 2\", \"actual\": 45.0, \"expected\": 0.0, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.25,"exit_code":1,"observations":[{"actual":0.0,"check":"boundary: at last entry","expected":60.0,"passed":false},{"actual":-30.0,"check":"normal: midway","expected":-30.0,"passed":true},{"actual":0.0,"check":"boundary: before first entry","expected":0.0,"passed":true},{"actual":0.0,"check":"regression: evening range end","expected":60.0,"passed":false},{"actual":0.0,"check":"regression: evening range end (partial repair)","expected":0.0,"passed":true},{"actual":0.0,"check":"control 1","expected":0.0,"passed":true},{"actual":0.0,"check":"control 2","expected":0.0,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: at last entry\", \"actual\": 0.0, \"expected\": 60.0, \"passed\": false}, {\"check\": \"normal: midway\", \"actual\": -30.0, \"expected\": -30.0, \"passed\": true}, {\"check\": \"boundary: before first entry\", \"actual\": 0.0, \"expected\": 0.0, \"passed\": true}, {\"check\": \"regression: evening range end\", \"actual\": 0.0, \"expected\": 60.0, \"passed\": false}, {\"check\": \"regression: evening range end (partial repair)\", \"actual\": 0.0, \"expected\": 0.0, \"passed\": true}, {\"check\": \"control 1\", \"actual\": 0.0, \"expected\": 0.0, \"passed\": true}, {\"check\": \"control 2\", \"actual\": 0.0, \"expected\": 0.0, \"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."}}