FA-95316 / Warehouse slotting and bin packing / Open access
Honeycombing: full lanes reported as a lost lane · case 01
A SKU that fills its lanes exactly shows a full lane of honeycomb loss.
ROOT CAUSE
Loss is computed from the pallet remainder without handling a zero remainder.
THE FAILURE
Loss is computed from the pallet remainder without handling a zero remainder.
Unsuccessful approach: Using the remainder itself reports occupied positions of the last lane as loss.
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 += depth - pallets % depth
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 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 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 16', [[['C', 8], ['D', 4]], 5, 1], [3, 3, 8000, '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 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 24', [[['A', 1], ['D', -3], ['B', 9]], 3, 8], [4, 2, 8333, 'OK']], ['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 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, '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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| mixed | [4, 7, 5625, 'OK'] | [4, 3, 8125, 'OK'] | Failed |
| merge lines | [2, 3, 6250, 'OK'] | [2, 3, 6250, 'OK'] | Passed |
| lanes equal available | [2, 4, 5000, 'OK'] | [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 / 9d9cc9ec36777a86af3d8a50c254d75d00e5c6bcd466dbfdf499bd8bfc236b5a
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 += pallets % depth
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 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 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 16', [[['C', 8], ['D', 4]], 5, 1], [3, 3, 8000, '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 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 24', [[['A', 1], ['D', -3], ['B', 9]], 3, 8], [4, 2, 8333, 'OK']], ['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 29', [[['C', -1], ['C', -3], ['D', 1], ['D', -1], ['B', 5]], 3, 1], [2, 1, 8333, '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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| mixed | [4, 1, 9375, 'OK'] | [4, 3, 8125, 'OK'] | Failed |
| merge lines | [2, 1, 8750, 'OK'] | [2, 3, 6250, 'OK'] | Failed |
| lanes equal available | [2, 0, 10000, 'OK'] | [2, 0, 10000, 'OK'] | Passed |
| over | [3, 1, 9166, 'OVER'] | [3, 3, 7500, 'OVER'] | Failed |
| floor util | [1, 2, 3333, 'OK'] | [1, 1, 6666, 'OK'] | Failed |
| adjustment nets out | [1, 1, 7500, 'OK'] | [1, 3, 2500, 'OK'] | Failed |
| empty | [0, 0, 0, 'OK'] | [0, 0, 0, 'OK'] | Passed |
| generated mix 8 | [4, 4, 6666, 'OVER'] | [4, 2, 8333, 'OVER'] | Failed |
SHA-256 / a7934d009f47c614cb998554fe699088bde390a32776c529fe077d777b4fb24f
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.518147+00:00.
Case digest / b7b9cd6dd5dc974eb69170becb1cbc1222e519c3506246ea2232386008b553c6