{"abstract":"A hedged market pays commission on the winning leg despite a small net profit.","category":"Betting odds conversion","checks":7,"contract":"Betting exchange settlement. bets rows are [market, side, stake_cents, price, won] where won says whether the bet won. Back: win profit floor(stake * (price - 1)), loss -stake. Lay: win +stake, loss -ceil(stake * (price - 1)) (the liability). Commission is charged per market on the market net profit only when that net is positive, at rate_pct percent rounded half up to a cent. Return [total net after commission, total commission] in cents.","contract_signature":"bets, rate_pct","evaluation_group":"w2-odds-conversion-exchange-market-commission","failed_approach":"Aggregating only the winning bets per market still charges commission on gross winnings.","family":"w2-odds-conversion-exchange-market-commission-per-bet-commission","id":"FA-84531","implementations":{"attempt":{"sha256":"39973ae394463d7074e91a388b1644bc8ba6b2c531963256f6a85f084828c976","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(bets, rate_pct):\n    nets = {}\n    for market, side, stake, price, won in bets:\n        p = Fraction(price)\n        if side == 'back':\n            pl = math.floor(stake * (p - 1)) if won else -stake\n        else:\n            pl = stake if won else -math.ceil(stake * (p - 1))\n        nets[market] = nets.get(market, 0) + max(pl, 0)\n    comm = 0\n    for m, net in nets.items():\n        if net > 0:\n            comm += math.floor(net * Fraction(rate_pct) / 100 + Fraction(1, 2))\n    return [sum(nets.values()) - comm, comm]\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 back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission',\n   ([['m1', 'back', 100, '5.20', False],\n     ['m2', 'lay', 2000, '6.81', True],\n     ['m3', 'back', 100, '6.84', False],\n     ['m1', 'back', 777, '1.71', True],\n     ['m2', 'lay', 2000, '4.81', False]],\n    '6.5'),\n   [-5298, 29]),\n  ('variant scenario 1',\n   ([['m3', 'back', 1000, '2.37', False],\n     ['m3', 'lay', 1000, '5.47', True],\n     ['m3', 'lay', 1000, '2.53', True],\n     ['m3', 'back', 2000, '5.43', False]],\n    '2'),\n   [-1000, 0]),\n  ('variant scenario 2',\n   ([['m1', 'lay', 100, '6.53', True],\n     ['m1', 'lay', 250, '1.42', False],\n     ['m3', 'back', 100, '5.84', True],\n     ['m1', 'back', 250, '4.21', False]],\n    '6.5'),\n   [198, 31])],\n [('control single back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission', ([['m3', 'back', 100, '3.97', False]], '5'), [-100, 0]),\n  ('regression: per bet commission',\n   ([['m3', 'lay', 100, '2.39', True],\n     ['m1', 'lay', 2000, '5.94', False],\n     ['m3', 'back', 777, '3.75', True]],\n    '6.5'),\n   [-7789, 145]),\n  ('variant scenario 1',\n   ([['m1', 'back', 777, '1.23', False],\n     ['m2', 'lay', 250, '7.80', True],\n     ['m2', 'back', 100, '4.41', True]],\n    '5'),\n   [-216, 30]),\n  ('variant scenario 2',\n   ([['m3', 'back', 2000, '4.01', False],\n     ['m1', 'lay', 100, '3.22', False],\n     ['m3', 'lay', 777, '7.56', False],\n     ['m1', 'back', 2000, '1.35', False]],\n    '6.5'),\n   [-9320, 0])],\n [('control single back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission',\n   ([['m1', 'lay', 1000, '2.47', True],\n     ['m3', 'back', 777, '7.09', False],\n     ['m3', 'lay', 2000, '2.84', True]],\n    '5'),\n   [2112, 111]),\n  ('variant scenario 1', ([['m3', 'lay', 250, '4.16', False]], '5'), [-790, 0]),\n  ('variant scenario 2',\n   ([['m3', 'back', 2000, '1.81', False],\n     ['m2', 'lay', 2000, '7.12', False],\n     ['m1', 'lay', 250, '4.83', False]],\n    '6.5'),\n   [-15198, 0])],\n [('control single back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission',\n   ([['m3', 'lay', 100, '6.30', True],\n     ['m1', 'back', 250, '7.35', False],\n     ['m3', 'lay', 2000, '7.86', True]],\n    '6.5'),\n   [1713, 137]),\n  ('regression: per bet commission',\n   ([['m3', 'back', 250, '6.32', True],\n     ['m3', 'back', 1000, '4.82', False],\n     ['m3', 'lay', 250, '5.41', False],\n     ['m1', 'lay', 100, '6.23', True],\n     ['m2', 'lay', 777, '7.89', False]],\n    '5'),\n   [-6032, 5]),\n  ('variant scenario 1',\n   ([['m2', 'back', 1000, '5.07', True], ['m1', 'back', 250, '6.46', True]], '6.5'),\n   [5081, 354]),\n  ('variant scenario 2',\n   ([['m3', 'back', 2000, '2.17', True],\n     ['m2', 'back', 2000, '5.63', True],\n     ['m1', 'back', 250, '2.32', False],\n     ['m2', 'lay', 2000, '6.97', True]],\n    '5'),\n   [12670, 680])],\n [('control single back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission',\n   ([['m3', 'back', 2000, '4.23', False],\n     ['m3', 'lay', 100, '4.06', False],\n     ['m3', 'lay', 2000, '2.15', False],\n     ['m2', 'lay', 250, '4.89', True],\n     ['m3', 'back', 250, '5.27', False]],\n    '5'),\n   [-4619, 13]),\n  ('regression: per bet commission',\n   ([['m2', 'back', 100, '4.06', False],\n     ['m2', 'lay', 1000, '3.28', True],\n     ['m2', 'back', 1000, '3.20', False],\n     ['m1', 'back', 2000, '2.10', False],\n     ['m1', 'lay', 250, '4.14', False]],\n    '2'),\n   [-2885, 0]),\n  ('variant scenario 1',\n   ([['m1', 'lay', 2000, '2.07', False], ['m1', 'lay', 1000, '6.85', False]], '5'),\n   [-7990, 0]),\n  ('variant scenario 2',\n   ([['m2', 'lay', 777, '1.87', True], ['m3', 'back', 100, '2.04', False]], '5'),\n   [638, 39])]]\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":"ff92e4ab1d9d008a20a4389d080f22085c22cc6d62965f42b1258e5205dbc9ab","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(bets, rate_pct):\n    nets = {}\n    for market, side, stake, price, won in bets:\n        p = Fraction(price)\n        if side == 'back':\n            pl = math.floor(stake * (p - 1)) if won else -stake\n        else:\n            pl = stake if won else -math.ceil(stake * (p - 1))\n        nets[(market, len(nets))] = pl\n    comm = 0\n    for m, net in nets.items():\n        if net > 0:\n            comm += math.floor(net * Fraction(rate_pct) / 100 + Fraction(1, 2))\n    return [sum(nets.values()) - comm, comm]\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 back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission',\n   ([['m1', 'back', 100, '5.20', False],\n     ['m2', 'lay', 2000, '6.81', True],\n     ['m3', 'back', 100, '6.84', False],\n     ['m1', 'back', 777, '1.71', True],\n     ['m2', 'lay', 2000, '4.81', False]],\n    '6.5'),\n   [-5298, 29]),\n  ('variant scenario 1',\n   ([['m3', 'back', 1000, '2.37', False],\n     ['m3', 'lay', 1000, '5.47', True],\n     ['m3', 'lay', 1000, '2.53', True],\n     ['m3', 'back', 2000, '5.43', False]],\n    '2'),\n   [-1000, 0]),\n  ('variant scenario 2',\n   ([['m1', 'lay', 100, '6.53', True],\n     ['m1', 'lay', 250, '1.42', False],\n     ['m3', 'back', 100, '5.84', True],\n     ['m1', 'back', 250, '4.21', False]],\n    '6.5'),\n   [198, 31])],\n [('control single back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission', ([['m3', 'back', 100, '3.97', False]], '5'), [-100, 0]),\n  ('regression: per bet commission',\n   ([['m3', 'lay', 100, '2.39', True],\n     ['m1', 'lay', 2000, '5.94', False],\n     ['m3', 'back', 777, '3.75', True]],\n    '6.5'),\n   [-7789, 145]),\n  ('variant scenario 1',\n   ([['m1', 'back', 777, '1.23', False],\n     ['m2', 'lay', 250, '7.80', True],\n     ['m2', 'back', 100, '4.41', True]],\n    '5'),\n   [-216, 30]),\n  ('variant scenario 2',\n   ([['m3', 'back', 2000, '4.01', False],\n     ['m1', 'lay', 100, '3.22', False],\n     ['m3', 'lay', 777, '7.56', False],\n     ['m1', 'back', 2000, '1.35', False]],\n    '6.5'),\n   [-9320, 0])],\n [('control single back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission',\n   ([['m1', 'lay', 1000, '2.47', True],\n     ['m3', 'back', 777, '7.09', False],\n     ['m3', 'lay', 2000, '2.84', True]],\n    '5'),\n   [2112, 111]),\n  ('variant scenario 1', ([['m3', 'lay', 250, '4.16', False]], '5'), [-790, 0]),\n  ('variant scenario 2',\n   ([['m3', 'back', 2000, '1.81', False],\n     ['m2', 'lay', 2000, '7.12', False],\n     ['m1', 'lay', 250, '4.83', False]],\n    '6.5'),\n   [-15198, 0])],\n [('control single back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission',\n   ([['m3', 'lay', 100, '6.30', True],\n     ['m1', 'back', 250, '7.35', False],\n     ['m3', 'lay', 2000, '7.86', True]],\n    '6.5'),\n   [1713, 137]),\n  ('regression: per bet commission',\n   ([['m3', 'back', 250, '6.32', True],\n     ['m3', 'back', 1000, '4.82', False],\n     ['m3', 'lay', 250, '5.41', False],\n     ['m1', 'lay', 100, '6.23', True],\n     ['m2', 'lay', 777, '7.89', False]],\n    '5'),\n   [-6032, 5]),\n  ('variant scenario 1',\n   ([['m2', 'back', 1000, '5.07', True], ['m1', 'back', 250, '6.46', True]], '6.5'),\n   [5081, 354]),\n  ('variant scenario 2',\n   ([['m3', 'back', 2000, '2.17', True],\n     ['m2', 'back', 2000, '5.63', True],\n     ['m1', 'back', 250, '2.32', False],\n     ['m2', 'lay', 2000, '6.97', True]],\n    '5'),\n   [12670, 680])],\n [('control single back winner', ([['m1', 'back', 1000, '3.00', True]], '5'), [1900, 100]),\n  ('boundary hedged market nets out',\n   ([['m1', 'back', 1000, '3.00', True], ['m1', 'lay', 1000, '2.50', False]], '5'),\n   [475, 25]),\n  ('control lay winner', ([['m2', 'lay', 1000, '4.00', True]], '5'), [950, 50]),\n  ('boundary losing market no commission',\n   ([['m1', 'back', 1000, '3.00', False], ['m1', 'lay', 500, '2.00', True]], '5'),\n   [-500, 0]),\n  ('regression: per bet commission',\n   ([['m3', 'back', 2000, '4.23', False],\n     ['m3', 'lay', 100, '4.06', False],\n     ['m3', 'lay', 2000, '2.15', False],\n     ['m2', 'lay', 250, '4.89', True],\n     ['m3', 'back', 250, '5.27', False]],\n    '5'),\n   [-4619, 13]),\n  ('regression: per bet commission',\n   ([['m2', 'back', 100, '4.06', False],\n     ['m2', 'lay', 1000, '3.28', True],\n     ['m2', 'back', 1000, '3.20', False],\n     ['m1', 'back', 2000, '2.10', False],\n     ['m1', 'lay', 250, '4.14', False]],\n    '2'),\n   [-2885, 0]),\n  ('variant scenario 1',\n   ([['m1', 'lay', 2000, '2.07', False], ['m1', 'lay', 1000, '6.85', False]], '5'),\n   [-7990, 0]),\n  ('variant scenario 2',\n   ([['m2', 'lay', 777, '1.87', True], ['m3', 'back', 100, '2.04', False]], '5'),\n   [638, 39])]]\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-exchange-market-commission-per-bet-commission","generated_at":"2026-09-29T14:50:31.782757+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Exchanges charge commission on net market winnings, not per winning bet.","root_cause":"The net ledger is keyed per bet, so every winning bet is commissioned separately.","sha256":"b0ea4bf9bd06d9c0ad9662604999c2d2e9e6e51bd5a6885358d2093ee56d6bc5","title":"Commission charged per winning bet instead of per market · 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.272,"exit_code":1,"observations":[{"actual":[1900,100],"check":"control single back winner","expected":[1900,100],"passed":true},{"actual":[1900,100],"check":"boundary hedged market nets out","expected":[475,25],"passed":false},{"actual":[950,50],"check":"control lay winner","expected":[950,50],"passed":true},{"actual":[475,25],"check":"boundary losing market no commission","expected":[-500,0],"passed":false},{"actual":[2385,166],"check":"regression: per bet commission","expected":[-5298,29],"passed":false},{"actual":[1960,40],"check":"variant scenario 1","expected":[-1000,0],"passed":false},{"actual":[546,38],"check":"variant scenario 2","expected":[198,31],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control single back winner\", \"actual\": [1900, 100], \"expected\": [1900, 100], \"passed\": true}, {\"check\": \"boundary hedged market nets out\", \"actual\": [1900, 100], \"expected\": [475, 25], \"passed\": false}, {\"check\": \"control lay winner\", \"actual\": [950, 50], \"expected\": [950, 50], \"passed\": true}, {\"check\": \"boundary losing market no commission\", \"actual\": [475, 25], \"expected\": [-500, 0], \"passed\": false}, {\"check\": \"regression: per bet commission\", \"actual\": [2385, 166], \"expected\": [-5298, 29], \"passed\": false}, {\"check\": \"variant scenario 1\", \"actual\": [1960, 40], \"expected\": [-1000, 0], \"passed\": false}, {\"check\": \"variant scenario 2\", \"actual\": [546, 38], \"expected\": [198, 31], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.213,"exit_code":1,"observations":[{"actual":[1900,100],"check":"control single back winner","expected":[1900,100],"passed":true},{"actual":[400,100],"check":"boundary hedged market nets out","expected":[475,25],"passed":false},{"actual":[950,50],"check":"control lay winner","expected":[950,50],"passed":true},{"actual":[-525,25],"check":"boundary losing market no commission","expected":[-500,0],"passed":false},{"actual":[-5435,166],"check":"regression: per bet commission","expected":[-5298,29],"passed":false},{"actual":[-1040,40],"check":"variant scenario 1","expected":[-1000,0],"passed":false},{"actual":[191,38],"check":"variant scenario 2","expected":[198,31],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control single back winner\", \"actual\": [1900, 100], \"expected\": [1900, 100], \"passed\": true}, {\"check\": \"boundary hedged market nets out\", \"actual\": [400, 100], \"expected\": [475, 25], \"passed\": false}, {\"check\": \"control lay winner\", \"actual\": [950, 50], \"expected\": [950, 50], \"passed\": true}, {\"check\": \"boundary losing market no commission\", \"actual\": [-525, 25], \"expected\": [-500, 0], \"passed\": false}, {\"check\": \"regression: per bet commission\", \"actual\": [-5435, 166], \"expected\": [-5298, 29], \"passed\": false}, {\"check\": \"variant scenario 1\", \"actual\": [-1040, 40], \"expected\": [-1000, 0], \"passed\": false}, {\"check\": \"variant scenario 2\", \"actual\": [191, 38], \"expected\": [198, 31], \"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."}}