FAILURE MAP
← Case archive

FA-94281 / Shift rostering labor rules / Open access

Bid cap compared with all shifts taken by anyone · case 01

Workers stop bidding once the whole team has taken as many shifts as their personal cap.

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

ROOT CAUSE

The maximum-shift check uses the global taken count.

VERIFIED REPAIR

Compare each worker's own holdings with their cap.

Unsuccessful approach: An exclusive comparison lets a worker exceed their cap by one.

Case contract

workers [id, hire day, max shifts]; shifts id -> [start, end]; prefs id -> ordered shift ids. Bidding rounds repeat until nobody picks: in each round workers in seniority order (earlier hire day, then id) take their first preferred shift that is untaken and does not overlap a shift they already hold (touching is fine), one pick per round, until reaching their maximum. Return worker -> picks in order.

Why this case matters

Seniority bidding is a common contractual roster procedure; each rule change reallocates shifts.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(workers, shifts, prefs):
    order = sorted(workers, key=lambda w: (w[1], w[0]))
    taken = {}
    got = {w[0]: [] for w in workers}
    changed = True
    while changed:
        changed = False
        for wid, hire, cap in order:
            if len(taken) >= cap:
                continue
            for sid in prefs.get(wid, []):
                if sid in taken:
                    continue
                s, e = shifts[sid]
                if any(s < shifts[o][1] and shifts[o][0] < e for o in got[wid]):
                    continue
                taken[sid] = wid
                got[wid].append(sid)
                changed = True
                break
    return got
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: personal cap 1',
   [[['w0', 200, 3], ['w1', 200, 1]],
    {'s0': [240, 720], 's1': [0, 480], 's2': [0, 240], 's3': [0, 480], 's4': [480, 960], 's5': [240, 720]},
    {'w0': ['s4', 's0', 's1', 's3', 's5', 's2'], 'w1': ['s3', 's5', 's0']}],
   {'w0': ['s4', 's1'], 'w1': ['s3']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 1], ['w1', 200, 1], ['w2', 200, 1]],
    {'s0': [0, 480], 's1': [960, 1440], 's2': [960, 1440], 's3': [960, 1440], 's4': [240, 480]},
    {'w0': ['s3'], 'w1': ['s1'], 'w2': ['s1', 's0', 's4', 's3']}],
   {'w0': ['s3'], 'w1': ['s1'], 'w2': ['s0']}),
  ('partial repair guard 3',
   [[['w0', 100, 2], ['w1', 300, 1]],
    {'s0': [0, 480], 's1': [0, 240], 's2': [480, 720], 's3': [240, 720], 's4': [480, 720]},
    {'w0': ['s4', 's3'], 'w1': ['s0', 's4', 's2']}],
   {'w0': ['s4'], 'w1': ['s0']}),
  ('normal control 4',
   [[['w0', 200, 1], ['w1', 200, 1]],
    {'s0': [960, 1440],
     's1': [960, 1440],
     's2': [960, 1200],
     's3': [480, 960],
     's4': [240, 720],
     's5': [720, 1200]},
    {'w0': ['s3', 's0', 's1', 's5', 's2'], 'w1': ['s3', 's1', 's4', 's5', 's2']}],
   {'w0': ['s3'], 'w1': ['s1']}),
  ('normal control 5',
   [[['w0', 300, 3], ['w1', 200, 1], ['w2', 200, 3], ['w3', 200, 1]],
    {'s0': [240, 720], 's1': [960, 1440], 's2': [240, 720]},
    {'w0': ['s1', 's2'], 'w1': ['s1'], 'w2': ['s2', 's0'], 'w3': ['s2', 's1', 's0']}],
   {'w0': [], 'w1': ['s1'], 'w2': ['s2'], 'w3': ['s0']}),
  ('normal control 6',
   [[['w0', 300, 1], ['w1', 200, 3], ['w2', 200, 3]],
    {'s0': [720, 1200], 's1': [720, 1200], 's2': [720, 1200]},
    {'w0': ['s0'], 'w1': ['s0', 's1'], 'w2': ['s1', 's2', 's0']}],
   {'w0': [], 'w1': ['s0'], 'w2': ['s1']}),
  ('normal control 7',
   [[['w0', 200, 2], ['w1', 200, 1], ['w2', 200, 2]],
    {'s0': [0, 240], 's1': [240, 480], 's2': [480, 720], 's3': [720, 960], 's4': [960, 1440]},
    {'w0': ['s2', 's1', 's3', 's0'],
     'w1': ['s1', 's3', 's0', 's4', 's2'],
     'w2': ['s0', 's4', 's1', 's3', 's2']}],
   {'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}),
  ('normal control 8',
   [[['w0', 100, 3], ['w1', 100, 3], ['w2', 100, 3]],
    {'s0': [480, 960], 's1': [960, 1440], 's2': [720, 1200], 's3': [960, 1440], 's4': [960, 1200]},
    {'w0': ['s0', 's3'], 'w1': ['s2', 's1'], 'w2': ['s0']}],
   {'w0': ['s0', 's3'], 'w1': ['s2'], 'w2': []})],
 [('regression: personal cap 1',
   [[['w0', 100, 2], ['w1', 200, 1]],
    {'s0': [960, 1440], 's1': [0, 480], 's2': [720, 1200], 's3': [0, 240], 's4': [0, 480]},
    {'w0': ['s3', 's2', 's4'], 'w1': ['s0', 's3', 's2', 's1']}],
   {'w0': ['s3', 's2'], 'w1': ['s0']}),
  ('regression variant: personal cap 2',
   [[['w0', 300, 3], ['w1', 200, 1], ['w2', 300, 2]],
    {'s0': [0, 480],
     's1': [960, 1440],
     's2': [240, 720],
     's3': [960, 1440],
     's4': [480, 960],
     's5': [0, 480]},
    {'w0': ['s3'], 'w1': ['s0'], 'w2': ['s0', 's1', 's5']}],
   {'w0': ['s3'], 'w1': ['s0'], 'w2': ['s1', 's5']}),
  ('partial repair guard 3',
   [[['w0', 200, 1], ['w1', 200, 1]], {'s0': [240, 480], 's1': [0, 240], 's2': [720, 1200], 's3': [480, 720]},
    {'w0': ['s0'], 'w1': ['s1', 's3', 's0']}],
   {'w0': ['s0'], 'w1': ['s1']}),
  ('normal control 4',
   [[['w0', 100, 2], ['w1', 300, 2], ['w2', 200, 1]], {'s0': [240, 720], 's1': [480, 720], 's2': [240, 720]},
    {'w0': ['s0'], 'w1': ['s0', 's2', 's1'], 'w2': ['s0']}],
   {'w0': ['s0'], 'w1': ['s2'], 'w2': []}),
  ('normal control 5',
   [[['w0', 300, 3], ['w1', 300, 3], ['w2', 300, 1], ['w3', 300, 3]],
    {'s0': [720, 960], 's1': [240, 480], 's2': [0, 240], 's3': [720, 1200], 's4': [0, 480], 's5': [0, 480]},
    {'w0': ['s5', 's4', 's3', 's0', 's1'],
     'w1': ['s5', 's3', 's1', 's0', 's2', 's4'],
     'w2': ['s3'],
     'w3': ['s3', 's4', 's2', 's0']}],
   {'w0': ['s5', 's0'], 'w1': ['s3', 's1', 's2'], 'w2': [], 'w3': ['s4']}),
  ('normal control 6',
   [[['w0', 200, 2], ['w1', 200, 1], ['w2', 200, 2]],
    {'s0': [0, 240], 's1': [240, 480], 's2': [480, 720], 's3': [720, 960], 's4': [960, 1440]},
    {'w0': ['s2', 's1', 's3', 's0'],
     'w1': ['s1', 's3', 's0', 's4', 's2'],
     'w2': ['s0', 's4', 's1', 's3', 's2']}],
   {'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}),
  ('normal control 7',
   [[['w0', 200, 1], ['w1', 300, 2], ['w2', 200, 2], ['w3', 200, 1]],
    {'s0': [720, 960], 's1': [480, 720], 's2': [0, 240]},
    {'w0': ['s1'], 'w1': ['s2'], 'w2': ['s1'], 'w3': ['s2', 's0', 's1']}],
   {'w0': ['s1'], 'w1': [], 'w2': [], 'w3': ['s2']}),
  ('normal control 8',
   [[['w0', 200, 2], ['w1', 100, 3], ['w2', 200, 1]], {'s0': [240, 480], 's1': [240, 480], 's2': [480, 720]},
    {'w0': ['s1', 's0'], 'w1': ['s2', 's1'], 'w2': ['s0', 's1', 's2']}],
   {'w0': ['s1'], 'w1': ['s2'], 'w2': ['s0']})],
 [('regression: personal cap 1',
   [[['w0', 300, 2], ['w1', 300, 2], ['w2', 100, 1], ['w3', 100, 1]],
    {'s0': [0, 480], 's1': [960, 1200], 's2': [960, 1200]},
    {'w0': ['s0', 's1'], 'w1': ['s2'], 'w2': ['s2'], 'w3': ['s1', 's0', 's2']}],
   {'w0': ['s0'], 'w1': [], 'w2': ['s2'], 'w3': ['s1']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 2], ['w1', 200, 3], ['w2', 300, 3], ['w3', 300, 2]],
    {'s0': [0, 480], 's1': [240, 720], 's2': [480, 960], 's3': [240, 720], 's4': [720, 1200]},
    {'w0': ['s1', 's4', 's2'],
     'w1': ['s4', 's0', 's3', 's1', 's2'],
     'w2': ['s2', 's0', 's3', 's4', 's1'],
     'w3': ['s1', 's2']}],
   {'w0': ['s1'], 'w1': ['s4', 's0'], 'w2': ['s2'], 'w3': []}),
  ('partial repair guard 3',
   [[['w0', 200, 1], ['w1', 100, 3]],
    {'s0': [240, 480], 's1': [0, 480], 's2': [0, 240], 's3': [720, 1200], 's4': [720, 960], 's5': [240, 720]},
    {'w0': ['s1', 's4', 's3', 's2', 's0', 's5'], 'w1': ['s5', 's1', 's0', 's3']}],
   {'w0': ['s1'], 'w1': ['s5', 's3']}),
  ('normal control 4',
   [[['w0', 200, 3], ['w1', 100, 3], ['w2', 200, 1]],
    {'s0': [0, 240],
     's1': [240, 720],
     's2': [960, 1200],
     's3': [720, 960],
     's4': [720, 1200],
     's5': [720, 1200]},
    {'w0': ['s4', 's5', 's3', 's2', 's1', 's0'], 'w1': ['s3', 's2', 's5', 's0', 's1'], 'w2': ['s4']}],
   {'w0': ['s4', 's1'], 'w1': ['s3', 's2', 's0'], 'w2': []}),
  ('normal control 5',
   [[['w0', 200, 2], ['w1', 100, 2], ['w2', 300, 1]],
    {'s0': [0, 240], 's1': [960, 1200], 's2': [960, 1440], 's3': [720, 960], 's4': [480, 720]},
    {'w0': ['s1', 's3', 's0', 's2'], 'w1': ['s1', 's4', 's0', 's3'], 'w2': ['s0', 's4', 's1', 's3']}],
   {'w0': ['s3', 's2'], 'w1': ['s1', 's4'], 'w2': ['s0']}),
  ('normal control 6',
   [[['w0', 100, 2], ['w1', 100, 3], ['w2', 100, 1], ['w3', 200, 3]],
    {'s0': [480, 960], 's1': [240, 480], 's2': [480, 960], 's3': [480, 720], 's4': [240, 720]},
    {'w0': ['s1'], 'w1': ['s0'], 'w2': ['s3', 's0'], 'w3': ['s4', 's3']}],
   {'w0': ['s1'], 'w1': ['s0'], 'w2': ['s3'], 'w3': ['s4']}),
  ('normal control 7',
   [[['w0', 100, 1], ['w1', 300, 1], ['w2', 100, 2]], {'s0': [960, 1440], 's1': [0, 480], 's2': [720, 960]},
    {'w0': ['s0', 's1', 's2'], 'w1': ['s2', 's0'], 'w2': ['s2']}],
   {'w0': ['s0'], 'w1': [], 'w2': ['s2']}),
  ('normal control 8',
   [[['w0', 200, 3], ['w1', 200, 1]],
    {'s0': [960, 1440], 's1': [960, 1440], 's2': [960, 1200], 's3': [720, 960]},
    {'w0': ['s0'], 'w1': ['s0', 's3']}],
   {'w0': ['s0'], 'w1': ['s3']})],
 [('regression: personal cap 1',
   [[['w0', 100, 1], ['w1', 100, 1], ['w2', 200, 1], ['w3', 100, 1]],
    {'s0': [0, 480], 's1': [960, 1200], 's2': [960, 1200], 's3': [480, 960]},
    {'w0': ['s0', 's1'], 'w1': ['s3', 's0'], 'w2': ['s2'], 'w3': ['s0', 's2', 's1', 's3']}],
   {'w0': ['s0'], 'w1': ['s3'], 'w2': [], 'w3': ['s2']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 1], ['w1', 200, 1]], {'s0': [240, 480], 's1': [0, 240], 's2': [720, 1200], 's3': [480, 720]},
    {'w0': ['s0'], 'w1': ['s1', 's3', 's0']}],
   {'w0': ['s0'], 'w1': ['s1']}),
  ('partial repair guard 3',
   [[['w0', 100, 1], ['w1', 300, 3], ['w2', 200, 3]],
    {'s0': [960, 1440],
     's1': [0, 480],
     's2': [240, 480],
     's3': [0, 480],
     's4': [720, 1200],
     's5': [240, 720]},
    {'w0': ['s4', 's5', 's2'],
     'w1': ['s4', 's2', 's0', 's1', 's5', 's3'],
     'w2': ['s3', 's2', 's4', 's1', 's5']}],
   {'w0': ['s4'], 'w1': ['s2', 's0'], 'w2': ['s3']}),
  ('normal control 4',
   [[['w0', 300, 1], ['w1', 300, 1], ['w2', 200, 1], ['w3', 100, 1]],
    {'s0': [240, 480],
     's1': [480, 960],
     's2': [480, 720],
     's3': [480, 960],
     's4': [480, 960],
     's5': [960, 1440]},
    {'w0': ['s2', 's0'], 'w1': ['s0', 's2', 's4'], 'w2': ['s0', 's3', 's1', 's2'], 'w3': ['s3', 's4']}],
   {'w0': ['s2'], 'w1': ['s4'], 'w2': ['s0'], 'w3': ['s3']}),
  ('normal control 5',
   [[['w0', 200, 3], ['w1', 200, 3], ['w2', 100, 1]],
    {'s0': [0, 480], 's1': [720, 1200], 's2': [720, 960], 's3': [240, 720], 's4': [0, 480], 's5': [480, 720]},
    {'w0': ['s2', 's3', 's5', 's0'], 'w1': ['s4', 's5', 's3', 's0'], 'w2': ['s1', 's3', 's0']}],
   {'w0': ['s2', 's3'], 'w1': ['s4', 's5'], 'w2': ['s1']}),
  ('normal control 6',
   [[['w0', 200, 3], ['w1', 300, 1], ['w2', 100, 1]],
    {'s0': [720, 1200], 's1': [240, 720], 's2': [0, 240], 's3': [960, 1200]},
    {'w0': ['s1', 's0', 's3', 's2'], 'w1': ['s3', 's2'], 'w2': ['s2', 's3', 's0', 's1']}],
   {'w0': ['s1', 's0'], 'w1': ['s3'], 'w2': ['s2']}),
  ('normal control 7',
   [[['w0', 200, 1], ['w1', 200, 3]], {'s0': [0, 240], 's1': [0, 240], 's2': [0, 480], 's3': [0, 240]},
    {'w0': ['s1', 's2', 's0', 's3'], 'w1': ['s1', 's0']}],
   {'w0': ['s1'], 'w1': ['s0']}),
  ('normal control 8',
   [[['w0', 100, 1], ['w1', 200, 2]],
    {'s0': [960, 1200], 's1': [720, 960], 's2': [960, 1200], 's3': [480, 720], 's4': [480, 720]},
    {'w0': ['s2'], 'w1': ['s1', 's0', 's3', 's2']}],
   {'w0': ['s2'], 'w1': ['s1', 's0']})],
 [('regression: personal cap 1',
   [[['w0', 200, 1], ['w1', 300, 1], ['w2', 300, 1]], {'s0': [240, 720], 's1': [960, 1440], 's2': [480, 960]},
    {'w0': ['s0'], 'w1': ['s2'], 'w2': ['s2', 's0', 's1']}],
   {'w0': ['s0'], 'w1': ['s2'], 'w2': ['s1']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 2], ['w1', 100, 3]], {'s0': [720, 1200], 's1': [720, 960], 's2': [0, 240], 's3': [240, 480]},
    {'w0': ['s3', 's2'], 'w1': ['s0', 's1', 's3']}],
   {'w0': ['s3', 's2'], 'w1': ['s0']}),
  ('partial repair guard 3',
   [[['w0', 200, 1], ['w1', 100, 2]],
    {'s0': [960, 1200],
     's1': [960, 1200],
     's2': [240, 480],
     's3': [0, 240],
     's4': [720, 1200],
     's5': [720, 960]},
    {'w0': ['s0', 's4'], 'w1': ['s5', 's4', 's3', 's1', 's0']}],
   {'w0': ['s0'], 'w1': ['s5', 's3']}),
  ('normal control 4',
   [[['w0', 100, 3], ['w1', 100, 1], ['w2', 100, 3], ['w3', 300, 2]],
    {'s0': [960, 1440],
     's1': [0, 480],
     's2': [480, 720],
     's3': [960, 1200],
     's4': [0, 480],
     's5': [480, 960]},
    {'w0': ['s3', 's4'],
     'w1': ['s1', 's3', 's2', 's5'],
     'w2': ['s3', 's5', 's4', 's2', 's1', 's0'],
     'w3': ['s2', 's3', 's0']}],
   {'w0': ['s3', 's4'], 'w1': ['s1'], 'w2': ['s5', 's0'], 'w3': ['s2']}),
  ('normal control 5',
   [[['w0', 300, 1], ['w1', 200, 1], ['w2', 200, 3], ['w3', 300, 3]],
    {'s0': [0, 240], 's1': [480, 720], 's2': [480, 720], 's3': [0, 240], 's4': [0, 240]},
    {'w0': ['s1', 's4'], 'w1': ['s4', 's1', 's2', 's3'], 'w2': ['s0', 's2'], 'w3': ['s4']}],
   {'w0': ['s1'], 'w1': ['s4'], 'w2': ['s0', 's2'], 'w3': []}),
  ('normal control 6',
   [[['w0', 200, 2], ['w1', 200, 1]],
    {'s0': [240, 480], 's1': [0, 240], 's2': [720, 960], 's3': [720, 1200], 's4': [960, 1440]},
    {'w0': ['s4', 's1', 's2', 's0'], 'w1': ['s1', 's2', 's3', 's0']}],
   {'w0': ['s4', 's2'], 'w1': ['s1']}),
  ('normal control 7',
   [[['w0', 200, 1], ['w1', 300, 1], ['w2', 300, 3], ['w3', 200, 2]],
    {'s0': [720, 1200],
     's1': [720, 1200],
     's2': [480, 720],
     's3': [0, 480],
     's4': [240, 720],
     's5': [960, 1440]},
    {'w0': ['s2', 's4'], 'w1': ['s3', 's4', 's1'], 'w2': ['s5'], 'w3': ['s0', 's1', 's4', 's5', 's3']}],
   {'w0': ['s2'], 'w1': ['s3'], 'w2': ['s5'], 'w3': ['s0', 's4']}),
  ('normal control 8',
   [[['w0', 200, 1], ['w1', 200, 1]],
    {'s0': [0, 480], 's1': [720, 960], 's2': [720, 1200], 's3': [480, 720], 's4': [480, 720]},
    {'w0': ['s0', 's1', 's3'], 'w1': ['s0', 's2']}],
   {'w0': ['s0'], 'w1': ['s2']})]]
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: personal cap 1{'w0': ['s4', 's1'], 'w1': []}{'w0': ['s4', 's1'], 'w1': ['s3']}Failed
regression variant: personal cap 2{'w0': ['s3'], 'w1': [], 'w2': []}{'w0': ['s3'], 'w1': ['s1'], 'w2': ['s0']}Failed
partial repair guard 3{'w0': ['s4'], 'w1': []}{'w0': ['s4'], 'w1': ['s0']}Failed
normal control 4{'w0': ['s3'], 'w1': []}{'w0': ['s3'], 'w1': ['s1']}Failed
normal control 5{'w0': [], 'w1': ['s1'], 'w2': ['s2'], 'w3': []}{'w0': [], 'w1': ['s1'], 'w2': ['s2'], 'w3': ['s0']}Failed
normal control 6{'w0': [], 'w1': ['s0'], 'w2': ['s1']}{'w0': [], 'w1': ['s0'], 'w2': ['s1']}Passed
normal control 7{'w0': ['s2'], 'w1': [], 'w2': ['s0']}{'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}Failed
normal control 8{'w0': ['s0', 's3'], 'w1': ['s2'], 'w2': []}{'w0': ['s0', 's3'], 'w1': ['s2'], 'w2': []}Passed

SHA-256 / 5181d995ac31929d6ff5441000404e86ad9d40f036121141cd202038f28a288d

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(workers, shifts, prefs):
    order = sorted(workers, key=lambda w: (w[1], w[0]))
    taken = {}
    got = {w[0]: [] for w in workers}
    changed = True
    while changed:
        changed = False
        for wid, hire, cap in order:
            if len(got[wid]) > cap:
                continue
            for sid in prefs.get(wid, []):
                if sid in taken:
                    continue
                s, e = shifts[sid]
                if any(s < shifts[o][1] and shifts[o][0] < e for o in got[wid]):
                    continue
                taken[sid] = wid
                got[wid].append(sid)
                changed = True
                break
    return got
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: personal cap 1',
   [[['w0', 200, 3], ['w1', 200, 1]],
    {'s0': [240, 720], 's1': [0, 480], 's2': [0, 240], 's3': [0, 480], 's4': [480, 960], 's5': [240, 720]},
    {'w0': ['s4', 's0', 's1', 's3', 's5', 's2'], 'w1': ['s3', 's5', 's0']}],
   {'w0': ['s4', 's1'], 'w1': ['s3']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 1], ['w1', 200, 1], ['w2', 200, 1]],
    {'s0': [0, 480], 's1': [960, 1440], 's2': [960, 1440], 's3': [960, 1440], 's4': [240, 480]},
    {'w0': ['s3'], 'w1': ['s1'], 'w2': ['s1', 's0', 's4', 's3']}],
   {'w0': ['s3'], 'w1': ['s1'], 'w2': ['s0']}),
  ('partial repair guard 3',
   [[['w0', 100, 2], ['w1', 300, 1]],
    {'s0': [0, 480], 's1': [0, 240], 's2': [480, 720], 's3': [240, 720], 's4': [480, 720]},
    {'w0': ['s4', 's3'], 'w1': ['s0', 's4', 's2']}],
   {'w0': ['s4'], 'w1': ['s0']}),
  ('normal control 4',
   [[['w0', 200, 1], ['w1', 200, 1]],
    {'s0': [960, 1440],
     's1': [960, 1440],
     's2': [960, 1200],
     's3': [480, 960],
     's4': [240, 720],
     's5': [720, 1200]},
    {'w0': ['s3', 's0', 's1', 's5', 's2'], 'w1': ['s3', 's1', 's4', 's5', 's2']}],
   {'w0': ['s3'], 'w1': ['s1']}),
  ('normal control 5',
   [[['w0', 300, 3], ['w1', 200, 1], ['w2', 200, 3], ['w3', 200, 1]],
    {'s0': [240, 720], 's1': [960, 1440], 's2': [240, 720]},
    {'w0': ['s1', 's2'], 'w1': ['s1'], 'w2': ['s2', 's0'], 'w3': ['s2', 's1', 's0']}],
   {'w0': [], 'w1': ['s1'], 'w2': ['s2'], 'w3': ['s0']}),
  ('normal control 6',
   [[['w0', 300, 1], ['w1', 200, 3], ['w2', 200, 3]],
    {'s0': [720, 1200], 's1': [720, 1200], 's2': [720, 1200]},
    {'w0': ['s0'], 'w1': ['s0', 's1'], 'w2': ['s1', 's2', 's0']}],
   {'w0': [], 'w1': ['s0'], 'w2': ['s1']}),
  ('normal control 7',
   [[['w0', 200, 2], ['w1', 200, 1], ['w2', 200, 2]],
    {'s0': [0, 240], 's1': [240, 480], 's2': [480, 720], 's3': [720, 960], 's4': [960, 1440]},
    {'w0': ['s2', 's1', 's3', 's0'],
     'w1': ['s1', 's3', 's0', 's4', 's2'],
     'w2': ['s0', 's4', 's1', 's3', 's2']}],
   {'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}),
  ('normal control 8',
   [[['w0', 100, 3], ['w1', 100, 3], ['w2', 100, 3]],
    {'s0': [480, 960], 's1': [960, 1440], 's2': [720, 1200], 's3': [960, 1440], 's4': [960, 1200]},
    {'w0': ['s0', 's3'], 'w1': ['s2', 's1'], 'w2': ['s0']}],
   {'w0': ['s0', 's3'], 'w1': ['s2'], 'w2': []})],
 [('regression: personal cap 1',
   [[['w0', 100, 2], ['w1', 200, 1]],
    {'s0': [960, 1440], 's1': [0, 480], 's2': [720, 1200], 's3': [0, 240], 's4': [0, 480]},
    {'w0': ['s3', 's2', 's4'], 'w1': ['s0', 's3', 's2', 's1']}],
   {'w0': ['s3', 's2'], 'w1': ['s0']}),
  ('regression variant: personal cap 2',
   [[['w0', 300, 3], ['w1', 200, 1], ['w2', 300, 2]],
    {'s0': [0, 480],
     's1': [960, 1440],
     's2': [240, 720],
     's3': [960, 1440],
     's4': [480, 960],
     's5': [0, 480]},
    {'w0': ['s3'], 'w1': ['s0'], 'w2': ['s0', 's1', 's5']}],
   {'w0': ['s3'], 'w1': ['s0'], 'w2': ['s1', 's5']}),
  ('partial repair guard 3',
   [[['w0', 200, 1], ['w1', 200, 1]], {'s0': [240, 480], 's1': [0, 240], 's2': [720, 1200], 's3': [480, 720]},
    {'w0': ['s0'], 'w1': ['s1', 's3', 's0']}],
   {'w0': ['s0'], 'w1': ['s1']}),
  ('normal control 4',
   [[['w0', 100, 2], ['w1', 300, 2], ['w2', 200, 1]], {'s0': [240, 720], 's1': [480, 720], 's2': [240, 720]},
    {'w0': ['s0'], 'w1': ['s0', 's2', 's1'], 'w2': ['s0']}],
   {'w0': ['s0'], 'w1': ['s2'], 'w2': []}),
  ('normal control 5',
   [[['w0', 300, 3], ['w1', 300, 3], ['w2', 300, 1], ['w3', 300, 3]],
    {'s0': [720, 960], 's1': [240, 480], 's2': [0, 240], 's3': [720, 1200], 's4': [0, 480], 's5': [0, 480]},
    {'w0': ['s5', 's4', 's3', 's0', 's1'],
     'w1': ['s5', 's3', 's1', 's0', 's2', 's4'],
     'w2': ['s3'],
     'w3': ['s3', 's4', 's2', 's0']}],
   {'w0': ['s5', 's0'], 'w1': ['s3', 's1', 's2'], 'w2': [], 'w3': ['s4']}),
  ('normal control 6',
   [[['w0', 200, 2], ['w1', 200, 1], ['w2', 200, 2]],
    {'s0': [0, 240], 's1': [240, 480], 's2': [480, 720], 's3': [720, 960], 's4': [960, 1440]},
    {'w0': ['s2', 's1', 's3', 's0'],
     'w1': ['s1', 's3', 's0', 's4', 's2'],
     'w2': ['s0', 's4', 's1', 's3', 's2']}],
   {'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}),
  ('normal control 7',
   [[['w0', 200, 1], ['w1', 300, 2], ['w2', 200, 2], ['w3', 200, 1]],
    {'s0': [720, 960], 's1': [480, 720], 's2': [0, 240]},
    {'w0': ['s1'], 'w1': ['s2'], 'w2': ['s1'], 'w3': ['s2', 's0', 's1']}],
   {'w0': ['s1'], 'w1': [], 'w2': [], 'w3': ['s2']}),
  ('normal control 8',
   [[['w0', 200, 2], ['w1', 100, 3], ['w2', 200, 1]], {'s0': [240, 480], 's1': [240, 480], 's2': [480, 720]},
    {'w0': ['s1', 's0'], 'w1': ['s2', 's1'], 'w2': ['s0', 's1', 's2']}],
   {'w0': ['s1'], 'w1': ['s2'], 'w2': ['s0']})],
 [('regression: personal cap 1',
   [[['w0', 300, 2], ['w1', 300, 2], ['w2', 100, 1], ['w3', 100, 1]],
    {'s0': [0, 480], 's1': [960, 1200], 's2': [960, 1200]},
    {'w0': ['s0', 's1'], 'w1': ['s2'], 'w2': ['s2'], 'w3': ['s1', 's0', 's2']}],
   {'w0': ['s0'], 'w1': [], 'w2': ['s2'], 'w3': ['s1']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 2], ['w1', 200, 3], ['w2', 300, 3], ['w3', 300, 2]],
    {'s0': [0, 480], 's1': [240, 720], 's2': [480, 960], 's3': [240, 720], 's4': [720, 1200]},
    {'w0': ['s1', 's4', 's2'],
     'w1': ['s4', 's0', 's3', 's1', 's2'],
     'w2': ['s2', 's0', 's3', 's4', 's1'],
     'w3': ['s1', 's2']}],
   {'w0': ['s1'], 'w1': ['s4', 's0'], 'w2': ['s2'], 'w3': []}),
  ('partial repair guard 3',
   [[['w0', 200, 1], ['w1', 100, 3]],
    {'s0': [240, 480], 's1': [0, 480], 's2': [0, 240], 's3': [720, 1200], 's4': [720, 960], 's5': [240, 720]},
    {'w0': ['s1', 's4', 's3', 's2', 's0', 's5'], 'w1': ['s5', 's1', 's0', 's3']}],
   {'w0': ['s1'], 'w1': ['s5', 's3']}),
  ('normal control 4',
   [[['w0', 200, 3], ['w1', 100, 3], ['w2', 200, 1]],
    {'s0': [0, 240],
     's1': [240, 720],
     's2': [960, 1200],
     's3': [720, 960],
     's4': [720, 1200],
     's5': [720, 1200]},
    {'w0': ['s4', 's5', 's3', 's2', 's1', 's0'], 'w1': ['s3', 's2', 's5', 's0', 's1'], 'w2': ['s4']}],
   {'w0': ['s4', 's1'], 'w1': ['s3', 's2', 's0'], 'w2': []}),
  ('normal control 5',
   [[['w0', 200, 2], ['w1', 100, 2], ['w2', 300, 1]],
    {'s0': [0, 240], 's1': [960, 1200], 's2': [960, 1440], 's3': [720, 960], 's4': [480, 720]},
    {'w0': ['s1', 's3', 's0', 's2'], 'w1': ['s1', 's4', 's0', 's3'], 'w2': ['s0', 's4', 's1', 's3']}],
   {'w0': ['s3', 's2'], 'w1': ['s1', 's4'], 'w2': ['s0']}),
  ('normal control 6',
   [[['w0', 100, 2], ['w1', 100, 3], ['w2', 100, 1], ['w3', 200, 3]],
    {'s0': [480, 960], 's1': [240, 480], 's2': [480, 960], 's3': [480, 720], 's4': [240, 720]},
    {'w0': ['s1'], 'w1': ['s0'], 'w2': ['s3', 's0'], 'w3': ['s4', 's3']}],
   {'w0': ['s1'], 'w1': ['s0'], 'w2': ['s3'], 'w3': ['s4']}),
  ('normal control 7',
   [[['w0', 100, 1], ['w1', 300, 1], ['w2', 100, 2]], {'s0': [960, 1440], 's1': [0, 480], 's2': [720, 960]},
    {'w0': ['s0', 's1', 's2'], 'w1': ['s2', 's0'], 'w2': ['s2']}],
   {'w0': ['s0'], 'w1': [], 'w2': ['s2']}),
  ('normal control 8',
   [[['w0', 200, 3], ['w1', 200, 1]],
    {'s0': [960, 1440], 's1': [960, 1440], 's2': [960, 1200], 's3': [720, 960]},
    {'w0': ['s0'], 'w1': ['s0', 's3']}],
   {'w0': ['s0'], 'w1': ['s3']})],
 [('regression: personal cap 1',
   [[['w0', 100, 1], ['w1', 100, 1], ['w2', 200, 1], ['w3', 100, 1]],
    {'s0': [0, 480], 's1': [960, 1200], 's2': [960, 1200], 's3': [480, 960]},
    {'w0': ['s0', 's1'], 'w1': ['s3', 's0'], 'w2': ['s2'], 'w3': ['s0', 's2', 's1', 's3']}],
   {'w0': ['s0'], 'w1': ['s3'], 'w2': [], 'w3': ['s2']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 1], ['w1', 200, 1]], {'s0': [240, 480], 's1': [0, 240], 's2': [720, 1200], 's3': [480, 720]},
    {'w0': ['s0'], 'w1': ['s1', 's3', 's0']}],
   {'w0': ['s0'], 'w1': ['s1']}),
  ('partial repair guard 3',
   [[['w0', 100, 1], ['w1', 300, 3], ['w2', 200, 3]],
    {'s0': [960, 1440],
     's1': [0, 480],
     's2': [240, 480],
     's3': [0, 480],
     's4': [720, 1200],
     's5': [240, 720]},
    {'w0': ['s4', 's5', 's2'],
     'w1': ['s4', 's2', 's0', 's1', 's5', 's3'],
     'w2': ['s3', 's2', 's4', 's1', 's5']}],
   {'w0': ['s4'], 'w1': ['s2', 's0'], 'w2': ['s3']}),
  ('normal control 4',
   [[['w0', 300, 1], ['w1', 300, 1], ['w2', 200, 1], ['w3', 100, 1]],
    {'s0': [240, 480],
     's1': [480, 960],
     's2': [480, 720],
     's3': [480, 960],
     's4': [480, 960],
     's5': [960, 1440]},
    {'w0': ['s2', 's0'], 'w1': ['s0', 's2', 's4'], 'w2': ['s0', 's3', 's1', 's2'], 'w3': ['s3', 's4']}],
   {'w0': ['s2'], 'w1': ['s4'], 'w2': ['s0'], 'w3': ['s3']}),
  ('normal control 5',
   [[['w0', 200, 3], ['w1', 200, 3], ['w2', 100, 1]],
    {'s0': [0, 480], 's1': [720, 1200], 's2': [720, 960], 's3': [240, 720], 's4': [0, 480], 's5': [480, 720]},
    {'w0': ['s2', 's3', 's5', 's0'], 'w1': ['s4', 's5', 's3', 's0'], 'w2': ['s1', 's3', 's0']}],
   {'w0': ['s2', 's3'], 'w1': ['s4', 's5'], 'w2': ['s1']}),
  ('normal control 6',
   [[['w0', 200, 3], ['w1', 300, 1], ['w2', 100, 1]],
    {'s0': [720, 1200], 's1': [240, 720], 's2': [0, 240], 's3': [960, 1200]},
    {'w0': ['s1', 's0', 's3', 's2'], 'w1': ['s3', 's2'], 'w2': ['s2', 's3', 's0', 's1']}],
   {'w0': ['s1', 's0'], 'w1': ['s3'], 'w2': ['s2']}),
  ('normal control 7',
   [[['w0', 200, 1], ['w1', 200, 3]], {'s0': [0, 240], 's1': [0, 240], 's2': [0, 480], 's3': [0, 240]},
    {'w0': ['s1', 's2', 's0', 's3'], 'w1': ['s1', 's0']}],
   {'w0': ['s1'], 'w1': ['s0']}),
  ('normal control 8',
   [[['w0', 100, 1], ['w1', 200, 2]],
    {'s0': [960, 1200], 's1': [720, 960], 's2': [960, 1200], 's3': [480, 720], 's4': [480, 720]},
    {'w0': ['s2'], 'w1': ['s1', 's0', 's3', 's2']}],
   {'w0': ['s2'], 'w1': ['s1', 's0']})],
 [('regression: personal cap 1',
   [[['w0', 200, 1], ['w1', 300, 1], ['w2', 300, 1]], {'s0': [240, 720], 's1': [960, 1440], 's2': [480, 960]},
    {'w0': ['s0'], 'w1': ['s2'], 'w2': ['s2', 's0', 's1']}],
   {'w0': ['s0'], 'w1': ['s2'], 'w2': ['s1']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 2], ['w1', 100, 3]], {'s0': [720, 1200], 's1': [720, 960], 's2': [0, 240], 's3': [240, 480]},
    {'w0': ['s3', 's2'], 'w1': ['s0', 's1', 's3']}],
   {'w0': ['s3', 's2'], 'w1': ['s0']}),
  ('partial repair guard 3',
   [[['w0', 200, 1], ['w1', 100, 2]],
    {'s0': [960, 1200],
     's1': [960, 1200],
     's2': [240, 480],
     's3': [0, 240],
     's4': [720, 1200],
     's5': [720, 960]},
    {'w0': ['s0', 's4'], 'w1': ['s5', 's4', 's3', 's1', 's0']}],
   {'w0': ['s0'], 'w1': ['s5', 's3']}),
  ('normal control 4',
   [[['w0', 100, 3], ['w1', 100, 1], ['w2', 100, 3], ['w3', 300, 2]],
    {'s0': [960, 1440],
     's1': [0, 480],
     's2': [480, 720],
     's3': [960, 1200],
     's4': [0, 480],
     's5': [480, 960]},
    {'w0': ['s3', 's4'],
     'w1': ['s1', 's3', 's2', 's5'],
     'w2': ['s3', 's5', 's4', 's2', 's1', 's0'],
     'w3': ['s2', 's3', 's0']}],
   {'w0': ['s3', 's4'], 'w1': ['s1'], 'w2': ['s5', 's0'], 'w3': ['s2']}),
  ('normal control 5',
   [[['w0', 300, 1], ['w1', 200, 1], ['w2', 200, 3], ['w3', 300, 3]],
    {'s0': [0, 240], 's1': [480, 720], 's2': [480, 720], 's3': [0, 240], 's4': [0, 240]},
    {'w0': ['s1', 's4'], 'w1': ['s4', 's1', 's2', 's3'], 'w2': ['s0', 's2'], 'w3': ['s4']}],
   {'w0': ['s1'], 'w1': ['s4'], 'w2': ['s0', 's2'], 'w3': []}),
  ('normal control 6',
   [[['w0', 200, 2], ['w1', 200, 1]],
    {'s0': [240, 480], 's1': [0, 240], 's2': [720, 960], 's3': [720, 1200], 's4': [960, 1440]},
    {'w0': ['s4', 's1', 's2', 's0'], 'w1': ['s1', 's2', 's3', 's0']}],
   {'w0': ['s4', 's2'], 'w1': ['s1']}),
  ('normal control 7',
   [[['w0', 200, 1], ['w1', 300, 1], ['w2', 300, 3], ['w3', 200, 2]],
    {'s0': [720, 1200],
     's1': [720, 1200],
     's2': [480, 720],
     's3': [0, 480],
     's4': [240, 720],
     's5': [960, 1440]},
    {'w0': ['s2', 's4'], 'w1': ['s3', 's4', 's1'], 'w2': ['s5'], 'w3': ['s0', 's1', 's4', 's5', 's3']}],
   {'w0': ['s2'], 'w1': ['s3'], 'w2': ['s5'], 'w3': ['s0', 's4']}),
  ('normal control 8',
   [[['w0', 200, 1], ['w1', 200, 1]],
    {'s0': [0, 480], 's1': [720, 960], 's2': [720, 1200], 's3': [480, 720], 's4': [480, 720]},
    {'w0': ['s0', 's1', 's3'], 'w1': ['s0', 's2']}],
   {'w0': ['s0'], 'w1': ['s2']})]]
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: personal cap 1{'w0': ['s4', 's1'], 'w1': ['s3']}{'w0': ['s4', 's1'], 'w1': ['s3']}Passed
regression variant: personal cap 2{'w0': ['s3'], 'w1': ['s1'], 'w2': ['s0']}{'w0': ['s3'], 'w1': ['s1'], 'w2': ['s0']}Passed
partial repair guard 3{'w0': ['s4'], 'w1': ['s0', 's2']}{'w0': ['s4'], 'w1': ['s0']}Failed
normal control 4{'w0': ['s3', 's0'], 'w1': ['s1', 's4']}{'w0': ['s3'], 'w1': ['s1']}Failed
normal control 5{'w0': [], 'w1': ['s1'], 'w2': ['s2'], 'w3': ['s0']}{'w0': [], 'w1': ['s1'], 'w2': ['s2'], 'w3': ['s0']}Passed
normal control 6{'w0': [], 'w1': ['s0'], 'w2': ['s1']}{'w0': [], 'w1': ['s0'], 'w2': ['s1']}Passed
normal control 7{'w0': ['s2', 's3'], 'w1': ['s1', 's4'], 'w2': ['s0']}{'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}Failed
normal control 8{'w0': ['s0', 's3'], 'w1': ['s2'], 'w2': []}{'w0': ['s0', 's3'], 'w1': ['s2'], 'w2': []}Passed

SHA-256 / f52d1941a0c8cd460b76ff24b72e51c43f11589b24a0859aaf100561db5d63d7

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(workers, shifts, prefs):
    order = sorted(workers, key=lambda w: (w[1], w[0]))
    taken = {}
    got = {w[0]: [] for w in workers}
    changed = True
    while changed:
        changed = False
        for wid, hire, cap in order:
            if len(got[wid]) >= cap:
                continue
            for sid in prefs.get(wid, []):
                if sid in taken:
                    continue
                s, e = shifts[sid]
                if any(s < shifts[o][1] and shifts[o][0] < e for o in got[wid]):
                    continue
                taken[sid] = wid
                got[wid].append(sid)
                changed = True
                break
    return got
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: personal cap 1',
   [[['w0', 200, 3], ['w1', 200, 1]],
    {'s0': [240, 720], 's1': [0, 480], 's2': [0, 240], 's3': [0, 480], 's4': [480, 960], 's5': [240, 720]},
    {'w0': ['s4', 's0', 's1', 's3', 's5', 's2'], 'w1': ['s3', 's5', 's0']}],
   {'w0': ['s4', 's1'], 'w1': ['s3']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 1], ['w1', 200, 1], ['w2', 200, 1]],
    {'s0': [0, 480], 's1': [960, 1440], 's2': [960, 1440], 's3': [960, 1440], 's4': [240, 480]},
    {'w0': ['s3'], 'w1': ['s1'], 'w2': ['s1', 's0', 's4', 's3']}],
   {'w0': ['s3'], 'w1': ['s1'], 'w2': ['s0']}),
  ('partial repair guard 3',
   [[['w0', 100, 2], ['w1', 300, 1]],
    {'s0': [0, 480], 's1': [0, 240], 's2': [480, 720], 's3': [240, 720], 's4': [480, 720]},
    {'w0': ['s4', 's3'], 'w1': ['s0', 's4', 's2']}],
   {'w0': ['s4'], 'w1': ['s0']}),
  ('normal control 4',
   [[['w0', 200, 1], ['w1', 200, 1]],
    {'s0': [960, 1440],
     's1': [960, 1440],
     's2': [960, 1200],
     's3': [480, 960],
     's4': [240, 720],
     's5': [720, 1200]},
    {'w0': ['s3', 's0', 's1', 's5', 's2'], 'w1': ['s3', 's1', 's4', 's5', 's2']}],
   {'w0': ['s3'], 'w1': ['s1']}),
  ('normal control 5',
   [[['w0', 300, 3], ['w1', 200, 1], ['w2', 200, 3], ['w3', 200, 1]],
    {'s0': [240, 720], 's1': [960, 1440], 's2': [240, 720]},
    {'w0': ['s1', 's2'], 'w1': ['s1'], 'w2': ['s2', 's0'], 'w3': ['s2', 's1', 's0']}],
   {'w0': [], 'w1': ['s1'], 'w2': ['s2'], 'w3': ['s0']}),
  ('normal control 6',
   [[['w0', 300, 1], ['w1', 200, 3], ['w2', 200, 3]],
    {'s0': [720, 1200], 's1': [720, 1200], 's2': [720, 1200]},
    {'w0': ['s0'], 'w1': ['s0', 's1'], 'w2': ['s1', 's2', 's0']}],
   {'w0': [], 'w1': ['s0'], 'w2': ['s1']}),
  ('normal control 7',
   [[['w0', 200, 2], ['w1', 200, 1], ['w2', 200, 2]],
    {'s0': [0, 240], 's1': [240, 480], 's2': [480, 720], 's3': [720, 960], 's4': [960, 1440]},
    {'w0': ['s2', 's1', 's3', 's0'],
     'w1': ['s1', 's3', 's0', 's4', 's2'],
     'w2': ['s0', 's4', 's1', 's3', 's2']}],
   {'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}),
  ('normal control 8',
   [[['w0', 100, 3], ['w1', 100, 3], ['w2', 100, 3]],
    {'s0': [480, 960], 's1': [960, 1440], 's2': [720, 1200], 's3': [960, 1440], 's4': [960, 1200]},
    {'w0': ['s0', 's3'], 'w1': ['s2', 's1'], 'w2': ['s0']}],
   {'w0': ['s0', 's3'], 'w1': ['s2'], 'w2': []})],
 [('regression: personal cap 1',
   [[['w0', 100, 2], ['w1', 200, 1]],
    {'s0': [960, 1440], 's1': [0, 480], 's2': [720, 1200], 's3': [0, 240], 's4': [0, 480]},
    {'w0': ['s3', 's2', 's4'], 'w1': ['s0', 's3', 's2', 's1']}],
   {'w0': ['s3', 's2'], 'w1': ['s0']}),
  ('regression variant: personal cap 2',
   [[['w0', 300, 3], ['w1', 200, 1], ['w2', 300, 2]],
    {'s0': [0, 480],
     's1': [960, 1440],
     's2': [240, 720],
     's3': [960, 1440],
     's4': [480, 960],
     's5': [0, 480]},
    {'w0': ['s3'], 'w1': ['s0'], 'w2': ['s0', 's1', 's5']}],
   {'w0': ['s3'], 'w1': ['s0'], 'w2': ['s1', 's5']}),
  ('partial repair guard 3',
   [[['w0', 200, 1], ['w1', 200, 1]], {'s0': [240, 480], 's1': [0, 240], 's2': [720, 1200], 's3': [480, 720]},
    {'w0': ['s0'], 'w1': ['s1', 's3', 's0']}],
   {'w0': ['s0'], 'w1': ['s1']}),
  ('normal control 4',
   [[['w0', 100, 2], ['w1', 300, 2], ['w2', 200, 1]], {'s0': [240, 720], 's1': [480, 720], 's2': [240, 720]},
    {'w0': ['s0'], 'w1': ['s0', 's2', 's1'], 'w2': ['s0']}],
   {'w0': ['s0'], 'w1': ['s2'], 'w2': []}),
  ('normal control 5',
   [[['w0', 300, 3], ['w1', 300, 3], ['w2', 300, 1], ['w3', 300, 3]],
    {'s0': [720, 960], 's1': [240, 480], 's2': [0, 240], 's3': [720, 1200], 's4': [0, 480], 's5': [0, 480]},
    {'w0': ['s5', 's4', 's3', 's0', 's1'],
     'w1': ['s5', 's3', 's1', 's0', 's2', 's4'],
     'w2': ['s3'],
     'w3': ['s3', 's4', 's2', 's0']}],
   {'w0': ['s5', 's0'], 'w1': ['s3', 's1', 's2'], 'w2': [], 'w3': ['s4']}),
  ('normal control 6',
   [[['w0', 200, 2], ['w1', 200, 1], ['w2', 200, 2]],
    {'s0': [0, 240], 's1': [240, 480], 's2': [480, 720], 's3': [720, 960], 's4': [960, 1440]},
    {'w0': ['s2', 's1', 's3', 's0'],
     'w1': ['s1', 's3', 's0', 's4', 's2'],
     'w2': ['s0', 's4', 's1', 's3', 's2']}],
   {'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}),
  ('normal control 7',
   [[['w0', 200, 1], ['w1', 300, 2], ['w2', 200, 2], ['w3', 200, 1]],
    {'s0': [720, 960], 's1': [480, 720], 's2': [0, 240]},
    {'w0': ['s1'], 'w1': ['s2'], 'w2': ['s1'], 'w3': ['s2', 's0', 's1']}],
   {'w0': ['s1'], 'w1': [], 'w2': [], 'w3': ['s2']}),
  ('normal control 8',
   [[['w0', 200, 2], ['w1', 100, 3], ['w2', 200, 1]], {'s0': [240, 480], 's1': [240, 480], 's2': [480, 720]},
    {'w0': ['s1', 's0'], 'w1': ['s2', 's1'], 'w2': ['s0', 's1', 's2']}],
   {'w0': ['s1'], 'w1': ['s2'], 'w2': ['s0']})],
 [('regression: personal cap 1',
   [[['w0', 300, 2], ['w1', 300, 2], ['w2', 100, 1], ['w3', 100, 1]],
    {'s0': [0, 480], 's1': [960, 1200], 's2': [960, 1200]},
    {'w0': ['s0', 's1'], 'w1': ['s2'], 'w2': ['s2'], 'w3': ['s1', 's0', 's2']}],
   {'w0': ['s0'], 'w1': [], 'w2': ['s2'], 'w3': ['s1']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 2], ['w1', 200, 3], ['w2', 300, 3], ['w3', 300, 2]],
    {'s0': [0, 480], 's1': [240, 720], 's2': [480, 960], 's3': [240, 720], 's4': [720, 1200]},
    {'w0': ['s1', 's4', 's2'],
     'w1': ['s4', 's0', 's3', 's1', 's2'],
     'w2': ['s2', 's0', 's3', 's4', 's1'],
     'w3': ['s1', 's2']}],
   {'w0': ['s1'], 'w1': ['s4', 's0'], 'w2': ['s2'], 'w3': []}),
  ('partial repair guard 3',
   [[['w0', 200, 1], ['w1', 100, 3]],
    {'s0': [240, 480], 's1': [0, 480], 's2': [0, 240], 's3': [720, 1200], 's4': [720, 960], 's5': [240, 720]},
    {'w0': ['s1', 's4', 's3', 's2', 's0', 's5'], 'w1': ['s5', 's1', 's0', 's3']}],
   {'w0': ['s1'], 'w1': ['s5', 's3']}),
  ('normal control 4',
   [[['w0', 200, 3], ['w1', 100, 3], ['w2', 200, 1]],
    {'s0': [0, 240],
     's1': [240, 720],
     's2': [960, 1200],
     's3': [720, 960],
     's4': [720, 1200],
     's5': [720, 1200]},
    {'w0': ['s4', 's5', 's3', 's2', 's1', 's0'], 'w1': ['s3', 's2', 's5', 's0', 's1'], 'w2': ['s4']}],
   {'w0': ['s4', 's1'], 'w1': ['s3', 's2', 's0'], 'w2': []}),
  ('normal control 5',
   [[['w0', 200, 2], ['w1', 100, 2], ['w2', 300, 1]],
    {'s0': [0, 240], 's1': [960, 1200], 's2': [960, 1440], 's3': [720, 960], 's4': [480, 720]},
    {'w0': ['s1', 's3', 's0', 's2'], 'w1': ['s1', 's4', 's0', 's3'], 'w2': ['s0', 's4', 's1', 's3']}],
   {'w0': ['s3', 's2'], 'w1': ['s1', 's4'], 'w2': ['s0']}),
  ('normal control 6',
   [[['w0', 100, 2], ['w1', 100, 3], ['w2', 100, 1], ['w3', 200, 3]],
    {'s0': [480, 960], 's1': [240, 480], 's2': [480, 960], 's3': [480, 720], 's4': [240, 720]},
    {'w0': ['s1'], 'w1': ['s0'], 'w2': ['s3', 's0'], 'w3': ['s4', 's3']}],
   {'w0': ['s1'], 'w1': ['s0'], 'w2': ['s3'], 'w3': ['s4']}),
  ('normal control 7',
   [[['w0', 100, 1], ['w1', 300, 1], ['w2', 100, 2]], {'s0': [960, 1440], 's1': [0, 480], 's2': [720, 960]},
    {'w0': ['s0', 's1', 's2'], 'w1': ['s2', 's0'], 'w2': ['s2']}],
   {'w0': ['s0'], 'w1': [], 'w2': ['s2']}),
  ('normal control 8',
   [[['w0', 200, 3], ['w1', 200, 1]],
    {'s0': [960, 1440], 's1': [960, 1440], 's2': [960, 1200], 's3': [720, 960]},
    {'w0': ['s0'], 'w1': ['s0', 's3']}],
   {'w0': ['s0'], 'w1': ['s3']})],
 [('regression: personal cap 1',
   [[['w0', 100, 1], ['w1', 100, 1], ['w2', 200, 1], ['w3', 100, 1]],
    {'s0': [0, 480], 's1': [960, 1200], 's2': [960, 1200], 's3': [480, 960]},
    {'w0': ['s0', 's1'], 'w1': ['s3', 's0'], 'w2': ['s2'], 'w3': ['s0', 's2', 's1', 's3']}],
   {'w0': ['s0'], 'w1': ['s3'], 'w2': [], 'w3': ['s2']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 1], ['w1', 200, 1]], {'s0': [240, 480], 's1': [0, 240], 's2': [720, 1200], 's3': [480, 720]},
    {'w0': ['s0'], 'w1': ['s1', 's3', 's0']}],
   {'w0': ['s0'], 'w1': ['s1']}),
  ('partial repair guard 3',
   [[['w0', 100, 1], ['w1', 300, 3], ['w2', 200, 3]],
    {'s0': [960, 1440],
     's1': [0, 480],
     's2': [240, 480],
     's3': [0, 480],
     's4': [720, 1200],
     's5': [240, 720]},
    {'w0': ['s4', 's5', 's2'],
     'w1': ['s4', 's2', 's0', 's1', 's5', 's3'],
     'w2': ['s3', 's2', 's4', 's1', 's5']}],
   {'w0': ['s4'], 'w1': ['s2', 's0'], 'w2': ['s3']}),
  ('normal control 4',
   [[['w0', 300, 1], ['w1', 300, 1], ['w2', 200, 1], ['w3', 100, 1]],
    {'s0': [240, 480],
     's1': [480, 960],
     's2': [480, 720],
     's3': [480, 960],
     's4': [480, 960],
     's5': [960, 1440]},
    {'w0': ['s2', 's0'], 'w1': ['s0', 's2', 's4'], 'w2': ['s0', 's3', 's1', 's2'], 'w3': ['s3', 's4']}],
   {'w0': ['s2'], 'w1': ['s4'], 'w2': ['s0'], 'w3': ['s3']}),
  ('normal control 5',
   [[['w0', 200, 3], ['w1', 200, 3], ['w2', 100, 1]],
    {'s0': [0, 480], 's1': [720, 1200], 's2': [720, 960], 's3': [240, 720], 's4': [0, 480], 's5': [480, 720]},
    {'w0': ['s2', 's3', 's5', 's0'], 'w1': ['s4', 's5', 's3', 's0'], 'w2': ['s1', 's3', 's0']}],
   {'w0': ['s2', 's3'], 'w1': ['s4', 's5'], 'w2': ['s1']}),
  ('normal control 6',
   [[['w0', 200, 3], ['w1', 300, 1], ['w2', 100, 1]],
    {'s0': [720, 1200], 's1': [240, 720], 's2': [0, 240], 's3': [960, 1200]},
    {'w0': ['s1', 's0', 's3', 's2'], 'w1': ['s3', 's2'], 'w2': ['s2', 's3', 's0', 's1']}],
   {'w0': ['s1', 's0'], 'w1': ['s3'], 'w2': ['s2']}),
  ('normal control 7',
   [[['w0', 200, 1], ['w1', 200, 3]], {'s0': [0, 240], 's1': [0, 240], 's2': [0, 480], 's3': [0, 240]},
    {'w0': ['s1', 's2', 's0', 's3'], 'w1': ['s1', 's0']}],
   {'w0': ['s1'], 'w1': ['s0']}),
  ('normal control 8',
   [[['w0', 100, 1], ['w1', 200, 2]],
    {'s0': [960, 1200], 's1': [720, 960], 's2': [960, 1200], 's3': [480, 720], 's4': [480, 720]},
    {'w0': ['s2'], 'w1': ['s1', 's0', 's3', 's2']}],
   {'w0': ['s2'], 'w1': ['s1', 's0']})],
 [('regression: personal cap 1',
   [[['w0', 200, 1], ['w1', 300, 1], ['w2', 300, 1]], {'s0': [240, 720], 's1': [960, 1440], 's2': [480, 960]},
    {'w0': ['s0'], 'w1': ['s2'], 'w2': ['s2', 's0', 's1']}],
   {'w0': ['s0'], 'w1': ['s2'], 'w2': ['s1']}),
  ('regression variant: personal cap 2',
   [[['w0', 200, 2], ['w1', 100, 3]], {'s0': [720, 1200], 's1': [720, 960], 's2': [0, 240], 's3': [240, 480]},
    {'w0': ['s3', 's2'], 'w1': ['s0', 's1', 's3']}],
   {'w0': ['s3', 's2'], 'w1': ['s0']}),
  ('partial repair guard 3',
   [[['w0', 200, 1], ['w1', 100, 2]],
    {'s0': [960, 1200],
     's1': [960, 1200],
     's2': [240, 480],
     's3': [0, 240],
     's4': [720, 1200],
     's5': [720, 960]},
    {'w0': ['s0', 's4'], 'w1': ['s5', 's4', 's3', 's1', 's0']}],
   {'w0': ['s0'], 'w1': ['s5', 's3']}),
  ('normal control 4',
   [[['w0', 100, 3], ['w1', 100, 1], ['w2', 100, 3], ['w3', 300, 2]],
    {'s0': [960, 1440],
     's1': [0, 480],
     's2': [480, 720],
     's3': [960, 1200],
     's4': [0, 480],
     's5': [480, 960]},
    {'w0': ['s3', 's4'],
     'w1': ['s1', 's3', 's2', 's5'],
     'w2': ['s3', 's5', 's4', 's2', 's1', 's0'],
     'w3': ['s2', 's3', 's0']}],
   {'w0': ['s3', 's4'], 'w1': ['s1'], 'w2': ['s5', 's0'], 'w3': ['s2']}),
  ('normal control 5',
   [[['w0', 300, 1], ['w1', 200, 1], ['w2', 200, 3], ['w3', 300, 3]],
    {'s0': [0, 240], 's1': [480, 720], 's2': [480, 720], 's3': [0, 240], 's4': [0, 240]},
    {'w0': ['s1', 's4'], 'w1': ['s4', 's1', 's2', 's3'], 'w2': ['s0', 's2'], 'w3': ['s4']}],
   {'w0': ['s1'], 'w1': ['s4'], 'w2': ['s0', 's2'], 'w3': []}),
  ('normal control 6',
   [[['w0', 200, 2], ['w1', 200, 1]],
    {'s0': [240, 480], 's1': [0, 240], 's2': [720, 960], 's3': [720, 1200], 's4': [960, 1440]},
    {'w0': ['s4', 's1', 's2', 's0'], 'w1': ['s1', 's2', 's3', 's0']}],
   {'w0': ['s4', 's2'], 'w1': ['s1']}),
  ('normal control 7',
   [[['w0', 200, 1], ['w1', 300, 1], ['w2', 300, 3], ['w3', 200, 2]],
    {'s0': [720, 1200],
     's1': [720, 1200],
     's2': [480, 720],
     's3': [0, 480],
     's4': [240, 720],
     's5': [960, 1440]},
    {'w0': ['s2', 's4'], 'w1': ['s3', 's4', 's1'], 'w2': ['s5'], 'w3': ['s0', 's1', 's4', 's5', 's3']}],
   {'w0': ['s2'], 'w1': ['s3'], 'w2': ['s5'], 'w3': ['s0', 's4']}),
  ('normal control 8',
   [[['w0', 200, 1], ['w1', 200, 1]],
    {'s0': [0, 480], 's1': [720, 960], 's2': [720, 1200], 's3': [480, 720], 's4': [480, 720]},
    {'w0': ['s0', 's1', 's3'], 'w1': ['s0', 's2']}],
   {'w0': ['s0'], 'w1': ['s2']})]]
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: personal cap 1{'w0': ['s4', 's1'], 'w1': ['s3']}{'w0': ['s4', 's1'], 'w1': ['s3']}Passed
regression variant: personal cap 2{'w0': ['s3'], 'w1': ['s1'], 'w2': ['s0']}{'w0': ['s3'], 'w1': ['s1'], 'w2': ['s0']}Passed
partial repair guard 3{'w0': ['s4'], 'w1': ['s0']}{'w0': ['s4'], 'w1': ['s0']}Passed
normal control 4{'w0': ['s3'], 'w1': ['s1']}{'w0': ['s3'], 'w1': ['s1']}Passed
normal control 5{'w0': [], 'w1': ['s1'], 'w2': ['s2'], 'w3': ['s0']}{'w0': [], 'w1': ['s1'], 'w2': ['s2'], 'w3': ['s0']}Passed
normal control 6{'w0': [], 'w1': ['s0'], 'w2': ['s1']}{'w0': [], 'w1': ['s0'], 'w2': ['s1']}Passed
normal control 7{'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}{'w0': ['s2', 's3'], 'w1': ['s1'], 'w2': ['s0', 's4']}Passed
normal control 8{'w0': ['s0', 's3'], 'w1': ['s2'], 'w2': []}{'w0': ['s0', 's3'], 'w1': ['s2'], 'w2': []}Passed

SHA-256 / 43bdf9862c9db6735deaecd5f9e8efbdb55682623308e8901ed7abd5b06acefd

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

Case digest / 3f2af348da6a30001b695d8e4101d031a29f47db17e6762582dd19f5bac17eed