{"abstract":"Candidates lose up to four minutes of their allowance.","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 the nearest five still shortens some allowances.","family":"w2-exam-timetabling-constraints-extra-time-sitting-plan-five-minute-grid","id":"FA-94441","implementations":{"attempt":{"sha256":"705dc9e698c77fc633e60fc65a29fc3db2c116ec749c92cf21d1bb2ba6da97cb","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 = round(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: five minute grid 1', [[['B', 800, 60], ['A', 540, 90]], 15, 30],\n   [[['A', 645], ['B', 870]], []]),\n  ('regression variant: five minute grid 2',\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  ('partial repair guard 3', [[['T1', 840, 72], ['R0', 600, 44]], 33, 30], [[['R0', 660], ['T1', 940]], []]),\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', [[['P0', 540, 88], ['Q1', 660, 91]], 10, 30],\n   [[['P0', 640], ['Q1', 765]], [['P0', 'Q1']]]),\n  ('normal control 7', [[['V2', 810, 180], ['U0', 540, 44], ['V3', 1010, 72], ['T1', 720, 100]], 33, 30],\n   [[['U0', 600], ['T1', 855], ['V2', 1050], ['V3', 1110]], [['T1', 'V2'], ['V2', 'V3']]]),\n  ('normal control 8', [[['V2', 870, 100], ['T3', 1070, 120], ['R0', 540, 73], ['R1', 690, 180]], 15, 30],\n   [[['R0', 625], ['R1', 900], ['V2', 985], ['T3', 1210]], [['R1', 'V2']]])],\n [('regression: five minute grid 1', [[['A', 540, 72]], 33, 15], [[['A', 640]], []]),\n  ('regression variant: five minute grid 2', [[['Q0', 540, 91], ['P1', 740, 44]], 10, 15],\n   [[['Q0', 645], ['P1', 790]], []]),\n  ('partial repair guard 3', [[['P0', 540, 73], ['V1', 720, 150]], 25, 15], [[['P0', 635], ['V1', 910]], []]),\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', [[['Q0', 600, 60], ['Q1', 720, 60]], 15, 30], [[['Q0', 670], ['Q1', 790]], []]),\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', [[['R1', 780, 150], ['T0', 600, 60], ['R2', 900, 182]], 25, 15],\n   [[['T0', 675], ['R1', 970], ['R2', 1130]], [['R1', 'R2']]])],\n [('regression: five minute grid 1', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('regression variant: five minute grid 2', [[['P2', 990, 60], ['V0', 600, 60], ['T1', 840, 73]], 15, 15],\n   [[['V0', 670], ['T1', 925], ['P2', 1060]], []]),\n  ('partial repair guard 3', [[['T1', 800, 91], ['W0', 600, 120]], 10, 30], [[['W0', 735], ['T1', 905]], []]),\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', [[['U0', 540, 72], ['W1', 690, 88]], 50, 15], [[['U0', 650], ['W1', 825]], []]),\n  ('normal control 7', [[['S1', 660, 44], ['S2', 840, 73], ['S0', 540, 180]], 33, 15],\n   [[['S0', 780], ['S1', 720], ['S2', 940]], [['S0', 'S1']]]),\n  ('normal control 8', [[['R2', 930, 180], ['V3', 1130, 60], ['T0', 540, 73], ['R1', 690, 150]], 10, 30],\n   [[['T0', 625], ['R1', 855], ['R2', 1130], ['V3', 1200]], [['R2', 'V3']]])],\n [('regression: five minute grid 1', [[['A', 540, 182], ['B', 800, 60]], 10, 30],\n   [[['A', 745], ['B', 870]], []]),\n  ('regression variant: five minute grid 2',\n   [[['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  ('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', [[['S1', 690, 88], ['Q2', 780, 150], ['T0', 540, 44]], 33, 30],\n   [[['T0', 600], ['S1', 810], ['Q2', 980]], [['S1', 'Q2']]]),\n  ('normal control 6', [[['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  ('normal control 7', [[['P2', 990, 60], ['V0', 600, 60], ['T1', 840, 73]], 15, 15],\n   [[['V0', 670], ['T1', 925], ['P2', 1060]], []]),\n  ('normal control 8', [[['V2', 930, 120], ['R0', 600, 72], ['P1', 780, 88]], 25, 30],\n   [[['R0', 690], ['P1', 890], ['V2', 1080]], []])],\n [('regression: five minute grid 1', [[['A', 540, 73], ['B', 640, 60]], 10, 15],\n   [[['A', 625], ['B', 710]], []]),\n  ('regression variant: five minute grid 2', [[['W2', 940, 44], ['U0', 540, 182], ['P1', 740, 150]], 25, 30],\n   [[['U0', 770], ['P1', 930], ['W2', 995]], [['U0', 'P1'], ['P1', 'W2']]]),\n  ('partial repair guard 3',\n   [[['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  ('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', 800, 44], ['P0', 600, 180], ['R2', 920, 60]], 50, 30],\n   [[['P0', 870], ['S1', 870], ['R2', 1010]], [['P0', 'S1']]]),\n  ('normal control 7', [[['P2', 870, 91], ['Q1', 750, 73], ['T3', 960, 150], ['T0', 600, 73]], 15, 30],\n   [[['T0', 685], ['Q1', 835], ['P2', 975], ['T3', 1135]], [['P2', 'T3']]]),\n  ('normal control 8', [[['U0', 540, 72], ['R1', 720, 90], ['P2', 920, 182]], 25, 15],\n   [[['U0', 630], ['R1', 835], ['P2', 1150]], []])]]\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":"92b3b536a3dbf1046236660e460fe13306d192c43c97edb9514aaf91617a475d","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: five minute grid 1', [[['B', 800, 60], ['A', 540, 90]], 15, 30],\n   [[['A', 645], ['B', 870]], []]),\n  ('regression variant: five minute grid 2',\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  ('partial repair guard 3', [[['T1', 840, 72], ['R0', 600, 44]], 33, 30], [[['R0', 660], ['T1', 940]], []]),\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', [[['P0', 540, 88], ['Q1', 660, 91]], 10, 30],\n   [[['P0', 640], ['Q1', 765]], [['P0', 'Q1']]]),\n  ('normal control 7', [[['V2', 810, 180], ['U0', 540, 44], ['V3', 1010, 72], ['T1', 720, 100]], 33, 30],\n   [[['U0', 600], ['T1', 855], ['V2', 1050], ['V3', 1110]], [['T1', 'V2'], ['V2', 'V3']]]),\n  ('normal control 8', [[['V2', 870, 100], ['T3', 1070, 120], ['R0', 540, 73], ['R1', 690, 180]], 15, 30],\n   [[['R0', 625], ['R1', 900], ['V2', 985], ['T3', 1210]], [['R1', 'V2']]])],\n [('regression: five minute grid 1', [[['A', 540, 72]], 33, 15], [[['A', 640]], []]),\n  ('regression variant: five minute grid 2', [[['Q0', 540, 91], ['P1', 740, 44]], 10, 15],\n   [[['Q0', 645], ['P1', 790]], []]),\n  ('partial repair guard 3', [[['P0', 540, 73], ['V1', 720, 150]], 25, 15], [[['P0', 635], ['V1', 910]], []]),\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', [[['Q0', 600, 60], ['Q1', 720, 60]], 15, 30], [[['Q0', 670], ['Q1', 790]], []]),\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', [[['R1', 780, 150], ['T0', 600, 60], ['R2', 900, 182]], 25, 15],\n   [[['T0', 675], ['R1', 970], ['R2', 1130]], [['R1', 'R2']]])],\n [('regression: five minute grid 1', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('regression variant: five minute grid 2', [[['P2', 990, 60], ['V0', 600, 60], ['T1', 840, 73]], 15, 15],\n   [[['V0', 670], ['T1', 925], ['P2', 1060]], []]),\n  ('partial repair guard 3', [[['T1', 800, 91], ['W0', 600, 120]], 10, 30], [[['W0', 735], ['T1', 905]], []]),\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', [[['U0', 540, 72], ['W1', 690, 88]], 50, 15], [[['U0', 650], ['W1', 825]], []]),\n  ('normal control 7', [[['S1', 660, 44], ['S2', 840, 73], ['S0', 540, 180]], 33, 15],\n   [[['S0', 780], ['S1', 720], ['S2', 940]], [['S0', 'S1']]]),\n  ('normal control 8', [[['R2', 930, 180], ['V3', 1130, 60], ['T0', 540, 73], ['R1', 690, 150]], 10, 30],\n   [[['T0', 625], ['R1', 855], ['R2', 1130], ['V3', 1200]], [['R2', 'V3']]])],\n [('regression: five minute grid 1', [[['A', 540, 182], ['B', 800, 60]], 10, 30],\n   [[['A', 745], ['B', 870]], []]),\n  ('regression variant: five minute grid 2',\n   [[['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  ('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', [[['S1', 690, 88], ['Q2', 780, 150], ['T0', 540, 44]], 33, 30],\n   [[['T0', 600], ['S1', 810], ['Q2', 980]], [['S1', 'Q2']]]),\n  ('normal control 6', [[['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  ('normal control 7', [[['P2', 990, 60], ['V0', 600, 60], ['T1', 840, 73]], 15, 15],\n   [[['V0', 670], ['T1', 925], ['P2', 1060]], []]),\n  ('normal control 8', [[['V2', 930, 120], ['R0', 600, 72], ['P1', 780, 88]], 25, 30],\n   [[['R0', 690], ['P1', 890], ['V2', 1080]], []])],\n [('regression: five minute grid 1', [[['A', 540, 73], ['B', 640, 60]], 10, 15],\n   [[['A', 625], ['B', 710]], []]),\n  ('regression variant: five minute grid 2', [[['W2', 940, 44], ['U0', 540, 182], ['P1', 740, 150]], 25, 30],\n   [[['U0', 770], ['P1', 930], ['W2', 995]], [['U0', 'P1'], ['P1', 'W2']]]),\n  ('partial repair guard 3',\n   [[['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  ('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', 800, 44], ['P0', 600, 180], ['R2', 920, 60]], 50, 30],\n   [[['P0', 870], ['S1', 870], ['R2', 1010]], [['P0', 'S1']]]),\n  ('normal control 7', [[['P2', 870, 91], ['Q1', 750, 73], ['T3', 960, 150], ['T0', 600, 73]], 15, 30],\n   [[['T0', 685], ['Q1', 835], ['P2', 975], ['T3', 1135]], [['P2', 'T3']]]),\n  ('normal control 8', [[['U0', 540, 72], ['R1', 720, 90], ['P2', 920, 182]], 25, 15],\n   [[['U0', 630], ['R1', 835], ['P2', 1150]], []])]]\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":"75dbd9f79c1194fe401978c1bc96fe1f80e2dd9f1627785504239ab381cb51e9","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: five minute grid 1', [[['B', 800, 60], ['A', 540, 90]], 15, 30],\n   [[['A', 645], ['B', 870]], []]),\n  ('regression variant: five minute grid 2',\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  ('partial repair guard 3', [[['T1', 840, 72], ['R0', 600, 44]], 33, 30], [[['R0', 660], ['T1', 940]], []]),\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', [[['P0', 540, 88], ['Q1', 660, 91]], 10, 30],\n   [[['P0', 640], ['Q1', 765]], [['P0', 'Q1']]]),\n  ('normal control 7', [[['V2', 810, 180], ['U0', 540, 44], ['V3', 1010, 72], ['T1', 720, 100]], 33, 30],\n   [[['U0', 600], ['T1', 855], ['V2', 1050], ['V3', 1110]], [['T1', 'V2'], ['V2', 'V3']]]),\n  ('normal control 8', [[['V2', 870, 100], ['T3', 1070, 120], ['R0', 540, 73], ['R1', 690, 180]], 15, 30],\n   [[['R0', 625], ['R1', 900], ['V2', 985], ['T3', 1210]], [['R1', 'V2']]])],\n [('regression: five minute grid 1', [[['A', 540, 72]], 33, 15], [[['A', 640]], []]),\n  ('regression variant: five minute grid 2', [[['Q0', 540, 91], ['P1', 740, 44]], 10, 15],\n   [[['Q0', 645], ['P1', 790]], []]),\n  ('partial repair guard 3', [[['P0', 540, 73], ['V1', 720, 150]], 25, 15], [[['P0', 635], ['V1', 910]], []]),\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', [[['Q0', 600, 60], ['Q1', 720, 60]], 15, 30], [[['Q0', 670], ['Q1', 790]], []]),\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', [[['R1', 780, 150], ['T0', 600, 60], ['R2', 900, 182]], 25, 15],\n   [[['T0', 675], ['R1', 970], ['R2', 1130]], [['R1', 'R2']]])],\n [('regression: five minute grid 1', [[['A', 540, 91]], 10, 30], [[['A', 645]], []]),\n  ('regression variant: five minute grid 2', [[['P2', 990, 60], ['V0', 600, 60], ['T1', 840, 73]], 15, 15],\n   [[['V0', 670], ['T1', 925], ['P2', 1060]], []]),\n  ('partial repair guard 3', [[['T1', 800, 91], ['W0', 600, 120]], 10, 30], [[['W0', 735], ['T1', 905]], []]),\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', [[['U0', 540, 72], ['W1', 690, 88]], 50, 15], [[['U0', 650], ['W1', 825]], []]),\n  ('normal control 7', [[['S1', 660, 44], ['S2', 840, 73], ['S0', 540, 180]], 33, 15],\n   [[['S0', 780], ['S1', 720], ['S2', 940]], [['S0', 'S1']]]),\n  ('normal control 8', [[['R2', 930, 180], ['V3', 1130, 60], ['T0', 540, 73], ['R1', 690, 150]], 10, 30],\n   [[['T0', 625], ['R1', 855], ['R2', 1130], ['V3', 1200]], [['R2', 'V3']]])],\n [('regression: five minute grid 1', [[['A', 540, 182], ['B', 800, 60]], 10, 30],\n   [[['A', 745], ['B', 870]], []]),\n  ('regression variant: five minute grid 2',\n   [[['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  ('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', [[['S1', 690, 88], ['Q2', 780, 150], ['T0', 540, 44]], 33, 30],\n   [[['T0', 600], ['S1', 810], ['Q2', 980]], [['S1', 'Q2']]]),\n  ('normal control 6', [[['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  ('normal control 7', [[['P2', 990, 60], ['V0', 600, 60], ['T1', 840, 73]], 15, 15],\n   [[['V0', 670], ['T1', 925], ['P2', 1060]], []]),\n  ('normal control 8', [[['V2', 930, 120], ['R0', 600, 72], ['P1', 780, 88]], 25, 30],\n   [[['R0', 690], ['P1', 890], ['V2', 1080]], []])],\n [('regression: five minute grid 1', [[['A', 540, 73], ['B', 640, 60]], 10, 15],\n   [[['A', 625], ['B', 710]], []]),\n  ('regression variant: five minute grid 2', [[['W2', 940, 44], ['U0', 540, 182], ['P1', 740, 150]], 25, 30],\n   [[['U0', 770], ['P1', 930], ['W2', 995]], [['U0', 'P1'], ['P1', 'W2']]]),\n  ('partial repair guard 3',\n   [[['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  ('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', 800, 44], ['P0', 600, 180], ['R2', 920, 60]], 50, 30],\n   [[['P0', 870], ['S1', 870], ['R2', 1010]], [['P0', 'S1']]]),\n  ('normal control 7', [[['P2', 870, 91], ['Q1', 750, 73], ['T3', 960, 150], ['T0', 600, 73]], 15, 30],\n   [[['T0', 685], ['Q1', 835], ['P2', 975], ['T3', 1135]], [['P2', 'T3']]]),\n  ('normal control 8', [[['U0', 540, 72], ['R1', 720, 90], ['P2', 920, 182]], 25, 15],\n   [[['U0', 630], ['R1', 835], ['P2', 1150]], []])]]\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-five-minute-grid","generated_at":"2026-09-29T14:52:04.540850+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":"Round extended durations up to the next multiple of five.","root_cause":"The five-minute rounding floors.","sha256":"2c4312ab6af529fa8d629e8f882e3eb5915a48a0082599be4f786ade3d022b81","title":"Extended duration rounded down to the five-minute grid · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.247,"exit_code":1,"observations":[{"actual":[[["A",645],["B",870]],[]],"check":"regression: five minute grid 1","expected":[[["A",645],["B",870]],[]],"passed":true},{"actual":[[["W0",650],["P1",870],["S2",1010],["U3",1115]],[]],"check":"regression variant: five minute grid 2","expected":[[["W0",650],["P1",870],["S2",1010],["U3",1120]],[]],"passed":false},{"actual":[[["R0",660],["T1",935]],[]],"check":"partial repair guard 3","expected":[[["R0",660],["T1",940]],[]],"passed":false},{"actual":[[["A",720],["B",855]],[]],"check":"boundary control 4","expected":[[["A",720],["B",855]],[]],"passed":true},{"actual":[[["A",620],["B",705]],[]],"check":"boundary control 5","expected":[[["A",625],["B",710]],[]],"passed":false},{"actual":[[["P0",635],["Q1",760]],[["P0","Q1"]]],"check":"normal control 6","expected":[[["P0",640],["Q1",765]],[["P0","Q1"]]],"passed":false},{"actual":[[["U0",600],["T1",855],["V2",1050],["V3",1105]],[["T1","V2"],["V2","V3"]]],"check":"normal control 7","expected":[[["U0",600],["T1",855],["V2",1050],["V3",1110]],[["T1","V2"],["V2","V3"]]],"passed":false},{"actual":[[["R0",625],["R1",895],["V2",985],["T3",1210]],[["R1","V2"]]],"check":"normal control 8","expected":[[["R0",625],["R1",900],["V2",985],["T3",1210]],[["R1","V2"]]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: five minute grid 1\", \"actual\": [[[\"A\", 645], [\"B\", 870]], []], \"expected\": [[[\"A\", 645], [\"B\", 870]], []], \"passed\": true}, {\"check\": \"regression variant: five minute grid 2\", \"actual\": [[[\"W0\", 650], [\"P1\", 870], [\"S2\", 1010], [\"U3\", 1115]], []], \"expected\": [[[\"W0\", 650], [\"P1\", 870], [\"S2\", 1010], [\"U3\", 1120]], []], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[[\"R0\", 660], [\"T1\", 935]], []], \"expected\": [[[\"R0\", 660], [\"T1\", 940]], []], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[[\"A\", 720], [\"B\", 855]], []], \"expected\": [[[\"A\", 720], [\"B\", 855]], []], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [[[\"A\", 620], [\"B\", 705]], []], \"expected\": [[[\"A\", 625], [\"B\", 710]], []], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[[\"P0\", 635], [\"Q1\", 760]], [[\"P0\", \"Q1\"]]], \"expected\": [[[\"P0\", 640], [\"Q1\", 765]], [[\"P0\", \"Q1\"]]], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [[[\"U0\", 600], [\"T1\", 855], [\"V2\", 1050], [\"V3\", 1105]], [[\"T1\", \"V2\"], [\"V2\", \"V3\"]]], \"expected\": [[[\"U0\", 600], [\"T1\", 855], [\"V2\", 1050], [\"V3\", 1110]], [[\"T1\", \"V2\"], [\"V2\", \"V3\"]]], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [[[\"R0\", 625], [\"R1\", 895], [\"V2\", 985], [\"T3\", 1210]], [[\"R1\", \"V2\"]]], \"expected\": [[[\"R0\", 625], [\"R1\", 900], [\"V2\", 985], [\"T3\", 1210]], [[\"R1\", \"V2\"]]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.018,"exit_code":1,"observations":[{"actual":[[["A",640],["B",865]],[]],"check":"regression: five minute grid 1","expected":[[["A",645],["B",870]],[]],"passed":false},{"actual":[[["W0",645],["P1",870],["S2",1010],["U3",1115]],[]],"check":"regression variant: five minute grid 2","expected":[[["W0",650],["P1",870],["S2",1010],["U3",1120]],[]],"passed":false},{"actual":[[["R0",655],["T1",935]],[]],"check":"partial repair guard 3","expected":[[["R0",660],["T1",940]],[]],"passed":false},{"actual":[[["A",720],["B",855]],[]],"check":"boundary control 4","expected":[[["A",720],["B",855]],[]],"passed":true},{"actual":[[["A",620],["B",705]],[]],"check":"boundary control 5","expected":[[["A",625],["B",710]],[]],"passed":false},{"actual":[[["P0",635],["Q1",760]],[["P0","Q1"]]],"check":"normal control 6","expected":[[["P0",640],["Q1",765]],[["P0","Q1"]]],"passed":false},{"actual":[[["U0",595],["T1",850],["V2",1050],["V3",1105]],[["T1","V2"],["V2","V3"]]],"check":"normal control 7","expected":[[["U0",600],["T1",855],["V2",1050],["V3",1110]],[["T1","V2"],["V2","V3"]]],"passed":false},{"actual":[[["R0",620],["R1",895],["V2",985],["T3",1205]],[["R1","V2"]]],"check":"normal control 8","expected":[[["R0",625],["R1",900],["V2",985],["T3",1210]],[["R1","V2"]]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: five minute grid 1\", \"actual\": [[[\"A\", 640], [\"B\", 865]], []], \"expected\": [[[\"A\", 645], [\"B\", 870]], []], \"passed\": false}, {\"check\": \"regression variant: five minute grid 2\", \"actual\": [[[\"W0\", 645], [\"P1\", 870], [\"S2\", 1010], [\"U3\", 1115]], []], \"expected\": [[[\"W0\", 650], [\"P1\", 870], [\"S2\", 1010], [\"U3\", 1120]], []], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[[\"R0\", 655], [\"T1\", 935]], []], \"expected\": [[[\"R0\", 660], [\"T1\", 940]], []], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[[\"A\", 720], [\"B\", 855]], []], \"expected\": [[[\"A\", 720], [\"B\", 855]], []], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [[[\"A\", 620], [\"B\", 705]], []], \"expected\": [[[\"A\", 625], [\"B\", 710]], []], \"passed\": false}, {\"check\": \"normal control 6\", \"actual\": [[[\"P0\", 635], [\"Q1\", 760]], [[\"P0\", \"Q1\"]]], \"expected\": [[[\"P0\", 640], [\"Q1\", 765]], [[\"P0\", \"Q1\"]]], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [[[\"U0\", 595], [\"T1\", 850], [\"V2\", 1050], [\"V3\", 1105]], [[\"T1\", \"V2\"], [\"V2\", \"V3\"]]], \"expected\": [[[\"U0\", 600], [\"T1\", 855], [\"V2\", 1050], [\"V3\", 1110]], [[\"T1\", \"V2\"], [\"V2\", \"V3\"]]], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [[[\"R0\", 620], [\"R1\", 895], [\"V2\", 985], [\"T3\", 1205]], [[\"R1\", \"V2\"]]], \"expected\": [[[\"R0\", 625], [\"R1\", 900], [\"V2\", 985], [\"T3\", 1210]], [[\"R1\", \"V2\"]]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.366,"exit_code":0,"observations":[{"actual":[[["A",645],["B",870]],[]],"check":"regression: five minute grid 1","expected":[[["A",645],["B",870]],[]],"passed":true},{"actual":[[["W0",650],["P1",870],["S2",1010],["U3",1120]],[]],"check":"regression variant: five minute grid 2","expected":[[["W0",650],["P1",870],["S2",1010],["U3",1120]],[]],"passed":true},{"actual":[[["R0",660],["T1",940]],[]],"check":"partial repair guard 3","expected":[[["R0",660],["T1",940]],[]],"passed":true},{"actual":[[["A",720],["B",855]],[]],"check":"boundary control 4","expected":[[["A",720],["B",855]],[]],"passed":true},{"actual":[[["A",625],["B",710]],[]],"check":"boundary control 5","expected":[[["A",625],["B",710]],[]],"passed":true},{"actual":[[["P0",640],["Q1",765]],[["P0","Q1"]]],"check":"normal control 6","expected":[[["P0",640],["Q1",765]],[["P0","Q1"]]],"passed":true},{"actual":[[["U0",600],["T1",855],["V2",1050],["V3",1110]],[["T1","V2"],["V2","V3"]]],"check":"normal control 7","expected":[[["U0",600],["T1",855],["V2",1050],["V3",1110]],[["T1","V2"],["V2","V3"]]],"passed":true},{"actual":[[["R0",625],["R1",900],["V2",985],["T3",1210]],[["R1","V2"]]],"check":"normal control 8","expected":[[["R0",625],["R1",900],["V2",985],["T3",1210]],[["R1","V2"]]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: five minute grid 1\", \"actual\": [[[\"A\", 645], [\"B\", 870]], []], \"expected\": [[[\"A\", 645], [\"B\", 870]], []], \"passed\": true}, {\"check\": \"regression variant: five minute grid 2\", \"actual\": [[[\"W0\", 650], [\"P1\", 870], [\"S2\", 1010], [\"U3\", 1120]], []], \"expected\": [[[\"W0\", 650], [\"P1\", 870], [\"S2\", 1010], [\"U3\", 1120]], []], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [[[\"R0\", 660], [\"T1\", 940]], []], \"expected\": [[[\"R0\", 660], [\"T1\", 940]], []], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [[[\"A\", 720], [\"B\", 855]], []], \"expected\": [[[\"A\", 720], [\"B\", 855]], []], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [[[\"A\", 625], [\"B\", 710]], []], \"expected\": [[[\"A\", 625], [\"B\", 710]], []], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[[\"P0\", 640], [\"Q1\", 765]], [[\"P0\", \"Q1\"]]], \"expected\": [[[\"P0\", 640], [\"Q1\", 765]], [[\"P0\", \"Q1\"]]], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[[\"U0\", 600], [\"T1\", 855], [\"V2\", 1050], [\"V3\", 1110]], [[\"T1\", \"V2\"], [\"V2\", \"V3\"]]], \"expected\": [[[\"U0\", 600], [\"T1\", 855], [\"V2\", 1050], [\"V3\", 1110]], [[\"T1\", \"V2\"], [\"V2\", \"V3\"]]], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[[\"R0\", 625], [\"R1\", 900], [\"V2\", 985], [\"T3\", 1210]], [[\"R1\", \"V2\"]]], \"expected\": [[[\"R0\", 625], [\"R1\", 900], [\"V2\", 985], [\"T3\", 1210]], [[\"R1\", \"V2\"]]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}