FAILURE MAP
← Case archive

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

ABC velocity: tie groups split across classes · case 01

Two SKUs with identical weekly picks land in different velocity classes when their tie group straddles a band edge.

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

ROOT CAUSE

The cumulative prior share is advanced after every SKU instead of after the whole tie group, so the second SKU of a tie sees its twin as faster.

VERIFIED REPAIR

Accumulate the picks of a tie group only after every member of the group has been classified.

Unsuccessful approach: Advancing the prior share before classifying the group counts the group against itself and demotes both twins together.

Case contract

Input [[sku, weekly_picks]]. Rank by picks descending then sku ascending. SKUs with equal picks form a tie group whose cumulative prior share is the picks of strictly faster groups. picks 0 -> D (dead stock); prior share < 80% -> A; < 95% -> B; else C. Return [[sku, class]] in input order.

Why this case matters

Velocity classes drive which SKUs are slotted into forward pick areas.

1 / The failure

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

N = 1
observations = []
def solve(skus):
    total = sum(p for _, p in skus)
    order = sorted(skus, key=lambda r: (-r[1], r[0]))
    cls = {}
    prior = 0
    i = 0
    while i < len(order):
        j = i
        while j < len(order) and order[j][1] == order[i][1]:
            j += 1
        for sku, picks in order[i:j]:
            if picks == 0:
                cls[sku] = 'D'
            elif prior * 100 < 80 * total:
                cls[sku] = 'A'
            elif prior * 100 < 95 * total:
                cls[sku] = 'B'
            else:
                cls[sku] = 'C'
            prior += picks
        i = j
    return [[sku, cls[sku]] for sku, _ in skus]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['generated mix 3', [[['S24', 20], ['S10', 2], ['S13', 20], ['S21', 40], ['S27', 3], ['S15', 60], ['S26', 5], ['S09', 40]]], [['S24', 'A'], ['S10', 'C'], ['S13', 'A'], ['S21', 'A'], ['S27', 'C'], ['S15', 'A'], ['S26', 'B'], ['S09', 'A']]], ['tie group straddles 80%', [[['x', 40], ['y', 40], ['z', 20]]], [['x', 'A'], ['y', 'A'], ['z', 'B']]], ['crossing sku is A', [[['a', 70], ['b', 20], ['c', 10]]], [['a', 'A'], ['b', 'A'], ['c', 'B']]], ['all zero', [[['a', 0], ['b', 0]]], [['a', 'D'], ['b', 'D']]], ['input order kept', [[['m', 1], ['k', 9], ['a', 90]]], [['m', 'C'], ['k', 'B'], ['a', 'A']]], ['empty', [[]], []], ['dead stock', [[['a', 5], ['b', 0]]], [['a', 'A'], ['b', 'D']]], ['generated mix 7', [[['S28', 5], ['S25', 20], ['S14', 5], ['S01', 1], ['S10', 0], ['S19', 1], ['S17', 5], ['S16', 3]]], [['S28', 'A'], ['S25', 'A'], ['S14', 'A'], ['S01', 'C'], ['S10', 'D'], ['S19', 'C'], ['S17', 'A'], ['S16', 'B']]]], [['generated mix 35', [[['S06', 2], ['S27', 8], ['S15', 2]]], [['S06', 'A'], ['S27', 'A'], ['S15', 'A']]], ['generated mix 1', [[['S23', 2], ['S10', 5]]], [['S23', 'A'], ['S10', 'A']]], ['all zero', [[['a', 0], ['b', 0]]], [['a', 'D'], ['b', 'D']]], ['input order kept', [[['m', 1], ['k', 9], ['a', 90]]], [['m', 'C'], ['k', 'B'], ['a', 'A']]], ['empty', [[]], []], ['tie group straddles 80%', [[['x', 40], ['y', 40], ['z', 20]]], [['x', 'A'], ['y', 'A'], ['z', 'B']]], ['generated mix 9', [[['S08', 5], ['S03', 3], ['S12', 5], ['S18', 2], ['S23', 5]]], [['S08', 'A'], ['S03', 'A'], ['S12', 'A'], ['S18', 'B'], ['S23', 'A']]], ['generated mix 17', [[['S01', 10], ['S12', 10], ['S04', 8]]], [['S01', 'A'], ['S12', 'A'], ['S04', 'A']]]], [['generated mix 78', [[['S13', 20], ['S12', 40], ['S21', 10], ['S08', 3], ['S26', 1], ['S01', 10]]], [['S13', 'A'], ['S12', 'A'], ['S21', 'A'], ['S08', 'C'], ['S26', 'C'], ['S01', 'A']]], ['generated mix 6', [[['S21', 10], ['S16', 0], ['S28', 5], ['S06', 5], ['S04', 0], ['S08', 3]]], [['S21', 'A'], ['S16', 'D'], ['S28', 'A'], ['S06', 'A'], ['S04', 'D'], ['S08', 'B']]], ['single sku', [[['solo', 3]]], [['solo', 'A']]], ['crossing sku is A', [[['a', 70], ['b', 20], ['c', 10]]], [['a', 'A'], ['b', 'A'], ['c', 'B']]], ['dead stock', [[['a', 5], ['b', 0]]], [['a', 'A'], ['b', 'D']]], ['exact 95 boundary', [[['p', 80], ['q', 15], ['r', 5]]], [['p', 'A'], ['q', 'B'], ['r', 'C']]], ['generated mix 20', [[['S23', 2], ['S15', 60], ['S10', 5]]], [['S23', 'C'], ['S15', 'A'], ['S10', 'B']]], ['generated mix 28', [[['S18', 20], ['S07', 8], ['S05', 20], ['S14', 60], ['S08', 5]]], [['S18', 'A'], ['S07', 'B'], ['S05', 'A'], ['S14', 'A'], ['S08', 'C']]]], [['generated mix 34', [[['S03', 60], ['S12', 5], ['S06', 60], ['S08', 0], ['S01', 5], ['S09', 5], ['S11', 8]]], [['S03', 'A'], ['S12', 'B'], ['S06', 'A'], ['S08', 'D'], ['S01', 'B'], ['S09', 'B'], ['S11', 'B']]], ['generated mix 11', [[['S21', 20], ['S23', 20], ['S06', 2], ['S08', 40], ['S24', 5], ['S05', 20], ['S16', 10]]], [['S21', 'A'], ['S23', 'A'], ['S06', 'C'], ['S08', 'A'], ['S24', 'B'], ['S05', 'A'], ['S16', 'B']]], ['tie group straddles 80%', [[['x', 40], ['y', 40], ['z', 20]]], [['x', 'A'], ['y', 'A'], ['z', 'B']]], ['all zero', [[['a', 0], ['b', 0]]], [['a', 'D'], ['b', 'D']]], ['input order kept', [[['m', 1], ['k', 9], ['a', 90]]], [['m', 'C'], ['k', 'B'], ['a', 'A']]], ['empty', [[]], []], ['generated mix 31', [[['S14', 20], ['S12', 8], ['S16', 3], ['S01', 0], ['S09', 20]]], [['S14', 'A'], ['S12', 'A'], ['S16', 'B'], ['S01', 'D'], ['S09', 'A']]], ['generated mix 40', [[['S28', 20], ['S12', 0], ['S02', 2], ['S21', 10], ['S16', 40], ['S17', 60], ['S11', 5], ['S13', 2]]], [['S28', 'A'], ['S12', 'D'], ['S02', 'C'], ['S21', 'B'], ['S16', 'A'], ['S17', 'A'], ['S11', 'B'], ['S13', 'C']]]], [['generated mix 75', [[['S18', 60], ['S11', 8], ['S06', 5], ['S25', 10], ['S09', 8]]], [['S18', 'A'], ['S11', 'A'], ['S06', 'B'], ['S25', 'A'], ['S09', 'A']]], ['generated mix 16', [[['S23', 60], ['S12', 0], ['S11', 8], ['S14', 8], ['S06', 20], ['S04', 40], ['S08', 5], ['S22', 5]]], [['S23', 'A'], ['S12', 'D'], ['S11', 'B'], ['S14', 'B'], ['S06', 'A'], ['S04', 'A'], ['S08', 'B'], ['S22', 'B']]], ['exact 95 boundary', [[['p', 80], ['q', 15], ['r', 5]]], [['p', 'A'], ['q', 'B'], ['r', 'C']]], ['single sku', [[['solo', 3]]], [['solo', 'A']]], ['crossing sku is A', [[['a', 70], ['b', 20], ['c', 10]]], [['a', 'A'], ['b', 'A'], ['c', 'B']]], ['dead stock', [[['a', 5], ['b', 0]]], [['a', 'A'], ['b', 'D']]], ['generated mix 42', [[['S15', 1], ['S08', 5], ['S29', 2]]], [['S15', 'B'], ['S08', 'A'], ['S29', 'A']]], ['generated mix 50', [[['S28', 0], ['S11', 1], ['S26', 40], ['S06', 60], ['S09', 0], ['S12', 10], ['S08', 10], ['S21', 1]]], [['S28', 'D'], ['S11', 'C'], ['S26', 'A'], ['S06', 'A'], ['S09', 'D'], ['S12', 'B'], ['S08', 'B'], ['S21', 'C']]]]]
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 3[['S24', 'B'], ['S10', 'C'], ['S13', 'A'], ['S21', 'A'], ['S27', 'C'], ['S15', 'A'], ['S26', 'B'], ['S09', 'A']][['S24', 'A'], ['S10', 'C'], ['S13', 'A'], ['S21', 'A'], ['S27', 'C'], ['S15', 'A'], ['S26', 'B'], ['S09', 'A']]Failed
tie group straddles 80%[['x', 'A'], ['y', 'A'], ['z', 'B']][['x', 'A'], ['y', 'A'], ['z', 'B']]Passed
crossing sku is A[['a', 'A'], ['b', 'A'], ['c', 'B']][['a', 'A'], ['b', 'A'], ['c', 'B']]Passed
all zero[['a', 'D'], ['b', 'D']][['a', 'D'], ['b', 'D']]Passed
input order kept[['m', 'C'], ['k', 'B'], ['a', 'A']][['m', 'C'], ['k', 'B'], ['a', 'A']]Passed
empty[][]Passed
dead stock[['a', 'A'], ['b', 'D']][['a', 'A'], ['b', 'D']]Passed
generated mix 7[['S28', 'A'], ['S25', 'A'], ['S14', 'A'], ['S01', 'C'], ['S10', 'D'], ['S19', 'C'], ['S17', 'A'], ['S16', 'B']][['S28', 'A'], ['S25', 'A'], ['S14', 'A'], ['S01', 'C'], ['S10', 'D'], ['S19', 'C'], ['S17', 'A'], ['S16', 'B']]Passed

