FAILURE MAP
← Case archive

FA-93851 / Shift rostering labor rules / Open access

Exactly-minimum rest flagged as a short rest violation · case 01

A roster giving precisely the required rest is rejected.

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

ROOT CAUSE

The short-rest comparison is inclusive of the minimum rest itself.

VERIFIED REPAIR

Flag only gaps strictly below the configured minimum rest.

Unsuccessful approach: Excluding zero gaps lets back-to-back double shifts pass the rest rule.

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: rest threshold inclusive 1', [[['ana', 0, 480], ['ana', 1140, 1620]], '11:00'], []),
  ('regression variant: rest threshold inclusive 2',
   [[['chi', 1940, 2420], ['ana', 1320, 1680], ['ana', 5760, 6480], ['ana', 2340, 2700], ['chi', 2000, 2720],
     ['chi', 3051, 3771], ['ana', 4700, 5060]],
    '11:00'],
   [['chi', 0, 4, 'overlap'], ['chi', 4, 5, 'short_rest']]),
  ('partial repair guard 3',
   [[['dev', 2551, 3031], ['dev', 1411, 1651], ['dev', 3031, 3391], ['dev', 300, 780]], '10:30'],
   [['dev', 0, 2, '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', 2000, 2360], ['chi', 2240, 2600], ['chi', 5449, 5929], ['chi', 4100, 4820]], '09:45'],
   [['chi', 0, 1, 'overlap']]),
  ('normal control 7',
   [[['ben', 2911, 3391], ['ben', 1921, 2281], ['ben', 300, 1020], ['ana', 1170, 1770], ['chi', 1200, 1920],
     ['chi', 0, 600], ['chi', 1800, 2160], ['ben', 1681, 2041], ['ana', 0, 720], ['ana', 690, 1170]],
    '12:00'],
   [['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'],
    ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'],
    ['chi', 4, 6, 'overlap']]),
  ('normal control 8', [[['ana', 1320, 1920], ['ana', 3031, 3751], ['ana', 2551, 3031]], '10:31'],
   [['ana', 2, 1, 'short_rest']])],
 [('regression: rest threshold inclusive 1', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
  ('regression variant: rest threshold inclusive 2',
   [[['ben', 3242, 3962], ['chi', 0, 600], ['ben', 300, 540], ['ben', 1140, 1740], ['chi', 2100, 2460],
     ['ben', 2371, 2611]],
    '10:31'],
   [['ben', 2, 3, 'short_rest']]),
  ('partial repair guard 3',
   [[['ben', 300, 900], ['ana', 720, 1080], ['dev', 4100, 4820], ['dev', 2000, 2600], ['ana', 240, 840],
     ['ben', 1531, 1891], ['dev', 5520, 5760], ['ben', 2791, 3151], ['ben', 3851, 4091], ['dev', 6420, 7020],
     ['ana', 0, 240]],
    '10:31'],
   [['ana', 10, 4, 'short_rest'], ['ana', 4, 1, 'overlap']]),
  ('boundary control 4', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
   [['ana', 0, 1, 'short_rest']]),
  ('normal control 5',
   [[['ana', 1260, 1860], ['chi', 3000, 3360], ['ana', 1320, 1560], ['chi', 3060, 3780], ['ana', 3360, 3600],
     ['chi', 2000, 2360]],
    '09:45'],
   [['ana', 0, 2, 'overlap'], ['chi', 1, 3, 'overlap']]),
  ('normal control 6', [[['ana', 2000, 2720], ['ana', 3350, 4070], ['ana', 4770, 5250]], '11:00'],
   [['ana', 0, 1, 'short_rest']]),
  ('normal control 7', [[['ben', 5860, 6580], ['ben', 2000, 2720], ['ben', 4720, 4960]], '10:31'], []),
  ('normal control 8',
   [[['chi', 2000, 2600], ['ben', 300, 1020], ['chi', 3200, 3800], ['ben', 990, 1350], ['ben', 1950, 2550]],
    '11:00'],
   [['ben', 1, 3, 'overlap'], ['ben', 3, 4, 'short_rest'], ['chi', 0, 2, 'short_rest']])],
 [('regression: rest threshold inclusive 1',
   [[['chi', 2000, 2240], ['ana', 2551, 3271], ['ana', 1320, 1920], ['chi', 2840, 3200], ['ana', 3931, 4651]],
    '10:31'],
   [['chi', 0, 3, 'short_rest']]),
  ('regression variant: rest threshold inclusive 2',
   [[['ana', 3060, 3420], ['dev', 2800, 3280], ['chi', 3051, 3771], ['dev', 1540, 2140], ['chi', 2000, 2480],
     ['dev', 0, 240], ['ana', 300, 780], ['chi', 1940, 2420], ['dev', 120, 840], ['ana', 1680, 2400]],
    '11:00'],
   [['chi', 7, 4, 'overlap'], ['chi', 4, 2, 'short_rest'], ['dev', 5, 8, 'overlap']]),
  ('partial repair guard 3',
   [[['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']]),
  ('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',
   [[['ben', 1320, 1800], ['ben', 2400, 3000], ['dev', 2580, 2820], ['dev', 1320, 1920]], '09:45'], []),
  ('normal control 7',
   [[['dev', 300, 1020], ['ben', 2280, 3000], ['dev', 2520, 3000], ['ben', 1320, 1680]], '10:30'],
   [['ben', 3, 1, 'short_rest']]),
  ('normal control 8',
   [[['chi', 2680, 3160], ['chi', 3789, 4269], ['chi', 300, 900], ['dev', 2309, 3029], ['chi', 1600, 2080],
     ['dev', 1320, 1680]],
    '12:00'],
   [['chi', 2, 4, 'short_rest'], ['chi', 4, 0, 'short_rest'], ['chi', 0, 1, 'short_rest'],
    ['dev', 5, 3, 'short_rest']])],
 [('regression: rest threshold inclusive 1', [[['ben', 900, 1500], ['ben', 0, 240]], '11:00'], []),
  ('regression variant: rest threshold inclusive 2',
   [[['ben', 1320, 1800], ['chi', 1320, 1920], ['chi', 1260, 1740], ['chi', 2640, 3120], ['dev', 4011, 4491],
     ['dev', 2000, 2240], ['ben', 1770, 2370], ['dev', 2900, 3380]],
    '10:31'],
   [['ben', 0, 6, 'overlap'], ['chi', 2, 1, 'overlap']]),
  ('partial repair guard 3',
   [[['ana', 4430, 4670], ['ben', 0, 600], ['ana', 2000, 2480], ['ana', 2480, 2960], ['ben', 1229, 1829],
     ['chi', 300, 540], ['ana', 2930, 3530], ['ben', 3329, 3689], ['chi', 2370, 2970], ['chi', 3870, 4590],
     ['chi', 1170, 1770]],
    '10:31'],
   [['ana', 2, 3, 'short_rest'], ['ana', 3, 6, 'overlap'], ['ben', 1, 4, 'short_rest'],
    ['chi', 5, 10, 'short_rest'], ['chi', 10, 8, 'short_rest']]),
  ('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',
   [[['ana', 300, 1020], ['ben', 300, 660], ['ana', 1650, 2370], ['ana', 3030, 3270], ['ben', 2160, 2400],
     ['ana', 3240, 3720]],
    '12:00'],
   [['ana', 0, 2, 'short_rest'], ['ana', 2, 3, 'short_rest'], ['ana', 3, 5, 'overlap']]),
  ('normal control 7',
   [[['ana', 2171, 2651], ['ben', 2000, 2600], ['dev', 300, 660], ['ben', 2600, 2840], ['dev', 4260, 4980],
     ['ben', 2720, 3440], ['dev', 2160, 2760], ['ana', 0, 360], ['ben', 5440, 5680], ['ana', 991, 1471]],
    '12:00'],
   [['ana', 7, 9, 'short_rest'], ['ana', 9, 0, 'short_rest'], ['ben', 1, 3, 'short_rest'],
    ['ben', 3, 5, 'overlap']]),
  ('normal control 8', [[['ana', 1320, 1920], ['ana', 3031, 3751], ['ana', 2551, 3031]], '10:31'],
   [['ana', 2, 1, 'short_rest']])],
 [('regression: rest threshold inclusive 1',
   [[['ben', 1140, 1740], ['ben', 3270, 3870], ['chi', 1620, 2220], ['ana', 2189, 2429], ['ana', 1320, 1560],
     ['chi', 3211, 3571], ['ben', 300, 540], ['ben', 2401, 2641], ['chi', 2851, 3331], ['ana', 3058, 3658],
     ['chi', 300, 1020]],
    '10:31'],
   [['ana', 4, 3, 'short_rest'], ['ana', 3, 9, 'short_rest'], ['ben', 6, 0, 'short_rest'],
    ['ben', 7, 1, 'short_rest'], ['chi', 10, 2, 'short_rest'], ['chi', 8, 5, 'overlap']]),
  ('regression variant: rest threshold inclusive 2',
   [[['ben', 4430, 4670], ['chi', 3880, 4240], ['chi', 2000, 2240], ['ben', 2000, 2480], ['ben', 3110, 3590],
     ['ana', 1680, 2160], ['chi', 2940, 3180], ['ben', 4490, 5090], ['ana', 1320, 1800]],
    '10:30'],
   [['ana', 8, 5, 'overlap'], ['ben', 0, 7, 'overlap']]),
  ('partial repair guard 3',
   [[['ana', 3981, 4341], ['chi', 4081, 4561], ['chi', 1320, 1680], ['chi', 5221, 5581], ['ben', 1351, 2071],
     ['ben', 0, 720], ['ana', 2000, 2720], ['ana', 2720, 3320], ['chi', 3180, 3420]],
    '09:45'],
   [['ana', 6, 7, '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', 240, 720], ['dev', 0, 360]], '10:30'], [['dev', 1, 0, 'overlap']]),
  ('normal control 7', [[['chi', 660, 1260], ['chi', 300, 780]], '12:00'], [['chi', 1, 0, 'overlap']]),
  ('normal control 8',
   [[['dev', 0, 360], ['dev', 1021, 1501], ['ana', 0, 720], ['ana', 1350, 2070], ['dev', 0, 600],
     ['dev', 2132, 2492]],
    '10:31'],
   [['ana', 2, 3, 'short_rest'], ['dev', 0, 4, 'overlap'], ['dev', 4, 1, '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: rest threshold inclusive 1[['ana', 0, 1, 'short_rest']][]Failed
regression variant: rest threshold inclusive 2[['ana', 1, 3, 'short_rest'], ['chi', 0, 4, 'overlap'], ['chi', 4, 5, 'short_rest']][['chi', 0, 4, 'overlap'], ['chi', 4, 5, 'short_rest']]Failed
partial repair guard 3[['dev', 0, 2, 'short_rest']][['dev', 0, 2, '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[['chi', 0, 1, 'overlap']][['chi', 0, 1, 'overlap']]Passed
normal control 7[['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']][['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']]Passed
normal control 8[['ana', 0, 2, 'short_rest'], ['ana', 2, 1, 'short_rest']][['ana', 2, 1, 'short_rest']]Failed

SHA-256 / e5c80cd0eac693077c96ec7489638532ffcda1bfdabeb6b0ee2600cfda56ed12

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 gap < 0:
                    out.append([w, pi, i, 'overlap'])
                elif 0 < 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: rest threshold inclusive 1', [[['ana', 0, 480], ['ana', 1140, 1620]], '11:00'], []),
  ('regression variant: rest threshold inclusive 2',
   [[['chi', 1940, 2420], ['ana', 1320, 1680], ['ana', 5760, 6480], ['ana', 2340, 2700], ['chi', 2000, 2720],
     ['chi', 3051, 3771], ['ana', 4700, 5060]],
    '11:00'],
   [['chi', 0, 4, 'overlap'], ['chi', 4, 5, 'short_rest']]),
  ('partial repair guard 3',
   [[['dev', 2551, 3031], ['dev', 1411, 1651], ['dev', 3031, 3391], ['dev', 300, 780]], '10:30'],
   [['dev', 0, 2, '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', 2000, 2360], ['chi', 2240, 2600], ['chi', 5449, 5929], ['chi', 4100, 4820]], '09:45'],
   [['chi', 0, 1, 'overlap']]),
  ('normal control 7',
   [[['ben', 2911, 3391], ['ben', 1921, 2281], ['ben', 300, 1020], ['ana', 1170, 1770], ['chi', 1200, 1920],
     ['chi', 0, 600], ['chi', 1800, 2160], ['ben', 1681, 2041], ['ana', 0, 720], ['ana', 690, 1170]],
    '12:00'],
   [['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'],
    ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'],
    ['chi', 4, 6, 'overlap']]),
  ('normal control 8', [[['ana', 1320, 1920], ['ana', 3031, 3751], ['ana', 2551, 3031]], '10:31'],
   [['ana', 2, 1, 'short_rest']])],
 [('regression: rest threshold inclusive 1', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
  ('regression variant: rest threshold inclusive 2',
   [[['ben', 3242, 3962], ['chi', 0, 600], ['ben', 300, 540], ['ben', 1140, 1740], ['chi', 2100, 2460],
     ['ben', 2371, 2611]],
    '10:31'],
   [['ben', 2, 3, 'short_rest']]),
  ('partial repair guard 3',
   [[['ben', 300, 900], ['ana', 720, 1080], ['dev', 4100, 4820], ['dev', 2000, 2600], ['ana', 240, 840],
     ['ben', 1531, 1891], ['dev', 5520, 5760], ['ben', 2791, 3151], ['ben', 3851, 4091], ['dev', 6420, 7020],
     ['ana', 0, 240]],
    '10:31'],
   [['ana', 10, 4, 'short_rest'], ['ana', 4, 1, 'overlap']]),
  ('boundary control 4', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
   [['ana', 0, 1, 'short_rest']]),
  ('normal control 5',
   [[['ana', 1260, 1860], ['chi', 3000, 3360], ['ana', 1320, 1560], ['chi', 3060, 3780], ['ana', 3360, 3600],
     ['chi', 2000, 2360]],
    '09:45'],
   [['ana', 0, 2, 'overlap'], ['chi', 1, 3, 'overlap']]),
  ('normal control 6', [[['ana', 2000, 2720], ['ana', 3350, 4070], ['ana', 4770, 5250]], '11:00'],
   [['ana', 0, 1, 'short_rest']]),
  ('normal control 7', [[['ben', 5860, 6580], ['ben', 2000, 2720], ['ben', 4720, 4960]], '10:31'], []),
  ('normal control 8',
   [[['chi', 2000, 2600], ['ben', 300, 1020], ['chi', 3200, 3800], ['ben', 990, 1350], ['ben', 1950, 2550]],
    '11:00'],
   [['ben', 1, 3, 'overlap'], ['ben', 3, 4, 'short_rest'], ['chi', 0, 2, 'short_rest']])],
 [('regression: rest threshold inclusive 1',
   [[['chi', 2000, 2240], ['ana', 2551, 3271], ['ana', 1320, 1920], ['chi', 2840, 3200], ['ana', 3931, 4651]],
    '10:31'],
   [['chi', 0, 3, 'short_rest']]),
  ('regression variant: rest threshold inclusive 2',
   [[['ana', 3060, 3420], ['dev', 2800, 3280], ['chi', 3051, 3771], ['dev', 1540, 2140], ['chi', 2000, 2480],
     ['dev', 0, 240], ['ana', 300, 780], ['chi', 1940, 2420], ['dev', 120, 840], ['ana', 1680, 2400]],
    '11:00'],
   [['chi', 7, 4, 'overlap'], ['chi', 4, 2, 'short_rest'], ['dev', 5, 8, 'overlap']]),
  ('partial repair guard 3',
   [[['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']]),
  ('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',
   [[['ben', 1320, 1800], ['ben', 2400, 3000], ['dev', 2580, 2820], ['dev', 1320, 1920]], '09:45'], []),
  ('normal control 7',
   [[['dev', 300, 1020], ['ben', 2280, 3000], ['dev', 2520, 3000], ['ben', 1320, 1680]], '10:30'],
   [['ben', 3, 1, 'short_rest']]),
  ('normal control 8',
   [[['chi', 2680, 3160], ['chi', 3789, 4269], ['chi', 300, 900], ['dev', 2309, 3029], ['chi', 1600, 2080],
     ['dev', 1320, 1680]],
    '12:00'],
   [['chi', 2, 4, 'short_rest'], ['chi', 4, 0, 'short_rest'], ['chi', 0, 1, 'short_rest'],
    ['dev', 5, 3, 'short_rest']])],
 [('regression: rest threshold inclusive 1', [[['ben', 900, 1500], ['ben', 0, 240]], '11:00'], []),
  ('regression variant: rest threshold inclusive 2',
   [[['ben', 1320, 1800], ['chi', 1320, 1920], ['chi', 1260, 1740], ['chi', 2640, 3120], ['dev', 4011, 4491],
     ['dev', 2000, 2240], ['ben', 1770, 2370], ['dev', 2900, 3380]],
    '10:31'],
   [['ben', 0, 6, 'overlap'], ['chi', 2, 1, 'overlap']]),
  ('partial repair guard 3',
   [[['ana', 4430, 4670], ['ben', 0, 600], ['ana', 2000, 2480], ['ana', 2480, 2960], ['ben', 1229, 1829],
     ['chi', 300, 540], ['ana', 2930, 3530], ['ben', 3329, 3689], ['chi', 2370, 2970], ['chi', 3870, 4590],
     ['chi', 1170, 1770]],
    '10:31'],
   [['ana', 2, 3, 'short_rest'], ['ana', 3, 6, 'overlap'], ['ben', 1, 4, 'short_rest'],
    ['chi', 5, 10, 'short_rest'], ['chi', 10, 8, 'short_rest']]),
  ('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',
   [[['ana', 300, 1020], ['ben', 300, 660], ['ana', 1650, 2370], ['ana', 3030, 3270], ['ben', 2160, 2400],
     ['ana', 3240, 3720]],
    '12:00'],
   [['ana', 0, 2, 'short_rest'], ['ana', 2, 3, 'short_rest'], ['ana', 3, 5, 'overlap']]),
  ('normal control 7',
   [[['ana', 2171, 2651], ['ben', 2000, 2600], ['dev', 300, 660], ['ben', 2600, 2840], ['dev', 4260, 4980],
     ['ben', 2720, 3440], ['dev', 2160, 2760], ['ana', 0, 360], ['ben', 5440, 5680], ['ana', 991, 1471]],
    '12:00'],
   [['ana', 7, 9, 'short_rest'], ['ana', 9, 0, 'short_rest'], ['ben', 1, 3, 'short_rest'],
    ['ben', 3, 5, 'overlap']]),
  ('normal control 8', [[['ana', 1320, 1920], ['ana', 3031, 3751], ['ana', 2551, 3031]], '10:31'],
   [['ana', 2, 1, 'short_rest']])],
 [('regression: rest threshold inclusive 1',
   [[['ben', 1140, 1740], ['ben', 3270, 3870], ['chi', 1620, 2220], ['ana', 2189, 2429], ['ana', 1320, 1560],
     ['chi', 3211, 3571], ['ben', 300, 540], ['ben', 2401, 2641], ['chi', 2851, 3331], ['ana', 3058, 3658],
     ['chi', 300, 1020]],
    '10:31'],
   [['ana', 4, 3, 'short_rest'], ['ana', 3, 9, 'short_rest'], ['ben', 6, 0, 'short_rest'],
    ['ben', 7, 1, 'short_rest'], ['chi', 10, 2, 'short_rest'], ['chi', 8, 5, 'overlap']]),
  ('regression variant: rest threshold inclusive 2',
   [[['ben', 4430, 4670], ['chi', 3880, 4240], ['chi', 2000, 2240], ['ben', 2000, 2480], ['ben', 3110, 3590],
     ['ana', 1680, 2160], ['chi', 2940, 3180], ['ben', 4490, 5090], ['ana', 1320, 1800]],
    '10:30'],
   [['ana', 8, 5, 'overlap'], ['ben', 0, 7, 'overlap']]),
  ('partial repair guard 3',
   [[['ana', 3981, 4341], ['chi', 4081, 4561], ['chi', 1320, 1680], ['chi', 5221, 5581], ['ben', 1351, 2071],
     ['ben', 0, 720], ['ana', 2000, 2720], ['ana', 2720, 3320], ['chi', 3180, 3420]],
    '09:45'],
   [['ana', 6, 7, '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', 240, 720], ['dev', 0, 360]], '10:30'], [['dev', 1, 0, 'overlap']]),
  ('normal control 7', [[['chi', 660, 1260], ['chi', 300, 780]], '12:00'], [['chi', 1, 0, 'overlap']]),
  ('normal control 8',
   [[['dev', 0, 360], ['dev', 1021, 1501], ['ana', 0, 720], ['ana', 1350, 2070], ['dev', 0, 600],
     ['dev', 2132, 2492]],
    '10:31'],
   [['ana', 2, 3, 'short_rest'], ['dev', 0, 4, 'overlap'], ['dev', 4, 1, '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: rest threshold inclusive 1[][]Passed
regression variant: rest threshold inclusive 2[['chi', 0, 4, 'overlap'], ['chi', 4, 5, 'short_rest']][['chi', 0, 4, 'overlap'], ['chi', 4, 5, 'short_rest']]Passed
partial repair guard 3[][['dev', 0, 2, '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[['chi', 0, 1, 'overlap']][['chi', 0, 1, 'overlap']]Passed
normal control 7[['ana', 8, 9, 'overlap'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']][['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']]Failed
normal control 8[][['ana', 2, 1, 'short_rest']]Failed

SHA-256 / d4bb961b79fbdc1b1343dbf6c77e2114b4fc379b2f4fc8d3f83a4787a10062b6

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: rest threshold inclusive 1', [[['ana', 0, 480], ['ana', 1140, 1620]], '11:00'], []),
  ('regression variant: rest threshold inclusive 2',
   [[['chi', 1940, 2420], ['ana', 1320, 1680], ['ana', 5760, 6480], ['ana', 2340, 2700], ['chi', 2000, 2720],
     ['chi', 3051, 3771], ['ana', 4700, 5060]],
    '11:00'],
   [['chi', 0, 4, 'overlap'], ['chi', 4, 5, 'short_rest']]),
  ('partial repair guard 3',
   [[['dev', 2551, 3031], ['dev', 1411, 1651], ['dev', 3031, 3391], ['dev', 300, 780]], '10:30'],
   [['dev', 0, 2, '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', 2000, 2360], ['chi', 2240, 2600], ['chi', 5449, 5929], ['chi', 4100, 4820]], '09:45'],
   [['chi', 0, 1, 'overlap']]),
  ('normal control 7',
   [[['ben', 2911, 3391], ['ben', 1921, 2281], ['ben', 300, 1020], ['ana', 1170, 1770], ['chi', 1200, 1920],
     ['chi', 0, 600], ['chi', 1800, 2160], ['ben', 1681, 2041], ['ana', 0, 720], ['ana', 690, 1170]],
    '12:00'],
   [['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'],
    ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'],
    ['chi', 4, 6, 'overlap']]),
  ('normal control 8', [[['ana', 1320, 1920], ['ana', 3031, 3751], ['ana', 2551, 3031]], '10:31'],
   [['ana', 2, 1, 'short_rest']])],
 [('regression: rest threshold inclusive 1', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
  ('regression variant: rest threshold inclusive 2',
   [[['ben', 3242, 3962], ['chi', 0, 600], ['ben', 300, 540], ['ben', 1140, 1740], ['chi', 2100, 2460],
     ['ben', 2371, 2611]],
    '10:31'],
   [['ben', 2, 3, 'short_rest']]),
  ('partial repair guard 3',
   [[['ben', 300, 900], ['ana', 720, 1080], ['dev', 4100, 4820], ['dev', 2000, 2600], ['ana', 240, 840],
     ['ben', 1531, 1891], ['dev', 5520, 5760], ['ben', 2791, 3151], ['ben', 3851, 4091], ['dev', 6420, 7020],
     ['ana', 0, 240]],
    '10:31'],
   [['ana', 10, 4, 'short_rest'], ['ana', 4, 1, 'overlap']]),
  ('boundary control 4', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
   [['ana', 0, 1, 'short_rest']]),
  ('normal control 5',
   [[['ana', 1260, 1860], ['chi', 3000, 3360], ['ana', 1320, 1560], ['chi', 3060, 3780], ['ana', 3360, 3600],
     ['chi', 2000, 2360]],
    '09:45'],
   [['ana', 0, 2, 'overlap'], ['chi', 1, 3, 'overlap']]),
  ('normal control 6', [[['ana', 2000, 2720], ['ana', 3350, 4070], ['ana', 4770, 5250]], '11:00'],
   [['ana', 0, 1, 'short_rest']]),
  ('normal control 7', [[['ben', 5860, 6580], ['ben', 2000, 2720], ['ben', 4720, 4960]], '10:31'], []),
  ('normal control 8',
   [[['chi', 2000, 2600], ['ben', 300, 1020], ['chi', 3200, 3800], ['ben', 990, 1350], ['ben', 1950, 2550]],
    '11:00'],
   [['ben', 1, 3, 'overlap'], ['ben', 3, 4, 'short_rest'], ['chi', 0, 2, 'short_rest']])],
 [('regression: rest threshold inclusive 1',
   [[['chi', 2000, 2240], ['ana', 2551, 3271], ['ana', 1320, 1920], ['chi', 2840, 3200], ['ana', 3931, 4651]],
    '10:31'],
   [['chi', 0, 3, 'short_rest']]),
  ('regression variant: rest threshold inclusive 2',
   [[['ana', 3060, 3420], ['dev', 2800, 3280], ['chi', 3051, 3771], ['dev', 1540, 2140], ['chi', 2000, 2480],
     ['dev', 0, 240], ['ana', 300, 780], ['chi', 1940, 2420], ['dev', 120, 840], ['ana', 1680, 2400]],
    '11:00'],
   [['chi', 7, 4, 'overlap'], ['chi', 4, 2, 'short_rest'], ['dev', 5, 8, 'overlap']]),
  ('partial repair guard 3',
   [[['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']]),
  ('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',
   [[['ben', 1320, 1800], ['ben', 2400, 3000], ['dev', 2580, 2820], ['dev', 1320, 1920]], '09:45'], []),
  ('normal control 7',
   [[['dev', 300, 1020], ['ben', 2280, 3000], ['dev', 2520, 3000], ['ben', 1320, 1680]], '10:30'],
   [['ben', 3, 1, 'short_rest']]),
  ('normal control 8',
   [[['chi', 2680, 3160], ['chi', 3789, 4269], ['chi', 300, 900], ['dev', 2309, 3029], ['chi', 1600, 2080],
     ['dev', 1320, 1680]],
    '12:00'],
   [['chi', 2, 4, 'short_rest'], ['chi', 4, 0, 'short_rest'], ['chi', 0, 1, 'short_rest'],
    ['dev', 5, 3, 'short_rest']])],
 [('regression: rest threshold inclusive 1', [[['ben', 900, 1500], ['ben', 0, 240]], '11:00'], []),
  ('regression variant: rest threshold inclusive 2',
   [[['ben', 1320, 1800], ['chi', 1320, 1920], ['chi', 1260, 1740], ['chi', 2640, 3120], ['dev', 4011, 4491],
     ['dev', 2000, 2240], ['ben', 1770, 2370], ['dev', 2900, 3380]],
    '10:31'],
   [['ben', 0, 6, 'overlap'], ['chi', 2, 1, 'overlap']]),
  ('partial repair guard 3',
   [[['ana', 4430, 4670], ['ben', 0, 600], ['ana', 2000, 2480], ['ana', 2480, 2960], ['ben', 1229, 1829],
     ['chi', 300, 540], ['ana', 2930, 3530], ['ben', 3329, 3689], ['chi', 2370, 2970], ['chi', 3870, 4590],
     ['chi', 1170, 1770]],
    '10:31'],
   [['ana', 2, 3, 'short_rest'], ['ana', 3, 6, 'overlap'], ['ben', 1, 4, 'short_rest'],
    ['chi', 5, 10, 'short_rest'], ['chi', 10, 8, 'short_rest']]),
  ('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',
   [[['ana', 300, 1020], ['ben', 300, 660], ['ana', 1650, 2370], ['ana', 3030, 3270], ['ben', 2160, 2400],
     ['ana', 3240, 3720]],
    '12:00'],
   [['ana', 0, 2, 'short_rest'], ['ana', 2, 3, 'short_rest'], ['ana', 3, 5, 'overlap']]),
  ('normal control 7',
   [[['ana', 2171, 2651], ['ben', 2000, 2600], ['dev', 300, 660], ['ben', 2600, 2840], ['dev', 4260, 4980],
     ['ben', 2720, 3440], ['dev', 2160, 2760], ['ana', 0, 360], ['ben', 5440, 5680], ['ana', 991, 1471]],
    '12:00'],
   [['ana', 7, 9, 'short_rest'], ['ana', 9, 0, 'short_rest'], ['ben', 1, 3, 'short_rest'],
    ['ben', 3, 5, 'overlap']]),
  ('normal control 8', [[['ana', 1320, 1920], ['ana', 3031, 3751], ['ana', 2551, 3031]], '10:31'],
   [['ana', 2, 1, 'short_rest']])],
 [('regression: rest threshold inclusive 1',
   [[['ben', 1140, 1740], ['ben', 3270, 3870], ['chi', 1620, 2220], ['ana', 2189, 2429], ['ana', 1320, 1560],
     ['chi', 3211, 3571], ['ben', 300, 540], ['ben', 2401, 2641], ['chi', 2851, 3331], ['ana', 3058, 3658],
     ['chi', 300, 1020]],
    '10:31'],
   [['ana', 4, 3, 'short_rest'], ['ana', 3, 9, 'short_rest'], ['ben', 6, 0, 'short_rest'],
    ['ben', 7, 1, 'short_rest'], ['chi', 10, 2, 'short_rest'], ['chi', 8, 5, 'overlap']]),
  ('regression variant: rest threshold inclusive 2',
   [[['ben', 4430, 4670], ['chi', 3880, 4240], ['chi', 2000, 2240], ['ben', 2000, 2480], ['ben', 3110, 3590],
     ['ana', 1680, 2160], ['chi', 2940, 3180], ['ben', 4490, 5090], ['ana', 1320, 1800]],
    '10:30'],
   [['ana', 8, 5, 'overlap'], ['ben', 0, 7, 'overlap']]),
  ('partial repair guard 3',
   [[['ana', 3981, 4341], ['chi', 4081, 4561], ['chi', 1320, 1680], ['chi', 5221, 5581], ['ben', 1351, 2071],
     ['ben', 0, 720], ['ana', 2000, 2720], ['ana', 2720, 3320], ['chi', 3180, 3420]],
    '09:45'],
   [['ana', 6, 7, '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', 240, 720], ['dev', 0, 360]], '10:30'], [['dev', 1, 0, 'overlap']]),
  ('normal control 7', [[['chi', 660, 1260], ['chi', 300, 780]], '12:00'], [['chi', 1, 0, 'overlap']]),
  ('normal control 8',
   [[['dev', 0, 360], ['dev', 1021, 1501], ['ana', 0, 720], ['ana', 1350, 2070], ['dev', 0, 600],
     ['dev', 2132, 2492]],
    '10:31'],
   [['ana', 2, 3, 'short_rest'], ['dev', 0, 4, 'overlap'], ['dev', 4, 1, '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: rest threshold inclusive 1[][]Passed
regression variant: rest threshold inclusive 2[['chi', 0, 4, 'overlap'], ['chi', 4, 5, 'short_rest']][['chi', 0, 4, 'overlap'], ['chi', 4, 5, 'short_rest']]Passed
partial repair guard 3[['dev', 0, 2, 'short_rest']][['dev', 0, 2, '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[['chi', 0, 1, 'overlap']][['chi', 0, 1, 'overlap']]Passed
normal control 7[['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']][['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']]Passed
normal control 8[['ana', 2, 1, 'short_rest']][['ana', 2, 1, 'short_rest']]Passed

SHA-256 / 63cb3fd08132dea526b4b3b9a4bc24cf75a7bd63239e06104d81ecf4d34a99f4

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

Case digest / 27656c296f936e38903d7638460fa8b7027f5e8f2b3cffb57ea646e03fbbcc65