FA-95201 / Warehouse slotting and bin packing / Open access
Temperature putaway: product range inside zone accepted · case 01
Chilled product is put into a zone whose range swings outside the product tolerance.
ROOT CAUSE
Containment is tested the wrong way round: product range inside zone range.
VERIFIED REPAIR
Require the zone range to lie within the product storage range.
Unsuccessful approach: An overlap test accepts zones that are only partly within tolerance.
Case contract
zones [[zone, min_c, max_c, free_positions]], product [min_c, max_c]. A zone is eligible when its whole range lies inside the product range (inclusive) and it has free positions. Prefer the narrowest zone range, then most free positions, then zone id. None -> "REJECT".
Why this case matters
Cold chain putaway must keep product within its storage temperature range.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(zones, product):
pmin, pmax = product
best = None
for zid, zmin, zmax, free in zones:
if pmin < zmin or pmax > zmax:
continue
if free <= 0:
continue
key = (zmax - zmin, -free, zid)
if best is None or key < best:
best = key
return best[2] if best else 'REJECT'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['zone too wide', [[['C', 0, 8, 3]], [2, 8]], 'REJECT'], ['generated mix 4', [[['Z0', 10, 30, 1], ['Z1', 15, 25, 1], ['Z2', 0, 4, 5], ['Z3', 0, 8, 0], ['Z4', 0, 8, 5]], [2, 8]], 'REJECT'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['full zone', [[['A', 2, 8, 0], ['B', 0, 8, 1]], [0, 8]], 'B'], ['frozen', [[['F', -25, -18, 2], ['C', 0, 4, 9]], [-30, -15]], 'F'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['generated mix 9', [[['Z0', 15, 25, 1], ['Z1', 10, 30, 0], ['Z2', 10, 30, 5]], [15, 25]], 'Z0']], [['generated mix 11', [[['Z0', 15, 25, 1], ['Z1', -25, -18, 5], ['Z2', 15, 25, 5]], [10, 30]], 'Z2'], ['generated mix 38', [[['Z0', 10, 30, 1], ['Z1', -30, -15, 5]], [-25, -15]], 'REJECT'], ['full zone', [[['A', 2, 8, 0], ['B', 0, 8, 1]], [0, 8]], 'B'], ['frozen', [[['F', -25, -18, 2], ['C', 0, 4, 9]], [-30, -15]], 'F'], ['zone too wide', [[['C', 0, 8, 3]], [2, 8]], 'REJECT'], ['generated mix 9', [[['Z0', 15, 25, 1], ['Z1', 10, 30, 0], ['Z2', 10, 30, 5]], [15, 25]], 'Z0'], ['generated mix 18', [[['Z0', -30, -15, 1], ['Z1', 2, 8, 12], ['Z2', -30, -15, 12], ['Z3', 0, 8, 1]], [-30, -18]], 'REJECT'], ['generated mix 26', [[['Z0', -30, -15, 0], ['Z1', 10, 30, 1], ['Z2', 15, 25, 5], ['Z3', 2, 8, 1]], [15, 25]], 'Z2']], [['generated mix 35', [[['Z0', -25, -18, 0], ['Z1', 0, 8, 5]], [2, 8]], 'REJECT'], ['generated mix 61', [[['Z0', 15, 25, 12], ['Z1', 0, 8, 5]], [0, 4]], 'REJECT'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['generated mix 20', [[['Z0', 15, 25, 5], ['Z1', 10, 30, 1], ['Z2', 0, 4, 12], ['Z3', 15, 25, 0], ['Z4', 0, 4, 12]], [-30, -18]], 'REJECT'], ['generated mix 28', [[['Z0', 2, 8, 0]], [15, 25]], 'REJECT'], ['generated mix 37', [[['Z0', 0, 8, 5], ['Z1', -30, -15, 1], ['Z2', 15, 25, 1], ['Z3', 0, 8, 5]], [-30, -18]], 'REJECT']], [['generated mix 46', [[['Z0', 0, 4, 12], ['Z1', 10, 30, 0]], [0, 8]], 'Z0'], ['zone too wide', [[['C', 0, 8, 3]], [2, 8]], 'REJECT'], ['frozen', [[['F', -25, -18, 2], ['C', 0, 4, 9]], [-30, -15]], 'F'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['generated mix 33', [[['Z0', 0, 4, 1], ['Z1', 2, 8, 1], ['Z2', 2, 8, 0]], [0, 8]], 'Z0'], ['generated mix 41', [[['Z0', 0, 8, 12], ['Z1', 0, 4, 0], ['Z2', 0, 8, 5], ['Z3', -30, -15, 1], ['Z4', 10, 30, 5]], [10, 30]], 'Z4']], [['generated mix 69', [[['Z0', 0, 4, 1], ['Z1', 2, 8, 5], ['Z2', 10, 30, 12], ['Z3', 10, 30, 0]], [-5, 10]], 'Z0'], ['generated mix 37', [[['Z0', 0, 8, 5], ['Z1', -30, -15, 1], ['Z2', 15, 25, 1], ['Z3', 0, 8, 5]], [-30, -18]], 'REJECT'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['generated mix 43', [[['Z0', -25, -18, 0], ['Z1', -30, -15, 5], ['Z2', 0, 8, 12], ['Z3', 0, 8, 1]], [-5, 10]], 'Z2'], ['generated mix 51', [[['Z0', 0, 4, 12], ['Z1', 2, 8, 0], ['Z2', 0, 4, 5]], [-25, -15]], 'REJECT'], ['generated mix 59', [[['Z0', 15, 25, 12], ['Z1', 0, 8, 0], ['Z2', 2, 8, 12]], [0, 4]], 'REJECT']]]
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 |
|---|---|---|---|
| zone too wide | C | REJECT | Failed |
| generated mix 4 | Z4 | REJECT | Failed |
| exact match | C | C | Passed |
| full zone | B | B | Passed |
| frozen | REJECT | F | Failed |
| narrowest | A | B | Failed |
| tie most free | REJECT | B | Failed |
| generated mix 9 | Z0 | Z0 | Passed |
SHA-256 / 99de75a8a1aa54800f9487c890967da00599dbcc22ad5e0a2360567bd9ce9e8b
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(zones, product):
pmin, pmax = product
best = None
for zid, zmin, zmax, free in zones:
if zmax < pmin or zmin > pmax:
continue
if free <= 0:
continue
key = (zmax - zmin, -free, zid)
if best is None or key < best:
best = key
return best[2] if best else 'REJECT'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['zone too wide', [[['C', 0, 8, 3]], [2, 8]], 'REJECT'], ['generated mix 4', [[['Z0', 10, 30, 1], ['Z1', 15, 25, 1], ['Z2', 0, 4, 5], ['Z3', 0, 8, 0], ['Z4', 0, 8, 5]], [2, 8]], 'REJECT'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['full zone', [[['A', 2, 8, 0], ['B', 0, 8, 1]], [0, 8]], 'B'], ['frozen', [[['F', -25, -18, 2], ['C', 0, 4, 9]], [-30, -15]], 'F'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['generated mix 9', [[['Z0', 15, 25, 1], ['Z1', 10, 30, 0], ['Z2', 10, 30, 5]], [15, 25]], 'Z0']], [['generated mix 11', [[['Z0', 15, 25, 1], ['Z1', -25, -18, 5], ['Z2', 15, 25, 5]], [10, 30]], 'Z2'], ['generated mix 38', [[['Z0', 10, 30, 1], ['Z1', -30, -15, 5]], [-25, -15]], 'REJECT'], ['full zone', [[['A', 2, 8, 0], ['B', 0, 8, 1]], [0, 8]], 'B'], ['frozen', [[['F', -25, -18, 2], ['C', 0, 4, 9]], [-30, -15]], 'F'], ['zone too wide', [[['C', 0, 8, 3]], [2, 8]], 'REJECT'], ['generated mix 9', [[['Z0', 15, 25, 1], ['Z1', 10, 30, 0], ['Z2', 10, 30, 5]], [15, 25]], 'Z0'], ['generated mix 18', [[['Z0', -30, -15, 1], ['Z1', 2, 8, 12], ['Z2', -30, -15, 12], ['Z3', 0, 8, 1]], [-30, -18]], 'REJECT'], ['generated mix 26', [[['Z0', -30, -15, 0], ['Z1', 10, 30, 1], ['Z2', 15, 25, 5], ['Z3', 2, 8, 1]], [15, 25]], 'Z2']], [['generated mix 35', [[['Z0', -25, -18, 0], ['Z1', 0, 8, 5]], [2, 8]], 'REJECT'], ['generated mix 61', [[['Z0', 15, 25, 12], ['Z1', 0, 8, 5]], [0, 4]], 'REJECT'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['generated mix 20', [[['Z0', 15, 25, 5], ['Z1', 10, 30, 1], ['Z2', 0, 4, 12], ['Z3', 15, 25, 0], ['Z4', 0, 4, 12]], [-30, -18]], 'REJECT'], ['generated mix 28', [[['Z0', 2, 8, 0]], [15, 25]], 'REJECT'], ['generated mix 37', [[['Z0', 0, 8, 5], ['Z1', -30, -15, 1], ['Z2', 15, 25, 1], ['Z3', 0, 8, 5]], [-30, -18]], 'REJECT']], [['generated mix 46', [[['Z0', 0, 4, 12], ['Z1', 10, 30, 0]], [0, 8]], 'Z0'], ['zone too wide', [[['C', 0, 8, 3]], [2, 8]], 'REJECT'], ['frozen', [[['F', -25, -18, 2], ['C', 0, 4, 9]], [-30, -15]], 'F'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['generated mix 33', [[['Z0', 0, 4, 1], ['Z1', 2, 8, 1], ['Z2', 2, 8, 0]], [0, 8]], 'Z0'], ['generated mix 41', [[['Z0', 0, 8, 12], ['Z1', 0, 4, 0], ['Z2', 0, 8, 5], ['Z3', -30, -15, 1], ['Z4', 10, 30, 5]], [10, 30]], 'Z4']], [['generated mix 69', [[['Z0', 0, 4, 1], ['Z1', 2, 8, 5], ['Z2', 10, 30, 12], ['Z3', 10, 30, 0]], [-5, 10]], 'Z0'], ['generated mix 37', [[['Z0', 0, 8, 5], ['Z1', -30, -15, 1], ['Z2', 15, 25, 1], ['Z3', 0, 8, 5]], [-30, -18]], 'REJECT'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['generated mix 43', [[['Z0', -25, -18, 0], ['Z1', -30, -15, 5], ['Z2', 0, 8, 12], ['Z3', 0, 8, 1]], [-5, 10]], 'Z2'], ['generated mix 51', [[['Z0', 0, 4, 12], ['Z1', 2, 8, 0], ['Z2', 0, 4, 5]], [-25, -15]], 'REJECT'], ['generated mix 59', [[['Z0', 15, 25, 12], ['Z1', 0, 8, 0], ['Z2', 2, 8, 12]], [0, 4]], 'REJECT']]]
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 |
|---|---|---|---|
| zone too wide | C | REJECT | Failed |
| generated mix 4 | Z2 | REJECT | Failed |
| exact match | C | C | Passed |
| full zone | B | B | Passed |
| frozen | F | F | Passed |
| narrowest | B | B | Passed |
| tie most free | B | B | Passed |
| generated mix 9 | Z0 | Z0 | Passed |
SHA-256 / 7f84e7f4eda286174877ebe7ea096aa307e61b1bd60cc9b654260dd82e9292bd
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(zones, product):
pmin, pmax = product
best = None
for zid, zmin, zmax, free in zones:
if zmin < pmin or zmax > pmax:
continue
if free <= 0:
continue
key = (zmax - zmin, -free, zid)
if best is None or key < best:
best = key
return best[2] if best else 'REJECT'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['zone too wide', [[['C', 0, 8, 3]], [2, 8]], 'REJECT'], ['generated mix 4', [[['Z0', 10, 30, 1], ['Z1', 15, 25, 1], ['Z2', 0, 4, 5], ['Z3', 0, 8, 0], ['Z4', 0, 8, 5]], [2, 8]], 'REJECT'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['full zone', [[['A', 2, 8, 0], ['B', 0, 8, 1]], [0, 8]], 'B'], ['frozen', [[['F', -25, -18, 2], ['C', 0, 4, 9]], [-30, -15]], 'F'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['generated mix 9', [[['Z0', 15, 25, 1], ['Z1', 10, 30, 0], ['Z2', 10, 30, 5]], [15, 25]], 'Z0']], [['generated mix 11', [[['Z0', 15, 25, 1], ['Z1', -25, -18, 5], ['Z2', 15, 25, 5]], [10, 30]], 'Z2'], ['generated mix 38', [[['Z0', 10, 30, 1], ['Z1', -30, -15, 5]], [-25, -15]], 'REJECT'], ['full zone', [[['A', 2, 8, 0], ['B', 0, 8, 1]], [0, 8]], 'B'], ['frozen', [[['F', -25, -18, 2], ['C', 0, 4, 9]], [-30, -15]], 'F'], ['zone too wide', [[['C', 0, 8, 3]], [2, 8]], 'REJECT'], ['generated mix 9', [[['Z0', 15, 25, 1], ['Z1', 10, 30, 0], ['Z2', 10, 30, 5]], [15, 25]], 'Z0'], ['generated mix 18', [[['Z0', -30, -15, 1], ['Z1', 2, 8, 12], ['Z2', -30, -15, 12], ['Z3', 0, 8, 1]], [-30, -18]], 'REJECT'], ['generated mix 26', [[['Z0', -30, -15, 0], ['Z1', 10, 30, 1], ['Z2', 15, 25, 5], ['Z3', 2, 8, 1]], [15, 25]], 'Z2']], [['generated mix 35', [[['Z0', -25, -18, 0], ['Z1', 0, 8, 5]], [2, 8]], 'REJECT'], ['generated mix 61', [[['Z0', 15, 25, 12], ['Z1', 0, 8, 5]], [0, 4]], 'REJECT'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['generated mix 20', [[['Z0', 15, 25, 5], ['Z1', 10, 30, 1], ['Z2', 0, 4, 12], ['Z3', 15, 25, 0], ['Z4', 0, 4, 12]], [-30, -18]], 'REJECT'], ['generated mix 28', [[['Z0', 2, 8, 0]], [15, 25]], 'REJECT'], ['generated mix 37', [[['Z0', 0, 8, 5], ['Z1', -30, -15, 1], ['Z2', 15, 25, 1], ['Z3', 0, 8, 5]], [-30, -18]], 'REJECT']], [['generated mix 46', [[['Z0', 0, 4, 12], ['Z1', 10, 30, 0]], [0, 8]], 'Z0'], ['zone too wide', [[['C', 0, 8, 3]], [2, 8]], 'REJECT'], ['frozen', [[['F', -25, -18, 2], ['C', 0, 4, 9]], [-30, -15]], 'F'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['generated mix 33', [[['Z0', 0, 4, 1], ['Z1', 2, 8, 1], ['Z2', 2, 8, 0]], [0, 8]], 'Z0'], ['generated mix 41', [[['Z0', 0, 8, 12], ['Z1', 0, 4, 0], ['Z2', 0, 8, 5], ['Z3', -30, -15, 1], ['Z4', 10, 30, 5]], [10, 30]], 'Z4']], [['generated mix 69', [[['Z0', 0, 4, 1], ['Z1', 2, 8, 5], ['Z2', 10, 30, 12], ['Z3', 10, 30, 0]], [-5, 10]], 'Z0'], ['generated mix 37', [[['Z0', 0, 8, 5], ['Z1', -30, -15, 1], ['Z2', 15, 25, 1], ['Z3', 0, 8, 5]], [-30, -18]], 'REJECT'], ['exact match', [[['C', 2, 8, 3]], [2, 8]], 'C'], ['narrowest', [[['A', 0, 8, 5], ['B', 2, 6, 1]], [0, 8]], 'B'], ['tie most free', [[['A', 2, 8, 1], ['B', 2, 8, 4]], [0, 10]], 'B'], ['generated mix 43', [[['Z0', -25, -18, 0], ['Z1', -30, -15, 5], ['Z2', 0, 8, 12], ['Z3', 0, 8, 1]], [-5, 10]], 'Z2'], ['generated mix 51', [[['Z0', 0, 4, 12], ['Z1', 2, 8, 0], ['Z2', 0, 4, 5]], [-25, -15]], 'REJECT'], ['generated mix 59', [[['Z0', 15, 25, 12], ['Z1', 0, 8, 0], ['Z2', 2, 8, 12]], [0, 4]], 'REJECT']]]
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 |
|---|---|---|---|
| zone too wide | REJECT | REJECT | Passed |
| generated mix 4 | REJECT | REJECT | Passed |
| exact match | C | C | Passed |
| full zone | B | B | Passed |
| frozen | F | F | Passed |
| narrowest | B | B | Passed |
| tie most free | B | B | Passed |
| generated mix 9 | Z0 | Z0 | Passed |
SHA-256 / 20e44e924241f7cbbd8d18da00220ae3e742c164990628fc828c18d601908e23
Verification & scope
Stipulated integer temperature ranges; no excursion or dwell time logic. 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:11.555829+00:00.
Case digest / c9fc204a9cf5fc37edcb9978876826d6de9b970e329997ce13dadbe25ef0b6c6