FAILURE MAP
← Case archive

FA-94831 / Exam timetabling constraints / Open access

Two-hour exams given relief cover · case 01

Exactly two-hour exams draw relief invigilators unnecessarily.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The duration test is inclusive at 120 minutes.

VERIFIED REPAIR

Only exams longer than 120 minutes qualify.

Unsuccessful approach: Lowering the threshold to 90 minutes adds more unneeded cover.

Case contract

rooms [room, venue, period, exam duration, candidates]. Rooms with candidates running exams longer than 120 minutes need relief cover; each venue-period needs ceil(qualifying rooms / per_relief) relief invigilators. Return [venue, period, qualifying rooms, relief invigilators] sorted by venue, period.

Why this case matters

Long exams need relief invigilators so room staff can take breaks; cover is pooled per venue and period.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rooms, per_relief):
    groups = {}
    for room, venue, p, dur, n in rooms:
        if dur >= 120 and n > 0:
            groups[(venue, p)] = groups.get((venue, p), 0) + 1
    return [[v, p, c, -(-c // per_relief)] for (v, p), c in sorted(groups.items())]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: long exam threshold 1', [[['R1', 'main', 0, 120, 10]], 3], []),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 121, 0], ['R2', 'main', 0, 150, 0],
     ['R3', 'annex', 0, 180, 12], ['R4', 'annex', 1, 180, 12], ['R5', 'main', 0, 180, 30],
     ['R6', 'annex', 1, 150, 30]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
    3],
   []),
  ('boundary control 4', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],
   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 5',
   [[['R0', 'annex', 0, 180, 12], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
     ['R3', 'annex', 1, 60, 30]],
    3],
   [['annex', 0, 1, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 0, 120, 30], ['R2', 'main', 0, 180, 30],
     ['R3', 'main', 1, 120, 0], ['R4', 'annex', 1, 121, 30]],
    2],
   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'annex', 1, 180, 30], ['R1', 'main', 1, 120, 30], ['R2', 'main', 0, 120, 0]], 3],
   [['annex', 1, 1, 1]]),
  ('normal control 8',
   [[['R0', 'annex', 1, 60, 0], ['R1', 'main', 0, 180, 12], ['R2', 'main', 1, 150, 12],
     ['R3', 'main', 0, 150, 30], ['R4', 'main', 1, 121, 0], ['R5', 'main', 0, 120, 0],
     ['R6', 'annex', 1, 150, 0], ['R7', 'annex', 0, 120, 0]],
    3],
   [['main', 0, 2, 1], ['main', 1, 1, 1]])],
 [('regression: long exam threshold 1',
   [[['R0', 'annex', 0, 60, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'main', 0, 120, 30],
     ['R3', 'annex', 1, 180, 30]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 0, 121, 30], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
     ['R3', 'annex', 1, 150, 30]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 90, 30], ['R1', 'main', 1, 120, 30], ['R2', 'annex', 1, 60, 30]], 3], []),
  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
  ('normal control 5',
   [[['R0', 'main', 0, 121, 12], ['R1', 'main', 0, 121, 30], ['R2', 'main', 0, 180, 0],
     ['R3', 'annex', 0, 121, 0], ['R4', 'annex', 1, 120, 30], ['R5', 'main', 1, 60, 0],
     ['R6', 'annex', 0, 150, 30], ['R7', 'annex', 1, 150, 30]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 2, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 0, 90, 0], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],
     ['R3', 'main', 0, 60, 30], ['R4', 'main', 0, 121, 12], ['R5', 'main', 1, 121, 12]],
    2],
   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 7',
   [[['R0', 'annex', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'annex', 1, 121, 12],
     ['R3', 'main', 0, 121, 12], ['R4', 'main', 1, 120, 30], ['R5', 'annex', 0, 180, 12]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 8',
   [[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 120, 0], ['R2', 'main', 0, 180, 0],
     ['R3', 'annex', 0, 150, 0], ['R4', 'annex', 1, 150, 0], ['R5', 'annex', 0, 60, 0]],
    3],
   [['main', 1, 1, 1]])],
 [('regression: long exam threshold 1',
   [[['R0', 'main', 0, 121, 30], ['R1', 'annex', 0, 60, 12], ['R2', 'annex', 0, 60, 12],
     ['R3', 'main', 0, 150, 0], ['R4', 'annex', 0, 120, 12], ['R5', 'main', 0, 90, 12]],
    2],
   [['main', 0, 1, 1]]),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 90, 12], ['R2', 'annex', 0, 150, 0],
     ['R3', 'main', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 0, 150, 12],
     ['R6', 'main', 1, 121, 12], ['R7', 'main', 0, 90, 30]],
    3],
   [['main', 0, 1, 1], ['main', 1, 2, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 180, 0], ['R1', 'main', 1, 121, 12], ['R2', 'main', 1, 150, 30],
     ['R3', 'annex', 0, 120, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 120, 0]],
    2],
   [['main', 1, 2, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),
  ('normal control 5',
   [[['R0', 'main', 1, 180, 0], ['R1', 'annex', 1, 120, 0], ['R2', 'main', 1, 180, 30],
     ['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 0, 121, 30]],
    3],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 1, 150, 12], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 90, 0]], 3],
   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 60, 30], ['R2', 'annex', 0, 121, 12],
     ['R3', 'annex', 0, 90, 12], ['R4', 'main', 0, 90, 30], ['R5', 'main', 1, 180, 30],
     ['R6', 'annex', 1, 180, 0]],
    2],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 8', [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 90, 30]], 2], [])],
 [('regression: long exam threshold 1', [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 120, 30]], 2], []),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 180, 30], ['R2', 'annex', 0, 90, 12],
     ['R3', 'main', 0, 150, 0]],
    3],
   [['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'main', 0, 120, 12], ['R1', 'main', 0, 90, 0], ['R2', 'main', 1, 90, 0],
     ['R3', 'annex', 1, 60, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 60, 30]],
    3],
   []),
  ('boundary control 4',
   [[['R1', 'main', 0, 180, 10], ['R2', 'main', 0, 180, 10], ['R3', 'main', 0, 180, 10],
     ['R4', 'main', 0, 180, 5]],
    3],
   [['main', 0, 4, 2]]),
  ('normal control 5', [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 90, 12]], 3], [['annex', 1, 1, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 60, 0], ['R1', 'main', 0, 150, 12]], 2], [['main', 0, 1, 1]]),
  ('normal control 7', [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 150, 0]], 2],
   []),
  ('normal control 8',
   [[['R0', 'annex', 1, 120, 0], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 121, 12],
     ['R3', 'annex', 0, 90, 30], ['R4', 'annex', 0, 121, 0]],
    2],
   [['annex', 0, 1, 1]])],
 [('regression: long exam threshold 1',
   [[['R0', 'main', 1, 120, 30], ['R1', 'main', 0, 60, 30], ['R2', 'annex', 1, 120, 12],
     ['R3', 'main', 0, 150, 0]],
    2],
   []),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 150, 30],
     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'annex', 1, 120, 12],
     ['R6', 'main', 0, 180, 30], ['R7', 'annex', 1, 121, 30]],
    3],
   [['annex', 1, 2, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'main', 1, 90, 12], ['R1', 'main', 1, 90, 0], ['R2', 'annex', 0, 120, 30],
     ['R3', 'main', 1, 180, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 0, 120, 12],
     ['R6', 'annex', 1, 121, 0]],
    3],
   [['annex', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),
  ('normal control 5',
   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
    3],
   []),
  ('normal control 6',
   [[['R0', 'annex', 0, 120, 12], ['R1', 'main', 1, 120, 12], ['R2', 'main', 1, 60, 30],
     ['R3', 'main', 0, 121, 30]],
    3],
   [['main', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 1, 120, 12], ['R1', 'main', 0, 180, 0], ['R2', 'annex', 1, 150, 0],
     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 1, 90, 30],
     ['R6', 'annex', 0, 90, 30]],
    3],
   []),
  ('normal control 8',
   [[['R0', 'annex', 1, 150, 30], ['R1', 'main', 0, 121, 12], ['R2', 'annex', 1, 90, 30],
     ['R3', 'main', 0, 150, 12]],
    3],
   [['annex', 1, 1, 1], ['main', 0, 2, 1]])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: long exam threshold 1[['main', 0, 1, 1]][]Failed
