FAILURE MAP
← Case archive

FA-94336 / Shift rostering labor rules / Open access

Accepted overtime not added to the day's worked minutes · case 01

The same worker can take several offers beyond the 12-hour maximum.

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

ROOT CAUSE

Daily minutes are not updated after an acceptance.

VERIFIED REPAIR

Add accepted minutes to the taker's daily total.

Unsuccessful approach: Overwriting the daily total with the offer forgets earlier hours.

Case contract

ledger: worker -> [overtime minutes charged, seniority rank (1 most senior), minutes already worked today]; offers: [minutes, workers who will refuse]. For each offer, candidates are ordered by charged overtime then seniority rank. Workers who would exceed 720 minutes today are skipped without charge; refusers are charged the offered minutes; the first remaining worker takes it and is charged and credited today. Return [taker per offer (or None), charged minutes by worker].

Why this case matters

Overtime equalization clauses require fair rotation of offers, including charging refusals.

1 / The failure

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

N = 1
observations = []
def solve(ledger, offers):
    led = {w: list(v) for w, v in ledger.items()}
    result = []
    for minutes, refusers in offers:
        cands = sorted(led, key=lambda w: (led[w][0], led[w][1]))
        taker = None
        for w in cands:
            if led[w][2] + minutes > 720:
                continue
            if w in refusers:
                led[w][0] += minutes
                continue
            taker = w
            break
        if taker is not None:
            led[taker][0] += minutes
        result.append(taker)
    return [result, {w: led[w][0] for w in sorted(led)}]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: daily minutes credit 1',
   [{'p': [120, 1, 240], 'r': [0, 2, 480], 'q': [60, 3, 240], 's': [60, 4, 480]},
    [[60, []], [240, ['q', 'r']]]],
   [['r', 's'], {'p': 120, 'q': 300, 'r': 60, 's': 300}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [0, 1, 600], 'p': [0, 2, 660]}, [[60, ['q']], [60, ['q', 'p']]]],
   [['p', None], {'p': 60, 'q': 120}]),
  ('partial repair guard 3',
   [{'p': [0, 1, 660], 'q': [120, 2, 480]}, [[60, []], [60, ['p', 'q']], [240, []], [240, ['q']]]],
   [['p', None, 'q', None], {'p': 60, 'q': 420}]),
  ('normal control 4',
   [{'q': [120, 1, 480], 'r': [120, 2, 480], 'p': [120, 3, 240]},
    [[240, ['q']], [60, ['q', 'r']], [60, ['q']], [240, ['q']]]],
   [['r', 'p', 'p', 'p'], {'p': 480, 'q': 360, 'r': 360}]),
  ('normal control 5',
   [{'r': [240, 1, 480], 'p': [240, 2, 480], 'q': [120, 3, 480]}, [[120, ['p']], [60, ['p']]]],
   [['q', 'r'], {'p': 240, 'q': 240, 'r': 300}]),
  ('normal control 6',
   [{'p': [0, 1, 480], 'q': [60, 2, 600]}, [[240, []], [240, ['p', 'q']], [240, []], [60, []]]],
   [['p', None, None, 'q'], {'p': 240, 'q': 120}]),
  ('normal control 7',
   [{'r': [120, 1, 480], 'p': [240, 2, 0], 'q': [0, 3, 240], 's': [60, 4, 240]}, [[60, []]]],
   [['q'], {'p': 240, 'q': 60, 'r': 120, 's': 60}]),
  ('normal control 8',
   [{'r': [120, 1, 660], 'q': [120, 2, 240], 'p': [120, 3, 0]}, [[240, ['p']], [60, []], [240, ['r', 'p']]]],
   [['q', 'r', 'q'], {'p': 360, 'q': 600, 'r': 180}])],
 [('regression: daily minutes credit 1',
   [{'q': [120, 1, 600], 'p': [240, 2, 660]}, [[120, ['q']], [60, []], [120, []], [240, []]]],
   [[None, 'q', None, None], {'p': 240, 'q': 300}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [0, 1, 600], 'r': [0, 2, 0], 's': [0, 3, 240], 'p': [60, 4, 600]},
    [[240, []], [240, ['s']], [60, ['r']], [120, ['r', 's']]]],
   [['r', 'r', 'q', 'p'], {'p': 180, 'q': 60, 'r': 480, 's': 240}]),
  ('partial repair guard 3',
   [{'r': [0, 1, 600], 'p': [120, 2, 660], 'q': [0, 3, 660]},
    [[60, ['p', 'r']], [120, ['p', 'r']], [60, ['r', 'p']]]],
   [['q', None, None], {'p': 180, 'q': 60, 'r': 240}]),
  ('normal control 4', [{'q': [120, 1, 660], 'p': [240, 2, 0]}, [[60, []]]], [['q'], {'p': 240, 'q': 180}]),
  ('normal control 5', [{'p': [120, 1, 600], 'q': [120, 2, 480]}, [[120, []], [240, ['q']], [240, []]]],
   [['p', None, 'q'], {'p': 240, 'q': 600}]),
  ('normal control 6',
   [{'q': [120, 1, 600], 'r': [0, 2, 660], 'p': [60, 3, 0]}, [[60, ['p']], [60, ['q']], [120, ['q', 'r']]]],
   [['r', 'p', 'p'], {'p': 240, 'q': 240, 'r': 60}]),
  ('normal control 7',
   [{'q': [240, 1, 0], 'p': [120, 2, 660]}, [[240, []], [240, []], [240, ['q']], [60, ['p', 'q']]]],
   [['q', 'q', None, None], {'p': 180, 'q': 1020}]),
  ('normal control 8', [{'r': [0, 1, 0], 'p': [120, 2, 240], 'q': [60, 3, 600]}, [[240, []]]],
   [['r'], {'p': 120, 'q': 60, 'r': 240}])],
 [('regression: daily minutes credit 1',
   [{'p': [120, 1, 0], 'q': [120, 2, 600], 'r': [120, 3, 480]},
    [[240, ['q']], [240, ['p']], [240, []], [240, ['q', 'p']]]],
   [['p', 'r', 'p', None], {'p': 840, 'q': 120, 'r': 360}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [120, 1, 600], 'p': [240, 2, 0]}, [[120, []], [120, ['p', 'q']], [240, ['q', 'p']], [60, ['q']]]],
   [['q', None, None, 'p'], {'p': 660, 'q': 240}]),
  ('partial repair guard 3',
   [{'q': [120, 1, 600], 'p': [0, 2, 600]}, [[120, []], [240, ['p', 'q']], [60, ['q', 'p']], [120, ['q']]]],
   [['p', None, None, None], {'p': 120, 'q': 300}]),
  ('normal control 4',
   [{'q': [240, 1, 240], 'p': [120, 2, 660], 'r': [60, 3, 660], 's': [0, 4, 480]}, [[240, ['q']]]],
   [['s'], {'p': 120, 'q': 240, 'r': 60, 's': 240}]),
  ('normal control 5',
   [{'q': [120, 1, 240], 's': [240, 2, 600], 'r': [0, 3, 240], 'p': [0, 4, 480]}, [[240, ['r']]]],
   [['p'], {'p': 240, 'q': 120, 'r': 240, 's': 240}]),
  ('normal control 6',
   [{'r': [240, 1, 660], 'p': [60, 2, 600], 'q': [60, 3, 480]}, [[120, ['p']], [240, ['r']], [60, []]]],
   [['q', None, 'p'], {'p': 240, 'q': 180, 'r': 240}]),
  ('normal control 7',
   [{'q': [0, 1, 660], 's': [120, 2, 480], 'r': [120, 3, 480], 'p': [0, 4, 480]}, [[120, ['q']]]],
   [['p'], {'p': 120, 'q': 0, 'r': 120, 's': 120}]),
  ('normal control 8',
   [{'q': [120, 1, 0], 'r': [0, 2, 660], 's': [120, 3, 480], 'p': [120, 4, 0]},
    [[240, []], [120, ['q', 'r']]]],
   [['q', 's'], {'p': 120, 'q': 360, 'r': 0, 's': 240}])],
 [('regression: daily minutes credit 1',
   [{'q': [0, 1, 480], 'p': [120, 2, 660]}, [[240, []], [240, ['q', 'p']]]],
   [['q', None], {'p': 120, 'q': 240}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [120, 1, 600], 'r': [120, 2, 600], 'p': [60, 3, 600], 's': [240, 4, 660]},
    [[120, ['r', 'q']], [120, ['q', 'p']], [60, ['p']], [60, ['r', 'q']]]],
   [['p', 'r', 'q', 's'], {'p': 180, 'q': 300, 'r': 240, 's': 300}]),
  ('partial repair guard 3',
   [{'r': [0, 1, 480], 'p': [120, 2, 480], 'q': [0, 3, 480]},
    [[240, []], [60, ['p']], [120, ['r', 'q']], [120, ['p', 'q']]]],
   [['r', 'q', 'p', None], {'p': 360, 'q': 300, 'r': 240}]),
  ('normal control 4',
   [{'r': [240, 1, 480], 'q': [120, 2, 0], 'p': [240, 3, 480], 's': [240, 4, 600]},
    [[120, []], [240, ['r', 's']], [60, []], [120, ['r']]]],
   [['q', 'q', 'p', 's'], {'p': 300, 'q': 480, 'r': 480, 's': 360}]),
  ('normal control 5',
   [{'q': [120, 1, 600], 'r': [60, 2, 240], 'p': [60, 3, 0], 's': [240, 4, 660]},
    [[120, []], [60, ['q']], [240, ['s', 'q']], [120, ['p', 's']]]],
   [['r', 'p', 'p', 'q'], {'p': 360, 'q': 240, 'r': 180, 's': 240}]),
  ('normal control 6',
   [{'p': [120, 1, 660], 'q': [120, 2, 660], 'r': [120, 3, 240], 's': [120, 4, 0]},
    [[60, ['r']], [60, ['p', 'r']], [60, []], [240, []]]],
   [['p', 'q', 'r', 's'], {'p': 180, 'q': 180, 'r': 180, 's': 360}]),
  ('normal control 7',
   [{'q': [0, 1, 0], 's': [60, 2, 660], 'p': [60, 3, 0], 'r': [240, 4, 660]},
    [[240, []], [240, []], [120, ['r']], [120, ['s']]]],
   [['q', 'p', 'q', 'p'], {'p': 420, 'q': 360, 'r': 240, 's': 60}]),
  ('normal control 8', [{'q': [240, 1, 480], 'p': [60, 2, 240]}, [[60, []], [60, ['q', 'p']]]],
   [['p', None], {'p': 180, 'q': 300}])],
 [('regression: daily minutes credit 1',
   [{'p': [0, 1, 660], 'q': [120, 2, 480]}, [[60, []], [60, ['p', 'q']], [240, []], [240, ['q']]]],
   [['p', None, 'q', None], {'p': 60, 'q': 420}]),
  ('regression variant: daily minutes credit 2',
   [{'p': [240, 1, 240], 'r': [240, 2, 240], 'q': [0, 3, 480]},
    [[120, []], [120, ['p']], [60, ['p']], [60, ['r']]]],
   [['q', 'q', 'r', 'p'], {'p': 360, 'q': 240, 'r': 300}]),
  ('partial repair guard 3',
   [{'p': [0, 1, 0], 'r': [0, 2, 600], 'q': [240, 3, 0]}, [[240, ['q', 'r']], [60, []], [60, []], [60, []]]],
   [['p', 'r', 'r', 'p'], {'p': 300, 'q': 240, 'r': 120}]),
  ('normal control 4',
   [{'p': [0, 1, 600], 'r': [120, 2, 240], 'q': [0, 3, 480]}, [[240, []], [240, ['p']], [60, []]]],
   [['q', 'r', 'p'], {'p': 60, 'q': 240, 'r': 360}]),
  ('normal control 5',
   [{'p': [120, 1, 0], 'q': [120, 2, 240]}, [[60, []], [120, []], [120, ['q', 'p']], [240, ['q', 'p']]]],
   [['p', 'q', None, None], {'p': 540, 'q': 600}]),
  ('normal control 6',
   [{'r': [60, 1, 480], 'q': [60, 2, 660], 'p': [240, 3, 600]}, [[240, ['r']], [120, []]]],
   [[None, 'p'], {'p': 360, 'q': 60, 'r': 300}]),
  ('normal control 7', [{'q': [0, 1, 240], 'r': [120, 2, 660], 'p': [120, 3, 0]}, [[60, []]]],
   [['q'], {'p': 120, 'q': 60, 'r': 120}]),
  ('normal control 8', [{'q': [120, 1, 600], 'p': [60, 2, 0]}, [[60, []], [240, []]]],
   [['p', 'p'], {'p': 360, 'q': 120}])]]
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: daily minutes credit 1[['r', 's'], {'p': 120, 'q': 300, 'r': 300, 's': 300}][['r', 's'], {'p': 120, 'q': 300, 'r': 60, 's': 300}]Failed
regression variant: daily minutes credit 2[['p', None], {'p': 120, 'q': 120}][['p', None], {'p': 60, 'q': 120}]Failed
partial repair guard 3[['p', None, 'q', None], {'p': 120, 'q': 660}][['p', None, 'q', None], {'p': 60, 'q': 420}]Failed
normal control 4[['r', 'p', 'p', 'p'], {'p': 480, 'q': 360, 'r': 360}][['r', 'p', 'p', 'p'], {'p': 480, 'q': 360, 'r': 360}]Passed
normal control 5[['q', 'r'], {'p': 240, 'q': 240, 'r': 300}][['q', 'r'], {'p': 240, 'q': 240, 'r': 300}]Passed
normal control 6[['p', None, 'p', 'q'], {'p': 720, 'q': 120}][['p', None, None, 'q'], {'p': 240, 'q': 120}]Failed
normal control 7[['q'], {'p': 240, 'q': 60, 'r': 120, 's': 60}][['q'], {'p': 240, 'q': 60, 'r': 120, 's': 60}]Passed
normal control 8[['q', 'r', 'q'], {'p': 360, 'q': 600, 'r': 180}][['q', 'r', 'q'], {'p': 360, 'q': 600, 'r': 180}]Passed

