FA-94761 / Exam timetabling constraints / Open access
Under-assigned staff never flagged · case 01
Staff carrying far fewer duties than their share pass the report.
ROOT CAUSE
Only positive deviations are tested.
VERIFIED REPAIR
Flag absolute deviations above one.
Unsuccessful approach: An inclusive threshold flags deviations of exactly one.
Case contract
staff [name, FTE percent, duties assigned] and total duties. Each target is total * FTE / sum of FTE rounded half up. Deviation = assigned - target; flag staff whose absolute deviation exceeds one. Return [[name, target, deviation], flagged names].
Why this case matters
Invigilation duties are distributed pro rata to contracted hours; fairness reports drive reallocation.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(staff, total):
tot_fte = sum(f for n, f, a in staff)
rows = []
flag = []
for n, f, a in staff:
num = total * f * 2 + tot_fte
target = num // (2 * tot_fte) if tot_fte else 0
dev = a - target
rows.append([n, target, dev])
if dev > 1:
flag.append(n)
return [rows, flag]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: deviation flag 1', [[['a', 50, 3], ['b', 50, 2]], 7], [[['a', 4, -1], ['b', 4, -2]], ['b']]),
('regression variant: deviation flag 2', [[['st0', 50, 4], ['st1', 100, 4]], 25],
[[['st0', 8, -4], ['st1', 17, -13]], ['st0', 'st1']]),
('partial repair guard 3',
[[['st0', 100, 8], ['st1', 20, 4], ['st2', 100, 3], ['st3', 80, 10], ['st4', 100, 9]], 30],
[[['st0', 8, 0], ['st1', 2, 2], ['st2', 8, -5], ['st3', 6, 4], ['st4', 8, 1]], ['st1', 'st2', 'st3']]),
('boundary control 4', [[['a', 25, 1], ['b', 75, 4]], 10], [[['a', 3, -2], ['b', 8, -4]], ['a', 'b']]),
('normal control 5', [[['st0', 60, 0], ['st1', 50, 1], ['st2', 20, 8], ['st3', 80, 5], ['st4', 50, 2]], 10],
[[['st0', 2, -2], ['st1', 2, -1], ['st2', 1, 7], ['st3', 3, 2], ['st4', 2, 0]], ['st0', 'st2', 'st3']]),
('normal control 6', [[['st0', 20, 0], ['st1', 80, 3], ['st2', 80, 3], ['st3', 60, 11]], 7],
[[['st0', 1, -1], ['st1', 2, 1], ['st2', 2, 1], ['st3', 2, 9]], ['st3']]),
('normal control 7', [[['st0', 50, 11], ['st1', 80, 10], ['st2', 60, 0], ['st3', 80, 9]], 15],
[[['st0', 3, 8], ['st1', 4, 6], ['st2', 3, -3], ['st3', 4, 5]], ['st0', 'st1', 'st2', 'st3']]),
('normal control 8', [[['st0', 60, 4], ['st1', 80, 6], ['st2', 50, 7], ['st3', 50, 6]], 30],
[[['st0', 8, -4], ['st1', 10, -4], ['st2', 6, 1], ['st3', 6, 0]], ['st0', 'st1']])],
[('regression: deviation flag 1', [[['a', 25, 1], ['b', 75, 4]], 10],
[[['a', 3, -2], ['b', 8, -4]], ['a', 'b']]),
('regression variant: deviation flag 2', [[['st0', 20, 8], ['st1', 50, 8]], 15],
[[['st0', 4, 4], ['st1', 11, -3]], ['st0', 'st1']]),
('partial repair guard 3',
[[['st0', 100, 2], ['st1', 80, 2], ['st2', 100, 5], ['st3', 100, 12], ['st4', 20, 8]], 25],
[[['st0', 6, -4], ['st1', 5, -3], ['st2', 6, -1], ['st3', 6, 6], ['st4', 1, 7]],
['st0', 'st1', 'st3', 'st4']]),
('boundary control 4', [[['a', 50, 3], ['b', 50, 2]], 7], [[['a', 4, -1], ['b', 4, -2]], ['b']]),
('normal control 5',
[[['st0', 50, 4], ['st1', 100, 11], ['st2', 60, 6], ['st3', 20, 7], ['st4', 80, 0]], 20],
[[['st0', 3, 1], ['st1', 6, 5], ['st2', 4, 2], ['st3', 1, 6], ['st4', 5, -5]],
['st1', 'st2', 'st3', 'st4']]),
('normal control 6',
[[['st0', 50, 4], ['st1', 20, 1], ['st2', 20, 10], ['st3', 80, 10], ['st4', 60, 8]], 25],
[[['st0', 5, -1], ['st1', 2, -1], ['st2', 2, 8], ['st3', 9, 1], ['st4', 7, 1]], ['st2']]),
('normal control 7', [[['st0', 80, 10], ['st1', 60, 5]], 25],
[[['st0', 14, -4], ['st1', 11, -6]], ['st0', 'st1']]),
('normal control 8',
[[['st0', 80, 6], ['st1', 100, 6], ['st2', 50, 2], ['st3', 100, 10], ['st4', 50, 4]], 10],
[[['st0', 2, 4], ['st1', 3, 3], ['st2', 1, 1], ['st3', 3, 7], ['st4', 1, 3]],
['st0', 'st1', 'st3', 'st4']])],
[('regression: deviation flag 1', [[['a', 100, 2], ['b', 50, 5]], 9],
[[['a', 6, -4], ['b', 3, 2]], ['a', 'b']]),
('regression variant: deviation flag 2', [[['st0', 80, 3], ['st1', 50, 9], ['st2', 20, 11]], 10],
[[['st0', 5, -2], ['st1', 3, 6], ['st2', 1, 10]], ['st0', 'st1', 'st2']]),
('partial repair guard 3', [[['st0', 60, 10], ['st1', 100, 6]], 25],
[[['st0', 9, 1], ['st1', 16, -10]], ['st1']]),
('normal control 4',
[[['st0', 20, 4], ['st1', 100, 2], ['st2', 20, 10], ['st3', 60, 2], ['st4', 80, 2]], 30],
[[['st0', 2, 2], ['st1', 11, -9], ['st2', 2, 8], ['st3', 6, -4], ['st4', 9, -7]],
['st0', 'st1', 'st2', 'st3', 'st4']]),
('normal control 5', [[['st0', 60, 4], ['st1', 100, 3]], 20],
[[['st0', 8, -4], ['st1', 13, -10]], ['st0', 'st1']]),
('normal control 6', [[['st0', 50, 11], ['st1', 80, 0]], 25],
[[['st0', 10, 1], ['st1', 15, -15]], ['st1']]),
('normal control 7', [[['st0', 50, 4], ['st1', 100, 6], ['st2', 60, 8]], 25],
[[['st0', 6, -2], ['st1', 12, -6], ['st2', 7, 1]], ['st0', 'st1']]),
('normal control 8', [[['st0', 100, 6], ['st1', 100, 11], ['st2', 100, 1], ['st3', 60, 5]], 7],
[[['st0', 2, 4], ['st1', 2, 9], ['st2', 2, -1], ['st3', 1, 4]], ['st0', 'st1', 'st3']])],
[('regression: deviation flag 1',
[[['st0', 50, 4], ['st1', 100, 7], ['st2', 20, 4], ['st3', 60, 7], ['st4', 50, 0]], 25],
[[['st0', 4, 0], ['st1', 9, -2], ['st2', 2, 2], ['st3', 5, 2], ['st4', 4, -4]],
['st1', 'st2', 'st3', 'st4']]),
('regression variant: deviation flag 2', [[['st0', 100, 10], ['st1', 20, 6], ['st2', 100, 5]], 15],
[[['st0', 7, 3], ['st1', 1, 5], ['st2', 7, -2]], ['st0', 'st1', 'st2']]),
('partial repair guard 3',
[[['st0', 80, 1], ['st1', 20, 10], ['st2', 80, 12], ['st3', 80, 0], ['st4', 60, 3]], 7],
[[['st0', 2, -1], ['st1', 0, 10], ['st2', 2, 10], ['st3', 2, -2], ['st4', 1, 2]],
['st1', 'st2', 'st3', 'st4']]),
('boundary control 4', [[['a', 100, 3], ['b', 100, 4]], 7], [[['a', 4, -1], ['b', 4, 0]], []]),
('normal control 5',
[[['st0', 60, 5], ['st1', 60, 0], ['st2', 50, 8], ['st3', 50, 3], ['st4', 50, 10]], 10],
[[['st0', 2, 3], ['st1', 2, -2], ['st2', 2, 6], ['st3', 2, 1], ['st4', 2, 8]],
['st0', 'st1', 'st2', 'st4']]),
('normal control 6', [[['st0', 50, 12], ['st1', 20, 8]], 20],
[[['st0', 14, -2], ['st1', 6, 2]], ['st0', 'st1']]),
('normal control 7', [[['st0', 20, 11], ['st1', 50, 12]], 15], [[['st0', 4, 7], ['st1', 11, 1]], ['st0']]),
('normal control 8', [[['st0', 50, 10], ['st1', 20, 12], ['st2', 20, 4]], 15],
[[['st0', 8, 2], ['st1', 3, 9], ['st2', 3, 1]], ['st0', 'st1']])],
[('regression: deviation flag 1',
[[['st0', 50, 10], ['st1', 100, 4], ['st2', 100, 0], ['st3', 20, 0], ['st4', 80, 3]], 7],
[[['st0', 1, 9], ['st1', 2, 2], ['st2', 2, -2], ['st3', 0, 0], ['st4', 2, 1]], ['st0', 'st1', 'st2']]),
('regression variant: deviation flag 2',
[[['st0', 80, 1], ['st1', 20, 10], ['st2', 80, 12], ['st3', 80, 0], ['st4', 60, 3]], 7],
[[['st0', 2, -1], ['st1', 0, 10], ['st2', 2, 10], ['st3', 2, -2], ['st4', 1, 2]],
['st1', 'st2', 'st3', 'st4']]),
('partial repair guard 3', [[['st0', 60, 4], ['st1', 60, 2], ['st2', 60, 0], ['st3', 20, 10]], 15],
[[['st0', 5, -1], ['st1', 5, -3], ['st2', 5, -5], ['st3', 2, 8]], ['st1', 'st2', 'st3']]),
('boundary control 4', [[['a', 50, 5], ['b', 50, 5]], 5], [[['a', 3, 2], ['b', 3, 2]], ['a', 'b']]),
('normal control 5', [[['st0', 100, 1], ['st1', 20, 12], ['st2', 60, 0], ['st3', 100, 2]], 15],
[[['st0', 5, -4], ['st1', 1, 11], ['st2', 3, -3], ['st3', 5, -3]], ['st0', 'st1', 'st2', 'st3']]),
('normal control 6', [[['st0', 100, 8], ['st1', 60, 5], ['st2', 20, 4]], 20],
[[['st0', 11, -3], ['st1', 7, -2], ['st2', 2, 2]], ['st0', 'st1', 'st2']]),
('normal control 7', [[['st0', 100, 12], ['st1', 50, 9], ['st2', 100, 10]], 10],
[[['st0', 4, 8], ['st1', 2, 7], ['st2', 4, 6]], ['st0', 'st1', 'st2']]),
('normal control 8', [[['st0', 100, 0], ['st1', 80, 6], ['st2', 50, 7], ['st3', 80, 5]], 25],
[[['st0', 8, -8], ['st1', 6, 0], ['st2', 4, 3], ['st3', 6, -1]], ['st0', 'st2']])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: deviation flag 1 | [[['a', 4, -1], ['b', 4, -2]], []] | [[['a', 4, -1], ['b', 4, -2]], ['b']] | Failed |
| regression variant: deviation flag 2 | [[['st0', 8, -4], ['st1', 17, -13]], []] | [[['st0', 8, -4], ['st1', 17, -13]], ['st0', 'st1']] | Failed |
| partial repair guard 3 | [[['st0', 8, 0], ['st1', 2, 2], ['st2', 8, -5], ['st3', 6, 4], ['st4', 8, 1]], ['st1', 'st3']] | [[['st0', 8, 0], ['st1', 2, 2], ['st2', 8, -5], ['st3', 6, 4], ['st4', 8, 1]], ['st1', 'st2', 'st3']] | Failed |
| boundary control 4 | [[['a', 3, -2], ['b', 8, -4]], []] | [[['a', 3, -2], ['b', 8, -4]], ['a', 'b']] | Failed |
| normal control 5 | [[['st0', 2, -2], ['st1', 2, -1], ['st2', 1, 7], ['st3', 3, 2], ['st4', 2, 0]], ['st2', 'st3']] | [[['st0', 2, -2], ['st1', 2, -1], ['st2', 1, 7], ['st3', 3, 2], ['st4', 2, 0]], ['st0', 'st2', 'st3']] | Failed |
| normal control 6 | [[['st0', 1, -1], ['st1', 2, 1], ['st2', 2, 1], ['st3', 2, 9]], ['st3']] | [[['st0', 1, -1], ['st1', 2, 1], ['st2', 2, 1], ['st3', 2, 9]], ['st3']] | Passed |
| normal control 7 | [[['st0', 3, 8], ['st1', 4, 6], ['st2', 3, -3], ['st3', 4, 5]], ['st0', 'st1', 'st3']] | [[['st0', 3, 8], ['st1', 4, 6], ['st2', 3, -3], ['st3', 4, 5]], ['st0', 'st1', 'st2', 'st3']] | Failed |
| normal control 8 | [[['st0', 8, -4], ['st1', 10, -4], ['st2', 6, 1], ['st3', 6, 0]], []] | [[['st0', 8, -4], ['st1', 10, -4], ['st2', 6, 1], ['st3', 6, 0]], ['st0', 'st1']] | Failed |
SHA-256 / 94e1b02592d6d7cb25dcf5d36c736c22eaa4ff8055d1aa674c48bbaecddfd209
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(staff, total):
tot_fte = sum(f for n, f, a in staff)
rows = []
flag = []
for n, f, a in staff:
num = total * f * 2 + tot_fte
target = num // (2 * tot_fte) if tot_fte else 0
dev = a - target
rows.append([n, target, dev])
if abs(dev) >= 1:
flag.append(n)
return [rows, flag]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: deviation flag 1', [[['a', 50, 3], ['b', 50, 2]], 7], [[['a', 4, -1], ['b', 4, -2]], ['b']]),
('regression variant: deviation flag 2', [[['st0', 50, 4], ['st1', 100, 4]], 25],
[[['st0', 8, -4], ['st1', 17, -13]], ['st0', 'st1']]),
('partial repair guard 3',
[[['st0', 100, 8], ['st1', 20, 4], ['st2', 100, 3], ['st3', 80, 10], ['st4', 100, 9]], 30],
[[['st0', 8, 0], ['st1', 2, 2], ['st2', 8, -5], ['st3', 6, 4], ['st4', 8, 1]], ['st1', 'st2', 'st3']]),
('boundary control 4', [[['a', 25, 1], ['b', 75, 4]], 10], [[['a', 3, -2], ['b', 8, -4]], ['a', 'b']]),
('normal control 5', [[['st0', 60, 0], ['st1', 50, 1], ['st2', 20, 8], ['st3', 80, 5], ['st4', 50, 2]], 10],
[[['st0', 2, -2], ['st1', 2, -1], ['st2', 1, 7], ['st3', 3, 2], ['st4', 2, 0]], ['st0', 'st2', 'st3']]),
('normal control 6', [[['st0', 20, 0], ['st1', 80, 3], ['st2', 80, 3], ['st3', 60, 11]], 7],
[[['st0', 1, -1], ['st1', 2, 1], ['st2', 2, 1], ['st3', 2, 9]], ['st3']]),
('normal control 7', [[['st0', 50, 11], ['st1', 80, 10], ['st2', 60, 0], ['st3', 80, 9]], 15],
[[['st0', 3, 8], ['st1', 4, 6], ['st2', 3, -3], ['st3', 4, 5]], ['st0', 'st1', 'st2', 'st3']]),
('normal control 8', [[['st0', 60, 4], ['st1', 80, 6], ['st2', 50, 7], ['st3', 50, 6]], 30],
[[['st0', 8, -4], ['st1', 10, -4], ['st2', 6, 1], ['st3', 6, 0]], ['st0', 'st1']])],
[('regression: deviation flag 1', [[['a', 25, 1], ['b', 75, 4]], 10],
[[['a', 3, -2], ['b', 8, -4]], ['a', 'b']]),
('regression variant: deviation flag 2', [[['st0', 20, 8], ['st1', 50, 8]], 15],
[[['st0', 4, 4], ['st1', 11, -3]], ['st0', 'st1']]),
('partial repair guard 3',
[[['st0', 100, 2], ['st1', 80, 2], ['st2', 100, 5], ['st3', 100, 12], ['st4', 20, 8]], 25],
[[['st0', 6, -4], ['st1', 5, -3], ['st2', 6, -1], ['st3', 6, 6], ['st4', 1, 7]],
['st0', 'st1', 'st3', 'st4']]),
('boundary control 4', [[['a', 50, 3], ['b', 50, 2]], 7], [[['a', 4, -1], ['b', 4, -2]], ['b']]),
('normal control 5',
[[['st0', 50, 4], ['st1', 100, 11], ['st2', 60, 6], ['st3', 20, 7], ['st4', 80, 0]], 20],
[[['st0', 3, 1], ['st1', 6, 5], ['st2', 4, 2], ['st3', 1, 6], ['st4', 5, -5]],
['st1', 'st2', 'st3', 'st4']]),
('normal control 6',
[[['st0', 50, 4], ['st1', 20, 1], ['st2', 20, 10], ['st3', 80, 10], ['st4', 60, 8]], 25],
[[['st0', 5, -1], ['st1', 2, -1], ['st2', 2, 8], ['st3', 9, 1], ['st4', 7, 1]], ['st2']]),
('normal control 7', [[['st0', 80, 10], ['st1', 60, 5]], 25],
[[['st0', 14, -4], ['st1', 11, -6]], ['st0', 'st1']]),
('normal control 8',
[[['st0', 80, 6], ['st1', 100, 6], ['st2', 50, 2], ['st3', 100, 10], ['st4', 50, 4]], 10],
[[['st0', 2, 4], ['st1', 3, 3], ['st2', 1, 1], ['st3', 3, 7], ['st4', 1, 3]],
['st0', 'st1', 'st3', 'st4']])],
[('regression: deviation flag 1', [[['a', 100, 2], ['b', 50, 5]], 9],
[[['a', 6, -4], ['b', 3, 2]], ['a', 'b']]),
('regression variant: deviation flag 2', [[['st0', 80, 3], ['st1', 50, 9], ['st2', 20, 11]], 10],
[[['st0', 5, -2], ['st1', 3, 6], ['st2', 1, 10]], ['st0', 'st1', 'st2']]),
('partial repair guard 3', [[['st0', 60, 10], ['st1', 100, 6]], 25],
[[['st0', 9, 1], ['st1', 16, -10]], ['st1']]),
('normal control 4',
[[['st0', 20, 4], ['st1', 100, 2], ['st2', 20, 10], ['st3', 60, 2], ['st4', 80, 2]], 30],
[[['st0', 2, 2], ['st1', 11, -9], ['st2', 2, 8], ['st3', 6, -4], ['st4', 9, -7]],
['st0', 'st1', 'st2', 'st3', 'st4']]),
('normal control 5', [[['st0', 60, 4], ['st1', 100, 3]], 20],
[[['st0', 8, -4], ['st1', 13, -10]], ['st0', 'st1']]),
('normal control 6', [[['st0', 50, 11], ['st1', 80, 0]], 25],
[[['st0', 10, 1], ['st1', 15, -15]], ['st1']]),
('normal control 7', [[['st0', 50, 4], ['st1', 100, 6], ['st2', 60, 8]], 25],
[[['st0', 6, -2], ['st1', 12, -6], ['st2', 7, 1]], ['st0', 'st1']]),
('normal control 8', [[['st0', 100, 6], ['st1', 100, 11], ['st2', 100, 1], ['st3', 60, 5]], 7],
[[['st0', 2, 4], ['st1', 2, 9], ['st2', 2, -1], ['st3', 1, 4]], ['st0', 'st1', 'st3']])],
[('regression: deviation flag 1',
[[['st0', 50, 4], ['st1', 100, 7], ['st2', 20, 4], ['st3', 60, 7], ['st4', 50, 0]], 25],
[[['st0', 4, 0], ['st1', 9, -2], ['st2', 2, 2], ['st3', 5, 2], ['st4', 4, -4]],
['st1', 'st2', 'st3', 'st4']]),
('regression variant: deviation flag 2', [[['st0', 100, 10], ['st1', 20, 6], ['st2', 100, 5]], 15],
[[['st0', 7, 3], ['st1', 1, 5], ['st2', 7, -2]], ['st0', 'st1', 'st2']]),
('partial repair guard 3',
[[['st0', 80, 1], ['st1', 20, 10], ['st2', 80, 12], ['st3', 80, 0], ['st4', 60, 3]], 7],
[[['st0', 2, -1], ['st1', 0, 10], ['st2', 2, 10], ['st3', 2, -2], ['st4', 1, 2]],
['st1', 'st2', 'st3', 'st4']]),
('boundary control 4', [[['a', 100, 3], ['b', 100, 4]], 7], [[['a', 4, -1], ['b', 4, 0]], []]),
('normal control 5',
[[['st0', 60, 5], ['st1', 60, 0], ['st2', 50, 8], ['st3', 50, 3], ['st4', 50, 10]], 10],
[[['st0', 2, 3], ['st1', 2, -2], ['st2', 2, 6], ['st3', 2, 1], ['st4', 2, 8]],
['st0', 'st1', 'st2', 'st4']]),
('normal control 6', [[['st0', 50, 12], ['st1', 20, 8]], 20],
[[['st0', 14, -2], ['st1', 6, 2]], ['st0', 'st1']]),
('normal control 7', [[['st0', 20, 11], ['st1', 50, 12]], 15], [[['st0', 4, 7], ['st1', 11, 1]], ['st0']]),
('normal control 8', [[['st0', 50, 10], ['st1', 20, 12], ['st2', 20, 4]], 15],
[[['st0', 8, 2], ['st1', 3, 9], ['st2', 3, 1]], ['st0', 'st1']])],
[('regression: deviation flag 1',
[[['st0', 50, 10], ['st1', 100, 4], ['st2', 100, 0], ['st3', 20, 0], ['st4', 80, 3]], 7],
[[['st0', 1, 9], ['st1', 2, 2], ['st2', 2, -2], ['st3', 0, 0], ['st4', 2, 1]], ['st0', 'st1', 'st2']]),
('regression variant: deviation flag 2',
[[['st0', 80, 1], ['st1', 20, 10], ['st2', 80, 12], ['st3', 80, 0], ['st4', 60, 3]], 7],
[[['st0', 2, -1], ['st1', 0, 10], ['st2', 2, 10], ['st3', 2, -2], ['st4', 1, 2]],
['st1', 'st2', 'st3', 'st4']]),
('partial repair guard 3', [[['st0', 60, 4], ['st1', 60, 2], ['st2', 60, 0], ['st3', 20, 10]], 15],
[[['st0', 5, -1], ['st1', 5, -3], ['st2', 5, -5], ['st3', 2, 8]], ['st1', 'st2', 'st3']]),
('boundary control 4', [[['a', 50, 5], ['b', 50, 5]], 5], [[['a', 3, 2], ['b', 3, 2]], ['a', 'b']]),
('normal control 5', [[['st0', 100, 1], ['st1', 20, 12], ['st2', 60, 0], ['st3', 100, 2]], 15],
[[['st0', 5, -4], ['st1', 1, 11], ['st2', 3, -3], ['st3', 5, -3]], ['st0', 'st1', 'st2', 'st3']]),
('normal control 6', [[['st0', 100, 8], ['st1', 60, 5], ['st2', 20, 4]], 20],
[[['st0', 11, -3], ['st1', 7, -2], ['st2', 2, 2]], ['st0', 'st1', 'st2']]),
('normal control 7', [[['st0', 100, 12], ['st1', 50, 9], ['st2', 100, 10]], 10],
[[['st0', 4, 8], ['st1', 2, 7], ['st2', 4, 6]], ['st0', 'st1', 'st2']]),
('normal control 8', [[['st0', 100, 0], ['st1', 80, 6], ['st2', 50, 7], ['st3', 80, 5]], 25],
[[['st0', 8, -8], ['st1', 6, 0], ['st2', 4, 3], ['st3', 6, -1]], ['st0', 'st2']])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: deviation flag 1 | [[['a', 4, -1], ['b', 4, -2]], ['a', 'b']] | [[['a', 4, -1], ['b', 4, -2]], ['b']] | Failed |
| regression variant: deviation flag 2 | [[['st0', 8, -4], ['st1', 17, -13]], ['st0', 'st1']] | [[['st0', 8, -4], ['st1', 17, -13]], ['st0', 'st1']] | Passed |
| partial repair guard 3 | [[['st0', 8, 0], ['st1', 2, 2], ['st2', 8, -5], ['st3', 6, 4], ['st4', 8, 1]], ['st1', 'st2', 'st3', 'st4']] | [[['st0', 8, 0], ['st1', 2, 2], ['st2', 8, -5], ['st3', 6, 4], ['st4', 8, 1]], ['st1', 'st2', 'st3']] | Failed |
| boundary control 4 | [[['a', 3, -2], ['b', 8, -4]], ['a', 'b']] | [[['a', 3, -2], ['b', 8, -4]], ['a', 'b']] | Passed |
| normal control 5 | [[['st0', 2, -2], ['st1', 2, -1], ['st2', 1, 7], ['st3', 3, 2], ['st4', 2, 0]], ['st0', 'st1', 'st2', 'st3']] | [[['st0', 2, -2], ['st1', 2, -1], ['st2', 1, 7], ['st3', 3, 2], ['st4', 2, 0]], ['st0', 'st2', 'st3']] | Failed |
| normal control 6 | [[['st0', 1, -1], ['st1', 2, 1], ['st2', 2, 1], ['st3', 2, 9]], ['st0', 'st1', 'st2', 'st3']] | [[['st0', 1, -1], ['st1', 2, 1], ['st2', 2, 1], ['st3', 2, 9]], ['st3']] | Failed |
| normal control 7 | [[['st0', 3, 8], ['st1', 4, 6], ['st2', 3, -3], ['st3', 4, 5]], ['st0', 'st1', 'st2', 'st3']] | [[['st0', 3, 8], ['st1', 4, 6], ['st2', 3, -3], ['st3', 4, 5]], ['st0', 'st1', 'st2', 'st3']] | Passed |
| normal control 8 | [[['st0', 8, -4], ['st1', 10, -4], ['st2', 6, 1], ['st3', 6, 0]], ['st0', 'st1', 'st2']] | [[['st0', 8, -4], ['st1', 10, -4], ['st2', 6, 1], ['st3', 6, 0]], ['st0', 'st1']] | Failed |
SHA-256 / 3029d35d185adf5bfc8076d824b1122d2a3c0750d36e2335889977fe0477e960
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(staff, total):
tot_fte = sum(f for n, f, a in staff)
rows = []
flag = []
for n, f, a in staff:
num = total * f * 2 + tot_fte
target = num // (2 * tot_fte) if tot_fte else 0
dev = a - target
rows.append([n, target, dev])
if abs(dev) > 1:
flag.append(n)
return [rows, flag]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: deviation flag 1', [[['a', 50, 3], ['b', 50, 2]], 7], [[['a', 4, -1], ['b', 4, -2]], ['b']]),
('regression variant: deviation flag 2', [[['st0', 50, 4], ['st1', 100, 4]], 25],
[[['st0', 8, -4], ['st1', 17, -13]], ['st0', 'st1']]),
('partial repair guard 3',
[[['st0', 100, 8], ['st1', 20, 4], ['st2', 100, 3], ['st3', 80, 10], ['st4', 100, 9]], 30],
[[['st0', 8, 0], ['st1', 2, 2], ['st2', 8, -5], ['st3', 6, 4], ['st4', 8, 1]], ['st1', 'st2', 'st3']]),
('boundary control 4', [[['a', 25, 1], ['b', 75, 4]], 10], [[['a', 3, -2], ['b', 8, -4]], ['a', 'b']]),
('normal control 5', [[['st0', 60, 0], ['st1', 50, 1], ['st2', 20, 8], ['st3', 80, 5], ['st4', 50, 2]], 10],
[[['st0', 2, -2], ['st1', 2, -1], ['st2', 1, 7], ['st3', 3, 2], ['st4', 2, 0]], ['st0', 'st2', 'st3']]),
('normal control 6', [[['st0', 20, 0], ['st1', 80, 3], ['st2', 80, 3], ['st3', 60, 11]], 7],
[[['st0', 1, -1], ['st1', 2, 1], ['st2', 2, 1], ['st3', 2, 9]], ['st3']]),
('normal control 7', [[['st0', 50, 11], ['st1', 80, 10], ['st2', 60, 0], ['st3', 80, 9]], 15],
[[['st0', 3, 8], ['st1', 4, 6], ['st2', 3, -3], ['st3', 4, 5]], ['st0', 'st1', 'st2', 'st3']]),
('normal control 8', [[['st0', 60, 4], ['st1', 80, 6], ['st2', 50, 7], ['st3', 50, 6]], 30],
[[['st0', 8, -4], ['st1', 10, -4], ['st2', 6, 1], ['st3', 6, 0]], ['st0', 'st1']])],
[('regression: deviation flag 1', [[['a', 25, 1], ['b', 75, 4]], 10],
[[['a', 3, -2], ['b', 8, -4]], ['a', 'b']]),
('regression variant: deviation flag 2', [[['st0', 20, 8], ['st1', 50, 8]], 15],
[[['st0', 4, 4], ['st1', 11, -3]], ['st0', 'st1']]),
('partial repair guard 3',
[[['st0', 100, 2], ['st1', 80, 2], ['st2', 100, 5], ['st3', 100, 12], ['st4', 20, 8]], 25],
[[['st0', 6, -4], ['st1', 5, -3], ['st2', 6, -1], ['st3', 6, 6], ['st4', 1, 7]],
['st0', 'st1', 'st3', 'st4']]),
('boundary control 4', [[['a', 50, 3], ['b', 50, 2]], 7], [[['a', 4, -1], ['b', 4, -2]], ['b']]),
('normal control 5',
[[['st0', 50, 4], ['st1', 100, 11], ['st2', 60, 6], ['st3', 20, 7], ['st4', 80, 0]], 20],
[[['st0', 3, 1], ['st1', 6, 5], ['st2', 4, 2], ['st3', 1, 6], ['st4', 5, -5]],
['st1', 'st2', 'st3', 'st4']]),
('normal control 6',
[[['st0', 50, 4], ['st1', 20, 1], ['st2', 20, 10], ['st3', 80, 10], ['st4', 60, 8]], 25],
[[['st0', 5, -1], ['st1', 2, -1], ['st2', 2, 8], ['st3', 9, 1], ['st4', 7, 1]], ['st2']]),
('normal control 7', [[['st0', 80, 10], ['st1', 60, 5]], 25],
[[['st0', 14, -4], ['st1', 11, -6]], ['st0', 'st1']]),
('normal control 8',
[[['st0', 80, 6], ['st1', 100, 6], ['st2', 50, 2], ['st3', 100, 10], ['st4', 50, 4]], 10],
[[['st0', 2, 4], ['st1', 3, 3], ['st2', 1, 1], ['st3', 3, 7], ['st4', 1, 3]],
['st0', 'st1', 'st3', 'st4']])],
[('regression: deviation flag 1', [[['a', 100, 2], ['b', 50, 5]], 9],
[[['a', 6, -4], ['b', 3, 2]], ['a', 'b']]),
('regression variant: deviation flag 2', [[['st0', 80, 3], ['st1', 50, 9], ['st2', 20, 11]], 10],
[[['st0', 5, -2], ['st1', 3, 6], ['st2', 1, 10]], ['st0', 'st1', 'st2']]),
('partial repair guard 3', [[['st0', 60, 10], ['st1', 100, 6]], 25],
[[['st0', 9, 1], ['st1', 16, -10]], ['st1']]),
('normal control 4',
[[['st0', 20, 4], ['st1', 100, 2], ['st2', 20, 10], ['st3', 60, 2], ['st4', 80, 2]], 30],
[[['st0', 2, 2], ['st1', 11, -9], ['st2', 2, 8], ['st3', 6, -4], ['st4', 9, -7]],
['st0', 'st1', 'st2', 'st3', 'st4']]),
('normal control 5', [[['st0', 60, 4], ['st1', 100, 3]], 20],
[[['st0', 8, -4], ['st1', 13, -10]], ['st0', 'st1']]),
('normal control 6', [[['st0', 50, 11], ['st1', 80, 0]], 25],
[[['st0', 10, 1], ['st1', 15, -15]], ['st1']]),
('normal control 7', [[['st0', 50, 4], ['st1', 100, 6], ['st2', 60, 8]], 25],
[[['st0', 6, -2], ['st1', 12, -6], ['st2', 7, 1]], ['st0', 'st1']]),
('normal control 8', [[['st0', 100, 6], ['st1', 100, 11], ['st2', 100, 1], ['st3', 60, 5]], 7],
[[['st0', 2, 4], ['st1', 2, 9], ['st2', 2, -1], ['st3', 1, 4]], ['st0', 'st1', 'st3']])],
[('regression: deviation flag 1',
[[['st0', 50, 4], ['st1', 100, 7], ['st2', 20, 4], ['st3', 60, 7], ['st4', 50, 0]], 25],
[[['st0', 4, 0], ['st1', 9, -2], ['st2', 2, 2], ['st3', 5, 2], ['st4', 4, -4]],
['st1', 'st2', 'st3', 'st4']]),
('regression variant: deviation flag 2', [[['st0', 100, 10], ['st1', 20, 6], ['st2', 100, 5]], 15],
[[['st0', 7, 3], ['st1', 1, 5], ['st2', 7, -2]], ['st0', 'st1', 'st2']]),
('partial repair guard 3',
[[['st0', 80, 1], ['st1', 20, 10], ['st2', 80, 12], ['st3', 80, 0], ['st4', 60, 3]], 7],
[[['st0', 2, -1], ['st1', 0, 10], ['st2', 2, 10], ['st3', 2, -2], ['st4', 1, 2]],
['st1', 'st2', 'st3', 'st4']]),
('boundary control 4', [[['a', 100, 3], ['b', 100, 4]], 7], [[['a', 4, -1], ['b', 4, 0]], []]),
('normal control 5',
[[['st0', 60, 5], ['st1', 60, 0], ['st2', 50, 8], ['st3', 50, 3], ['st4', 50, 10]], 10],
[[['st0', 2, 3], ['st1', 2, -2], ['st2', 2, 6], ['st3', 2, 1], ['st4', 2, 8]],
['st0', 'st1', 'st2', 'st4']]),
('normal control 6', [[['st0', 50, 12], ['st1', 20, 8]], 20],
[[['st0', 14, -2], ['st1', 6, 2]], ['st0', 'st1']]),
('normal control 7', [[['st0', 20, 11], ['st1', 50, 12]], 15], [[['st0', 4, 7], ['st1', 11, 1]], ['st0']]),
('normal control 8', [[['st0', 50, 10], ['st1', 20, 12], ['st2', 20, 4]], 15],
[[['st0', 8, 2], ['st1', 3, 9], ['st2', 3, 1]], ['st0', 'st1']])],
[('regression: deviation flag 1',
[[['st0', 50, 10], ['st1', 100, 4], ['st2', 100, 0], ['st3', 20, 0], ['st4', 80, 3]], 7],
[[['st0', 1, 9], ['st1', 2, 2], ['st2', 2, -2], ['st3', 0, 0], ['st4', 2, 1]], ['st0', 'st1', 'st2']]),
('regression variant: deviation flag 2',
[[['st0', 80, 1], ['st1', 20, 10], ['st2', 80, 12], ['st3', 80, 0], ['st4', 60, 3]], 7],
[[['st0', 2, -1], ['st1', 0, 10], ['st2', 2, 10], ['st3', 2, -2], ['st4', 1, 2]],
['st1', 'st2', 'st3', 'st4']]),
('partial repair guard 3', [[['st0', 60, 4], ['st1', 60, 2], ['st2', 60, 0], ['st3', 20, 10]], 15],
[[['st0', 5, -1], ['st1', 5, -3], ['st2', 5, -5], ['st3', 2, 8]], ['st1', 'st2', 'st3']]),
('boundary control 4', [[['a', 50, 5], ['b', 50, 5]], 5], [[['a', 3, 2], ['b', 3, 2]], ['a', 'b']]),
('normal control 5', [[['st0', 100, 1], ['st1', 20, 12], ['st2', 60, 0], ['st3', 100, 2]], 15],
[[['st0', 5, -4], ['st1', 1, 11], ['st2', 3, -3], ['st3', 5, -3]], ['st0', 'st1', 'st2', 'st3']]),
('normal control 6', [[['st0', 100, 8], ['st1', 60, 5], ['st2', 20, 4]], 20],
[[['st0', 11, -3], ['st1', 7, -2], ['st2', 2, 2]], ['st0', 'st1', 'st2']]),
('normal control 7', [[['st0', 100, 12], ['st1', 50, 9], ['st2', 100, 10]], 10],
[[['st0', 4, 8], ['st1', 2, 7], ['st2', 4, 6]], ['st0', 'st1', 'st2']]),
('normal control 8', [[['st0', 100, 0], ['st1', 80, 6], ['st2', 50, 7], ['st3', 80, 5]], 25],
[[['st0', 8, -8], ['st1', 6, 0], ['st2', 4, 3], ['st3', 6, -1]], ['st0', 'st2']])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: deviation flag 1 | [[['a', 4, -1], ['b', 4, -2]], ['b']] | [[['a', 4, -1], ['b', 4, -2]], ['b']] | Passed |
| regression variant: deviation flag 2 | [[['st0', 8, -4], ['st1', 17, -13]], ['st0', 'st1']] | [[['st0', 8, -4], ['st1', 17, -13]], ['st0', 'st1']] | Passed |
| partial repair guard 3 | [[['st0', 8, 0], ['st1', 2, 2], ['st2', 8, -5], ['st3', 6, 4], ['st4', 8, 1]], ['st1', 'st2', 'st3']] | [[['st0', 8, 0], ['st1', 2, 2], ['st2', 8, -5], ['st3', 6, 4], ['st4', 8, 1]], ['st1', 'st2', 'st3']] | Passed |
| boundary control 4 | [[['a', 3, -2], ['b', 8, -4]], ['a', 'b']] | [[['a', 3, -2], ['b', 8, -4]], ['a', 'b']] | Passed |
| normal control 5 | [[['st0', 2, -2], ['st1', 2, -1], ['st2', 1, 7], ['st3', 3, 2], ['st4', 2, 0]], ['st0', 'st2', 'st3']] | [[['st0', 2, -2], ['st1', 2, -1], ['st2', 1, 7], ['st3', 3, 2], ['st4', 2, 0]], ['st0', 'st2', 'st3']] | Passed |
| normal control 6 | [[['st0', 1, -1], ['st1', 2, 1], ['st2', 2, 1], ['st3', 2, 9]], ['st3']] | [[['st0', 1, -1], ['st1', 2, 1], ['st2', 2, 1], ['st3', 2, 9]], ['st3']] | Passed |
| normal control 7 | [[['st0', 3, 8], ['st1', 4, 6], ['st2', 3, -3], ['st3', 4, 5]], ['st0', 'st1', 'st2', 'st3']] | [[['st0', 3, 8], ['st1', 4, 6], ['st2', 3, -3], ['st3', 4, 5]], ['st0', 'st1', 'st2', 'st3']] | Passed |
| normal control 8 | [[['st0', 8, -4], ['st1', 10, -4], ['st2', 6, 1], ['st3', 6, 0]], ['st0', 'st1']] | [[['st0', 8, -4], ['st1', 10, -4], ['st2', 6, 1], ['st3', 6, 0]], ['st0', 'st1']] | Passed |
SHA-256 / 30032855139b63259758a8afc01d6650c8fe92d175bf69beeb4a92ff367ac00c
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.345809+00:00.
Case digest / 426ae8d15525d8d3995c3646e54225afaeba871935bf295999235de3a1d3dcdd