regression variant: long exam threshold 2[['annex', 0, 1, 1], ['annex', 1, 3, 1], ['main', 0, 1, 1]][['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]Failed
partial repair guard 3[['main', 0, 1, 1]][]Failed
boundary control 4[['annex', 0, 1, 1], ['main', 0, 1, 1]][['annex', 0, 1, 1], ['main', 0, 1, 1]]Passed
normal control 5[['annex', 0, 1, 1], ['annex', 1, 1, 1]][['annex', 0, 1, 1]]Failed
normal control 6[['annex', 1, 2, 1], ['main', 0, 2, 1]][['annex', 1, 1, 1], ['main', 0, 1, 1]]Failed
normal control 7[['annex', 1, 1, 1], ['main', 1, 1, 1]][['annex', 1, 1, 1]]Failed
normal control 8[['main', 0, 2, 1], ['main', 1, 1, 1]][['main', 0, 2, 1], ['main', 1, 1, 1]]Passed

SHA-256 / 686af29b4ca17fdd11194609c7897358e694b1a54d38bb4740f1b27d3f08890a

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rooms, per_relief):
    groups = {}
    for room, venue, p, dur, n in rooms:
        if dur > 90 and n > 0:
            groups[(venue, p)] = groups.get((venue, p), 0) + 1
    return [[v, p, c, -(-c // per_relief)] for (v, p), c in sorted(groups.items())]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: long exam threshold 1', [[['R1', 'main', 0, 120, 10]], 3], []),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 121, 0], ['R2', 'main', 0, 150, 0],
     ['R3', 'annex', 0, 180, 12], ['R4', 'annex', 1, 180, 12], ['R5', 'main', 0, 180, 30],
     ['R6', 'annex', 1, 150, 30]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
    3],
   []),
  ('boundary control 4', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],
   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 5',
   [[['R0', 'annex', 0, 180, 12], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
     ['R3', 'annex', 1, 60, 30]],
    3],
   [['annex', 0, 1, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 0, 120, 30], ['R2', 'main', 0, 180, 30],
     ['R3', 'main', 1, 120, 0], ['R4', 'annex', 1, 121, 30]],
    2],
   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'annex', 1, 180, 30], ['R1', 'main', 1, 120, 30], ['R2', 'main', 0, 120, 0]], 3],
   [['annex', 1, 1, 1]]),
  ('normal control 8',
   [[['R0', 'annex', 1, 60, 0], ['R1', 'main', 0, 180, 12], ['R2', 'main', 1, 150, 12],
     ['R3', 'main', 0, 150, 30], ['R4', 'main', 1, 121, 0], ['R5', 'main', 0, 120, 0],
     ['R6', 'annex', 1, 150, 0], ['R7', 'annex', 0, 120, 0]],
    3],
   [['main', 0, 2, 1], ['main', 1, 1, 1]])],
 [('regression: long exam threshold 1',
   [[['R0', 'annex', 0, 60, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'main', 0, 120, 30],
     ['R3', 'annex', 1, 180, 30]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 0, 121, 30], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
     ['R3', 'annex', 1, 150, 30]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 90, 30], ['R1', 'main', 1, 120, 30], ['R2', 'annex', 1, 60, 30]], 3], []),
  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
  ('normal control 5',
   [[['R0', 'main', 0, 121, 12], ['R1', 'main', 0, 121, 30], ['R2', 'main', 0, 180, 0],
     ['R3', 'annex', 0, 121, 0], ['R4', 'annex', 1, 120, 30], ['R5', 'main', 1, 60, 0],
     ['R6', 'annex', 0, 150, 30], ['R7', 'annex', 1, 150, 30]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 2, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 0, 90, 0], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],
     ['R3', 'main', 0, 60, 30], ['R4', 'main', 0, 121, 12], ['R5', 'main', 1, 121, 12]],
    2],
   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 7',
   [[['R0', 'annex', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'annex', 1, 121, 12],
     ['R3', 'main', 0, 121, 12], ['R4', 'main', 1, 120, 30], ['R5', 'annex', 0, 180, 12]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 8',
   [[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 120, 0], ['R2', 'main', 0, 180, 0],
     ['R3', 'annex', 0, 150, 0], ['R4', 'annex', 1, 150, 0], ['R5', 'annex', 0, 60, 0]],
    3],
   [['main', 1, 1, 1]])],
 [('regression: long exam threshold 1',
   [[['R0', 'main', 0, 121, 30], ['R1', 'annex', 0, 60, 12], ['R2', 'annex', 0, 60, 12],
     ['R3', 'main', 0, 150, 0], ['R4', 'annex', 0, 120, 12], ['R5', 'main', 0, 90, 12]],
    2],
   [['main', 0, 1, 1]]),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 90, 12], ['R2', 'annex', 0, 150, 0],
     ['R3', 'main', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 0, 150, 12],
     ['R6', 'main', 1, 121, 12], ['R7', 'main', 0, 90, 30]],
    3],
   [['main', 0, 1, 1], ['main', 1, 2, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 180, 0], ['R1', 'main', 1, 121, 12], ['R2', 'main', 1, 150, 30],
     ['R3', 'annex', 0, 120, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 120, 0]],
    2],
   [['main', 1, 2, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),
  ('normal control 5',
   [[['R0', 'main', 1, 180, 0], ['R1', 'annex', 1, 120, 0], ['R2', 'main', 1, 180, 30],
     ['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 0, 121, 30]],
    3],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 1, 150, 12], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 90, 0]], 3],
   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 60, 30], ['R2', 'annex', 0, 121, 12],
     ['R3', 'annex', 0, 90, 12], ['R4', 'main', 0, 90, 30], ['R5', 'main', 1, 180, 30],
     ['R6', 'annex', 1, 180, 0]],
    2],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 8', [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 90, 30]], 2], [])],
 [('regression: long exam threshold 1', [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 120, 30]], 2], []),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 180, 30], ['R2', 'annex', 0, 90, 12],
     ['R3', 'main', 0, 150, 0]],
    3],
   [['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'main', 0, 120, 12], ['R1', 'main', 0, 90, 0], ['R2', 'main', 1, 90, 0],
     ['R3', 'annex', 1, 60, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 60, 30]],
    3],
   []),
  ('boundary control 4',
   [[['R1', 'main', 0, 180, 10], ['R2', 'main', 0, 180, 10], ['R3', 'main', 0, 180, 10],
     ['R4', 'main', 0, 180, 5]],
    3],
   [['main', 0, 4, 2]]),
  ('normal control 5', [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 90, 12]], 3], [['annex', 1, 1, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 60, 0], ['R1', 'main', 0, 150, 12]], 2], [['main', 0, 1, 1]]),
  ('normal control 7', [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 150, 0]], 2],
   []),
  ('normal control 8',
   [[['R0', 'annex', 1, 120, 0], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 121, 12],
     ['R3', 'annex', 0, 90, 30], ['R4', 'annex', 0, 121, 0]],
    2],
   [['annex', 0, 1, 1]])],
 [('regression: long exam threshold 1',
   [[['R0', 'main', 1, 120, 30], ['R1', 'main', 0, 60, 30], ['R2', 'annex', 1, 120, 12],
     ['R3', 'main', 0, 150, 0]],
    2],
   []),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 150, 30],
     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'annex', 1, 120, 12],
     ['R6', 'main', 0, 180, 30], ['R7', 'annex', 1, 121, 30]],
    3],
   [['annex', 1, 2, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'main', 1, 90, 12], ['R1', 'main', 1, 90, 0], ['R2', 'annex', 0, 120, 30],
     ['R3', 'main', 1, 180, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 0, 120, 12],
     ['R6', 'annex', 1, 121, 0]],
    3],
   [['annex', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),
  ('normal control 5',
   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
    3],
   []),
  ('normal control 6',
   [[['R0', 'annex', 0, 120, 12], ['R1', 'main', 1, 120, 12], ['R2', 'main', 1, 60, 30],
     ['R3', 'main', 0, 121, 30]],
    3],
   [['main', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 1, 120, 12], ['R1', 'main', 0, 180, 0], ['R2', 'annex', 1, 150, 0],
     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 1, 90, 30],
     ['R6', 'annex', 0, 90, 30]],
    3],
   []),
  ('normal control 8',
   [[['R0', 'annex', 1, 150, 30], ['R1', 'main', 0, 121, 12], ['R2', 'annex', 1, 90, 30],
     ['R3', 'main', 0, 150, 12]],
    3],
   [['annex', 1, 1, 1], ['main', 0, 2, 1]])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: long exam threshold 1[['main', 0, 1, 1]][]Failed
