FAILURE MAP
← Case archive

FA-94826 / Exam timetabling constraints / Open access

Relief cover floors the room ratio · case 01

A venue with fewer long-exam rooms than the ratio gets no relief invigilator.

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

ROOT CAUSE

Relief invigilators are computed with floor division.

VERIFIED REPAIR

Use ceiling division of qualifying rooms by the ratio.

Unsuccessful approach: Adding one only above the ratio still leaves small venues uncovered.

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: relief ceiling 1', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'annex', 1, 180, 0], ['R1', 'main', 1, 121, 30], ['R2', 'annex', 1, 60, 0],
     ['R3', 'main', 1, 121, 0], ['R4', 'annex', 1, 121, 12], ['R5', 'annex', 0, 180, 12],
     ['R6', 'annex', 0, 120, 12], ['R7', 'annex', 0, 120, 0]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 150, 0], ['R1', 'annex', 0, 121, 30], ['R2', 'main', 0, 150, 0],
     ['R3', 'main', 0, 90, 12]],
    2],
   [['annex', 0, 1, 1]]),
  ('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', 'main', 0, 120, 0], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 60, 0],
     ['R3', 'main', 0, 180, 30], ['R4', 'annex', 1, 150, 30], ['R5', 'annex', 1, 90, 0]],
    2],
   [['annex', 1, 1, 1], ['main', 0, 2, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 121, 12]], 3], [['annex', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 1, 120, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 60, 30],
     ['R3', 'annex', 1, 180, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 121, 12],
     ['R6', 'annex', 1, 180, 30]],
    2],
   [['annex', 1, 3, 2]]),
  ('normal control 8',
   [[['R0', 'annex', 1, 120, 0], ['R1', 'annex', 0, 60, 12], ['R2', 'main', 1, 60, 30]], 2], [])],
 [('regression: relief ceiling 1',
   [[['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]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'annex', 0, 150, 0], ['R1', 'annex', 0, 60, 30], ['R2', 'main', 0, 120, 0],
     ['R3', 'main', 0, 90, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 1, 60, 30]],
    3],
   [['annex', 1, 1, 1]]),
  ('partial repair guard 3', [[['R0', 'main', 1, 150, 30]], 3], [['main', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
  ('normal control 5',
   [[['R0', 'annex', 1, 120, 0], ['R1', 'annex', 0, 60, 0], ['R2', 'annex', 1, 180, 12],
     ['R3', 'annex', 0, 180, 12], ['R4', 'annex', 0, 150, 12]],
    2],
   [['annex', 0, 2, 1], ['annex', 1, 1, 1]]),
  ('normal control 6',
   [[['R0', 'main', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'main', 1, 121, 12],
     ['R3', 'annex', 0, 180, 0], ['R4', 'main', 0, 121, 12], ['R5', 'annex', 0, 150, 0]],
    3],
   [['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 60, 30], ['R2', 'annex', 1, 90, 0],
     ['R3', 'annex', 0, 90, 0], ['R4', 'annex', 0, 180, 0], ['R5', 'annex', 0, 180, 0],
     ['R6', 'annex', 0, 60, 12], ['R7', 'annex', 0, 121, 0]],
    2],
   []),
  ('normal control 8',
   [[['R0', 'annex', 0, 121, 0], ['R1', 'annex', 1, 150, 0], ['R2', 'annex', 1, 60, 30],
     ['R3', 'annex', 1, 121, 30], ['R4', 'main', 0, 150, 30], ['R5', 'main', 1, 150, 30],
     ['R6', 'main', 0, 150, 30], ['R7', 'main', 1, 150, 0]],
    3],
   [['annex', 1, 1, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]])],
 [('regression: relief ceiling 1', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],
   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'main', 1, 121, 30], ['R1', 'annex', 0, 90, 30], ['R2', 'annex', 1, 120, 30],
     ['R3', 'annex', 0, 90, 0], ['R4', 'main', 1, 121, 12], ['R5', 'annex', 1, 60, 30]],
    3],
   [['main', 1, 2, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 150, 0], ['R1', 'annex', 0, 60, 30], ['R2', 'main', 0, 120, 0],
     ['R3', 'main', 0, 90, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 1, 60, 30]],
    3],
   [['annex', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),
  ('normal control 5',
   [[['R0', 'main', 1, 121, 12], ['R1', 'annex', 1, 120, 0], ['R2', 'annex', 1, 121, 30],
     ['R3', 'main', 1, 150, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 90, 12],
     ['R6', 'main', 0, 121, 30], ['R7', 'annex', 0, 60, 30]],
    3],
   [['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 2, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 1, 121, 0], ['R1', 'main', 1, 121, 30], ['R2', 'annex', 0, 180, 30],
     ['R3', 'main', 1, 90, 12], ['R4', 'main', 1, 180, 30], ['R5', 'annex', 0, 60, 0]],
    3],
   [['annex', 0, 1, 1], ['main', 1, 2, 1]]),
  ('normal control 7',
   [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 1, 90, 12], ['R2', 'main', 0, 90, 0],
     ['R3', 'annex', 1, 120, 30], ['R4', 'main', 0, 121, 12], ['R5', 'annex', 1, 60, 30],
     ['R6', 'annex', 1, 90, 0], ['R7', 'main', 1, 120, 12]],
    3],
   [['main', 0, 1, 1]]),
  ('normal control 8',
   [[['R0', 'annex', 0, 90, 12], ['R1', 'main', 0, 120, 12], ['R2', 'annex', 1, 90, 0],
     ['R3', 'annex', 0, 60, 12], ['R4', 'main', 1, 60, 30], ['R5', 'annex', 0, 120, 12],
     ['R6', 'annex', 1, 90, 12]],
    2],
   [])],
 [('regression: relief ceiling 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: relief ceiling 2',
   [[['R0', 'main', 1, 121, 12], ['R1', 'annex', 1, 180, 0], ['R2', 'annex', 1, 121, 12],
     ['R3', 'main', 0, 120, 0]],
    2],
   [['annex', 1, 1, 1], ['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'annex', 0, 150, 30], ['R2', 'main', 0, 150, 12],
     ['R3', 'annex', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 1, 121, 12]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('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', 'main', 1, 120, 0], ['R1', 'annex', 1, 121, 30], ['R2', 'main', 1, 150, 30],
     ['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 121, 12], ['R5', 'main', 1, 121, 12],
     ['R6', 'annex', 0, 90, 12], ['R7', 'annex', 0, 90, 30]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 2, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 150, 12], ['R1', 'main', 0, 180, 0]], 2], [['annex', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 0, 150, 12], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 60, 12],
     ['R3', 'annex', 1, 120, 12]],
    3],
   [['main', 0, 1, 1]]),
  ('normal control 8',
   [[['R0', 'main', 0, 90, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'annex', 1, 90, 12],
     ['R3', 'main', 0, 60, 0], ['R4', 'main', 0, 60, 30], ['R5', 'main', 1, 120, 0]],
    2],
   [['annex', 0, 1, 1]])],
 [('regression: relief ceiling 1',
   [[['R0', 'main', 1, 150, 30], ['R1', 'annex', 0, 150, 30], ['R2', 'annex', 0, 90, 30],
     ['R3', 'main', 0, 90, 30], ['R4', 'main', 0, 150, 0]],
    3],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 90, 30],
     ['R3', 'annex', 0, 90, 0], ['R4', 'annex', 0, 121, 30], ['R5', 'main', 1, 121, 12]],
    2],
   [['annex', 0, 1, 1], ['main', 1, 3, 2]]),
  ('partial repair guard 3',
   [[['R0', 'main', 0, 180, 12], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],
     ['R3', 'main', 0, 180, 0], ['R4', 'annex', 1, 180, 30], ['R5', 'annex', 1, 120, 30],
     ['R6', 'annex', 1, 180, 0], ['R7', 'main', 1, 150, 12]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),
  ('normal control 5', [[['R0', 'main', 1, 150, 30], ['R1', 'annex', 0, 121, 12]], 2],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 60, 30]], 3], []),
  ('normal control 7', [[['R0', 'annex', 1, 121, 0]], 3], []),
  ('normal control 8',
   [[['R0', 'main', 1, 150, 12], ['R1', 'annex', 1, 60, 0], ['R2', 'annex', 0, 90, 30],
     ['R3', 'annex', 0, 60, 0], ['R4', 'main', 1, 180, 0]],
    2],
   [['main', 1, 1, 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: relief ceiling 1[['main', 0, 1, 0]][['main', 0, 1, 1]]Failed
regression variant: relief ceiling 2[['annex', 0, 1, 0], ['annex', 1, 1, 0], ['main', 1, 1, 0]][['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 1, 1]]Failed
partial repair guard 3[['annex', 0, 1, 0]][['annex', 0, 1, 1]]Failed
boundary control 4[['annex', 0, 1, 0], ['main', 0, 1, 0]][['annex', 0, 1, 1], ['main', 0, 1, 1]]Failed
normal control 5[['annex', 1, 1, 0], ['main', 0, 2, 1]][['annex', 1, 1, 1], ['main', 0, 2, 1]]Failed
normal control 6[['annex', 0, 1, 0]][['annex', 0, 1, 1]]Failed
normal control 7[['annex', 1, 3, 1]][['annex', 1, 3, 2]]Failed
normal control 8[][]Passed

SHA-256 / b7c463db4e3e4baa2ad9b4386764e40d8d514edd5e5ddef5390bb7cb41eca79f

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 > 120 and n > 0:
            groups[(venue, p)] = groups.get((venue, p), 0) + 1
    return [[v, p, c, c // per_relief + (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: relief ceiling 1', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'annex', 1, 180, 0], ['R1', 'main', 1, 121, 30], ['R2', 'annex', 1, 60, 0],
     ['R3', 'main', 1, 121, 0], ['R4', 'annex', 1, 121, 12], ['R5', 'annex', 0, 180, 12],
     ['R6', 'annex', 0, 120, 12], ['R7', 'annex', 0, 120, 0]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 150, 0], ['R1', 'annex', 0, 121, 30], ['R2', 'main', 0, 150, 0],
     ['R3', 'main', 0, 90, 12]],
    2],
   [['annex', 0, 1, 1]]),
  ('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', 'main', 0, 120, 0], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 60, 0],
     ['R3', 'main', 0, 180, 30], ['R4', 'annex', 1, 150, 30], ['R5', 'annex', 1, 90, 0]],
    2],
   [['annex', 1, 1, 1], ['main', 0, 2, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 121, 12]], 3], [['annex', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 1, 120, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 60, 30],
     ['R3', 'annex', 1, 180, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 121, 12],
     ['R6', 'annex', 1, 180, 30]],
    2],
   [['annex', 1, 3, 2]]),
  ('normal control 8',
   [[['R0', 'annex', 1, 120, 0], ['R1', 'annex', 0, 60, 12], ['R2', 'main', 1, 60, 30]], 2], [])],
 [('regression: relief ceiling 1',
   [[['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]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'annex', 0, 150, 0], ['R1', 'annex', 0, 60, 30], ['R2', 'main', 0, 120, 0],
     ['R3', 'main', 0, 90, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 1, 60, 30]],
    3],
   [['annex', 1, 1, 1]]),
  ('partial repair guard 3', [[['R0', 'main', 1, 150, 30]], 3], [['main', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
  ('normal control 5',
   [[['R0', 'annex', 1, 120, 0], ['R1', 'annex', 0, 60, 0], ['R2', 'annex', 1, 180, 12],
     ['R3', 'annex', 0, 180, 12], ['R4', 'annex', 0, 150, 12]],
    2],
   [['annex', 0, 2, 1], ['annex', 1, 1, 1]]),
  ('normal control 6',
   [[['R0', 'main', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'main', 1, 121, 12],
     ['R3', 'annex', 0, 180, 0], ['R4', 'main', 0, 121, 12], ['R5', 'annex', 0, 150, 0]],
    3],
   [['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 60, 30], ['R2', 'annex', 1, 90, 0],
     ['R3', 'annex', 0, 90, 0], ['R4', 'annex', 0, 180, 0], ['R5', 'annex', 0, 180, 0],
     ['R6', 'annex', 0, 60, 12], ['R7', 'annex', 0, 121, 0]],
    2],
   []),
  ('normal control 8',
   [[['R0', 'annex', 0, 121, 0], ['R1', 'annex', 1, 150, 0], ['R2', 'annex', 1, 60, 30],
     ['R3', 'annex', 1, 121, 30], ['R4', 'main', 0, 150, 30], ['R5', 'main', 1, 150, 30],
     ['R6', 'main', 0, 150, 30], ['R7', 'main', 1, 150, 0]],
    3],
   [['annex', 1, 1, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]])],
 [('regression: relief ceiling 1', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],
   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'main', 1, 121, 30], ['R1', 'annex', 0, 90, 30], ['R2', 'annex', 1, 120, 30],
     ['R3', 'annex', 0, 90, 0], ['R4', 'main', 1, 121, 12], ['R5', 'annex', 1, 60, 30]],
    3],
   [['main', 1, 2, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 150, 0], ['R1', 'annex', 0, 60, 30], ['R2', 'main', 0, 120, 0],
     ['R3', 'main', 0, 90, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 1, 60, 30]],
    3],
   [['annex', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),
  ('normal control 5',
   [[['R0', 'main', 1, 121, 12], ['R1', 'annex', 1, 120, 0], ['R2', 'annex', 1, 121, 30],
     ['R3', 'main', 1, 150, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 90, 12],
     ['R6', 'main', 0, 121, 30], ['R7', 'annex', 0, 60, 30]],
    3],
   [['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 2, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 1, 121, 0], ['R1', 'main', 1, 121, 30], ['R2', 'annex', 0, 180, 30],
     ['R3', 'main', 1, 90, 12], ['R4', 'main', 1, 180, 30], ['R5', 'annex', 0, 60, 0]],
    3],
   [['annex', 0, 1, 1], ['main', 1, 2, 1]]),
  ('normal control 7',
   [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 1, 90, 12], ['R2', 'main', 0, 90, 0],
     ['R3', 'annex', 1, 120, 30], ['R4', 'main', 0, 121, 12], ['R5', 'annex', 1, 60, 30],
     ['R6', 'annex', 1, 90, 0], ['R7', 'main', 1, 120, 12]],
    3],
   [['main', 0, 1, 1]]),
  ('normal control 8',
   [[['R0', 'annex', 0, 90, 12], ['R1', 'main', 0, 120, 12], ['R2', 'annex', 1, 90, 0],
     ['R3', 'annex', 0, 60, 12], ['R4', 'main', 1, 60, 30], ['R5', 'annex', 0, 120, 12],
     ['R6', 'annex', 1, 90, 12]],
    2],
   [])],
 [('regression: relief ceiling 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: relief ceiling 2',
   [[['R0', 'main', 1, 121, 12], ['R1', 'annex', 1, 180, 0], ['R2', 'annex', 1, 121, 12],
     ['R3', 'main', 0, 120, 0]],
    2],
   [['annex', 1, 1, 1], ['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'annex', 0, 150, 30], ['R2', 'main', 0, 150, 12],
     ['R3', 'annex', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 1, 121, 12]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('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', 'main', 1, 120, 0], ['R1', 'annex', 1, 121, 30], ['R2', 'main', 1, 150, 30],
     ['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 121, 12], ['R5', 'main', 1, 121, 12],
     ['R6', 'annex', 0, 90, 12], ['R7', 'annex', 0, 90, 30]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 2, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 150, 12], ['R1', 'main', 0, 180, 0]], 2], [['annex', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 0, 150, 12], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 60, 12],
     ['R3', 'annex', 1, 120, 12]],
    3],
   [['main', 0, 1, 1]]),
  ('normal control 8',
   [[['R0', 'main', 0, 90, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'annex', 1, 90, 12],
     ['R3', 'main', 0, 60, 0], ['R4', 'main', 0, 60, 30], ['R5', 'main', 1, 120, 0]],
    2],
   [['annex', 0, 1, 1]])],
 [('regression: relief ceiling 1',
   [[['R0', 'main', 1, 150, 30], ['R1', 'annex', 0, 150, 30], ['R2', 'annex', 0, 90, 30],
     ['R3', 'main', 0, 90, 30], ['R4', 'main', 0, 150, 0]],
    3],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 90, 30],
     ['R3', 'annex', 0, 90, 0], ['R4', 'annex', 0, 121, 30], ['R5', 'main', 1, 121, 12]],
    2],
   [['annex', 0, 1, 1], ['main', 1, 3, 2]]),
  ('partial repair guard 3',
   [[['R0', 'main', 0, 180, 12], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],
     ['R3', 'main', 0, 180, 0], ['R4', 'annex', 1, 180, 30], ['R5', 'annex', 1, 120, 30],
     ['R6', 'annex', 1, 180, 0], ['R7', 'main', 1, 150, 12]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),
  ('normal control 5', [[['R0', 'main', 1, 150, 30], ['R1', 'annex', 0, 121, 12]], 2],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 60, 30]], 3], []),
  ('normal control 7', [[['R0', 'annex', 1, 121, 0]], 3], []),
  ('normal control 8',
   [[['R0', 'main', 1, 150, 12], ['R1', 'annex', 1, 60, 0], ['R2', 'annex', 0, 90, 30],
     ['R3', 'annex', 0, 60, 0], ['R4', 'main', 1, 180, 0]],
    2],
   [['main', 1, 1, 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: relief ceiling 1[['main', 0, 1, 0]][['main', 0, 1, 1]]Failed
regression variant: relief ceiling 2[['annex', 0, 1, 0], ['annex', 1, 1, 0], ['main', 1, 1, 0]][['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 1, 1]]Failed
partial repair guard 3[['annex', 0, 1, 0]][['annex', 0, 1, 1]]Failed
boundary control 4[['annex', 0, 1, 0], ['main', 0, 1, 0]][['annex', 0, 1, 1], ['main', 0, 1, 1]]Failed
normal control 5[['annex', 1, 1, 0], ['main', 0, 2, 1]][['annex', 1, 1, 1], ['main', 0, 2, 1]]Failed
normal control 6[['annex', 0, 1, 0]][['annex', 0, 1, 1]]Failed
normal control 7[['annex', 1, 3, 2]][['annex', 1, 3, 2]]Passed
normal control 8[][]Passed

SHA-256 / 6c0b0a1b31f8ab8263b8762317ef1aa3ff97cc273f1c5297258a26e7ae954a74

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: relief ceiling 1', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'annex', 1, 180, 0], ['R1', 'main', 1, 121, 30], ['R2', 'annex', 1, 60, 0],
     ['R3', 'main', 1, 121, 0], ['R4', 'annex', 1, 121, 12], ['R5', 'annex', 0, 180, 12],
     ['R6', 'annex', 0, 120, 12], ['R7', 'annex', 0, 120, 0]],
    3],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 150, 0], ['R1', 'annex', 0, 121, 30], ['R2', 'main', 0, 150, 0],
     ['R3', 'main', 0, 90, 12]],
    2],
   [['annex', 0, 1, 1]]),
  ('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', 'main', 0, 120, 0], ['R1', 'main', 0, 121, 12], ['R2', 'main', 0, 60, 0],
     ['R3', 'main', 0, 180, 30], ['R4', 'annex', 1, 150, 30], ['R5', 'annex', 1, 90, 0]],
    2],
   [['annex', 1, 1, 1], ['main', 0, 2, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 121, 12]], 3], [['annex', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 1, 120, 0], ['R1', 'main', 0, 90, 0], ['R2', 'annex', 1, 60, 30],
     ['R3', 'annex', 1, 180, 30], ['R4', 'annex', 0, 150, 0], ['R5', 'annex', 1, 121, 12],
     ['R6', 'annex', 1, 180, 30]],
    2],
   [['annex', 1, 3, 2]]),
  ('normal control 8',
   [[['R0', 'annex', 1, 120, 0], ['R1', 'annex', 0, 60, 12], ['R2', 'main', 1, 60, 30]], 2], [])],
 [('regression: relief ceiling 1',
   [[['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]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'annex', 0, 150, 0], ['R1', 'annex', 0, 60, 30], ['R2', 'main', 0, 120, 0],
     ['R3', 'main', 0, 90, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 1, 60, 30]],
    3],
   [['annex', 1, 1, 1]]),
  ('partial repair guard 3', [[['R0', 'main', 1, 150, 30]], 3], [['main', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 121, 10]], 3], [['main', 0, 1, 1]]),
  ('normal control 5',
   [[['R0', 'annex', 1, 120, 0], ['R1', 'annex', 0, 60, 0], ['R2', 'annex', 1, 180, 12],
     ['R3', 'annex', 0, 180, 12], ['R4', 'annex', 0, 150, 12]],
    2],
   [['annex', 0, 2, 1], ['annex', 1, 1, 1]]),
  ('normal control 6',
   [[['R0', 'main', 1, 150, 0], ['R1', 'main', 0, 120, 30], ['R2', 'main', 1, 121, 12],
     ['R3', 'annex', 0, 180, 0], ['R4', 'main', 0, 121, 12], ['R5', 'annex', 0, 150, 0]],
    3],
   [['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 0, 120, 30], ['R1', 'annex', 0, 60, 30], ['R2', 'annex', 1, 90, 0],
     ['R3', 'annex', 0, 90, 0], ['R4', 'annex', 0, 180, 0], ['R5', 'annex', 0, 180, 0],
     ['R6', 'annex', 0, 60, 12], ['R7', 'annex', 0, 121, 0]],
    2],
   []),
  ('normal control 8',
   [[['R0', 'annex', 0, 121, 0], ['R1', 'annex', 1, 150, 0], ['R2', 'annex', 1, 60, 30],
     ['R3', 'annex', 1, 121, 30], ['R4', 'main', 0, 150, 30], ['R5', 'main', 1, 150, 30],
     ['R6', 'main', 0, 150, 30], ['R7', 'main', 1, 150, 0]],
    3],
   [['annex', 1, 1, 1], ['main', 0, 2, 1], ['main', 1, 1, 1]])],
 [('regression: relief ceiling 1', [[['R1', 'main', 0, 180, 10], ['R2', 'annex', 0, 180, 10]], 3],
   [['annex', 0, 1, 1], ['main', 0, 1, 1]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'main', 1, 121, 30], ['R1', 'annex', 0, 90, 30], ['R2', 'annex', 1, 120, 30],
     ['R3', 'annex', 0, 90, 0], ['R4', 'main', 1, 121, 12], ['R5', 'annex', 1, 60, 30]],
    3],
   [['main', 1, 2, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 0, 150, 0], ['R1', 'annex', 0, 60, 30], ['R2', 'main', 0, 120, 0],
     ['R3', 'main', 0, 90, 0], ['R4', 'annex', 1, 150, 12], ['R5', 'main', 1, 60, 30]],
    3],
   [['annex', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 180, 0]], 2], []),
  ('normal control 5',
   [[['R0', 'main', 1, 121, 12], ['R1', 'annex', 1, 120, 0], ['R2', 'annex', 1, 121, 30],
     ['R3', 'main', 1, 150, 12], ['R4', 'annex', 1, 90, 12], ['R5', 'main', 1, 90, 12],
     ['R6', 'main', 0, 121, 30], ['R7', 'annex', 0, 60, 30]],
    3],
   [['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 2, 1]]),
  ('normal control 6',
   [[['R0', 'annex', 1, 121, 0], ['R1', 'main', 1, 121, 30], ['R2', 'annex', 0, 180, 30],
     ['R3', 'main', 1, 90, 12], ['R4', 'main', 1, 180, 30], ['R5', 'annex', 0, 60, 0]],
    3],
   [['annex', 0, 1, 1], ['main', 1, 2, 1]]),
  ('normal control 7',
   [[['R0', 'annex', 1, 90, 0], ['R1', 'main', 1, 90, 12], ['R2', 'main', 0, 90, 0],
     ['R3', 'annex', 1, 120, 30], ['R4', 'main', 0, 121, 12], ['R5', 'annex', 1, 60, 30],
     ['R6', 'annex', 1, 90, 0], ['R7', 'main', 1, 120, 12]],
    3],
   [['main', 0, 1, 1]]),
  ('normal control 8',
   [[['R0', 'annex', 0, 90, 12], ['R1', 'main', 0, 120, 12], ['R2', 'annex', 1, 90, 0],
     ['R3', 'annex', 0, 60, 12], ['R4', 'main', 1, 60, 30], ['R5', 'annex', 0, 120, 12],
     ['R6', 'annex', 1, 90, 12]],
    2],
   [])],
 [('regression: relief ceiling 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: relief ceiling 2',
   [[['R0', 'main', 1, 121, 12], ['R1', 'annex', 1, 180, 0], ['R2', 'annex', 1, 121, 12],
     ['R3', 'main', 0, 120, 0]],
    2],
   [['annex', 1, 1, 1], ['main', 1, 1, 1]]),
  ('partial repair guard 3',
   [[['R0', 'annex', 1, 120, 12], ['R1', 'annex', 0, 150, 30], ['R2', 'main', 0, 150, 12],
     ['R3', 'annex', 1, 121, 12], ['R4', 'annex', 1, 120, 0], ['R5', 'main', 1, 121, 12]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('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', 'main', 1, 120, 0], ['R1', 'annex', 1, 121, 30], ['R2', 'main', 1, 150, 30],
     ['R3', 'main', 1, 60, 12], ['R4', 'annex', 0, 121, 12], ['R5', 'main', 1, 121, 12],
     ['R6', 'annex', 0, 90, 12], ['R7', 'annex', 0, 90, 30]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 2, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 150, 12], ['R1', 'main', 0, 180, 0]], 2], [['annex', 0, 1, 1]]),
  ('normal control 7',
   [[['R0', 'main', 0, 150, 12], ['R1', 'main', 1, 150, 0], ['R2', 'annex', 0, 60, 12],
     ['R3', 'annex', 1, 120, 12]],
    3],
   [['main', 0, 1, 1]]),
  ('normal control 8',
   [[['R0', 'main', 0, 90, 0], ['R1', 'annex', 0, 121, 12], ['R2', 'annex', 1, 90, 12],
     ['R3', 'main', 0, 60, 0], ['R4', 'main', 0, 60, 30], ['R5', 'main', 1, 120, 0]],
    2],
   [['annex', 0, 1, 1]])],
 [('regression: relief ceiling 1',
   [[['R0', 'main', 1, 150, 30], ['R1', 'annex', 0, 150, 30], ['R2', 'annex', 0, 90, 30],
     ['R3', 'main', 0, 90, 30], ['R4', 'main', 0, 150, 0]],
    3],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('regression variant: relief ceiling 2',
   [[['R0', 'main', 1, 150, 12], ['R1', 'main', 1, 150, 30], ['R2', 'main', 0, 90, 30],
     ['R3', 'annex', 0, 90, 0], ['R4', 'annex', 0, 121, 30], ['R5', 'main', 1, 121, 12]],
    2],
   [['annex', 0, 1, 1], ['main', 1, 3, 2]]),
  ('partial repair guard 3',
   [[['R0', 'main', 0, 180, 12], ['R1', 'annex', 0, 150, 0], ['R2', 'annex', 0, 150, 12],
     ['R3', 'main', 0, 180, 0], ['R4', 'annex', 1, 180, 30], ['R5', 'annex', 1, 120, 30],
     ['R6', 'annex', 1, 180, 0], ['R7', 'main', 1, 150, 12]],
    2],
   [['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 0, 1, 1], ['main', 1, 1, 1]]),
  ('boundary control 4', [[['R1', 'main', 0, 120, 10]], 3], []),
  ('normal control 5', [[['R0', 'main', 1, 150, 30], ['R1', 'annex', 0, 121, 12]], 2],
   [['annex', 0, 1, 1], ['main', 1, 1, 1]]),
  ('normal control 6', [[['R0', 'annex', 0, 60, 30]], 3], []),
  ('normal control 7', [[['R0', 'annex', 1, 121, 0]], 3], []),
  ('normal control 8',
   [[['R0', 'main', 1, 150, 12], ['R1', 'annex', 1, 60, 0], ['R2', 'annex', 0, 90, 30],
     ['R3', 'annex', 0, 60, 0], ['R4', 'main', 1, 180, 0]],
    2],
   [['main', 1, 1, 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: relief ceiling 1[['main', 0, 1, 1]][['main', 0, 1, 1]]Passed
regression variant: relief ceiling 2[['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 1, 1]][['annex', 0, 1, 1], ['annex', 1, 1, 1], ['main', 1, 1, 1]]Passed
partial repair guard 3[['annex', 0, 1, 1]][['annex', 0, 1, 1]]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', 1, 1, 1], ['main', 0, 2, 1]][['annex', 1, 1, 1], ['main', 0, 2, 1]]Passed
normal control 6[['annex', 0, 1, 1]][['annex', 0, 1, 1]]Passed
normal control 7[['annex', 1, 3, 2]][['annex', 1, 3, 2]]Passed
normal control 8[][]Passed

SHA-256 / 29653167ce2c9a5f990f9fc70ce95f64eac614712cc1fe91374b71fd602f93a8

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:07.969315+00:00.

Case digest / 7fc3fa7e3ec20149b4588a006c458764100323367f4ff839ebc2d5fc83c6140a