{"abstract":"Exactly two-hour exams draw relief invigilators unnecessarily.","category":"Exam timetabling constraints","checks":8,"contract":"rooms [room, venue, period, exam duration, candidates]. Rooms with candidates running exams longer than 120 minutes need relief cover; each venue-period needs ceil(qualifying rooms / per_relief) relief invigilators. Return [venue, period, qualifying rooms, relief invigilators] sorted by venue, period.","contract_signature":"rooms, per_relief","evaluation_group":"w2-exam-timetabling-constraints-relief-invigilator-cover","failed_approach":"Lowering the threshold to 90 minutes adds more unneeded cover.","family":"w2-exam-timetabling-constraints-relief-invigilator-cover-long-exam-threshold","id":"FA-94831","implementations":{"attempt":{"sha256":"666cc1f579d0afc4a7aa9f551b680ea13ad2657a0c13a296f7fb8d80257c8799","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rooms, per_relief):\n    groups = {}\n    for room, venue, p, dur, n in rooms:\n        if dur > 90 and n > 0:\n            groups[(venue, p)] = groups.get((venue, p), 0) + 1\n    return [[v, p, c, -(-c // per_relief)] for (v, p), c in sorted(groups.items())]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: long exam threshold 1', [[['R1', 'main', 0, 120, 10]], 3], []),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 121, 0], ['R2', 'main', 0, 150, 0],\n     ['R3', 'annex', 0, 180, 12], ['R4', 'annex', 1, 180, 12], ['R5', 'main', 0, 180, 30],\n     ['R6', 'annex', 1, 150, 30]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],\n     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],\n    3],\n   []),\n  ('boundary control 4', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 5',\n   [[['R0', 'annex', 0, 180, 12], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],\n     ['R3', 'annex', 1, 60, 30]],\n    3],\n   [['annex', 0, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 0, 120, 30], ['R2', 'main', 0, 180, 30],\n     ['R3', 'main', 1, 120, 0], ['R4', 'annex', 1, 121, 30]],\n    2],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 7',\n   [[['R0', 'annex', 1, 180, 30], ['R1', 'main', 1, 120, 30], ['R2', 'main', 0, 120, 0]], 3],\n   [['annex', 1, 1, 1]]),\n  ('normal control 8',\n   [[['R0', 'annex', 1, 60, 0], ['R1', 'main', 0, 180, 12], ['R2', 'main', 1, 150, 12],\n     ['R3', 'main', 0, 150, 30], ['R4', 'main', 1, 121, 0], ['R5', 'main', 0, 120, 0],\n     ['R6', 'annex', 1, 150, 0], ['R7', 'annex', 0, 120, 0]],\n    3],\n   [['main', 0, 2, 1], ['main', 1, 1, 1]])],\n [('regression: long exam threshold 1',\n   [[['R0', 'annex', 0, 60, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'main', 0, 120, 30],\n     ['R3', 'annex', 1, 180, 30]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 0, 121, 30], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],\n     ['R3', 'annex', 1, 150, 30]],\n    2],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'annex', 0, 90, 30], ['R1', 'main', 1, 120, 30], ['R2', 'annex', 1, 60, 30]], 3], []),\n  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),\n  ('normal control 5',\n   [[['R0', 'main', 0, 121, 12], ['R1', 'main', 0, 121, 30], ['R2', 'main', 0, 180, 0],\n     ['R3', 'annex', 0, 121, 0], ['R4', 'annex', 1, 120, 30], ['R5', 'main', 1, 60, 0],\n     ['R6', 'annex', 0, 150, 30], ['R7', 'annex', 1, 150, 30]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 2, 1]]),\n  ('normal control 6',\n   [[['R0', 'annex', 0, 90, 0], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],\n     ['R3', 'main', 0, 60, 30], ['R4', 'main', 0, 121, 12], ['R5', 'main', 1, 121, 12]],\n    2],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 7',\n   [[['R0', 'annex', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'annex', 1, 121, 12],\n     ['R3', 'main', 0, 121, 12], ['R4', 'main', 1, 120, 30], ['R5', 'annex', 0, 180, 12]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 8',\n   [[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 120, 0], ['R2', 'main', 0, 180, 0],\n     ['R3', 'annex', 0, 150, 0], ['R4', 'annex', 1, 150, 0], ['R5', 'annex', 0, 60, 0]],\n    3],\n   [['main', 1, 1, 1]])],\n [('regression: long exam threshold 1',\n   [[['R0', 'main', 0, 121, 30], ['R1', 'annex', 0, 60, 12], ['R2', 'annex', 0, 60, 12],\n     ['R3', 'main', 0, 150, 0], ['R4', 'annex', 0, 120, 12], ['R5', 'main', 0, 90, 12]],\n    2],\n   [['main', 0, 1, 1]]),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 90, 12], ['R2', 'annex', 0, 150, 0],\n     ['R3', 'main', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 0, 150, 12],\n     ['R6', 'main', 1, 121, 12], ['R7', 'main', 0, 90, 30]],\n    3],\n   [['main', 0, 1, 1], ['main', 1, 2, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'annex', 0, 180, 0], ['R1', 'main', 1, 121, 12], ['R2', 'main', 1, 150, 30],\n     ['R3', 'annex', 0, 120, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 120, 0]],\n    2],\n   [['main', 1, 2, 1]]),\n  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),\n  ('normal control 5',\n   [[['R0', 'main', 1, 180, 0], ['R1', 'annex', 1, 120, 0], ['R2', 'main', 1, 180, 30],\n     ['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 0, 121, 30]],\n    3],\n   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'annex', 1, 150, 12], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 90, 0]], 3],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 7',\n   [[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 60, 30], ['R2', 'annex', 0, 121, 12],\n     ['R3', 'annex', 0, 90, 12], ['R4', 'main', 0, 90, 30], ['R5', 'main', 1, 180, 30],\n     ['R6', 'annex', 1, 180, 0]],\n    2],\n   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 8', [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 90, 30]], 2], [])],\n [('regression: long exam threshold 1', [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 120, 30]], 2], []),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 180, 30], ['R2', 'annex', 0, 90, 12],\n     ['R3', 'main', 0, 150, 0]],\n    3],\n   [['main', 1, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'main', 0, 120, 12], ['R1', 'main', 0, 90, 0], ['R2', 'main', 1, 90, 0],\n     ['R3', 'annex', 1, 60, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 60, 30]],\n    3],\n   []),\n  ('boundary control 4',\n   [[['R1', 'main', 0, 180, 10], ['R2', 'main', 0, 180, 10], ['R3', 'main', 0, 180, 10],\n     ['R4', 'main', 0, 180, 5]],\n    3],\n   [['main', 0, 4, 2]]),\n  ('normal control 5', [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 90, 12]], 3], [['annex', 1, 1, 1]]),\n  ('normal control 6', [[['R0', 'annex', 0, 60, 0], ['R1', 'main', 0, 150, 12]], 2], [['main', 0, 1, 1]]),\n  ('normal control 7', [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 150, 0]], 2],\n   []),\n  ('normal control 8',\n   [[['R0', 'annex', 1, 120, 0], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 121, 12],\n     ['R3', 'annex', 0, 90, 30], ['R4', 'annex', 0, 121, 0]],\n    2],\n   [['annex', 0, 1, 1]])],\n [('regression: long exam threshold 1',\n   [[['R0', 'main', 1, 120, 30], ['R1', 'main', 0, 60, 30], ['R2', 'annex', 1, 120, 12],\n     ['R3', 'main', 0, 150, 0]],\n    2],\n   []),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 150, 30],\n     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'annex', 1, 120, 12],\n     ['R6', 'main', 0, 180, 30], ['R7', 'annex', 1, 121, 30]],\n    3],\n   [['annex', 1, 2, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'main', 1, 90, 12], ['R1', 'main', 1, 90, 0], ['R2', 'annex', 0, 120, 30],\n     ['R3', 'main', 1, 180, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 0, 120, 12],\n     ['R6', 'annex', 1, 121, 0]],\n    3],\n   [['annex', 1, 1, 1]]),\n  ('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),\n  ('normal control 5',\n   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],\n     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],\n    3],\n   []),\n  ('normal control 6',\n   [[['R0', 'annex', 0, 120, 12], ['R1', 'main', 1, 120, 12], ['R2', 'main', 1, 60, 30],\n     ['R3', 'main', 0, 121, 30]],\n    3],\n   [['main', 0, 1, 1]]),\n  ('normal control 7',\n   [[['R0', 'main', 1, 120, 12], ['R1', 'main', 0, 180, 0], ['R2', 'annex', 1, 150, 0],\n     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 1, 90, 30],\n     ['R6', 'annex', 0, 90, 30]],\n    3],\n   []),\n  ('normal control 8',\n   [[['R0', 'annex', 1, 150, 30], ['R1', 'main', 0, 121, 12], ['R2', 'annex', 1, 90, 30],\n     ['R3', 'main', 0, 150, 12]],\n    3],\n   [['annex', 1, 1, 1], ['main', 0, 2, 1]])]]\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":"686af29b4ca17fdd11194609c7897358e694b1a54d38bb4740f1b27d3f08890a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rooms, per_relief):\n    groups = {}\n    for room, venue, p, dur, n in rooms:\n        if dur >= 120 and n > 0:\n            groups[(venue, p)] = groups.get((venue, p), 0) + 1\n    return [[v, p, c, -(-c // per_relief)] for (v, p), c in sorted(groups.items())]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: long exam threshold 1', [[['R1', 'main', 0, 120, 10]], 3], []),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 121, 0], ['R2', 'main', 0, 150, 0],\n     ['R3', 'annex', 0, 180, 12], ['R4', 'annex', 1, 180, 12], ['R5', 'main', 0, 180, 30],\n     ['R6', 'annex', 1, 150, 30]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],\n     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],\n    3],\n   []),\n  ('boundary control 4', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 5',\n   [[['R0', 'annex', 0, 180, 12], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],\n     ['R3', 'annex', 1, 60, 30]],\n    3],\n   [['annex', 0, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 0, 120, 30], ['R2', 'main', 0, 180, 30],\n     ['R3', 'main', 1, 120, 0], ['R4', 'annex', 1, 121, 30]],\n    2],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 7',\n   [[['R0', 'annex', 1, 180, 30], ['R1', 'main', 1, 120, 30], ['R2', 'main', 0, 120, 0]], 3],\n   [['annex', 1, 1, 1]]),\n  ('normal control 8',\n   [[['R0', 'annex', 1, 60, 0], ['R1', 'main', 0, 180, 12], ['R2', 'main', 1, 150, 12],\n     ['R3', 'main', 0, 150, 30], ['R4', 'main', 1, 121, 0], ['R5', 'main', 0, 120, 0],\n     ['R6', 'annex', 1, 150, 0], ['R7', 'annex', 0, 120, 0]],\n    3],\n   [['main', 0, 2, 1], ['main', 1, 1, 1]])],\n [('regression: long exam threshold 1',\n   [[['R0', 'annex', 0, 60, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'main', 0, 120, 30],\n     ['R3', 'annex', 1, 180, 30]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 0, 121, 30], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],\n     ['R3', 'annex', 1, 150, 30]],\n    2],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'annex', 0, 90, 30], ['R1', 'main', 1, 120, 30], ['R2', 'annex', 1, 60, 30]], 3], []),\n  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),\n  ('normal control 5',\n   [[['R0', 'main', 0, 121, 12], ['R1', 'main', 0, 121, 30], ['R2', 'main', 0, 180, 0],\n     ['R3', 'annex', 0, 121, 0], ['R4', 'annex', 1, 120, 30], ['R5', 'main', 1, 60, 0],\n     ['R6', 'annex', 0, 150, 30], ['R7', 'annex', 1, 150, 30]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 2, 1]]),\n  ('normal control 6',\n   [[['R0', 'annex', 0, 90, 0], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],\n     ['R3', 'main', 0, 60, 30], ['R4', 'main', 0, 121, 12], ['R5', 'main', 1, 121, 12]],\n    2],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 7',\n   [[['R0', 'annex', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'annex', 1, 121, 12],\n     ['R3', 'main', 0, 121, 12], ['R4', 'main', 1, 120, 30], ['R5', 'annex', 0, 180, 12]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 8',\n   [[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 120, 0], ['R2', 'main', 0, 180, 0],\n     ['R3', 'annex', 0, 150, 0], ['R4', 'annex', 1, 150, 0], ['R5', 'annex', 0, 60, 0]],\n    3],\n   [['main', 1, 1, 1]])],\n [('regression: long exam threshold 1',\n   [[['R0', 'main', 0, 121, 30], ['R1', 'annex', 0, 60, 12], ['R2', 'annex', 0, 60, 12],\n     ['R3', 'main', 0, 150, 0], ['R4', 'annex', 0, 120, 12], ['R5', 'main', 0, 90, 12]],\n    2],\n   [['main', 0, 1, 1]]),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 90, 12], ['R2', 'annex', 0, 150, 0],\n     ['R3', 'main', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 0, 150, 12],\n     ['R6', 'main', 1, 121, 12], ['R7', 'main', 0, 90, 30]],\n    3],\n   [['main', 0, 1, 1], ['main', 1, 2, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'annex', 0, 180, 0], ['R1', 'main', 1, 121, 12], ['R2', 'main', 1, 150, 30],\n     ['R3', 'annex', 0, 120, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 120, 0]],\n    2],\n   [['main', 1, 2, 1]]),\n  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),\n  ('normal control 5',\n   [[['R0', 'main', 1, 180, 0], ['R1', 'annex', 1, 120, 0], ['R2', 'main', 1, 180, 30],\n     ['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 0, 121, 30]],\n    3],\n   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'annex', 1, 150, 12], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 90, 0]], 3],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 7',\n   [[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 60, 30], ['R2', 'annex', 0, 121, 12],\n     ['R3', 'annex', 0, 90, 12], ['R4', 'main', 0, 90, 30], ['R5', 'main', 1, 180, 30],\n     ['R6', 'annex', 1, 180, 0]],\n    2],\n   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 8', [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 90, 30]], 2], [])],\n [('regression: long exam threshold 1', [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 120, 30]], 2], []),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 180, 30], ['R2', 'annex', 0, 90, 12],\n     ['R3', 'main', 0, 150, 0]],\n    3],\n   [['main', 1, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'main', 0, 120, 12], ['R1', 'main', 0, 90, 0], ['R2', 'main', 1, 90, 0],\n     ['R3', 'annex', 1, 60, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 60, 30]],\n    3],\n   []),\n  ('boundary control 4',\n   [[['R1', 'main', 0, 180, 10], ['R2', 'main', 0, 180, 10], ['R3', 'main', 0, 180, 10],\n     ['R4', 'main', 0, 180, 5]],\n    3],\n   [['main', 0, 4, 2]]),\n  ('normal control 5', [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 90, 12]], 3], [['annex', 1, 1, 1]]),\n  ('normal control 6', [[['R0', 'annex', 0, 60, 0], ['R1', 'main', 0, 150, 12]], 2], [['main', 0, 1, 1]]),\n  ('normal control 7', [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 150, 0]], 2],\n   []),\n  ('normal control 8',\n   [[['R0', 'annex', 1, 120, 0], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 121, 12],\n     ['R3', 'annex', 0, 90, 30], ['R4', 'annex', 0, 121, 0]],\n    2],\n   [['annex', 0, 1, 1]])],\n [('regression: long exam threshold 1',\n   [[['R0', 'main', 1, 120, 30], ['R1', 'main', 0, 60, 30], ['R2', 'annex', 1, 120, 12],\n     ['R3', 'main', 0, 150, 0]],\n    2],\n   []),\n  ('regression variant: long exam threshold 2',\n   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 150, 30],\n     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'annex', 1, 120, 12],\n     ['R6', 'main', 0, 180, 30], ['R7', 'annex', 1, 121, 30]],\n    3],\n   [['annex', 1, 2, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'main', 1, 90, 12], ['R1', 'main', 1, 90, 0], ['R2', 'annex', 0, 120, 30],\n     ['R3', 'main', 1, 180, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 0, 120, 12],\n     ['R6', 'annex', 1, 121, 0]],\n    3],\n   [['annex', 1, 1, 1]]),\n  ('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),\n  ('normal control 5',\n   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],\n     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],\n    3],\n   []),\n  ('normal control 6',\n   [[['R0', 'annex', 0, 120, 12], ['R1', 'main', 1, 120, 12], ['R2', 'main', 1, 60, 30],\n     ['R3', 'main', 0, 121, 30]],\n    3],\n   [['main', 0, 1, 1]]),\n  ('normal control 7',\n   [[['R0', 'main', 1, 120, 12], ['R1', 'main', 0, 180, 0], ['R2', 'annex', 1, 150, 0],\n     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 1, 90, 30],\n     ['R6', 'annex', 0, 90, 30]],\n    3],\n   []),\n  ('normal control 8',\n   [[['R0', 'annex', 1, 150, 30], ['R1', 'main', 0, 121, 12], ['R2', 'annex', 1, 90, 30],\n     ['R3', 'main', 0, 150, 12]],\n    3],\n   [['annex', 1, 1, 1], ['main', 0, 2, 1]])]]\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":"Stipulated toy exam-timetabling rule set for a bounded model; it does not claim conformance with any institution's regulations or a benchmark specification, and it performs no search or optimisation. 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-exam-timetabling-constraints-relief-invigilator-cover-long-exam-threshold","generated_at":"2026-09-29T14:52:08.022214+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Long exams need relief invigilators so room staff can take breaks; cover is pooled per venue and period.","root_cause":"The duration test is inclusive at 120 minutes.","sha256":"3511c152423e0d08fe3e56c604b736b6891dcbed36297c0d408ce750f019d1d1","title":"Two-hour exams given relief cover · 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":42.502,"exit_code":1,"observations":[{"actual":[["main",0,1,1]],"check":"regression: long exam threshold 1","expected":[],"passed":false},{"actual":[["annex",0,1,1],["annex",1,3,1],["main",0,1,1]],"check":"regression variant: long exam threshold 2","expected":[["annex",0,1,1],["annex",1,2,1],["main",0,1,1]],"passed":false},{"actual":[["main",0,1,1]],"check":"partial repair guard 3","expected":[],"passed":false},{"actual":[["annex",0,1,1],["main",0,1,1]],"check":"boundary control 4","expected":[["annex",0,1,1],["main",0,1,1]],"passed":true},{"actual":[["annex",0,1,1],["annex",1,1,1]],"check":"normal control 5","expected":[["annex",0,1,1]],"passed":false},{"actual":[["annex",1,2,1],["main",0,2,1]],"check":"normal control 6","expected":[["annex",1,1,1],["main",0,1,1]],"passed":false},{"actual":[["annex",1,1,1],["main",1,1,1]],"check":"normal control 7","expected":[["annex",1,1,1]],"passed":false},{"actual":[["main",0,2,1],["main",1,1,1]],"check":"normal control 8","expected":[["main",0,2,1],["main",1,1,1]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: long exam threshold 1\", \"actual\": [[\"main\", 0, 1, 1]], \"expected\": [], \"passed\": false}, {\"check\": \"regression variant: long exam threshold 2\", \"actual\": [[\"annex\", 0, 1, 1], [\"annex\", 1, 3, 1], [\"main\", 0, 1, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"annex\", 1, 2, 1], [\"main\", 0, 1, 1]], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"main\", 0, 1, 1]], \"expected\": [], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[\"annex\", 0, 1, 1], [\"main\", 0, 1, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"main\", 0, 1, 1]], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [[\"annex\", 0, 1, 1], [\"annex\", 1, 1, 1]], \"expected\": [[\"annex\", 0, 1, 1]], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[\"annex\", 1, 2, 1], [\"main\", 0, 2, 1]], \"expected\": [[\"annex\", 1, 1, 1], [\"main\", 0, 1, 1]], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [[\"annex\", 1, 1, 1], [\"main\", 1, 1, 1]], \"expected\": [[\"annex\", 1, 1, 1]], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [[\"main\", 0, 2, 1], [\"main\", 1, 1, 1]], \"expected\": [[\"main\", 0, 2, 1], [\"main\", 1, 1, 1]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.072,"exit_code":1,"observations":[{"actual":[["main",0,1,1]],"check":"regression: long exam threshold 1","expected":[],"passed":false},{"actual":[["annex",0,1,1],["annex",1,3,1],["main",0,1,1]],"check":"regression variant: long exam threshold 2","expected":[["annex",0,1,1],["annex",1,2,1],["main",0,1,1]],"passed":false},{"actual":[["main",0,1,1]],"check":"partial repair guard 3","expected":[],"passed":false},{"actual":[["annex",0,1,1],["main",0,1,1]],"check":"boundary control 4","expected":[["annex",0,1,1],["main",0,1,1]],"passed":true},{"actual":[["annex",0,1,1],["annex",1,1,1]],"check":"normal control 5","expected":[["annex",0,1,1]],"passed":false},{"actual":[["annex",1,2,1],["main",0,2,1]],"check":"normal control 6","expected":[["annex",1,1,1],["main",0,1,1]],"passed":false},{"actual":[["annex",1,1,1],["main",1,1,1]],"check":"normal control 7","expected":[["annex",1,1,1]],"passed":false},{"actual":[["main",0,2,1],["main",1,1,1]],"check":"normal control 8","expected":[["main",0,2,1],["main",1,1,1]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: long exam threshold 1\", \"actual\": [[\"main\", 0, 1, 1]], \"expected\": [], \"passed\": false}, {\"check\": \"regression variant: long exam threshold 2\", \"actual\": [[\"annex\", 0, 1, 1], [\"annex\", 1, 3, 1], [\"main\", 0, 1, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"annex\", 1, 2, 1], [\"main\", 0, 1, 1]], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"main\", 0, 1, 1]], \"expected\": [], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[\"annex\", 0, 1, 1], [\"main\", 0, 1, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"main\", 0, 1, 1]], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [[\"annex\", 0, 1, 1], [\"annex\", 1, 1, 1]], \"expected\": [[\"annex\", 0, 1, 1]], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[\"annex\", 1, 2, 1], [\"main\", 0, 2, 1]], \"expected\": [[\"annex\", 1, 1, 1], [\"main\", 0, 1, 1]], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [[\"annex\", 1, 1, 1], [\"main\", 1, 1, 1]], \"expected\": [[\"annex\", 1, 1, 1]], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [[\"main\", 0, 2, 1], [\"main\", 1, 1, 1]], \"expected\": [[\"main\", 0, 2, 1], [\"main\", 1, 1, 1]], \"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."}}