regression variant: long exam threshold 2[['annex', 0, 1, 1], ['annex', 1, 3, 1], ['main', 0, 1, 1]][['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]Failed
partial repair guard 3[['main', 0, 1, 1]][]Failed
boundary control 4[['annex', 0, 1, 1], ['main', 0, 1, 1]][['annex', 0, 1, 1], ['main', 0, 1, 1]]Passed
normal control 5[['annex', 0, 1, 1], ['annex', 1, 1, 1]][['annex', 0, 1, 1]]Failed
normal control 6[['annex', 1, 2, 1], ['main', 0, 2, 1]][['annex', 1, 1, 1], ['main', 0, 1, 1]]Failed
normal control 7[['annex', 1, 1, 1], ['main', 1, 1, 1]][['annex', 1, 1, 1]]Failed
normal control 8[['main', 0, 2, 1], ['main', 1, 1, 1]][['main', 0, 2, 1], ['main', 1, 1, 1]]Passed

SHA-256 / 666cc1f579d0afc4a7aa9f551b680ea13ad2657a0c13a296f7fb8d80257c8799

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rooms, per_relief):
    groups = {}
    for room, venue, p, dur, n in rooms:
        if dur > 120 and n > 0:
            groups[(venue, p)] = groups.get((venue, p), 0) + 1
    return [[v, p, c, -(-c // per_relief)] for (v, p), c in sorted(groups.items())]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: long exam threshold 1', [[['R1', 'main', 0, 120, 10]], 3], []),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 121, 0], ['R2', 'main', 0, 150, 0],
     ['R3', 'annex', 0, 180, 12], ['R4', 'annex', 1, 180, 12], ['R5', 'main', 0, 180, 30],
     ['R6', 'annex', 1, 150, 30]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
    3],
   []),
  ('boundary control 4', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],
   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 5',
   [[['R0', 'annex', 0, 180, 12], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
     ['R3', 'annex', 1, 60, 30]],
    3],
   [['annex', 0, 1, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 0, 120, 30], ['R2', 'main', 0, 180, 30],
     ['R3', 'main', 1, 120, 0], ['R4', 'annex', 1, 121, 30]],
    2],
   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'annex', 1, 180, 30], ['R1', 'main', 1, 120, 30], ['R2', 'main', 0, 120, 0]], 3],
   [['annex', 1, 1, 1]]),
  ('normal control 8',
   [[['R0', 'annex', 1, 60, 0], ['R1', 'main', 0, 180, 12], ['R2', 'main', 1, 150, 12],
     ['R3', 'main', 0, 150, 30], ['R4', 'main', 1, 121, 0], ['R5', 'main', 0, 120, 0],
     ['R6', 'annex', 1, 150, 0], ['R7', 'annex', 0, 120, 0]],
    3],
   [['main', 0, 2, 1], ['main', 1, 1, 1]])],
 [('regression: long exam threshold 1',
   [[['R0', 'annex', 0, 60, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'main', 0, 120, 30],
     ['R3', 'annex', 1, 180, 30]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 0, 121, 30], ['R1', 'annex', 0, 90, 0], ['R2', 'annex', 1, 120, 30],
     ['R3', 'annex', 1, 150, 30]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 90, 30], ['R1', 'main', 1, 120, 30], ['R2', 'annex', 1, 60, 30]], 3], []),
  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
  ('normal control 5',
   [[['R0', 'main', 0, 121, 12], ['R1', 'main', 0, 121, 30], ['R2', 'main', 0, 180, 0],
     ['R3', 'annex', 0, 121, 0], ['R4', 'annex', 1, 120, 30], ['R5', 'main', 1, 60, 0],
     ['R6', 'annex', 0, 150, 30], ['R7', 'annex', 1, 150, 30]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 2, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 0, 90, 0], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],
     ['R3', 'main', 0, 60, 30], ['R4', 'main', 0, 121, 12], ['R5', 'main', 1, 121, 12]],
    2],
   [['annex', 0, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 7',
   [[['R0', 'annex', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'annex', 1, 121, 12],
     ['R3', 'main', 0, 121, 12], ['R4', 'main', 1, 120, 30], ['R5', 'annex', 0, 180, 12]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 8',
   [[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 120, 0], ['R2', 'main', 0, 180, 0],
     ['R3', 'annex', 0, 150, 0], ['R4', 'annex', 1, 150, 0], ['R5', 'annex', 0, 60, 0]],
    3],
   [['main', 1, 1, 1]])],
 [('regression: long exam threshold 1',
   [[['R0', 'main', 0, 121, 30], ['R1', 'annex', 0, 60, 12], ['R2', 'annex', 0, 60, 12],
     ['R3', 'main', 0, 150, 0], ['R4', 'annex', 0, 120, 12], ['R5', 'main', 0, 90, 12]],
    2],
   [['main', 0, 1, 1]]),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 90, 12], ['R2', 'annex', 0, 150, 0],
     ['R3', 'main', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 0, 150, 12],
     ['R6', 'main', 1, 121, 12], ['R7', 'main', 0, 90, 30]],
    3],
   [['main', 0, 1, 1], ['main', 1, 2, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 180, 0], ['R1', 'main', 1, 121, 12], ['R2', 'main', 1, 150, 30],
     ['R3', 'annex', 0, 120, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 120, 0]],
    2],
   [['main', 1, 2, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),
  ('normal control 5',
   [[['R0', 'main', 1, 180, 0], ['R1', 'annex', 1, 120, 0], ['R2', 'main', 1, 180, 30],
     ['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 0, 121, 30]],
    3],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 1, 150, 12], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 90, 0]], 3],
   [['annex', 1, 1, 1], ['main', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 1, 90, 30], ['R1', 'main', 1, 60, 30], ['R2', 'annex', 0, 121, 12],
     ['R3', 'annex', 0, 90, 12], ['R4', 'main', 0, 90, 30], ['R5', 'main', 1, 180, 30],
     ['R6', 'annex', 1, 180, 0]],
    2],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 8', [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 90, 30]], 2], [])],
 [('regression: long exam threshold 1', [[['R0', 'main', 1, 150, 0], ['R1', 'annex', 1, 120, 30]], 2], []),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 30], ['R1', 'main', 1, 180, 30], ['R2', 'annex', 0, 90, 12],
     ['R3', 'main', 0, 150, 0]],
    3],
   [['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'main', 0, 120, 12], ['R1', 'main', 0, 90, 0], ['R2', 'main', 1, 90, 0],
     ['R3', 'annex', 1, 60, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 60, 30]],
    3],
   []),
  ('boundary control 4',
   [[['R1', 'main', 0, 180, 10], ['R2', 'main', 0, 180, 10], ['R3', 'main', 0, 180, 10],
     ['R4', 'main', 0, 180, 5]],
    3],
   [['main', 0, 4, 2]]),
  ('normal control 5', [[['R0', 'annex', 1, 180, 12], ['R1', 'main', 1, 90, 12]], 3], [['annex', 1, 1, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 60, 0], ['R1', 'main', 0, 150, 12]], 2], [['main', 0, 1, 1]]),
  ('normal control 7', [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 150, 0]], 2],
   []),
  ('normal control 8',
   [[['R0', 'annex', 1, 120, 0], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 121, 12],
     ['R3', 'annex', 0, 90, 30], ['R4', 'annex', 0, 121, 0]],
    2],
   [['annex', 0, 1, 1]])],
 [('regression: long exam threshold 1',
   [[['R0', 'main', 1, 120, 30], ['R1', 'main', 0, 60, 30], ['R2', 'annex', 1, 120, 12],
     ['R3', 'main', 0, 150, 0]],
    2],
   []),
  ('regression variant: long exam threshold 2',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 150, 30],
     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 1, 150, 12], ['R5', 'annex', 1, 120, 12],
     ['R6', 'main', 0, 180, 30], ['R7', 'annex', 1, 121, 30]],
    3],
   [['annex', 1, 2, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'main', 1, 90, 12], ['R1', 'main', 1, 90, 0], ['R2', 'annex', 0, 120, 30],
     ['R3', 'main', 1, 180, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 0, 120, 12],
     ['R6', 'annex', 1, 121, 0]],
    3],
   [['annex', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),
  ('normal control 5',
   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 150, 0], ['R2', 'main', 1, 150, 0],
     ['R3', 'main', 1, 180, 0], ['R4', 'main', 0, 180, 0]],
    3],
   []),
  ('normal control 6',
   [[['R0', 'annex', 0, 120, 12], ['R1', 'main', 1, 120, 12], ['R2', 'main', 1, 60, 30],
     ['R3', 'main', 0, 121, 30]],
    3],
   [['main', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 1, 120, 12], ['R1', 'main', 0, 180, 0], ['R2', 'annex', 1, 150, 0],
     ['R3', 'main', 1, 120, 12], ['R4', 'annex', 0, 120, 0], ['R5', 'annex', 1, 90, 30],
     ['R6', 'annex', 0, 90, 30]],
    3],
   []),
  ('normal control 8',
   [[['R0', 'annex', 1, 150, 30], ['R1', 'main', 0, 121, 12], ['R2', 'annex', 1, 90, 30],
     ['R3', 'main', 0, 150, 12]],
    3],
   [['annex', 1, 1, 1], ['main', 0, 2, 1]])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: long exam threshold 1[][]Passed
regression variant: long exam threshold 2[['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]][['annex', 0, 1, 1], ['annex', 1, 2, 1], ['main', 0, 1, 1]]Passed
partial repair guard 3[][]Passed
boundary control 4[['annex', 0, 1, 1], ['main', 0, 1, 1]][['annex', 0, 1, 1], ['main', 0, 1, 1]]Passed
normal control 5[['annex', 0, 1, 1]][['annex', 0, 1, 1]]Passed
normal control 6[['annex', 1, 1, 1], ['main', 0, 1, 1]][['annex', 1, 1, 1], ['main', 0, 1, 1]]Passed
normal control 7[['annex', 1, 1, 1]][['annex', 1, 1, 1]]Passed
normal control 8[['main', 0, 2, 1], ['main', 1, 1, 1]][['main', 0, 2, 1], ['main', 1, 1, 1]]Passed

SHA-256 / c8bccf7b6ecbabead72516c1a6b15228be19495c1d8210742e5ab61732cddb7b

Verification & scope

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.

Observations recorded using Python 3.12.14 at 2026-09-29T14:52:08.022214+00:00.

Case digest / 621482ec9b99ed6cef60516da582153b48928b4badfe42518fa6138044ad9cc0