{"abstract":"Returning the entire unreturned quantity of a sale is rejected.","category":"Inventory cost layering","checks":7,"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":"Allowing equality only for single-unit sales still rejects larger full returns.","family":"w2-inventory-cost-layering-fifo-customer-returns-returnable-quantity-boundary","id":"FA-60121","implementations":{"attempt":{"sha256":"ff6515bbc7a32beb17621b4eeb46dc165751f3fcf8251cb1c0cdb78788630cdd","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) or (q == sum(t[1] for t in took) and q > 1):\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]]}]], [['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]]}]], [['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]]}]], [['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]]}]], [['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]]}]]]\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":"36c296beda509317a4ceb73f420d6db7108ed5e67f8cf7ad3cbc094102b56d0d","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]]}]], [['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]]}]], [['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]]}]], [['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]]}]], [['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]]}]]]\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":"804045328ba66fc4aef6e12049c960722a280ab431dd428d82e14466a6f07017","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]]}]], [['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]]}]], [['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]]}]], [['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]]}]], [['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]]}]]]\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-returnable-quantity-boundary","generated_at":"2026-09-29T14:46:42.765494+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":"Reject only when the return exceeds the unreturned quantity.","root_cause":"The return cap uses >= so a return equal to the remaining sold quantity fails.","sha256":"6e849f52dfeb98ba06ac947804b30a3c0c36252af1d6602fb720f45753145734","title":"FIFO costing with customer returns: returnable quantity boundary · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.261,"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":[],"results":[1,2,100,"rejected"]},"check":"full return","expected":{"layers":[[1,2,20],[2,2,30]],"results":[1,2,100,100]},"passed":false},{"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":[[3,1,9]],"results":[1,2,3,19,"rejected",18]},"check":"restore gone layer","expected":{"layers":[[2,3,9],[3,1,9]],"results":[1,2,3,19,19,10]},"passed":false},{"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}],"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, \"rejected\"], \"layers\": []}, \"expected\": {\"results\": [1, 2, 100, 100], \"layers\": [[1, 2, 20], [2, 2, 30]]}, \"passed\": false}, {\"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, \"rejected\", 18], \"layers\": [[3, 1, 9]]}, \"expected\": {\"results\": [1, 2, 3, 19, 19, 10], \"layers\": [[2, 3, 9], [3, 1, 9]]}, \"passed\": false}, {\"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}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.12,"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":[],"results":[1,2,100,"rejected"]},"check":"full return","expected":{"layers":[[1,2,20],[2,2,30]],"results":[1,2,100,100]},"passed":false},{"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":[[1,3,11]],"results":[1,11,"rejected","short"]},"check":"restore into existing","expected":{"layers":[],"results":[1,11,11,44]},"passed":false},{"actual":{"layers":[[3,1,9]],"results":[1,2,3,19,"rejected",18]},"check":"restore gone layer","expected":{"layers":[[2,3,9],[3,1,9]],"results":[1,2,3,19,19,10]},"passed":false},{"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}],"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, \"rejected\"], \"layers\": []}, \"expected\": {\"results\": [1, 2, 100, 100], \"layers\": [[1, 2, 20], [2, 2, 30]]}, \"passed\": false}, {\"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, \"rejected\", \"short\"], \"layers\": [[1, 3, 11]]}, \"expected\": {\"results\": [1, 11, 11, 44], \"layers\": []}, \"passed\": false}, {\"check\": \"restore gone layer\", \"actual\": {\"results\": [1, 2, 3, 19, \"rejected\", 18], \"layers\": [[3, 1, 9]]}, \"expected\": {\"results\": [1, 2, 3, 19, 19, 10], \"layers\": [[2, 3, 9], [3, 1, 9]]}, \"passed\": false}, {\"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}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.023,"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}],"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}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}