{"abstract":"A redelivered earn with a later timestamp is applied at the wrong position.","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}.","contract_signature":"x","evaluation_group":"w2-loyalty-points-ledgers-idempotent-ledger","failed_approach":"Keeping the last delivered copy is also not the first delivery.","family":"w2-loyalty-points-ledgers-idempotent-ledger-dedupe-before-ordering","id":"FA-60616","implementations":{"attempt":{"sha256":"2be285dcffd9d439834db9f4fd1df61257530a91291f30e832495d6db0138411","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'][::-1]:\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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 51, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 51, 'ref': None}]}, {'balance': 51, 'rejected': ['e2'], 'applied': ['e1']}]], [['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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 52, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 52, 'ref': None}]}, {'balance': 52, 'rejected': ['e2'], 'applied': ['e1']}]], [['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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 53, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 53, 'ref': None}]}, {'balance': 53, 'rejected': ['e2'], 'applied': ['e1']}]], [['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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 54, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 54, 'ref': None}]}, {'balance': 54, 'rejected': ['e2'], 'applied': ['e1']}]], [['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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 55, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 55, 'ref': None}]}, {'balance': 55, 'rejected': ['e2'], 'applied': ['e1']}]]]\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":"316a0d08609522cac251efd9c1261012cedc3d716be3e4b32f85a685ad3fa225","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 sorted(x['events'], key=lambda e: (e['ts'], e['id'])):\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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 51, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 51, 'ref': None}]}, {'balance': 51, 'rejected': ['e2'], 'applied': ['e1']}]], [['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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 52, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 52, 'ref': None}]}, {'balance': 52, 'rejected': ['e2'], 'applied': ['e1']}]], [['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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 53, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 53, 'ref': None}]}, {'balance': 53, 'rejected': ['e2'], 'applied': ['e1']}]], [['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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 54, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 54, 'ref': None}]}, {'balance': 54, 'rejected': ['e2'], 'applied': ['e1']}]], [['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']}], ['redelivered earlier ts', {'events': [{'id': 'e2', 'ts': 3, 'type': 'redeem', 'pts': 40, 'ref': None}, {'id': 'e1', 'ts': 5, 'type': 'earn', 'pts': 55, 'ref': None}, {'id': 'e1', 'ts': 1, 'type': 'earn', 'pts': 55, 'ref': None}]}, {'balance': 55, 'rejected': ['e2'], 'applied': ['e1']}]]]\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-dedupe-before-ordering","generated_at":"2026-09-29T14:46:47.315879+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.","root_cause":"Events are sorted before duplicate ids are dropped, so the earliest-timestamp copy wins instead of the first delivery.","sha256":"29683e3e2561f60bd4c05273a6c9f1ae476a95ad23a12a3702221fb3481dc312","title":"Idempotent points event ledger: dedupe before ordering · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":44.287,"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":["e1","e2"],"balance":11,"rejected":[]},"check":"redelivered earlier ts","expected":{"applied":["e1"],"balance":51,"rejected":["e2"]},"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\": \"redelivered earlier ts\", \"actual\": {\"balance\": 11, \"rejected\": [], \"applied\": [\"e1\", \"e2\"]}, \"expected\": {\"balance\": 51, \"rejected\": [\"e2\"], \"applied\": [\"e1\"]}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.848,"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":["e1","e2"],"balance":11,"rejected":[]},"check":"redelivered earlier ts","expected":{"applied":["e1"],"balance":51,"rejected":["e2"]},"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\": \"redelivered earlier ts\", \"actual\": {\"balance\": 11, \"rejected\": [], \"applied\": [\"e1\", \"e2\"]}, \"expected\": {\"balance\": 51, \"rejected\": [\"e2\"], \"applied\": [\"e1\"]}, \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}