{"abstract":"Every long-exam room gets its own relief invigilator.","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":"Pooling across venues shares one reliever between buildings.","family":"w2-exam-timetabling-constraints-relief-invigilator-cover-venue-period-pooling","id":"FA-94836","implementations":{"attempt":{"sha256":"fce1a12f2b801cca103f18457f91afddda13f8dd1acb779a1bae10b88196cb51","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[('all', p)] = groups.get(('all', 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: venue period pooling 1', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),\n  ('regression variant: venue period pooling 2',\n   [[['R0', 'annex', 1, 180, 0], ['R1', 'main', 1, 121, 30], ['R2', 'annex', 1, 60, 0],\n     ['R3', 'main', 1, 121, 0], ['R4', 'annex', 1, 121, 12], ['R5', 'annex', 0, 180, 12],\n     ['R6', 'annex', 0, 120, 12], ['R7', 'annex', 0, 120, 0]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'annex', 0, 180, 12], ['R1', 'main', 0, 150, 12], ['R2', 'annex', 0, 60, 0],\n     ['R3', 'main', 1, 150, 12]],\n    3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\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, 121, 0], ['R1', 'main', 1, 150, 12], ['R2', 'main', 0, 90, 30],\n     ['R3', 'annex', 1, 180, 12], ['R4', 'annex', 0, 60, 0], ['R5', 'main', 0, 150, 30]],\n    2],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'main', 1, 180, 30], ['R1', 'main', 0, 121, 12], ['R2', 'main', 1, 121, 0],\n     ['R3', 'annex', 0, 120, 12], ['R4', 'main', 0, 150, 30]],\n    3],\n   [['main', 0, 2, 1], ['main', 1, 1, 1]]),\n  ('normal control 7', [[['R0', 'main', 1, 90, 30]], 3], []),\n  ('normal control 8',\n   [[['R0', 'main', 0, 121, 12], ['R1', 'annex', 1, 150, 12], ['R2', 'annex', 1, 120, 12],\n     ['R3', 'annex', 0, 120, 30], ['R4', 'annex', 1, 90, 0], ['R5', 'annex', 0, 120, 12]],\n    2],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1]])],\n [('regression: venue period pooling 1',\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  ('regression variant: venue period pooling 2',\n   [[['R0', 'annex', 0, 180, 30], ['R1', 'annex', 0, 90, 30], ['R2', 'annex', 0, 150, 30],\n     ['R3', 'annex', 0, 90, 12], ['R4', 'annex', 1, 121, 0]],\n    2],\n   [['annex', 0, 2, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'main', 1, 180, 12], ['R1', 'main', 0, 121, 0], ['R2', 'annex', 1, 120, 30],\n     ['R3', 'main', 1, 180, 0], ['R4', 'annex', 0, 90, 12], ['R5', 'annex', 0, 60, 12],\n     ['R6', 'main', 1, 150, 30], ['R7', 'annex', 0, 121, 0]],\n    2],\n   [['main', 1, 2, 1]]),\n  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),\n  ('normal control 5', [[['R0', 'annex', 1, 121, 0]], 2], []),\n  ('normal control 6',\n   [[['R0', 'annex', 0, 180, 12], ['R1', 'main', 0, 180, 30], ['R2', 'annex', 1, 180, 0],\n     ['R3', 'main', 1, 120, 30], ['R4', 'main', 0, 120, 12], ['R5', 'main', 0, 121, 12]],\n    2],\n   [['annex', 0, 1, 1], ['main', 0, 2, 1]]),\n  ('normal control 7',\n   [[['R0', 'main', 1, 60, 12], ['R1', 'main', 1, 60, 0], ['R2', 'annex', 0, 180, 0],\n     ['R3', 'main', 1, 150, 0]],\n    2],\n   []),\n  ('normal control 8',\n   [[['R0', 'annex', 0, 90, 12], ['R1', 'main', 0, 121, 0], ['R2', 'main', 1, 60, 12]], 2], [])],\n [('regression: venue period pooling 1', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),\n  ('regression variant: venue period pooling 2',\n   [[['R0', 'annex', 1, 60, 12], ['R1', 'main', 1, 60, 0], ['R2', 'annex', 0, 90, 0],\n     ['R3', 'main', 1, 120, 30], ['R4', 'annex', 1, 180, 30], ['R5', 'main', 0, 150, 0]],\n    2],\n   [['annex', 1, 1, 1]]),\n  ('partial repair guard 3', [[['R0', 'main', 0, 121, 12]], 2], [['main', 0, 1, 1]]),\n  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),\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, 120, 0], ['R1', 'annex', 0, 121, 30], ['R2', 'annex', 0, 90, 30],\n     ['R3', 'main', 0, 60, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 1, 120, 30],\n     ['R6', 'annex', 0, 121, 12]],\n    3],\n   [['annex', 0, 2, 1], ['annex', 1, 1, 1]]),\n  ('normal control 7', [[['R0', 'annex', 1, 121, 0], ['R1', 'main', 0, 120, 12]], 2], []),\n  ('normal control 8',\n   [[['R0', 'annex', 0, 180, 12], ['R1', 'main', 0, 150, 12], ['R2', 'annex', 0, 60, 0],\n     ['R3', 'main', 1, 150, 12]],\n    3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]])],\n [('regression: venue period pooling 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: venue period pooling 2',\n   [[['R0', 'main', 0, 180, 12], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],\n     ['R3', 'main', 0, 180, 0], ['R4', 'annex', 1, 180, 30], ['R5', 'annex', 1, 120, 30],\n     ['R6', 'annex', 1, 180, 0], ['R7', 'main', 1, 150, 12]],\n    2],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('partial repair guard 3', [[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 180, 30]], 3],\n   [['main', 1, 1, 1]]),\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',\n   [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 60, 12], ['R2', 'main', 1, 180, 12],\n     ['R3', 'main', 0, 180, 12], ['R4', 'main', 1, 60, 12], ['R5', 'annex', 1, 180, 30]],\n    2],\n   [['annex', 1, 2, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'main', 1, 180, 30], ['R1', 'main', 0, 60, 0], ['R2', 'annex', 0, 60, 12],\n     ['R3', 'annex', 1, 120, 30], ['R4', 'annex', 0, 60, 0]],\n    2],\n   [['main', 1, 1, 1]]),\n  ('normal control 7', [[['R0', 'main', 1, 90, 12], ['R1', 'annex', 1, 120, 12]], 2], []),\n  ('normal control 8',\n   [[['R0', 'annex', 0, 120, 0], ['R1', 'annex', 0, 180, 12], ['R2', 'main', 0, 121, 12],\n     ['R3', 'annex', 0, 150, 12], ['R4', 'annex', 1, 60, 12], ['R5', 'annex', 0, 180, 30],\n     ['R6', 'main', 1, 60, 0]],\n    2],\n   [['annex', 0, 3, 2], ['main', 0, 1, 1]])],\n [('regression: venue period pooling 1',\n   [[['R0', 'main', 1, 150, 30], ['R1', 'annex', 0, 150, 30], ['R2', 'annex', 0, 90, 30],\n     ['R3', 'main', 0, 90, 30], ['R4', 'main', 0, 150, 0]],\n    3],\n   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('regression variant: venue period pooling 2',\n   [[['R0', 'main', 1, 90, 30], ['R1', 'annex', 0, 90, 12], ['R2', 'main', 1, 121, 12]], 2],\n   [['main', 1, 1, 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, 120, 10]], 3], []),\n  ('normal control 5',\n   [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 121, 30], ['R2', 'annex', 0, 120, 0],\n     ['R3', 'main', 0, 150, 12], ['R4', 'annex', 1, 180, 0], ['R5', 'main', 0, 90, 30],\n     ['R6', 'annex', 1, 120, 0], ['R7', 'main', 0, 150, 0]],\n    2],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'annex', 1, 60, 12], ['R1', 'annex', 0, 120, 0], ['R2', 'main', 0, 120, 0],\n     ['R3', 'annex', 0, 121, 30], ['R4', 'annex', 0, 121, 0], ['R5', 'main', 1, 90, 0],\n     ['R6', 'main', 0, 150, 0], ['R7', 'annex', 0, 90, 30]],\n    2],\n   [['annex', 0, 1, 1]]),\n  ('normal control 7', [[['R0', 'annex', 1, 150, 30], ['R1', 'annex', 0, 121, 30]], 3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),\n  ('normal control 8',\n   [[['R0', 'main', 0, 60, 12], ['R1', 'annex', 1, 60, 0], ['R2', 'annex', 1, 180, 0],\n     ['R3', 'main', 0, 121, 30], ['R4', 'main', 1, 150, 12], ['R5', 'annex', 0, 120, 30],\n     ['R6', 'main', 1, 150, 0], ['R7', 'annex', 0, 121, 12]],\n    3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 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":"4e1fd15d37dd7a3495cd856904056240bf6568d6744dfe389fb9bea01c20f2c1","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, room)] = groups.get((venue, room), 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: venue period pooling 1', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),\n  ('regression variant: venue period pooling 2',\n   [[['R0', 'annex', 1, 180, 0], ['R1', 'main', 1, 121, 30], ['R2', 'annex', 1, 60, 0],\n     ['R3', 'main', 1, 121, 0], ['R4', 'annex', 1, 121, 12], ['R5', 'annex', 0, 180, 12],\n     ['R6', 'annex', 0, 120, 12], ['R7', 'annex', 0, 120, 0]],\n    3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 1, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'annex', 0, 180, 12], ['R1', 'main', 0, 150, 12], ['R2', 'annex', 0, 60, 0],\n     ['R3', 'main', 1, 150, 12]],\n    3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\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, 121, 0], ['R1', 'main', 1, 150, 12], ['R2', 'main', 0, 90, 30],\n     ['R3', 'annex', 1, 180, 12], ['R4', 'annex', 0, 60, 0], ['R5', 'main', 0, 150, 30]],\n    2],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'main', 1, 180, 30], ['R1', 'main', 0, 121, 12], ['R2', 'main', 1, 121, 0],\n     ['R3', 'annex', 0, 120, 12], ['R4', 'main', 0, 150, 30]],\n    3],\n   [['main', 0, 2, 1], ['main', 1, 1, 1]]),\n  ('normal control 7', [[['R0', 'main', 1, 90, 30]], 3], []),\n  ('normal control 8',\n   [[['R0', 'main', 0, 121, 12], ['R1', 'annex', 1, 150, 12], ['R2', 'annex', 1, 120, 12],\n     ['R3', 'annex', 0, 120, 30], ['R4', 'annex', 1, 90, 0], ['R5', 'annex', 0, 120, 12]],\n    2],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1]])],\n [('regression: venue period pooling 1',\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  ('regression variant: venue period pooling 2',\n   [[['R0', 'annex', 0, 180, 30], ['R1', 'annex', 0, 90, 30], ['R2', 'annex', 0, 150, 30],\n     ['R3', 'annex', 0, 90, 12], ['R4', 'annex', 1, 121, 0]],\n    2],\n   [['annex', 0, 2, 1]]),\n  ('partial repair guard 3',\n   [[['R0', 'main', 1, 180, 12], ['R1', 'main', 0, 121, 0], ['R2', 'annex', 1, 120, 30],\n     ['R3', 'main', 1, 180, 0], ['R4', 'annex', 0, 90, 12], ['R5', 'annex', 0, 60, 12],\n     ['R6', 'main', 1, 150, 30], ['R7', 'annex', 0, 121, 0]],\n    2],\n   [['main', 1, 2, 1]]),\n  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),\n  ('normal control 5', [[['R0', 'annex', 1, 121, 0]], 2], []),\n  ('normal control 6',\n   [[['R0', 'annex', 0, 180, 12], ['R1', 'main', 0, 180, 30], ['R2', 'annex', 1, 180, 0],\n     ['R3', 'main', 1, 120, 30], ['R4', 'main', 0, 120, 12], ['R5', 'main', 0, 121, 12]],\n    2],\n   [['annex', 0, 1, 1], ['main', 0, 2, 1]]),\n  ('normal control 7',\n   [[['R0', 'main', 1, 60, 12], ['R1', 'main', 1, 60, 0], ['R2', 'annex', 0, 180, 0],\n     ['R3', 'main', 1, 150, 0]],\n    2],\n   []),\n  ('normal control 8',\n   [[['R0', 'annex', 0, 90, 12], ['R1', 'main', 0, 121, 0], ['R2', 'main', 1, 60, 12]], 2], [])],\n [('regression: venue period pooling 1', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),\n  ('regression variant: venue period pooling 2',\n   [[['R0', 'annex', 1, 60, 12], ['R1', 'main', 1, 60, 0], ['R2', 'annex', 0, 90, 0],\n     ['R3', 'main', 1, 120, 30], ['R4', 'annex', 1, 180, 30], ['R5', 'main', 0, 150, 0]],\n    2],\n   [['annex', 1, 1, 1]]),\n  ('partial repair guard 3', [[['R0', 'main', 0, 121, 12]], 2], [['main', 0, 1, 1]]),\n  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),\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, 120, 0], ['R1', 'annex', 0, 121, 30], ['R2', 'annex', 0, 90, 30],\n     ['R3', 'main', 0, 60, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 1, 120, 30],\n     ['R6', 'annex', 0, 121, 12]],\n    3],\n   [['annex', 0, 2, 1], ['annex', 1, 1, 1]]),\n  ('normal control 7', [[['R0', 'annex', 1, 121, 0], ['R1', 'main', 0, 120, 12]], 2], []),\n  ('normal control 8',\n   [[['R0', 'annex', 0, 180, 12], ['R1', 'main', 0, 150, 12], ['R2', 'annex', 0, 60, 0],\n     ['R3', 'main', 1, 150, 12]],\n    3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]])],\n [('regression: venue period pooling 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: venue period pooling 2',\n   [[['R0', 'main', 0, 180, 12], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],\n     ['R3', 'main', 0, 180, 0], ['R4', 'annex', 1, 180, 30], ['R5', 'annex', 1, 120, 30],\n     ['R6', 'annex', 1, 180, 0], ['R7', 'main', 1, 150, 12]],\n    2],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('partial repair guard 3', [[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 180, 30]], 3],\n   [['main', 1, 1, 1]]),\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',\n   [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 60, 12], ['R2', 'main', 1, 180, 12],\n     ['R3', 'main', 0, 180, 12], ['R4', 'main', 1, 60, 12], ['R5', 'annex', 1, 180, 30]],\n    2],\n   [['annex', 1, 2, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'main', 1, 180, 30], ['R1', 'main', 0, 60, 0], ['R2', 'annex', 0, 60, 12],\n     ['R3', 'annex', 1, 120, 30], ['R4', 'annex', 0, 60, 0]],\n    2],\n   [['main', 1, 1, 1]]),\n  ('normal control 7', [[['R0', 'main', 1, 90, 12], ['R1', 'annex', 1, 120, 12]], 2], []),\n  ('normal control 8',\n   [[['R0', 'annex', 0, 120, 0], ['R1', 'annex', 0, 180, 12], ['R2', 'main', 0, 121, 12],\n     ['R3', 'annex', 0, 150, 12], ['R4', 'annex', 1, 60, 12], ['R5', 'annex', 0, 180, 30],\n     ['R6', 'main', 1, 60, 0]],\n    2],\n   [['annex', 0, 3, 2], ['main', 0, 1, 1]])],\n [('regression: venue period pooling 1',\n   [[['R0', 'main', 1, 150, 30], ['R1', 'annex', 0, 150, 30], ['R2', 'annex', 0, 90, 30],\n     ['R3', 'main', 0, 90, 30], ['R4', 'main', 0, 150, 0]],\n    3],\n   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),\n  ('regression variant: venue period pooling 2',\n   [[['R0', 'main', 1, 90, 30], ['R1', 'annex', 0, 90, 12], ['R2', 'main', 1, 121, 12]], 2],\n   [['main', 1, 1, 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, 120, 10]], 3], []),\n  ('normal control 5',\n   [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 121, 30], ['R2', 'annex', 0, 120, 0],\n     ['R3', 'main', 0, 150, 12], ['R4', 'annex', 1, 180, 0], ['R5', 'main', 0, 90, 30],\n     ['R6', 'annex', 1, 120, 0], ['R7', 'main', 0, 150, 0]],\n    2],\n   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),\n  ('normal control 6',\n   [[['R0', 'annex', 1, 60, 12], ['R1', 'annex', 0, 120, 0], ['R2', 'main', 0, 120, 0],\n     ['R3', 'annex', 0, 121, 30], ['R4', 'annex', 0, 121, 0], ['R5', 'main', 1, 90, 0],\n     ['R6', 'main', 0, 150, 0], ['R7', 'annex', 0, 90, 30]],\n    2],\n   [['annex', 0, 1, 1]]),\n  ('normal control 7', [[['R0', 'annex', 1, 150, 30], ['R1', 'annex', 0, 121, 30]], 3],\n   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),\n  ('normal control 8',\n   [[['R0', 'main', 0, 60, 12], ['R1', 'annex', 1, 60, 0], ['R2', 'annex', 1, 180, 0],\n     ['R3', 'main', 0, 121, 30], ['R4', 'main', 1, 150, 12], ['R5', 'annex', 0, 120, 30],\n     ['R6', 'main', 1, 150, 0], ['R7', 'annex', 0, 121, 12]],\n    3],\n   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 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-venue-period-pooling","generated_at":"2026-09-29T14:52:08.069026+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":"Groups are keyed by room rather than period.","sha256":"8b8067fce46e14395eff5c2d4a3ac1969ccf4407966903af1261399c3dfe0f70","title":"Relief cover calculated per room instead of pooled per period · 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.61,"exit_code":1,"observations":[{"actual":[["all",0,1,1]],"check":"regression: venue period pooling 1","expected":[["main",0,1,1]],"passed":false},{"actual":[["all",0,1,1],["all",1,2,1]],"check":"regression variant: venue period pooling 2","expected":[["annex",0,1,1],["annex",1,1,1],["main",1,1,1]],"passed":false},{"actual":[["all",0,2,1],["all",1,1,1]],"check":"partial repair guard 3","expected":[["annex",0,1,1],["main",0,1,1],["main",1,1,1]],"passed":false},{"actual":[["all",0,2,1]],"check":"boundary control 4","expected":[["annex",0,1,1],["main",0,1,1]],"passed":false},{"actual":[["all",0,1,1],["all",1,2,1]],"check":"normal control 5","expected":[["annex",1,1,1],["main",0,1,1],["main",1,1,1]],"passed":false},{"actual":[["all",0,2,1],["all",1,1,1]],"check":"normal control 6","expected":[["main",0,2,1],["main",1,1,1]],"passed":false},{"actual":[],"check":"normal control 7","expected":[],"passed":true},{"actual":[["all",0,1,1],["all",1,1,1]],"check":"normal control 8","expected":[["annex",1,1,1],["main",0,1,1]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: venue period pooling 1\", \"actual\": [[\"all\", 0, 1, 1]], \"expected\": [[\"main\", 0, 1, 1]], \"passed\": false}, {\"check\": \"regression variant: venue period pooling 2\", \"actual\": [[\"all\", 0, 1, 1], [\"all\", 1, 2, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"annex\", 1, 1, 1], [\"main\", 1, 1, 1]], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"all\", 0, 2, 1], [\"all\", 1, 1, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"main\", 0, 1, 1], [\"main\", 1, 1, 1]], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[\"all\", 0, 2, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"main\", 0, 1, 1]], \"passed\": false}, {\"check\": \"normal control 5\", \"actual\": [[\"all\", 0, 1, 1], [\"all\", 1, 2, 1]], \"expected\": [[\"annex\", 1, 1, 1], [\"main\", 0, 1, 1], [\"main\", 1, 1, 1]], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[\"all\", 0, 2, 1], [\"all\", 1, 1, 1]], \"expected\": [[\"main\", 0, 2, 1], [\"main\", 1, 1, 1]], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[\"all\", 0, 1, 1], [\"all\", 1, 1, 1]], \"expected\": [[\"annex\", 1, 1, 1], [\"main\", 0, 1, 1]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.548,"exit_code":1,"observations":[{"actual":[["main","R1",1,1]],"check":"regression: venue period pooling 1","expected":[["main",0,1,1]],"passed":false},{"actual":[["annex","R4",1,1],["annex","R5",1,1],["main","R1",1,1]],"check":"regression variant: venue period pooling 2","expected":[["annex",0,1,1],["annex",1,1,1],["main",1,1,1]],"passed":false},{"actual":[["annex","R0",1,1],["main","R1",1,1],["main","R3",1,1]],"check":"partial repair guard 3","expected":[["annex",0,1,1],["main",0,1,1],["main",1,1,1]],"passed":false},{"actual":[["annex","R2",1,1],["main","R1",1,1]],"check":"boundary control 4","expected":[["annex",0,1,1],["main",0,1,1]],"passed":false},{"actual":[["annex","R3",1,1],["main","R1",1,1],["main","R5",1,1]],"check":"normal control 5","expected":[["annex",1,1,1],["main",0,1,1],["main",1,1,1]],"passed":false},{"actual":[["main","R0",1,1],["main","R1",1,1],["main","R4",1,1]],"check":"normal control 6","expected":[["main",0,2,1],["main",1,1,1]],"passed":false},{"actual":[],"check":"normal control 7","expected":[],"passed":true},{"actual":[["annex","R1",1,1],["main","R0",1,1]],"check":"normal control 8","expected":[["annex",1,1,1],["main",0,1,1]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: venue period pooling 1\", \"actual\": [[\"main\", \"R1\", 1, 1]], \"expected\": [[\"main\", 0, 1, 1]], \"passed\": false}, {\"check\": \"regression variant: venue period pooling 2\", \"actual\": [[\"annex\", \"R4\", 1, 1], [\"annex\", \"R5\", 1, 1], [\"main\", \"R1\", 1, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"annex\", 1, 1, 1], [\"main\", 1, 1, 1]], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"annex\", \"R0\", 1, 1], [\"main\", \"R1\", 1, 1], [\"main\", \"R3\", 1, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"main\", 0, 1, 1], [\"main\", 1, 1, 1]], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[\"annex\", \"R2\", 1, 1], [\"main\", \"R1\", 1, 1]], \"expected\": [[\"annex\", 0, 1, 1], [\"main\", 0, 1, 1]], \"passed\": false}, {\"check\": \"normal control 5\", \"actual\": [[\"annex\", \"R3\", 1, 1], [\"main\", \"R1\", 1, 1], [\"main\", \"R5\", 1, 1]], \"expected\": [[\"annex\", 1, 1, 1], [\"main\", 0, 1, 1], [\"main\", 1, 1, 1]], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[\"main\", \"R0\", 1, 1], [\"main\", \"R1\", 1, 1], [\"main\", \"R4\", 1, 1]], \"expected\": [[\"main\", 0, 2, 1], [\"main\", 1, 1, 1]], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[\"annex\", \"R1\", 1, 1], [\"main\", \"R0\", 1, 1]], \"expected\": [[\"annex\", 1, 1, 1], [\"main\", 0, 1, 1]], \"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."}}