{"abstract":"Issues are costed at the most recent receipt prices and the oldest layers linger on the balance sheet.","category":"Inventory cost layering","checks":8,"contract":"Input {layers:[[qty,unit_cost]] oldest first, events:[[\"recv\",qty,unit_cost]|[\"issue\",qty]]}. Issues consume the oldest layer first; an issue larger than on-hand is rejected whole and reported as \"short\"; a receipt at exactly the newest layer cost merges into it; receipts of zero or negative quantity are ignored. Return {cogs:[per-issue cost or \"short\"], layers}.","evaluation_group":"w2-inventory-cost-layering-fifo-perpetual","failed_approach":"Choosing the cheapest layer first is a different flow assumption and still misprices issues when the oldest layer is not the cheapest.","family":"w2-inventory-cost-layering-fifo-perpetual-oldest-layer-selection","id":"FA-59841","implementations":{"attempt":{"sha256":"2275a7605fe98e1f94d5c0e72cddf6c933109ab0fe24cc3c95b92302a9664538","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    layers = [list(l) for l in x['layers']]\n    out = []\n    for ev in x['events']:\n        if ev[0] == 'recv':\n            q, c = ev[1], ev[2]\n            if q <= 0:\n                continue\n            if layers and layers[-1][1] == c:\n                layers[-1][0] += q\n            else:\n                layers.append([q, c])\n            continue\n        need = ev[1]\n        onhand = sum(l[0] for l in layers)\n        if need > onhand:\n            out.append('short')\n            continue\n        cost = 0\n        while need > 0:\n            idx = min(range(len(layers)), key=lambda i: layers[i][1])\n            take = min(need, layers[idx][0])\n            cost += take * layers[idx][1]\n            layers[idx][0] -= take\n            need -= take\n            if layers[idx][0] == 0:\n                layers.pop(idx)\n        out.append(cost)\n    return {'cogs': out, 'layers': layers}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 8]]}, {'cogs': [860], 'layers': [[7, 120]]}], ['exact depletion', {'layers': [[4, 50], [1, 70]], 'events': [['issue', 5]]}, {'cogs': [270], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 4], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 13], ['issue', 4], ['recv', 1, 13]]}, {'cogs': [46], 'layers': [[4, 13]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 1, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[2, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 31], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [2, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': []}], ['price decline', {'layers': [[2, 61], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [122], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 9]]}, {'cogs': [980], 'layers': [[6, 120]]}], ['exact depletion', {'layers': [[4, 50], [2, 70]], 'events': [['issue', 6]]}, {'cogs': [340], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 5], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 14], ['issue', 4], ['recv', 1, 14]]}, {'cogs': [48], 'layers': [[4, 14]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 2, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[3, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 32], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [3, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[1, 9]]}], ['price decline', {'layers': [[2, 62], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [124], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 7]]}, {'cogs': [740], 'layers': [[8, 120]]}], ['exact depletion', {'layers': [[4, 50], [3, 70]], 'events': [['issue', 7]]}, {'cogs': [410], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 6], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 15], ['issue', 4], ['recv', 1, 15]]}, {'cogs': [50], 'layers': [[4, 15]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 3, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[4, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 33], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [4, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[2, 9]]}], ['price decline', {'layers': [[2, 63], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [126], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 8]]}, {'cogs': [860], 'layers': [[7, 120]]}], ['exact depletion', {'layers': [[4, 50], [4, 70]], 'events': [['issue', 8]]}, {'cogs': [480], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 7], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 16], ['issue', 4], ['recv', 1, 16]]}, {'cogs': [52], 'layers': [[4, 16]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 4, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[5, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 34], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [5, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[3, 9]]}], ['price decline', {'layers': [[2, 64], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [128], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 9]]}, {'cogs': [980], 'layers': [[6, 120]]}], ['exact depletion', {'layers': [[4, 50], [5, 70]], 'events': [['issue', 9]]}, {'cogs': [550], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 8], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 17], ['issue', 4], ['recv', 1, 17]]}, {'cogs': [54], 'layers': [[4, 17]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 5, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[6, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 35], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [6, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[4, 9]]}], ['price decline', {'layers': [[2, 65], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [130], 'layers': [[3, 45]]}]]]\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":"e579f35c3e49d34d9d136272d1aa250d00c6b34b9d48cd7f2c5d16fe6b882288","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    layers = [list(l) for l in x['layers']]\n    out = []\n    for ev in x['events']:\n        if ev[0] == 'recv':\n            q, c = ev[1], ev[2]\n            if q <= 0:\n                continue\n            if layers and layers[-1][1] == c:\n                layers[-1][0] += q\n            else:\n                layers.append([q, c])\n            continue\n        need = ev[1]\n        onhand = sum(l[0] for l in layers)\n        if need > onhand:\n            out.append('short')\n            continue\n        cost = 0\n        while need > 0:\n            idx = -1\n            take = min(need, layers[idx][0])\n            cost += take * layers[idx][1]\n            layers[idx][0] -= take\n            need -= take\n            if layers[idx][0] == 0:\n                layers.pop(idx)\n        out.append(cost)\n    return {'cogs': out, 'layers': layers}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 8]]}, {'cogs': [860], 'layers': [[7, 120]]}], ['exact depletion', {'layers': [[4, 50], [1, 70]], 'events': [['issue', 5]]}, {'cogs': [270], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 4], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 13], ['issue', 4], ['recv', 1, 13]]}, {'cogs': [46], 'layers': [[4, 13]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 1, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[2, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 31], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [2, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': []}], ['price decline', {'layers': [[2, 61], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [122], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 9]]}, {'cogs': [980], 'layers': [[6, 120]]}], ['exact depletion', {'layers': [[4, 50], [2, 70]], 'events': [['issue', 6]]}, {'cogs': [340], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 5], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 14], ['issue', 4], ['recv', 1, 14]]}, {'cogs': [48], 'layers': [[4, 14]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 2, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[3, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 32], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [3, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[1, 9]]}], ['price decline', {'layers': [[2, 62], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [124], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 7]]}, {'cogs': [740], 'layers': [[8, 120]]}], ['exact depletion', {'layers': [[4, 50], [3, 70]], 'events': [['issue', 7]]}, {'cogs': [410], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 6], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 15], ['issue', 4], ['recv', 1, 15]]}, {'cogs': [50], 'layers': [[4, 15]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 3, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[4, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 33], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [4, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[2, 9]]}], ['price decline', {'layers': [[2, 63], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [126], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 8]]}, {'cogs': [860], 'layers': [[7, 120]]}], ['exact depletion', {'layers': [[4, 50], [4, 70]], 'events': [['issue', 8]]}, {'cogs': [480], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 7], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 16], ['issue', 4], ['recv', 1, 16]]}, {'cogs': [52], 'layers': [[4, 16]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 4, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[5, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 34], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [5, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[3, 9]]}], ['price decline', {'layers': [[2, 64], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [128], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 9]]}, {'cogs': [980], 'layers': [[6, 120]]}], ['exact depletion', {'layers': [[4, 50], [5, 70]], 'events': [['issue', 9]]}, {'cogs': [550], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 8], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 17], ['issue', 4], ['recv', 1, 17]]}, {'cogs': [54], 'layers': [[4, 17]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 5, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[6, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 35], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [6, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[4, 9]]}], ['price decline', {'layers': [[2, 65], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [130], 'layers': [[3, 45]]}]]]\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":"4ac95cc4e78cf6202d12431b92177ea0b537e1b3ba1193bed2855f0433bc5a21","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    layers = [list(l) for l in x['layers']]\n    out = []\n    for ev in x['events']:\n        if ev[0] == 'recv':\n            q, c = ev[1], ev[2]\n            if q <= 0:\n                continue\n            if layers and layers[-1][1] == c:\n                layers[-1][0] += q\n            else:\n                layers.append([q, c])\n            continue\n        need = ev[1]\n        onhand = sum(l[0] for l in layers)\n        if need > onhand:\n            out.append('short')\n            continue\n        cost = 0\n        while need > 0:\n            idx = 0\n            take = min(need, layers[idx][0])\n            cost += take * layers[idx][1]\n            layers[idx][0] -= take\n            need -= take\n            if layers[idx][0] == 0:\n                layers.pop(idx)\n        out.append(cost)\n    return {'cogs': out, 'layers': layers}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 8]]}, {'cogs': [860], 'layers': [[7, 120]]}], ['exact depletion', {'layers': [[4, 50], [1, 70]], 'events': [['issue', 5]]}, {'cogs': [270], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 4], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 13], ['issue', 4], ['recv', 1, 13]]}, {'cogs': [46], 'layers': [[4, 13]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 1, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[2, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 31], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [2, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': []}], ['price decline', {'layers': [[2, 61], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [122], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 9]]}, {'cogs': [980], 'layers': [[6, 120]]}], ['exact depletion', {'layers': [[4, 50], [2, 70]], 'events': [['issue', 6]]}, {'cogs': [340], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 5], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 14], ['issue', 4], ['recv', 1, 14]]}, {'cogs': [48], 'layers': [[4, 14]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 2, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[3, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 32], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [3, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[1, 9]]}], ['price decline', {'layers': [[2, 62], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [124], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 7]]}, {'cogs': [740], 'layers': [[8, 120]]}], ['exact depletion', {'layers': [[4, 50], [3, 70]], 'events': [['issue', 7]]}, {'cogs': [410], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 6], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 15], ['issue', 4], ['recv', 1, 15]]}, {'cogs': [50], 'layers': [[4, 15]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 3, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[4, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 33], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [4, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[2, 9]]}], ['price decline', {'layers': [[2, 63], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [126], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 8]]}, {'cogs': [860], 'layers': [[7, 120]]}], ['exact depletion', {'layers': [[4, 50], [4, 70]], 'events': [['issue', 8]]}, {'cogs': [480], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 7], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 16], ['issue', 4], ['recv', 1, 16]]}, {'cogs': [52], 'layers': [[4, 16]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 4, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[5, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 34], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [5, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[3, 9]]}], ['price decline', {'layers': [[2, 64], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [128], 'layers': [[3, 45]]}]], [['span two layers', {'layers': [[5, 100], [10, 120]], 'events': [['issue', 9]]}, {'cogs': [980], 'layers': [[6, 120]]}], ['exact depletion', {'layers': [[4, 50], [5, 70]], 'events': [['issue', 9]]}, {'cogs': [550], 'layers': []}], ['short rejected', {'layers': [[3, 90]], 'events': [['issue', 8], ['issue', 2]]}, {'cogs': ['short', 180], 'layers': [[1, 90]]}], ['receipt then issue', {'layers': [[2, 10]], 'events': [['recv', 5, 17], ['issue', 4], ['recv', 1, 17]]}, {'cogs': [54], 'layers': [[4, 17]]}], ['same cost merge', {'layers': [[2, 40]], 'events': [['recv', 5, 40], ['recv', 3, 41], ['issue', 1]]}, {'cogs': [40], 'layers': [[6, 40], [3, 41]]}], ['zero receipt', {'layers': [[6, 25]], 'events': [['recv', 0, 35], ['issue', 2]]}, {'cogs': [50], 'layers': [[4, 25]]}], ['multi issue', {'layers': [[1, 5], [1, 7], [6, 9]], 'events': [['issue', 1], ['issue', 2], ['issue', 1]]}, {'cogs': [5, 16, 9], 'layers': [[4, 9]]}], ['price decline', {'layers': [[2, 65], [3, 45]], 'events': [['issue', 2]]}, {'cogs': [130], 'layers': [[3, 45]]}]]]\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 bounded teaching model with explicit toy rules; not an accounting-standard implementation. 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-inventory-cost-layering-fifo-perpetual-oldest-layer-selection","generated_at":"2026-09-29T14:46:40.126028+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Inventory valuation and cost-of-goods decisions depend on this rule.","repair":"Always consume from index 0, the oldest surviving layer.","root_cause":"The consumption index points at the tail of the layer list (newest receipt) instead of the head.","sha256":"33a4a0b13370ca3a65909efdac9943b68f6b53aa85630686bca15480041fcfbd","title":"FIFO perpetual issue: oldest layer selection · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.211,"exit_code":1,"observations":[{"actual":{"cogs":[860],"layers":[[7,120]]},"check":"span two layers","expected":{"cogs":[860],"layers":[[7,120]]},"passed":true},{"actual":{"cogs":[270],"layers":[]},"check":"exact depletion","expected":{"cogs":[270],"layers":[]},"passed":true},{"actual":{"cogs":["short",180],"layers":[[1,90]]},"check":"short rejected","expected":{"cogs":["short",180],"layers":[[1,90]]},"passed":true},{"actual":{"cogs":[46],"layers":[[4,13]]},"check":"receipt then issue","expected":{"cogs":[46],"layers":[[4,13]]},"passed":true},{"actual":{"cogs":[40],"layers":[[2,40],[3,41]]},"check":"same cost merge","expected":{"cogs":[40],"layers":[[2,40],[3,41]]},"passed":true},{"actual":{"cogs":[50],"layers":[[4,25]]},"check":"zero receipt","expected":{"cogs":[50],"layers":[[4,25]]},"passed":true},{"actual":{"cogs":[5,16,9],"layers":[]},"check":"multi issue","expected":{"cogs":[5,16,9],"layers":[]},"passed":true},{"actual":{"cogs":[90],"layers":[[2,61],[1,45]]},"check":"price decline","expected":{"cogs":[122],"layers":[[3,45]]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"span two layers\", \"actual\": {\"cogs\": [860], \"layers\": [[7, 120]]}, \"expected\": {\"cogs\": [860], \"layers\": [[7, 120]]}, \"passed\": true}, {\"check\": \"exact depletion\", \"actual\": {\"cogs\": [270], \"layers\": []}, \"expected\": {\"cogs\": [270], \"layers\": []}, \"passed\": true}, {\"check\": \"short rejected\", \"actual\": {\"cogs\": [\"short\", 180], \"layers\": [[1, 90]]}, \"expected\": {\"cogs\": [\"short\", 180], \"layers\": [[1, 90]]}, \"passed\": true}, {\"check\": \"receipt then issue\", \"actual\": {\"cogs\": [46], \"layers\": [[4, 13]]}, \"expected\": {\"cogs\": [46], \"layers\": [[4, 13]]}, \"passed\": true}, {\"check\": \"same cost merge\", \"actual\": {\"cogs\": [40], \"layers\": [[2, 40], [3, 41]]}, \"expected\": {\"cogs\": [40], \"layers\": [[2, 40], [3, 41]]}, \"passed\": true}, {\"check\": \"zero receipt\", \"actual\": {\"cogs\": [50], \"layers\": [[4, 25]]}, \"expected\": {\"cogs\": [50], \"layers\": [[4, 25]]}, \"passed\": true}, {\"check\": \"multi issue\", \"actual\": {\"cogs\": [5, 16, 9], \"layers\": []}, \"expected\": {\"cogs\": [5, 16, 9], \"layers\": []}, \"passed\": true}, {\"check\": \"price decline\", \"actual\": {\"cogs\": [90], \"layers\": [[2, 61], [1, 45]]}, \"expected\": {\"cogs\": [122], \"layers\": [[3, 45]]}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.949,"exit_code":1,"observations":[{"actual":{"cogs":[960],"layers":[[5,100],[2,120]]},"check":"span two layers","expected":{"cogs":[860],"layers":[[7,120]]},"passed":false},{"actual":{"cogs":[270],"layers":[]},"check":"exact depletion","expected":{"cogs":[270],"layers":[]},"passed":true},{"actual":{"cogs":["short",180],"layers":[[1,90]]},"check":"short rejected","expected":{"cogs":["short",180],"layers":[[1,90]]},"passed":true},{"actual":{"cogs":[52],"layers":[[2,10],[2,13]]},"check":"receipt then issue","expected":{"cogs":[46],"layers":[[4,13]]},"passed":false},{"actual":{"cogs":[41],"layers":[[3,40],[2,41]]},"check":"same cost merge","expected":{"cogs":[40],"layers":[[2,40],[3,41]]},"passed":false},{"actual":{"cogs":[50],"layers":[[4,25]]},"check":"zero receipt","expected":{"cogs":[50],"layers":[[4,25]]},"passed":true},{"actual":{"cogs":[9,16,5],"layers":[]},"check":"multi issue","expected":{"cogs":[5,16,9],"layers":[]},"passed":false},{"actual":{"cogs":[90],"layers":[[2,61],[1,45]]},"check":"price decline","expected":{"cogs":[122],"layers":[[3,45]]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"span two layers\", \"actual\": {\"cogs\": [960], \"layers\": [[5, 100], [2, 120]]}, \"expected\": {\"cogs\": [860], \"layers\": [[7, 120]]}, \"passed\": false}, {\"check\": \"exact depletion\", \"actual\": {\"cogs\": [270], \"layers\": []}, \"expected\": {\"cogs\": [270], \"layers\": []}, \"passed\": true}, {\"check\": \"short rejected\", \"actual\": {\"cogs\": [\"short\", 180], \"layers\": [[1, 90]]}, \"expected\": {\"cogs\": [\"short\", 180], \"layers\": [[1, 90]]}, \"passed\": true}, {\"check\": \"receipt then issue\", \"actual\": {\"cogs\": [52], \"layers\": [[2, 10], [2, 13]]}, \"expected\": {\"cogs\": [46], \"layers\": [[4, 13]]}, \"passed\": false}, {\"check\": \"same cost merge\", \"actual\": {\"cogs\": [41], \"layers\": [[3, 40], [2, 41]]}, \"expected\": {\"cogs\": [40], \"layers\": [[2, 40], [3, 41]]}, \"passed\": false}, {\"check\": \"zero receipt\", \"actual\": {\"cogs\": [50], \"layers\": [[4, 25]]}, \"expected\": {\"cogs\": [50], \"layers\": [[4, 25]]}, \"passed\": true}, {\"check\": \"multi issue\", \"actual\": {\"cogs\": [9, 16, 5], \"layers\": []}, \"expected\": {\"cogs\": [5, 16, 9], \"layers\": []}, \"passed\": false}, {\"check\": \"price decline\", \"actual\": {\"cogs\": [90], \"layers\": [[2, 61], [1, 45]]}, \"expected\": {\"cogs\": [122], \"layers\": [[3, 45]]}, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.62,"exit_code":0,"observations":[{"actual":{"cogs":[860],"layers":[[7,120]]},"check":"span two layers","expected":{"cogs":[860],"layers":[[7,120]]},"passed":true},{"actual":{"cogs":[270],"layers":[]},"check":"exact depletion","expected":{"cogs":[270],"layers":[]},"passed":true},{"actual":{"cogs":["short",180],"layers":[[1,90]]},"check":"short rejected","expected":{"cogs":["short",180],"layers":[[1,90]]},"passed":true},{"actual":{"cogs":[46],"layers":[[4,13]]},"check":"receipt then issue","expected":{"cogs":[46],"layers":[[4,13]]},"passed":true},{"actual":{"cogs":[40],"layers":[[2,40],[3,41]]},"check":"same cost merge","expected":{"cogs":[40],"layers":[[2,40],[3,41]]},"passed":true},{"actual":{"cogs":[50],"layers":[[4,25]]},"check":"zero receipt","expected":{"cogs":[50],"layers":[[4,25]]},"passed":true},{"actual":{"cogs":[5,16,9],"layers":[]},"check":"multi issue","expected":{"cogs":[5,16,9],"layers":[]},"passed":true},{"actual":{"cogs":[122],"layers":[[3,45]]},"check":"price decline","expected":{"cogs":[122],"layers":[[3,45]]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"span two layers\", \"actual\": {\"cogs\": [860], \"layers\": [[7, 120]]}, \"expected\": {\"cogs\": [860], \"layers\": [[7, 120]]}, \"passed\": true}, {\"check\": \"exact depletion\", \"actual\": {\"cogs\": [270], \"layers\": []}, \"expected\": {\"cogs\": [270], \"layers\": []}, \"passed\": true}, {\"check\": \"short rejected\", \"actual\": {\"cogs\": [\"short\", 180], \"layers\": [[1, 90]]}, \"expected\": {\"cogs\": [\"short\", 180], \"layers\": [[1, 90]]}, \"passed\": true}, {\"check\": \"receipt then issue\", \"actual\": {\"cogs\": [46], \"layers\": [[4, 13]]}, \"expected\": {\"cogs\": [46], \"layers\": [[4, 13]]}, \"passed\": true}, {\"check\": \"same cost merge\", \"actual\": {\"cogs\": [40], \"layers\": [[2, 40], [3, 41]]}, \"expected\": {\"cogs\": [40], \"layers\": [[2, 40], [3, 41]]}, \"passed\": true}, {\"check\": \"zero receipt\", \"actual\": {\"cogs\": [50], \"layers\": [[4, 25]]}, \"expected\": {\"cogs\": [50], \"layers\": [[4, 25]]}, \"passed\": true}, {\"check\": \"multi issue\", \"actual\": {\"cogs\": [5, 16, 9], \"layers\": []}, \"expected\": {\"cogs\": [5, 16, 9], \"layers\": []}, \"passed\": true}, {\"check\": \"price decline\", \"actual\": {\"cogs\": [122], \"layers\": [[3, 45]]}, \"expected\": {\"cogs\": [122], \"layers\": [[3, 45]]}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}