{"abstract":"Some extended sittings end five minutes early.","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":"Rounding to nearest still drops fractions below one half.","family":"w2-exam-timetabling-constraints-extra-time-sitting-plan-extension-ceiling","id":"FA-94436","implementations":{"attempt":{"sha256":"c471b40d4401f75fae2c40119bcbb38ad1fbb5ce72b887103f388d0124d97f12","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 = round(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: extension ceiling 1', [[['A', 540, 72]], 33, 15], [[['A', 640]], []]),\n  ('regression variant: extension ceiling 2', [[['T1', 800, 91], ['W0', 600, 120]], 10, 30],\n   [[['W0', 735], ['T1', 905]], []]),\n  ('boundary control 3', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('boundary control 4', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('normal control 5', [[['Q1', 750, 182], ['U2', 870, 72], ['P0', 600, 72]], 10, 30],\n   [[['P0', 680], ['Q1', 955], ['U2', 950]], [['Q1', 'U2']]]),\n  ('normal control 6', [[['R0', 540, 100], ['S1', 720, 60]], 50, 15], [[['R0', 690], ['S1', 810]], []]),\n  ('normal control 7', [[['S1', 630, 100], ['V3', 930, 88], ['V0', 540, 180], ['R2', 750, 73]], 50, 30],\n   [[['V0', 810], ['S1', 780], ['R2', 860], ['V3', 1065]], [['V0', 'S1'], ['S1', 'R2']]]),\n  ('normal control 8', [[['P1', 740, 100], ['P2', 830, 100], ['S0', 540, 182], ['R3', 920, 182]], 50, 15],\n   [[['S0', 815], ['P1', 890], ['P2', 980], ['R3', 1195]], [['S0', 'P1'], ['P1', 'P2'], ['P2', 'R3']]])],\n [('regression: extension ceiling 1', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('regression variant: extension ceiling 2',\n   [[['P1', 780, 90], ['P3', 1130, 72], ['P0', 540, 91], ['U2', 930, 182]], 33, 15],\n   [[['P0', 665], ['P1', 900], ['U2', 1175], ['P3', 1230]], [['U2', 'P3']]]),\n  ('partial repair guard 3',\n   [[['Q0', 600, 73], ['S1', 800, 182], ['U3', 1240, 44], ['S2', 1000, 72]], 10, 30],\n   [[['Q0', 685], ['S1', 1005], ['S2', 1080], ['U3', 1290]], [['S1', 'S2']]]),\n  ('boundary control 4', [[['A', 540, 100], ['B', 699, 60]], 25, 30], [[['A', 665], ['B', 774]], []]),\n  ('normal control 5', [[['P2', 720, 60], ['R0', 540, 120], ['V1', 630, 120], ['T3', 900, 60]], 25, 30],\n   [[['R0', 690], ['V1', 780], ['P2', 795], ['T3', 975]], [['R0', 'V1'], ['V1', 'P2']]]),\n  ('normal control 6', [[['P1', 740, 120], ['P0', 540, 44], ['W2', 940, 72]], 15, 30],\n   [[['P0', 595], ['P1', 880], ['W2', 1025]], []]),\n  ('normal control 7', [[['S0', 540, 73], ['Q2', 920, 60], ['U1', 740, 100]], 15, 15],\n   [[['S0', 625], ['U1', 855], ['Q2', 990]], []]),\n  ('normal control 8', [[['T1', 780, 60], ['P0', 600, 182], ['Q2', 1020, 91]], 50, 15],\n   [[['P0', 875], ['T1', 870], ['Q2', 1160]], [['P0', 'T1']]])],\n [('regression: extension ceiling 1', [[['A', 540, 182], ['B', 800, 60]], 10, 30],\n   [[['A', 745], ['B', 870]], []]),\n  ('regression variant: extension ceiling 2',\n   [[['V0', 540, 44], ['W1', 690, 60], ['U3', 980, 60], ['W2', 890, 100]], 15, 30],\n   [[['V0', 595], ['W1', 760], ['W2', 1005], ['U3', 1050]], [['W2', 'U3']]]),\n  ('partial repair guard 3', [[['P3', 1160, 44], ['U0', 600, 44], ['W2', 960, 90], ['U1', 780, 73]], 10, 30],\n   [[['U0', 650], ['U1', 865], ['W2', 1060], ['P3', 1210]], []]),\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', [[['S1', 740, 180], ['V0', 540, 72]], 50, 30], [[['V0', 650], ['S1', 1010]], []]),\n  ('normal control 7', [[['P3', 960, 73], ['U2', 810, 88], ['T0', 540, 60], ['R1', 630, 91]], 33, 15],\n   [[['T0', 620], ['R1', 755], ['U2', 930], ['P3', 1060]], [['T0', 'R1']]]),\n  ('normal control 8', [[['R0', 540, 73], ['T1', 630, 150], ['R2', 810, 150], ['T3', 1050, 120]], 10, 15],\n   [[['R0', 625], ['T1', 795], ['R2', 975], ['T3', 1185]], [['R0', 'T1']]])],\n [('regression: extension ceiling 1', [[['A', 540, 73], ['B', 640, 60]], 10, 15],\n   [[['A', 625], ['B', 710]], []]),\n  ('regression variant: extension ceiling 2', [[['P1', 720, 60], ['U0', 600, 150], ['U2', 960, 72]], 33, 15],\n   [[['U0', 800], ['P1', 800], ['U2', 1060]], [['U0', 'P1']]]),\n  ('partial repair guard 3', [[['S1', 780, 73], ['T0', 540, 72]], 10, 30], [[['T0', 620], ['S1', 865]], []]),\n  ('boundary control 4', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('normal control 5', [[['V1', 800, 60], ['Q0', 600, 150]], 25, 15],\n   [[['Q0', 790], ['V1', 875]], [['Q0', 'V1']]]),\n  ('normal control 6', [[['Q1', 750, 44], ['W0', 600, 72]], 10, 30], [[['W0', 680], ['Q1', 800]], []]),\n  ('normal control 7', [[['S0', 540, 100], ['Q3', 1020, 90], ['U1', 720, 91], ['U2', 840, 60]], 10, 30],\n   [[['S0', 650], ['U1', 825], ['U2', 910], ['Q3', 1120]], [['U1', 'U2']]]),\n  ('normal control 8', [[['U2', 840, 44], ['W3', 1080, 150], ['V1', 660, 180], ['V0', 540, 91]], 33, 30],\n   [[['V0', 665], ['V1', 900], ['U2', 900], ['W3', 1280]], [['V0', 'V1'], ['V1', 'U2']]])],\n [('regression: extension ceiling 1', [[['Q0', 600, 182], ['U1', 750, 120]], 10, 15],\n   [[['Q0', 805], ['U1', 885]], [['Q0', 'U1']]]),\n  ('regression variant: extension ceiling 2',\n   [[['R0', 540, 60], ['V1', 660, 72], ['S2', 810, 73], ['V3', 1010, 72]], 33, 30],\n   [[['R0', 620], ['V1', 760], ['S2', 910], ['V3', 1110]], []]),\n  ('partial repair guard 3', [[['V2', 900, 90], ['W0', 600, 91], ['P1', 780, 88], ['Q3', 1050, 91]], 10, 30],\n   [[['W0', 705], ['P1', 880], ['V2', 1000], ['Q3', 1155]], [['P1', 'V2']]]),\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', [[['S0', 540, 91], ['T1', 630, 60], ['U2', 780, 91]], 33, 30],\n   [[['S0', 665], ['T1', 710], ['U2', 905]], [['S0', 'T1']]]),\n  ('normal control 7', [[['W1', 780, 60], ['S0', 600, 72]], 15, 15], [[['S0', 685], ['W1', 850]], []]),\n  ('normal control 8', [[['R2', 830, 91], ['P0', 540, 90], ['U1', 630, 73]], 10, 15],\n   [[['P0', 640], ['U1', 715], ['R2', 935]], [['P0', 'U1']]])]]\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":"7c5306761b2be093589c57f2a0ee38d7ca29057032f8bf70d51641a06010ec29","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: extension ceiling 1', [[['A', 540, 72]], 33, 15], [[['A', 640]], []]),\n  ('regression variant: extension ceiling 2', [[['T1', 800, 91], ['W0', 600, 120]], 10, 30],\n   [[['W0', 735], ['T1', 905]], []]),\n  ('boundary control 3', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('boundary control 4', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('normal control 5', [[['Q1', 750, 182], ['U2', 870, 72], ['P0', 600, 72]], 10, 30],\n   [[['P0', 680], ['Q1', 955], ['U2', 950]], [['Q1', 'U2']]]),\n  ('normal control 6', [[['R0', 540, 100], ['S1', 720, 60]], 50, 15], [[['R0', 690], ['S1', 810]], []]),\n  ('normal control 7', [[['S1', 630, 100], ['V3', 930, 88], ['V0', 540, 180], ['R2', 750, 73]], 50, 30],\n   [[['V0', 810], ['S1', 780], ['R2', 860], ['V3', 1065]], [['V0', 'S1'], ['S1', 'R2']]]),\n  ('normal control 8', [[['P1', 740, 100], ['P2', 830, 100], ['S0', 540, 182], ['R3', 920, 182]], 50, 15],\n   [[['S0', 815], ['P1', 890], ['P2', 980], ['R3', 1195]], [['S0', 'P1'], ['P1', 'P2'], ['P2', 'R3']]])],\n [('regression: extension ceiling 1', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('regression variant: extension ceiling 2',\n   [[['P1', 780, 90], ['P3', 1130, 72], ['P0', 540, 91], ['U2', 930, 182]], 33, 15],\n   [[['P0', 665], ['P1', 900], ['U2', 1175], ['P3', 1230]], [['U2', 'P3']]]),\n  ('partial repair guard 3',\n   [[['Q0', 600, 73], ['S1', 800, 182], ['U3', 1240, 44], ['S2', 1000, 72]], 10, 30],\n   [[['Q0', 685], ['S1', 1005], ['S2', 1080], ['U3', 1290]], [['S1', 'S2']]]),\n  ('boundary control 4', [[['A', 540, 100], ['B', 699, 60]], 25, 30], [[['A', 665], ['B', 774]], []]),\n  ('normal control 5', [[['P2', 720, 60], ['R0', 540, 120], ['V1', 630, 120], ['T3', 900, 60]], 25, 30],\n   [[['R0', 690], ['V1', 780], ['P2', 795], ['T3', 975]], [['R0', 'V1'], ['V1', 'P2']]]),\n  ('normal control 6', [[['P1', 740, 120], ['P0', 540, 44], ['W2', 940, 72]], 15, 30],\n   [[['P0', 595], ['P1', 880], ['W2', 1025]], []]),\n  ('normal control 7', [[['S0', 540, 73], ['Q2', 920, 60], ['U1', 740, 100]], 15, 15],\n   [[['S0', 625], ['U1', 855], ['Q2', 990]], []]),\n  ('normal control 8', [[['T1', 780, 60], ['P0', 600, 182], ['Q2', 1020, 91]], 50, 15],\n   [[['P0', 875], ['T1', 870], ['Q2', 1160]], [['P0', 'T1']]])],\n [('regression: extension ceiling 1', [[['A', 540, 182], ['B', 800, 60]], 10, 30],\n   [[['A', 745], ['B', 870]], []]),\n  ('regression variant: extension ceiling 2',\n   [[['V0', 540, 44], ['W1', 690, 60], ['U3', 980, 60], ['W2', 890, 100]], 15, 30],\n   [[['V0', 595], ['W1', 760], ['W2', 1005], ['U3', 1050]], [['W2', 'U3']]]),\n  ('partial repair guard 3', [[['P3', 1160, 44], ['U0', 600, 44], ['W2', 960, 90], ['U1', 780, 73]], 10, 30],\n   [[['U0', 650], ['U1', 865], ['W2', 1060], ['P3', 1210]], []]),\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', [[['S1', 740, 180], ['V0', 540, 72]], 50, 30], [[['V0', 650], ['S1', 1010]], []]),\n  ('normal control 7', [[['P3', 960, 73], ['U2', 810, 88], ['T0', 540, 60], ['R1', 630, 91]], 33, 15],\n   [[['T0', 620], ['R1', 755], ['U2', 930], ['P3', 1060]], [['T0', 'R1']]]),\n  ('normal control 8', [[['R0', 540, 73], ['T1', 630, 150], ['R2', 810, 150], ['T3', 1050, 120]], 10, 15],\n   [[['R0', 625], ['T1', 795], ['R2', 975], ['T3', 1185]], [['R0', 'T1']]])],\n [('regression: extension ceiling 1', [[['A', 540, 73], ['B', 640, 60]], 10, 15],\n   [[['A', 625], ['B', 710]], []]),\n  ('regression variant: extension ceiling 2', [[['P1', 720, 60], ['U0', 600, 150], ['U2', 960, 72]], 33, 15],\n   [[['U0', 800], ['P1', 800], ['U2', 1060]], [['U0', 'P1']]]),\n  ('partial repair guard 3', [[['S1', 780, 73], ['T0', 540, 72]], 10, 30], [[['T0', 620], ['S1', 865]], []]),\n  ('boundary control 4', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('normal control 5', [[['V1', 800, 60], ['Q0', 600, 150]], 25, 15],\n   [[['Q0', 790], ['V1', 875]], [['Q0', 'V1']]]),\n  ('normal control 6', [[['Q1', 750, 44], ['W0', 600, 72]], 10, 30], [[['W0', 680], ['Q1', 800]], []]),\n  ('normal control 7', [[['S0', 540, 100], ['Q3', 1020, 90], ['U1', 720, 91], ['U2', 840, 60]], 10, 30],\n   [[['S0', 650], ['U1', 825], ['U2', 910], ['Q3', 1120]], [['U1', 'U2']]]),\n  ('normal control 8', [[['U2', 840, 44], ['W3', 1080, 150], ['V1', 660, 180], ['V0', 540, 91]], 33, 30],\n   [[['V0', 665], ['V1', 900], ['U2', 900], ['W3', 1280]], [['V0', 'V1'], ['V1', 'U2']]])],\n [('regression: extension ceiling 1', [[['Q0', 600, 182], ['U1', 750, 120]], 10, 15],\n   [[['Q0', 805], ['U1', 885]], [['Q0', 'U1']]]),\n  ('regression variant: extension ceiling 2',\n   [[['R0', 540, 60], ['V1', 660, 72], ['S2', 810, 73], ['V3', 1010, 72]], 33, 30],\n   [[['R0', 620], ['V1', 760], ['S2', 910], ['V3', 1110]], []]),\n  ('partial repair guard 3', [[['V2', 900, 90], ['W0', 600, 91], ['P1', 780, 88], ['Q3', 1050, 91]], 10, 30],\n   [[['W0', 705], ['P1', 880], ['V2', 1000], ['Q3', 1155]], [['P1', 'V2']]]),\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', [[['S0', 540, 91], ['T1', 630, 60], ['U2', 780, 91]], 33, 30],\n   [[['S0', 665], ['T1', 710], ['U2', 905]], [['S0', 'T1']]]),\n  ('normal control 7', [[['W1', 780, 60], ['S0', 600, 72]], 15, 15], [[['S0', 685], ['W1', 850]], []]),\n  ('normal control 8', [[['R2', 830, 91], ['P0', 540, 90], ['U1', 630, 73]], 10, 15],\n   [[['P0', 640], ['U1', 715], ['R2', 935]], [['P0', 'U1']]])]]\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":"010ef9c5c768c5d67c598f75fd3ac9b05b2a339027507afae9c08d1d81faae5d","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: extension ceiling 1', [[['A', 540, 72]], 33, 15], [[['A', 640]], []]),\n  ('regression variant: extension ceiling 2', [[['T1', 800, 91], ['W0', 600, 120]], 10, 30],\n   [[['W0', 735], ['T1', 905]], []]),\n  ('boundary control 3', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('boundary control 4', [[['A', 540, 73], ['B', 640, 60]], 10, 15], [[['A', 625], ['B', 710]], []]),\n  ('normal control 5', [[['Q1', 750, 182], ['U2', 870, 72], ['P0', 600, 72]], 10, 30],\n   [[['P0', 680], ['Q1', 955], ['U2', 950]], [['Q1', 'U2']]]),\n  ('normal control 6', [[['R0', 540, 100], ['S1', 720, 60]], 50, 15], [[['R0', 690], ['S1', 810]], []]),\n  ('normal control 7', [[['S1', 630, 100], ['V3', 930, 88], ['V0', 540, 180], ['R2', 750, 73]], 50, 30],\n   [[['V0', 810], ['S1', 780], ['R2', 860], ['V3', 1065]], [['V0', 'S1'], ['S1', 'R2']]]),\n  ('normal control 8', [[['P1', 740, 100], ['P2', 830, 100], ['S0', 540, 182], ['R3', 920, 182]], 50, 15],\n   [[['S0', 815], ['P1', 890], ['P2', 980], ['R3', 1195]], [['S0', 'P1'], ['P1', 'P2'], ['P2', 'R3']]])],\n [('regression: extension ceiling 1', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('regression variant: extension ceiling 2',\n   [[['P1', 780, 90], ['P3', 1130, 72], ['P0', 540, 91], ['U2', 930, 182]], 33, 15],\n   [[['P0', 665], ['P1', 900], ['U2', 1175], ['P3', 1230]], [['U2', 'P3']]]),\n  ('partial repair guard 3',\n   [[['Q0', 600, 73], ['S1', 800, 182], ['U3', 1240, 44], ['S2', 1000, 72]], 10, 30],\n   [[['Q0', 685], ['S1', 1005], ['S2', 1080], ['U3', 1290]], [['S1', 'S2']]]),\n  ('boundary control 4', [[['A', 540, 100], ['B', 699, 60]], 25, 30], [[['A', 665], ['B', 774]], []]),\n  ('normal control 5', [[['P2', 720, 60], ['R0', 540, 120], ['V1', 630, 120], ['T3', 900, 60]], 25, 30],\n   [[['R0', 690], ['V1', 780], ['P2', 795], ['T3', 975]], [['R0', 'V1'], ['V1', 'P2']]]),\n  ('normal control 6', [[['P1', 740, 120], ['P0', 540, 44], ['W2', 940, 72]], 15, 30],\n   [[['P0', 595], ['P1', 880], ['W2', 1025]], []]),\n  ('normal control 7', [[['S0', 540, 73], ['Q2', 920, 60], ['U1', 740, 100]], 15, 15],\n   [[['S0', 625], ['U1', 855], ['Q2', 990]], []]),\n  ('normal control 8', [[['T1', 780, 60], ['P0', 600, 182], ['Q2', 1020, 91]], 50, 15],\n   [[['P0', 875], ['T1', 870], ['Q2', 1160]], [['P0', 'T1']]])],\n [('regression: extension ceiling 1', [[['A', 540, 182], ['B', 800, 60]], 10, 30],\n   [[['A', 745], ['B', 870]], []]),\n  ('regression variant: extension ceiling 2',\n   [[['V0', 540, 44], ['W1', 690, 60], ['U3', 980, 60], ['W2', 890, 100]], 15, 30],\n   [[['V0', 595], ['W1', 760], ['W2', 1005], ['U3', 1050]], [['W2', 'U3']]]),\n  ('partial repair guard 3', [[['P3', 1160, 44], ['U0', 600, 44], ['W2', 960, 90], ['U1', 780, 73]], 10, 30],\n   [[['U0', 650], ['U1', 865], ['W2', 1060], ['P3', 1210]], []]),\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', [[['S1', 740, 180], ['V0', 540, 72]], 50, 30], [[['V0', 650], ['S1', 1010]], []]),\n  ('normal control 7', [[['P3', 960, 73], ['U2', 810, 88], ['T0', 540, 60], ['R1', 630, 91]], 33, 15],\n   [[['T0', 620], ['R1', 755], ['U2', 930], ['P3', 1060]], [['T0', 'R1']]]),\n  ('normal control 8', [[['R0', 540, 73], ['T1', 630, 150], ['R2', 810, 150], ['T3', 1050, 120]], 10, 15],\n   [[['R0', 625], ['T1', 795], ['R2', 975], ['T3', 1185]], [['R0', 'T1']]])],\n [('regression: extension ceiling 1', [[['A', 540, 73], ['B', 640, 60]], 10, 15],\n   [[['A', 625], ['B', 710]], []]),\n  ('regression variant: extension ceiling 2', [[['P1', 720, 60], ['U0', 600, 150], ['U2', 960, 72]], 33, 15],\n   [[['U0', 800], ['P1', 800], ['U2', 1060]], [['U0', 'P1']]]),\n  ('partial repair guard 3', [[['S1', 780, 73], ['T0', 540, 72]], 10, 30], [[['T0', 620], ['S1', 865]], []]),\n  ('boundary control 4', [[['A', 540, 120], ['B', 720, 90]], 50, 0], [[['A', 720], ['B', 855]], []]),\n  ('normal control 5', [[['V1', 800, 60], ['Q0', 600, 150]], 25, 15],\n   [[['Q0', 790], ['V1', 875]], [['Q0', 'V1']]]),\n  ('normal control 6', [[['Q1', 750, 44], ['W0', 600, 72]], 10, 30], [[['W0', 680], ['Q1', 800]], []]),\n  ('normal control 7', [[['S0', 540, 100], ['Q3', 1020, 90], ['U1', 720, 91], ['U2', 840, 60]], 10, 30],\n   [[['S0', 650], ['U1', 825], ['U2', 910], ['Q3', 1120]], [['U1', 'U2']]]),\n  ('normal control 8', [[['U2', 840, 44], ['W3', 1080, 150], ['V1', 660, 180], ['V0', 540, 91]], 33, 30],\n   [[['V0', 665], ['V1', 900], ['U2', 900], ['W3', 1280]], [['V0', 'V1'], ['V1', 'U2']]])],\n [('regression: extension ceiling 1', [[['Q0', 600, 182], ['U1', 750, 120]], 10, 15],\n   [[['Q0', 805], ['U1', 885]], [['Q0', 'U1']]]),\n  ('regression variant: extension ceiling 2',\n   [[['R0', 540, 60], ['V1', 660, 72], ['S2', 810, 73], ['V3', 1010, 72]], 33, 30],\n   [[['R0', 620], ['V1', 760], ['S2', 910], ['V3', 1110]], []]),\n  ('partial repair guard 3', [[['V2', 900, 90], ['W0', 600, 91], ['P1', 780, 88], ['Q3', 1050, 91]], 10, 30],\n   [[['W0', 705], ['P1', 880], ['V2', 1000], ['Q3', 1155]], [['P1', 'V2']]]),\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', [[['S0', 540, 91], ['T1', 630, 60], ['U2', 780, 91]], 33, 30],\n   [[['S0', 665], ['T1', 710], ['U2', 905]], [['S0', 'T1']]]),\n  ('normal control 7', [[['W1', 780, 60], ['S0', 600, 72]], 15, 15], [[['S0', 685], ['W1', 850]], []]),\n  ('normal control 8', [[['R2', 830, 91], ['P0', 540, 90], ['U1', 630, 73]], 10, 15],\n   [[['P0', 640], ['U1', 715], ['R2', 935]], [['P0', 'U1']]])]]\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-extension-ceiling","generated_at":"2026-09-29T14:52:04.344667+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":"Take the ceiling of the extended duration before rounding to five minutes.","root_cause":"Fractional extra-time minutes are truncated.","sha256":"279d32742ca12ddd6905d46e270b9886d0d244c21771b1ff36d3088ebd15a3c4","title":"Extra-time minutes floored before five-minute rounding · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.65,"exit_code":1,"observations":[{"actual":[[["A",640]],[]],"check":"regression: extension ceiling 1","expected":[[["A",640]],[]],"passed":true},{"actual":[[["W0",735],["T1",900]],[]],"check":"regression variant: extension ceiling 2","expected":[[["W0",735],["T1",905]],[]],"passed":false},{"actual":[[["A",720],["B",855]],[]],"check":"boundary control 3","expected":[[["A",720],["B",855]],[]],"passed":true},{"actual":[[["A",620],["B",710]],[]],"check":"boundary control 4","expected":[[["A",625],["B",710]],[]],"passed":false},{"actual":[[["P0",680],["Q1",950],["U2",950]],[["Q1","U2"]]],"check":"normal control 5","expected":[[["P0",680],["Q1",955],["U2",950]],[["Q1","U2"]]],"passed":false},{"actual":[[["R0",690],["S1",810]],[]],"check":"normal control 6","expected":[[["R0",690],["S1",810]],[]],"passed":true},{"actual":[[["V0",810],["S1",780],["R2",860],["V3",1065]],[["V0","S1"],["S1","R2"]]],"check":"normal control 7","expected":[[["V0",810],["S1",780],["R2",860],["V3",1065]],[["V0","S1"],["S1","R2"]]],"passed":true},{"actual":[[["S0",815],["P1",890],["P2",980],["R3",1195]],[["S0","P1"],["P1","P2"],["P2","R3"]]],"check":"normal control 8","expected":[[["S0",815],["P1",890],["P2",980],["R3",1195]],[["S0","P1"],["P1","P2"],["P2","R3"]]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: extension ceiling 1\", \"actual\": [[[\"A\", 640]], []], \"expected\": [[[\"A\", 640]], []], \"passed\": true}, {\"check\": \"regression variant: extension ceiling 2\", \"actual\": [[[\"W0\", 735], [\"T1\", 900]], []], \"expected\": [[[\"W0\", 735], [\"T1\", 905]], []], \"passed\": false}, {\"check\": \"boundary control 3\", \"actual\": [[[\"A\", 720], [\"B\", 855]], []], \"expected\": [[[\"A\", 720], [\"B\", 855]], []], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [[[\"A\", 620], [\"B\", 710]], []], \"expected\": [[[\"A\", 625], [\"B\", 710]], []], \"passed\": false}, {\"check\": \"normal control 5\", \"actual\": [[[\"P0\", 680], [\"Q1\", 950], [\"U2\", 950]], [[\"Q1\", \"U2\"]]], \"expected\": [[[\"P0\", 680], [\"Q1\", 955], [\"U2\", 950]], [[\"Q1\", \"U2\"]]], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[[\"R0\", 690], [\"S1\", 810]], []], \"expected\": [[[\"R0\", 690], [\"S1\", 810]], []], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[[\"V0\", 810], [\"S1\", 780], [\"R2\", 860], [\"V3\", 1065]], [[\"V0\", \"S1\"], [\"S1\", \"R2\"]]], \"expected\": [[[\"V0\", 810], [\"S1\", 780], [\"R2\", 860], [\"V3\", 1065]], [[\"V0\", \"S1\"], [\"S1\", \"R2\"]]], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[[\"S0\", 815], [\"P1\", 890], [\"P2\", 980], [\"R3\", 1195]], [[\"S0\", \"P1\"], [\"P1\", \"P2\"], [\"P2\", \"R3\"]]], \"expected\": [[[\"S0\", 815], [\"P1\", 890], [\"P2\", 980], [\"R3\", 1195]], [[\"S0\", \"P1\"], [\"P1\", \"P2\"], [\"P2\", \"R3\"]]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.936,"exit_code":1,"observations":[{"actual":[[["A",635]],[]],"check":"regression: extension ceiling 1","expected":[[["A",640]],[]],"passed":false},{"actual":[[["W0",735],["T1",900]],[]],"check":"regression variant: extension ceiling 2","expected":[[["W0",735],["T1",905]],[]],"passed":false},{"actual":[[["A",720],["B",855]],[]],"check":"boundary control 3","expected":[[["A",720],["B",855]],[]],"passed":true},{"actual":[[["A",620],["B",710]],[]],"check":"boundary control 4","expected":[[["A",625],["B",710]],[]],"passed":false},{"actual":[[["P0",680],["Q1",950],["U2",950]],[["Q1","U2"]]],"check":"normal control 5","expected":[[["P0",680],["Q1",955],["U2",950]],[["Q1","U2"]]],"passed":false},{"actual":[[["R0",690],["S1",810]],[]],"check":"normal control 6","expected":[[["R0",690],["S1",810]],[]],"passed":true},{"actual":[[["V0",810],["S1",780],["R2",860],["V3",1065]],[["V0","S1"],["S1","R2"]]],"check":"normal control 7","expected":[[["V0",810],["S1",780],["R2",860],["V3",1065]],[["V0","S1"],["S1","R2"]]],"passed":true},{"actual":[[["S0",815],["P1",890],["P2",980],["R3",1195]],[["S0","P1"],["P1","P2"],["P2","R3"]]],"check":"normal control 8","expected":[[["S0",815],["P1",890],["P2",980],["R3",1195]],[["S0","P1"],["P1","P2"],["P2","R3"]]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: extension ceiling 1\", \"actual\": [[[\"A\", 635]], []], \"expected\": [[[\"A\", 640]], []], \"passed\": false}, {\"check\": \"regression variant: extension ceiling 2\", \"actual\": [[[\"W0\", 735], [\"T1\", 900]], []], \"expected\": [[[\"W0\", 735], [\"T1\", 905]], []], \"passed\": false}, {\"check\": \"boundary control 3\", \"actual\": [[[\"A\", 720], [\"B\", 855]], []], \"expected\": [[[\"A\", 720], [\"B\", 855]], []], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [[[\"A\", 620], [\"B\", 710]], []], \"expected\": [[[\"A\", 625], [\"B\", 710]], []], \"passed\": false}, {\"check\": \"normal control 5\", \"actual\": [[[\"P0\", 680], [\"Q1\", 950], [\"U2\", 950]], [[\"Q1\", \"U2\"]]], \"expected\": [[[\"P0\", 680], [\"Q1\", 955], [\"U2\", 950]], [[\"Q1\", \"U2\"]]], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[[\"R0\", 690], [\"S1\", 810]], []], \"expected\": [[[\"R0\", 690], [\"S1\", 810]], []], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[[\"V0\", 810], [\"S1\", 780], [\"R2\", 860], [\"V3\", 1065]], [[\"V0\", \"S1\"], [\"S1\", \"R2\"]]], \"expected\": [[[\"V0\", 810], [\"S1\", 780], [\"R2\", 860], [\"V3\", 1065]], [[\"V0\", \"S1\"], [\"S1\", \"R2\"]]], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[[\"S0\", 815], [\"P1\", 890], [\"P2\", 980], [\"R3\", 1195]], [[\"S0\", \"P1\"], [\"P1\", \"P2\"], [\"P2\", \"R3\"]]], \"expected\": [[[\"S0\", 815], [\"P1\", 890], [\"P2\", 980], [\"R3\", 1195]], [[\"S0\", \"P1\"], [\"P1\", \"P2\"], [\"P2\", \"R3\"]]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.481,"exit_code":0,"observations":[{"actual":[[["A",640]],[]],"check":"regression: extension ceiling 1","expected":[[["A",640]],[]],"passed":true},{"actual":[[["W0",735],["T1",905]],[]],"check":"regression variant: extension ceiling 2","expected":[[["W0",735],["T1",905]],[]],"passed":true},{"actual":[[["A",720],["B",855]],[]],"check":"boundary control 3","expected":[[["A",720],["B",855]],[]],"passed":true},{"actual":[[["A",625],["B",710]],[]],"check":"boundary control 4","expected":[[["A",625],["B",710]],[]],"passed":true},{"actual":[[["P0",680],["Q1",955],["U2",950]],[["Q1","U2"]]],"check":"normal control 5","expected":[[["P0",680],["Q1",955],["U2",950]],[["Q1","U2"]]],"passed":true},{"actual":[[["R0",690],["S1",810]],[]],"check":"normal control 6","expected":[[["R0",690],["S1",810]],[]],"passed":true},{"actual":[[["V0",810],["S1",780],["R2",860],["V3",1065]],[["V0","S1"],["S1","R2"]]],"check":"normal control 7","expected":[[["V0",810],["S1",780],["R2",860],["V3",1065]],[["V0","S1"],["S1","R2"]]],"passed":true},{"actual":[[["S0",815],["P1",890],["P2",980],["R3",1195]],[["S0","P1"],["P1","P2"],["P2","R3"]]],"check":"normal control 8","expected":[[["S0",815],["P1",890],["P2",980],["R3",1195]],[["S0","P1"],["P1","P2"],["P2","R3"]]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: extension ceiling 1\", \"actual\": [[[\"A\", 640]], []], \"expected\": [[[\"A\", 640]], []], \"passed\": true}, {\"check\": \"regression variant: extension ceiling 2\", \"actual\": [[[\"W0\", 735], [\"T1\", 905]], []], \"expected\": [[[\"W0\", 735], [\"T1\", 905]], []], \"passed\": true}, {\"check\": \"boundary control 3\", \"actual\": [[[\"A\", 720], [\"B\", 855]], []], \"expected\": [[[\"A\", 720], [\"B\", 855]], []], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [[[\"A\", 625], [\"B\", 710]], []], \"expected\": [[[\"A\", 625], [\"B\", 710]], []], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [[[\"P0\", 680], [\"Q1\", 955], [\"U2\", 950]], [[\"Q1\", \"U2\"]]], \"expected\": [[[\"P0\", 680], [\"Q1\", 955], [\"U2\", 950]], [[\"Q1\", \"U2\"]]], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[[\"R0\", 690], [\"S1\", 810]], []], \"expected\": [[[\"R0\", 690], [\"S1\", 810]], []], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[[\"V0\", 810], [\"S1\", 780], [\"R2\", 860], [\"V3\", 1065]], [[\"V0\", \"S1\"], [\"S1\", \"R2\"]]], \"expected\": [[[\"V0\", 810], [\"S1\", 780], [\"R2\", 860], [\"V3\", 1065]], [[\"V0\", \"S1\"], [\"S1\", \"R2\"]]], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[[\"S0\", 815], [\"P1\", 890], [\"P2\", 980], [\"R3\", 1195]], [[\"S0\", \"P1\"], [\"P1\", \"P2\"], [\"P2\", \"R3\"]]], \"expected\": [[[\"S0\", 815], [\"P1\", 890], [\"P2\", 980], [\"R3\", 1195]], [[\"S0\", \"P1\"], [\"P1\", \"P2\"], [\"P2\", \"R3\"]]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}