FAILURE MAP
← Case archive

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

Honeycombing: extra lane on exact multiples · case 01

SKUs whose pallet count fills lanes exactly are charged an extra empty lane.

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

ROOT CAUSE

Lanes are computed as floor plus one instead of ceiling.

THE FAILURE

Lanes are computed as floor plus one instead of ceiling.

Unsuccessful approach: Plain floor division leaves partial lanes unallocated.

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 + 1
        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 = [[['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, '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 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']]], [['generated mix 9', [[['D', 8], ['D', -3], ['C', 1], ['A', 3], ['C', 8]], 3, 8], [6, 1, 9444, 'OK']], ['generated mix 2', [[['D', 2], ['D', 4], ['D', 9], ['B', 3], ['B', 2]], 2, 6], [11, 2, 9090, '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 11', [[['C', 4], ['C', 8]], 5, 2], [3, 3, 8000, 'OVER']], ['generated mix 19', [[['A', 5], ['A', 3], ['D', -3], ['C', 8], ['D', 1]], 5, 1], [4, 4, 8000, 'OVER']]], [['generated mix 24', [[['A', 1], ['D', -3], ['B', 9]], 3, 8], [4, 2, 8333, 'OK']], ['generated mix 9', [[['D', 8], ['D', -3], ['C', 1], ['A', 3], ['C', 8]], 3, 8], [6, 1, 9444, 'OK']], ['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 30', [[['D', 8]], 5, 2], [2, 2, 8000, 'OK']]], [['generated mix 41', [[['A', 8], ['B', -3], ['A', 9], ['C', 9], ['B', -3]], 3, 2], [9, 1, 9629, 'OVER']], ['generated mix 15', [[['A', 2], ['A', 8], ['A', -3]], 2, 3], [4, 1, 8750, '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 51', [[['C', 4]], 4, 1], [1, 0, 10000, 'OK']], ['generated mix 20', [[['A', 2], ['D', -1], ['C', 8], ['D', 2], ['B', 1]], 2, 2], [7, 2, 8571, '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
mixed[5, 7, 6500, 'OK'][4, 3, 8125, 'OK']Failed
merge lines[2, 3, 6250, 'OK'][2, 3, 6250, 'OK']Passed
lanes equal available[3, 4, 6666, 'OVER'][2, 0, 10000, 'OK']Failed
over[3, 3, 7500, 'OVER'][3, 3, 7500, 'OVER']Passed
floor util[1, 1, 6666, 'OK'][1, 1, 6666, 'OK']Passed
adjustment nets out[1, 3, 2500, 'OK'][1, 3, 2500, 'OK']Passed
empty[0, 0, 0, 'OK'][0, 0, 0, 'OK']Passed
generated mix 8[4, 2, 8333, 'OVER'][4, 2, 8333, 'OVER']Passed

SHA-256 / 4c3e33bb238ec568e619f9ef3809d2cd318e51e690ff19013aade53bc0759578

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) * 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 = [[['mixed', [[['A', 5], ['B', 8]], 4, 10], [4, 3, 8125, 'OK']], ['merge lines', [[['A', 3], ['A', 2]], 4, 5], [2, 3, 6250, 'OK']], ['lanes equal available', [[['A', 8]], 4, 2], [2, 0, 10000, 'OK']], ['over', [[['A', 9]], 4, 2], [3, 3, 7500, 'OVER']], ['floor util', [[['A', 2]], 3, 1], [1, 1, 6666, '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 8', [[['C', 2], ['A', 8]], 3, 2], [4, 2, 8333, 'OVER']]], [['generated mix 9', [[['D', 8], ['D', -3], ['C', 1], ['A', 3], ['C', 8]], 3, 8], [6, 1, 9444, 'OK']], ['generated mix 2', [[['D', 2], ['D', 4], ['D', 9], ['B', 3], ['B', 2]], 2, 6], [11, 2, 9090, '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 11', [[['C', 4], ['C', 8]], 5, 2], [3, 3, 8000, 'OVER']], ['generated mix 19', [[['A', 5], ['A', 3], ['D', -3], ['C', 8], ['D', 1]], 5, 1], [4, 4, 8000, 'OVER']]], [['generated mix 24', [[['A', 1], ['D', -3], ['B', 9]], 3, 8], [4, 2, 8333, 'OK']], ['generated mix 9', [[['D', 8], ['D', -3], ['C', 1], ['A', 3], ['C', 8]], 3, 8], [6, 1, 9444, 'OK']], ['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 30', [[['D', 8]], 5, 2], [2, 2, 8000, 'OK']]], [['generated mix 41', [[['A', 8], ['B', -3], ['A', 9], ['C', 9], ['B', -3]], 3, 2], [9, 1, 9629, 'OVER']], ['generated mix 15', [[['A', 2], ['A', 8], ['A', -3]], 2, 3], [4, 1, 8750, '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 51', [[['C', 4]], 4, 1], [1, 0, 10000, 'OK']], ['generated mix 20', [[['A', 2], ['D', -1], ['C', 8], ['D', 2], ['B', 1]], 2, 2], [7, 2, 8571, '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
mixed[3, -1, 10833, 'OK'][4, 3, 8125, 'OK']Failed
merge lines[1, -1, 12500, 'OK'][2, 3, 6250, 'OK']Failed
lanes equal available[2, 0, 10000, 'OK'][2, 0, 10000, 'OK']Passed
over[2, -1, 11250, 'OK'][3, 3, 7500, 'OVER']Failed
floor util[0, -2, 0, 'OK'][1, 1, 6666, 'OK']Failed
adjustment nets out[0, -1, 0, 'OK'][1, 3, 2500, 'OK']Failed
empty[0, 0, 0, 'OK'][0, 0, 0, 'OK']Passed
generated mix 8[2, -4, 16666, 'OK'][4, 2, 8333, 'OVER']Failed

SHA-256 / db84d3fc6f632513524749c597d06c24ea811a4c69b3f96f699a740a432b34f9

HELD IN THE MEMBER ARCHIVE

The verified repair and its recorded checks are member-only.

This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.

Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.

Member access is invitation-based. Sign in with your invited account to inspect the repair.

Sign in to the archive ↗

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

Case digest / 98bbcd163d92748bb01389cb2f6cc53030cf607e61d7dab047bdedf1cc6b5069