SHA-256 / 5d4f13b2010368c26dd8c1c8320ec0435950ef0315577db85a7ac90093e888f9

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(skus):
    total = sum(p for _, p in skus)
    order = sorted(skus, key=lambda r: (-r[1], r[0]))
    cls = {}
    prior = 0
    i = 0
    while i < len(order):
        j = i
        while j < len(order) and order[j][1] == order[i][1]:
            j += 1
        prior += order[i][1] * (j - i)
        for sku, picks in order[i:j]:
            if picks == 0:
                cls[sku] = 'D'
            elif prior * 100 < 80 * total:
                cls[sku] = 'A'
            elif prior * 100 < 95 * total:
                cls[sku] = 'B'
            else:
                cls[sku] = 'C'
        prior += order[i][1] * (j - i)
        i = j
    return [[sku, cls[sku]] for sku, _ in skus]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['generated mix 3', [[['S24', 20], ['S10', 2], ['S13', 20], ['S21', 40], ['S27', 3], ['S15', 60], ['S26', 5], ['S09', 40]]], [['S24', 'A'], ['S10', 'C'], ['S13', 'A'], ['S21', 'A'], ['S27', 'C'], ['S15', 'A'], ['S26', 'B'], ['S09', 'A']]], ['tie group straddles 80%', [[['x', 40], ['y', 40], ['z', 20]]], [['x', 'A'], ['y', 'A'], ['z', 'B']]], ['crossing sku is A', [[['a', 70], ['b', 20], ['c', 10]]], [['a', 'A'], ['b', 'A'], ['c', 'B']]], ['all zero', [[['a', 0], ['b', 0]]], [['a', 'D'], ['b', 'D']]], ['input order kept', [[['m', 1], ['k', 9], ['a', 90]]], [['m', 'C'], ['k', 'B'], ['a', 'A']]], ['empty', [[]], []], ['dead stock', [[['a', 5], ['b', 0]]], [['a', 'A'], ['b', 'D']]], ['generated mix 7', [[['S28', 5], ['S25', 20], ['S14', 5], ['S01', 1], ['S10', 0], ['S19', 1], ['S17', 5], ['S16', 3]]], [['S28', 'A'], ['S25', 'A'], ['S14', 'A'], ['S01', 'C'], ['S10', 'D'], ['S19', 'C'], ['S17', 'A'], ['S16', 'B']]]], [['generated mix 35', [[['S06', 2], ['S27', 8], ['S15', 2]]], [['S06', 'A'], ['S27', 'A'], ['S15', 'A']]], ['generated mix 1', [[['S23', 2], ['S10', 5]]], [['S23', 'A'], ['S10', 'A']]], ['all zero', [[['a', 0], ['b', 0]]], [['a', 'D'], ['b', 'D']]], ['input order kept', [[['m', 1], ['k', 9], ['a', 90]]], [['m', 'C'], ['k', 'B'], ['a', 'A']]], ['empty', [[]], []], ['tie group straddles 80%', [[['x', 40], ['y', 40], ['z', 20]]], [['x', 'A'], ['y', 'A'], ['z', 'B']]], ['generated mix 9', [[['S08', 5], ['S03', 3], ['S12', 5], ['S18', 2], ['S23', 5]]], [['S08', 'A'], ['S03', 'A'], ['S12', 'A'], ['S18', 'B'], ['S23', 'A']]], ['generated mix 17', [[['S01', 10], ['S12', 10], ['S04', 8]]], [['S01', 'A'], ['S12', 'A'], ['S04', 'A']]]], [['generated mix 78', [[['S13', 20], ['S12', 40], ['S21', 10], ['S08', 3], ['S26', 1], ['S01', 10]]], [['S13', 'A'], ['S12', 'A'], ['S21', 'A'], ['S08', 'C'], ['S26', 'C'], ['S01', 'A']]], ['generated mix 6', [[['S21', 10], ['S16', 0], ['S28', 5], ['S06', 5], ['S04', 0], ['S08', 3]]], [['S21', 'A'], ['S16', 'D'], ['S28', 'A'], ['S06', 'A'], ['S04', 'D'], ['S08', 'B']]], ['single sku', [[['solo', 3]]], [['solo', 'A']]], ['crossing sku is A', [[['a', 70], ['b', 20], ['c', 10]]], [['a', 'A'], ['b', 'A'], ['c', 'B']]], ['dead stock', [[['a', 5], ['b', 0]]], [['a', 'A'], ['b', 'D']]], ['exact 95 boundary', [[['p', 80], ['q', 15], ['r', 5]]], [['p', 'A'], ['q', 'B'], ['r', 'C']]], ['generated mix 20', [[['S23', 2], ['S15', 60], ['S10', 5]]], [['S23', 'C'], ['S15', 'A'], ['S10', 'B']]], ['generated mix 28', [[['S18', 20], ['S07', 8], ['S05', 20], ['S14', 60], ['S08', 5]]], [['S18', 'A'], ['S07', 'B'], ['S05', 'A'], ['S14', 'A'], ['S08', 'C']]]], [['generated mix 34', [[['S03', 60], ['S12', 5], ['S06', 60], ['S08', 0], ['S01', 5], ['S09', 5], ['S11', 8]]], [['S03', 'A'], ['S12', 'B'], ['S06', 'A'], ['S08', 'D'], ['S01', 'B'], ['S09', 'B'], ['S11', 'B']]], ['generated mix 11', [[['S21', 20], ['S23', 20], ['S06', 2], ['S08', 40], ['S24', 5], ['S05', 20], ['S16', 10]]], [['S21', 'A'], ['S23', 'A'], ['S06', 'C'], ['S08', 'A'], ['S24', 'B'], ['S05', 'A'], ['S16', 'B']]], ['tie group straddles 80%', [[['x', 40], ['y', 40], ['z', 20]]], [['x', 'A'], ['y', 'A'], ['z', 'B']]], ['all zero', [[['a', 0], ['b', 0]]], [['a', 'D'], ['b', 'D']]], ['input order kept', [[['m', 1], ['k', 9], ['a', 90]]], [['m', 'C'], ['k', 'B'], ['a', 'A']]], ['empty', [[]], []], ['generated mix 31', [[['S14', 20], ['S12', 8], ['S16', 3], ['S01', 0], ['S09', 20]]], [['S14', 'A'], ['S12', 'A'], ['S16', 'B'], ['S01', 'D'], ['S09', 'A']]], ['generated mix 40', [[['S28', 20], ['S12', 0], ['S02', 2], ['S21', 10], ['S16', 40], ['S17', 60], ['S11', 5], ['S13', 2]]], [['S28', 'A'], ['S12', 'D'], ['S02', 'C'], ['S21', 'B'], ['S16', 'A'], ['S17', 'A'], ['S11', 'B'], ['S13', 'C']]]], [['generated mix 75', [[['S18', 60], ['S11', 8], ['S06', 5], ['S25', 10], ['S09', 8]]], [['S18', 'A'], ['S11', 'A'], ['S06', 'B'], ['S25', 'A'], ['S09', 'A']]], ['generated mix 16', [[['S23', 60], ['S12', 0], ['S11', 8], ['S14', 8], ['S06', 20], ['S04', 40], ['S08', 5], ['S22', 5]]], [['S23', 'A'], ['S12', 'D'], ['S11', 'B'], ['S14', 'B'], ['S06', 'A'], ['S04', 'A'], ['S08', 'B'], ['S22', 'B']]], ['exact 95 boundary', [[['p', 80], ['q', 15], ['r', 5]]], [['p', 'A'], ['q', 'B'], ['r', 'C']]], ['single sku', [[['solo', 3]]], [['solo', 'A']]], ['crossing sku is A', [[['a', 70], ['b', 20], ['c', 10]]], [['a', 'A'], ['b', 'A'], ['c', 'B']]], ['dead stock', [[['a', 5], ['b', 0]]], [['a', 'A'], ['b', 'D']]], ['generated mix 42', [[['S15', 1], ['S08', 5], ['S29', 2]]], [['S15', 'B'], ['S08', 'A'], ['S29', 'A']]], ['generated mix 50', [[['S28', 0], ['S11', 1], ['S26', 40], ['S06', 60], ['S09', 0], ['S12', 10], ['S08', 10], ['S21', 1]]], [['S28', 'D'], ['S11', 'C'], ['S26', 'A'], ['S06', 'A'], ['S09', 'D'], ['S12', 'B'], ['S08', 'B'], ['S21', 'C']]]]]
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 3[['S24', 'C'], ['S10', 'C'], ['S13', 'C'], ['S21', 'C'], ['S27', 'C'], ['S15', 'A'], ['S26', 'C'], ['S09', 'C']][['S24', 'A'], ['S10', 'C'], ['S13', 'A'], ['S21', 'A'], ['S27', 'C'], ['S15', 'A'], ['S26', 'B'], ['S09', 'A']]Failed
tie group straddles 80%[['x', 'B'], ['y', 'B'], ['z', 'C']][['x', 'A'], ['y', 'A'], ['z', 'B']]Failed
crossing sku is A[['a', 'A'], ['b', 'C'], ['c', 'C']][['a', 'A'], ['b', 'A'], ['c', 'B']]Failed
all zero[['a', 'D'], ['b', 'D']][['a', 'D'], ['b', 'D']]Passed
input order kept[['m', 'C'], ['k', 'C'], ['a', 'B']][['m', 'C'], ['k', 'B'], ['a', 'A']]Failed
empty[][]Passed
dead stock[['a', 'C'], ['b', 'D']][['a', 'A'], ['b', 'D']]Failed
generated mix 7[['S28', 'C'], ['S25', 'A'], ['S14', 'C'], ['S01', 'C'], ['S10', 'D'], ['S19', 'C'], ['S17', 'C'], ['S16', 'C']][['S28', 'A'], ['S25', 'A'], ['S14', 'A'], ['S01', 'C'], ['S10', 'D'], ['S19', 'C'], ['S17', 'A'], ['S16', 'B']]Failed

