FAILURE MAP
← Case archive

FA-94876 / Warehouse slotting and bin packing / Open access

Golden zone: score-8 slots not reserved · case 01

Slow movers occupy slots with ergonomic score exactly 8 that are reserved for fast movers.

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

ROOT CAUSE

The reservation test starts at scores above 8, leaving score-8 slots unreserved.

VERIFIED REPAIR

Reserve every slot scoring 8 or more for SKUs with at least 50 weekly picks.

Unsuccessful approach: Tightening the pick threshold to more than 50 wrongly excludes SKUs with exactly 50 picks from reserved slots.

Case contract

skus [[sku, weekly_picks, kg]], slots [[slot, level 1-5, ergonomic_score]]. Process SKUs by picks desc then sku. Each takes the best free eligible slot by score desc, level asc, slot id. Items over 20 kg may not be above level 2. Slots scoring 8+ are reserved for SKUs with at least 50 picks. No eligible slot -> None. Return [[sku, slot]] sorted by sku.

Why this case matters

Forward pick slotting places the fastest movers in ergonomic golden-zone locations.

1 / The failure

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

N = 1
observations = []
def solve(skus, slots):
    order = sorted(skus, key=lambda r: (-r[1], r[0]))
    used = set()
    out = {}
    for sku, picks, kg in order:
        best = None
        for s in sorted(slots, key=lambda s: (-s[2], s[1], s[0])):
            sid, lvl, score = s
            if sid in used:
                continue
            if kg > 20 and lvl > 2:
                continue
            if score > 8 and picks < 50:
                continue
            best = sid
            break
        if best is not None:
            used.add(best)
        out[sku] = best
    return [[k, out[k]] for k in sorted(out)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['generated mix 5', [[['K0', 10, 15], ['K1', 80, 2], ['K2', 49, 21], ['K3', 50, 15]], [['L0', 1, 5], ['L1', 4, 8], ['L2', 4, 9], ['L3', 1, 6], ['L4', 4, 8], ['L5', 2, 3]]], [['K0', 'L0'], ['K1', 'L2'], ['K2', 'L3'], ['K3', 'L1']]], ['heavy on level 2 ok', [[['h', 60, 25]], [['a', 3, 9], ['b', 2, 7]]], [['h', 'b']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['exactly 20 kg is not heavy', [[['e', 5, 20]], [['t', 4, 7], ['u', 1, 3]]], [['e', 't']]], ['reservation at 50 picks', [[['f', 50, 5], ['s', 49, 5]], [['g', 2, 8], ['n', 1, 6]]], [['f', 'g'], ['s', 'n']]], ['generated mix 7', [[['K0', 51, 15], ['K1', 80, 30], ['K2', 10, 21]], [['L0', 1, 8], ['L1', 2, 3]]], [['K0', 'L1'], ['K1', 'L0'], ['K2', None]]], ['generated mix 15', [[['K0', 120, 21], ['K1', 0, 30], ['K2', 0, 21], ['K3', 80, 15], ['K4', 50, 2], ['K5', 80, 30]], [['L0', 5, 8], ['L1', 1, 3], ['L2', 3, 8], ['L3', 3, 6], ['L4', 2, 6], ['L5', 3, 10]]], [['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L2'], ['K5', 'L1']]]], [['generated mix 59', [[['K0', 0, 21], ['K1', 51, 20], ['K2', 120, 15]], [['L0', 2, 8], ['L1', 5, 10], ['L2', 4, 5], ['L3', 3, 9], ['L4', 3, 5], ['L5', 3, 8]]], [['K0', None], ['K1', 'L3'], ['K2', 'L1']]], ['generated mix 24', [[['K0', 50, 30], ['K1', 10, 30], ['K2', 10, 21]], [['L0', 2, 3], ['L1', 4, 10], ['L2', 4, 6], ['L3', 1, 10], ['L4', 4, 3], ['L5', 2, 5], ['L6', 4, 9]]], [['K0', 'L3'], ['K1', 'L5'], ['K2', 'L0']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', None]]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['heavy on level 2 ok', [[['h', 60, 25]], [['a', 3, 9], ['b', 2, 7]]], [['h', 'b']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['generated mix 9', [[['K0', 50, 20], ['K1', 50, 30], ['K2', 0, 21], ['K3', 10, 20], ['K4', 10, 20], ['K5', 51, 2]], [['L0', 3, 9], ['L1', 4, 6], ['L2', 2, 3]]], [['K0', 'L1'], ['K1', 'L2'], ['K2', None], ['K3', None], ['K4', None], ['K5', 'L0']]], ['generated mix 17', [[['K0', 50, 30]], [['L0', 3, 3], ['L1', 2, 5], ['L2', 2, 10], ['L3', 2, 10], ['L4', 3, 10]]], [['K0', 'L2']]]], [['generated mix 27', [[['K0', 49, 2], ['K1', 120, 2], ['K2', 80, 21]], [['L0', 4, 8], ['L1', 1, 8], ['L2', 3, 9], ['L3', 5, 6], ['L4', 5, 5]]], [['K0', 'L3'], ['K1', 'L2'], ['K2', 'L1']]], ['generated mix 37', [[['K0', 49, 2], ['K1', 0, 20], ['K2', 50, 20], ['K3', 120, 21], ['K4', 10, 30]], [['L0', 4, 6], ['L1', 3, 5], ['L2', 2, 8], ['L3', 1, 8]]], [['K0', 'L0'], ['K1', 'L1'], ['K2', 'L2'], ['K3', 'L3'], ['K4', None]]], ['exactly 20 kg is not heavy', [[['e', 5, 20]], [['t', 4, 7], ['u', 1, 3]]], [['e', 't']]], ['reservation at 50 picks', [[['f', 50, 5], ['s', 49, 5]], [['g', 2, 8], ['n', 1, 6]]], [['f', 'g'], ['s', 'n']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', None]]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['generated mix 20', [[['K0', 50, 15]], [['L0', 4, 3], ['L1', 3, 10], ['L2', 4, 8], ['L3', 5, 9]]], [['K0', 'L1']]], ['generated mix 29', [[['K0', 50, 20]], [['L0', 4, 3], ['L1', 4, 10], ['L2', 5, 6]]], [['K0', 'L1']]]], [['generated mix 69', [[['K0', 50, 30], ['K1', 49, 2], ['K2', 51, 30], ['K3', 0, 15]], [['L0', 4, 8], ['L1', 5, 5], ['L2', 1, 3], ['L3', 4, 3]]], [['K0', None], ['K1', 'L1'], ['K2', 'L2'], ['K3', 'L3']]], ['generated mix 58', [[['K0', 10, 30], ['K1', 50, 15], ['K2', 80, 30], ['K3', 120, 15]], [['L0', 4, 8], ['L1', 2, 8], ['L2', 4, 8], ['L3', 2, 3]]], [['K0', None], ['K1', 'L0'], ['K2', 'L3'], ['K3', 'L1']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['exactly 20 kg is not heavy', [[['e', 5, 20]], [['t', 4, 7], ['u', 1, 3]]], [['e', 't']]], ['reservation at 50 picks', [[['f', 50, 5], ['s', 49, 5]], [['g', 2, 8], ['n', 1, 6]]], [['f', 'g'], ['s', 'n']]], ['generated mix 31', [[['K0', 0, 21], ['K1', 10, 21], ['K2', 80, 2], ['K3', 0, 21], ['K4', 80, 2]], [['L0', 2, 5], ['L1', 4, 6], ['L2', 4, 3], ['L3', 2, 3], ['L4', 3, 8]]], [['K0', 'L3'], ['K1', 'L0'], ['K2', 'L4'], ['K3', None], ['K4', 'L1']]], ['generated mix 39', [[['K0', 0, 2], ['K1', 80, 15]], [['L0', 5, 8], ['L1', 1, 5], ['L2', 5, 8], ['L3', 1, 9], ['L4', 5, 9]]], [['K0', 'L1'], ['K1', 'L3']]]], [['generated mix 40', [[['K0', 49, 20], ['K1', 50, 21], ['K2', 51, 15], ['K3', 10, 15]], [['L0', 2, 10], ['L1', 4, 8], ['L2', 1, 5], ['L3', 5, 10], ['L4', 2, 10], ['L5', 1, 9], ['L6', 4, 6]]], [['K0', 'L6'], ['K1', 'L4'], ['K2', 'L0'], ['K3', 'L2']]], ['generated mix 77', [[['K0', 50, 2]], [['L0', 5, 3], ['L1', 5, 5], ['L2', 5, 8], ['L3', 4, 9], ['L4', 4, 5], ['L5', 1, 10], ['L6', 5, 8]]], [['K0', 'L5']]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['heavy on level 2 ok', [[['h', 60, 25]], [['a', 3, 9], ['b', 2, 7]]], [['h', 'b']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['generated mix 43', [[['K0', 120, 21], ['K1', 49, 21], ['K2', 80, 21], ['K3', 49, 21], ['K4', 80, 30]], [['L0', 2, 5], ['L1', 4, 9], ['L2', 5, 3], ['L3', 2, 5], ['L4', 2, 3], ['L5', 1, 9], ['L6', 1, 8]]], [['K0', 'L5'], ['K1', 'L3'], ['K2', 'L6'], ['K3', 'L4'], ['K4', 'L0']]], ['generated mix 51', [[['K0', 0, 21], ['K1', 80, 2], ['K2', 10, 20], ['K3', 80, 20]], [['L0', 5, 9], ['L1', 5, 9], ['L2', 1, 8], ['L3', 2, 3], ['L4', 1, 9], ['L5', 4, 8], ['L6', 4, 9]]], [['K0', None], ['K1', 'L4'], ['K2', 'L3'], ['K3', 'L6']]]]]
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
generated mix 5[['K0', 'L4'], ['K1', 'L2'], ['K2', 'L3'], ['K3', 'L1']][['K0', 'L0'], ['K1', 'L2'], ['K2', 'L3'], ['K3', 'L1']]Failed
heavy on level 2 ok[['h', 'b']][['h', 'b']]Passed
score tie prefers low level[['q', 'z']][['q', 'z']]Passed
two skus compete[['a', 's1'], ['b', 's2']][['a', 's1'], ['b', 's2']]Passed
exactly 20 kg is not heavy[['e', 't']][['e', 't']]Passed
reservation at 50 picks[['f', 'g'], ['s', 'n']][['f', 'g'], ['s', 'n']]Passed
generated mix 7[['K0', 'L1'], ['K1', 'L0'], ['K2', None]][['K0', 'L1'], ['K1', 'L0'], ['K2', None]]Passed
generated mix 15[['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L2'], ['K5', 'L1']][['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L2'], ['K5', 'L1']]Passed

SHA-256 / a9ebb9db4cbc6df1b1ec140e9f6abb35bd3ab0932f675b9d78b9166e18107db5

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(skus, slots):
    order = sorted(skus, key=lambda r: (-r[1], r[0]))
    used = set()
    out = {}
    for sku, picks, kg in order:
        best = None
        for s in sorted(slots, key=lambda s: (-s[2], s[1], s[0])):
            sid, lvl, score = s
            if sid in used:
                continue
            if kg > 20 and lvl > 2:
                continue
            if score >= 8 and picks <= 50:
                continue
            best = sid
            break
        if best is not None:
            used.add(best)
        out[sku] = best
    return [[k, out[k]] for k in sorted(out)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['generated mix 5', [[['K0', 10, 15], ['K1', 80, 2], ['K2', 49, 21], ['K3', 50, 15]], [['L0', 1, 5], ['L1', 4, 8], ['L2', 4, 9], ['L3', 1, 6], ['L4', 4, 8], ['L5', 2, 3]]], [['K0', 'L0'], ['K1', 'L2'], ['K2', 'L3'], ['K3', 'L1']]], ['heavy on level 2 ok', [[['h', 60, 25]], [['a', 3, 9], ['b', 2, 7]]], [['h', 'b']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['exactly 20 kg is not heavy', [[['e', 5, 20]], [['t', 4, 7], ['u', 1, 3]]], [['e', 't']]], ['reservation at 50 picks', [[['f', 50, 5], ['s', 49, 5]], [['g', 2, 8], ['n', 1, 6]]], [['f', 'g'], ['s', 'n']]], ['generated mix 7', [[['K0', 51, 15], ['K1', 80, 30], ['K2', 10, 21]], [['L0', 1, 8], ['L1', 2, 3]]], [['K0', 'L1'], ['K1', 'L0'], ['K2', None]]], ['generated mix 15', [[['K0', 120, 21], ['K1', 0, 30], ['K2', 0, 21], ['K3', 80, 15], ['K4', 50, 2], ['K5', 80, 30]], [['L0', 5, 8], ['L1', 1, 3], ['L2', 3, 8], ['L3', 3, 6], ['L4', 2, 6], ['L5', 3, 10]]], [['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L2'], ['K5', 'L1']]]], [['generated mix 59', [[['K0', 0, 21], ['K1', 51, 20], ['K2', 120, 15]], [['L0', 2, 8], ['L1', 5, 10], ['L2', 4, 5], ['L3', 3, 9], ['L4', 3, 5], ['L5', 3, 8]]], [['K0', None], ['K1', 'L3'], ['K2', 'L1']]], ['generated mix 24', [[['K0', 50, 30], ['K1', 10, 30], ['K2', 10, 21]], [['L0', 2, 3], ['L1', 4, 10], ['L2', 4, 6], ['L3', 1, 10], ['L4', 4, 3], ['L5', 2, 5], ['L6', 4, 9]]], [['K0', 'L3'], ['K1', 'L5'], ['K2', 'L0']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', None]]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['heavy on level 2 ok', [[['h', 60, 25]], [['a', 3, 9], ['b', 2, 7]]], [['h', 'b']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['generated mix 9', [[['K0', 50, 20], ['K1', 50, 30], ['K2', 0, 21], ['K3', 10, 20], ['K4', 10, 20], ['K5', 51, 2]], [['L0', 3, 9], ['L1', 4, 6], ['L2', 2, 3]]], [['K0', 'L1'], ['K1', 'L2'], ['K2', None], ['K3', None], ['K4', None], ['K5', 'L0']]], ['generated mix 17', [[['K0', 50, 30]], [['L0', 3, 3], ['L1', 2, 5], ['L2', 2, 10], ['L3', 2, 10], ['L4', 3, 10]]], [['K0', 'L2']]]], [['generated mix 27', [[['K0', 49, 2], ['K1', 120, 2], ['K2', 80, 21]], [['L0', 4, 8], ['L1', 1, 8], ['L2', 3, 9], ['L3', 5, 6], ['L4', 5, 5]]], [['K0', 'L3'], ['K1', 'L2'], ['K2', 'L1']]], ['generated mix 37', [[['K0', 49, 2], ['K1', 0, 20], ['K2', 50, 20], ['K3', 120, 21], ['K4', 10, 30]], [['L0', 4, 6], ['L1', 3, 5], ['L2', 2, 8], ['L3', 1, 8]]], [['K0', 'L0'], ['K1', 'L1'], ['K2', 'L2'], ['K3', 'L3'], ['K4', None]]], ['exactly 20 kg is not heavy', [[['e', 5, 20]], [['t', 4, 7], ['u', 1, 3]]], [['e', 't']]], ['reservation at 50 picks', [[['f', 50, 5], ['s', 49, 5]], [['g', 2, 8], ['n', 1, 6]]], [['f', 'g'], ['s', 'n']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', None]]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['generated mix 20', [[['K0', 50, 15]], [['L0', 4, 3], ['L1', 3, 10], ['L2', 4, 8], ['L3', 5, 9]]], [['K0', 'L1']]], ['generated mix 29', [[['K0', 50, 20]], [['L0', 4, 3], ['L1', 4, 10], ['L2', 5, 6]]], [['K0', 'L1']]]], [['generated mix 69', [[['K0', 50, 30], ['K1', 49, 2], ['K2', 51, 30], ['K3', 0, 15]], [['L0', 4, 8], ['L1', 5, 5], ['L2', 1, 3], ['L3', 4, 3]]], [['K0', None], ['K1', 'L1'], ['K2', 'L2'], ['K3', 'L3']]], ['generated mix 58', [[['K0', 10, 30], ['K1', 50, 15], ['K2', 80, 30], ['K3', 120, 15]], [['L0', 4, 8], ['L1', 2, 8], ['L2', 4, 8], ['L3', 2, 3]]], [['K0', None], ['K1', 'L0'], ['K2', 'L3'], ['K3', 'L1']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['exactly 20 kg is not heavy', [[['e', 5, 20]], [['t', 4, 7], ['u', 1, 3]]], [['e', 't']]], ['reservation at 50 picks', [[['f', 50, 5], ['s', 49, 5]], [['g', 2, 8], ['n', 1, 6]]], [['f', 'g'], ['s', 'n']]], ['generated mix 31', [[['K0', 0, 21], ['K1', 10, 21], ['K2', 80, 2], ['K3', 0, 21], ['K4', 80, 2]], [['L0', 2, 5], ['L1', 4, 6], ['L2', 4, 3], ['L3', 2, 3], ['L4', 3, 8]]], [['K0', 'L3'], ['K1', 'L0'], ['K2', 'L4'], ['K3', None], ['K4', 'L1']]], ['generated mix 39', [[['K0', 0, 2], ['K1', 80, 15]], [['L0', 5, 8], ['L1', 1, 5], ['L2', 5, 8], ['L3', 1, 9], ['L4', 5, 9]]], [['K0', 'L1'], ['K1', 'L3']]]], [['generated mix 40', [[['K0', 49, 20], ['K1', 50, 21], ['K2', 51, 15], ['K3', 10, 15]], [['L0', 2, 10], ['L1', 4, 8], ['L2', 1, 5], ['L3', 5, 10], ['L4', 2, 10], ['L5', 1, 9], ['L6', 4, 6]]], [['K0', 'L6'], ['K1', 'L4'], ['K2', 'L0'], ['K3', 'L2']]], ['generated mix 77', [[['K0', 50, 2]], [['L0', 5, 3], ['L1', 5, 5], ['L2', 5, 8], ['L3', 4, 9], ['L4', 4, 5], ['L5', 1, 10], ['L6', 5, 8]]], [['K0', 'L5']]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['heavy on level 2 ok', [[['h', 60, 25]], [['a', 3, 9], ['b', 2, 7]]], [['h', 'b']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['generated mix 43', [[['K0', 120, 21], ['K1', 49, 21], ['K2', 80, 21], ['K3', 49, 21], ['K4', 80, 30]], [['L0', 2, 5], ['L1', 4, 9], ['L2', 5, 3], ['L3', 2, 5], ['L4', 2, 3], ['L5', 1, 9], ['L6', 1, 8]]], [['K0', 'L5'], ['K1', 'L3'], ['K2', 'L6'], ['K3', 'L4'], ['K4', 'L0']]], ['generated mix 51', [[['K0', 0, 21], ['K1', 80, 2], ['K2', 10, 20], ['K3', 80, 20]], [['L0', 5, 9], ['L1', 5, 9], ['L2', 1, 8], ['L3', 2, 3], ['L4', 1, 9], ['L5', 4, 8], ['L6', 4, 9]]], [['K0', None], ['K1', 'L4'], ['K2', 'L3'], ['K3', 'L6']]]]]
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
generated mix 5[['K0', 'L5'], ['K1', 'L2'], ['K2', 'L0'], ['K3', 'L3']][['K0', 'L0'], ['K1', 'L2'], ['K2', 'L3'], ['K3', 'L1']]Failed
heavy on level 2 ok[['h', 'b']][['h', 'b']]Passed
score tie prefers low level[['q', 'z']][['q', 'z']]Passed
two skus compete[['a', 's1'], ['b', 's2']][['a', 's1'], ['b', 's2']]Passed
exactly 20 kg is not heavy[['e', 't']][['e', 't']]Passed
reservation at 50 picks[['f', 'n'], ['s', None]][['f', 'g'], ['s', 'n']]Failed
generated mix 7[['K0', 'L1'], ['K1', 'L0'], ['K2', None]][['K0', 'L1'], ['K1', 'L0'], ['K2', None]]Passed
generated mix 15[['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L3'], ['K5', 'L1']][['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L2'], ['K5', 'L1']]Failed

SHA-256 / 9d7dae422b3dae904c5ee0985ca465cf5855bc168e556a0c925ddf389e2bb0dd

3 / The verified repair

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

N = 1
observations = []
def solve(skus, slots):
    order = sorted(skus, key=lambda r: (-r[1], r[0]))
    used = set()
    out = {}
    for sku, picks, kg in order:
        best = None
        for s in sorted(slots, key=lambda s: (-s[2], s[1], s[0])):
            sid, lvl, score = s
            if sid in used:
                continue
            if kg > 20 and lvl > 2:
                continue
            if score >= 8 and picks < 50:
                continue
            best = sid
            break
        if best is not None:
            used.add(best)
        out[sku] = best
    return [[k, out[k]] for k in sorted(out)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['generated mix 5', [[['K0', 10, 15], ['K1', 80, 2], ['K2', 49, 21], ['K3', 50, 15]], [['L0', 1, 5], ['L1', 4, 8], ['L2', 4, 9], ['L3', 1, 6], ['L4', 4, 8], ['L5', 2, 3]]], [['K0', 'L0'], ['K1', 'L2'], ['K2', 'L3'], ['K3', 'L1']]], ['heavy on level 2 ok', [[['h', 60, 25]], [['a', 3, 9], ['b', 2, 7]]], [['h', 'b']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['exactly 20 kg is not heavy', [[['e', 5, 20]], [['t', 4, 7], ['u', 1, 3]]], [['e', 't']]], ['reservation at 50 picks', [[['f', 50, 5], ['s', 49, 5]], [['g', 2, 8], ['n', 1, 6]]], [['f', 'g'], ['s', 'n']]], ['generated mix 7', [[['K0', 51, 15], ['K1', 80, 30], ['K2', 10, 21]], [['L0', 1, 8], ['L1', 2, 3]]], [['K0', 'L1'], ['K1', 'L0'], ['K2', None]]], ['generated mix 15', [[['K0', 120, 21], ['K1', 0, 30], ['K2', 0, 21], ['K3', 80, 15], ['K4', 50, 2], ['K5', 80, 30]], [['L0', 5, 8], ['L1', 1, 3], ['L2', 3, 8], ['L3', 3, 6], ['L4', 2, 6], ['L5', 3, 10]]], [['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L2'], ['K5', 'L1']]]], [['generated mix 59', [[['K0', 0, 21], ['K1', 51, 20], ['K2', 120, 15]], [['L0', 2, 8], ['L1', 5, 10], ['L2', 4, 5], ['L3', 3, 9], ['L4', 3, 5], ['L5', 3, 8]]], [['K0', None], ['K1', 'L3'], ['K2', 'L1']]], ['generated mix 24', [[['K0', 50, 30], ['K1', 10, 30], ['K2', 10, 21]], [['L0', 2, 3], ['L1', 4, 10], ['L2', 4, 6], ['L3', 1, 10], ['L4', 4, 3], ['L5', 2, 5], ['L6', 4, 9]]], [['K0', 'L3'], ['K1', 'L5'], ['K2', 'L0']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', None]]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['heavy on level 2 ok', [[['h', 60, 25]], [['a', 3, 9], ['b', 2, 7]]], [['h', 'b']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['generated mix 9', [[['K0', 50, 20], ['K1', 50, 30], ['K2', 0, 21], ['K3', 10, 20], ['K4', 10, 20], ['K5', 51, 2]], [['L0', 3, 9], ['L1', 4, 6], ['L2', 2, 3]]], [['K0', 'L1'], ['K1', 'L2'], ['K2', None], ['K3', None], ['K4', None], ['K5', 'L0']]], ['generated mix 17', [[['K0', 50, 30]], [['L0', 3, 3], ['L1', 2, 5], ['L2', 2, 10], ['L3', 2, 10], ['L4', 3, 10]]], [['K0', 'L2']]]], [['generated mix 27', [[['K0', 49, 2], ['K1', 120, 2], ['K2', 80, 21]], [['L0', 4, 8], ['L1', 1, 8], ['L2', 3, 9], ['L3', 5, 6], ['L4', 5, 5]]], [['K0', 'L3'], ['K1', 'L2'], ['K2', 'L1']]], ['generated mix 37', [[['K0', 49, 2], ['K1', 0, 20], ['K2', 50, 20], ['K3', 120, 21], ['K4', 10, 30]], [['L0', 4, 6], ['L1', 3, 5], ['L2', 2, 8], ['L3', 1, 8]]], [['K0', 'L0'], ['K1', 'L1'], ['K2', 'L2'], ['K3', 'L3'], ['K4', None]]], ['exactly 20 kg is not heavy', [[['e', 5, 20]], [['t', 4, 7], ['u', 1, 3]]], [['e', 't']]], ['reservation at 50 picks', [[['f', 50, 5], ['s', 49, 5]], [['g', 2, 8], ['n', 1, 6]]], [['f', 'g'], ['s', 'n']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', None]]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['generated mix 20', [[['K0', 50, 15]], [['L0', 4, 3], ['L1', 3, 10], ['L2', 4, 8], ['L3', 5, 9]]], [['K0', 'L1']]], ['generated mix 29', [[['K0', 50, 20]], [['L0', 4, 3], ['L1', 4, 10], ['L2', 5, 6]]], [['K0', 'L1']]]], [['generated mix 69', [[['K0', 50, 30], ['K1', 49, 2], ['K2', 51, 30], ['K3', 0, 15]], [['L0', 4, 8], ['L1', 5, 5], ['L2', 1, 3], ['L3', 4, 3]]], [['K0', None], ['K1', 'L1'], ['K2', 'L2'], ['K3', 'L3']]], ['generated mix 58', [[['K0', 10, 30], ['K1', 50, 15], ['K2', 80, 30], ['K3', 120, 15]], [['L0', 4, 8], ['L1', 2, 8], ['L2', 4, 8], ['L3', 2, 3]]], [['K0', None], ['K1', 'L0'], ['K2', 'L3'], ['K3', 'L1']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['exactly 20 kg is not heavy', [[['e', 5, 20]], [['t', 4, 7], ['u', 1, 3]]], [['e', 't']]], ['reservation at 50 picks', [[['f', 50, 5], ['s', 49, 5]], [['g', 2, 8], ['n', 1, 6]]], [['f', 'g'], ['s', 'n']]], ['generated mix 31', [[['K0', 0, 21], ['K1', 10, 21], ['K2', 80, 2], ['K3', 0, 21], ['K4', 80, 2]], [['L0', 2, 5], ['L1', 4, 6], ['L2', 4, 3], ['L3', 2, 3], ['L4', 3, 8]]], [['K0', 'L3'], ['K1', 'L0'], ['K2', 'L4'], ['K3', None], ['K4', 'L1']]], ['generated mix 39', [[['K0', 0, 2], ['K1', 80, 15]], [['L0', 5, 8], ['L1', 1, 5], ['L2', 5, 8], ['L3', 1, 9], ['L4', 5, 9]]], [['K0', 'L1'], ['K1', 'L3']]]], [['generated mix 40', [[['K0', 49, 20], ['K1', 50, 21], ['K2', 51, 15], ['K3', 10, 15]], [['L0', 2, 10], ['L1', 4, 8], ['L2', 1, 5], ['L3', 5, 10], ['L4', 2, 10], ['L5', 1, 9], ['L6', 4, 6]]], [['K0', 'L6'], ['K1', 'L4'], ['K2', 'L0'], ['K3', 'L2']]], ['generated mix 77', [[['K0', 50, 2]], [['L0', 5, 3], ['L1', 5, 5], ['L2', 5, 8], ['L3', 4, 9], ['L4', 4, 5], ['L5', 1, 10], ['L6', 5, 8]]], [['K0', 'L5']]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['heavy on level 2 ok', [[['h', 60, 25]], [['a', 3, 9], ['b', 2, 7]]], [['h', 'b']]], ['score tie prefers low level', [[['q', 10, 1]], [['z', 1, 6], ['a', 3, 6]]], [['q', 'z']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['generated mix 43', [[['K0', 120, 21], ['K1', 49, 21], ['K2', 80, 21], ['K3', 49, 21], ['K4', 80, 30]], [['L0', 2, 5], ['L1', 4, 9], ['L2', 5, 3], ['L3', 2, 5], ['L4', 2, 3], ['L5', 1, 9], ['L6', 1, 8]]], [['K0', 'L5'], ['K1', 'L3'], ['K2', 'L6'], ['K3', 'L4'], ['K4', 'L0']]], ['generated mix 51', [[['K0', 0, 21], ['K1', 80, 2], ['K2', 10, 20], ['K3', 80, 20]], [['L0', 5, 9], ['L1', 5, 9], ['L2', 1, 8], ['L3', 2, 3], ['L4', 1, 9], ['L5', 4, 8], ['L6', 4, 9]]], [['K0', None], ['K1', 'L4'], ['K2', 'L3'], ['K3', 'L6']]]]]
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
generated mix 5[['K0', 'L0'], ['K1', 'L2'], ['K2', 'L3'], ['K3', 'L1']][['K0', 'L0'], ['K1', 'L2'], ['K2', 'L3'], ['K3', 'L1']]Passed
heavy on level 2 ok[['h', 'b']][['h', 'b']]Passed
score tie prefers low level[['q', 'z']][['q', 'z']]Passed
two skus compete[['a', 's1'], ['b', 's2']][['a', 's1'], ['b', 's2']]Passed
exactly 20 kg is not heavy[['e', 't']][['e', 't']]Passed
reservation at 50 picks[['f', 'g'], ['s', 'n']][['f', 'g'], ['s', 'n']]Passed
generated mix 7[['K0', 'L1'], ['K1', 'L0'], ['K2', None]][['K0', 'L1'], ['K1', 'L0'], ['K2', None]]Passed
generated mix 15[['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L2'], ['K5', 'L1']][['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L2'], ['K5', 'L1']]Passed

SHA-256 / 0c28e54b85e2e0d9b329ee1ef9c1988526776728de17ba1dbbad15548567c927

Verification & scope

Greedy stipulated slotting policy; real slotting optimizers weigh many more factors. 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:08.509878+00:00.

Case digest / 83704fa46e7ad20323f44eb8898ec2649abf6f9eaee47d2f6e05e46ea10b8dbf