FA-94886 / Warehouse slotting and bin packing / Open access
Golden zone: slow SKUs choose slots first · case 01
The slowest SKUs grab the best slots before the fastest movers are considered.
ROOT CAUSE
The SKU processing order sorts weekly picks ascending.
VERIFIED REPAIR
Process SKUs by weekly picks descending, then sku code ascending.
Unsuccessful approach: Dropping the sku tie-break leaves equal-velocity SKUs in feed order, so slot outcomes depend on input order.
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 1', [[['K0', 120, 21], ['K1', 49, 20], ['K2', 120, 15]], [['L0', 1, 3], ['L1', 4, 3], ['L2', 1, 9], ['L3', 2, 3]]], [['K0', 'L2'], ['K1', 'L3'], ['K2', 'L0']]], ['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']]], ['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 10', [[['K0', 51, 20], ['K1', 50, 30], ['K2', 50, 21]], [['L0', 1, 5], ['L1', 2, 8], ['L2', 2, 3], ['L3', 1, 6], ['L4', 2, 8], ['L5', 1, 6]]], [['K0', 'L1'], ['K1', 'L4'], ['K2', 'L3']]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', 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']]], ['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 18', [[['K0', 80, 20], ['K1', 120, 20], ['K2', 120, 30], ['K3', 120, 20], ['K4', 80, 21], ['K5', 10, 20]], [['L0', 1, 10], ['L1', 4, 8], ['L2', 1, 5], ['L3', 1, 3], ['L4', 2, 5], ['L5', 1, 3]]], [['K0', 'L4'], ['K1', 'L0'], ['K2', 'L2'], ['K3', 'L1'], ['K4', 'L3'], ['K5', 'L5']]], ['generated mix 26', [[['K0', 120, 15], ['K1', 0, 2], ['K2', 80, 21]], [['L0', 3, 9], ['L1', 5, 6], ['L2', 1, 3], ['L3', 4, 10]]], [['K0', 'L3'], ['K1', 'L1'], ['K2', 'L2']]]], [['generated mix 22', [[['K0', 120, 20], ['K1', 80, 2], ['K2', 120, 15], ['K3', 80, 2], ['K4', 49, 20], ['K5', 0, 15]], [['L0', 2, 3], ['L1', 4, 8], ['L2', 4, 10], ['L3', 2, 10], ['L4', 1, 3]]], [['K0', 'L3'], ['K1', 'L1'], ['K2', 'L2'], ['K3', 'L4'], ['K4', 'L0'], ['K5', 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']]], ['two skus compete', [[['a', 90, 1], ['b', 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 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]]]], [['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']]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', 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']]], ['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 48', [[['K0', 50, 20], ['K1', 120, 15], ['K2', 0, 2], ['K3', 80, 30]], [['L0', 2, 10], ['L1', 3, 9], ['L2', 1, 9], ['L3', 2, 8], ['L4', 1, 10]]], [['K0', 'L2'], ['K1', 'L4'], ['K2', None], ['K3', 'L0']]]], [['generated mix 52', [[['K0', 10, 20], ['K1', 10, 15], ['K2', 0, 21], ['K3', 0, 30], ['K4', 0, 20]], [['L0', 5, 9], ['L1', 3, 5]]], [['K0', 'L1'], ['K1', None], ['K2', None], ['K3', None], ['K4', 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']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['generated mix 42', [[['K0', 51, 15]], [['L0', 5, 6], ['L1', 4, 10], ['L2', 1, 8], ['L3', 3, 9], ['L4', 4, 8]]], [['K0', 'L1']]], ['generated mix 50', [[['K0', 120, 21], ['K1', 49, 21], ['K2', 49, 2], ['K3', 49, 20], ['K4', 49, 15], ['K5', 80, 20]], [['L0', 2, 3], ['L1', 5, 10], ['L2', 3, 9], ['L3', 2, 5], ['L4', 1, 5], ['L5', 3, 3], ['L6', 1, 8]]], [['K0', 'L6'], ['K1', 'L4'], ['K2', 'L3'], ['K3', 'L0'], ['K4', 'L5'], ['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']]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| generated mix 1 | [['K0', 'L2'], ['K1', 'L0'], ['K2', 'L3']] | [['K0', 'L2'], ['K1', 'L3'], ['K2', 'L0']] | Failed |
| tie in feed order | [['a', 's1'], ['b', 's2']] | [['a', 's1'], ['b', 's2']] | 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 |
| reservation at 50 picks | [['f', 'g'], ['s', 'n']] | [['f', 'g'], ['s', 'n']] | Passed |
| generated mix 7 | [['K0', 'L0'], ['K1', None], ['K2', 'L1']] | [['K0', 'L1'], ['K1', 'L0'], ['K2', None]] | Failed |
| generated mix 15 | [['K0', None], ['K1', 'L4'], ['K2', 'L1'], ['K3', 'L2'], ['K4', 'L5'], ['K5', None]] | [['K0', 'L4'], ['K1', None], ['K2', None], ['K3', 'L5'], ['K4', 'L2'], ['K5', 'L1']] | Failed |
SHA-256 / b99f35a000be120eb054e37620a975464abd5a1c605d0cb42c8d9fbb1f7ef8db
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])
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 1', [[['K0', 120, 21], ['K1', 49, 20], ['K2', 120, 15]], [['L0', 1, 3], ['L1', 4, 3], ['L2', 1, 9], ['L3', 2, 3]]], [['K0', 'L2'], ['K1', 'L3'], ['K2', 'L0']]], ['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']]], ['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 10', [[['K0', 51, 20], ['K1', 50, 30], ['K2', 50, 21]], [['L0', 1, 5], ['L1', 2, 8], ['L2', 2, 3], ['L3', 1, 6], ['L4', 2, 8], ['L5', 1, 6]]], [['K0', 'L1'], ['K1', 'L4'], ['K2', 'L3']]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', 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']]], ['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 18', [[['K0', 80, 20], ['K1', 120, 20], ['K2', 120, 30], ['K3', 120, 20], ['K4', 80, 21], ['K5', 10, 20]], [['L0', 1, 10], ['L1', 4, 8], ['L2', 1, 5], ['L3', 1, 3], ['L4', 2, 5], ['L5', 1, 3]]], [['K0', 'L4'], ['K1', 'L0'], ['K2', 'L2'], ['K3', 'L1'], ['K4', 'L3'], ['K5', 'L5']]], ['generated mix 26', [[['K0', 120, 15], ['K1', 0, 2], ['K2', 80, 21]], [['L0', 3, 9], ['L1', 5, 6], ['L2', 1, 3], ['L3', 4, 10]]], [['K0', 'L3'], ['K1', 'L1'], ['K2', 'L2']]]], [['generated mix 22', [[['K0', 120, 20], ['K1', 80, 2], ['K2', 120, 15], ['K3', 80, 2], ['K4', 49, 20], ['K5', 0, 15]], [['L0', 2, 3], ['L1', 4, 8], ['L2', 4, 10], ['L3', 2, 10], ['L4', 1, 3]]], [['K0', 'L3'], ['K1', 'L1'], ['K2', 'L2'], ['K3', 'L4'], ['K4', 'L0'], ['K5', 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']]], ['two skus compete', [[['a', 90, 1], ['b', 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 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]]]], [['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']]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', 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']]], ['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 48', [[['K0', 50, 20], ['K1', 120, 15], ['K2', 0, 2], ['K3', 80, 30]], [['L0', 2, 10], ['L1', 3, 9], ['L2', 1, 9], ['L3', 2, 8], ['L4', 1, 10]]], [['K0', 'L2'], ['K1', 'L4'], ['K2', None], ['K3', 'L0']]]], [['generated mix 52', [[['K0', 10, 20], ['K1', 10, 15], ['K2', 0, 21], ['K3', 0, 30], ['K4', 0, 20]], [['L0', 5, 9], ['L1', 3, 5]]], [['K0', 'L1'], ['K1', None], ['K2', None], ['K3', None], ['K4', 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']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['generated mix 42', [[['K0', 51, 15]], [['L0', 5, 6], ['L1', 4, 10], ['L2', 1, 8], ['L3', 3, 9], ['L4', 4, 8]]], [['K0', 'L1']]], ['generated mix 50', [[['K0', 120, 21], ['K1', 49, 21], ['K2', 49, 2], ['K3', 49, 20], ['K4', 49, 15], ['K5', 80, 20]], [['L0', 2, 3], ['L1', 5, 10], ['L2', 3, 9], ['L3', 2, 5], ['L4', 1, 5], ['L5', 3, 3], ['L6', 1, 8]]], [['K0', 'L6'], ['K1', 'L4'], ['K2', 'L3'], ['K3', 'L0'], ['K4', 'L5'], ['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']]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| generated mix 1 | [['K0', 'L2'], ['K1', 'L3'], ['K2', 'L0']] | [['K0', 'L2'], ['K1', 'L3'], ['K2', 'L0']] | Passed |
| tie in feed order | [['a', 's2'], ['b', 's1']] | [['a', 's1'], ['b', 's2']] | 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 |
| 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 / d070823975de7d18a4e7d1bdf9eca6edb5439a98b63cc596f577fd5b6ea090e1
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 1', [[['K0', 120, 21], ['K1', 49, 20], ['K2', 120, 15]], [['L0', 1, 3], ['L1', 4, 3], ['L2', 1, 9], ['L3', 2, 3]]], [['K0', 'L2'], ['K1', 'L3'], ['K2', 'L0']]], ['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']]], ['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 10', [[['K0', 51, 20], ['K1', 50, 30], ['K2', 50, 21]], [['L0', 1, 5], ['L1', 2, 8], ['L2', 2, 3], ['L3', 1, 6], ['L4', 2, 8], ['L5', 1, 6]]], [['K0', 'L1'], ['K1', 'L4'], ['K2', 'L3']]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', 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']]], ['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 18', [[['K0', 80, 20], ['K1', 120, 20], ['K2', 120, 30], ['K3', 120, 20], ['K4', 80, 21], ['K5', 10, 20]], [['L0', 1, 10], ['L1', 4, 8], ['L2', 1, 5], ['L3', 1, 3], ['L4', 2, 5], ['L5', 1, 3]]], [['K0', 'L4'], ['K1', 'L0'], ['K2', 'L2'], ['K3', 'L1'], ['K4', 'L3'], ['K5', 'L5']]], ['generated mix 26', [[['K0', 120, 15], ['K1', 0, 2], ['K2', 80, 21]], [['L0', 3, 9], ['L1', 5, 6], ['L2', 1, 3], ['L3', 4, 10]]], [['K0', 'L3'], ['K1', 'L1'], ['K2', 'L2']]]], [['generated mix 22', [[['K0', 120, 20], ['K1', 80, 2], ['K2', 120, 15], ['K3', 80, 2], ['K4', 49, 20], ['K5', 0, 15]], [['L0', 2, 3], ['L1', 4, 8], ['L2', 4, 10], ['L3', 2, 10], ['L4', 1, 3]]], [['K0', 'L3'], ['K1', 'L1'], ['K2', 'L2'], ['K3', 'L4'], ['K4', 'L0'], ['K5', 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']]], ['two skus compete', [[['a', 90, 1], ['b', 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 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]]]], [['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']]], ['tie in feed order', [[['b', 90, 1], ['a', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['no eligible slot', [[['w', 5, 40]], [['a', 4, 5]]], [['w', 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']]], ['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 48', [[['K0', 50, 20], ['K1', 120, 15], ['K2', 0, 2], ['K3', 80, 30]], [['L0', 2, 10], ['L1', 3, 9], ['L2', 1, 9], ['L3', 2, 8], ['L4', 1, 10]]], [['K0', 'L2'], ['K1', 'L4'], ['K2', None], ['K3', 'L0']]]], [['generated mix 52', [[['K0', 10, 20], ['K1', 10, 15], ['K2', 0, 21], ['K3', 0, 30], ['K4', 0, 20]], [['L0', 5, 9], ['L1', 3, 5]]], [['K0', 'L1'], ['K1', None], ['K2', None], ['K3', None], ['K4', 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']]], ['two skus compete', [[['a', 90, 1], ['b', 90, 1]], [['s1', 2, 9], ['s2', 3, 5]]], [['a', 's1'], ['b', 's2']]], ['generated mix 42', [[['K0', 51, 15]], [['L0', 5, 6], ['L1', 4, 10], ['L2', 1, 8], ['L3', 3, 9], ['L4', 4, 8]]], [['K0', 'L1']]], ['generated mix 50', [[['K0', 120, 21], ['K1', 49, 21], ['K2', 49, 2], ['K3', 49, 20], ['K4', 49, 15], ['K5', 80, 20]], [['L0', 2, 3], ['L1', 5, 10], ['L2', 3, 9], ['L3', 2, 5], ['L4', 1, 5], ['L5', 3, 3], ['L6', 1, 8]]], [['K0', 'L6'], ['K1', 'L4'], ['K2', 'L3'], ['K3', 'L0'], ['K4', 'L5'], ['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']]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| generated mix 1 | [['K0', 'L2'], ['K1', 'L3'], ['K2', 'L0']] | [['K0', 'L2'], ['K1', 'L3'], ['K2', 'L0']] | Passed |
| tie in feed order | [['a', 's1'], ['b', 's2']] | [['a', 's1'], ['b', 's2']] | 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 |
| 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 / d164501b6add0ecb2fdb3b5c42d1998896edb2c21a1a8e6e281e86c58acf027e
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.560321+00:00.
Case digest / e676ca78f383cff3ff1370376d6bbb0c3860e5c1d406dded9001b25979607077