{"abstract":"A corrected table entry appended later is ignored.","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":"Keeping the larger angle is not the last-entry rule.","family":"w2-solar_tracker_geometry-angle-schedule-table-duplicate-minute-precedence","id":"FA-93641","implementations":{"attempt":{"sha256":"f1433eca2d786ea0476cbfcd2e425c3c183d9a4dd58bb9ac23487de98178c6d8","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] = max(a, pts.get(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: duplicate minute precedence', [[[420, 60], [600, -30], [900, -30], [600, 30]], 525],\n   42.5],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[1020, -30], [540, 15], [540, -15]], 825], -23.91],\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: duplicate minute precedence', [[[420, -45], [420, -30], [900, -60]], 765], -51.56],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[1140, -60], [360, -30], [900, 30], [900, 15], [480, 0]], 855], 13.39],\n  ['control 1', [[[540, 30], [1020, 45]], 945], 42.66],\n  ['control 2', [[[660, 0], [360, 30], [780, 0], [1080, 60], [960, -30]], 480], 18.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: duplicate minute precedence',\n   [[[1020, -60], [660, -30], [600, -45], [480, 45], [600, -15]], 525], 22.5],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[720, 45], [1140, -45], [360, 45], [1140, -60], [360, 15]], 945], -11.25],\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: duplicate minute precedence',\n   [[[780, -30], [600, 60], [900, -15], [600, 0], [480, 45], [960, -15]], 750], -25.0],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[720, -60], [540, -45], [540, -60], [960, -45], [360, -45]], 525], -58.75],\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: duplicate minute precedence',\n   [[[900, -45], [720, -45], [960, -15], [900, 60], [420, 30]], 765], -18.75],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[600, 0], [420, 15], [720, -15], [420, -60]], 585], -5.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":"efce8cd91c350c5ea071c47cf99d0cca08809342522f58827c2ce64d3ed4986f","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        if m not in pts:\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: duplicate minute precedence', [[[420, 60], [600, -30], [900, -30], [600, 30]], 525],\n   42.5],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[1020, -30], [540, 15], [540, -15]], 825], -23.91],\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: duplicate minute precedence', [[[420, -45], [420, -30], [900, -60]], 765], -51.56],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[1140, -60], [360, -30], [900, 30], [900, 15], [480, 0]], 855], 13.39],\n  ['control 1', [[[540, 30], [1020, 45]], 945], 42.66],\n  ['control 2', [[[660, 0], [360, 30], [780, 0], [1080, 60], [960, -30]], 480], 18.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: duplicate minute precedence',\n   [[[1020, -60], [660, -30], [600, -45], [480, 45], [600, -15]], 525], 22.5],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[720, 45], [1140, -45], [360, 45], [1140, -60], [360, 15]], 945], -11.25],\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: duplicate minute precedence',\n   [[[780, -30], [600, 60], [900, -15], [600, 0], [480, 45], [960, -15]], 750], -25.0],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[720, -60], [540, -45], [540, -60], [960, -45], [360, -45]], 525], -58.75],\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: duplicate minute precedence',\n   [[[900, -45], [720, -45], [960, -15], [900, 60], [420, 30]], 765], -18.75],\n  ['regression: duplicate minute precedence (partial repair)',\n   [[[600, 0], [420, 15], [720, -15], [420, -60]], 585], -5.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-duplicate-minute-precedence","generated_at":"2026-09-29T14:51:56.959847+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 first entry for a minute is kept instead of the last.","sha256":"5ffb0fa3b3054bf6a5cef66a904f38649ca63cf1e0913dbcba434d2009fe9c19","title":"Precomputed tracker angle table: duplicate minute precedence · 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":41.329,"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":42.5,"check":"regression: duplicate minute precedence","expected":42.5,"passed":true},{"actual":-11.72,"check":"regression: duplicate minute precedence (partial repair)","expected":-23.91,"passed":false},{"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\": 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: duplicate minute precedence\", \"actual\": 42.5, \"expected\": 42.5, \"passed\": true}, {\"check\": \"regression: duplicate minute precedence (partial repair)\", \"actual\": -11.72, \"expected\": -23.91, \"passed\": false}, {\"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"},"broken":{"elapsed_ms":40.141,"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":7.5,"check":"regression: duplicate minute precedence","expected":42.5,"passed":false},{"actual":-11.72,"check":"regression: duplicate minute precedence (partial repair)","expected":-23.91,"passed":false},{"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\": 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: duplicate minute precedence\", \"actual\": 7.5, \"expected\": 42.5, \"passed\": false}, {\"check\": \"regression: duplicate minute precedence (partial repair)\", \"actual\": -11.72, \"expected\": -23.91, \"passed\": false}, {\"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."}}