FAILURE MAP
← Case archive

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

Slot fit: first orientation taken · case 01

Slot capacity is understated when a rotated orientation packs more units.

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

ROOT CAUSE

The orientation loop stops after evaluating the first orientation.

THE FAILURE

The orientation loop stops after evaluating the first orientation.

Unsuccessful approach: Keeping the maximum but using uncapped layers overstates capacity when a stack limit applies.

Case contract

slot [width, depth, height], unit [w, d, h]. Upright units may only rotate in the horizontal plane; others may take any of the 6 axis orientations. Vertical layers = height // unit height, capped at max_stack when max_stack > 0 (0 = unlimited). Units = best over orientations of (W//a)*(D//b)*layers. Utilization in basis points = floor(units*unit volume*10000/slot volume).

Why this case matters

Slot sizing converts product cube into units per location for slotting and replenishment.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import itertools
N = 1
observations = []
def solve(slot, unit, max_stack, upright):
    SW, SD, SH = slot
    uw, ud, uh = unit
    if upright:
        orients = [(uw, ud, uh), (ud, uw, uh)]
    else:
        orients = sorted(set(itertools.permutations(unit)))
    best = 0
    for a, b, c in orients:
        layers = SH // c
        if max_stack:
            layers = min(layers, max_stack)
        best = (SW // a) * (SD // b) * layers
        break
    bp = best * uw * ud * uh * 10000 // (SW * SD * SH)
    return [best, bp]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['laydown helps', [[40, 40, 12], [10, 10, 20], 0, False], [8, 8333]], ['generated mix 1', [[40, 40, 30], [5, 15, 7], 1, False], [40, 4375]], ['upright plane rotation', [[48, 40, 30], [12, 10, 10], 0, True], [48, 10000]], ['upright blocked', [[40, 40, 12], [10, 10, 20], 0, True], [0, 0]], ['fraction bp', [[100, 30, 45], [25, 15, 7], 0, True], [48, 9333]], ['stack cap', [[48, 40, 30], [12, 10, 10], 2, True], [32, 6666]], ['unlimited zero', [[20, 20, 40], [10, 10, 10], 0, True], [16, 10000]], ['generated mix 9', [[48, 30, 60], [25, 10, 4], 3, False], [72, 8333]]], [['generated mix 18', [[40, 48, 20], [25, 20, 10], 3, False], [4, 5208]], ['generated mix 21', [[40, 48, 45], [10, 10, 10], 2, True], [32, 3703]], ['upright blocked', [[40, 40, 12], [10, 10, 20], 0, True], [0, 0]], ['fraction bp', [[100, 30, 45], [25, 15, 7], 0, True], [48, 9333]], ['stack cap', [[48, 40, 30], [12, 10, 10], 2, True], [32, 6666]], ['generated mix 9', [[48, 30, 60], [25, 10, 4], 3, False], [72, 8333]], ['generated mix 17', [[100, 60, 45], [10, 6, 35], 2, False], [100, 7777]], ['generated mix 27', [[60, 60, 45], [8, 20, 7], 3, False], [112, 7743]]], [['generated mix 36', [[48, 30, 20], [8, 15, 7], 2, False], [24, 7000]], ['generated mix 34', [[40, 60, 45], [8, 20, 12], 2, True], [30, 5333]], ['upright plane rotation', [[48, 40, 30], [12, 10, 10], 0, True], [48, 10000]], ['laydown helps', [[40, 40, 12], [10, 10, 20], 0, False], [8, 8333]], ['unlimited zero', [[20, 20, 40], [10, 10, 10], 0, True], [16, 10000]], ['generated mix 20', [[48, 60, 60], [25, 10, 4], 3, True], [24, 1388]], ['generated mix 28', [[48, 40, 20], [25, 15, 35], 3, True], [0, 0]], ['generated mix 38', [[60, 48, 60], [12, 20, 4], 3, False], [180, 10000]]], [['generated mix 50', [[100, 48, 60], [25, 15, 35], 3, False], [12, 5468]], ['upright blocked', [[40, 40, 12], [10, 10, 20], 0, True], [0, 0]], ['fraction bp', [[100, 30, 45], [25, 15, 7], 0, True], [48, 9333]], ['stack cap', [[48, 40, 30], [12, 10, 10], 2, True], [32, 6666]], ['generated mix 31', [[48, 48, 30], [12, 6, 35], 1, True], [0, 0]], ['generated mix 39', [[60, 30, 20], [12, 6, 7], 3, True], [50, 7000]], ['generated mix 47', [[60, 60, 45], [10, 15, 4], 2, False], [180, 6666]], ['generated mix 56', [[48, 30, 45], [12, 15, 10], 3, True], [24, 6666]]], [['generated mix 63', [[100, 40, 45], [10, 15, 7], 0, True], [144, 8400]], ['generated mix 64', [[100, 40, 45], [25, 6, 4], 5, False], [200, 6666]], ['upright plane rotation', [[48, 40, 30], [12, 10, 10], 0, True], [48, 10000]], ['laydown helps', [[40, 40, 12], [10, 10, 20], 0, False], [8, 8333]], ['unlimited zero', [[20, 20, 40], [10, 10, 10], 0, True], [16, 10000]], ['generated mix 42', [[60, 30, 30], [10, 15, 35], 1, False], [3, 2916]], ['generated mix 50', [[100, 48, 60], [25, 15, 35], 3, False], [12, 5468]], ['generated mix 58', [[40, 48, 60], [10, 20, 7], 3, False], [72, 8750]]]]
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
laydown helps[0, 0][8, 8333]Failed
generated mix 1[40, 4375][40, 4375]Passed
upright plane rotation[48, 10000][48, 10000]Passed
upright blocked[0, 0][0, 0]Passed
fraction bp[48, 9333][48, 9333]Passed
stack cap[32, 6666][32, 6666]Passed
unlimited zero[16, 10000][16, 10000]Passed
generated mix 9[72, 8333][72, 8333]Passed