SHA-256 / fd7bd0ef6a3db4793cfde88f9b2905314970b27b9d5082b262b43b52e8da3461

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(ledger, offers):
    led = {w: list(v) for w, v in ledger.items()}
    result = []
    for minutes, refusers in offers:
        cands = sorted(led, key=lambda w: (led[w][0], led[w][1]))
        taker = None
        for w in cands:
            if led[w][2] + minutes > 720:
                continue
            if w in refusers:
                led[w][0] += minutes
                continue
            taker = w
            break
        if taker is not None:
            led[taker][0] += minutes
            led[taker][2] = minutes
        result.append(taker)
    return [result, {w: led[w][0] for w in sorted(led)}]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: daily minutes credit 1',
   [{'p': [120, 1, 240], 'r': [0, 2, 480], 'q': [60, 3, 240], 's': [60, 4, 480]},
    [[60, []], [240, ['q', 'r']]]],
   [['r', 's'], {'p': 120, 'q': 300, 'r': 60, 's': 300}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [0, 1, 600], 'p': [0, 2, 660]}, [[60, ['q']], [60, ['q', 'p']]]],
   [['p', None], {'p': 60, 'q': 120}]),
  ('partial repair guard 3',
   [{'p': [0, 1, 660], 'q': [120, 2, 480]}, [[60, []], [60, ['p', 'q']], [240, []], [240, ['q']]]],
   [['p', None, 'q', None], {'p': 60, 'q': 420}]),
  ('normal control 4',
   [{'q': [120, 1, 480], 'r': [120, 2, 480], 'p': [120, 3, 240]},
    [[240, ['q']], [60, ['q', 'r']], [60, ['q']], [240, ['q']]]],
   [['r', 'p', 'p', 'p'], {'p': 480, 'q': 360, 'r': 360}]),
  ('normal control 5',
   [{'r': [240, 1, 480], 'p': [240, 2, 480], 'q': [120, 3, 480]}, [[120, ['p']], [60, ['p']]]],
   [['q', 'r'], {'p': 240, 'q': 240, 'r': 300}]),
  ('normal control 6',
   [{'p': [0, 1, 480], 'q': [60, 2, 600]}, [[240, []], [240, ['p', 'q']], [240, []], [60, []]]],
   [['p', None, None, 'q'], {'p': 240, 'q': 120}]),
  ('normal control 7',
   [{'r': [120, 1, 480], 'p': [240, 2, 0], 'q': [0, 3, 240], 's': [60, 4, 240]}, [[60, []]]],
   [['q'], {'p': 240, 'q': 60, 'r': 120, 's': 60}]),
  ('normal control 8',
   [{'r': [120, 1, 660], 'q': [120, 2, 240], 'p': [120, 3, 0]}, [[240, ['p']], [60, []], [240, ['r', 'p']]]],
   [['q', 'r', 'q'], {'p': 360, 'q': 600, 'r': 180}])],
 [('regression: daily minutes credit 1',
   [{'q': [120, 1, 600], 'p': [240, 2, 660]}, [[120, ['q']], [60, []], [120, []], [240, []]]],
   [[None, 'q', None, None], {'p': 240, 'q': 300}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [0, 1, 600], 'r': [0, 2, 0], 's': [0, 3, 240], 'p': [60, 4, 600]},
    [[240, []], [240, ['s']], [60, ['r']], [120, ['r', 's']]]],
   [['r', 'r', 'q', 'p'], {'p': 180, 'q': 60, 'r': 480, 's': 240}]),
  ('partial repair guard 3',
   [{'r': [0, 1, 600], 'p': [120, 2, 660], 'q': [0, 3, 660]},
    [[60, ['p', 'r']], [120, ['p', 'r']], [60, ['r', 'p']]]],
   [['q', None, None], {'p': 180, 'q': 60, 'r': 240}]),
  ('normal control 4', [{'q': [120, 1, 660], 'p': [240, 2, 0]}, [[60, []]]], [['q'], {'p': 240, 'q': 180}]),
  ('normal control 5', [{'p': [120, 1, 600], 'q': [120, 2, 480]}, [[120, []], [240, ['q']], [240, []]]],
   [['p', None, 'q'], {'p': 240, 'q': 600}]),
  ('normal control 6',
   [{'q': [120, 1, 600], 'r': [0, 2, 660], 'p': [60, 3, 0]}, [[60, ['p']], [60, ['q']], [120, ['q', 'r']]]],
   [['r', 'p', 'p'], {'p': 240, 'q': 240, 'r': 60}]),
  ('normal control 7',
   [{'q': [240, 1, 0], 'p': [120, 2, 660]}, [[240, []], [240, []], [240, ['q']], [60, ['p', 'q']]]],
   [['q', 'q', None, None], {'p': 180, 'q': 1020}]),
  ('normal control 8', [{'r': [0, 1, 0], 'p': [120, 2, 240], 'q': [60, 3, 600]}, [[240, []]]],
   [['r'], {'p': 120, 'q': 60, 'r': 240}])],
 [('regression: daily minutes credit 1',
   [{'p': [120, 1, 0], 'q': [120, 2, 600], 'r': [120, 3, 480]},
    [[240, ['q']], [240, ['p']], [240, []], [240, ['q', 'p']]]],
   [['p', 'r', 'p', None], {'p': 840, 'q': 120, 'r': 360}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [120, 1, 600], 'p': [240, 2, 0]}, [[120, []], [120, ['p', 'q']], [240, ['q', 'p']], [60, ['q']]]],
   [['q', None, None, 'p'], {'p': 660, 'q': 240}]),
  ('partial repair guard 3',
   [{'q': [120, 1, 600], 'p': [0, 2, 600]}, [[120, []], [240, ['p', 'q']], [60, ['q', 'p']], [120, ['q']]]],
   [['p', None, None, None], {'p': 120, 'q': 300}]),
  ('normal control 4',
   [{'q': [240, 1, 240], 'p': [120, 2, 660], 'r': [60, 3, 660], 's': [0, 4, 480]}, [[240, ['q']]]],
   [['s'], {'p': 120, 'q': 240, 'r': 60, 's': 240}]),
  ('normal control 5',
   [{'q': [120, 1, 240], 's': [240, 2, 600], 'r': [0, 3, 240], 'p': [0, 4, 480]}, [[240, ['r']]]],
   [['p'], {'p': 240, 'q': 120, 'r': 240, 's': 240}]),
  ('normal control 6',
   [{'r': [240, 1, 660], 'p': [60, 2, 600], 'q': [60, 3, 480]}, [[120, ['p']], [240, ['r']], [60, []]]],
   [['q', None, 'p'], {'p': 240, 'q': 180, 'r': 240}]),
  ('normal control 7',
   [{'q': [0, 1, 660], 's': [120, 2, 480], 'r': [120, 3, 480], 'p': [0, 4, 480]}, [[120, ['q']]]],
   [['p'], {'p': 120, 'q': 0, 'r': 120, 's': 120}]),
  ('normal control 8',
   [{'q': [120, 1, 0], 'r': [0, 2, 660], 's': [120, 3, 480], 'p': [120, 4, 0]},
    [[240, []], [120, ['q', 'r']]]],
   [['q', 's'], {'p': 120, 'q': 360, 'r': 0, 's': 240}])],
 [('regression: daily minutes credit 1',
   [{'q': [0, 1, 480], 'p': [120, 2, 660]}, [[240, []], [240, ['q', 'p']]]],
   [['q', None], {'p': 120, 'q': 240}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [120, 1, 600], 'r': [120, 2, 600], 'p': [60, 3, 600], 's': [240, 4, 660]},
    [[120, ['r', 'q']], [120, ['q', 'p']], [60, ['p']], [60, ['r', 'q']]]],
   [['p', 'r', 'q', 's'], {'p': 180, 'q': 300, 'r': 240, 's': 300}]),
  ('partial repair guard 3',
   [{'r': [0, 1, 480], 'p': [120, 2, 480], 'q': [0, 3, 480]},
    [[240, []], [60, ['p']], [120, ['r', 'q']], [120, ['p', 'q']]]],
   [['r', 'q', 'p', None], {'p': 360, 'q': 300, 'r': 240}]),
  ('normal control 4',
   [{'r': [240, 1, 480], 'q': [120, 2, 0], 'p': [240, 3, 480], 's': [240, 4, 600]},
    [[120, []], [240, ['r', 's']], [60, []], [120, ['r']]]],
   [['q', 'q', 'p', 's'], {'p': 300, 'q': 480, 'r': 480, 's': 360}]),
  ('normal control 5',
   [{'q': [120, 1, 600], 'r': [60, 2, 240], 'p': [60, 3, 0], 's': [240, 4, 660]},
    [[120, []], [60, ['q']], [240, ['s', 'q']], [120, ['p', 's']]]],
   [['r', 'p', 'p', 'q'], {'p': 360, 'q': 240, 'r': 180, 's': 240}]),
  ('normal control 6',
   [{'p': [120, 1, 660], 'q': [120, 2, 660], 'r': [120, 3, 240], 's': [120, 4, 0]},
    [[60, ['r']], [60, ['p', 'r']], [60, []], [240, []]]],
   [['p', 'q', 'r', 's'], {'p': 180, 'q': 180, 'r': 180, 's': 360}]),
  ('normal control 7',
   [{'q': [0, 1, 0], 's': [60, 2, 660], 'p': [60, 3, 0], 'r': [240, 4, 660]},
    [[240, []], [240, []], [120, ['r']], [120, ['s']]]],
   [['q', 'p', 'q', 'p'], {'p': 420, 'q': 360, 'r': 240, 's': 60}]),
  ('normal control 8', [{'q': [240, 1, 480], 'p': [60, 2, 240]}, [[60, []], [60, ['q', 'p']]]],
   [['p', None], {'p': 180, 'q': 300}])],
 [('regression: daily minutes credit 1',
   [{'p': [0, 1, 660], 'q': [120, 2, 480]}, [[60, []], [60, ['p', 'q']], [240, []], [240, ['q']]]],
   [['p', None, 'q', None], {'p': 60, 'q': 420}]),
  ('regression variant: daily minutes credit 2',
   [{'p': [240, 1, 240], 'r': [240, 2, 240], 'q': [0, 3, 480]},
    [[120, []], [120, ['p']], [60, ['p']], [60, ['r']]]],
   [['q', 'q', 'r', 'p'], {'p': 360, 'q': 240, 'r': 300}]),
  ('partial repair guard 3',
   [{'p': [0, 1, 0], 'r': [0, 2, 600], 'q': [240, 3, 0]}, [[240, ['q', 'r']], [60, []], [60, []], [60, []]]],
   [['p', 'r', 'r', 'p'], {'p': 300, 'q': 240, 'r': 120}]),
  ('normal control 4',
   [{'p': [0, 1, 600], 'r': [120, 2, 240], 'q': [0, 3, 480]}, [[240, []], [240, ['p']], [60, []]]],
   [['q', 'r', 'p'], {'p': 60, 'q': 240, 'r': 360}]),
  ('normal control 5',
   [{'p': [120, 1, 0], 'q': [120, 2, 240]}, [[60, []], [120, []], [120, ['q', 'p']], [240, ['q', 'p']]]],
   [['p', 'q', None, None], {'p': 540, 'q': 600}]),
  ('normal control 6',
   [{'r': [60, 1, 480], 'q': [60, 2, 660], 'p': [240, 3, 600]}, [[240, ['r']], [120, []]]],
   [[None, 'p'], {'p': 360, 'q': 60, 'r': 300}]),
  ('normal control 7', [{'q': [0, 1, 240], 'r': [120, 2, 660], 'p': [120, 3, 0]}, [[60, []]]],
   [['q'], {'p': 120, 'q': 60, 'r': 120}]),
  ('normal control 8', [{'q': [120, 1, 600], 'p': [60, 2, 0]}, [[60, []], [240, []]]],
   [['p', 'p'], {'p': 360, 'q': 120}])]]
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: daily minutes credit 1[['r', 's'], {'p': 120, 'q': 300, 'r': 300, 's': 300}][['r', 's'], {'p': 120, 'q': 300, 'r': 60, 's': 300}]Failed
regression variant: daily minutes credit 2[['p', None], {'p': 120, 'q': 120}][['p', None], {'p': 60, 'q': 120}]Failed
partial repair guard 3[['p', None, 'p', 'p'], {'p': 600, 'q': 420}][['p', None, 'q', None], {'p': 60, 'q': 420}]Failed
normal control 4[['r', 'p', 'p', 'p'], {'p': 480, 'q': 360, 'r': 360}][['r', 'p', 'p', 'p'], {'p': 480, 'q': 360, 'r': 360}]Passed
normal control 5[['q', 'r'], {'p': 240, 'q': 240, 'r': 300}][['q', 'r'], {'p': 240, 'q': 240, 'r': 300}]Passed
normal control 6[['p', None, 'p', 'q'], {'p': 720, 'q': 120}][['p', None, None, 'q'], {'p': 240, 'q': 120}]Failed
normal control 7[['q'], {'p': 240, 'q': 60, 'r': 120, 's': 60}][['q'], {'p': 240, 'q': 60, 'r': 120, 's': 60}]Passed
normal control 8[['q', 'r', 'q'], {'p': 360, 'q': 600, 'r': 420}][['q', 'r', 'q'], {'p': 360, 'q': 600, 'r': 180}]Failed

