{"abstract":"Clawbacks push balances negative and no debt is tracked.","category":"Loyalty points ledgers","checks":7,"contract":"Input {earned, order_total, refunds:[cents], balance}. Cumulative refunds are capped at the order total. After each refund the cumulative clawback target is round-half-up(earned*cumulative refund/order total); the refund claws target minus already clawed. A clawback is taken from the balance only down to zero; the shortfall accumulates as debt. Return {claws, balance, debt}.","evaluation_group":"w2-loyalty-points-ledgers-refund-clawback","failed_approach":"Flooring the balance but discarding the shortfall forgives the points.","family":"w2-loyalty-points-ledgers-refund-clawback-balance-floor","id":"FA-60471","implementations":{"attempt":{"sha256":"e511bf859170188925cd02ba5000140442b0cb6c6af4098eeb3aa2925e1a00a1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    cum = 0\n    clawed = 0\n    bal = x['balance']\n    debt = 0\n    out = []\n    for r in x['refunds']:\n        cum = min(x['order_total'], cum + r)\n        target = (2 * x['earned'] * cum + x['order_total']) // (2 * x['order_total'])\n        c = target - clawed\n        clawed = target\n        take = min(c, bal)\n        bal -= take\n        debt += 0\n        out.append(c)\n    return {'claws': out, 'balance': bal, 'debt': debt}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2501], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 51}, {'claws': [3, 4, 3], 'balance': 41, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3001], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 31}, {'claws': [100, 100], 'balance': 0, 'debt': 169}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 1}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 89}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 11}, {'claws': [2], 'balance': 9, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [2], 'balance': 5}, {'claws': [0], 'balance': 5, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2502], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 52}, {'claws': [3, 4, 3], 'balance': 42, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3002], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 32}, {'claws': [100, 100], 'balance': 0, 'debt': 168}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 2}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 88}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 12}, {'claws': [2], 'balance': 10, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [3], 'balance': 5}, {'claws': [0], 'balance': 5, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2503], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 53}, {'claws': [3, 4, 3], 'balance': 43, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3003], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 33}, {'claws': [100, 100], 'balance': 0, 'debt': 167}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 3}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 87}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 13}, {'claws': [2], 'balance': 11, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [4], 'balance': 5}, {'claws': [0], 'balance': 5, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2504], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 54}, {'claws': [3, 4, 3], 'balance': 44, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3004], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 34}, {'claws': [100, 100], 'balance': 0, 'debt': 166}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 4}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 86}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 14}, {'claws': [2], 'balance': 12, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [5], 'balance': 5}, {'claws': [1], 'balance': 4, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2505], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 55}, {'claws': [3, 4, 3], 'balance': 45, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3005], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 35}, {'claws': [100, 100], 'balance': 0, 'debt': 165}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 5}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 85}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 15}, {'claws': [2], 'balance': 13, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [6], 'balance': 5}, {'claws': [1], 'balance': 4, 'debt': 0}]]]\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":"95601150a91edb69e47ac5ded58d9b6f51247da76293d9755fd849dba843b94d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    cum = 0\n    clawed = 0\n    bal = x['balance']\n    debt = 0\n    out = []\n    for r in x['refunds']:\n        cum = min(x['order_total'], cum + r)\n        target = (2 * x['earned'] * cum + x['order_total']) // (2 * x['order_total'])\n        c = target - clawed\n        clawed = target\n        take = c\n        bal -= take\n        debt += c - take\n        out.append(c)\n    return {'claws': out, 'balance': bal, 'debt': debt}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2501], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 51}, {'claws': [3, 4, 3], 'balance': 41, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3001], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 31}, {'claws': [100, 100], 'balance': 0, 'debt': 169}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 1}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 89}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 11}, {'claws': [2], 'balance': 9, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [2], 'balance': 5}, {'claws': [0], 'balance': 5, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2502], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 52}, {'claws': [3, 4, 3], 'balance': 42, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3002], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 32}, {'claws': [100, 100], 'balance': 0, 'debt': 168}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 2}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 88}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 12}, {'claws': [2], 'balance': 10, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [3], 'balance': 5}, {'claws': [0], 'balance': 5, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2503], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 53}, {'claws': [3, 4, 3], 'balance': 43, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3003], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 33}, {'claws': [100, 100], 'balance': 0, 'debt': 167}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 3}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 87}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 13}, {'claws': [2], 'balance': 11, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [4], 'balance': 5}, {'claws': [0], 'balance': 5, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2504], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 54}, {'claws': [3, 4, 3], 'balance': 44, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3004], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 34}, {'claws': [100, 100], 'balance': 0, 'debt': 166}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 4}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 86}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 14}, {'claws': [2], 'balance': 12, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [5], 'balance': 5}, {'claws': [1], 'balance': 4, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2505], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 55}, {'claws': [3, 4, 3], 'balance': 45, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3005], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 35}, {'claws': [100, 100], 'balance': 0, 'debt': 165}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 5}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 85}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 15}, {'claws': [2], 'balance': 13, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [6], 'balance': 5}, {'claws': [1], 'balance': 4, 'debt': 0}]]]\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":"a35503a4c5cf2bb85d534cf4801183d2da562e84e17369c56a823ef028b36be0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    cum = 0\n    clawed = 0\n    bal = x['balance']\n    debt = 0\n    out = []\n    for r in x['refunds']:\n        cum = min(x['order_total'], cum + r)\n        target = (2 * x['earned'] * cum + x['order_total']) // (2 * x['order_total'])\n        c = target - clawed\n        clawed = target\n        take = min(c, bal)\n        bal -= take\n        debt += c - take\n        out.append(c)\n    return {'claws': out, 'balance': bal, 'debt': debt}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2501], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 51}, {'claws': [3, 4, 3], 'balance': 41, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3001], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 31}, {'claws': [100, 100], 'balance': 0, 'debt': 169}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 1}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 89}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 11}, {'claws': [2], 'balance': 9, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [2], 'balance': 5}, {'claws': [0], 'balance': 5, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2502], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 52}, {'claws': [3, 4, 3], 'balance': 42, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3002], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 32}, {'claws': [100, 100], 'balance': 0, 'debt': 168}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 2}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 88}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 12}, {'claws': [2], 'balance': 10, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [3], 'balance': 5}, {'claws': [0], 'balance': 5, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2503], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 53}, {'claws': [3, 4, 3], 'balance': 43, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3003], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 33}, {'claws': [100, 100], 'balance': 0, 'debt': 167}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 3}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 87}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 13}, {'claws': [2], 'balance': 11, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [4], 'balance': 5}, {'claws': [0], 'balance': 5, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2504], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 54}, {'claws': [3, 4, 3], 'balance': 44, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3004], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 34}, {'claws': [100, 100], 'balance': 0, 'debt': 166}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 4}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 86}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 14}, {'claws': [2], 'balance': 12, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [5], 'balance': 5}, {'claws': [1], 'balance': 4, 'debt': 0}]], [['two partial refunds', {'earned': 125, 'order_total': 10000, 'refunds': [2500, 2505], 'balance': 1000}, {'claws': [31, 32], 'balance': 937, 'debt': 0}], ['rounding drift', {'earned': 10, 'order_total': 300, 'refunds': [100, 100, 100], 'balance': 55}, {'claws': [3, 4, 3], 'balance': 45, 'debt': 0}], ['over refund', {'earned': 80, 'order_total': 4000, 'refunds': [3000, 3005], 'balance': 500}, {'claws': [60, 20], 'balance': 420, 'debt': 0}], ['spent points', {'earned': 200, 'order_total': 2000, 'refunds': [1000, 1000], 'balance': 35}, {'claws': [100, 100], 'balance': 0, 'debt': 165}], ['debt grows', {'earned': 90, 'order_total': 900, 'refunds': [300, 300, 300], 'balance': 5}, {'claws': [30, 30, 30], 'balance': 0, 'debt': 85}], ['single half', {'earned': 3, 'order_total': 2, 'refunds': [1], 'balance': 15}, {'claws': [2], 'balance': 13, 'debt': 0}], ['refund one of many', {'earned': 999, 'order_total': 9990, 'refunds': [6], 'balance': 5}, {'claws': [1], 'balance': 4, 'debt': 0}]]]\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-refund-clawback-balance-floor","generated_at":"2026-09-29T14:46:45.981056+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":"Take at most the available balance and carry the shortfall as debt.","root_cause":"The whole clawback is taken from the balance regardless of available points.","sha256":"e0a21536a0f7021c4176ec07a2196fa25eb5e2c8bbcab2ad9dec3539d12a4447","title":"Refund points clawback: balance floor · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.067,"exit_code":1,"observations":[{"actual":{"balance":937,"claws":[31,32],"debt":0},"check":"two partial refunds","expected":{"balance":937,"claws":[31,32],"debt":0},"passed":true},{"actual":{"balance":41,"claws":[3,4,3],"debt":0},"check":"rounding drift","expected":{"balance":41,"claws":[3,4,3],"debt":0},"passed":true},{"actual":{"balance":420,"claws":[60,20],"debt":0},"check":"over refund","expected":{"balance":420,"claws":[60,20],"debt":0},"passed":true},{"actual":{"balance":0,"claws":[100,100],"debt":0},"check":"spent points","expected":{"balance":0,"claws":[100,100],"debt":169},"passed":false},{"actual":{"balance":0,"claws":[30,30,30],"debt":0},"check":"debt grows","expected":{"balance":0,"claws":[30,30,30],"debt":89},"passed":false},{"actual":{"balance":9,"claws":[2],"debt":0},"check":"single half","expected":{"balance":9,"claws":[2],"debt":0},"passed":true},{"actual":{"balance":5,"claws":[0],"debt":0},"check":"refund one of many","expected":{"balance":5,"claws":[0],"debt":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"two partial refunds\", \"actual\": {\"claws\": [31, 32], \"balance\": 937, \"debt\": 0}, \"expected\": {\"claws\": [31, 32], \"balance\": 937, \"debt\": 0}, \"passed\": true}, {\"check\": \"rounding drift\", \"actual\": {\"claws\": [3, 4, 3], \"balance\": 41, \"debt\": 0}, \"expected\": {\"claws\": [3, 4, 3], \"balance\": 41, \"debt\": 0}, \"passed\": true}, {\"check\": \"over refund\", \"actual\": {\"claws\": [60, 20], \"balance\": 420, \"debt\": 0}, \"expected\": {\"claws\": [60, 20], \"balance\": 420, \"debt\": 0}, \"passed\": true}, {\"check\": \"spent points\", \"actual\": {\"claws\": [100, 100], \"balance\": 0, \"debt\": 0}, \"expected\": {\"claws\": [100, 100], \"balance\": 0, \"debt\": 169}, \"passed\": false}, {\"check\": \"debt grows\", \"actual\": {\"claws\": [30, 30, 30], \"balance\": 0, \"debt\": 0}, \"expected\": {\"claws\": [30, 30, 30], \"balance\": 0, \"debt\": 89}, \"passed\": false}, {\"check\": \"single half\", \"actual\": {\"claws\": [2], \"balance\": 9, \"debt\": 0}, \"expected\": {\"claws\": [2], \"balance\": 9, \"debt\": 0}, \"passed\": true}, {\"check\": \"refund one of many\", \"actual\": {\"claws\": [0], \"balance\": 5, \"debt\": 0}, \"expected\": {\"claws\": [0], \"balance\": 5, \"debt\": 0}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.77,"exit_code":1,"observations":[{"actual":{"balance":937,"claws":[31,32],"debt":0},"check":"two partial refunds","expected":{"balance":937,"claws":[31,32],"debt":0},"passed":true},{"actual":{"balance":41,"claws":[3,4,3],"debt":0},"check":"rounding drift","expected":{"balance":41,"claws":[3,4,3],"debt":0},"passed":true},{"actual":{"balance":420,"claws":[60,20],"debt":0},"check":"over refund","expected":{"balance":420,"claws":[60,20],"debt":0},"passed":true},{"actual":{"balance":-169,"claws":[100,100],"debt":0},"check":"spent points","expected":{"balance":0,"claws":[100,100],"debt":169},"passed":false},{"actual":{"balance":-89,"claws":[30,30,30],"debt":0},"check":"debt grows","expected":{"balance":0,"claws":[30,30,30],"debt":89},"passed":false},{"actual":{"balance":9,"claws":[2],"debt":0},"check":"single half","expected":{"balance":9,"claws":[2],"debt":0},"passed":true},{"actual":{"balance":5,"claws":[0],"debt":0},"check":"refund one of many","expected":{"balance":5,"claws":[0],"debt":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"two partial refunds\", \"actual\": {\"claws\": [31, 32], \"balance\": 937, \"debt\": 0}, \"expected\": {\"claws\": [31, 32], \"balance\": 937, \"debt\": 0}, \"passed\": true}, {\"check\": \"rounding drift\", \"actual\": {\"claws\": [3, 4, 3], \"balance\": 41, \"debt\": 0}, \"expected\": {\"claws\": [3, 4, 3], \"balance\": 41, \"debt\": 0}, \"passed\": true}, {\"check\": \"over refund\", \"actual\": {\"claws\": [60, 20], \"balance\": 420, \"debt\": 0}, \"expected\": {\"claws\": [60, 20], \"balance\": 420, \"debt\": 0}, \"passed\": true}, {\"check\": \"spent points\", \"actual\": {\"claws\": [100, 100], \"balance\": -169, \"debt\": 0}, \"expected\": {\"claws\": [100, 100], \"balance\": 0, \"debt\": 169}, \"passed\": false}, {\"check\": \"debt grows\", \"actual\": {\"claws\": [30, 30, 30], \"balance\": -89, \"debt\": 0}, \"expected\": {\"claws\": [30, 30, 30], \"balance\": 0, \"debt\": 89}, \"passed\": false}, {\"check\": \"single half\", \"actual\": {\"claws\": [2], \"balance\": 9, \"debt\": 0}, \"expected\": {\"claws\": [2], \"balance\": 9, \"debt\": 0}, \"passed\": true}, {\"check\": \"refund one of many\", \"actual\": {\"claws\": [0], \"balance\": 5, \"debt\": 0}, \"expected\": {\"claws\": [0], \"balance\": 5, \"debt\": 0}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.748,"exit_code":0,"observations":[{"actual":{"balance":937,"claws":[31,32],"debt":0},"check":"two partial refunds","expected":{"balance":937,"claws":[31,32],"debt":0},"passed":true},{"actual":{"balance":41,"claws":[3,4,3],"debt":0},"check":"rounding drift","expected":{"balance":41,"claws":[3,4,3],"debt":0},"passed":true},{"actual":{"balance":420,"claws":[60,20],"debt":0},"check":"over refund","expected":{"balance":420,"claws":[60,20],"debt":0},"passed":true},{"actual":{"balance":0,"claws":[100,100],"debt":169},"check":"spent points","expected":{"balance":0,"claws":[100,100],"debt":169},"passed":true},{"actual":{"balance":0,"claws":[30,30,30],"debt":89},"check":"debt grows","expected":{"balance":0,"claws":[30,30,30],"debt":89},"passed":true},{"actual":{"balance":9,"claws":[2],"debt":0},"check":"single half","expected":{"balance":9,"claws":[2],"debt":0},"passed":true},{"actual":{"balance":5,"claws":[0],"debt":0},"check":"refund one of many","expected":{"balance":5,"claws":[0],"debt":0},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"two partial refunds\", \"actual\": {\"claws\": [31, 32], \"balance\": 937, \"debt\": 0}, \"expected\": {\"claws\": [31, 32], \"balance\": 937, \"debt\": 0}, \"passed\": true}, {\"check\": \"rounding drift\", \"actual\": {\"claws\": [3, 4, 3], \"balance\": 41, \"debt\": 0}, \"expected\": {\"claws\": [3, 4, 3], \"balance\": 41, \"debt\": 0}, \"passed\": true}, {\"check\": \"over refund\", \"actual\": {\"claws\": [60, 20], \"balance\": 420, \"debt\": 0}, \"expected\": {\"claws\": [60, 20], \"balance\": 420, \"debt\": 0}, \"passed\": true}, {\"check\": \"spent points\", \"actual\": {\"claws\": [100, 100], \"balance\": 0, \"debt\": 169}, \"expected\": {\"claws\": [100, 100], \"balance\": 0, \"debt\": 169}, \"passed\": true}, {\"check\": \"debt grows\", \"actual\": {\"claws\": [30, 30, 30], \"balance\": 0, \"debt\": 89}, \"expected\": {\"claws\": [30, 30, 30], \"balance\": 0, \"debt\": 89}, \"passed\": true}, {\"check\": \"single half\", \"actual\": {\"claws\": [2], \"balance\": 9, \"debt\": 0}, \"expected\": {\"claws\": [2], \"balance\": 9, \"debt\": 0}, \"passed\": true}, {\"check\": \"refund one of many\", \"actual\": {\"claws\": [0], \"balance\": 5, \"debt\": 0}, \"expected\": {\"claws\": [0], \"balance\": 5, \"debt\": 0}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}