SHA-256 / 477ed06abcae081f1a2399923127de906221e24dfbb1ecf19def0589ae8a4532

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import itertools
N = 1
observations = []
def solve(slot, unit, max_stack, upright):
    SW, SD, SH = slot
    uw, ud, uh = unit
    if upright:
        orients = [(uw, ud, uh), (ud, uw, uh)]
    else:
        orients = sorted(set(itertools.permutations(unit)))
    best = 0
    for a, b, c in orients:
        layers = SH // c
        if max_stack:
            layers = min(layers, max_stack)
        best = max(best, (SW // a) * (SD // b) * (SH // c))
    bp = best * uw * ud * uh * 10000 // (SW * SD * SH)
    return [best, bp]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['laydown helps', [[40, 40, 12], [10, 10, 20], 0, False], [8, 8333]], ['generated mix 1', [[40, 40, 30], [5, 15, 7], 1, False], [40, 4375]], ['upright plane rotation', [[48, 40, 30], [12, 10, 10], 0, True], [48, 10000]], ['upright blocked', [[40, 40, 12], [10, 10, 20], 0, True], [0, 0]], ['fraction bp', [[100, 30, 45], [25, 15, 7], 0, True], [48, 9333]], ['stack cap', [[48, 40, 30], [12, 10, 10], 2, True], [32, 6666]], ['unlimited zero', [[20, 20, 40], [10, 10, 10], 0, True], [16, 10000]], ['generated mix 9', [[48, 30, 60], [25, 10, 4], 3, False], [72, 8333]]], [['generated mix 18', [[40, 48, 20], [25, 20, 10], 3, False], [4, 5208]], ['generated mix 21', [[40, 48, 45], [10, 10, 10], 2, True], [32, 3703]], ['upright blocked', [[40, 40, 12], [10, 10, 20], 0, True], [0, 0]], ['fraction bp', [[100, 30, 45], [25, 15, 7], 0, True], [48, 9333]], ['stack cap', [[48, 40, 30], [12, 10, 10], 2, True], [32, 6666]], ['generated mix 9', [[48, 30, 60], [25, 10, 4], 3, False], [72, 8333]], ['generated mix 17', [[100, 60, 45], [10, 6, 35], 2, False], [100, 7777]], ['generated mix 27', [[60, 60, 45], [8, 20, 7], 3, False], [112, 7743]]], [['generated mix 36', [[48, 30, 20], [8, 15, 7], 2, False], [24, 7000]], ['generated mix 34', [[40, 60, 45], [8, 20, 12], 2, True], [30, 5333]], ['upright plane rotation', [[48, 40, 30], [12, 10, 10], 0, True], [48, 10000]], ['laydown helps', [[40, 40, 12], [10, 10, 20], 0, False], [8, 8333]], ['unlimited zero', [[20, 20, 40], [10, 10, 10], 0, True], [16, 10000]], ['generated mix 20', [[48, 60, 60], [25, 10, 4], 3, True], [24, 1388]], ['generated mix 28', [[48, 40, 20], [25, 15, 35], 3, True], [0, 0]], ['generated mix 38', [[60, 48, 60], [12, 20, 4], 3, False], [180, 10000]]], [['generated mix 50', [[100, 48, 60], [25, 15, 35], 3, False], [12, 5468]], ['upright blocked', [[40, 40, 12], [10, 10, 20], 0, True], [0, 0]], ['fraction bp', [[100, 30, 45], [25, 15, 7], 0, True], [48, 9333]], ['stack cap', [[48, 40, 30], [12, 10, 10], 2, True], [32, 6666]], ['generated mix 31', [[48, 48, 30], [12, 6, 35], 1, True], [0, 0]], ['generated mix 39', [[60, 30, 20], [12, 6, 7], 3, True], [50, 7000]], ['generated mix 47', [[60, 60, 45], [10, 15, 4], 2, False], [180, 6666]], ['generated mix 56', [[48, 30, 45], [12, 15, 10], 3, True], [24, 6666]]], [['generated mix 63', [[100, 40, 45], [10, 15, 7], 0, True], [144, 8400]], ['generated mix 64', [[100, 40, 45], [25, 6, 4], 5, False], [200, 6666]], ['upright plane rotation', [[48, 40, 30], [12, 10, 10], 0, True], [48, 10000]], ['laydown helps', [[40, 40, 12], [10, 10, 20], 0, False], [8, 8333]], ['unlimited zero', [[20, 20, 40], [10, 10, 10], 0, True], [16, 10000]], ['generated mix 42', [[60, 30, 30], [10, 15, 35], 1, False], [3, 2916]], ['generated mix 50', [[100, 48, 60], [25, 15, 35], 3, False], [12, 5468]], ['generated mix 58', [[40, 48, 60], [10, 20, 7], 3, False], [72, 8750]]]]
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
laydown helps[8, 8333][8, 8333]Passed
generated mix 1[80, 8750][40, 4375]Failed
upright plane rotation[48, 10000][48, 10000]Passed
upright blocked[0, 0][0, 0]Passed
fraction bp[48, 9333][48, 9333]Passed
stack cap[48, 10000][32, 6666]Failed
unlimited zero[16, 10000][16, 10000]Passed
generated mix 9[72, 8333][72, 8333]Passed

SHA-256 / 8cca029c2ec65bef4177dcf001ecfa2f3fa77ae90ef55f1303bb42b6b3902a9e

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

Uniform unit, single orientation per slot; no mixed orientation packing. 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:10.455281+00:00.

Case digest / dde7d74f0bb0d1764488633cc57eb9fd60acc06dc063a38e484ae40ec31efeeb