{"abstract":"A 2.8267 dividend is paid as 2.90 or rounded to 2.80 only sometimes.","category":"Betting odds conversion","checks":8,"contract":"Pari-mutuel win dividend per unit stake. The net pool is pool * (100 - takeout_pct) / 100; with a dead heat it is split equally among the winning runners. Each runner's dividend is its share divided by the stakes on it, broken down to the 10-cent step below (breakage), with a minimum of 1.10. A winner with no stakes gets None. Return dividends as \"D.D0\" strings in winners order.","evaluation_group":"w2-odds-conversion-tote-win-dividend","failed_approach":"Rounding up pays out money the pool does not have.","family":"w2-odds-conversion-tote-win-dividend-breakage-direction","id":"FA-84716","implementations":{"attempt":{"sha256":"3079de4b8b57775424b91379ee69e64d2f20a9b26521dea99f913aa3f0bfcfb7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(pool_cents, takeout_pct, winners):\n    net = Fraction(pool_cents) * (100 - Fraction(takeout_pct)) / 100\n    share = net / len(winners)\n    out = []\n    for s in winners:\n        if s == 0:\n            out.append(None)\n            continue\n        dimes = math.ceil(share / s * 10)\n        dimes = max(dimes, 11)\n        out.append('%d.%d0' % (dimes // 10, dimes % 10))\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ndef run(args):\n    try:\n        return solve(*args)\n    except Exception as exc:\n        return 'raised ' + type(exc).__name__\ncases = [[('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (50000, '15', [11867]), ['3.50']),\n  ('variant scenario 1', (50000, '20', [47992]), ['1.10']),\n  ('variant scenario 2', (100000, '20', [75618]), ['1.10'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (250000, '16', [62527]), ['3.30']),\n  ('variant scenario 1', (250000, '0', [333]), ['750.70']),\n  ('variant scenario 2', (50000, '16', [38443]), ['1.10'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (100000, '0', [70424]), ['1.40']),\n  ('regression: breakage direction', (1234500, '16', [155805]), ['6.60']),\n  ('variant scenario 1', (100000, '15', [55625, 0]), ['1.10', None]),\n  ('variant scenario 2', (50000, '15', [6485]), ['6.50'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (250000, '0', [241772, 1500]), ['1.10', '83.30']),\n  ('regression: breakage direction', (50000, '16', [0, 5094, 3128]), [None, '2.70', '4.40']),\n  ('variant scenario 1', (250000, '16', [250000]), ['1.10']),\n  ('variant scenario 2', (50000, '20', [36563]), ['1.10'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (1234500, '20', [896467]), ['1.10']),\n  ('regression: breakage direction', (50000, '20', [21393]), ['1.80']),\n  ('variant scenario 1', (1234500, '15', [40000, 617250, 518407]), ['8.70', '1.10', '1.10']),\n  ('variant scenario 2', (100000, '15', [40000]), ['2.10'])]]\nfor label, args, expected in cases[N - 1]:\n    check(label, run(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":"f47e7fe600dd91e544c5bac85b4b5854188cac10290e59a30862ce4548268427","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(pool_cents, takeout_pct, winners):\n    net = Fraction(pool_cents) * (100 - Fraction(takeout_pct)) / 100\n    share = net / len(winners)\n    out = []\n    for s in winners:\n        if s == 0:\n            out.append(None)\n            continue\n        dimes = math.floor(share / s * 10 + Fraction(1, 2))\n        dimes = max(dimes, 11)\n        out.append('%d.%d0' % (dimes // 10, dimes % 10))\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ndef run(args):\n    try:\n        return solve(*args)\n    except Exception as exc:\n        return 'raised ' + type(exc).__name__\ncases = [[('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (50000, '15', [11867]), ['3.50']),\n  ('variant scenario 1', (50000, '20', [47992]), ['1.10']),\n  ('variant scenario 2', (100000, '20', [75618]), ['1.10'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (250000, '16', [62527]), ['3.30']),\n  ('variant scenario 1', (250000, '0', [333]), ['750.70']),\n  ('variant scenario 2', (50000, '16', [38443]), ['1.10'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (100000, '0', [70424]), ['1.40']),\n  ('regression: breakage direction', (1234500, '16', [155805]), ['6.60']),\n  ('variant scenario 1', (100000, '15', [55625, 0]), ['1.10', None]),\n  ('variant scenario 2', (50000, '15', [6485]), ['6.50'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (250000, '0', [241772, 1500]), ['1.10', '83.30']),\n  ('regression: breakage direction', (50000, '16', [0, 5094, 3128]), [None, '2.70', '4.40']),\n  ('variant scenario 1', (250000, '16', [250000]), ['1.10']),\n  ('variant scenario 2', (50000, '20', [36563]), ['1.10'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (1234500, '20', [896467]), ['1.10']),\n  ('regression: breakage direction', (50000, '20', [21393]), ['1.80']),\n  ('variant scenario 1', (1234500, '15', [40000, 617250, 518407]), ['8.70', '1.10', '1.10']),\n  ('variant scenario 2', (100000, '15', [40000]), ['2.10'])]]\nfor label, args, expected in cases[N - 1]:\n    check(label, run(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":"1491fbc9351bcaaba753d8c8332f097cfe4b383ea015b3e60023e32f62bbeb87","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(pool_cents, takeout_pct, winners):\n    net = Fraction(pool_cents) * (100 - Fraction(takeout_pct)) / 100\n    share = net / len(winners)\n    out = []\n    for s in winners:\n        if s == 0:\n            out.append(None)\n            continue\n        dimes = math.floor(share / s * 10)\n        dimes = max(dimes, 11)\n        out.append('%d.%d0' % (dimes // 10, dimes % 10))\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ndef run(args):\n    try:\n        return solve(*args)\n    except Exception as exc:\n        return 'raised ' + type(exc).__name__\ncases = [[('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (50000, '15', [11867]), ['3.50']),\n  ('variant scenario 1', (50000, '20', [47992]), ['1.10']),\n  ('variant scenario 2', (100000, '20', [75618]), ['1.10'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (250000, '16', [62527]), ['3.30']),\n  ('variant scenario 1', (250000, '0', [333]), ['750.70']),\n  ('variant scenario 2', (50000, '16', [38443]), ['1.10'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (100000, '0', [70424]), ['1.40']),\n  ('regression: breakage direction', (1234500, '16', [155805]), ['6.60']),\n  ('variant scenario 1', (100000, '15', [55625, 0]), ['1.10', None]),\n  ('variant scenario 2', (50000, '15', [6485]), ['6.50'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (250000, '0', [241772, 1500]), ['1.10', '83.30']),\n  ('regression: breakage direction', (50000, '16', [0, 5094, 3128]), [None, '2.70', '4.40']),\n  ('variant scenario 1', (250000, '16', [250000]), ['1.10']),\n  ('variant scenario 2', (50000, '20', [36563]), ['1.10'])],\n [('control single winner', (100000, '15', [25000]), ['3.40']),\n  ('boundary breakage down', (100000, '16', [30000]), ['2.80']),\n  ('boundary minimum dividend', (100000, '20', [90000]), ['1.10']),\n  ('boundary dead heat split', (100000, '20', [10000, 40000]), ['4.00', '1.10']),\n  ('control unbacked winner', (100000, '15', [0]), [None]),\n  ('regression: breakage direction', (1234500, '20', [896467]), ['1.10']),\n  ('regression: breakage direction', (50000, '20', [21393]), ['1.80']),\n  ('variant scenario 1', (1234500, '15', [40000, 617250, 518407]), ['8.70', '1.10', '1.10']),\n  ('variant scenario 2', (100000, '15', [40000]), ['2.10'])]]\nfor label, args, expected in cases[N - 1]:\n    check(label, run(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 toy contract stated in the contract field; not a claim of conformance with any operator, exchange or regulator rule set. 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-odds-conversion-tote-win-dividend-breakage-direction","generated_at":"2026-09-29T14:50:33.684929+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Tote operators compute dividends with takeout, breakage and minimum-dividend rules.","repair":"Always break down to the 10-cent step below.","root_cause":"Breakage rounds to the nearest 10 cents.","sha256":"07e6cc20656ef4f4d7a6f313bf6bcbda1ae35dd1c71b559365a37b8bbe95d4af","title":"Breakage rounds dividends to the nearest or next dime · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.597,"exit_code":1,"observations":[{"actual":["3.40"],"check":"control single winner","expected":["3.40"],"passed":true},{"actual":["2.80"],"check":"boundary breakage down","expected":["2.80"],"passed":true},{"actual":["1.10"],"check":"boundary minimum dividend","expected":["1.10"],"passed":true},{"actual":["4.00","1.10"],"check":"boundary dead heat split","expected":["4.00","1.10"],"passed":true},{"actual":[null],"check":"control unbacked winner","expected":[null],"passed":true},{"actual":["3.60"],"check":"regression: breakage direction","expected":["3.50"],"passed":false},{"actual":["1.10"],"check":"variant scenario 1","expected":["1.10"],"passed":true},{"actual":["1.10"],"check":"variant scenario 2","expected":["1.10"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control single winner\", \"actual\": [\"3.40\"], \"expected\": [\"3.40\"], \"passed\": true}, {\"check\": \"boundary breakage down\", \"actual\": [\"2.80\"], \"expected\": [\"2.80\"], \"passed\": true}, {\"check\": \"boundary minimum dividend\", \"actual\": [\"1.10\"], \"expected\": [\"1.10\"], \"passed\": true}, {\"check\": \"boundary dead heat split\", \"actual\": [\"4.00\", \"1.10\"], \"expected\": [\"4.00\", \"1.10\"], \"passed\": true}, {\"check\": \"control unbacked winner\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"regression: breakage direction\", \"actual\": [\"3.60\"], \"expected\": [\"3.50\"], \"passed\": false}, {\"check\": \"variant scenario 1\", \"actual\": [\"1.10\"], \"expected\": [\"1.10\"], \"passed\": true}, {\"check\": \"variant scenario 2\", \"actual\": [\"1.10\"], \"expected\": [\"1.10\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.815,"exit_code":1,"observations":[{"actual":["3.40"],"check":"control single winner","expected":["3.40"],"passed":true},{"actual":["2.80"],"check":"boundary breakage down","expected":["2.80"],"passed":true},{"actual":["1.10"],"check":"boundary minimum dividend","expected":["1.10"],"passed":true},{"actual":["4.00","1.10"],"check":"boundary dead heat split","expected":["4.00","1.10"],"passed":true},{"actual":[null],"check":"control unbacked winner","expected":[null],"passed":true},{"actual":["3.60"],"check":"regression: breakage direction","expected":["3.50"],"passed":false},{"actual":["1.10"],"check":"variant scenario 1","expected":["1.10"],"passed":true},{"actual":["1.10"],"check":"variant scenario 2","expected":["1.10"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control single winner\", \"actual\": [\"3.40\"], \"expected\": [\"3.40\"], \"passed\": true}, {\"check\": \"boundary breakage down\", \"actual\": [\"2.80\"], \"expected\": [\"2.80\"], \"passed\": true}, {\"check\": \"boundary minimum dividend\", \"actual\": [\"1.10\"], \"expected\": [\"1.10\"], \"passed\": true}, {\"check\": \"boundary dead heat split\", \"actual\": [\"4.00\", \"1.10\"], \"expected\": [\"4.00\", \"1.10\"], \"passed\": true}, {\"check\": \"control unbacked winner\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"regression: breakage direction\", \"actual\": [\"3.60\"], \"expected\": [\"3.50\"], \"passed\": false}, {\"check\": \"variant scenario 1\", \"actual\": [\"1.10\"], \"expected\": [\"1.10\"], \"passed\": true}, {\"check\": \"variant scenario 2\", \"actual\": [\"1.10\"], \"expected\": [\"1.10\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.354,"exit_code":0,"observations":[{"actual":["3.40"],"check":"control single winner","expected":["3.40"],"passed":true},{"actual":["2.80"],"check":"boundary breakage down","expected":["2.80"],"passed":true},{"actual":["1.10"],"check":"boundary minimum dividend","expected":["1.10"],"passed":true},{"actual":["4.00","1.10"],"check":"boundary dead heat split","expected":["4.00","1.10"],"passed":true},{"actual":[null],"check":"control unbacked winner","expected":[null],"passed":true},{"actual":["3.50"],"check":"regression: breakage direction","expected":["3.50"],"passed":true},{"actual":["1.10"],"check":"variant scenario 1","expected":["1.10"],"passed":true},{"actual":["1.10"],"check":"variant scenario 2","expected":["1.10"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control single winner\", \"actual\": [\"3.40\"], \"expected\": [\"3.40\"], \"passed\": true}, {\"check\": \"boundary breakage down\", \"actual\": [\"2.80\"], \"expected\": [\"2.80\"], \"passed\": true}, {\"check\": \"boundary minimum dividend\", \"actual\": [\"1.10\"], \"expected\": [\"1.10\"], \"passed\": true}, {\"check\": \"boundary dead heat split\", \"actual\": [\"4.00\", \"1.10\"], \"expected\": [\"4.00\", \"1.10\"], \"passed\": true}, {\"check\": \"control unbacked winner\", \"actual\": [null], \"expected\": [null], \"passed\": true}, {\"check\": \"regression: breakage direction\", \"actual\": [\"3.50\"], \"expected\": [\"3.50\"], \"passed\": true}, {\"check\": \"variant scenario 1\", \"actual\": [\"1.10\"], \"expected\": [\"1.10\"], \"passed\": true}, {\"check\": \"variant scenario 2\", \"actual\": [\"1.10\"], \"expected\": [\"1.10\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}