{"abstract":"Interpolated angles barely move away from the earlier entry.","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":"Reversing the weight moves toward the earlier entry as time advances.","family":"w2-solar_tracker_geometry-angle-schedule-table-interpolation-weight","id":"FA-93656","implementations":{"attempt":{"sha256":"7bb1816961f1f0b71edc6866b068a6c33af287923f7fb9151217d628561f16a7","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) * (m1 - t) / (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: interpolation weight', [[[420, 60], [600, -30], [900, -30], [600, 30]], 525], 42.5],\n  ['regression: interpolation weight (partial repair)', [[[600, 60], [480, 0], [1080, 15]], 795],\n   41.72],\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: interpolation weight', [[[900, 60], [420, 60], [1080, -60]], 1065], -50.0],\n  ['regression: interpolation weight (partial repair)',\n   [[[480, -30], [1020, 15], [540, -45], [1080, 45], [1080, 30], [420, 45]], 690], -26.25],\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: interpolation weight', [[[360, -30], [1140, 30], [840, -15]], 1140], 30.0],\n  ['regression: interpolation weight (partial repair)',\n   [[[1020, -60], [660, -30], [600, -45], [480, 45], [600, -15]], 525], 22.5],\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: interpolation weight', [[[1080, 60], [480, 30], [660, 0], [960, -15]], 750], -4.5],\n  ['regression: interpolation weight (partial repair)', [[[780, 45], [1140, 30], [960, -30]], 1020],\n   -10.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: interpolation weight', [[[840, -60], [420, -45]], 765], -57.32],\n  ['regression: interpolation weight (partial repair)',\n   [[[840, -60], [780, -45], [960, 45], [420, -30]], 795], -48.75],\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":"09f8dd9991f8b7d36ae7d311fa2698342072953eb5f37eea5a9708718aee4b9b","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, 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: interpolation weight', [[[420, 60], [600, -30], [900, -30], [600, 30]], 525], 42.5],\n  ['regression: interpolation weight (partial repair)', [[[600, 60], [480, 0], [1080, 15]], 795],\n   41.72],\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: interpolation weight', [[[900, 60], [420, 60], [1080, -60]], 1065], -50.0],\n  ['regression: interpolation weight (partial repair)',\n   [[[480, -30], [1020, 15], [540, -45], [1080, 45], [1080, 30], [420, 45]], 690], -26.25],\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: interpolation weight', [[[360, -30], [1140, 30], [840, -15]], 1140], 30.0],\n  ['regression: interpolation weight (partial repair)',\n   [[[1020, -60], [660, -30], [600, -45], [480, 45], [600, -15]], 525], 22.5],\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: interpolation weight', [[[1080, 60], [480, 30], [660, 0], [960, -15]], 750], -4.5],\n  ['regression: interpolation weight (partial repair)', [[[780, 45], [1140, 30], [960, -30]], 1020],\n   -10.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: interpolation weight', [[[840, -60], [420, -45]], 765], -57.32],\n  ['regression: interpolation weight (partial repair)',\n   [[[840, -60], [780, -45], [960, 45], [420, -30]], 795], -48.75],\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-interpolation-weight","generated_at":"2026-09-29T14:51:57.080544+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 fraction divides by the absolute minute instead of the interval length.","sha256":"bcad0d587fc6539cdba9d2610739c790accf5222e37b39904c5ea026fb5b4791","title":"Precomputed tracker angle table: interpolation weight · 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.202,"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":47.5,"check":"regression: interpolation weight","expected":42.5,"passed":false},{"actual":33.28,"check":"regression: interpolation weight (partial repair)","expected":41.72,"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\": 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: interpolation weight\", \"actual\": 47.5, \"expected\": 42.5, \"passed\": false}, {\"check\": \"regression: interpolation weight (partial repair)\", \"actual\": 33.28, \"expected\": 41.72, \"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":39.953,"exit_code":1,"observations":[{"actual":20.0,"check":"boundary: at last entry","expected":60.0,"passed":false},{"actual":-45.0,"check":"normal: midway","expected":-30.0,"passed":false},{"actual":0.0,"check":"boundary: before first entry","expected":0.0,"passed":true},{"actual":54.75,"check":"regression: interpolation weight","expected":42.5,"passed":false},{"actual":51.88,"check":"regression: interpolation weight (partial repair)","expected":41.72,"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\": 20.0, \"expected\": 60.0, \"passed\": false}, {\"check\": \"normal: midway\", \"actual\": -45.0, \"expected\": -30.0, \"passed\": false}, {\"check\": \"boundary: before first entry\", \"actual\": 0.0, \"expected\": 0.0, \"passed\": true}, {\"check\": \"regression: interpolation weight\", \"actual\": 54.75, \"expected\": 42.5, \"passed\": false}, {\"check\": \"regression: interpolation weight (partial repair)\", \"actual\": 51.88, \"expected\": 41.72, \"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."}}