{"abstract":"A partial return is credited at the oldest layer cost of the sale instead of the units most recently shipped.","category":"Inventory cost layering","checks":8,"contract":"Events: [\"recv\",qty,cost] opens a layer with the next receipt sequence; [\"sale\",id,qty] consumes FIFO and records the pieces taken; [\"return\",id,qty] restocks units at the cost they left with, last-consumed piece first, into the layer with the same receipt sequence (recreated in sequence order if gone). Returns above the unreturned quantity of that sale are \"rejected\"; sales above stock are \"short\". Return {results, layers:[[seq,qty,cost]]}.","evaluation_group":"w2-inventory-cost-layering-fifo-customer-returns","failed_approach":"Matching the most expensive piece first coincides only when later layers cost more.","family":"w2-inventory-cost-layering-fifo-customer-returns-restock-piece-order","id":"FA-60116","implementations":{"attempt":{"sha256":"e3a578071db5f5a4dc3112ee82735ae0928e23bbae28c52ea17cad13e17d1ed7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    layers = []\n    seq = 0\n    sold = {}\n    out = []\n    for ev in x['events']:\n        if ev[0] == 'recv':\n            seq += 1\n            layers.append([seq, ev[1], ev[2]])\n            out.append(seq)\n        elif ev[0] == 'sale':\n            q = ev[2]\n            if q > sum(l[1] for l in layers):\n                out.append('short')\n                continue\n            took = []\n            cost = 0\n            while q > 0:\n                l = layers[0]\n                t = min(q, l[1])\n                took.append([l[0], t, l[2]])\n                cost += t * l[2]\n                l[1] -= t\n                q -= t\n                if l[1] == 0:\n                    layers.pop(0)\n            sold[ev[1]] = took\n            out.append(cost)\n        else:\n            took = sold.get(ev[1], [])\n            q = ev[2]\n            if q > sum(t[1] for t in took):\n                out.append('rejected')\n                continue\n            credit = 0\n            while q > 0:\n                j = max(range(len(took)), key=lambda i: took[i][2])\n                t = took[j]\n                r = min(q, t[1])\n                credit += r * t[2]\n                t[1] -= r\n                q -= r\n                if t[1] == 0:\n                    took.pop(j)\n                match = [l for l in layers if l[0] == t[0]]\n                if match:\n                    match[0][1] += r\n                else:\n                    layers.append([t[0], r, t[2]])\n                    layers.sort(key=lambda l: l[0])\n            out.append(credit)\n    return {'results': out, 'layers': layers}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 9], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 19, 19, 10], 'layers': [[2, 3, 9], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 3]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 21], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 142, 21], 'layers': [[2, 2, 21]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 10], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 20, 20, 10], 'layers': [[2, 3, 10], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 4]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 22], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 144, 22], 'layers': [[2, 2, 22]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 11], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 21, 21, 10], 'layers': [[2, 3, 11], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 5]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 23], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 146, 23], 'layers': [[2, 2, 23]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 12], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 22, 22, 10], 'layers': [[2, 3, 12], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 6]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 24], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 148, 24], 'layers': [[2, 2, 24]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 13], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 23, 23, 10], 'layers': [[2, 3, 13], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 7]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 25], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 150, 25], 'layers': [[2, 2, 25]]}]]]\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":"65687a8d78def7ebf349fe97bcbe8ae2303c0c2ecf92d36771ec03bad8c498b3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    layers = []\n    seq = 0\n    sold = {}\n    out = []\n    for ev in x['events']:\n        if ev[0] == 'recv':\n            seq += 1\n            layers.append([seq, ev[1], ev[2]])\n            out.append(seq)\n        elif ev[0] == 'sale':\n            q = ev[2]\n            if q > sum(l[1] for l in layers):\n                out.append('short')\n                continue\n            took = []\n            cost = 0\n            while q > 0:\n                l = layers[0]\n                t = min(q, l[1])\n                took.append([l[0], t, l[2]])\n                cost += t * l[2]\n                l[1] -= t\n                q -= t\n                if l[1] == 0:\n                    layers.pop(0)\n            sold[ev[1]] = took\n            out.append(cost)\n        else:\n            took = sold.get(ev[1], [])\n            q = ev[2]\n            if q > sum(t[1] for t in took):\n                out.append('rejected')\n                continue\n            credit = 0\n            while q > 0:\n                j = 0\n                t = took[j]\n                r = min(q, t[1])\n                credit += r * t[2]\n                t[1] -= r\n                q -= r\n                if t[1] == 0:\n                    took.pop(j)\n                match = [l for l in layers if l[0] == t[0]]\n                if match:\n                    match[0][1] += r\n                else:\n                    layers.append([t[0], r, t[2]])\n                    layers.sort(key=lambda l: l[0])\n            out.append(credit)\n    return {'results': out, 'layers': layers}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 9], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 19, 19, 10], 'layers': [[2, 3, 9], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 3]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 21], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 142, 21], 'layers': [[2, 2, 21]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 10], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 20, 20, 10], 'layers': [[2, 3, 10], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 4]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 22], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 144, 22], 'layers': [[2, 2, 22]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 11], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 21, 21, 10], 'layers': [[2, 3, 11], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 5]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 23], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 146, 23], 'layers': [[2, 2, 23]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 12], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 22, 22, 10], 'layers': [[2, 3, 12], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 6]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 24], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 148, 24], 'layers': [[2, 2, 24]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 13], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 23, 23, 10], 'layers': [[2, 3, 13], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 7]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 25], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 150, 25], 'layers': [[2, 2, 25]]}]]]\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":"c226ac2513b6bcaffb26c8272c563086ebe102ddfc0c153430d80d17eadac0f3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    layers = []\n    seq = 0\n    sold = {}\n    out = []\n    for ev in x['events']:\n        if ev[0] == 'recv':\n            seq += 1\n            layers.append([seq, ev[1], ev[2]])\n            out.append(seq)\n        elif ev[0] == 'sale':\n            q = ev[2]\n            if q > sum(l[1] for l in layers):\n                out.append('short')\n                continue\n            took = []\n            cost = 0\n            while q > 0:\n                l = layers[0]\n                t = min(q, l[1])\n                took.append([l[0], t, l[2]])\n                cost += t * l[2]\n                l[1] -= t\n                q -= t\n                if l[1] == 0:\n                    layers.pop(0)\n            sold[ev[1]] = took\n            out.append(cost)\n        else:\n            took = sold.get(ev[1], [])\n            q = ev[2]\n            if q > sum(t[1] for t in took):\n                out.append('rejected')\n                continue\n            credit = 0\n            while q > 0:\n                j = -1\n                t = took[j]\n                r = min(q, t[1])\n                credit += r * t[2]\n                t[1] -= r\n                q -= r\n                if t[1] == 0:\n                    took.pop(j)\n                match = [l for l in layers if l[0] == t[0]]\n                if match:\n                    match[0][1] += r\n                else:\n                    layers.append([t[0], r, t[2]])\n                    layers.sort(key=lambda l: l[0])\n            out.append(credit)\n    return {'results': out, 'layers': layers}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 9], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 19, 19, 10], 'layers': [[2, 3, 9], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 3]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 21], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 142, 21], 'layers': [[2, 2, 21]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 10], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 20, 20, 10], 'layers': [[2, 3, 10], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 4]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 22], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 144, 22], 'layers': [[2, 2, 22]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 11], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 21, 21, 10], 'layers': [[2, 3, 11], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 5]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 23], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 146, 23], 'layers': [[2, 2, 23]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 12], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 22, 22, 10], 'layers': [[2, 3, 12], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 6]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 24], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 148, 24], 'layers': [[2, 2, 24]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 13], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 23, 23, 10], 'layers': [[2, 3, 13], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 7]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 25], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 150, 25], 'layers': [[2, 2, 25]]}]]]\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-customer-returns-restock-piece-order","generated_at":"2026-09-29T14:46:42.677551+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":"Unwind the sale from its last-consumed piece first.","root_cause":"Returned units are matched to the first-consumed piece of the sale.","sha256":"df10ab914e5e35aa6cfea4c3aa29d4d6f7a595ed4fbc538062a0af8e803f0447","title":"FIFO costing with customer returns: restock piece order · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.318,"exit_code":1,"observations":[{"actual":{"layers":[[2,5,14]],"results":[1,2,58,28]},"check":"return last consumed","expected":{"layers":[[2,5,14]],"results":[1,2,58,28]},"passed":true},{"actual":{"layers":[[1,2,20],[2,2,30]],"results":[1,2,100,100]},"check":"full return","expected":{"layers":[[1,2,20],[2,2,30]],"results":[1,2,100,100]},"passed":true},{"actual":{"layers":[[1,3,7]],"results":[1,14,7,"rejected"]},"check":"over return","expected":{"layers":[[1,3,7]],"results":[1,14,7,"rejected"]},"passed":true},{"actual":{"layers":[],"results":[1,11,11,44]},"check":"restore into existing","expected":{"layers":[],"results":[1,11,11,44]},"passed":true},{"actual":{"layers":[[2,3,9],[3,1,9]],"results":[1,2,3,19,19,10]},"check":"restore gone layer","expected":{"layers":[[2,3,9],[3,1,9]],"results":[1,2,3,19,19,10]},"passed":true},{"actual":{"layers":[[1,2,5]],"results":[1,"rejected"]},"check":"unknown sale","expected":{"layers":[[1,2,5]],"results":[1,"rejected"]},"passed":true},{"actual":{"layers":[[1,1,5]],"results":[1,"short"]},"check":"short sale","expected":{"layers":[[1,1,5]],"results":[1,"short"]},"passed":true},{"actual":{"layers":[[1,1,50],[2,1,21]],"results":[1,2,142,50]},"check":"falling prices","expected":{"layers":[[2,2,21]],"results":[1,2,142,21]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"return last consumed\", \"actual\": {\"results\": [1, 2, 58, 28], \"layers\": [[2, 5, 14]]}, \"expected\": {\"results\": [1, 2, 58, 28], \"layers\": [[2, 5, 14]]}, \"passed\": true}, {\"check\": \"full return\", \"actual\": {\"results\": [1, 2, 100, 100], \"layers\": [[1, 2, 20], [2, 2, 30]]}, \"expected\": {\"results\": [1, 2, 100, 100], \"layers\": [[1, 2, 20], [2, 2, 30]]}, \"passed\": true}, {\"check\": \"over return\", \"actual\": {\"results\": [1, 14, 7, \"rejected\"], \"layers\": [[1, 3, 7]]}, \"expected\": {\"results\": [1, 14, 7, \"rejected\"], \"layers\": [[1, 3, 7]]}, \"passed\": true}, {\"check\": \"restore into existing\", \"actual\": {\"results\": [1, 11, 11, 44], \"layers\": []}, \"expected\": {\"results\": [1, 11, 11, 44], \"layers\": []}, \"passed\": true}, {\"check\": \"restore gone layer\", \"actual\": {\"results\": [1, 2, 3, 19, 19, 10], \"layers\": [[2, 3, 9], [3, 1, 9]]}, \"expected\": {\"results\": [1, 2, 3, 19, 19, 10], \"layers\": [[2, 3, 9], [3, 1, 9]]}, \"passed\": true}, {\"check\": \"unknown sale\", \"actual\": {\"results\": [1, \"rejected\"], \"layers\": [[1, 2, 5]]}, \"expected\": {\"results\": [1, \"rejected\"], \"layers\": [[1, 2, 5]]}, \"passed\": true}, {\"check\": \"short sale\", \"actual\": {\"results\": [1, \"short\"], \"layers\": [[1, 1, 5]]}, \"expected\": {\"results\": [1, \"short\"], \"layers\": [[1, 1, 5]]}, \"passed\": true}, {\"check\": \"falling prices\", \"actual\": {\"results\": [1, 2, 142, 50], \"layers\": [[1, 1, 50], [2, 1, 21]]}, \"expected\": {\"results\": [1, 2, 142, 21], \"layers\": [[2, 2, 21]]}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.245,"exit_code":1,"observations":[{"actual":{"layers":[[1,2,10],[2,3,14]],"results":[1,2,58,20]},"check":"return last consumed","expected":{"layers":[[2,5,14]],"results":[1,2,58,28]},"passed":false},{"actual":{"layers":[[1,2,20],[2,2,30]],"results":[1,2,100,100]},"check":"full return","expected":{"layers":[[1,2,20],[2,2,30]],"results":[1,2,100,100]},"passed":true},{"actual":{"layers":[[1,3,7]],"results":[1,14,7,"rejected"]},"check":"over return","expected":{"layers":[[1,3,7]],"results":[1,14,7,"rejected"]},"passed":true},{"actual":{"layers":[],"results":[1,11,11,44]},"check":"restore into existing","expected":{"layers":[],"results":[1,11,11,44]},"passed":true},{"actual":{"layers":[[2,3,9],[3,1,9]],"results":[1,2,3,19,19,10]},"check":"restore gone layer","expected":{"layers":[[2,3,9],[3,1,9]],"results":[1,2,3,19,19,10]},"passed":true},{"actual":{"layers":[[1,2,5]],"results":[1,"rejected"]},"check":"unknown sale","expected":{"layers":[[1,2,5]],"results":[1,"rejected"]},"passed":true},{"actual":{"layers":[[1,1,5]],"results":[1,"short"]},"check":"short sale","expected":{"layers":[[1,1,5]],"results":[1,"short"]},"passed":true},{"actual":{"layers":[[1,1,50],[2,1,21]],"results":[1,2,142,50]},"check":"falling prices","expected":{"layers":[[2,2,21]],"results":[1,2,142,21]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"return last consumed\", \"actual\": {\"results\": [1, 2, 58, 20], \"layers\": [[1, 2, 10], [2, 3, 14]]}, \"expected\": {\"results\": [1, 2, 58, 28], \"layers\": [[2, 5, 14]]}, \"passed\": false}, {\"check\": \"full return\", \"actual\": {\"results\": [1, 2, 100, 100], \"layers\": [[1, 2, 20], [2, 2, 30]]}, \"expected\": {\"results\": [1, 2, 100, 100], \"layers\": [[1, 2, 20], [2, 2, 30]]}, \"passed\": true}, {\"check\": \"over return\", \"actual\": {\"results\": [1, 14, 7, \"rejected\"], \"layers\": [[1, 3, 7]]}, \"expected\": {\"results\": [1, 14, 7, \"rejected\"], \"layers\": [[1, 3, 7]]}, \"passed\": true}, {\"check\": \"restore into existing\", \"actual\": {\"results\": [1, 11, 11, 44], \"layers\": []}, \"expected\": {\"results\": [1, 11, 11, 44], \"layers\": []}, \"passed\": true}, {\"check\": \"restore gone layer\", \"actual\": {\"results\": [1, 2, 3, 19, 19, 10], \"layers\": [[2, 3, 9], [3, 1, 9]]}, \"expected\": {\"results\": [1, 2, 3, 19, 19, 10], \"layers\": [[2, 3, 9], [3, 1, 9]]}, \"passed\": true}, {\"check\": \"unknown sale\", \"actual\": {\"results\": [1, \"rejected\"], \"layers\": [[1, 2, 5]]}, \"expected\": {\"results\": [1, \"rejected\"], \"layers\": [[1, 2, 5]]}, \"passed\": true}, {\"check\": \"short sale\", \"actual\": {\"results\": [1, \"short\"], \"layers\": [[1, 1, 5]]}, \"expected\": {\"results\": [1, \"short\"], \"layers\": [[1, 1, 5]]}, \"passed\": true}, {\"check\": \"falling prices\", \"actual\": {\"results\": [1, 2, 142, 50], \"layers\": [[1, 1, 50], [2, 1, 21]]}, \"expected\": {\"results\": [1, 2, 142, 21], \"layers\": [[2, 2, 21]]}, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.667,"exit_code":0,"observations":[{"actual":{"layers":[[2,5,14]],"results":[1,2,58,28]},"check":"return last consumed","expected":{"layers":[[2,5,14]],"results":[1,2,58,28]},"passed":true},{"actual":{"layers":[[1,2,20],[2,2,30]],"results":[1,2,100,100]},"check":"full return","expected":{"layers":[[1,2,20],[2,2,30]],"results":[1,2,100,100]},"passed":true},{"actual":{"layers":[[1,3,7]],"results":[1,14,7,"rejected"]},"check":"over return","expected":{"layers":[[1,3,7]],"results":[1,14,7,"rejected"]},"passed":true},{"actual":{"layers":[],"results":[1,11,11,44]},"check":"restore into existing","expected":{"layers":[],"results":[1,11,11,44]},"passed":true},{"actual":{"layers":[[2,3,9],[3,1,9]],"results":[1,2,3,19,19,10]},"check":"restore gone layer","expected":{"layers":[[2,3,9],[3,1,9]],"results":[1,2,3,19,19,10]},"passed":true},{"actual":{"layers":[[1,2,5]],"results":[1,"rejected"]},"check":"unknown sale","expected":{"layers":[[1,2,5]],"results":[1,"rejected"]},"passed":true},{"actual":{"layers":[[1,1,5]],"results":[1,"short"]},"check":"short sale","expected":{"layers":[[1,1,5]],"results":[1,"short"]},"passed":true},{"actual":{"layers":[[2,2,21]],"results":[1,2,142,21]},"check":"falling prices","expected":{"layers":[[2,2,21]],"results":[1,2,142,21]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"return last consumed\", \"actual\": {\"results\": [1, 2, 58, 28], \"layers\": [[2, 5, 14]]}, \"expected\": {\"results\": [1, 2, 58, 28], \"layers\": [[2, 5, 14]]}, \"passed\": true}, {\"check\": \"full return\", \"actual\": {\"results\": [1, 2, 100, 100], \"layers\": [[1, 2, 20], [2, 2, 30]]}, \"expected\": {\"results\": [1, 2, 100, 100], \"layers\": [[1, 2, 20], [2, 2, 30]]}, \"passed\": true}, {\"check\": \"over return\", \"actual\": {\"results\": [1, 14, 7, \"rejected\"], \"layers\": [[1, 3, 7]]}, \"expected\": {\"results\": [1, 14, 7, \"rejected\"], \"layers\": [[1, 3, 7]]}, \"passed\": true}, {\"check\": \"restore into existing\", \"actual\": {\"results\": [1, 11, 11, 44], \"layers\": []}, \"expected\": {\"results\": [1, 11, 11, 44], \"layers\": []}, \"passed\": true}, {\"check\": \"restore gone layer\", \"actual\": {\"results\": [1, 2, 3, 19, 19, 10], \"layers\": [[2, 3, 9], [3, 1, 9]]}, \"expected\": {\"results\": [1, 2, 3, 19, 19, 10], \"layers\": [[2, 3, 9], [3, 1, 9]]}, \"passed\": true}, {\"check\": \"unknown sale\", \"actual\": {\"results\": [1, \"rejected\"], \"layers\": [[1, 2, 5]]}, \"expected\": {\"results\": [1, \"rejected\"], \"layers\": [[1, 2, 5]]}, \"passed\": true}, {\"check\": \"short sale\", \"actual\": {\"results\": [1, \"short\"], \"layers\": [[1, 1, 5]]}, \"expected\": {\"results\": [1, \"short\"], \"layers\": [[1, 1, 5]]}, \"passed\": true}, {\"check\": \"falling prices\", \"actual\": {\"results\": [1, 2, 142, 21], \"layers\": [[2, 2, 21]]}, \"expected\": {\"results\": [1, 2, 142, 21], \"layers\": [[2, 2, 21]]}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}