FAILURE MAP
← Case archive

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

Honeycombing: utilization rounded to nearest · case 01

Lane utilization is reported one basis point high on repeating fractions.

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

ROOT CAUSE

Utilization is rounded instead of floored.

VERIFIED REPAIR

Floor the utilization basis points with integer arithmetic.

Unsuccessful approach: Flooring to whole percent before scaling loses basis-point resolution.

Case contract

skus [[sku, pallets]] where lines may be adjustments (negative) and are netted per SKU. Each SKU with net pallets > 0 needs ceil(pallets/depth) single-SKU lanes. Honeycomb loss = lanes*depth - pallets. Utilization bp = floor((positions-loss)*10000/positions), 0 with no positions. Status OVER when lanes > available. Return [lanes, loss, util_bp, status].

Why this case matters

Deep-lane storage loses positions when lanes cannot be mixed across SKUs.

1 / The failure

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

N = 1
observations = []
def solve(skus, depth, available):
    merged = {}
    for sku, pallets in skus:
        merged[sku] = merged.get(sku, 0) + pallets
    lanes = 0
    loss = 0
    for sku, pallets in merged.items():
        if pallets <= 0:
            continue
        n = -(-pallets // depth)
        lanes += n
        loss += n * depth - pallets
    positions = lanes * depth
    util = round((positions - loss) * 10000 / positions) if positions else 0
    return [lanes, loss, util, 'OVER' if lanes > available else 'OK']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']]], [['generated mix 53', [[['C', 3], ['B', -1], ['B', 3], ['C', -1]], 3, 6], [2, 2, 6666, 'OK']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['generated mix 10', [[['D', 8], ['A', 3], ['A', 1], ['A', 3]], 2, 8], [8, 1, 9375, 'OK']], ['generated mix 18', [[['D', 4], ['C', 9], ['C', 9], ['B', 2], ['D', 1]], 3, 8], [9, 2, 9259, 'OVER']]], [['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']], ['generated mix 15', [[['A', 2], ['A', 8], ['A', -3]], 2, 3], [4, 1, 8750, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['generated mix 21', [[['B', -3]], 4, 8], [0, 0, 0, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']]], [['generated mix 77', [[['B', 9], ['B', 2], ['A', -3]], 4, 6], [3, 1, 9166, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['generated mix 32', [[['B', 1], ['D', 9], ['D', 4], ['D', 2], ['D', 8]], 4, 3], [7, 4, 8571, 'OVER']], ['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']]], [['generated mix 48', [[['A', 8], ['C', -3]], 3, 8], [3, 1, 8888, 'OK']], ['generated mix 41', [[['A', 8], ['B', -3], ['A', 9], ['C', 9], ['B', -3]], 3, 2], [9, 1, 9629, 'OVER']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 43', [[['B', -3]], 3, 6], [0, 0, 0, 'OK']], ['generated mix 52', [[['C', 4], ['C', 8], ['C', 5]], 4, 6], [5, 3, 8500, 'OK']]]]
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
floor util[1, 1, 6667, 'OK'][1, 1, 6666, 'OK']Failed
merge lines[2, 3, 6250, 'OK'][2, 3, 6250, 'OK']Passed
mixed[4, 3, 8125, 'OK'][4, 3, 8125, 'OK']Passed
adjustment nets out[1, 3, 2500, 'OK'][1, 3, 2500, 'OK']Passed
empty[0, 0, 0, 'OK'][0, 0, 0, 'OK']Passed
lanes equal available[2, 0, 10000, 'OK'][2, 0, 10000, 'OK']Passed
over[3, 3, 7500, 'OVER'][3, 3, 7500, 'OVER']Passed
generated mix 8[4, 2, 8333, 'OVER'][4, 2, 8333, 'OVER']Passed

SHA-256 / c835fca6610f3375dd22d76da04dbe6929b1bbfb9354ca26d358d5bae65ba06d

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(skus, depth, available):
    merged = {}
    for sku, pallets in skus:
        merged[sku] = merged.get(sku, 0) + pallets
    lanes = 0
    loss = 0
    for sku, pallets in merged.items():
        if pallets <= 0:
            continue
        n = -(-pallets // depth)
        lanes += n
        loss += n * depth - pallets
    positions = lanes * depth
    util = (positions - loss) * 100 // positions * 100 if positions else 0
    return [lanes, loss, util, 'OVER' if lanes > available else 'OK']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']]], [['generated mix 53', [[['C', 3], ['B', -1], ['B', 3], ['C', -1]], 3, 6], [2, 2, 6666, 'OK']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['generated mix 10', [[['D', 8], ['A', 3], ['A', 1], ['A', 3]], 2, 8], [8, 1, 9375, 'OK']], ['generated mix 18', [[['D', 4], ['C', 9], ['C', 9], ['B', 2], ['D', 1]], 3, 8], [9, 2, 9259, 'OVER']]], [['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']], ['generated mix 15', [[['A', 2], ['A', 8], ['A', -3]], 2, 3], [4, 1, 8750, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['generated mix 21', [[['B', -3]], 4, 8], [0, 0, 0, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']]], [['generated mix 77', [[['B', 9], ['B', 2], ['A', -3]], 4, 6], [3, 1, 9166, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['generated mix 32', [[['B', 1], ['D', 9], ['D', 4], ['D', 2], ['D', 8]], 4, 3], [7, 4, 8571, 'OVER']], ['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']]], [['generated mix 48', [[['A', 8], ['C', -3]], 3, 8], [3, 1, 8888, 'OK']], ['generated mix 41', [[['A', 8], ['B', -3], ['A', 9], ['C', 9], ['B', -3]], 3, 2], [9, 1, 9629, 'OVER']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 43', [[['B', -3]], 3, 6], [0, 0, 0, 'OK']], ['generated mix 52', [[['C', 4], ['C', 8], ['C', 5]], 4, 6], [5, 3, 8500, 'OK']]]]
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
floor util[1, 1, 6600, 'OK'][1, 1, 6666, 'OK']Failed
merge lines[2, 3, 6200, 'OK'][2, 3, 6250, 'OK']Failed
mixed[4, 3, 8100, 'OK'][4, 3, 8125, 'OK']Failed
adjustment nets out[1, 3, 2500, 'OK'][1, 3, 2500, 'OK']Passed
empty[0, 0, 0, 'OK'][0, 0, 0, 'OK']Passed
lanes equal available[2, 0, 10000, 'OK'][2, 0, 10000, 'OK']Passed
over[3, 3, 7500, 'OVER'][3, 3, 7500, 'OVER']Passed
generated mix 8[4, 2, 8300, 'OVER'][4, 2, 8333, 'OVER']Failed

SHA-256 / 7926415e405ff1eb9b354d2116e546857a136ffa3f1351d4179a6167b4a15bc8

3 / The verified repair

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

N = 1
observations = []
def solve(skus, depth, available):
    merged = {}
    for sku, pallets in skus:
        merged[sku] = merged.get(sku, 0) + pallets
    lanes = 0
    loss = 0
    for sku, pallets in merged.items():
        if pallets <= 0:
            continue
        n = -(-pallets // depth)
        lanes += n
        loss += n * depth - pallets
    positions = lanes * depth
    util = (positions - loss) * 10000 // positions if positions else 0
    return [lanes, loss, util, 'OVER' if lanes > available else 'OK']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']]], [['generated mix 53', [[['C', 3], ['B', -1], ['B', 3], ['C', -1]], 3, 6], [2, 2, 6666, 'OK']], ['generated mix 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['generated mix 10', [[['D', 8], ['A', 3], ['A', 1], ['A', 3]], 2, 8], [8, 1, 9375, 'OK']], ['generated mix 18', [[['D', 4], ['C', 9], ['C', 9], ['B', 2], ['D', 1]], 3, 8], [9, 2, 9259, 'OVER']]], [['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']], ['generated mix 15', [[['A', 2], ['A', 8], ['A', -3]], 2, 3], [4, 1, 8750, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['adjustment nets out', [[['A', 3], ['A', -3], ['B', 1]], 4, 1], [1, 3, 2500, 'OK']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['generated mix 21', [[['B', -3]], 4, 8], [0, 0, 0, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']]], [['generated mix 77', [[['B', 9], ['B', 2], ['A', -3]], 4, 6], [3, 1, 9166, 'OK']], ['generated mix 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, 'OVER']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['generated mix 32', [[['B', 1], ['D', 9], ['D', 4], ['D', 2], ['D', 8]], 4, 3], [7, 4, 8571, 'OVER']], ['generated mix 40', [[['B', 4], ['A', 8], ['B', 3], ['A', 1]], 3, 1], [6, 2, 8888, 'OVER']]], [['generated mix 48', [[['A', 8], ['C', -3]], 3, 8], [3, 1, 8888, 'OK']], ['generated mix 41', [[['A', 8], ['B', -3], ['A', 9], ['C', 9], ['B', -3]], 3, 2], [9, 1, 9629, 'OVER']], ['empty', [[], 4, 1], [0, 0, 0, 'OK']], ['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['generated mix 43', [[['B', -3]], 3, 6], [0, 0, 0, 'OK']], ['generated mix 52', [[['C', 4], ['C', 8], ['C', 5]], 4, 6], [5, 3, 8500, 'OK']]]]
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
floor util[1, 1, 6666, 'OK'][1, 1, 6666, 'OK']Passed
merge lines[2, 3, 6250, 'OK'][2, 3, 6250, 'OK']Passed
mixed[4, 3, 8125, 'OK'][4, 3, 8125, 'OK']Passed
adjustment nets out[1, 3, 2500, 'OK'][1, 3, 2500, 'OK']Passed
empty[0, 0, 0, 'OK'][0, 0, 0, 'OK']Passed
lanes equal available[2, 0, 10000, 'OK'][2, 0, 10000, 'OK']Passed
over[3, 3, 7500, 'OVER'][3, 3, 7500, 'OVER']Passed
generated mix 8[4, 2, 8333, 'OVER'][4, 2, 8333, 'OVER']Passed

SHA-256 / 9c7d24c63a16ac7a93596ca2422bc6bfdfabbfc929823e077f9a81a1dc450943

Verification & scope

Stipulated single-SKU lane policy. 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:12.693783+00:00.

Case digest / ffdcd9c39610d3277febe5e905c5b30c08fe6e5f24bb895cccadb7c8c9eb3b3d