FAILURE MAP
← Case archive

FA-93856 / Shift rostering labor rules / Open access

Back-to-back shifts classified as overlapping · case 01

A shift that starts the minute the previous one ends is reported as an overlap instead of a short rest.

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

ROOT CAUSE

The overlap test treats a zero gap as overlap.

VERIFIED REPAIR

Only a negative gap (start before the previous end) is an overlap.

Unsuccessful approach: Requiring the later shift to also end after the previous end misclassifies nested shifts as short rest.

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 = 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: overlap containment only 1', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
   [['ana', 0, 1, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['ana', 3831, 4191], ['ana', 4791, 5391], ['chi', 5600, 5840], ['chi', 2000, 2720], ['chi', 6471, 6711],
     ['ana', 2480, 3200], ['ana', 2000, 2480], ['chi', 4220, 4940]],
    '09:45'],
   [['ana', 6, 5, 'short_rest']]),
  ('partial repair guard 3',
   [[['ana', 0, 600], ['chi', 1300, 2020], ['ana', 510, 1110], ['ana', 990, 1350], ['chi', 2650, 2890],
     ['ana', 570, 1050], ['ben', 1320, 1800], ['chi', 0, 600], ['ben', 0, 360], ['ben', 240, 720],
     ['ben', 2429, 3029]],
    '11:00'],
   [['ana', 0, 2, 'overlap'], ['ana', 2, 5, 'overlap'], ['ana', 2, 3, 'overlap'], ['ben', 8, 9, 'overlap'],
    ['ben', 9, 6, 'short_rest'], ['ben', 6, 10, 'short_rest'], ['chi', 1, 4, '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',
   [[['ben', 6442, 7162], ['ben', 4040, 4640], ['ben', 5301, 5781], ['ben', 1320, 2040]], '10:31'], []),
  ('normal control 7',
   [[['ben', 510, 870], ['dev', 300, 660], ['chi', 1260, 1860], ['ben', 450, 690], ['dev', 2160, 2640],
     ['chi', 3360, 3720], ['chi', 1320, 1920], ['ben', 300, 540], ['chi', 5220, 5820], ['dev', 3271, 3751]],
    '10:31'],
   [['ben', 7, 3, 'overlap'], ['ben', 3, 0, 'overlap'], ['chi', 2, 6, 'overlap']]),
  ('normal control 8',
   [[['dev', 1320, 1680], ['dev', 3000, 3240], ['dev', 1650, 2370], ['dev', 300, 660]], '09:45'],
   [['dev', 0, 2, 'overlap']])],
 [('regression: overlap containment only 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: overlap containment only 2',
   [[['dev', 5220, 5700], ['chi', 3140, 3380], ['dev', 300, 780], ['chi', 300, 540], ['dev', 1440, 2160],
     ['dev', 2860, 3220], ['chi', 540, 780], ['chi', 780, 1140]],
    '10:30'],
   [['chi', 3, 6, 'short_rest'], ['chi', 6, 7, 'short_rest']]),
  ('partial repair guard 3',
   [[['chi', 1109, 1349], ['ana', 2010, 2250], ['chi', 2730, 3090], ['chi', 0, 480], ['dev', 1880, 2480],
     ['dev', 4480, 5200], ['chi', 1349, 2069], ['dev', 1940, 2660], ['dev', 2000, 2360], ['ana', 2950, 3190],
     ['ana', 1320, 2040]],
    '12:00'],
   [['ana', 10, 1, 'overlap'], ['ana', 1, 9, 'short_rest'], ['chi', 3, 0, 'short_rest'],
    ['chi', 0, 6, 'short_rest'], ['chi', 6, 2, 'short_rest'], ['dev', 4, 7, 'overlap'],
    ['dev', 7, 8, 'overlap']]),
  ('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',
   [[['ana', 940, 1660], ['chi', 0, 720], ['chi', 2489, 3089], ['chi', 1380, 1860], ['ana', 0, 240],
     ['chi', 3750, 4350]],
    '12:00'],
   [['ana', 4, 0, 'short_rest'], ['chi', 1, 3, 'short_rest'], ['chi', 3, 2, 'short_rest'],
    ['chi', 2, 5, 'short_rest']]),
  ('normal control 8', [[['ben', 900, 1500], ['ben', 0, 240]], '11:00'], [])],
 [('regression: overlap containment only 1', [[['ana', 0, 240], ['ana', 240, 840]], '10:31'],
   [['ana', 0, 1, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['chi', 2000, 2240], ['ben', 1800, 2040], ['chi', 2940, 3180], ['ben', 1320, 1800]], '12:00'],
   [['ben', 3, 1, 'short_rest'], ['chi', 0, 2, 'short_rest']]),
  ('partial repair guard 3',
   [[['ana', 2189, 2909], ['ana', 1320, 1560], ['chi', 2560, 3160], ['ben', 2820, 3420], ['ben', 0, 480],
     ['chi', 2620, 2980], ['ben', 1111, 1831], ['chi', 1320, 1920], ['ben', 2460, 2820],
     ['chi', 5160, 5760]],
    '11:00'],
   [['ana', 1, 0, 'short_rest'], ['ben', 4, 6, 'short_rest'], ['ben', 6, 8, 'short_rest'],
    ['ben', 8, 3, 'short_rest'], ['chi', 7, 2, 'short_rest'], ['chi', 2, 5, '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, 1020], ['chi', 4400, 5120], ['ana', 1320, 1560], ['chi', 5820, 6540], ['chi', 1680, 2400],
     ['ana', 2221, 2701], ['dev', 2940, 3300], ['dev', 5300, 5660], ['dev', 1320, 2040]],
    '09:45'],
   []),
  ('normal control 7', [[['ben', 900, 1140], ['ben', 300, 900]], '09:45'], [['ben', 1, 0, 'short_rest']]),
  ('normal control 8',
   [[['dev', 2120, 2720], ['ana', 240, 840], ['dev', 2000, 2240], ['ana', 0, 240]], '12:00'],
   [['ana', 3, 1, 'short_rest'], ['dev', 2, 0, 'overlap']])],
 [('regression: overlap containment only 1',
   [[['ana', 0, 360], ['ana', 1021, 1741], ['ana', 1741, 1981]], '10:30'], [['ana', 1, 2, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['dev', 3229, 3829], ['ana', 2950, 3670], ['ana', 1530, 2250], ['ben', 1920, 2640], ['ana', 300, 900],
     ['dev', 5829, 6429], ['ben', 3240, 3720], ['ana', 4331, 4931], ['ben', 1320, 1920],
     ['dev', 2000, 2600]],
    '10:31'],
   [['ana', 4, 2, 'short_rest'], ['ben', 8, 3, 'short_rest'], ['ben', 3, 6, 'short_rest'],
    ['dev', 9, 0, 'short_rest']]),
  ('partial repair guard 3',
   [[['ana', 4580, 4940], ['chi', 2000, 2720], ['chi', 4610, 5210], ['dev', 1800, 2160], ['dev', 600, 960],
     ['ana', 300, 900], ['chi', 5840, 6200], ['ana', 4640, 4880], ['ana', 2900, 3140], ['dev', 1860, 2340],
     ['chi', 3381, 3981], ['dev', 0, 720]],
    '10:30'],
   [['ana', 0, 7, 'overlap'], ['chi', 10, 2, 'short_rest'], ['dev', 11, 4, 'overlap'],
    ['dev', 3, 9, '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', 2671, 3031], ['ben', 1320, 2040], ['dev', 0, 480], ['ben', 4922, 5282], ['ben', 3662, 4022],
     ['dev', 480, 840], ['ana', 2871, 3111], ['ana', 2000, 2240]],
    '09:45'],
   [['dev', 2, 5, 'short_rest']]),
  ('normal control 7',
   [[['ben', 1320, 1800], ['dev', 0, 480], ['ben', 3800, 4040], ['dev', 1380, 1860]], '10:31'], []),
  ('normal control 8',
   [[['ben', 0, 480], ['dev', 2000, 2240], ['dev', 3740, 4220], ['ana', 1320, 1800], ['ana', 1770, 2130],
     ['ben', 450, 1170]],
    '09:45'],
   [['ana', 3, 4, 'overlap'], ['ben', 0, 5, 'overlap']])],
 [('regression: overlap containment only 1',
   [[['ben', 1300, 2020], ['ben', 360, 600], ['ben', 0, 360], ['ben', 3520, 4120]], '10:31'],
   [['ben', 2, 1, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['ben', 2380, 3100], ['chi', 300, 1020], ['chi', 2821, 3301], ['ana', 2000, 2480], ['ben', 1320, 1680],
     ['chi', 1681, 1921], ['ana', 2480, 3080]],
    '10:31'],
   [['ana', 3, 6, 'short_rest']]),
  ('partial repair guard 3',
   [[['dev', 1320, 1560], ['ana', 0, 240], ['ana', 1201, 1561], ['dev', 3060, 3300], ['ana', 901, 1141],
     ['ana', 841, 1201]],
    '10:30'],
   [['ana', 1, 5, 'short_rest'], ['ana', 5, 4, 'overlap'], ['ana', 5, 2, 'short_rest']]),
  ('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',
   [[['dev', 5220, 5700], ['chi', 3140, 3380], ['dev', 300, 780], ['chi', 300, 540], ['dev', 1440, 2160],
     ['dev', 2860, 3220], ['chi', 540, 780], ['chi', 780, 1140]],
    '10:30'],
   [['chi', 3, 6, 'short_rest'], ['chi', 6, 7, 'short_rest']]),
  ('normal control 7',
   [[['chi', 2251, 2731], ['ben', 2940, 3540], ['ben', 4171, 4411], ['chi', 1320, 1680], ['chi', 1260, 1620],
     ['ben', 1320, 2040]],
    '09:45'],
   [['chi', 4, 3, 'overlap'], ['chi', 3, 0, 'short_rest']]),
  ('normal control 8',
   [[['chi', 300, 1020], ['ben', 5501, 6101], ['ben', 2000, 2240], ['ben', 2901, 3501], ['chi', 1890, 2130],
     ['chi', 990, 1230]],
    '09:45'],
   [['chi', 0, 5, 'overlap']])]]
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: overlap containment only 1[['ana', 0, 1, 'overlap']][['ana', 0, 1, 'short_rest']]Failed
regression variant: overlap containment only 2[['ana', 6, 5, 'overlap']][['ana', 6, 5, 'short_rest']]Failed
partial repair guard 3[['ana', 0, 2, 'overlap'], ['ana', 2, 5, 'overlap'], ['ana', 2, 3, 'overlap'], ['ben', 8, 9, 'overlap'], ['ben', 9, 6, 'short_rest'], ['ben', 6, 10, 'short_rest'], ['chi', 1, 4, 'short_rest']][['ana', 0, 2, 'overlap'], ['ana', 2, 5, 'overlap'], ['ana', 2, 3, 'overlap'], ['ben', 8, 9, 'overlap'], ['ben', 9, 6, 'short_rest'], ['ben', 6, 10, 'short_rest'], ['chi', 1, 4, '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[][]Passed
normal control 7[['ben', 7, 3, 'overlap'], ['ben', 3, 0, 'overlap'], ['chi', 2, 6, 'overlap']][['ben', 7, 3, 'overlap'], ['ben', 3, 0, 'overlap'], ['chi', 2, 6, 'overlap']]Passed
normal control 8[['dev', 0, 2, 'overlap']][['dev', 0, 2, 'overlap']]Passed

SHA-256 / baee2c3358ae250ededf9d571a7552ded4df837cf757cb78da1aba2d3a566526

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])
        prev = None
        for s, e, i in seq:
            if prev is not None:
                pe, pi = prev
                gap = s - pe
                if s < pe and e > pe:
                    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: overlap containment only 1', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
   [['ana', 0, 1, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['ana', 3831, 4191], ['ana', 4791, 5391], ['chi', 5600, 5840], ['chi', 2000, 2720], ['chi', 6471, 6711],
     ['ana', 2480, 3200], ['ana', 2000, 2480], ['chi', 4220, 4940]],
    '09:45'],
   [['ana', 6, 5, 'short_rest']]),
  ('partial repair guard 3',
   [[['ana', 0, 600], ['chi', 1300, 2020], ['ana', 510, 1110], ['ana', 990, 1350], ['chi', 2650, 2890],
     ['ana', 570, 1050], ['ben', 1320, 1800], ['chi', 0, 600], ['ben', 0, 360], ['ben', 240, 720],
     ['ben', 2429, 3029]],
    '11:00'],
   [['ana', 0, 2, 'overlap'], ['ana', 2, 5, 'overlap'], ['ana', 2, 3, 'overlap'], ['ben', 8, 9, 'overlap'],
    ['ben', 9, 6, 'short_rest'], ['ben', 6, 10, 'short_rest'], ['chi', 1, 4, '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',
   [[['ben', 6442, 7162], ['ben', 4040, 4640], ['ben', 5301, 5781], ['ben', 1320, 2040]], '10:31'], []),
  ('normal control 7',
   [[['ben', 510, 870], ['dev', 300, 660], ['chi', 1260, 1860], ['ben', 450, 690], ['dev', 2160, 2640],
     ['chi', 3360, 3720], ['chi', 1320, 1920], ['ben', 300, 540], ['chi', 5220, 5820], ['dev', 3271, 3751]],
    '10:31'],
   [['ben', 7, 3, 'overlap'], ['ben', 3, 0, 'overlap'], ['chi', 2, 6, 'overlap']]),
  ('normal control 8',
   [[['dev', 1320, 1680], ['dev', 3000, 3240], ['dev', 1650, 2370], ['dev', 300, 660]], '09:45'],
   [['dev', 0, 2, 'overlap']])],
 [('regression: overlap containment only 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: overlap containment only 2',
   [[['dev', 5220, 5700], ['chi', 3140, 3380], ['dev', 300, 780], ['chi', 300, 540], ['dev', 1440, 2160],
     ['dev', 2860, 3220], ['chi', 540, 780], ['chi', 780, 1140]],
    '10:30'],
   [['chi', 3, 6, 'short_rest'], ['chi', 6, 7, 'short_rest']]),
  ('partial repair guard 3',
   [[['chi', 1109, 1349], ['ana', 2010, 2250], ['chi', 2730, 3090], ['chi', 0, 480], ['dev', 1880, 2480],
     ['dev', 4480, 5200], ['chi', 1349, 2069], ['dev', 1940, 2660], ['dev', 2000, 2360], ['ana', 2950, 3190],
     ['ana', 1320, 2040]],
    '12:00'],
   [['ana', 10, 1, 'overlap'], ['ana', 1, 9, 'short_rest'], ['chi', 3, 0, 'short_rest'],
    ['chi', 0, 6, 'short_rest'], ['chi', 6, 2, 'short_rest'], ['dev', 4, 7, 'overlap'],
    ['dev', 7, 8, 'overlap']]),
  ('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',
   [[['ana', 940, 1660], ['chi', 0, 720], ['chi', 2489, 3089], ['chi', 1380, 1860], ['ana', 0, 240],
     ['chi', 3750, 4350]],
    '12:00'],
   [['ana', 4, 0, 'short_rest'], ['chi', 1, 3, 'short_rest'], ['chi', 3, 2, 'short_rest'],
    ['chi', 2, 5, 'short_rest']]),
  ('normal control 8', [[['ben', 900, 1500], ['ben', 0, 240]], '11:00'], [])],
 [('regression: overlap containment only 1', [[['ana', 0, 240], ['ana', 240, 840]], '10:31'],
   [['ana', 0, 1, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['chi', 2000, 2240], ['ben', 1800, 2040], ['chi', 2940, 3180], ['ben', 1320, 1800]], '12:00'],
   [['ben', 3, 1, 'short_rest'], ['chi', 0, 2, 'short_rest']]),
  ('partial repair guard 3',
   [[['ana', 2189, 2909], ['ana', 1320, 1560], ['chi', 2560, 3160], ['ben', 2820, 3420], ['ben', 0, 480],
     ['chi', 2620, 2980], ['ben', 1111, 1831], ['chi', 1320, 1920], ['ben', 2460, 2820],
     ['chi', 5160, 5760]],
    '11:00'],
   [['ana', 1, 0, 'short_rest'], ['ben', 4, 6, 'short_rest'], ['ben', 6, 8, 'short_rest'],
    ['ben', 8, 3, 'short_rest'], ['chi', 7, 2, 'short_rest'], ['chi', 2, 5, '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, 1020], ['chi', 4400, 5120], ['ana', 1320, 1560], ['chi', 5820, 6540], ['chi', 1680, 2400],
     ['ana', 2221, 2701], ['dev', 2940, 3300], ['dev', 5300, 5660], ['dev', 1320, 2040]],
    '09:45'],
   []),
  ('normal control 7', [[['ben', 900, 1140], ['ben', 300, 900]], '09:45'], [['ben', 1, 0, 'short_rest']]),
  ('normal control 8',
   [[['dev', 2120, 2720], ['ana', 240, 840], ['dev', 2000, 2240], ['ana', 0, 240]], '12:00'],
   [['ana', 3, 1, 'short_rest'], ['dev', 2, 0, 'overlap']])],
 [('regression: overlap containment only 1',
   [[['ana', 0, 360], ['ana', 1021, 1741], ['ana', 1741, 1981]], '10:30'], [['ana', 1, 2, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['dev', 3229, 3829], ['ana', 2950, 3670], ['ana', 1530, 2250], ['ben', 1920, 2640], ['ana', 300, 900],
     ['dev', 5829, 6429], ['ben', 3240, 3720], ['ana', 4331, 4931], ['ben', 1320, 1920],
     ['dev', 2000, 2600]],
    '10:31'],
   [['ana', 4, 2, 'short_rest'], ['ben', 8, 3, 'short_rest'], ['ben', 3, 6, 'short_rest'],
    ['dev', 9, 0, 'short_rest']]),
  ('partial repair guard 3',
   [[['ana', 4580, 4940], ['chi', 2000, 2720], ['chi', 4610, 5210], ['dev', 1800, 2160], ['dev', 600, 960],
     ['ana', 300, 900], ['chi', 5840, 6200], ['ana', 4640, 4880], ['ana', 2900, 3140], ['dev', 1860, 2340],
     ['chi', 3381, 3981], ['dev', 0, 720]],
    '10:30'],
   [['ana', 0, 7, 'overlap'], ['chi', 10, 2, 'short_rest'], ['dev', 11, 4, 'overlap'],
    ['dev', 3, 9, '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', 2671, 3031], ['ben', 1320, 2040], ['dev', 0, 480], ['ben', 4922, 5282], ['ben', 3662, 4022],
     ['dev', 480, 840], ['ana', 2871, 3111], ['ana', 2000, 2240]],
    '09:45'],
   [['dev', 2, 5, 'short_rest']]),
  ('normal control 7',
   [[['ben', 1320, 1800], ['dev', 0, 480], ['ben', 3800, 4040], ['dev', 1380, 1860]], '10:31'], []),
  ('normal control 8',
   [[['ben', 0, 480], ['dev', 2000, 2240], ['dev', 3740, 4220], ['ana', 1320, 1800], ['ana', 1770, 2130],
     ['ben', 450, 1170]],
    '09:45'],
   [['ana', 3, 4, 'overlap'], ['ben', 0, 5, 'overlap']])],
 [('regression: overlap containment only 1',
   [[['ben', 1300, 2020], ['ben', 360, 600], ['ben', 0, 360], ['ben', 3520, 4120]], '10:31'],
   [['ben', 2, 1, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['ben', 2380, 3100], ['chi', 300, 1020], ['chi', 2821, 3301], ['ana', 2000, 2480], ['ben', 1320, 1680],
     ['chi', 1681, 1921], ['ana', 2480, 3080]],
    '10:31'],
   [['ana', 3, 6, 'short_rest']]),
  ('partial repair guard 3',
   [[['dev', 1320, 1560], ['ana', 0, 240], ['ana', 1201, 1561], ['dev', 3060, 3300], ['ana', 901, 1141],
     ['ana', 841, 1201]],
    '10:30'],
   [['ana', 1, 5, 'short_rest'], ['ana', 5, 4, 'overlap'], ['ana', 5, 2, 'short_rest']]),
  ('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',
   [[['dev', 5220, 5700], ['chi', 3140, 3380], ['dev', 300, 780], ['chi', 300, 540], ['dev', 1440, 2160],
     ['dev', 2860, 3220], ['chi', 540, 780], ['chi', 780, 1140]],
    '10:30'],
   [['chi', 3, 6, 'short_rest'], ['chi', 6, 7, 'short_rest']]),
  ('normal control 7',
   [[['chi', 2251, 2731], ['ben', 2940, 3540], ['ben', 4171, 4411], ['chi', 1320, 1680], ['chi', 1260, 1620],
     ['ben', 1320, 2040]],
    '09:45'],
   [['chi', 4, 3, 'overlap'], ['chi', 3, 0, 'short_rest']]),
  ('normal control 8',
   [[['chi', 300, 1020], ['ben', 5501, 6101], ['ben', 2000, 2240], ['ben', 2901, 3501], ['chi', 1890, 2130],
     ['chi', 990, 1230]],
    '09:45'],
   [['chi', 0, 5, 'overlap']])]]
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: overlap containment only 1[['ana', 0, 1, 'short_rest']][['ana', 0, 1, 'short_rest']]Passed
regression variant: overlap containment only 2[['ana', 6, 5, 'short_rest']][['ana', 6, 5, 'short_rest']]Passed
partial repair guard 3[['ana', 0, 2, 'overlap'], ['ana', 2, 5, 'short_rest'], ['ana', 2, 3, 'overlap'], ['ben', 8, 9, 'overlap'], ['ben', 9, 6, 'short_rest'], ['ben', 6, 10, 'short_rest'], ['chi', 1, 4, 'short_rest']][['ana', 0, 2, 'overlap'], ['ana', 2, 5, 'overlap'], ['ana', 2, 3, 'overlap'], ['ben', 8, 9, 'overlap'], ['ben', 9, 6, 'short_rest'], ['ben', 6, 10, 'short_rest'], ['chi', 1, 4, 'short_rest']]Failed
boundary control 4[['ana', 0, 1, 'short_rest'], ['ana', 0, 2, 'short_rest']][['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[][]Passed
normal control 7[['ben', 7, 3, 'overlap'], ['ben', 3, 0, 'overlap'], ['chi', 2, 6, 'overlap']][['ben', 7, 3, 'overlap'], ['ben', 3, 0, 'overlap'], ['chi', 2, 6, 'overlap']]Passed
normal control 8[['dev', 0, 2, 'overlap']][['dev', 0, 2, 'overlap']]Passed

SHA-256 / c72fc15b8da5ee454da8153eaa6ebf48d3e94c1712338081b9634b2b371c8a9f

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: overlap containment only 1', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
   [['ana', 0, 1, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['ana', 3831, 4191], ['ana', 4791, 5391], ['chi', 5600, 5840], ['chi', 2000, 2720], ['chi', 6471, 6711],
     ['ana', 2480, 3200], ['ana', 2000, 2480], ['chi', 4220, 4940]],
    '09:45'],
   [['ana', 6, 5, 'short_rest']]),
  ('partial repair guard 3',
   [[['ana', 0, 600], ['chi', 1300, 2020], ['ana', 510, 1110], ['ana', 990, 1350], ['chi', 2650, 2890],
     ['ana', 570, 1050], ['ben', 1320, 1800], ['chi', 0, 600], ['ben', 0, 360], ['ben', 240, 720],
     ['ben', 2429, 3029]],
    '11:00'],
   [['ana', 0, 2, 'overlap'], ['ana', 2, 5, 'overlap'], ['ana', 2, 3, 'overlap'], ['ben', 8, 9, 'overlap'],
    ['ben', 9, 6, 'short_rest'], ['ben', 6, 10, 'short_rest'], ['chi', 1, 4, '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',
   [[['ben', 6442, 7162], ['ben', 4040, 4640], ['ben', 5301, 5781], ['ben', 1320, 2040]], '10:31'], []),
  ('normal control 7',
   [[['ben', 510, 870], ['dev', 300, 660], ['chi', 1260, 1860], ['ben', 450, 690], ['dev', 2160, 2640],
     ['chi', 3360, 3720], ['chi', 1320, 1920], ['ben', 300, 540], ['chi', 5220, 5820], ['dev', 3271, 3751]],
    '10:31'],
   [['ben', 7, 3, 'overlap'], ['ben', 3, 0, 'overlap'], ['chi', 2, 6, 'overlap']]),
  ('normal control 8',
   [[['dev', 1320, 1680], ['dev', 3000, 3240], ['dev', 1650, 2370], ['dev', 300, 660]], '09:45'],
   [['dev', 0, 2, 'overlap']])],
 [('regression: overlap containment only 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: overlap containment only 2',
   [[['dev', 5220, 5700], ['chi', 3140, 3380], ['dev', 300, 780], ['chi', 300, 540], ['dev', 1440, 2160],
     ['dev', 2860, 3220], ['chi', 540, 780], ['chi', 780, 1140]],
    '10:30'],
   [['chi', 3, 6, 'short_rest'], ['chi', 6, 7, 'short_rest']]),
  ('partial repair guard 3',
   [[['chi', 1109, 1349], ['ana', 2010, 2250], ['chi', 2730, 3090], ['chi', 0, 480], ['dev', 1880, 2480],
     ['dev', 4480, 5200], ['chi', 1349, 2069], ['dev', 1940, 2660], ['dev', 2000, 2360], ['ana', 2950, 3190],
     ['ana', 1320, 2040]],
    '12:00'],
   [['ana', 10, 1, 'overlap'], ['ana', 1, 9, 'short_rest'], ['chi', 3, 0, 'short_rest'],
    ['chi', 0, 6, 'short_rest'], ['chi', 6, 2, 'short_rest'], ['dev', 4, 7, 'overlap'],
    ['dev', 7, 8, 'overlap']]),
  ('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',
   [[['ana', 940, 1660], ['chi', 0, 720], ['chi', 2489, 3089], ['chi', 1380, 1860], ['ana', 0, 240],
     ['chi', 3750, 4350]],
    '12:00'],
   [['ana', 4, 0, 'short_rest'], ['chi', 1, 3, 'short_rest'], ['chi', 3, 2, 'short_rest'],
    ['chi', 2, 5, 'short_rest']]),
  ('normal control 8', [[['ben', 900, 1500], ['ben', 0, 240]], '11:00'], [])],
 [('regression: overlap containment only 1', [[['ana', 0, 240], ['ana', 240, 840]], '10:31'],
   [['ana', 0, 1, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['chi', 2000, 2240], ['ben', 1800, 2040], ['chi', 2940, 3180], ['ben', 1320, 1800]], '12:00'],
   [['ben', 3, 1, 'short_rest'], ['chi', 0, 2, 'short_rest']]),
  ('partial repair guard 3',
   [[['ana', 2189, 2909], ['ana', 1320, 1560], ['chi', 2560, 3160], ['ben', 2820, 3420], ['ben', 0, 480],
     ['chi', 2620, 2980], ['ben', 1111, 1831], ['chi', 1320, 1920], ['ben', 2460, 2820],
     ['chi', 5160, 5760]],
    '11:00'],
   [['ana', 1, 0, 'short_rest'], ['ben', 4, 6, 'short_rest'], ['ben', 6, 8, 'short_rest'],
    ['ben', 8, 3, 'short_rest'], ['chi', 7, 2, 'short_rest'], ['chi', 2, 5, '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, 1020], ['chi', 4400, 5120], ['ana', 1320, 1560], ['chi', 5820, 6540], ['chi', 1680, 2400],
     ['ana', 2221, 2701], ['dev', 2940, 3300], ['dev', 5300, 5660], ['dev', 1320, 2040]],
    '09:45'],
   []),
  ('normal control 7', [[['ben', 900, 1140], ['ben', 300, 900]], '09:45'], [['ben', 1, 0, 'short_rest']]),
  ('normal control 8',
   [[['dev', 2120, 2720], ['ana', 240, 840], ['dev', 2000, 2240], ['ana', 0, 240]], '12:00'],
   [['ana', 3, 1, 'short_rest'], ['dev', 2, 0, 'overlap']])],
 [('regression: overlap containment only 1',
   [[['ana', 0, 360], ['ana', 1021, 1741], ['ana', 1741, 1981]], '10:30'], [['ana', 1, 2, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['dev', 3229, 3829], ['ana', 2950, 3670], ['ana', 1530, 2250], ['ben', 1920, 2640], ['ana', 300, 900],
     ['dev', 5829, 6429], ['ben', 3240, 3720], ['ana', 4331, 4931], ['ben', 1320, 1920],
     ['dev', 2000, 2600]],
    '10:31'],
   [['ana', 4, 2, 'short_rest'], ['ben', 8, 3, 'short_rest'], ['ben', 3, 6, 'short_rest'],
    ['dev', 9, 0, 'short_rest']]),
  ('partial repair guard 3',
   [[['ana', 4580, 4940], ['chi', 2000, 2720], ['chi', 4610, 5210], ['dev', 1800, 2160], ['dev', 600, 960],
     ['ana', 300, 900], ['chi', 5840, 6200], ['ana', 4640, 4880], ['ana', 2900, 3140], ['dev', 1860, 2340],
     ['chi', 3381, 3981], ['dev', 0, 720]],
    '10:30'],
   [['ana', 0, 7, 'overlap'], ['chi', 10, 2, 'short_rest'], ['dev', 11, 4, 'overlap'],
    ['dev', 3, 9, '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', 2671, 3031], ['ben', 1320, 2040], ['dev', 0, 480], ['ben', 4922, 5282], ['ben', 3662, 4022],
     ['dev', 480, 840], ['ana', 2871, 3111], ['ana', 2000, 2240]],
    '09:45'],
   [['dev', 2, 5, 'short_rest']]),
  ('normal control 7',
   [[['ben', 1320, 1800], ['dev', 0, 480], ['ben', 3800, 4040], ['dev', 1380, 1860]], '10:31'], []),
  ('normal control 8',
   [[['ben', 0, 480], ['dev', 2000, 2240], ['dev', 3740, 4220], ['ana', 1320, 1800], ['ana', 1770, 2130],
     ['ben', 450, 1170]],
    '09:45'],
   [['ana', 3, 4, 'overlap'], ['ben', 0, 5, 'overlap']])],
 [('regression: overlap containment only 1',
   [[['ben', 1300, 2020], ['ben', 360, 600], ['ben', 0, 360], ['ben', 3520, 4120]], '10:31'],
   [['ben', 2, 1, 'short_rest']]),
  ('regression variant: overlap containment only 2',
   [[['ben', 2380, 3100], ['chi', 300, 1020], ['chi', 2821, 3301], ['ana', 2000, 2480], ['ben', 1320, 1680],
     ['chi', 1681, 1921], ['ana', 2480, 3080]],
    '10:31'],
   [['ana', 3, 6, 'short_rest']]),
  ('partial repair guard 3',
   [[['dev', 1320, 1560], ['ana', 0, 240], ['ana', 1201, 1561], ['dev', 3060, 3300], ['ana', 901, 1141],
     ['ana', 841, 1201]],
    '10:30'],
   [['ana', 1, 5, 'short_rest'], ['ana', 5, 4, 'overlap'], ['ana', 5, 2, 'short_rest']]),
  ('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',
   [[['dev', 5220, 5700], ['chi', 3140, 3380], ['dev', 300, 780], ['chi', 300, 540], ['dev', 1440, 2160],
     ['dev', 2860, 3220], ['chi', 540, 780], ['chi', 780, 1140]],
    '10:30'],
   [['chi', 3, 6, 'short_rest'], ['chi', 6, 7, 'short_rest']]),
  ('normal control 7',
   [[['chi', 2251, 2731], ['ben', 2940, 3540], ['ben', 4171, 4411], ['chi', 1320, 1680], ['chi', 1260, 1620],
     ['ben', 1320, 2040]],
    '09:45'],
   [['chi', 4, 3, 'overlap'], ['chi', 3, 0, 'short_rest']]),
  ('normal control 8',
   [[['chi', 300, 1020], ['ben', 5501, 6101], ['ben', 2000, 2240], ['ben', 2901, 3501], ['chi', 1890, 2130],
     ['chi', 990, 1230]],
    '09:45'],
   [['chi', 0, 5, 'overlap']])]]
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: overlap containment only 1[['ana', 0, 1, 'short_rest']][['ana', 0, 1, 'short_rest']]Passed
regression variant: overlap containment only 2[['ana', 6, 5, 'short_rest']][['ana', 6, 5, 'short_rest']]Passed
partial repair guard 3[['ana', 0, 2, 'overlap'], ['ana', 2, 5, 'overlap'], ['ana', 2, 3, 'overlap'], ['ben', 8, 9, 'overlap'], ['ben', 9, 6, 'short_rest'], ['ben', 6, 10, 'short_rest'], ['chi', 1, 4, 'short_rest']][['ana', 0, 2, 'overlap'], ['ana', 2, 5, 'overlap'], ['ana', 2, 3, 'overlap'], ['ben', 8, 9, 'overlap'], ['ben', 9, 6, 'short_rest'], ['ben', 6, 10, 'short_rest'], ['chi', 1, 4, '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[][]Passed
normal control 7[['ben', 7, 3, 'overlap'], ['ben', 3, 0, 'overlap'], ['chi', 2, 6, 'overlap']][['ben', 7, 3, 'overlap'], ['ben', 3, 0, 'overlap'], ['chi', 2, 6, 'overlap']]Passed
normal control 8[['dev', 0, 2, 'overlap']][['dev', 0, 2, 'overlap']]Passed

SHA-256 / 8e1ecf2bd28651220354bc095ba2a0eacb970fc7ebdb4b79217f391b9b1aef8c

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

Case digest / 04d10e587d1fe4c6234c9735b4a79c18c936ada13b58c9f8bb7e2c3fbfe80db1