{"abstract":"A task requests more units than exist as full cases in reserve, forcing a case to be broken in reserve.","category":"Warehouse slotting and bin packing","checks":8,"contract":"faces [[loc, on_hand, min, max, case_pack, reserve_units]], min >= 1. Replenish when on_hand <= min. Quantity is the largest number of full cases that keeps on_hand <= max, limited to full cases available in reserve. A stocked-out face whose max leaves no room for a full case still gets one case if reserve has one. Zero-quantity tasks are dropped. Tasks are ordered by on_hand/min ascending, then loc.","evaluation_group":"w2-warehouse-slotting-pickface-replen","failed_approach":"Dividing reserve by case pack without multiplying back compares cases against units.","family":"w2-warehouse-slotting-pickface-replen-reserve-case-cap","id":"FA-94906","implementations":{"attempt":{"sha256":"910d69bdd2dfac8df0f3de239a048df9c41d0de02953c04c5f15fd3ae457bd5a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(faces):\n    tasks = []\n    for loc, oh, mn, mx, cp, reserve in faces:\n        if oh > mn:\n            continue\n        avail = reserve // cp\n        qty = (mx - oh) // cp * cp\n        qty = min(qty, avail)\n        if qty == 0 and oh == 0 and avail >= cp:\n            qty = cp\n        if qty == 0:\n            continue\n        tasks.append((Fraction(oh, mn), loc, qty))\n    tasks.sort()\n    return [[loc, qty] for _, loc, qty in tasks]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['reserve partial case', [[['A', 0, 5, 30, 12, 20]]], [['A', 12]]], ['at min triggers', [[['A', 10, 10, 34, 12, 100]]], [['A', 24]]], ['stockout small max', [[['B', 0, 2, 5, 6, 12]]], [['B', 6]]], ['priority by ratio', [[['X', 5, 10, 40, 5, 100], ['Y', 2, 8, 40, 5, 100], ['Z', 0, 6, 40, 5, 100]]], [['Z', 40], ['Y', 35], ['X', 35]]], ['above min idle', [[['A', 11, 10, 34, 12, 100]]], []], ['stockout no reserve', [[['B', 0, 2, 20, 6, 5]]], []], ['generated mix 8', [[['F0', 0, 12, 15, 6, 0], ['F1', 1, 10, 22, 6, 12]]], [['F1', 12]]], ['generated mix 16', [[['F0', 6, 6, 36, 1, 0], ['F1', 1, 10, 22, 1, 3], ['F2', 5, 4, 16, 6, 24], ['F3', 7, 6, 36, 6, 24]]], [['F1', 3]]]], [['generated mix 44', [[['F0', 4, 4, 4, 6, 3], ['F1', 11, 10, 10, 1, 48], ['F2', 11, 12, 24, 4, 48], ['F3', 3, 6, 9, 4, 3]]], [['F2', 12]]], ['generated mix 4', [[['F0', 1, 12, 42, 12, 24]]], [['F0', 24]]], ['stockout small max', [[['B', 0, 2, 5, 6, 12]]], [['B', 6]]], ['priority by ratio', [[['X', 5, 10, 40, 5, 100], ['Y', 2, 8, 40, 5, 100], ['Z', 0, 6, 40, 5, 100]]], [['Z', 40], ['Y', 35], ['X', 35]]], ['above min idle', [[['A', 11, 10, 34, 12, 100]]], []], ['generated mix 10', [[['F0', 0, 4, 4, 12, 12], ['F1', 5, 6, 12, 12, 24]]], [['F0', 12]]], ['generated mix 18', [[['F0', 5, 6, 9, 6, 24], ['F1', 1, 12, 15, 4, 3], ['F2', 3, 12, 15, 12, 0], ['F3', 7, 6, 30, 6, 24]]], []], ['generated mix 26', [[['F0', 7, 6, 6, 12, 48], ['F1', 0, 4, 28, 6, 12], ['F2', 0, 6, 30, 6, 0], ['F3', 1, 6, 6, 1, 3]]], [['F1', 12], ['F3', 3]]]], [['generated mix 66', [[['F0', 12, 12, 42, 1, 48], ['F1', 0, 12, 15, 6, 3], ['F2', 1, 4, 28, 12, 12]]], [['F2', 12], ['F0', 30]]], ['generated mix 10', [[['F0', 0, 4, 4, 12, 12], ['F1', 5, 6, 12, 12, 24]]], [['F0', 12]]], ['at min triggers', [[['A', 10, 10, 34, 12, 100]]], [['A', 24]]], ['reserve partial case', [[['A', 0, 5, 30, 12, 20]]], [['A', 12]]], ['stockout no reserve', [[['B', 0, 2, 20, 6, 5]]], []], ['generated mix 21', [[['F0', 0, 4, 16, 1, 24], ['F1', 11, 10, 22, 6, 12], ['F2', 0, 6, 18, 4, 24], ['F3', 3, 4, 34, 6, 48], ['F4', 12, 12, 24, 12, 100]]], [['F0', 16], ['F2', 16], ['F3', 30], ['F4', 12]]], ['generated mix 29', [[['F0', 1, 12, 36, 1, 100], ['F1', 0, 4, 16, 1, 100], ['F2', 3, 12, 18, 4, 24], ['F3', 7, 6, 6, 1, 48]]], [['F1', 16], ['F0', 35], ['F2', 12]]], ['generated mix 37', [[['F0', 0, 4, 7, 12, 48]]], [['F0', 12]]]], [['generated mix 23', [[['F0', 0, 12, 24, 12, 3], ['F1', 0, 4, 10, 12, 24]]], [['F1', 12]]], ['generated mix 17', [[['F0', 1, 12, 24, 4, 12], ['F1', 12, 12, 18, 4, 24], ['F2', 11, 12, 24, 1, 12], ['F3', 11, 10, 40, 12, 100]]], [['F0', 12], ['F2', 12], ['F1', 4]]], ['stockout small max', [[['B', 0, 2, 5, 6, 12]]], [['B', 6]]], ['priority by ratio', [[['X', 5, 10, 40, 5, 100], ['Y', 2, 8, 40, 5, 100], ['Z', 0, 6, 40, 5, 100]]], [['Z', 40], ['Y', 35], ['X', 35]]], ['above min idle', [[['A', 11, 10, 34, 12, 100]]], []], ['generated mix 33', [[['F0', 13, 12, 36, 12, 48], ['F1', 5, 4, 10, 6, 100], ['F2', 4, 4, 10, 12, 24]]], []], ['generated mix 41', [[['F0', 0, 4, 16, 1, 12], ['F1', 7, 6, 30, 1, 100], ['F2', 5, 6, 18, 12, 24]]], [['F0', 12], ['F2', 12]]], ['generated mix 49', [[['F0', 1, 12, 36, 6, 100], ['F1', 0, 12, 18, 12, 12], ['F2', 0, 10, 10, 1, 48], ['F3', 1, 6, 18, 1, 100]]], [['F1', 12], ['F2', 10], ['F0', 30], ['F3', 17]]]], [['generated mix 51', [[['F0', 4, 4, 28, 6, 12], ['F1', 1, 6, 30, 12, 0], ['F2', 9, 10, 34, 6, 3]]], [['F0', 12]]], ['generated mix 24', [[['F0', 3, 10, 10, 4, 48], ['F1', 0, 6, 9, 4, 12], ['F2', 0, 10, 13, 12, 100], ['F3', 6, 6, 6, 4, 12]]], [['F1', 8], ['F2', 12], ['F0', 4]]], ['at min triggers', [[['A', 10, 10, 34, 12, 100]]], [['A', 24]]], ['reserve partial case', [[['A', 0, 5, 30, 12, 20]]], [['A', 12]]], ['stockout no reserve', [[['B', 0, 2, 20, 6, 5]]], []], ['generated mix 43', [[['F0', 0, 6, 18, 4, 24], ['F1', 3, 4, 34, 4, 48], ['F2', 1, 4, 10, 12, 0], ['F3', 1, 4, 34, 12, 12]]], [['F0', 16], ['F3', 12], ['F1', 28]]], ['generated mix 52', [[['F0', 11, 10, 16, 6, 3], ['F1', 10, 10, 13, 4, 24], ['F2', 0, 4, 28, 1, 100], ['F3', 12, 12, 42, 4, 0]]], [['F2', 28]]], ['generated mix 60', [[['F0', 0, 10, 40, 1, 24], ['F1', 3, 6, 30, 4, 100], ['F2', 4, 4, 4, 6, 100]]], [['F0', 24], ['F1', 24]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"b9efffeae6fc2ee78fafe23bedcd92d5736d46faeeeb96cf03796eb18b1fc0c6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(faces):\n    tasks = []\n    for loc, oh, mn, mx, cp, reserve in faces:\n        if oh > mn:\n            continue\n        avail = reserve\n        qty = (mx - oh) // cp * cp\n        qty = min(qty, avail)\n        if qty == 0 and oh == 0 and avail >= cp:\n            qty = cp\n        if qty == 0:\n            continue\n        tasks.append((Fraction(oh, mn), loc, qty))\n    tasks.sort()\n    return [[loc, qty] for _, loc, qty in tasks]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['reserve partial case', [[['A', 0, 5, 30, 12, 20]]], [['A', 12]]], ['at min triggers', [[['A', 10, 10, 34, 12, 100]]], [['A', 24]]], ['stockout small max', [[['B', 0, 2, 5, 6, 12]]], [['B', 6]]], ['priority by ratio', [[['X', 5, 10, 40, 5, 100], ['Y', 2, 8, 40, 5, 100], ['Z', 0, 6, 40, 5, 100]]], [['Z', 40], ['Y', 35], ['X', 35]]], ['above min idle', [[['A', 11, 10, 34, 12, 100]]], []], ['stockout no reserve', [[['B', 0, 2, 20, 6, 5]]], []], ['generated mix 8', [[['F0', 0, 12, 15, 6, 0], ['F1', 1, 10, 22, 6, 12]]], [['F1', 12]]], ['generated mix 16', [[['F0', 6, 6, 36, 1, 0], ['F1', 1, 10, 22, 1, 3], ['F2', 5, 4, 16, 6, 24], ['F3', 7, 6, 36, 6, 24]]], [['F1', 3]]]], [['generated mix 44', [[['F0', 4, 4, 4, 6, 3], ['F1', 11, 10, 10, 1, 48], ['F2', 11, 12, 24, 4, 48], ['F3', 3, 6, 9, 4, 3]]], [['F2', 12]]], ['generated mix 4', [[['F0', 1, 12, 42, 12, 24]]], [['F0', 24]]], ['stockout small max', [[['B', 0, 2, 5, 6, 12]]], [['B', 6]]], ['priority by ratio', [[['X', 5, 10, 40, 5, 100], ['Y', 2, 8, 40, 5, 100], ['Z', 0, 6, 40, 5, 100]]], [['Z', 40], ['Y', 35], ['X', 35]]], ['above min idle', [[['A', 11, 10, 34, 12, 100]]], []], ['generated mix 10', [[['F0', 0, 4, 4, 12, 12], ['F1', 5, 6, 12, 12, 24]]], [['F0', 12]]], ['generated mix 18', [[['F0', 5, 6, 9, 6, 24], ['F1', 1, 12, 15, 4, 3], ['F2', 3, 12, 15, 12, 0], ['F3', 7, 6, 30, 6, 24]]], []], ['generated mix 26', [[['F0', 7, 6, 6, 12, 48], ['F1', 0, 4, 28, 6, 12], ['F2', 0, 6, 30, 6, 0], ['F3', 1, 6, 6, 1, 3]]], [['F1', 12], ['F3', 3]]]], [['generated mix 66', [[['F0', 12, 12, 42, 1, 48], ['F1', 0, 12, 15, 6, 3], ['F2', 1, 4, 28, 12, 12]]], [['F2', 12], ['F0', 30]]], ['generated mix 10', [[['F0', 0, 4, 4, 12, 12], ['F1', 5, 6, 12, 12, 24]]], [['F0', 12]]], ['at min triggers', [[['A', 10, 10, 34, 12, 100]]], [['A', 24]]], ['reserve partial case', [[['A', 0, 5, 30, 12, 20]]], [['A', 12]]], ['stockout no reserve', [[['B', 0, 2, 20, 6, 5]]], []], ['generated mix 21', [[['F0', 0, 4, 16, 1, 24], ['F1', 11, 10, 22, 6, 12], ['F2', 0, 6, 18, 4, 24], ['F3', 3, 4, 34, 6, 48], ['F4', 12, 12, 24, 12, 100]]], [['F0', 16], ['F2', 16], ['F3', 30], ['F4', 12]]], ['generated mix 29', [[['F0', 1, 12, 36, 1, 100], ['F1', 0, 4, 16, 1, 100], ['F2', 3, 12, 18, 4, 24], ['F3', 7, 6, 6, 1, 48]]], [['F1', 16], ['F0', 35], ['F2', 12]]], ['generated mix 37', [[['F0', 0, 4, 7, 12, 48]]], [['F0', 12]]]], [['generated mix 23', [[['F0', 0, 12, 24, 12, 3], ['F1', 0, 4, 10, 12, 24]]], [['F1', 12]]], ['generated mix 17', [[['F0', 1, 12, 24, 4, 12], ['F1', 12, 12, 18, 4, 24], ['F2', 11, 12, 24, 1, 12], ['F3', 11, 10, 40, 12, 100]]], [['F0', 12], ['F2', 12], ['F1', 4]]], ['stockout small max', [[['B', 0, 2, 5, 6, 12]]], [['B', 6]]], ['priority by ratio', [[['X', 5, 10, 40, 5, 100], ['Y', 2, 8, 40, 5, 100], ['Z', 0, 6, 40, 5, 100]]], [['Z', 40], ['Y', 35], ['X', 35]]], ['above min idle', [[['A', 11, 10, 34, 12, 100]]], []], ['generated mix 33', [[['F0', 13, 12, 36, 12, 48], ['F1', 5, 4, 10, 6, 100], ['F2', 4, 4, 10, 12, 24]]], []], ['generated mix 41', [[['F0', 0, 4, 16, 1, 12], ['F1', 7, 6, 30, 1, 100], ['F2', 5, 6, 18, 12, 24]]], [['F0', 12], ['F2', 12]]], ['generated mix 49', [[['F0', 1, 12, 36, 6, 100], ['F1', 0, 12, 18, 12, 12], ['F2', 0, 10, 10, 1, 48], ['F3', 1, 6, 18, 1, 100]]], [['F1', 12], ['F2', 10], ['F0', 30], ['F3', 17]]]], [['generated mix 51', [[['F0', 4, 4, 28, 6, 12], ['F1', 1, 6, 30, 12, 0], ['F2', 9, 10, 34, 6, 3]]], [['F0', 12]]], ['generated mix 24', [[['F0', 3, 10, 10, 4, 48], ['F1', 0, 6, 9, 4, 12], ['F2', 0, 10, 13, 12, 100], ['F3', 6, 6, 6, 4, 12]]], [['F1', 8], ['F2', 12], ['F0', 4]]], ['at min triggers', [[['A', 10, 10, 34, 12, 100]]], [['A', 24]]], ['reserve partial case', [[['A', 0, 5, 30, 12, 20]]], [['A', 12]]], ['stockout no reserve', [[['B', 0, 2, 20, 6, 5]]], []], ['generated mix 43', [[['F0', 0, 6, 18, 4, 24], ['F1', 3, 4, 34, 4, 48], ['F2', 1, 4, 10, 12, 0], ['F3', 1, 4, 34, 12, 12]]], [['F0', 16], ['F3', 12], ['F1', 28]]], ['generated mix 52', [[['F0', 11, 10, 16, 6, 3], ['F1', 10, 10, 13, 4, 24], ['F2', 0, 4, 28, 1, 100], ['F3', 12, 12, 42, 4, 0]]], [['F2', 28]]], ['generated mix 60', [[['F0', 0, 10, 40, 1, 24], ['F1', 3, 6, 30, 4, 100], ['F2', 4, 4, 4, 6, 100]]], [['F0', 24], ['F1', 24]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"01d2c341a826fcf59a0442617fc8094b43806f04aae23a23b15403cdd3bf742f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(faces):\n    tasks = []\n    for loc, oh, mn, mx, cp, reserve in faces:\n        if oh > mn:\n            continue\n        avail = reserve // cp * cp\n        qty = (mx - oh) // cp * cp\n        qty = min(qty, avail)\n        if qty == 0 and oh == 0 and avail >= cp:\n            qty = cp\n        if qty == 0:\n            continue\n        tasks.append((Fraction(oh, mn), loc, qty))\n    tasks.sort()\n    return [[loc, qty] for _, loc, qty in tasks]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['reserve partial case', [[['A', 0, 5, 30, 12, 20]]], [['A', 12]]], ['at min triggers', [[['A', 10, 10, 34, 12, 100]]], [['A', 24]]], ['stockout small max', [[['B', 0, 2, 5, 6, 12]]], [['B', 6]]], ['priority by ratio', [[['X', 5, 10, 40, 5, 100], ['Y', 2, 8, 40, 5, 100], ['Z', 0, 6, 40, 5, 100]]], [['Z', 40], ['Y', 35], ['X', 35]]], ['above min idle', [[['A', 11, 10, 34, 12, 100]]], []], ['stockout no reserve', [[['B', 0, 2, 20, 6, 5]]], []], ['generated mix 8', [[['F0', 0, 12, 15, 6, 0], ['F1', 1, 10, 22, 6, 12]]], [['F1', 12]]], ['generated mix 16', [[['F0', 6, 6, 36, 1, 0], ['F1', 1, 10, 22, 1, 3], ['F2', 5, 4, 16, 6, 24], ['F3', 7, 6, 36, 6, 24]]], [['F1', 3]]]], [['generated mix 44', [[['F0', 4, 4, 4, 6, 3], ['F1', 11, 10, 10, 1, 48], ['F2', 11, 12, 24, 4, 48], ['F3', 3, 6, 9, 4, 3]]], [['F2', 12]]], ['generated mix 4', [[['F0', 1, 12, 42, 12, 24]]], [['F0', 24]]], ['stockout small max', [[['B', 0, 2, 5, 6, 12]]], [['B', 6]]], ['priority by ratio', [[['X', 5, 10, 40, 5, 100], ['Y', 2, 8, 40, 5, 100], ['Z', 0, 6, 40, 5, 100]]], [['Z', 40], ['Y', 35], ['X', 35]]], ['above min idle', [[['A', 11, 10, 34, 12, 100]]], []], ['generated mix 10', [[['F0', 0, 4, 4, 12, 12], ['F1', 5, 6, 12, 12, 24]]], [['F0', 12]]], ['generated mix 18', [[['F0', 5, 6, 9, 6, 24], ['F1', 1, 12, 15, 4, 3], ['F2', 3, 12, 15, 12, 0], ['F3', 7, 6, 30, 6, 24]]], []], ['generated mix 26', [[['F0', 7, 6, 6, 12, 48], ['F1', 0, 4, 28, 6, 12], ['F2', 0, 6, 30, 6, 0], ['F3', 1, 6, 6, 1, 3]]], [['F1', 12], ['F3', 3]]]], [['generated mix 66', [[['F0', 12, 12, 42, 1, 48], ['F1', 0, 12, 15, 6, 3], ['F2', 1, 4, 28, 12, 12]]], [['F2', 12], ['F0', 30]]], ['generated mix 10', [[['F0', 0, 4, 4, 12, 12], ['F1', 5, 6, 12, 12, 24]]], [['F0', 12]]], ['at min triggers', [[['A', 10, 10, 34, 12, 100]]], [['A', 24]]], ['reserve partial case', [[['A', 0, 5, 30, 12, 20]]], [['A', 12]]], ['stockout no reserve', [[['B', 0, 2, 20, 6, 5]]], []], ['generated mix 21', [[['F0', 0, 4, 16, 1, 24], ['F1', 11, 10, 22, 6, 12], ['F2', 0, 6, 18, 4, 24], ['F3', 3, 4, 34, 6, 48], ['F4', 12, 12, 24, 12, 100]]], [['F0', 16], ['F2', 16], ['F3', 30], ['F4', 12]]], ['generated mix 29', [[['F0', 1, 12, 36, 1, 100], ['F1', 0, 4, 16, 1, 100], ['F2', 3, 12, 18, 4, 24], ['F3', 7, 6, 6, 1, 48]]], [['F1', 16], ['F0', 35], ['F2', 12]]], ['generated mix 37', [[['F0', 0, 4, 7, 12, 48]]], [['F0', 12]]]], [['generated mix 23', [[['F0', 0, 12, 24, 12, 3], ['F1', 0, 4, 10, 12, 24]]], [['F1', 12]]], ['generated mix 17', [[['F0', 1, 12, 24, 4, 12], ['F1', 12, 12, 18, 4, 24], ['F2', 11, 12, 24, 1, 12], ['F3', 11, 10, 40, 12, 100]]], [['F0', 12], ['F2', 12], ['F1', 4]]], ['stockout small max', [[['B', 0, 2, 5, 6, 12]]], [['B', 6]]], ['priority by ratio', [[['X', 5, 10, 40, 5, 100], ['Y', 2, 8, 40, 5, 100], ['Z', 0, 6, 40, 5, 100]]], [['Z', 40], ['Y', 35], ['X', 35]]], ['above min idle', [[['A', 11, 10, 34, 12, 100]]], []], ['generated mix 33', [[['F0', 13, 12, 36, 12, 48], ['F1', 5, 4, 10, 6, 100], ['F2', 4, 4, 10, 12, 24]]], []], ['generated mix 41', [[['F0', 0, 4, 16, 1, 12], ['F1', 7, 6, 30, 1, 100], ['F2', 5, 6, 18, 12, 24]]], [['F0', 12], ['F2', 12]]], ['generated mix 49', [[['F0', 1, 12, 36, 6, 100], ['F1', 0, 12, 18, 12, 12], ['F2', 0, 10, 10, 1, 48], ['F3', 1, 6, 18, 1, 100]]], [['F1', 12], ['F2', 10], ['F0', 30], ['F3', 17]]]], [['generated mix 51', [[['F0', 4, 4, 28, 6, 12], ['F1', 1, 6, 30, 12, 0], ['F2', 9, 10, 34, 6, 3]]], [['F0', 12]]], ['generated mix 24', [[['F0', 3, 10, 10, 4, 48], ['F1', 0, 6, 9, 4, 12], ['F2', 0, 10, 13, 12, 100], ['F3', 6, 6, 6, 4, 12]]], [['F1', 8], ['F2', 12], ['F0', 4]]], ['at min triggers', [[['A', 10, 10, 34, 12, 100]]], [['A', 24]]], ['reserve partial case', [[['A', 0, 5, 30, 12, 20]]], [['A', 12]]], ['stockout no reserve', [[['B', 0, 2, 20, 6, 5]]], []], ['generated mix 43', [[['F0', 0, 6, 18, 4, 24], ['F1', 3, 4, 34, 4, 48], ['F2', 1, 4, 10, 12, 0], ['F3', 1, 4, 34, 12, 12]]], [['F0', 16], ['F3', 12], ['F1', 28]]], ['generated mix 52', [[['F0', 11, 10, 16, 6, 3], ['F1', 10, 10, 13, 4, 24], ['F2', 0, 4, 28, 1, 100], ['F3', 12, 12, 42, 4, 0]]], [['F2', 28]]], ['generated mix 60', [[['F0', 0, 10, 40, 1, 24], ['F1', 3, 6, 30, 4, 100], ['F2', 4, 4, 4, 6, 100]]], [['F0', 24], ['F1', 24]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Stipulated min/max policy with whole-case moves only. 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-warehouse-slotting-pickface-replen-reserve-case-cap","generated_at":"2026-09-29T14:52:08.756759+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Min/max replenishment keeps forward pick faces stocked from reserve.","repair":"Cap quantity at the number of full cases in reserve times the case pack.","root_cause":"The reserve limit uses the raw unit count instead of full cases available.","sha256":"dea417fcef2c524c31a6195e0571e6e8dff73bbeebe9de1e356d79365f4cdb8b","title":"Replenishment: partial reserve case requested · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":46.912,"exit_code":1,"observations":[{"actual":[["A",1]],"check":"reserve partial case","expected":[["A",12]],"passed":false},{"actual":[["A",8]],"check":"at min triggers","expected":[["A",24]],"passed":false},{"actual":[],"check":"stockout small max","expected":[["B",6]],"passed":false},{"actual":[["Z",20],["Y",20],["X",20]],"check":"priority by ratio","expected":[["Z",40],["Y",35],["X",35]],"passed":false},{"actual":[],"check":"above min idle","expected":[],"passed":true},{"actual":[],"check":"stockout no reserve","expected":[],"passed":true},{"actual":[["F1",2]],"check":"generated mix 8","expected":[["F1",12]],"passed":false},{"actual":[["F1",3]],"check":"generated mix 16","expected":[["F1",3]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"reserve partial case\", \"actual\": [[\"A\", 1]], \"expected\": [[\"A\", 12]], \"passed\": false}, {\"check\": \"at min triggers\", \"actual\": [[\"A\", 8]], \"expected\": [[\"A\", 24]], \"passed\": false}, {\"check\": \"stockout small max\", \"actual\": [], \"expected\": [[\"B\", 6]], \"passed\": false}, {\"check\": \"priority by ratio\", \"actual\": [[\"Z\", 20], [\"Y\", 20], [\"X\", 20]], \"expected\": [[\"Z\", 40], [\"Y\", 35], [\"X\", 35]], \"passed\": false}, {\"check\": \"above min idle\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"stockout no reserve\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"generated mix 8\", \"actual\": [[\"F1\", 2]], \"expected\": [[\"F1\", 12]], \"passed\": false}, {\"check\": \"generated mix 16\", \"actual\": [[\"F1\", 3]], \"expected\": [[\"F1\", 3]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":49.664,"exit_code":1,"observations":[{"actual":[["A",20]],"check":"reserve partial case","expected":[["A",12]],"passed":false},{"actual":[["A",24]],"check":"at min triggers","expected":[["A",24]],"passed":true},{"actual":[["B",6]],"check":"stockout small max","expected":[["B",6]],"passed":true},{"actual":[["Z",40],["Y",35],["X",35]],"check":"priority by ratio","expected":[["Z",40],["Y",35],["X",35]],"passed":true},{"actual":[],"check":"above min idle","expected":[],"passed":true},{"actual":[["B",5]],"check":"stockout no reserve","expected":[],"passed":false},{"actual":[["F1",12]],"check":"generated mix 8","expected":[["F1",12]],"passed":true},{"actual":[["F1",3]],"check":"generated mix 16","expected":[["F1",3]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"reserve partial case\", \"actual\": [[\"A\", 20]], \"expected\": [[\"A\", 12]], \"passed\": false}, {\"check\": \"at min triggers\", \"actual\": [[\"A\", 24]], \"expected\": [[\"A\", 24]], \"passed\": true}, {\"check\": \"stockout small max\", \"actual\": [[\"B\", 6]], \"expected\": [[\"B\", 6]], \"passed\": true}, {\"check\": \"priority by ratio\", \"actual\": [[\"Z\", 40], [\"Y\", 35], [\"X\", 35]], \"expected\": [[\"Z\", 40], [\"Y\", 35], [\"X\", 35]], \"passed\": true}, {\"check\": \"above min idle\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"stockout no reserve\", \"actual\": [[\"B\", 5]], \"expected\": [], \"passed\": false}, {\"check\": \"generated mix 8\", \"actual\": [[\"F1\", 12]], \"expected\": [[\"F1\", 12]], \"passed\": true}, {\"check\": \"generated mix 16\", \"actual\": [[\"F1\", 3]], \"expected\": [[\"F1\", 3]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.329,"exit_code":0,"observations":[{"actual":[["A",12]],"check":"reserve partial case","expected":[["A",12]],"passed":true},{"actual":[["A",24]],"check":"at min triggers","expected":[["A",24]],"passed":true},{"actual":[["B",6]],"check":"stockout small max","expected":[["B",6]],"passed":true},{"actual":[["Z",40],["Y",35],["X",35]],"check":"priority by ratio","expected":[["Z",40],["Y",35],["X",35]],"passed":true},{"actual":[],"check":"above min idle","expected":[],"passed":true},{"actual":[],"check":"stockout no reserve","expected":[],"passed":true},{"actual":[["F1",12]],"check":"generated mix 8","expected":[["F1",12]],"passed":true},{"actual":[["F1",3]],"check":"generated mix 16","expected":[["F1",3]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"reserve partial case\", \"actual\": [[\"A\", 12]], \"expected\": [[\"A\", 12]], \"passed\": true}, {\"check\": \"at min triggers\", \"actual\": [[\"A\", 24]], \"expected\": [[\"A\", 24]], \"passed\": true}, {\"check\": \"stockout small max\", \"actual\": [[\"B\", 6]], \"expected\": [[\"B\", 6]], \"passed\": true}, {\"check\": \"priority by ratio\", \"actual\": [[\"Z\", 40], [\"Y\", 35], [\"X\", 35]], \"expected\": [[\"Z\", 40], [\"Y\", 35], [\"X\", 35]], \"passed\": true}, {\"check\": \"above min idle\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"stockout no reserve\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"generated mix 8\", \"actual\": [[\"F1\", 12]], \"expected\": [[\"F1\", 12]], \"passed\": true}, {\"check\": \"generated mix 16\", \"actual\": [[\"F1\", 3]], \"expected\": [[\"F1\", 3]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}