{"abstract":"Returned units create a duplicate layer with the same receipt sequence as an open layer.","category":"Inventory cost layering","checks":9,"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":"Merging into any layer with the same unit cost folds the units into a different receipt.","family":"w2-inventory-cost-layering-fifo-customer-returns-restock-layer-merge","id":"FA-60131","implementations":{"attempt":{"sha256":"ad59682fe6f6fdde8cd38db84a48cc552db760b9653e43344664d5ba4ddbcdd9","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[2] == t[2]]\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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 7], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 13, 7], 'layers': [[2, 4, 7]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 4, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 4, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 8], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 14, 8], 'layers': [[2, 4, 8]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 5, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 5, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 9], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 15, 9], 'layers': [[2, 4, 9]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 6, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 6, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 10], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 16, 10], 'layers': [[2, 4, 10]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 7, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 7, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 11], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 17, 11], 'layers': [[2, 4, 11]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 8, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 8, 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":"470695713390f438460afe85fe2be7d9aae7c5537fb54531e89e6acb267ed8b8","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 = []\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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 7], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 13, 7], 'layers': [[2, 4, 7]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 4, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 4, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 8], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 14, 8], 'layers': [[2, 4, 8]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 5, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 5, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 9], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 15, 9], 'layers': [[2, 4, 9]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 6, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 6, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 10], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 16, 10], 'layers': [[2, 4, 10]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 7, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 7, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 11], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 17, 11], 'layers': [[2, 4, 11]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 8, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 8, 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":"831608cc0ad2691709c1f1e71cb5e10d9ed81eb60b862848a25405f8672331e2","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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 7], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 13, 7], 'layers': [[2, 4, 7]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 4, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 4, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 8], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 14, 8], 'layers': [[2, 4, 8]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 5, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 5, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 9], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 15, 9], 'layers': [[2, 4, 9]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 6, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 6, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 10], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 16, 10], 'layers': [[2, 4, 10]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 7, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 7, 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]]}], ['merge into second layer', {'events': [['recv', 2, 3], ['recv', 4, 11], ['sale', 's1', 3], ['return', 's1', 1]]}, {'results': [1, 2, 17, 11], 'layers': [[2, 4, 11]]}], ['same price receipts', {'events': [['recv', 2, 5], ['recv', 8, 5], ['sale', 's1', 2], ['return', 's1', 1]]}, {'results': [1, 2, 10, 5], 'layers': [[1, 1, 5], [2, 8, 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-restock-layer-merge","generated_at":"2026-09-29T14:46:42.766598+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":"Add restored units to the open layer with the same receipt sequence.","root_cause":"The restock always creates a new layer instead of merging into the surviving layer of that receipt.","sha256":"bdd0efacf42e657b726c27a1efbc202ffdfcb494b33da9bf161e9d11cbb64d99","title":"FIFO costing with customer returns: restock layer merge · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.128,"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":[[2,4,7]],"results":[1,2,13,7]},"check":"merge into second layer","expected":{"layers":[[2,4,7]],"results":[1,2,13,7]},"passed":true},{"actual":{"layers":[[2,5,5]],"results":[1,2,10,5]},"check":"same price receipts","expected":{"layers":[[1,1,5],[2,4,5]],"results":[1,2,10,5]},"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\": \"merge into second layer\", \"actual\": {\"results\": [1, 2, 13, 7], \"layers\": [[2, 4, 7]]}, \"expected\": {\"results\": [1, 2, 13, 7], \"layers\": [[2, 4, 7]]}, \"passed\": true}, {\"check\": \"same price receipts\", \"actual\": {\"results\": [1, 2, 10, 5], \"layers\": [[2, 5, 5]]}, \"expected\": {\"results\": [1, 2, 10, 5], \"layers\": [[1, 1, 5], [2, 4, 5]]}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.974,"exit_code":1,"observations":[{"actual":{"layers":[[2,3,14],[2,2,14]],"results":[1,2,58,28]},"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,2,7],[1,1,7]],"results":[1,14,7,"rejected"]},"check":"over return","expected":{"layers":[[1,3,7]],"results":[1,14,7,"rejected"]},"passed":false},{"actual":{"layers":[],"results":[1,11,11,44]},"check":"restore into existing","expected":{"layers":[],"results":[1,11,11,44]},"passed":true},{"actual":{"layers":[[2,2,9],[2,1,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":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},{"actual":{"layers":[[2,3,7],[2,1,7]],"results":[1,2,13,7]},"check":"merge into second layer","expected":{"layers":[[2,4,7]],"results":[1,2,13,7]},"passed":false},{"actual":{"layers":[[1,1,5],[2,4,5]],"results":[1,2,10,5]},"check":"same price receipts","expected":{"layers":[[1,1,5],[2,4,5]],"results":[1,2,10,5]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"return last consumed\", \"actual\": {\"results\": [1, 2, 58, 28], \"layers\": [[2, 3, 14], [2, 2, 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, 2, 7], [1, 1, 7]]}, \"expected\": {\"results\": [1, 14, 7, \"rejected\"], \"layers\": [[1, 3, 7]]}, \"passed\": false}, {\"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, 2, 9], [2, 1, 9], [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}, {\"check\": \"merge into second layer\", \"actual\": {\"results\": [1, 2, 13, 7], \"layers\": [[2, 3, 7], [2, 1, 7]]}, \"expected\": {\"results\": [1, 2, 13, 7], \"layers\": [[2, 4, 7]]}, \"passed\": false}, {\"check\": \"same price receipts\", \"actual\": {\"results\": [1, 2, 10, 5], \"layers\": [[1, 1, 5], [2, 4, 5]]}, \"expected\": {\"results\": [1, 2, 10, 5], \"layers\": [[1, 1, 5], [2, 4, 5]]}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.598,"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,4,7]],"results":[1,2,13,7]},"check":"merge into second layer","expected":{"layers":[[2,4,7]],"results":[1,2,13,7]},"passed":true},{"actual":{"layers":[[1,1,5],[2,4,5]],"results":[1,2,10,5]},"check":"same price receipts","expected":{"layers":[[1,1,5],[2,4,5]],"results":[1,2,10,5]},"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\": \"merge into second layer\", \"actual\": {\"results\": [1, 2, 13, 7], \"layers\": [[2, 4, 7]]}, \"expected\": {\"results\": [1, 2, 13, 7], \"layers\": [[2, 4, 7]]}, \"passed\": true}, {\"check\": \"same price receipts\", \"actual\": {\"results\": [1, 2, 10, 5], \"layers\": [[1, 1, 5], [2, 4, 5]]}, \"expected\": {\"results\": [1, 2, 10, 5], \"layers\": [[1, 1, 5], [2, 4, 5]]}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}