SHA-256 / 9c17acb5b4f4cf05bf3d6a1ce380289919c853c7953b9c0f2027840513c83bca

3 / The verified repair

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

N = 1
observations = []
def solve(skus):
    total = sum(p for _, p in skus)
    order = sorted(skus, key=lambda r: (-r[1], r[0]))
    cls = {}
    prior = 0
    i = 0
    while i < len(order):
        j = i
        while j < len(order) and order[j][1] == order[i][1]:
            j += 1
        for sku, picks in order[i:j]:
            if picks == 0:
                cls[sku] = 'D'
            elif prior * 100 < 80 * total:
                cls[sku] = 'A'
            elif prior * 100 < 95 * total:
                cls[sku] = 'B'
            else:
                cls[sku] = 'C'
        prior += order[i][1] * (j - i)
        i = j
    return [[sku, cls[sku]] for sku, _ in skus]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['generated mix 3', [[['S24', 20], ['S10', 2], ['S13', 20], ['S21', 40], ['S27', 3], ['S15', 60], ['S26', 5], ['S09', 40]]], [['S24', 'A'], ['S10', 'C'], ['S13', 'A'], ['S21', 'A'], ['S27', 'C'], ['S15', 'A'], ['S26', 'B'], ['S09', 'A']]], ['tie group straddles 80%', [[['x', 40], ['y', 40], ['z', 20]]], [['x', 'A'], ['y', 'A'], ['z', 'B']]], ['crossing sku is A', [[['a', 70], ['b', 20], ['c', 10]]], [['a', 'A'], ['b', 'A'], ['c', 'B']]], ['all zero', [[['a', 0], ['b', 0]]], [['a', 'D'], ['b', 'D']]], ['input order kept', [[['m', 1], ['k', 9], ['a', 90]]], [['m', 'C'], ['k', 'B'], ['a', 'A']]], ['empty', [[]], []], ['dead stock', [[['a', 5], ['b', 0]]], [['a', 'A'], ['b', 'D']]], ['generated mix 7', [[['S28', 5], ['S25', 20], ['S14', 5], ['S01', 1], ['S10', 0], ['S19', 1], ['S17', 5], ['S16', 3]]], [['S28', 'A'], ['S25', 'A'], ['S14', 'A'], ['S01', 'C'], ['S10', 'D'], ['S19', 'C'], ['S17', 'A'], ['S16', 'B']]]], [['generated mix 35', [[['S06', 2], ['S27', 8], ['S15', 2]]], [['S06', 'A'], ['S27', 'A'], ['S15', 'A']]], ['generated mix 1', [[['S23', 2], ['S10', 5]]], [['S23', 'A'], ['S10', 'A']]], ['all zero', [[['a', 0], ['b', 0]]], [['a', 'D'], ['b', 'D']]], ['input order kept', [[['m', 1], ['k', 9], ['a', 90]]], [['m', 'C'], ['k', 'B'], ['a', 'A']]], ['empty', [[]], []], ['tie group straddles 80%', [[['x', 40], ['y', 40], ['z', 20]]], [['x', 'A'], ['y', 'A'], ['z', 'B']]], ['generated mix 9', [[['S08', 5], ['S03', 3], ['S12', 5], ['S18', 2], ['S23', 5]]], [['S08', 'A'], ['S03', 'A'], ['S12', 'A'], ['S18', 'B'], ['S23', 'A']]], ['generated mix 17', [[['S01', 10], ['S12', 10], ['S04', 8]]], [['S01', 'A'], ['S12', 'A'], ['S04', 'A']]]], [['generated mix 78', [[['S13', 20], ['S12', 40], ['S21', 10], ['S08', 3], ['S26', 1], ['S01', 10]]], [['S13', 'A'], ['S12', 'A'], ['S21', 'A'], ['S08', 'C'], ['S26', 'C'], ['S01', 'A']]], ['generated mix 6', [[['S21', 10], ['S16', 0], ['S28', 5], ['S06', 5], ['S04', 0], ['S08', 3]]], [['S21', 'A'], ['S16', 'D'], ['S28', 'A'], ['S06', 'A'], ['S04', 'D'], ['S08', 'B']]], ['single sku', [[['solo', 3]]], [['solo', 'A']]], ['crossing sku is A', [[['a', 70], ['b', 20], ['c', 10]]], [['a', 'A'], ['b', 'A'], ['c', 'B']]], ['dead stock', [[['a', 5], ['b', 0]]], [['a', 'A'], ['b', 'D']]], ['exact 95 boundary', [[['p', 80], ['q', 15], ['r', 5]]], [['p', 'A'], ['q', 'B'], ['r', 'C']]], ['generated mix 20', [[['S23', 2], ['S15', 60], ['S10', 5]]], [['S23', 'C'], ['S15', 'A'], ['S10', 'B']]], ['generated mix 28', [[['S18', 20], ['S07', 8], ['S05', 20], ['S14', 60], ['S08', 5]]], [['S18', 'A'], ['S07', 'B'], ['S05', 'A'], ['S14', 'A'], ['S08', 'C']]]], [['generated mix 34', [[['S03', 60], ['S12', 5], ['S06', 60], ['S08', 0], ['S01', 5], ['S09', 5], ['S11', 8]]], [['S03', 'A'], ['S12', 'B'], ['S06', 'A'], ['S08', 'D'], ['S01', 'B'], ['S09', 'B'], ['S11', 'B']]], ['generated mix 11', [[['S21', 20], ['S23', 20], ['S06', 2], ['S08', 40], ['S24', 5], ['S05', 20], ['S16', 10]]], [['S21', 'A'], ['S23', 'A'], ['S06', 'C'], ['S08', 'A'], ['S24', 'B'], ['S05', 'A'], ['S16', 'B']]], ['tie group straddles 80%', [[['x', 40], ['y', 40], ['z', 20]]], [['x', 'A'], ['y', 'A'], ['z', 'B']]], ['all zero', [[['a', 0], ['b', 0]]], [['a', 'D'], ['b', 'D']]], ['input order kept', [[['m', 1], ['k', 9], ['a', 90]]], [['m', 'C'], ['k', 'B'], ['a', 'A']]], ['empty', [[]], []], ['generated mix 31', [[['S14', 20], ['S12', 8], ['S16', 3], ['S01', 0], ['S09', 20]]], [['S14', 'A'], ['S12', 'A'], ['S16', 'B'], ['S01', 'D'], ['S09', 'A']]], ['generated mix 40', [[['S28', 20], ['S12', 0], ['S02', 2], ['S21', 10], ['S16', 40], ['S17', 60], ['S11', 5], ['S13', 2]]], [['S28', 'A'], ['S12', 'D'], ['S02', 'C'], ['S21', 'B'], ['S16', 'A'], ['S17', 'A'], ['S11', 'B'], ['S13', 'C']]]], [['generated mix 75', [[['S18', 60], ['S11', 8], ['S06', 5], ['S25', 10], ['S09', 8]]], [['S18', 'A'], ['S11', 'A'], ['S06', 'B'], ['S25', 'A'], ['S09', 'A']]], ['generated mix 16', [[['S23', 60], ['S12', 0], ['S11', 8], ['S14', 8], ['S06', 20], ['S04', 40], ['S08', 5], ['S22', 5]]], [['S23', 'A'], ['S12', 'D'], ['S11', 'B'], ['S14', 'B'], ['S06', 'A'], ['S04', 'A'], ['S08', 'B'], ['S22', 'B']]], ['exact 95 boundary', [[['p', 80], ['q', 15], ['r', 5]]], [['p', 'A'], ['q', 'B'], ['r', 'C']]], ['single sku', [[['solo', 3]]], [['solo', 'A']]], ['crossing sku is A', [[['a', 70], ['b', 20], ['c', 10]]], [['a', 'A'], ['b', 'A'], ['c', 'B']]], ['dead stock', [[['a', 5], ['b', 0]]], [['a', 'A'], ['b', 'D']]], ['generated mix 42', [[['S15', 1], ['S08', 5], ['S29', 2]]], [['S15', 'B'], ['S08', 'A'], ['S29', 'A']]], ['generated mix 50', [[['S28', 0], ['S11', 1], ['S26', 40], ['S06', 60], ['S09', 0], ['S12', 10], ['S08', 10], ['S21', 1]]], [['S28', 'D'], ['S11', 'C'], ['S26', 'A'], ['S06', 'A'], ['S09', 'D'], ['S12', 'B'], ['S08', 'B'], ['S21', 'C']]]]]
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 3[['S24', 'A'], ['S10', 'C'], ['S13', 'A'], ['S21', 'A'], ['S27', 'C'], ['S15', 'A'], ['S26', 'B'], ['S09', 'A']][['S24', 'A'], ['S10', 'C'], ['S13', 'A'], ['S21', 'A'], ['S27', 'C'], ['S15', 'A'], ['S26', 'B'], ['S09', 'A']]Passed
tie group straddles 80%[['x', 'A'], ['y', 'A'], ['z', 'B']][['x', 'A'], ['y', 'A'], ['z', 'B']]Passed
crossing sku is A[['a', 'A'], ['b', 'A'], ['c', 'B']][['a', 'A'], ['b', 'A'], ['c', 'B']]Passed
all zero[['a', 'D'], ['b', 'D']][['a', 'D'], ['b', 'D']]Passed
input order kept[['m', 'C'], ['k', 'B'], ['a', 'A']][['m', 'C'], ['k', 'B'], ['a', 'A']]Passed
empty[][]Passed
dead stock[['a', 'A'], ['b', 'D']][['a', 'A'], ['b', 'D']]Passed
generated mix 7[['S28', 'A'], ['S25', 'A'], ['S14', 'A'], ['S01', 'C'], ['S10', 'D'], ['S19', 'C'], ['S17', 'A'], ['S16', 'B']][['S28', 'A'], ['S25', 'A'], ['S14', 'A'], ['S01', 'C'], ['S10', 'D'], ['S19', 'C'], ['S17', 'A'], ['S16', 'B']]Passed

SHA-256 / 5375a4f2b4559a8503d4c93a3202683366eebdb9e5e9354b301baac7c20c201c

Verification & scope

Stipulated toy ABC policy with fixed 80/95 bands; not a vendor WMS rule set. 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.156027+00:00.

Case digest / 4face74164e5dc0bc5597e3623853d716dad523abf17dcbf9713a4de9de7e374