{"abstract":"Sittings separated by exactly the required rest are reported as conflicts.","category":"Exam timetabling constraints","checks":8,"contract":"A student's exams [id, start, duration] and an extra-time percentage. Extended duration = ceil(duration * (100 + pct) / 100), then rounded up to a multiple of 5 minutes. In start order (ties by id) a pair conflicts if the next start is earlier than the previous extended end plus the rest minutes. Return [[id, extended end] in order, conflicting pairs].","evaluation_group":"w2-exam-timetabling-constraints-extra-time-sitting-plan","failed_approach":"Dropping the rest term only catches overlaps.","family":"w2-exam-timetabling-constraints-extra-time-sitting-plan-rest-boundary","id":"FA-94446","implementations":{"attempt":{"sha256":"746bf8d8ae2bc8728020df7bb61196599edffd55ebdc72e8d5aafbad4b7b728b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(exams, pct, rest):\n    rows = []\n    for eid, st, dur in sorted(exams, key=lambda x: (x[1], x[0])):\n        ext = -(-dur * (100 + pct) // 100)\n        ext = -(-ext // 5) * 5\n        rows.append([eid, st, st + ext])\n    conf = []\n    for a, b in zip(rows, rows[1:]):\n        if b[1] < a[2]:\n            conf.append([a[0], b[0]])\n    return [[[r[0], r[2]] for r in rows], conf]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: rest boundary 1', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('regression variant: rest boundary 2',\n   [[['V0', 600, 60], ['S1', 840, 100], ['U3', 1320, 91], ['V2', 1080, 182]], 15, 30],\n   [[['V0', 670], ['S1', 955], ['V2', 1290], ['U3', 1425]], []]),\n  ('partial repair guard 3',\n   [[['W0', 540, 182], ['S2', 810, 182], ['U3', 1050, 100], ['W1', 660, 44]], 25, 15],\n   [[['W0', 770], ['W1', 715], ['S2', 1040], ['U3', 1175]], [['W0', 'W1'], ['S2', 'U3']]]),\n  ('boundary control 4', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('normal control 5', [[['S1', 800, 44], ['P0', 600, 180], ['R2', 920, 60]], 50, 30],\n   [[['P0', 870], ['S1', 870], ['R2', 1010]], [['P0', 'S1']]]),\n  ('normal control 6', [[['S2', 840, 180], ['S1', 690, 100], ['T0', 540, 120]], 25, 15],\n   [[['T0', 690], ['S1', 815], ['S2', 1065]], [['T0', 'S1']]]),\n  ('normal control 7', [[['W2', 960, 150], ['W0', 540, 150], ['R1', 780, 72]], 25, 30],\n   [[['W0', 730], ['R1', 870], ['W2', 1150]], []]),\n  ('normal control 8', [[['P1', 660, 120], ['U0', 540, 72]], 15, 30], [[['U0', 625], ['P1', 800]], []])],\n [('regression: rest boundary 1', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('regression variant: rest boundary 2',\n   [[['W3', 1110, 73], ['R1', 840, 150], ['U0', 600, 100], ['R2', 960, 100]], 33, 15],\n   [[['U0', 735], ['R1', 1040], ['R2', 1095], ['W3', 1210]], [['R1', 'R2']]]),\n  ('partial repair guard 3', [[['Q1', 800, 88], ['Q0', 600, 60], ['R2', 920, 182]], 10, 30],\n   [[['Q0', 670], ['Q1', 900], ['R2', 1125]], [['Q1', 'R2']]]),\n  ('boundary control 4', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('boundary control 5', [[['A', 540, 100], ['B', 699, 60]], 25, 30], [[['A', 665], ['B', 774]], []]),\n  ('normal control 6', [[['S1', 690, 88], ['Q2', 780, 150], ['T0', 540, 44]], 33, 30],\n   [[['T0', 600], ['S1', 810], ['Q2', 980]], [['S1', 'Q2']]]),\n  ('normal control 7', [[['R1', 630, 90], ['S0', 540, 182]], 33, 15],\n   [[['S0', 785], ['R1', 750]], [['S0', 'R1']]]),\n  ('normal control 8', [[['V0', 600, 182], ['R3', 990, 90], ['S2', 900, 88], ['W1', 780, 73]], 25, 30],\n   [[['V0', 830], ['W1', 875], ['S2', 1010], ['R3', 1105]], [['V0', 'W1'], ['W1', 'S2'], ['S2', 'R3']]])],\n [('regression: rest boundary 1',\n   [[['S2', 900, 73], ['P1', 780, 60], ['U3', 1050, 44], ['W0', 540, 72]], 50, 30],\n   [[['W0', 650], ['P1', 870], ['S2', 1010], ['U3', 1120]], []]),\n  ('regression variant: rest boundary 2', [[['A', 540, 120], ['B', 720, 90]], 50, 0],\n   [[['A', 720], ['B', 855]], []]),\n  ('partial repair guard 3', [[['Q1', 840, 120], ['S0', 600, 182]], 25, 15],\n   [[['S0', 830], ['Q1', 990]], [['S0', 'Q1']]]),\n  ('boundary control 4', [[['A', 540, 88]], 25, 30], [[['A', 650]], []]),\n  ('boundary control 5', [[['A', 540, 72]], 33, 15], [[['A', 640]], []]),\n  ('normal control 6', [[['P1', 720, 88], ['W2', 920, 90], ['P0', 540, 91]], 25, 15],\n   [[['P0', 655], ['P1', 830], ['W2', 1035]], []]),\n  ('normal control 7', [[['U2', 810, 180], ['W1', 630, 90], ['V3', 900, 180], ['S0', 540, 182]], 10, 15],\n   [[['S0', 745], ['W1', 730], ['U2', 1010], ['V3', 1100]], [['S0', 'W1'], ['U2', 'V3']]]),\n  ('normal control 8', [[['W0', 540, 60], ['W1', 780, 44]], 15, 15], [[['W0', 610], ['W1', 835]], []])],\n [('regression: rest boundary 1', [[['V1', 750, 150], ['W0', 600, 88]], 33, 30],\n   [[['W0', 720], ['V1', 950]], []]),\n  ('regression variant: rest boundary 2',\n   [[['P1', 720, 73], ['R0', 600, 91], ['P2', 960, 91], ['R3', 1050, 182]], 15, 15],\n   [[['R0', 705], ['P1', 805], ['P2', 1065], ['R3', 1260]], [['P2', 'R3']]]),\n  ('partial repair guard 3', [[['Q2', 870, 91], ['Q0', 600, 100], ['W1', 780, 72]], 25, 30],\n   [[['Q0', 725], ['W1', 870], ['Q2', 985]], [['W1', 'Q2']]]),\n  ('boundary control 4', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('boundary control 5', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('normal control 6', [[['T0', 600, 88], ['W3', 1070, 44], ['Q2', 980, 150], ['U1', 780, 120]], 15, 30],\n   [[['T0', 705], ['U1', 920], ['Q2', 1155], ['W3', 1125]], [['Q2', 'W3']]]),\n  ('normal control 7', [[['S3', 1080, 60], ['V1', 840, 120], ['R0', 600, 44], ['U2', 960, 90]], 15, 15],\n   [[['R0', 655], ['V1', 980], ['U2', 1065], ['S3', 1150]], [['V1', 'U2']]]),\n  ('normal control 8', [[['V1', 630, 180], ['Q0', 540, 44]], 10, 30], [[['Q0', 590], ['V1', 830]], []])],\n [('regression: rest boundary 1',\n   [[['Q2', 810, 88], ['Q1', 690, 150], ['T0', 540, 73], ['U3', 930, 88]], 15, 15],\n   [[['T0', 625], ['Q1', 865], ['Q2', 915], ['U3', 1035]], [['Q1', 'Q2']]]),\n  ('regression variant: rest boundary 2', [[['Q0', 540, 120], ['U1', 720, 60]], 25, 30],\n   [[['Q0', 690], ['U1', 795]], []]),\n  ('partial repair guard 3', [[['P2', 920, 180], ['Q0', 540, 150], ['S1', 740, 88]], 33, 30],\n   [[['Q0', 740], ['S1', 860], ['P2', 1160]], [['Q0', 'S1']]]),\n  ('boundary control 4', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('boundary control 5', [[['A', 540, 100], ['B', 699, 60]], 25, 30], [[['A', 665], ['B', 774]], []]),\n  ('normal control 6', [[['T1', 840, 72], ['V0', 600, 44]], 10, 15], [[['V0', 650], ['T1', 920]], []]),\n  ('normal control 7', [[['Q1', 690, 150], ['P2', 810, 180], ['Q0', 540, 180]], 10, 15],\n   [[['Q0', 740], ['Q1', 855], ['P2', 1010]], [['Q0', 'Q1'], ['Q1', 'P2']]]),\n  ('normal control 8', [[['S0', 540, 120], ['U2', 920, 44], ['Q3', 1070, 90], ['W1', 740, 91]], 25, 15],\n   [[['S0', 690], ['W1', 855], ['U2', 975], ['Q3', 1185]], []])]]\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":"6f84bfe770103bc54ebf29e229e739e5379bc647fca7bc1bb27f9a959bea1804","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(exams, pct, rest):\n    rows = []\n    for eid, st, dur in sorted(exams, key=lambda x: (x[1], x[0])):\n        ext = -(-dur * (100 + pct) // 100)\n        ext = -(-ext // 5) * 5\n        rows.append([eid, st, st + ext])\n    conf = []\n    for a, b in zip(rows, rows[1:]):\n        if b[1] <= a[2] + rest:\n            conf.append([a[0], b[0]])\n    return [[[r[0], r[2]] for r in rows], conf]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: rest boundary 1', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('regression variant: rest boundary 2',\n   [[['V0', 600, 60], ['S1', 840, 100], ['U3', 1320, 91], ['V2', 1080, 182]], 15, 30],\n   [[['V0', 670], ['S1', 955], ['V2', 1290], ['U3', 1425]], []]),\n  ('partial repair guard 3',\n   [[['W0', 540, 182], ['S2', 810, 182], ['U3', 1050, 100], ['W1', 660, 44]], 25, 15],\n   [[['W0', 770], ['W1', 715], ['S2', 1040], ['U3', 1175]], [['W0', 'W1'], ['S2', 'U3']]]),\n  ('boundary control 4', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('normal control 5', [[['S1', 800, 44], ['P0', 600, 180], ['R2', 920, 60]], 50, 30],\n   [[['P0', 870], ['S1', 870], ['R2', 1010]], [['P0', 'S1']]]),\n  ('normal control 6', [[['S2', 840, 180], ['S1', 690, 100], ['T0', 540, 120]], 25, 15],\n   [[['T0', 690], ['S1', 815], ['S2', 1065]], [['T0', 'S1']]]),\n  ('normal control 7', [[['W2', 960, 150], ['W0', 540, 150], ['R1', 780, 72]], 25, 30],\n   [[['W0', 730], ['R1', 870], ['W2', 1150]], []]),\n  ('normal control 8', [[['P1', 660, 120], ['U0', 540, 72]], 15, 30], [[['U0', 625], ['P1', 800]], []])],\n [('regression: rest boundary 1', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('regression variant: rest boundary 2',\n   [[['W3', 1110, 73], ['R1', 840, 150], ['U0', 600, 100], ['R2', 960, 100]], 33, 15],\n   [[['U0', 735], ['R1', 1040], ['R2', 1095], ['W3', 1210]], [['R1', 'R2']]]),\n  ('partial repair guard 3', [[['Q1', 800, 88], ['Q0', 600, 60], ['R2', 920, 182]], 10, 30],\n   [[['Q0', 670], ['Q1', 900], ['R2', 1125]], [['Q1', 'R2']]]),\n  ('boundary control 4', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('boundary control 5', [[['A', 540, 100], ['B', 699, 60]], 25, 30], [[['A', 665], ['B', 774]], []]),\n  ('normal control 6', [[['S1', 690, 88], ['Q2', 780, 150], ['T0', 540, 44]], 33, 30],\n   [[['T0', 600], ['S1', 810], ['Q2', 980]], [['S1', 'Q2']]]),\n  ('normal control 7', [[['R1', 630, 90], ['S0', 540, 182]], 33, 15],\n   [[['S0', 785], ['R1', 750]], [['S0', 'R1']]]),\n  ('normal control 8', [[['V0', 600, 182], ['R3', 990, 90], ['S2', 900, 88], ['W1', 780, 73]], 25, 30],\n   [[['V0', 830], ['W1', 875], ['S2', 1010], ['R3', 1105]], [['V0', 'W1'], ['W1', 'S2'], ['S2', 'R3']]])],\n [('regression: rest boundary 1',\n   [[['S2', 900, 73], ['P1', 780, 60], ['U3', 1050, 44], ['W0', 540, 72]], 50, 30],\n   [[['W0', 650], ['P1', 870], ['S2', 1010], ['U3', 1120]], []]),\n  ('regression variant: rest boundary 2', [[['A', 540, 120], ['B', 720, 90]], 50, 0],\n   [[['A', 720], ['B', 855]], []]),\n  ('partial repair guard 3', [[['Q1', 840, 120], ['S0', 600, 182]], 25, 15],\n   [[['S0', 830], ['Q1', 990]], [['S0', 'Q1']]]),\n  ('boundary control 4', [[['A', 540, 88]], 25, 30], [[['A', 650]], []]),\n  ('boundary control 5', [[['A', 540, 72]], 33, 15], [[['A', 640]], []]),\n  ('normal control 6', [[['P1', 720, 88], ['W2', 920, 90], ['P0', 540, 91]], 25, 15],\n   [[['P0', 655], ['P1', 830], ['W2', 1035]], []]),\n  ('normal control 7', [[['U2', 810, 180], ['W1', 630, 90], ['V3', 900, 180], ['S0', 540, 182]], 10, 15],\n   [[['S0', 745], ['W1', 730], ['U2', 1010], ['V3', 1100]], [['S0', 'W1'], ['U2', 'V3']]]),\n  ('normal control 8', [[['W0', 540, 60], ['W1', 780, 44]], 15, 15], [[['W0', 610], ['W1', 835]], []])],\n [('regression: rest boundary 1', [[['V1', 750, 150], ['W0', 600, 88]], 33, 30],\n   [[['W0', 720], ['V1', 950]], []]),\n  ('regression variant: rest boundary 2',\n   [[['P1', 720, 73], ['R0', 600, 91], ['P2', 960, 91], ['R3', 1050, 182]], 15, 15],\n   [[['R0', 705], ['P1', 805], ['P2', 1065], ['R3', 1260]], [['P2', 'R3']]]),\n  ('partial repair guard 3', [[['Q2', 870, 91], ['Q0', 600, 100], ['W1', 780, 72]], 25, 30],\n   [[['Q0', 725], ['W1', 870], ['Q2', 985]], [['W1', 'Q2']]]),\n  ('boundary control 4', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('boundary control 5', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('normal control 6', [[['T0', 600, 88], ['W3', 1070, 44], ['Q2', 980, 150], ['U1', 780, 120]], 15, 30],\n   [[['T0', 705], ['U1', 920], ['Q2', 1155], ['W3', 1125]], [['Q2', 'W3']]]),\n  ('normal control 7', [[['S3', 1080, 60], ['V1', 840, 120], ['R0', 600, 44], ['U2', 960, 90]], 15, 15],\n   [[['R0', 655], ['V1', 980], ['U2', 1065], ['S3', 1150]], [['V1', 'U2']]]),\n  ('normal control 8', [[['V1', 630, 180], ['Q0', 540, 44]], 10, 30], [[['Q0', 590], ['V1', 830]], []])],\n [('regression: rest boundary 1',\n   [[['Q2', 810, 88], ['Q1', 690, 150], ['T0', 540, 73], ['U3', 930, 88]], 15, 15],\n   [[['T0', 625], ['Q1', 865], ['Q2', 915], ['U3', 1035]], [['Q1', 'Q2']]]),\n  ('regression variant: rest boundary 2', [[['Q0', 540, 120], ['U1', 720, 60]], 25, 30],\n   [[['Q0', 690], ['U1', 795]], []]),\n  ('partial repair guard 3', [[['P2', 920, 180], ['Q0', 540, 150], ['S1', 740, 88]], 33, 30],\n   [[['Q0', 740], ['S1', 860], ['P2', 1160]], [['Q0', 'S1']]]),\n  ('boundary control 4', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('boundary control 5', [[['A', 540, 100], ['B', 699, 60]], 25, 30], [[['A', 665], ['B', 774]], []]),\n  ('normal control 6', [[['T1', 840, 72], ['V0', 600, 44]], 10, 15], [[['V0', 650], ['T1', 920]], []]),\n  ('normal control 7', [[['Q1', 690, 150], ['P2', 810, 180], ['Q0', 540, 180]], 10, 15],\n   [[['Q0', 740], ['Q1', 855], ['P2', 1010]], [['Q0', 'Q1'], ['Q1', 'P2']]]),\n  ('normal control 8', [[['S0', 540, 120], ['U2', 920, 44], ['Q3', 1070, 90], ['W1', 740, 91]], 25, 15],\n   [[['S0', 690], ['W1', 855], ['U2', 975], ['Q3', 1185]], []])]]\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"},"fixed":{"sha256":"b2a9c80f580c79bb53431bcf5080458cfc50b51cd83879648ceeaaecffd21a96","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(exams, pct, rest):\n    rows = []\n    for eid, st, dur in sorted(exams, key=lambda x: (x[1], x[0])):\n        ext = -(-dur * (100 + pct) // 100)\n        ext = -(-ext // 5) * 5\n        rows.append([eid, st, st + ext])\n    conf = []\n    for a, b in zip(rows, rows[1:]):\n        if b[1] < a[2] + rest:\n            conf.append([a[0], b[0]])\n    return [[[r[0], r[2]] for r in rows], conf]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: rest boundary 1', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('regression variant: rest boundary 2',\n   [[['V0', 600, 60], ['S1', 840, 100], ['U3', 1320, 91], ['V2', 1080, 182]], 15, 30],\n   [[['V0', 670], ['S1', 955], ['V2', 1290], ['U3', 1425]], []]),\n  ('partial repair guard 3',\n   [[['W0', 540, 182], ['S2', 810, 182], ['U3', 1050, 100], ['W1', 660, 44]], 25, 15],\n   [[['W0', 770], ['W1', 715], ['S2', 1040], ['U3', 1175]], [['W0', 'W1'], ['S2', 'U3']]]),\n  ('boundary control 4', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('normal control 5', [[['S1', 800, 44], ['P0', 600, 180], ['R2', 920, 60]], 50, 30],\n   [[['P0', 870], ['S1', 870], ['R2', 1010]], [['P0', 'S1']]]),\n  ('normal control 6', [[['S2', 840, 180], ['S1', 690, 100], ['T0', 540, 120]], 25, 15],\n   [[['T0', 690], ['S1', 815], ['S2', 1065]], [['T0', 'S1']]]),\n  ('normal control 7', [[['W2', 960, 150], ['W0', 540, 150], ['R1', 780, 72]], 25, 30],\n   [[['W0', 730], ['R1', 870], ['W2', 1150]], []]),\n  ('normal control 8', [[['P1', 660, 120], ['U0', 540, 72]], 15, 30], [[['U0', 625], ['P1', 800]], []])],\n [('regression: rest boundary 1', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('regression variant: rest boundary 2',\n   [[['W3', 1110, 73], ['R1', 840, 150], ['U0', 600, 100], ['R2', 960, 100]], 33, 15],\n   [[['U0', 735], ['R1', 1040], ['R2', 1095], ['W3', 1210]], [['R1', 'R2']]]),\n  ('partial repair guard 3', [[['Q1', 800, 88], ['Q0', 600, 60], ['R2', 920, 182]], 10, 30],\n   [[['Q0', 670], ['Q1', 900], ['R2', 1125]], [['Q1', 'R2']]]),\n  ('boundary control 4', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('boundary control 5', [[['A', 540, 100], ['B', 699, 60]], 25, 30], [[['A', 665], ['B', 774]], []]),\n  ('normal control 6', [[['S1', 690, 88], ['Q2', 780, 150], ['T0', 540, 44]], 33, 30],\n   [[['T0', 600], ['S1', 810], ['Q2', 980]], [['S1', 'Q2']]]),\n  ('normal control 7', [[['R1', 630, 90], ['S0', 540, 182]], 33, 15],\n   [[['S0', 785], ['R1', 750]], [['S0', 'R1']]]),\n  ('normal control 8', [[['V0', 600, 182], ['R3', 990, 90], ['S2', 900, 88], ['W1', 780, 73]], 25, 30],\n   [[['V0', 830], ['W1', 875], ['S2', 1010], ['R3', 1105]], [['V0', 'W1'], ['W1', 'S2'], ['S2', 'R3']]])],\n [('regression: rest boundary 1',\n   [[['S2', 900, 73], ['P1', 780, 60], ['U3', 1050, 44], ['W0', 540, 72]], 50, 30],\n   [[['W0', 650], ['P1', 870], ['S2', 1010], ['U3', 1120]], []]),\n  ('regression variant: rest boundary 2', [[['A', 540, 120], ['B', 720, 90]], 50, 0],\n   [[['A', 720], ['B', 855]], []]),\n  ('partial repair guard 3', [[['Q1', 840, 120], ['S0', 600, 182]], 25, 15],\n   [[['S0', 830], ['Q1', 990]], [['S0', 'Q1']]]),\n  ('boundary control 4', [[['A', 540, 88]], 25, 30], [[['A', 650]], []]),\n  ('boundary control 5', [[['A', 540, 72]], 33, 15], [[['A', 640]], []]),\n  ('normal control 6', [[['P1', 720, 88], ['W2', 920, 90], ['P0', 540, 91]], 25, 15],\n   [[['P0', 655], ['P1', 830], ['W2', 1035]], []]),\n  ('normal control 7', [[['U2', 810, 180], ['W1', 630, 90], ['V3', 900, 180], ['S0', 540, 182]], 10, 15],\n   [[['S0', 745], ['W1', 730], ['U2', 1010], ['V3', 1100]], [['S0', 'W1'], ['U2', 'V3']]]),\n  ('normal control 8', [[['W0', 540, 60], ['W1', 780, 44]], 15, 15], [[['W0', 610], ['W1', 835]], []])],\n [('regression: rest boundary 1', [[['V1', 750, 150], ['W0', 600, 88]], 33, 30],\n   [[['W0', 720], ['V1', 950]], []]),\n  ('regression variant: rest boundary 2',\n   [[['P1', 720, 73], ['R0', 600, 91], ['P2', 960, 91], ['R3', 1050, 182]], 15, 15],\n   [[['R0', 705], ['P1', 805], ['P2', 1065], ['R3', 1260]], [['P2', 'R3']]]),\n  ('partial repair guard 3', [[['Q2', 870, 91], ['Q0', 600, 100], ['W1', 780, 72]], 25, 30],\n   [[['Q0', 725], ['W1', 870], ['Q2', 985]], [['W1', 'Q2']]]),\n  ('boundary control 4', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('boundary control 5', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('normal control 6', [[['T0', 600, 88], ['W3', 1070, 44], ['Q2', 980, 150], ['U1', 780, 120]], 15, 30],\n   [[['T0', 705], ['U1', 920], ['Q2', 1155], ['W3', 1125]], [['Q2', 'W3']]]),\n  ('normal control 7', [[['S3', 1080, 60], ['V1', 840, 120], ['R0', 600, 44], ['U2', 960, 90]], 15, 15],\n   [[['R0', 655], ['V1', 980], ['U2', 1065], ['S3', 1150]], [['V1', 'U2']]]),\n  ('normal control 8', [[['V1', 630, 180], ['Q0', 540, 44]], 10, 30], [[['Q0', 590], ['V1', 830]], []])],\n [('regression: rest boundary 1',\n   [[['Q2', 810, 88], ['Q1', 690, 150], ['T0', 540, 73], ['U3', 930, 88]], 15, 15],\n   [[['T0', 625], ['Q1', 865], ['Q2', 915], ['U3', 1035]], [['Q1', 'Q2']]]),\n  ('regression variant: rest boundary 2', [[['Q0', 540, 120], ['U1', 720, 60]], 25, 30],\n   [[['Q0', 690], ['U1', 795]], []]),\n  ('partial repair guard 3', [[['P2', 920, 180], ['Q0', 540, 150], ['S1', 740, 88]], 33, 30],\n   [[['Q0', 740], ['S1', 860], ['P2', 1160]], [['Q0', 'S1']]]),\n  ('boundary control 4', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('boundary control 5', [[['A', 540, 100], ['B', 699, 60]], 25, 30], [[['A', 665], ['B', 774]], []]),\n  ('normal control 6', [[['T1', 840, 72], ['V0', 600, 44]], 10, 15], [[['V0', 650], ['T1', 920]], []]),\n  ('normal control 7', [[['Q1', 690, 150], ['P2', 810, 180], ['Q0', 540, 180]], 10, 15],\n   [[['Q0', 740], ['Q1', 855], ['P2', 1010]], [['Q0', 'Q1'], ['Q1', 'P2']]]),\n  ('normal control 8', [[['S0', 540, 120], ['U2', 920, 44], ['Q3', 1070, 90], ['W1', 740, 91]], 25, 15],\n   [[['S0', 690], ['W1', 855], ['U2', 975], ['Q3', 1185]], []])]]\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-extra-time-sitting-plan-rest-boundary","generated_at":"2026-09-29T14:52:04.540070+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Access arrangements extend sittings; the timetable must still leave rest between a student's exams.","repair":"Conflict only when the next start is before the extended end plus rest.","root_cause":"The conflict test is inclusive.","sha256":"87555c7e9628c28ce851e5e9d3280436397a7ea88ee86b02a99be08b856fbe08","title":"Exact rest gap flagged as a conflict · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.31,"exit_code":1,"observations":[{"actual":[[["A",720],["B",855]],[]],"check":"regression: rest boundary 1","expected":[[["A",720],["B",855]],[]],"passed":true},{"actual":[[["V0",670],["S1",955],["V2",1290],["U3",1425]],[]],"check":"regression variant: rest boundary 2","expected":[[["V0",670],["S1",955],["V2",1290],["U3",1425]],[]],"passed":true},{"actual":[[["W0",770],["W1",715],["S2",1040],["U3",1175]],[["W0","W1"]]],"check":"partial repair guard 3","expected":[[["W0",770],["W1",715],["S2",1040],["U3",1175]],[["W0","W1"],["S2","U3"]]],"passed":false},{"actual":[[["A",625],["B",710]],[]],"check":"boundary control 4","expected":[[["A",625],["B",710]],[]],"passed":true},{"actual":[[["P0",870],["S1",870],["R2",1010]],[["P0","S1"]]],"check":"normal control 5","expected":[[["P0",870],["S1",870],["R2",1010]],[["P0","S1"]]],"passed":true},{"actual":[[["T0",690],["S1",815],["S2",1065]],[]],"check":"normal control 6","expected":[[["T0",690],["S1",815],["S2",1065]],[["T0","S1"]]],"passed":false},{"actual":[[["W0",730],["R1",870],["W2",1150]],[]],"check":"normal control 7","expected":[[["W0",730],["R1",870],["W2",1150]],[]],"passed":true},{"actual":[[["U0",625],["P1",800]],[]],"check":"normal control 8","expected":[[["U0",625],["P1",800]],[]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: rest boundary 1\", \"actual\": [[[\"A\", 720], [\"B\", 855]], []], \"expected\": [[[\"A\", 720], [\"B\", 855]], []], \"passed\": true}, {\"check\": \"regression variant: rest boundary 2\", \"actual\": [[[\"V0\", 670], [\"S1\", 955], [\"V2\", 1290], [\"U3\", 1425]], []], \"expected\": [[[\"V0\", 670], [\"S1\", 955], [\"V2\", 1290], [\"U3\", 1425]], []], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [[[\"W0\", 770], [\"W1\", 715], [\"S2\", 1040], [\"U3\", 1175]], [[\"W0\", \"W1\"]]], \"expected\": [[[\"W0\", 770], [\"W1\", 715], [\"S2\", 1040], [\"U3\", 1175]], [[\"W0\", \"W1\"], [\"S2\", \"U3\"]]], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[[\"A\", 625], [\"B\", 710]], []], \"expected\": [[[\"A\", 625], [\"B\", 710]], []], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [[[\"P0\", 870], [\"S1\", 870], [\"R2\", 1010]], [[\"P0\", \"S1\"]]], \"expected\": [[[\"P0\", 870], [\"S1\", 870], [\"R2\", 1010]], [[\"P0\", \"S1\"]]], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[[\"T0\", 690], [\"S1\", 815], [\"S2\", 1065]], []], \"expected\": [[[\"T0\", 690], [\"S1\", 815], [\"S2\", 1065]], [[\"T0\", \"S1\"]]], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [[[\"W0\", 730], [\"R1\", 870], [\"W2\", 1150]], []], \"expected\": [[[\"W0\", 730], [\"R1\", 870], [\"W2\", 1150]], []], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[[\"U0\", 625], [\"P1\", 800]], []], \"expected\": [[[\"U0\", 625], [\"P1\", 800]], []], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.822,"exit_code":1,"observations":[{"actual":[[["A",720],["B",855]],[["A","B"]]],"check":"regression: rest boundary 1","expected":[[["A",720],["B",855]],[]],"passed":false},{"actual":[[["V0",670],["S1",955],["V2",1290],["U3",1425]],[["V2","U3"]]],"check":"regression variant: rest boundary 2","expected":[[["V0",670],["S1",955],["V2",1290],["U3",1425]],[]],"passed":false},{"actual":[[["W0",770],["W1",715],["S2",1040],["U3",1175]],[["W0","W1"],["S2","U3"]]],"check":"partial repair guard 3","expected":[[["W0",770],["W1",715],["S2",1040],["U3",1175]],[["W0","W1"],["S2","U3"]]],"passed":true},{"actual":[[["A",625],["B",710]],[["A","B"]]],"check":"boundary control 4","expected":[[["A",625],["B",710]],[]],"passed":false},{"actual":[[["P0",870],["S1",870],["R2",1010]],[["P0","S1"]]],"check":"normal control 5","expected":[[["P0",870],["S1",870],["R2",1010]],[["P0","S1"]]],"passed":true},{"actual":[[["T0",690],["S1",815],["S2",1065]],[["T0","S1"]]],"check":"normal control 6","expected":[[["T0",690],["S1",815],["S2",1065]],[["T0","S1"]]],"passed":true},{"actual":[[["W0",730],["R1",870],["W2",1150]],[]],"check":"normal control 7","expected":[[["W0",730],["R1",870],["W2",1150]],[]],"passed":true},{"actual":[[["U0",625],["P1",800]],[]],"check":"normal control 8","expected":[[["U0",625],["P1",800]],[]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: rest boundary 1\", \"actual\": [[[\"A\", 720], [\"B\", 855]], [[\"A\", \"B\"]]], \"expected\": [[[\"A\", 720], [\"B\", 855]], []], \"passed\": false}, {\"check\": \"regression variant: rest boundary 2\", \"actual\": [[[\"V0\", 670], [\"S1\", 955], [\"V2\", 1290], [\"U3\", 1425]], [[\"V2\", \"U3\"]]], \"expected\": [[[\"V0\", 670], [\"S1\", 955], [\"V2\", 1290], [\"U3\", 1425]], []], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[[\"W0\", 770], [\"W1\", 715], [\"S2\", 1040], [\"U3\", 1175]], [[\"W0\", \"W1\"], [\"S2\", \"U3\"]]], \"expected\": [[[\"W0\", 770], [\"W1\", 715], [\"S2\", 1040], [\"U3\", 1175]], [[\"W0\", \"W1\"], [\"S2\", \"U3\"]]], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [[[\"A\", 625], [\"B\", 710]], [[\"A\", \"B\"]]], \"expected\": [[[\"A\", 625], [\"B\", 710]], []], \"passed\": false}, {\"check\": \"normal control 5\", \"actual\": [[[\"P0\", 870], [\"S1\", 870], [\"R2\", 1010]], [[\"P0\", \"S1\"]]], \"expected\": [[[\"P0\", 870], [\"S1\", 870], [\"R2\", 1010]], [[\"P0\", \"S1\"]]], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[[\"T0\", 690], [\"S1\", 815], [\"S2\", 1065]], [[\"T0\", \"S1\"]]], \"expected\": [[[\"T0\", 690], [\"S1\", 815], [\"S2\", 1065]], [[\"T0\", \"S1\"]]], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[[\"W0\", 730], [\"R1\", 870], [\"W2\", 1150]], []], \"expected\": [[[\"W0\", 730], [\"R1\", 870], [\"W2\", 1150]], []], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[[\"U0\", 625], [\"P1\", 800]], []], \"expected\": [[[\"U0\", 625], [\"P1\", 800]], []], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.108,"exit_code":0,"observations":[{"actual":[[["A",720],["B",855]],[]],"check":"regression: rest boundary 1","expected":[[["A",720],["B",855]],[]],"passed":true},{"actual":[[["V0",670],["S1",955],["V2",1290],["U3",1425]],[]],"check":"regression variant: rest boundary 2","expected":[[["V0",670],["S1",955],["V2",1290],["U3",1425]],[]],"passed":true},{"actual":[[["W0",770],["W1",715],["S2",1040],["U3",1175]],[["W0","W1"],["S2","U3"]]],"check":"partial repair guard 3","expected":[[["W0",770],["W1",715],["S2",1040],["U3",1175]],[["W0","W1"],["S2","U3"]]],"passed":true},{"actual":[[["A",625],["B",710]],[]],"check":"boundary control 4","expected":[[["A",625],["B",710]],[]],"passed":true},{"actual":[[["P0",870],["S1",870],["R2",1010]],[["P0","S1"]]],"check":"normal control 5","expected":[[["P0",870],["S1",870],["R2",1010]],[["P0","S1"]]],"passed":true},{"actual":[[["T0",690],["S1",815],["S2",1065]],[["T0","S1"]]],"check":"normal control 6","expected":[[["T0",690],["S1",815],["S2",1065]],[["T0","S1"]]],"passed":true},{"actual":[[["W0",730],["R1",870],["W2",1150]],[]],"check":"normal control 7","expected":[[["W0",730],["R1",870],["W2",1150]],[]],"passed":true},{"actual":[[["U0",625],["P1",800]],[]],"check":"normal control 8","expected":[[["U0",625],["P1",800]],[]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: rest boundary 1\", \"actual\": [[[\"A\", 720], [\"B\", 855]], []], \"expected\": [[[\"A\", 720], [\"B\", 855]], []], \"passed\": true}, {\"check\": \"regression variant: rest boundary 2\", \"actual\": [[[\"V0\", 670], [\"S1\", 955], [\"V2\", 1290], [\"U3\", 1425]], []], \"expected\": [[[\"V0\", 670], [\"S1\", 955], [\"V2\", 1290], [\"U3\", 1425]], []], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [[[\"W0\", 770], [\"W1\", 715], [\"S2\", 1040], [\"U3\", 1175]], [[\"W0\", \"W1\"], [\"S2\", \"U3\"]]], \"expected\": [[[\"W0\", 770], [\"W1\", 715], [\"S2\", 1040], [\"U3\", 1175]], [[\"W0\", \"W1\"], [\"S2\", \"U3\"]]], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [[[\"A\", 625], [\"B\", 710]], []], \"expected\": [[[\"A\", 625], [\"B\", 710]], []], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [[[\"P0\", 870], [\"S1\", 870], [\"R2\", 1010]], [[\"P0\", \"S1\"]]], \"expected\": [[[\"P0\", 870], [\"S1\", 870], [\"R2\", 1010]], [[\"P0\", \"S1\"]]], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[[\"T0\", 690], [\"S1\", 815], [\"S2\", 1065]], [[\"T0\", \"S1\"]]], \"expected\": [[[\"T0\", 690], [\"S1\", 815], [\"S2\", 1065]], [[\"T0\", \"S1\"]]], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[[\"W0\", 730], [\"R1\", 870], [\"W2\", 1150]], []], \"expected\": [[[\"W0\", 730], [\"R1\", 870], [\"W2\", 1150]], []], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[[\"U0\", 625], [\"P1\", 800]], []], \"expected\": [[[\"U0\", 625], [\"P1\", 800]], []], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}