{"abstract":"The recipient receives fewer points than were sent while the sender pays only the principal.","category":"Loyalty points ledgers","checks":7,"contract":"Input {members:{id:balance}, transfers:[[from,to,pts]], fee_bp, min_transfer, annual_cap, sent_ytd}. Self transfers or unknown members are \"invalid\"; pts below the minimum are \"below minimum\"; sent_ytd + pts above annual_cap is \"cap\" (fees do not count toward the cap). The fee is ceil(pts*fee_bp/10000) points charged to the sender, who must hold pts + fee (\"insufficient\" otherwise). The recipient receives pts. Return {results (fee or reason), balances:[[id,bal]] sorted}.","contract_signature":"x","evaluation_group":"w2-loyalty-points-ledgers-member-transfers","failed_approach":"Charging the fee to both parties double collects it.","family":"w2-loyalty-points-ledgers-member-transfers-fee-payer","id":"FA-60516","implementations":{"attempt":{"sha256":"7d3f957b6fa9f1ee43e1e72f04f9be86bade1c98fdc77fefee48d59958cbaf50","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    bal = dict(x['members'])\n    sent = dict(x['sent_ytd'])\n    out = []\n    for f, t, p in x['transfers']:\n        if f == t or f not in bal or t not in bal:\n            out.append('invalid')\n            continue\n        if p < x['min_transfer']:\n            out.append('below minimum')\n            continue\n        if sent.get(f, 0) + p > x['annual_cap']:\n            out.append('cap')\n            continue\n        fee = (p * x['fee_bp'] + 9999) // 10000\n        if bal[f] < p + fee:\n            out.append('insufficient')\n            continue\n        bal[f] -= p + fee\n        bal[t] += p - fee\n        sent[f] = sent.get(f, 0) + p\n        out.append(fee)\n    return {'results': out, 'balances': [[k, bal[k]] for k in sorted(bal)]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2000]], 'sent_ytd': {}}, {'results': [50], 'balances': [['a', 2950], ['b', 2100]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1001]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1013], ['b', 1001]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14999}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5001]], 'sent_ytd': {'a': 14999}}, {'results': [126], 'balances': [['a', 84873], ['b', 5001]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1004], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48962], ['b', 1011]]}], ['fees do not use cap', {'fee_bp': 501, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [501, 501], 'balances': [['a', 68998], ['c', 20000]]}]], [['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2001]], 'sent_ytd': {}}, {'results': [51], 'balances': [['a', 2948], ['b', 2101]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1002]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1012], ['b', 1002]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14998}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5002]], 'sent_ytd': {'a': 14998}}, {'results': [126], 'balances': [['a', 84872], ['b', 5002]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1007], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48959], ['b', 1014]]}], ['fees do not use cap', {'fee_bp': 502, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [502, 502], 'balances': [['a', 68996], ['c', 20000]]}]], [['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2002]], 'sent_ytd': {}}, {'results': [51], 'balances': [['a', 2947], ['b', 2102]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1003]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1011], ['b', 1003]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14997}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5003]], 'sent_ytd': {'a': 14997}}, {'results': [126], 'balances': [['a', 84871], ['b', 5003]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1010], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48956], ['b', 1017]]}], ['fees do not use cap', {'fee_bp': 503, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [503, 503], 'balances': [['a', 68994], ['c', 20000]]}]], [['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2003]], 'sent_ytd': {}}, {'results': [51], 'balances': [['a', 2946], ['b', 2103]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1004]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1010], ['b', 1004]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14996}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5004]], 'sent_ytd': {'a': 14996}}, {'results': [126], 'balances': [['a', 84870], ['b', 5004]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1013], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48953], ['b', 1020]]}], ['fees do not use cap', {'fee_bp': 504, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [504, 504], 'balances': [['a', 68992], ['c', 20000]]}]], [['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2004]], 'sent_ytd': {}}, {'results': [51], 'balances': [['a', 2945], ['b', 2104]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1005]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1009], ['b', 1005]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14995}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5005]], 'sent_ytd': {'a': 14995}}, {'results': [126], 'balances': [['a', 84869], ['b', 5005]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1016], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48950], ['b', 1023]]}], ['fees do not use cap', {'fee_bp': 505, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [505, 505], 'balances': [['a', 68990], ['c', 20000]]}]]]\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":"bd36527df5f885fdbf02b75d7e95dfd1fc544af4f3a0e71f13b874b60a1be10e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    bal = dict(x['members'])\n    sent = dict(x['sent_ytd'])\n    out = []\n    for f, t, p in x['transfers']:\n        if f == t or f not in bal or t not in bal:\n            out.append('invalid')\n            continue\n        if p < x['min_transfer']:\n            out.append('below minimum')\n            continue\n        if sent.get(f, 0) + p > x['annual_cap']:\n            out.append('cap')\n            continue\n        fee = (p * x['fee_bp'] + 9999) // 10000\n        if bal[f] < p + fee:\n            out.append('insufficient')\n            continue\n        bal[f] -= p\n        bal[t] += p - fee\n        sent[f] = sent.get(f, 0) + p\n        out.append(fee)\n    return {'results': out, 'balances': [[k, bal[k]] for k in sorted(bal)]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2000]], 'sent_ytd': {}}, {'results': [50], 'balances': [['a', 2950], ['b', 2100]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1001]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1013], ['b', 1001]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14999}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5001]], 'sent_ytd': {'a': 14999}}, {'results': [126], 'balances': [['a', 84873], ['b', 5001]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1004], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48962], ['b', 1011]]}], ['fees do not use cap', {'fee_bp': 501, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [501, 501], 'balances': [['a', 68998], ['c', 20000]]}]], [['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2001]], 'sent_ytd': {}}, {'results': [51], 'balances': [['a', 2948], ['b', 2101]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1002]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1012], ['b', 1002]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14998}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5002]], 'sent_ytd': {'a': 14998}}, {'results': [126], 'balances': [['a', 84872], ['b', 5002]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1007], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48959], ['b', 1014]]}], ['fees do not use cap', {'fee_bp': 502, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [502, 502], 'balances': [['a', 68996], ['c', 20000]]}]], [['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2002]], 'sent_ytd': {}}, {'results': [51], 'balances': [['a', 2947], ['b', 2102]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1003]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1011], ['b', 1003]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14997}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5003]], 'sent_ytd': {'a': 14997}}, {'results': [126], 'balances': [['a', 84871], ['b', 5003]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1010], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48956], ['b', 1017]]}], ['fees do not use cap', {'fee_bp': 503, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [503, 503], 'balances': [['a', 68994], ['c', 20000]]}]], [['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2003]], 'sent_ytd': {}}, {'results': [51], 'balances': [['a', 2946], ['b', 2103]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1004]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1010], ['b', 1004]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14996}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5004]], 'sent_ytd': {'a': 14996}}, {'results': [126], 'balances': [['a', 84870], ['b', 5004]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1013], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48953], ['b', 1020]]}], ['fees do not use cap', {'fee_bp': 504, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [504, 504], 'balances': [['a', 68992], ['c', 20000]]}]], [['normal transfer', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 100}, 'transfers': [['a', 'b', 2004]], 'sent_ytd': {}}, {'results': [51], 'balances': [['a', 2945], ['b', 2104]]}], ['fee needs balance', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 2040, 'b': 0}, 'transfers': [['a', 'b', 2000], ['a', 'b', 1005]], 'sent_ytd': {}}, {'results': ['insufficient', 26], 'balances': [['a', 1009], ['b', 1005]]}], ['cap edge', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5000]], 'sent_ytd': {'a': 14995}}, {'results': [125], 'balances': [['a', 84875], ['b', 5000]]}], ['cap exact', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'b': 0}, 'transfers': [['a', 'b', 5005]], 'sent_ytd': {'a': 14995}}, {'results': [126], 'balances': [['a', 84869], ['b', 5005]]}], ['invalid parties', {'fee_bp': 250, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 5000, 'b': 0}, 'transfers': [['a', 'a', 1000], ['a', 'z', 1000], ['a', 'b', 999]], 'sent_ytd': {}}, {'results': ['invalid', 'invalid', 'below minimum'], 'balances': [['a', 5000], ['b', 0]]}], ['fee rounding', {'fee_bp': 333, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 50000, 'b': 7}, 'transfers': [['a', 'b', 1016], ['b', 'a', 1000]], 'sent_ytd': {}}, {'results': [34, 'insufficient'], 'balances': [['a', 48950], ['b', 1023]]}], ['fees do not use cap', {'fee_bp': 505, 'min_transfer': 1000, 'annual_cap': 20000, 'members': {'a': 90000, 'c': 0}, 'transfers': [['a', 'c', 10000], ['a', 'c', 10000]], 'sent_ytd': {'a': 0}}, {'results': [505, 505], 'balances': [['a', 68990], ['c', 20000]]}]]]\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-member-transfers-fee-payer","generated_at":"2026-09-29T14:46:46.425202+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":"The fee is deducted from the credited amount instead of charged to the sender.","sha256":"e87507023c97ecf8caf4b55b5d1d3f1907f20d89c34d2a1898fde37da5d027ee","title":"Member-to-member point transfers: fee payer · 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":40.516,"exit_code":1,"observations":[{"actual":{"balances":[["a",2950],["b",2050]],"results":[50]},"check":"normal transfer","expected":{"balances":[["a",2950],["b",2100]],"results":[50]},"passed":false},{"actual":{"balances":[["a",1013],["b",975]],"results":["insufficient",26]},"check":"fee needs balance","expected":{"balances":[["a",1013],["b",1001]],"results":["insufficient",26]},"passed":false},{"actual":{"balances":[["a",84875],["b",4875]],"results":[125]},"check":"cap edge","expected":{"balances":[["a",84875],["b",5000]],"results":[125]},"passed":false},{"actual":{"balances":[["a",84873],["b",4875]],"results":[126]},"check":"cap exact","expected":{"balances":[["a",84873],["b",5001]],"results":[126]},"passed":false},{"actual":{"balances":[["a",5000],["b",0]],"results":["invalid","invalid","below minimum"]},"check":"invalid parties","expected":{"balances":[["a",5000],["b",0]],"results":["invalid","invalid","below minimum"]},"passed":true},{"actual":{"balances":[["a",48962],["b",977]],"results":[34,"insufficient"]},"check":"fee rounding","expected":{"balances":[["a",48962],["b",1011]],"results":[34,"insufficient"]},"passed":false},{"actual":{"balances":[["a",68998],["c",18998]],"results":[501,501]},"check":"fees do not use cap","expected":{"balances":[["a",68998],["c",20000]],"results":[501,501]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal transfer\", \"actual\": {\"results\": [50], \"balances\": [[\"a\", 2950], [\"b\", 2050]]}, \"expected\": {\"results\": [50], \"balances\": [[\"a\", 2950], [\"b\", 2100]]}, \"passed\": false}, {\"check\": \"fee needs balance\", \"actual\": {\"results\": [\"insufficient\", 26], \"balances\": [[\"a\", 1013], [\"b\", 975]]}, \"expected\": {\"results\": [\"insufficient\", 26], \"balances\": [[\"a\", 1013], [\"b\", 1001]]}, \"passed\": false}, {\"check\": \"cap edge\", \"actual\": {\"results\": [125], \"balances\": [[\"a\", 84875], [\"b\", 4875]]}, \"expected\": {\"results\": [125], \"balances\": [[\"a\", 84875], [\"b\", 5000]]}, \"passed\": false}, {\"check\": \"cap exact\", \"actual\": {\"results\": [126], \"balances\": [[\"a\", 84873], [\"b\", 4875]]}, \"expected\": {\"results\": [126], \"balances\": [[\"a\", 84873], [\"b\", 5001]]}, \"passed\": false}, {\"check\": \"invalid parties\", \"actual\": {\"results\": [\"invalid\", \"invalid\", \"below minimum\"], \"balances\": [[\"a\", 5000], [\"b\", 0]]}, \"expected\": {\"results\": [\"invalid\", \"invalid\", \"below minimum\"], \"balances\": [[\"a\", 5000], [\"b\", 0]]}, \"passed\": true}, {\"check\": \"fee rounding\", \"actual\": {\"results\": [34, \"insufficient\"], \"balances\": [[\"a\", 48962], [\"b\", 977]]}, \"expected\": {\"results\": [34, \"insufficient\"], \"balances\": [[\"a\", 48962], [\"b\", 1011]]}, \"passed\": false}, {\"check\": \"fees do not use cap\", \"actual\": {\"results\": [501, 501], \"balances\": [[\"a\", 68998], [\"c\", 18998]]}, \"expected\": {\"results\": [501, 501], \"balances\": [[\"a\", 68998], [\"c\", 20000]]}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.391,"exit_code":1,"observations":[{"actual":{"balances":[["a",3000],["b",2050]],"results":[50]},"check":"normal transfer","expected":{"balances":[["a",2950],["b",2100]],"results":[50]},"passed":false},{"actual":{"balances":[["a",1039],["b",975]],"results":["insufficient",26]},"check":"fee needs balance","expected":{"balances":[["a",1013],["b",1001]],"results":["insufficient",26]},"passed":false},{"actual":{"balances":[["a",85000],["b",4875]],"results":[125]},"check":"cap edge","expected":{"balances":[["a",84875],["b",5000]],"results":[125]},"passed":false},{"actual":{"balances":[["a",84999],["b",4875]],"results":[126]},"check":"cap exact","expected":{"balances":[["a",84873],["b",5001]],"results":[126]},"passed":false},{"actual":{"balances":[["a",5000],["b",0]],"results":["invalid","invalid","below minimum"]},"check":"invalid parties","expected":{"balances":[["a",5000],["b",0]],"results":["invalid","invalid","below minimum"]},"passed":true},{"actual":{"balances":[["a",48996],["b",977]],"results":[34,"insufficient"]},"check":"fee rounding","expected":{"balances":[["a",48962],["b",1011]],"results":[34,"insufficient"]},"passed":false},{"actual":{"balances":[["a",70000],["c",18998]],"results":[501,501]},"check":"fees do not use cap","expected":{"balances":[["a",68998],["c",20000]],"results":[501,501]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"normal transfer\", \"actual\": {\"results\": [50], \"balances\": [[\"a\", 3000], [\"b\", 2050]]}, \"expected\": {\"results\": [50], \"balances\": [[\"a\", 2950], [\"b\", 2100]]}, \"passed\": false}, {\"check\": \"fee needs balance\", \"actual\": {\"results\": [\"insufficient\", 26], \"balances\": [[\"a\", 1039], [\"b\", 975]]}, \"expected\": {\"results\": [\"insufficient\", 26], \"balances\": [[\"a\", 1013], [\"b\", 1001]]}, \"passed\": false}, {\"check\": \"cap edge\", \"actual\": {\"results\": [125], \"balances\": [[\"a\", 85000], [\"b\", 4875]]}, \"expected\": {\"results\": [125], \"balances\": [[\"a\", 84875], [\"b\", 5000]]}, \"passed\": false}, {\"check\": \"cap exact\", \"actual\": {\"results\": [126], \"balances\": [[\"a\", 84999], [\"b\", 4875]]}, \"expected\": {\"results\": [126], \"balances\": [[\"a\", 84873], [\"b\", 5001]]}, \"passed\": false}, {\"check\": \"invalid parties\", \"actual\": {\"results\": [\"invalid\", \"invalid\", \"below minimum\"], \"balances\": [[\"a\", 5000], [\"b\", 0]]}, \"expected\": {\"results\": [\"invalid\", \"invalid\", \"below minimum\"], \"balances\": [[\"a\", 5000], [\"b\", 0]]}, \"passed\": true}, {\"check\": \"fee rounding\", \"actual\": {\"results\": [34, \"insufficient\"], \"balances\": [[\"a\", 48996], [\"b\", 977]]}, \"expected\": {\"results\": [34, \"insufficient\"], \"balances\": [[\"a\", 48962], [\"b\", 1011]]}, \"passed\": false}, {\"check\": \"fees do not use cap\", \"actual\": {\"results\": [501, 501], \"balances\": [[\"a\", 70000], [\"c\", 18998]]}, \"expected\": {\"results\": [501, 501], \"balances\": [[\"a\", 68998], [\"c\", 20000]]}, \"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."}}