SHA-256 / e8f13c1a555228c6aca7a4e556b63ce51cf746890113fcfcb2f7e71bbd44d77a

3 / The verified repair

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

N = 1
observations = []
def solve(ledger, offers):
    led = {w: list(v) for w, v in ledger.items()}
    result = []
    for minutes, refusers in offers:
        cands = sorted(led, key=lambda w: (led[w][0], led[w][1]))
        taker = None
        for w in cands:
            if led[w][2] + minutes > 720:
                continue
            if w in refusers:
                led[w][0] += minutes
                continue
            taker = w
            break
        if taker is not None:
            led[taker][0] += minutes
            led[taker][2] += minutes
        result.append(taker)
    return [result, {w: led[w][0] for w in sorted(led)}]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: daily minutes credit 1',
   [{'p': [120, 1, 240], 'r': [0, 2, 480], 'q': [60, 3, 240], 's': [60, 4, 480]},
    [[60, []], [240, ['q', 'r']]]],
   [['r', 's'], {'p': 120, 'q': 300, 'r': 60, 's': 300}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [0, 1, 600], 'p': [0, 2, 660]}, [[60, ['q']], [60, ['q', 'p']]]],
   [['p', None], {'p': 60, 'q': 120}]),
  ('partial repair guard 3',
   [{'p': [0, 1, 660], 'q': [120, 2, 480]}, [[60, []], [60, ['p', 'q']], [240, []], [240, ['q']]]],
   [['p', None, 'q', None], {'p': 60, 'q': 420}]),
  ('normal control 4',
   [{'q': [120, 1, 480], 'r': [120, 2, 480], 'p': [120, 3, 240]},
    [[240, ['q']], [60, ['q', 'r']], [60, ['q']], [240, ['q']]]],
   [['r', 'p', 'p', 'p'], {'p': 480, 'q': 360, 'r': 360}]),
  ('normal control 5',
   [{'r': [240, 1, 480], 'p': [240, 2, 480], 'q': [120, 3, 480]}, [[120, ['p']], [60, ['p']]]],
   [['q', 'r'], {'p': 240, 'q': 240, 'r': 300}]),
  ('normal control 6',
   [{'p': [0, 1, 480], 'q': [60, 2, 600]}, [[240, []], [240, ['p', 'q']], [240, []], [60, []]]],
   [['p', None, None, 'q'], {'p': 240, 'q': 120}]),
  ('normal control 7',
   [{'r': [120, 1, 480], 'p': [240, 2, 0], 'q': [0, 3, 240], 's': [60, 4, 240]}, [[60, []]]],
   [['q'], {'p': 240, 'q': 60, 'r': 120, 's': 60}]),
  ('normal control 8',
   [{'r': [120, 1, 660], 'q': [120, 2, 240], 'p': [120, 3, 0]}, [[240, ['p']], [60, []], [240, ['r', 'p']]]],
   [['q', 'r', 'q'], {'p': 360, 'q': 600, 'r': 180}])],
 [('regression: daily minutes credit 1',
   [{'q': [120, 1, 600], 'p': [240, 2, 660]}, [[120, ['q']], [60, []], [120, []], [240, []]]],
   [[None, 'q', None, None], {'p': 240, 'q': 300}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [0, 1, 600], 'r': [0, 2, 0], 's': [0, 3, 240], 'p': [60, 4, 600]},
    [[240, []], [240, ['s']], [60, ['r']], [120, ['r', 's']]]],
   [['r', 'r', 'q', 'p'], {'p': 180, 'q': 60, 'r': 480, 's': 240}]),
  ('partial repair guard 3',
   [{'r': [0, 1, 600], 'p': [120, 2, 660], 'q': [0, 3, 660]},
    [[60, ['p', 'r']], [120, ['p', 'r']], [60, ['r', 'p']]]],
   [['q', None, None], {'p': 180, 'q': 60, 'r': 240}]),
  ('normal control 4', [{'q': [120, 1, 660], 'p': [240, 2, 0]}, [[60, []]]], [['q'], {'p': 240, 'q': 180}]),
  ('normal control 5', [{'p': [120, 1, 600], 'q': [120, 2, 480]}, [[120, []], [240, ['q']], [240, []]]],
   [['p', None, 'q'], {'p': 240, 'q': 600}]),
  ('normal control 6',
   [{'q': [120, 1, 600], 'r': [0, 2, 660], 'p': [60, 3, 0]}, [[60, ['p']], [60, ['q']], [120, ['q', 'r']]]],
   [['r', 'p', 'p'], {'p': 240, 'q': 240, 'r': 60}]),
  ('normal control 7',
   [{'q': [240, 1, 0], 'p': [120, 2, 660]}, [[240, []], [240, []], [240, ['q']], [60, ['p', 'q']]]],
   [['q', 'q', None, None], {'p': 180, 'q': 1020}]),
  ('normal control 8', [{'r': [0, 1, 0], 'p': [120, 2, 240], 'q': [60, 3, 600]}, [[240, []]]],
   [['r'], {'p': 120, 'q': 60, 'r': 240}])],
 [('regression: daily minutes credit 1',
   [{'p': [120, 1, 0], 'q': [120, 2, 600], 'r': [120, 3, 480]},
    [[240, ['q']], [240, ['p']], [240, []], [240, ['q', 'p']]]],
   [['p', 'r', 'p', None], {'p': 840, 'q': 120, 'r': 360}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [120, 1, 600], 'p': [240, 2, 0]}, [[120, []], [120, ['p', 'q']], [240, ['q', 'p']], [60, ['q']]]],
   [['q', None, None, 'p'], {'p': 660, 'q': 240}]),
  ('partial repair guard 3',
   [{'q': [120, 1, 600], 'p': [0, 2, 600]}, [[120, []], [240, ['p', 'q']], [60, ['q', 'p']], [120, ['q']]]],
   [['p', None, None, None], {'p': 120, 'q': 300}]),
  ('normal control 4',
   [{'q': [240, 1, 240], 'p': [120, 2, 660], 'r': [60, 3, 660], 's': [0, 4, 480]}, [[240, ['q']]]],
   [['s'], {'p': 120, 'q': 240, 'r': 60, 's': 240}]),
  ('normal control 5',
   [{'q': [120, 1, 240], 's': [240, 2, 600], 'r': [0, 3, 240], 'p': [0, 4, 480]}, [[240, ['r']]]],
   [['p'], {'p': 240, 'q': 120, 'r': 240, 's': 240}]),
  ('normal control 6',
   [{'r': [240, 1, 660], 'p': [60, 2, 600], 'q': [60, 3, 480]}, [[120, ['p']], [240, ['r']], [60, []]]],
   [['q', None, 'p'], {'p': 240, 'q': 180, 'r': 240}]),
  ('normal control 7',
   [{'q': [0, 1, 660], 's': [120, 2, 480], 'r': [120, 3, 480], 'p': [0, 4, 480]}, [[120, ['q']]]],
   [['p'], {'p': 120, 'q': 0, 'r': 120, 's': 120}]),
  ('normal control 8',
   [{'q': [120, 1, 0], 'r': [0, 2, 660], 's': [120, 3, 480], 'p': [120, 4, 0]},
    [[240, []], [120, ['q', 'r']]]],
   [['q', 's'], {'p': 120, 'q': 360, 'r': 0, 's': 240}])],
 [('regression: daily minutes credit 1',
   [{'q': [0, 1, 480], 'p': [120, 2, 660]}, [[240, []], [240, ['q', 'p']]]],
   [['q', None], {'p': 120, 'q': 240}]),
  ('regression variant: daily minutes credit 2',
   [{'q': [120, 1, 600], 'r': [120, 2, 600], 'p': [60, 3, 600], 's': [240, 4, 660]},
    [[120, ['r', 'q']], [120, ['q', 'p']], [60, ['p']], [60, ['r', 'q']]]],
   [['p', 'r', 'q', 's'], {'p': 180, 'q': 300, 'r': 240, 's': 300}]),
  ('partial repair guard 3',
   [{'r': [0, 1, 480], 'p': [120, 2, 480], 'q': [0, 3, 480]},
    [[240, []], [60, ['p']], [120, ['r', 'q']], [120, ['p', 'q']]]],
   [['r', 'q', 'p', None], {'p': 360, 'q': 300, 'r': 240}]),
  ('normal control 4',
   [{'r': [240, 1, 480], 'q': [120, 2, 0], 'p': [240, 3, 480], 's': [240, 4, 600]},
    [[120, []], [240, ['r', 's']], [60, []], [120, ['r']]]],
   [['q', 'q', 'p', 's'], {'p': 300, 'q': 480, 'r': 480, 's': 360}]),
  ('normal control 5',
   [{'q': [120, 1, 600], 'r': [60, 2, 240], 'p': [60, 3, 0], 's': [240, 4, 660]},
    [[120, []], [60, ['q']], [240, ['s', 'q']], [120, ['p', 's']]]],
   [['r', 'p', 'p', 'q'], {'p': 360, 'q': 240, 'r': 180, 's': 240}]),
  ('normal control 6',
   [{'p': [120, 1, 660], 'q': [120, 2, 660], 'r': [120, 3, 240], 's': [120, 4, 0]},
    [[60, ['r']], [60, ['p', 'r']], [60, []], [240, []]]],
   [['p', 'q', 'r', 's'], {'p': 180, 'q': 180, 'r': 180, 's': 360}]),
  ('normal control 7',
   [{'q': [0, 1, 0], 's': [60, 2, 660], 'p': [60, 3, 0], 'r': [240, 4, 660]},
    [[240, []], [240, []], [120, ['r']], [120, ['s']]]],
   [['q', 'p', 'q', 'p'], {'p': 420, 'q': 360, 'r': 240, 's': 60}]),
  ('normal control 8', [{'q': [240, 1, 480], 'p': [60, 2, 240]}, [[60, []], [60, ['q', 'p']]]],
   [['p', None], {'p': 180, 'q': 300}])],
 [('regression: daily minutes credit 1',
   [{'p': [0, 1, 660], 'q': [120, 2, 480]}, [[60, []], [60, ['p', 'q']], [240, []], [240, ['q']]]],
   [['p', None, 'q', None], {'p': 60, 'q': 420}]),
  ('regression variant: daily minutes credit 2',
   [{'p': [240, 1, 240], 'r': [240, 2, 240], 'q': [0, 3, 480]},
    [[120, []], [120, ['p']], [60, ['p']], [60, ['r']]]],
   [['q', 'q', 'r', 'p'], {'p': 360, 'q': 240, 'r': 300}]),
  ('partial repair guard 3',
   [{'p': [0, 1, 0], 'r': [0, 2, 600], 'q': [240, 3, 0]}, [[240, ['q', 'r']], [60, []], [60, []], [60, []]]],
   [['p', 'r', 'r', 'p'], {'p': 300, 'q': 240, 'r': 120}]),
  ('normal control 4',
   [{'p': [0, 1, 600], 'r': [120, 2, 240], 'q': [0, 3, 480]}, [[240, []], [240, ['p']], [60, []]]],
   [['q', 'r', 'p'], {'p': 60, 'q': 240, 'r': 360}]),
  ('normal control 5',
   [{'p': [120, 1, 0], 'q': [120, 2, 240]}, [[60, []], [120, []], [120, ['q', 'p']], [240, ['q', 'p']]]],
   [['p', 'q', None, None], {'p': 540, 'q': 600}]),
  ('normal control 6',
   [{'r': [60, 1, 480], 'q': [60, 2, 660], 'p': [240, 3, 600]}, [[240, ['r']], [120, []]]],
   [[None, 'p'], {'p': 360, 'q': 60, 'r': 300}]),
  ('normal control 7', [{'q': [0, 1, 240], 'r': [120, 2, 660], 'p': [120, 3, 0]}, [[60, []]]],
   [['q'], {'p': 120, 'q': 60, 'r': 120}]),
  ('normal control 8', [{'q': [120, 1, 600], 'p': [60, 2, 0]}, [[60, []], [240, []]]],
   [['p', 'p'], {'p': 360, 'q': 120}])]]
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: daily minutes credit 1[['r', 's'], {'p': 120, 'q': 300, 'r': 60, 's': 300}][['r', 's'], {'p': 120, 'q': 300, 'r': 60, 's': 300}]Passed
regression variant: daily minutes credit 2[['p', None], {'p': 60, 'q': 120}][['p', None], {'p': 60, 'q': 120}]Passed
partial repair guard 3[['p', None, 'q', None], {'p': 60, 'q': 420}][['p', None, 'q', None], {'p': 60, 'q': 420}]Passed
normal control 4[['r', 'p', 'p', 'p'], {'p': 480, 'q': 360, 'r': 360}][['r', 'p', 'p', 'p'], {'p': 480, 'q': 360, 'r': 360}]Passed
normal control 5[['q', 'r'], {'p': 240, 'q': 240, 'r': 300}][['q', 'r'], {'p': 240, 'q': 240, 'r': 300}]Passed
normal control 6[['p', None, None, 'q'], {'p': 240, 'q': 120}][['p', None, None, 'q'], {'p': 240, 'q': 120}]Passed
normal control 7[['q'], {'p': 240, 'q': 60, 'r': 120, 's': 60}][['q'], {'p': 240, 'q': 60, 'r': 120, 's': 60}]Passed
normal control 8[['q', 'r', 'q'], {'p': 360, 'q': 600, 'r': 180}][['q', 'r', 'q'], {'p': 360, 'q': 600, 'r': 180}]Passed

SHA-256 / 6a27c869738adcf5049cc687721f3684b552cc88f6430dd543b5d530f785924b

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

Case digest / 55206c3e1e3a720b8a40709eb59c51135b3b4dc5ad4a6cf45c88fc8d81d5d70e