FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
zone too wideCREJECTFailed
generated mix 4Z4REJECTFailed
exact matchCCPassed
full zoneBBPassed
frozenREJECTFFailed
narrowestABFailed
tie most freeREJECTBFailed
generated mix 9Z0Z0Passed

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 fixtureActualExpectedOutcome
zone too wideCREJECTFailed
generated mix 4Z2REJECTFailed
exact matchCCPassed
full zoneBBPassed
frozenFFPassed
narrowestBBPassed
tie most freeBBPassed
generated mix 9Z0Z0Passed

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 fixtureActualExpectedOutcome
zone too wideREJECTREJECTPassed
generated mix 4REJECTREJECTPassed
exact matchCCPassed
full zoneBBPassed
frozenFFPassed
narrowestBBPassed
tie most freeBBPassed
generated mix 9Z0Z0Passed

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