FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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