{"abstract":"Events with equal timestamps are applied in delivery order, so a redeem can be rejected before its funding earn.","category":"Loyalty points ledgers","checks":8,"contract":"Input {events:[{id,ts,type:\"earn\"|\"redeem\"|\"reverse\",pts,ref}]}. Duplicate ids are dropped keeping the first delivery in input order; survivors are applied sorted by (ts,id). Redeem requires balance >= pts or is rejected. Reverse undoes an applied earn or redeem once; unknown, rejected, already reversed, or reverse targets are rejected. Return {balance, rejected, applied}.","evaluation_group":"w2-loyalty-points-ledgers-idempotent-ledger","failed_approach":"Sorting by id alone ignores timestamps entirely.","family":"w2-loyalty-points-ledgers-idempotent-ledger-timestamp-tie-ordering","id":"FA-60621","implementations":{"attempt":{"sha256":"71f5c40e3ecab3a457a9e9942dfc2dc2b3928fbea512efe93b50ce892ca12981","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    seen = set()\n    evs = []\n    for e in x['events']:\n        if e['id'] in seen:\n            continue\n        seen.add(e['id'])\n        evs.append(e)\n    evs.sort(key=lambda e: e['id'])\n    bal = 0\n    applied = {}\n    undone = set()\n    rej = []\n    order = []\n    for e in evs:\n        t = e['type']\n        if t == 'earn':\n            bal += e['pts']\n            applied[e['id']] = e['pts']\n        elif t == 'redeem':\n            if e['pts'] > bal:\n                rej.append(e['id'])\n                continue\n            bal -= e['pts']\n            applied[e['id']] = -e['pts']\n        else:\n            r = e['ref']\n            if r not in applied or r in undone:\n                rej.append(e['id'])\n                continue\n            bal -= applied[r]\n            undone.add(r)\n        order.append(e['id'])\n    return {'balance': bal, 'rejected': rej, 'applied': order}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 101, 'ref': None}]}, {'balance': 51, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 151, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 81, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 61, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 51, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 31, 'ref': None}]}, {'balance': 1, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 5, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 5, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 31, 'ref': None}]}, {'balance': 11, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 102, 'ref': None}]}, {'balance': 52, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 152, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 82, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 62, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 52, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 32, 'ref': None}]}, {'balance': 2, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 10, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 32, 'ref': None}]}, {'balance': 12, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 103, 'ref': None}]}, {'balance': 53, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 153, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 83, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 63, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 53, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 33, 'ref': None}]}, {'balance': 3, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 15, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 15, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 33, 'ref': None}]}, {'balance': 13, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 104, 'ref': None}]}, {'balance': 54, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 154, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 84, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 64, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 54, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 34, 'ref': None}]}, {'balance': 4, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 20, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 20, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 34, 'ref': None}]}, {'balance': 14, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 105, 'ref': None}]}, {'balance': 55, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 155, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 85, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 65, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 55, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 35, 'ref': None}]}, {'balance': 5, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 25, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 25, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 35, 'ref': None}]}, {'balance': 15, 'rejected': [], 'applied': ['b', 'a']}]]]\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":"441724358a85559ee401852b23648b15d2ba572c9002942910cb20b2f82ec51d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    seen = set()\n    evs = []\n    for e in x['events']:\n        if e['id'] in seen:\n            continue\n        seen.add(e['id'])\n        evs.append(e)\n    evs.sort(key=lambda e: e['ts'])\n    bal = 0\n    applied = {}\n    undone = set()\n    rej = []\n    order = []\n    for e in evs:\n        t = e['type']\n        if t == 'earn':\n            bal += e['pts']\n            applied[e['id']] = e['pts']\n        elif t == 'redeem':\n            if e['pts'] > bal:\n                rej.append(e['id'])\n                continue\n            bal -= e['pts']\n            applied[e['id']] = -e['pts']\n        else:\n            r = e['ref']\n            if r not in applied or r in undone:\n                rej.append(e['id'])\n                continue\n            bal -= applied[r]\n            undone.add(r)\n        order.append(e['id'])\n    return {'balance': bal, 'rejected': rej, 'applied': order}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 101, 'ref': None}]}, {'balance': 51, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 151, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 81, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 61, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 51, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 31, 'ref': None}]}, {'balance': 1, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 5, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 5, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 31, 'ref': None}]}, {'balance': 11, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 102, 'ref': None}]}, {'balance': 52, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 152, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 82, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 62, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 52, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 32, 'ref': None}]}, {'balance': 2, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 10, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 32, 'ref': None}]}, {'balance': 12, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 103, 'ref': None}]}, {'balance': 53, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 153, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 83, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 63, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 53, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 33, 'ref': None}]}, {'balance': 3, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 15, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 15, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 33, 'ref': None}]}, {'balance': 13, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 104, 'ref': None}]}, {'balance': 54, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 154, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 84, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 64, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 54, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 34, 'ref': None}]}, {'balance': 4, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 20, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 20, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 34, 'ref': None}]}, {'balance': 14, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 105, 'ref': None}]}, {'balance': 55, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 155, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 85, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 65, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 55, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 35, 'ref': None}]}, {'balance': 5, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 25, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 25, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 35, 'ref': None}]}, {'balance': 15, 'rejected': [], 'applied': ['b', 'a']}]]]\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":"2aad8b06937f39ff25ad3d727b534ec5ff1e3ffbe9141d8097268bc76dc67d76","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    seen = set()\n    evs = []\n    for e in x['events']:\n        if e['id'] in seen:\n            continue\n        seen.add(e['id'])\n        evs.append(e)\n    evs.sort(key=lambda e: (e['ts'], e['id']))\n    bal = 0\n    applied = {}\n    undone = set()\n    rej = []\n    order = []\n    for e in evs:\n        t = e['type']\n        if t == 'earn':\n            bal += e['pts']\n            applied[e['id']] = e['pts']\n        elif t == 'redeem':\n            if e['pts'] > bal:\n                rej.append(e['id'])\n                continue\n            bal -= e['pts']\n            applied[e['id']] = -e['pts']\n        else:\n            r = e['ref']\n            if r not in applied or r in undone:\n                rej.append(e['id'])\n                continue\n            bal -= applied[r]\n            undone.add(r)\n        order.append(e['id'])\n    return {'balance': bal, 'rejected': rej, 'applied': order}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 101, 'ref': None}]}, {'balance': 51, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 151, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 81, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 61, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 51, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 31, 'ref': None}]}, {'balance': 1, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 5, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 5, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 31, 'ref': None}]}, {'balance': 11, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 102, 'ref': None}]}, {'balance': 52, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 152, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 82, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 62, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 52, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 32, 'ref': None}]}, {'balance': 2, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 10, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 32, 'ref': None}]}, {'balance': 12, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 103, 'ref': None}]}, {'balance': 53, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 153, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 83, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 63, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 53, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 33, 'ref': None}]}, {'balance': 3, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 15, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 15, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 33, 'ref': None}]}, {'balance': 13, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 104, 'ref': None}]}, {'balance': 54, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 154, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 84, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 64, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 54, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 34, 'ref': None}]}, {'balance': 4, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 20, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 20, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 34, 'ref': None}]}, {'balance': 14, 'rejected': [], 'applied': ['b', 'a']}]], [['out of order', {'events': [{'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 50, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 105, 'ref': None}]}, {'balance': 55, 'rejected': [], 'applied': ['e1', 'e2']}], ['duplicate delivery', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e1', 'ts': 9, 'type': 'earn', 'pts': 100, 'ref': None}, {'id': 'e2', 'ts': 5, 'type': 'redeem', 'pts': 155, 'ref': None}]}, {'balance': 100, 'rejected': ['e2'], 'applied': ['e1']}], ['reverse redemption', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 200, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 85, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 200, 'rejected': [], 'applied': ['e1', 'e2', 'e3']}], ['double reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 65, 'ref': None}, {'id': 'r1', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r2', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e1'}, {'id': 'r3', 'ts': 4, 'type': 'reverse', 'pts': 0, 'ref': 'r1'}]}, {'balance': 0, 'rejected': ['r2', 'r3'], 'applied': ['e1', 'r1']}], ['reverse rejected redeem', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 10, 'ref': None}, {'id': 'e2', 'ts': 2, 'type': 'redeem', 'pts': 55, 'ref': None}, {'id': 'e3', 'ts': 3, 'type': 'reverse', 'pts': 0, 'ref': 'e2'}]}, {'balance': 10, 'rejected': ['e2', 'e3'], 'applied': ['e1']}], ['same timestamp', {'events': [{'id': 'b', 'ts': 7, 'type': 'redeem', 'pts': 30, 'ref': None}, {'id': 'a', 'ts': 7, 'type': 'earn', 'pts': 35, 'ref': None}]}, {'balance': 5, 'rejected': [], 'applied': ['a', 'b']}], ['unknown reverse', {'events': [{'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 25, 'ref': None}, {'id': 'x', 'ts': 2, 'type': 'reverse', 'pts': 0, 'ref': 'nope'}]}, {'balance': 25, 'rejected': ['x'], 'applied': ['e1']}], ['ids against time', {'events': [{'id': 'a', 'ts': 9, 'type': 'redeem', 'pts': 20, 'ref': None}, {'id': 'b', 'ts': 2, 'type': 'earn', 'pts': 35, 'ref': None}]}, {'balance': 15, 'rejected': [], 'applied': ['b', 'a']}]]]\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 loyalty-program model with explicit toy rules; not any real program terms. 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-loyalty-points-ledgers-idempotent-ledger-timestamp-tie-ordering","generated_at":"2026-09-29T14:46:47.319073+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Member point balances, statements and the program liability depend on this ledger rule.","repair":"Sort by (ts, id).","root_cause":"Sorting uses the timestamp alone and relies on delivery order for ties.","sha256":"2f89a095cd53cdd5f89e5e853aba98618c1c6fdbc60b0804a012a85f1ca1da7f","title":"Idempotent points event ledger: timestamp tie ordering · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.354,"exit_code":1,"observations":[{"actual":{"applied":["e1","e2"],"balance":51,"rejected":[]},"check":"out of order","expected":{"applied":["e1","e2"],"balance":51,"rejected":[]},"passed":true},{"actual":{"applied":["e1"],"balance":100,"rejected":["e2"]},"check":"duplicate delivery","expected":{"applied":["e1"],"balance":100,"rejected":["e2"]},"passed":true},{"actual":{"applied":["e1","e2","e3"],"balance":200,"rejected":[]},"check":"reverse redemption","expected":{"applied":["e1","e2","e3"],"balance":200,"rejected":[]},"passed":true},{"actual":{"applied":["e1","r1"],"balance":0,"rejected":["r2","r3"]},"check":"double reverse","expected":{"applied":["e1","r1"],"balance":0,"rejected":["r2","r3"]},"passed":true},{"actual":{"applied":["e1"],"balance":10,"rejected":["e2","e3"]},"check":"reverse rejected redeem","expected":{"applied":["e1"],"balance":10,"rejected":["e2","e3"]},"passed":true},{"actual":{"applied":["a","b"],"balance":1,"rejected":[]},"check":"same timestamp","expected":{"applied":["a","b"],"balance":1,"rejected":[]},"passed":true},{"actual":{"applied":["e1"],"balance":5,"rejected":["x"]},"check":"unknown reverse","expected":{"applied":["e1"],"balance":5,"rejected":["x"]},"passed":true},{"actual":{"applied":["b"],"balance":31,"rejected":["a"]},"check":"ids against time","expected":{"applied":["b","a"],"balance":11,"rejected":[]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"out of order\", \"actual\": {\"balance\": 51, \"rejected\": [], \"applied\": [\"e1\", \"e2\"]}, \"expected\": {\"balance\": 51, \"rejected\": [], \"applied\": [\"e1\", \"e2\"]}, \"passed\": true}, {\"check\": \"duplicate delivery\", \"actual\": {\"balance\": 100, \"rejected\": [\"e2\"], \"applied\": [\"e1\"]}, \"expected\": {\"balance\": 100, \"rejected\": [\"e2\"], \"applied\": [\"e1\"]}, \"passed\": true}, {\"check\": \"reverse redemption\", \"actual\": {\"balance\": 200, \"rejected\": [], \"applied\": [\"e1\", \"e2\", \"e3\"]}, \"expected\": {\"balance\": 200, \"rejected\": [], \"applied\": [\"e1\", \"e2\", \"e3\"]}, \"passed\": true}, {\"check\": \"double reverse\", \"actual\": {\"balance\": 0, \"rejected\": [\"r2\", \"r3\"], \"applied\": [\"e1\", \"r1\"]}, \"expected\": {\"balance\": 0, \"rejected\": [\"r2\", \"r3\"], \"applied\": [\"e1\", \"r1\"]}, \"passed\": true}, {\"check\": \"reverse rejected redeem\", \"actual\": {\"balance\": 10, \"rejected\": [\"e2\", \"e3\"], \"applied\": [\"e1\"]}, \"expected\": {\"balance\": 10, \"rejected\": [\"e2\", \"e3\"], \"applied\": [\"e1\"]}, \"passed\": true}, {\"check\": \"same timestamp\", \"actual\": {\"balance\": 1, \"rejected\": [], \"applied\": [\"a\", \"b\"]}, \"expected\": {\"balance\": 1, \"rejected\": [], \"applied\": [\"a\", \"b\"]}, \"passed\": true}, {\"check\": \"unknown reverse\", \"actual\": {\"balance\": 5, \"rejected\": [\"x\"], \"applied\": [\"e1\"]}, \"expected\": {\"balance\": 5, \"rejected\": [\"x\"], \"applied\": [\"e1\"]}, \"passed\": true}, {\"check\": \"ids against time\", \"actual\": {\"balance\": 31, \"rejected\": [\"a\"], \"applied\": [\"b\"]}, \"expected\": {\"balance\": 11, \"rejected\": [], \"applied\": [\"b\", \"a\"]}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.825,"exit_code":1,"observations":[{"actual":{"applied":["e1","e2"],"balance":51,"rejected":[]},"check":"out of order","expected":{"applied":["e1","e2"],"balance":51,"rejected":[]},"passed":true},{"actual":{"applied":["e1"],"balance":100,"rejected":["e2"]},"check":"duplicate delivery","expected":{"applied":["e1"],"balance":100,"rejected":["e2"]},"passed":true},{"actual":{"applied":["e1","e2","e3"],"balance":200,"rejected":[]},"check":"reverse redemption","expected":{"applied":["e1","e2","e3"],"balance":200,"rejected":[]},"passed":true},{"actual":{"applied":["e1","r1"],"balance":0,"rejected":["r2","r3"]},"check":"double reverse","expected":{"applied":["e1","r1"],"balance":0,"rejected":["r2","r3"]},"passed":true},{"actual":{"applied":["e1"],"balance":10,"rejected":["e2","e3"]},"check":"reverse rejected redeem","expected":{"applied":["e1"],"balance":10,"rejected":["e2","e3"]},"passed":true},{"actual":{"applied":["a"],"balance":31,"rejected":["b"]},"check":"same timestamp","expected":{"applied":["a","b"],"balance":1,"rejected":[]},"passed":false},{"actual":{"applied":["e1"],"balance":5,"rejected":["x"]},"check":"unknown reverse","expected":{"applied":["e1"],"balance":5,"rejected":["x"]},"passed":true},{"actual":{"applied":["b","a"],"balance":11,"rejected":[]},"check":"ids against time","expected":{"applied":["b","a"],"balance":11,"rejected":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"out of order\", \"actual\": {\"balance\": 51, \"rejected\": [], \"applied\": [\"e1\", \"e2\"]}, \"expected\": {\"balance\": 51, \"rejected\": [], \"applied\": [\"e1\", \"e2\"]}, \"passed\": true}, {\"check\": \"duplicate delivery\", \"actual\": {\"balance\": 100, \"rejected\": [\"e2\"], \"applied\": [\"e1\"]}, \"expected\": {\"balance\": 100, \"rejected\": [\"e2\"], \"applied\": [\"e1\"]}, \"passed\": true}, {\"check\": \"reverse redemption\", \"actual\": {\"balance\": 200, \"rejected\": [], \"applied\": [\"e1\", \"e2\", \"e3\"]}, \"expected\": {\"balance\": 200, \"rejected\": [], \"applied\": [\"e1\", \"e2\", \"e3\"]}, \"passed\": true}, {\"check\": \"double reverse\", \"actual\": {\"balance\": 0, \"rejected\": [\"r2\", \"r3\"], \"applied\": [\"e1\", \"r1\"]}, \"expected\": {\"balance\": 0, \"rejected\": [\"r2\", \"r3\"], \"applied\": [\"e1\", \"r1\"]}, \"passed\": true}, {\"check\": \"reverse rejected redeem\", \"actual\": {\"balance\": 10, \"rejected\": [\"e2\", \"e3\"], \"applied\": [\"e1\"]}, \"expected\": {\"balance\": 10, \"rejected\": [\"e2\", \"e3\"], \"applied\": [\"e1\"]}, \"passed\": true}, {\"check\": \"same timestamp\", \"actual\": {\"balance\": 31, \"rejected\": [\"b\"], \"applied\": [\"a\"]}, \"expected\": {\"balance\": 1, \"rejected\": [], \"applied\": [\"a\", \"b\"]}, \"passed\": false}, {\"check\": \"unknown reverse\", \"actual\": {\"balance\": 5, \"rejected\": [\"x\"], \"applied\": [\"e1\"]}, \"expected\": {\"balance\": 5, \"rejected\": [\"x\"], \"applied\": [\"e1\"]}, \"passed\": true}, {\"check\": \"ids against time\", \"actual\": {\"balance\": 11, \"rejected\": [], \"applied\": [\"b\", \"a\"]}, \"expected\": {\"balance\": 11, \"rejected\": [], \"applied\": [\"b\", \"a\"]}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.545,"exit_code":0,"observations":[{"actual":{"applied":["e1","e2"],"balance":51,"rejected":[]},"check":"out of order","expected":{"applied":["e1","e2"],"balance":51,"rejected":[]},"passed":true},{"actual":{"applied":["e1"],"balance":100,"rejected":["e2"]},"check":"duplicate delivery","expected":{"applied":["e1"],"balance":100,"rejected":["e2"]},"passed":true},{"actual":{"applied":["e1","e2","e3"],"balance":200,"rejected":[]},"check":"reverse redemption","expected":{"applied":["e1","e2","e3"],"balance":200,"rejected":[]},"passed":true},{"actual":{"applied":["e1","r1"],"balance":0,"rejected":["r2","r3"]},"check":"double reverse","expected":{"applied":["e1","r1"],"balance":0,"rejected":["r2","r3"]},"passed":true},{"actual":{"applied":["e1"],"balance":10,"rejected":["e2","e3"]},"check":"reverse rejected redeem","expected":{"applied":["e1"],"balance":10,"rejected":["e2","e3"]},"passed":true},{"actual":{"applied":["a","b"],"balance":1,"rejected":[]},"check":"same timestamp","expected":{"applied":["a","b"],"balance":1,"rejected":[]},"passed":true},{"actual":{"applied":["e1"],"balance":5,"rejected":["x"]},"check":"unknown reverse","expected":{"applied":["e1"],"balance":5,"rejected":["x"]},"passed":true},{"actual":{"applied":["b","a"],"balance":11,"rejected":[]},"check":"ids against time","expected":{"applied":["b","a"],"balance":11,"rejected":[]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"out of order\", \"actual\": {\"balance\": 51, \"rejected\": [], \"applied\": [\"e1\", \"e2\"]}, \"expected\": {\"balance\": 51, \"rejected\": [], \"applied\": [\"e1\", \"e2\"]}, \"passed\": true}, {\"check\": \"duplicate delivery\", \"actual\": {\"balance\": 100, \"rejected\": [\"e2\"], \"applied\": [\"e1\"]}, \"expected\": {\"balance\": 100, \"rejected\": [\"e2\"], \"applied\": [\"e1\"]}, \"passed\": true}, {\"check\": \"reverse redemption\", \"actual\": {\"balance\": 200, \"rejected\": [], \"applied\": [\"e1\", \"e2\", \"e3\"]}, \"expected\": {\"balance\": 200, \"rejected\": [], \"applied\": [\"e1\", \"e2\", \"e3\"]}, \"passed\": true}, {\"check\": \"double reverse\", \"actual\": {\"balance\": 0, \"rejected\": [\"r2\", \"r3\"], \"applied\": [\"e1\", \"r1\"]}, \"expected\": {\"balance\": 0, \"rejected\": [\"r2\", \"r3\"], \"applied\": [\"e1\", \"r1\"]}, \"passed\": true}, {\"check\": \"reverse rejected redeem\", \"actual\": {\"balance\": 10, \"rejected\": [\"e2\", \"e3\"], \"applied\": [\"e1\"]}, \"expected\": {\"balance\": 10, \"rejected\": [\"e2\", \"e3\"], \"applied\": [\"e1\"]}, \"passed\": true}, {\"check\": \"same timestamp\", \"actual\": {\"balance\": 1, \"rejected\": [], \"applied\": [\"a\", \"b\"]}, \"expected\": {\"balance\": 1, \"rejected\": [], \"applied\": [\"a\", \"b\"]}, \"passed\": true}, {\"check\": \"unknown reverse\", \"actual\": {\"balance\": 5, \"rejected\": [\"x\"], \"applied\": [\"e1\"]}, \"expected\": {\"balance\": 5, \"rejected\": [\"x\"], \"applied\": [\"e1\"]}, \"passed\": true}, {\"check\": \"ids against time\", \"actual\": {\"balance\": 11, \"rejected\": [], \"applied\": [\"b\", \"a\"]}, \"expected\": {\"balance\": 11, \"rejected\": [], \"applied\": [\"b\", \"a\"]}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}