FA-93841 / Shift rostering labor rules / Open access
Rest validation walks shifts in submission order · case 01
Rosters entered out of chronological order report spurious overlaps and miss real short rests.
ROOT CAUSE
Shifts are compared in the order they were submitted instead of by start time.
VERIFIED REPAIR
Sort each worker's shifts by start minute before comparing neighbours.
Unsuccessful approach: Sorting by shift end reorders nested shifts, so the reported earlier/later indices are wrong.
Case contract
Input shifts as [worker, start, end] absolute minutes and a minimum rest "HH:MM". For each worker, walk shifts by start time, comparing each start with the latest end seen so far (and that shift index): a negative gap is an overlap, a gap below the minimum rest is short_rest; exactly the minimum is compliant. Return [worker, earlier index, later index, kind] rows ordered by worker then start.
Why this case matters
Rest-period validation is the most common roster labor rule; errors either hide fatigue risks or block legal rosters.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(shifts, min_rest):
h, m = min_rest.split(':')
limit = int(h) * 60 + int(m)
by = {}
for i, (w, s, e) in enumerate(shifts):
by.setdefault(w, []).append((s, e, i))
out = []
for w in sorted(by):
seq = by[w]
prev = None
for s, e, i in seq:
if prev is not None:
pe, pi = prev
gap = s - pe
if gap < 0:
out.append([w, pi, i, 'overlap'])
elif gap < limit:
out.append([w, pi, i, 'short_rest'])
if prev is None or e > prev[0]:
prev = (e, i)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: submission order walk 1', [[['ana', 1200, 1680], ['ana', 0, 480]], '11:00'], []),
('regression variant: submission order walk 2',
[[['ana', 869, 1229], ['chi', 7240, 7600], ['dev', 1920, 2280], ['ana', 0, 240], ['dev', 1320, 2040],
['ana', 2129, 2489], ['dev', 2250, 2730], ['chi', 3620, 4100], ['chi', 2000, 2720],
['chi', 5000, 5240]],
'10:30'],
[['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']]),
('partial repair guard 3',
[[['chi', 2611, 2971], ['chi', 0, 600], ['ben', 4120, 4360], ['dev', 4222, 4822], ['dev', 2000, 2360],
['ben', 2860, 3220], ['dev', 2991, 3591], ['chi', 1500, 1980], ['chi', 2551, 3151], ['ben', 1680, 2160],
['ben', 1320, 1680]],
'11:00'],
[['ben', 10, 9, 'short_rest'], ['chi', 7, 8, 'short_rest'], ['chi', 8, 0, 'overlap'],
['dev', 4, 6, 'short_rest'], ['dev', 6, 3, 'short_rest']]),
('boundary control 4', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('boundary control 5', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['chi', 2760, 3240], ['chi', 1320, 1920], ['chi', 2520, 2880], ['ana', 1650, 2010], ['dev', 2000, 2240],
['dev', 3140, 3860], ['ana', 300, 1020]],
'10:31'],
[['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('normal control 7',
[[['chi', 2940, 3540], ['dev', 1260, 1620], ['chi', 1320, 1800], ['chi', 1770, 2370], ['chi', 3000, 3480],
['dev', 1320, 1800]],
'10:31'],
[['chi', 2, 3, 'overlap'], ['chi', 3, 0, 'short_rest'], ['chi', 0, 4, 'overlap'],
['dev', 1, 5, 'overlap']]),
('normal control 8',
[[['dev', 3749, 4469], ['dev', 300, 660], ['dev', 2369, 2849], ['dev', 1289, 1769]], '10:30'],
[['dev', 1, 3, 'short_rest'], ['dev', 3, 2, 'short_rest']])],
[('regression: submission order walk 1',
[[['ana', 4760, 5480], ['ana', 300, 660], ['ana', 2660, 3260]], '10:31'], []),
('regression variant: submission order walk 2',
[[['ana', 1380, 1620], ['dev', 3420, 3660], ['ana', 3241, 3841], ['ana', 2220, 2580], ['ben', 4841, 5201],
['ana', 300, 780], ['ben', 3460, 4180], ['ben', 1320, 1800], ['dev', 1320, 1920], ['dev', 3540, 4260],
['ben', 2500, 2860]],
'10:30'],
[['ana', 5, 0, 'short_rest'], ['ana', 0, 3, 'short_rest'], ['ben', 10, 6, 'short_rest'],
['dev', 1, 9, 'overlap']]),
('partial repair guard 3',
[[['ana', 2520, 2760], ['ana', 2460, 3060], ['ben', 2000, 2360], ['chi', 300, 540], ['ana', 300, 1020],
['ana', 2400, 2760], ['chi', 1140, 1380], ['ben', 3060, 3780]],
'10:30'],
[['ana', 5, 1, 'overlap'], ['ana', 1, 0, 'overlap'], ['chi', 3, 6, 'short_rest']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
[['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['dev', 3780, 4380], ['chi', 4409, 4649], ['chi', 2000, 2720], ['dev', 4350, 5070], ['ben', 1740, 2460],
['dev', 3300, 3780], ['chi', 3420, 3780], ['ben', 300, 780], ['dev', 1320, 1800], ['ben', 240, 840],
['ben', 3121, 3841]],
'10:31'],
[['ben', 9, 7, 'overlap'], ['chi', 6, 1, 'short_rest'], ['dev', 5, 0, 'short_rest'],
['dev', 0, 3, 'overlap']]),
('normal control 7', [[['chi', 2480, 3200], ['chi', 0, 480]], '09:45'], []),
('normal control 8',
[[['chi', 300, 660], ['chi', 570, 930], ['ana', 2870, 3470], ['dev', 1320, 1560], ['chi', 630, 1350],
['ana', 4100, 4820], ['ana', 2000, 2240], ['dev', 2191, 2551]],
'10:30'],
[['chi', 0, 1, 'overlap'], ['chi', 1, 4, 'overlap']])],
[('regression: submission order walk 1',
[[['ana', 4741, 5101], ['dev', 1940, 2300], ['ben', 3719, 3959], ['ben', 2999, 3719], ['ben', 2549, 3029],
['ben', 1320, 1920], ['ana', 2220, 2940], ['ana', 0, 720], ['dev', 2000, 2360], ['ana', 3601, 3841]],
'11:00'],
[['ben', 5, 4, 'short_rest'], ['ben', 4, 3, 'overlap'], ['ben', 3, 2, 'short_rest'],
['dev', 1, 8, 'overlap']]),
('regression variant: submission order walk 2',
[[['dev', 2551, 3031], ['dev', 1411, 1651], ['dev', 3031, 3391], ['dev', 300, 780]], '10:30'],
[['dev', 0, 2, 'short_rest']]),
('partial repair guard 3',
[[['dev', 1830, 2430], ['ben', 1480, 2200], ['dev', 1260, 1860], ['ben', 420, 780], ['dev', 3930, 4530],
['ben', 3100, 3460], ['ben', 300, 540], ['dev', 1320, 1680]],
'12:00'],
[['ben', 6, 3, 'overlap'], ['ben', 3, 1, 'short_rest'], ['dev', 2, 7, 'overlap'],
['dev', 2, 0, 'overlap']]),
('boundary control 4', [[['ana', 1200, 1680], ['ana', 0, 480]], '11:00'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 1140, 1620]], '11:00'], []),
('normal control 6',
[[['chi', 300, 660], ['ana', 3240, 3480], ['ana', 3300, 3900], ['ben', 4220, 4460], ['ana', 4180, 4900],
['ben', 2000, 2720], ['chi', 1360, 1720], ['ana', 2000, 2600], ['chi', 2381, 3101],
['ben', 4460, 4940]],
'10:31'],
[['ana', 1, 2, 'overlap'], ['ana', 2, 4, 'short_rest'], ['ben', 3, 9, 'short_rest']]),
('normal control 7',
[[['dev', 4100, 4460], ['dev', 2000, 2600], ['ana', 2100, 2700], ['ana', 0, 600]], '11:00'], []),
('normal control 8', [[['chi', 2480, 3200], ['chi', 0, 480]], '09:45'], [])],
[('regression: submission order walk 1',
[[['ana', 1940, 2180], ['ana', 6040, 6760], ['ana', 2000, 2480], ['ana', 3680, 4040]], '12:00'],
[['ana', 0, 2, 'overlap']]),
('regression variant: submission order walk 2',
[[['dev', 1771, 2011], ['dev', 300, 540], ['ana', 0, 240], ['ana', 2240, 2840], ['dev', 510, 1110]],
'10:30'],
[['dev', 1, 4, 'overlap']]),
('partial repair guard 3',
[[['ben', 1940, 2300], ['ben', 2000, 2240], ['ana', 2550, 2790], ['ana', 0, 600], ['ana', 2100, 2580]],
'10:30'],
[['ana', 4, 2, 'overlap'], ['ben', 0, 1, 'overlap']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 3400, 3800]], '11:00'], []),
('boundary control 5', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('normal control 6',
[[['ben', 3620, 4100], ['ben', 5740, 6340], ['ben', 4800, 5040], ['dev', 1320, 1800], ['dev', 1800, 2400],
['ben', 2000, 2720]],
'12:00'],
[['ben', 0, 2, 'short_rest'], ['ben', 2, 1, 'short_rest'], ['dev', 3, 4, 'short_rest']]),
('normal control 7',
[[['ben', 3330, 3930], ['ben', 0, 360], ['chi', 1320, 1560], ['chi', 2191, 2431], ['ben', 990, 1590],
['ben', 2490, 2730]],
'11:00'],
[['ben', 1, 4, 'short_rest'], ['ben', 5, 0, 'short_rest'], ['chi', 2, 3, 'short_rest']]),
('normal control 8',
[[['ana', 2960, 3560], ['chi', 2551, 3271], ['ana', 2000, 2360], ['chi', 1320, 1920]], '11:00'],
[['ana', 2, 0, 'short_rest'], ['chi', 3, 1, 'short_rest']])],
[('regression: submission order walk 1',
[[['chi', 3540, 3780], ['chi', 1320, 1560], ['chi', 4411, 4651], ['chi', 2189, 2909]], '10:30'],
[['chi', 1, 3, 'short_rest']]),
('regression variant: submission order walk 2',
[[['ben', 5860, 6580], ['ben', 2000, 2720], ['ben', 4720, 4960]], '10:31'], []),
('partial repair guard 3', [[['ben', 240, 840], ['ben', 300, 540]], '10:30'], [['ben', 0, 1, 'overlap']]),
('boundary control 4', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('boundary control 5', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('normal control 6',
[[['chi', 0, 720], ['ana', 2000, 2360], ['ben', 300, 900], ['chi', 3209, 3569], ['ana', 2990, 3350],
['chi', 720, 1320], ['ana', 5350, 5830], ['chi', 1949, 2309], ['ben', 1600, 2200]],
'10:30'],
[['chi', 0, 5, 'short_rest'], ['chi', 5, 7, 'short_rest']]),
('normal control 7',
[[['ana', 300, 900], ['ben', 510, 870], ['ben', 1510, 1750], ['ana', 1560, 2160], ['ben', 1570, 2050],
['ana', 2160, 2640], ['ben', 300, 540]],
'10:30'],
[['ana', 3, 5, 'short_rest'], ['ben', 6, 1, 'overlap'], ['ben', 2, 4, 'overlap']]),
('normal control 8',
[[['ana', 3351, 3951], ['ana', 2000, 2720], ['dev', 1320, 1560], ['dev', 2221, 2581], ['ana', 4612, 5092]],
'11:00'],
[['ana', 1, 0, 'short_rest']])]]
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: submission order walk 1 | [['ana', 0, 1, 'overlap']] | [] | Failed |
| regression variant: submission order walk 2 | [['ana', 0, 3, 'overlap'], ['chi', 1, 7, 'overlap'], ['chi', 1, 8, 'overlap'], ['chi', 1, 9, 'overlap'], ['dev', 2, 4, 'overlap'], ['dev', 2, 6, 'overlap']] | [['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']] | Failed |
| partial repair guard 3 | [['ben', 2, 5, 'overlap'], ['ben', 2, 9, 'overlap'], ['ben', 2, 10, 'overlap'], ['chi', 0, 1, 'overlap'], ['chi', 0, 7, 'overlap'], ['chi', 0, 8, 'overlap'], ['dev', 3, 4, 'overlap'], ['dev', 3, 6, 'overlap']] | [['ben', 10, 9, 'short_rest'], ['chi', 7, 8, 'short_rest'], ['chi', 8, 0, 'overlap'], ['dev', 4, 6, 'short_rest'], ['dev', 6, 3, 'short_rest']] | Failed |
| boundary control 4 | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | Passed |
| boundary control 5 | [['ana', 0, 1, 'short_rest']] | [['ana', 0, 1, 'short_rest']] | Passed |
| normal control 6 | [['ana', 3, 6, 'overlap'], ['chi', 0, 1, 'overlap'], ['chi', 0, 2, 'overlap']] | [['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']] | Failed |
| normal control 7 | [['chi', 0, 2, 'overlap'], ['chi', 0, 3, 'overlap'], ['chi', 0, 4, 'overlap'], ['dev', 1, 5, 'overlap']] | [['chi', 2, 3, 'overlap'], ['chi', 3, 0, 'short_rest'], ['chi', 0, 4, 'overlap'], ['dev', 1, 5, 'overlap']] | Failed |
| normal control 8 | [['dev', 0, 1, 'overlap'], ['dev', 0, 2, 'overlap'], ['dev', 0, 3, 'overlap']] | [['dev', 1, 3, 'short_rest'], ['dev', 3, 2, 'short_rest']] | Failed |
SHA-256 / abd7276c58e2c511bb1d88129289e8c443bf13152a3995cbb5b4fc37c7bce6c1
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(shifts, min_rest):
h, m = min_rest.split(':')
limit = int(h) * 60 + int(m)
by = {}
for i, (w, s, e) in enumerate(shifts):
by.setdefault(w, []).append((s, e, i))
out = []
for w in sorted(by):
seq = sorted(by[w], key=lambda t: t[1])
prev = None
for s, e, i in seq:
if prev is not None:
pe, pi = prev
gap = s - pe
if gap < 0:
out.append([w, pi, i, 'overlap'])
elif gap < limit:
out.append([w, pi, i, 'short_rest'])
if prev is None or e > prev[0]:
prev = (e, i)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: submission order walk 1', [[['ana', 1200, 1680], ['ana', 0, 480]], '11:00'], []),
('regression variant: submission order walk 2',
[[['ana', 869, 1229], ['chi', 7240, 7600], ['dev', 1920, 2280], ['ana', 0, 240], ['dev', 1320, 2040],
['ana', 2129, 2489], ['dev', 2250, 2730], ['chi', 3620, 4100], ['chi', 2000, 2720],
['chi', 5000, 5240]],
'10:30'],
[['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']]),
('partial repair guard 3',
[[['chi', 2611, 2971], ['chi', 0, 600], ['ben', 4120, 4360], ['dev', 4222, 4822], ['dev', 2000, 2360],
['ben', 2860, 3220], ['dev', 2991, 3591], ['chi', 1500, 1980], ['chi', 2551, 3151], ['ben', 1680, 2160],
['ben', 1320, 1680]],
'11:00'],
[['ben', 10, 9, 'short_rest'], ['chi', 7, 8, 'short_rest'], ['chi', 8, 0, 'overlap'],
['dev', 4, 6, 'short_rest'], ['dev', 6, 3, 'short_rest']]),
('boundary control 4', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('boundary control 5', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['chi', 2760, 3240], ['chi', 1320, 1920], ['chi', 2520, 2880], ['ana', 1650, 2010], ['dev', 2000, 2240],
['dev', 3140, 3860], ['ana', 300, 1020]],
'10:31'],
[['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('normal control 7',
[[['chi', 2940, 3540], ['dev', 1260, 1620], ['chi', 1320, 1800], ['chi', 1770, 2370], ['chi', 3000, 3480],
['dev', 1320, 1800]],
'10:31'],
[['chi', 2, 3, 'overlap'], ['chi', 3, 0, 'short_rest'], ['chi', 0, 4, 'overlap'],
['dev', 1, 5, 'overlap']]),
('normal control 8',
[[['dev', 3749, 4469], ['dev', 300, 660], ['dev', 2369, 2849], ['dev', 1289, 1769]], '10:30'],
[['dev', 1, 3, 'short_rest'], ['dev', 3, 2, 'short_rest']])],
[('regression: submission order walk 1',
[[['ana', 4760, 5480], ['ana', 300, 660], ['ana', 2660, 3260]], '10:31'], []),
('regression variant: submission order walk 2',
[[['ana', 1380, 1620], ['dev', 3420, 3660], ['ana', 3241, 3841], ['ana', 2220, 2580], ['ben', 4841, 5201],
['ana', 300, 780], ['ben', 3460, 4180], ['ben', 1320, 1800], ['dev', 1320, 1920], ['dev', 3540, 4260],
['ben', 2500, 2860]],
'10:30'],
[['ana', 5, 0, 'short_rest'], ['ana', 0, 3, 'short_rest'], ['ben', 10, 6, 'short_rest'],
['dev', 1, 9, 'overlap']]),
('partial repair guard 3',
[[['ana', 2520, 2760], ['ana', 2460, 3060], ['ben', 2000, 2360], ['chi', 300, 540], ['ana', 300, 1020],
['ana', 2400, 2760], ['chi', 1140, 1380], ['ben', 3060, 3780]],
'10:30'],
[['ana', 5, 1, 'overlap'], ['ana', 1, 0, 'overlap'], ['chi', 3, 6, 'short_rest']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
[['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['dev', 3780, 4380], ['chi', 4409, 4649], ['chi', 2000, 2720], ['dev', 4350, 5070], ['ben', 1740, 2460],
['dev', 3300, 3780], ['chi', 3420, 3780], ['ben', 300, 780], ['dev', 1320, 1800], ['ben', 240, 840],
['ben', 3121, 3841]],
'10:31'],
[['ben', 9, 7, 'overlap'], ['chi', 6, 1, 'short_rest'], ['dev', 5, 0, 'short_rest'],
['dev', 0, 3, 'overlap']]),
('normal control 7', [[['chi', 2480, 3200], ['chi', 0, 480]], '09:45'], []),
('normal control 8',
[[['chi', 300, 660], ['chi', 570, 930], ['ana', 2870, 3470], ['dev', 1320, 1560], ['chi', 630, 1350],
['ana', 4100, 4820], ['ana', 2000, 2240], ['dev', 2191, 2551]],
'10:30'],
[['chi', 0, 1, 'overlap'], ['chi', 1, 4, 'overlap']])],
[('regression: submission order walk 1',
[[['ana', 4741, 5101], ['dev', 1940, 2300], ['ben', 3719, 3959], ['ben', 2999, 3719], ['ben', 2549, 3029],
['ben', 1320, 1920], ['ana', 2220, 2940], ['ana', 0, 720], ['dev', 2000, 2360], ['ana', 3601, 3841]],
'11:00'],
[['ben', 5, 4, 'short_rest'], ['ben', 4, 3, 'overlap'], ['ben', 3, 2, 'short_rest'],
['dev', 1, 8, 'overlap']]),
('regression variant: submission order walk 2',
[[['dev', 2551, 3031], ['dev', 1411, 1651], ['dev', 3031, 3391], ['dev', 300, 780]], '10:30'],
[['dev', 0, 2, 'short_rest']]),
('partial repair guard 3',
[[['dev', 1830, 2430], ['ben', 1480, 2200], ['dev', 1260, 1860], ['ben', 420, 780], ['dev', 3930, 4530],
['ben', 3100, 3460], ['ben', 300, 540], ['dev', 1320, 1680]],
'12:00'],
[['ben', 6, 3, 'overlap'], ['ben', 3, 1, 'short_rest'], ['dev', 2, 7, 'overlap'],
['dev', 2, 0, 'overlap']]),
('boundary control 4', [[['ana', 1200, 1680], ['ana', 0, 480]], '11:00'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 1140, 1620]], '11:00'], []),
('normal control 6',
[[['chi', 300, 660], ['ana', 3240, 3480], ['ana', 3300, 3900], ['ben', 4220, 4460], ['ana', 4180, 4900],
['ben', 2000, 2720], ['chi', 1360, 1720], ['ana', 2000, 2600], ['chi', 2381, 3101],
['ben', 4460, 4940]],
'10:31'],
[['ana', 1, 2, 'overlap'], ['ana', 2, 4, 'short_rest'], ['ben', 3, 9, 'short_rest']]),
('normal control 7',
[[['dev', 4100, 4460], ['dev', 2000, 2600], ['ana', 2100, 2700], ['ana', 0, 600]], '11:00'], []),
('normal control 8', [[['chi', 2480, 3200], ['chi', 0, 480]], '09:45'], [])],
[('regression: submission order walk 1',
[[['ana', 1940, 2180], ['ana', 6040, 6760], ['ana', 2000, 2480], ['ana', 3680, 4040]], '12:00'],
[['ana', 0, 2, 'overlap']]),
('regression variant: submission order walk 2',
[[['dev', 1771, 2011], ['dev', 300, 540], ['ana', 0, 240], ['ana', 2240, 2840], ['dev', 510, 1110]],
'10:30'],
[['dev', 1, 4, 'overlap']]),
('partial repair guard 3',
[[['ben', 1940, 2300], ['ben', 2000, 2240], ['ana', 2550, 2790], ['ana', 0, 600], ['ana', 2100, 2580]],
'10:30'],
[['ana', 4, 2, 'overlap'], ['ben', 0, 1, 'overlap']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 3400, 3800]], '11:00'], []),
('boundary control 5', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('normal control 6',
[[['ben', 3620, 4100], ['ben', 5740, 6340], ['ben', 4800, 5040], ['dev', 1320, 1800], ['dev', 1800, 2400],
['ben', 2000, 2720]],
'12:00'],
[['ben', 0, 2, 'short_rest'], ['ben', 2, 1, 'short_rest'], ['dev', 3, 4, 'short_rest']]),
('normal control 7',
[[['ben', 3330, 3930], ['ben', 0, 360], ['chi', 1320, 1560], ['chi', 2191, 2431], ['ben', 990, 1590],
['ben', 2490, 2730]],
'11:00'],
[['ben', 1, 4, 'short_rest'], ['ben', 5, 0, 'short_rest'], ['chi', 2, 3, 'short_rest']]),
('normal control 8',
[[['ana', 2960, 3560], ['chi', 2551, 3271], ['ana', 2000, 2360], ['chi', 1320, 1920]], '11:00'],
[['ana', 2, 0, 'short_rest'], ['chi', 3, 1, 'short_rest']])],
[('regression: submission order walk 1',
[[['chi', 3540, 3780], ['chi', 1320, 1560], ['chi', 4411, 4651], ['chi', 2189, 2909]], '10:30'],
[['chi', 1, 3, 'short_rest']]),
('regression variant: submission order walk 2',
[[['ben', 5860, 6580], ['ben', 2000, 2720], ['ben', 4720, 4960]], '10:31'], []),
('partial repair guard 3', [[['ben', 240, 840], ['ben', 300, 540]], '10:30'], [['ben', 0, 1, 'overlap']]),
('boundary control 4', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('boundary control 5', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('normal control 6',
[[['chi', 0, 720], ['ana', 2000, 2360], ['ben', 300, 900], ['chi', 3209, 3569], ['ana', 2990, 3350],
['chi', 720, 1320], ['ana', 5350, 5830], ['chi', 1949, 2309], ['ben', 1600, 2200]],
'10:30'],
[['chi', 0, 5, 'short_rest'], ['chi', 5, 7, 'short_rest']]),
('normal control 7',
[[['ana', 300, 900], ['ben', 510, 870], ['ben', 1510, 1750], ['ana', 1560, 2160], ['ben', 1570, 2050],
['ana', 2160, 2640], ['ben', 300, 540]],
'10:30'],
[['ana', 3, 5, 'short_rest'], ['ben', 6, 1, 'overlap'], ['ben', 2, 4, 'overlap']]),
('normal control 8',
[[['ana', 3351, 3951], ['ana', 2000, 2720], ['dev', 1320, 1560], ['dev', 2221, 2581], ['ana', 4612, 5092]],
'11:00'],
[['ana', 1, 0, 'short_rest']])]]
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: submission order walk 1 | [] | [] | Passed |
| regression variant: submission order walk 2 | [['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']] | [['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']] | Passed |
| partial repair guard 3 | [['ben', 10, 9, 'short_rest'], ['chi', 7, 0, 'short_rest'], ['chi', 0, 8, 'overlap'], ['dev', 4, 6, 'short_rest'], ['dev', 6, 3, 'short_rest']] | [['ben', 10, 9, 'short_rest'], ['chi', 7, 8, 'short_rest'], ['chi', 8, 0, 'overlap'], ['dev', 4, 6, 'short_rest'], ['dev', 6, 3, 'short_rest']] | Failed |
| boundary control 4 | [['ana', 1, 2, 'short_rest'], ['ana', 2, 0, 'overlap']] | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | Failed |
| boundary control 5 | [['ana', 0, 1, 'short_rest']] | [['ana', 0, 1, 'short_rest']] | Passed |
| normal control 6 | [['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']] | [['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']] | Passed |
| normal control 7 | [['chi', 2, 3, 'overlap'], ['chi', 3, 4, 'short_rest'], ['chi', 4, 0, 'overlap'], ['dev', 1, 5, 'overlap']] | [['chi', 2, 3, 'overlap'], ['chi', 3, 0, 'short_rest'], ['chi', 0, 4, 'overlap'], ['dev', 1, 5, 'overlap']] | Failed |
| normal control 8 | [['dev', 1, 3, 'short_rest'], ['dev', 3, 2, 'short_rest']] | [['dev', 1, 3, 'short_rest'], ['dev', 3, 2, 'short_rest']] | Passed |
SHA-256 / fe8e537f5baf445f8a904ae4d05b7e51e480c9f79f1e48ee33263c1e7eb6019b
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(shifts, min_rest):
h, m = min_rest.split(':')
limit = int(h) * 60 + int(m)
by = {}
for i, (w, s, e) in enumerate(shifts):
by.setdefault(w, []).append((s, e, i))
out = []
for w in sorted(by):
seq = sorted(by[w])
prev = None
for s, e, i in seq:
if prev is not None:
pe, pi = prev
gap = s - pe
if gap < 0:
out.append([w, pi, i, 'overlap'])
elif gap < limit:
out.append([w, pi, i, 'short_rest'])
if prev is None or e > prev[0]:
prev = (e, i)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: submission order walk 1', [[['ana', 1200, 1680], ['ana', 0, 480]], '11:00'], []),
('regression variant: submission order walk 2',
[[['ana', 869, 1229], ['chi', 7240, 7600], ['dev', 1920, 2280], ['ana', 0, 240], ['dev', 1320, 2040],
['ana', 2129, 2489], ['dev', 2250, 2730], ['chi', 3620, 4100], ['chi', 2000, 2720],
['chi', 5000, 5240]],
'10:30'],
[['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']]),
('partial repair guard 3',
[[['chi', 2611, 2971], ['chi', 0, 600], ['ben', 4120, 4360], ['dev', 4222, 4822], ['dev', 2000, 2360],
['ben', 2860, 3220], ['dev', 2991, 3591], ['chi', 1500, 1980], ['chi', 2551, 3151], ['ben', 1680, 2160],
['ben', 1320, 1680]],
'11:00'],
[['ben', 10, 9, 'short_rest'], ['chi', 7, 8, 'short_rest'], ['chi', 8, 0, 'overlap'],
['dev', 4, 6, 'short_rest'], ['dev', 6, 3, 'short_rest']]),
('boundary control 4', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('boundary control 5', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['chi', 2760, 3240], ['chi', 1320, 1920], ['chi', 2520, 2880], ['ana', 1650, 2010], ['dev', 2000, 2240],
['dev', 3140, 3860], ['ana', 300, 1020]],
'10:31'],
[['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('normal control 7',
[[['chi', 2940, 3540], ['dev', 1260, 1620], ['chi', 1320, 1800], ['chi', 1770, 2370], ['chi', 3000, 3480],
['dev', 1320, 1800]],
'10:31'],
[['chi', 2, 3, 'overlap'], ['chi', 3, 0, 'short_rest'], ['chi', 0, 4, 'overlap'],
['dev', 1, 5, 'overlap']]),
('normal control 8',
[[['dev', 3749, 4469], ['dev', 300, 660], ['dev', 2369, 2849], ['dev', 1289, 1769]], '10:30'],
[['dev', 1, 3, 'short_rest'], ['dev', 3, 2, 'short_rest']])],
[('regression: submission order walk 1',
[[['ana', 4760, 5480], ['ana', 300, 660], ['ana', 2660, 3260]], '10:31'], []),
('regression variant: submission order walk 2',
[[['ana', 1380, 1620], ['dev', 3420, 3660], ['ana', 3241, 3841], ['ana', 2220, 2580], ['ben', 4841, 5201],
['ana', 300, 780], ['ben', 3460, 4180], ['ben', 1320, 1800], ['dev', 1320, 1920], ['dev', 3540, 4260],
['ben', 2500, 2860]],
'10:30'],
[['ana', 5, 0, 'short_rest'], ['ana', 0, 3, 'short_rest'], ['ben', 10, 6, 'short_rest'],
['dev', 1, 9, 'overlap']]),
('partial repair guard 3',
[[['ana', 2520, 2760], ['ana', 2460, 3060], ['ben', 2000, 2360], ['chi', 300, 540], ['ana', 300, 1020],
['ana', 2400, 2760], ['chi', 1140, 1380], ['ben', 3060, 3780]],
'10:30'],
[['ana', 5, 1, 'overlap'], ['ana', 1, 0, 'overlap'], ['chi', 3, 6, 'short_rest']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
[['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['dev', 3780, 4380], ['chi', 4409, 4649], ['chi', 2000, 2720], ['dev', 4350, 5070], ['ben', 1740, 2460],
['dev', 3300, 3780], ['chi', 3420, 3780], ['ben', 300, 780], ['dev', 1320, 1800], ['ben', 240, 840],
['ben', 3121, 3841]],
'10:31'],
[['ben', 9, 7, 'overlap'], ['chi', 6, 1, 'short_rest'], ['dev', 5, 0, 'short_rest'],
['dev', 0, 3, 'overlap']]),
('normal control 7', [[['chi', 2480, 3200], ['chi', 0, 480]], '09:45'], []),
('normal control 8',
[[['chi', 300, 660], ['chi', 570, 930], ['ana', 2870, 3470], ['dev', 1320, 1560], ['chi', 630, 1350],
['ana', 4100, 4820], ['ana', 2000, 2240], ['dev', 2191, 2551]],
'10:30'],
[['chi', 0, 1, 'overlap'], ['chi', 1, 4, 'overlap']])],
[('regression: submission order walk 1',
[[['ana', 4741, 5101], ['dev', 1940, 2300], ['ben', 3719, 3959], ['ben', 2999, 3719], ['ben', 2549, 3029],
['ben', 1320, 1920], ['ana', 2220, 2940], ['ana', 0, 720], ['dev', 2000, 2360], ['ana', 3601, 3841]],
'11:00'],
[['ben', 5, 4, 'short_rest'], ['ben', 4, 3, 'overlap'], ['ben', 3, 2, 'short_rest'],
['dev', 1, 8, 'overlap']]),
('regression variant: submission order walk 2',
[[['dev', 2551, 3031], ['dev', 1411, 1651], ['dev', 3031, 3391], ['dev', 300, 780]], '10:30'],
[['dev', 0, 2, 'short_rest']]),
('partial repair guard 3',
[[['dev', 1830, 2430], ['ben', 1480, 2200], ['dev', 1260, 1860], ['ben', 420, 780], ['dev', 3930, 4530],
['ben', 3100, 3460], ['ben', 300, 540], ['dev', 1320, 1680]],
'12:00'],
[['ben', 6, 3, 'overlap'], ['ben', 3, 1, 'short_rest'], ['dev', 2, 7, 'overlap'],
['dev', 2, 0, 'overlap']]),
('boundary control 4', [[['ana', 1200, 1680], ['ana', 0, 480]], '11:00'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 1140, 1620]], '11:00'], []),
('normal control 6',
[[['chi', 300, 660], ['ana', 3240, 3480], ['ana', 3300, 3900], ['ben', 4220, 4460], ['ana', 4180, 4900],
['ben', 2000, 2720], ['chi', 1360, 1720], ['ana', 2000, 2600], ['chi', 2381, 3101],
['ben', 4460, 4940]],
'10:31'],
[['ana', 1, 2, 'overlap'], ['ana', 2, 4, 'short_rest'], ['ben', 3, 9, 'short_rest']]),
('normal control 7',
[[['dev', 4100, 4460], ['dev', 2000, 2600], ['ana', 2100, 2700], ['ana', 0, 600]], '11:00'], []),
('normal control 8', [[['chi', 2480, 3200], ['chi', 0, 480]], '09:45'], [])],
[('regression: submission order walk 1',
[[['ana', 1940, 2180], ['ana', 6040, 6760], ['ana', 2000, 2480], ['ana', 3680, 4040]], '12:00'],
[['ana', 0, 2, 'overlap']]),
('regression variant: submission order walk 2',
[[['dev', 1771, 2011], ['dev', 300, 540], ['ana', 0, 240], ['ana', 2240, 2840], ['dev', 510, 1110]],
'10:30'],
[['dev', 1, 4, 'overlap']]),
('partial repair guard 3',
[[['ben', 1940, 2300], ['ben', 2000, 2240], ['ana', 2550, 2790], ['ana', 0, 600], ['ana', 2100, 2580]],
'10:30'],
[['ana', 4, 2, 'overlap'], ['ben', 0, 1, 'overlap']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 3400, 3800]], '11:00'], []),
('boundary control 5', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('normal control 6',
[[['ben', 3620, 4100], ['ben', 5740, 6340], ['ben', 4800, 5040], ['dev', 1320, 1800], ['dev', 1800, 2400],
['ben', 2000, 2720]],
'12:00'],
[['ben', 0, 2, 'short_rest'], ['ben', 2, 1, 'short_rest'], ['dev', 3, 4, 'short_rest']]),
('normal control 7',
[[['ben', 3330, 3930], ['ben', 0, 360], ['chi', 1320, 1560], ['chi', 2191, 2431], ['ben', 990, 1590],
['ben', 2490, 2730]],
'11:00'],
[['ben', 1, 4, 'short_rest'], ['ben', 5, 0, 'short_rest'], ['chi', 2, 3, 'short_rest']]),
('normal control 8',
[[['ana', 2960, 3560], ['chi', 2551, 3271], ['ana', 2000, 2360], ['chi', 1320, 1920]], '11:00'],
[['ana', 2, 0, 'short_rest'], ['chi', 3, 1, 'short_rest']])],
[('regression: submission order walk 1',
[[['chi', 3540, 3780], ['chi', 1320, 1560], ['chi', 4411, 4651], ['chi', 2189, 2909]], '10:30'],
[['chi', 1, 3, 'short_rest']]),
('regression variant: submission order walk 2',
[[['ben', 5860, 6580], ['ben', 2000, 2720], ['ben', 4720, 4960]], '10:31'], []),
('partial repair guard 3', [[['ben', 240, 840], ['ben', 300, 540]], '10:30'], [['ben', 0, 1, 'overlap']]),
('boundary control 4', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('boundary control 5', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('normal control 6',
[[['chi', 0, 720], ['ana', 2000, 2360], ['ben', 300, 900], ['chi', 3209, 3569], ['ana', 2990, 3350],
['chi', 720, 1320], ['ana', 5350, 5830], ['chi', 1949, 2309], ['ben', 1600, 2200]],
'10:30'],
[['chi', 0, 5, 'short_rest'], ['chi', 5, 7, 'short_rest']]),
('normal control 7',
[[['ana', 300, 900], ['ben', 510, 870], ['ben', 1510, 1750], ['ana', 1560, 2160], ['ben', 1570, 2050],
['ana', 2160, 2640], ['ben', 300, 540]],
'10:30'],
[['ana', 3, 5, 'short_rest'], ['ben', 6, 1, 'overlap'], ['ben', 2, 4, 'overlap']]),
('normal control 8',
[[['ana', 3351, 3951], ['ana', 2000, 2720], ['dev', 1320, 1560], ['dev', 2221, 2581], ['ana', 4612, 5092]],
'11:00'],
[['ana', 1, 0, 'short_rest']])]]
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: submission order walk 1 | [] | [] | Passed |
| regression variant: submission order walk 2 | [['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']] | [['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']] | Passed |
| partial repair guard 3 | [['ben', 10, 9, 'short_rest'], ['chi', 7, 8, 'short_rest'], ['chi', 8, 0, 'overlap'], ['dev', 4, 6, 'short_rest'], ['dev', 6, 3, 'short_rest']] | [['ben', 10, 9, 'short_rest'], ['chi', 7, 8, 'short_rest'], ['chi', 8, 0, 'overlap'], ['dev', 4, 6, 'short_rest'], ['dev', 6, 3, 'short_rest']] | Passed |
| boundary control 4 | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | Passed |
| boundary control 5 | [['ana', 0, 1, 'short_rest']] | [['ana', 0, 1, 'short_rest']] | Passed |
| normal control 6 | [['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']] | [['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']] | Passed |
| normal control 7 | [['chi', 2, 3, 'overlap'], ['chi', 3, 0, 'short_rest'], ['chi', 0, 4, 'overlap'], ['dev', 1, 5, 'overlap']] | [['chi', 2, 3, 'overlap'], ['chi', 3, 0, 'short_rest'], ['chi', 0, 4, 'overlap'], ['dev', 1, 5, 'overlap']] | Passed |
| normal control 8 | [['dev', 1, 3, 'short_rest'], ['dev', 3, 2, 'short_rest']] | [['dev', 1, 3, 'short_rest'], ['dev', 3, 2, 'short_rest']] | Passed |
SHA-256 / d822bf85f1402ab0cfca30d6c53253c1e12fcdad76a3c749ae25c69bb232246d
Verification & scope
Stipulated toy labor rule for a bounded roster model; it is not legal advice and does not claim conformance with any jurisdiction, award, or collective agreement. 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:51:58.809070+00:00.
Case digest / 8091636d3f36408b4406d8e5758cd5b83700ed62c18c958f21e2d1bf9428e207