{"abstract":"A 1.50 price is shown as -50 instead of -200.","category":"Betting odds conversion","checks":9,"contract":"Convert a decimal price string to an American moneyline string. Prices at or below 1 return \"invalid\". For d >= 2 the line is \"+\" followed by 100 * (d - 1); for d < 2 it is \"-\" followed by 100 / (d - 1). The magnitude is computed exactly from the decimal text and rounded half up to an integer. Evens (2.00) is \"+100\".","evaluation_group":"w2-odds-conversion-decimal-to-american","failed_approach":"Dividing 100 by the whole decimal price confuses the moneyline with implied probability.","family":"w2-odds-conversion-decimal-to-american-favourite-formula","id":"FA-84351","implementations":{"attempt":{"sha256":"c29fb3040fc99c8a108f05a1c611533aac8d8ed6a4c433ecce0f18c3d65605ae","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(decimal):\n    d = Fraction(decimal)\n    if d <= 1:\n        return 'invalid'\n    if d >= 2:\n        v = (d - 1) * 100\n        sign = '+'\n    else:\n        v = 100 / d\n        sign = '-'\n    n = math.floor(v + Fraction(1, 2))\n    return sign + str(n)\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 underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.393',), '-254'),\n  ('variant scenario 1', ('2.638',), '+164'),\n  ('variant scenario 2', ('6.44',), '+544')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.600',), '-167'),\n  ('variant scenario 1', ('2.82',), '+182'),\n  ('variant scenario 2', ('5.11',), '+411')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.13',), '-769'),\n  ('variant scenario 1', ('2.98',), '+198'),\n  ('variant scenario 2', ('6.10',), '+510')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.64',), '-156'),\n  ('variant scenario 1', ('13.76',), '+1276'),\n  ('variant scenario 2', ('11.19',), '+1019')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.108',), '-926'),\n  ('variant scenario 1', ('4.59',), '+359'),\n  ('variant scenario 2', ('5.05',), '+405')]]\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":"b34d392109fc4fe7f09dd78f4b64ec22bce85d0c66258b8da55844c6b4cb7ce0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(decimal):\n    d = Fraction(decimal)\n    if d <= 1:\n        return 'invalid'\n    if d >= 2:\n        v = (d - 1) * 100\n        sign = '+'\n    else:\n        v = (d - 1) * 100\n        sign = '-'\n    n = math.floor(v + Fraction(1, 2))\n    return sign + str(n)\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 underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.393',), '-254'),\n  ('variant scenario 1', ('2.638',), '+164'),\n  ('variant scenario 2', ('6.44',), '+544')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.600',), '-167'),\n  ('variant scenario 1', ('2.82',), '+182'),\n  ('variant scenario 2', ('5.11',), '+411')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.13',), '-769'),\n  ('variant scenario 1', ('2.98',), '+198'),\n  ('variant scenario 2', ('6.10',), '+510')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.64',), '-156'),\n  ('variant scenario 1', ('13.76',), '+1276'),\n  ('variant scenario 2', ('11.19',), '+1019')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.108',), '-926'),\n  ('variant scenario 1', ('4.59',), '+359'),\n  ('variant scenario 2', ('5.05',), '+405')]]\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":"09db47a6e94e56ad5dcb1ac33ff3941ae1bb870ba37ad16ecf6ca5ecbd8be47f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(decimal):\n    d = Fraction(decimal)\n    if d <= 1:\n        return 'invalid'\n    if d >= 2:\n        v = (d - 1) * 100\n        sign = '+'\n    else:\n        v = 100 / (d - 1)\n        sign = '-'\n    n = math.floor(v + Fraction(1, 2))\n    return sign + str(n)\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 underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.393',), '-254'),\n  ('variant scenario 1', ('2.638',), '+164'),\n  ('variant scenario 2', ('6.44',), '+544')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.600',), '-167'),\n  ('variant scenario 1', ('2.82',), '+182'),\n  ('variant scenario 2', ('5.11',), '+411')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.13',), '-769'),\n  ('variant scenario 1', ('2.98',), '+198'),\n  ('variant scenario 2', ('6.10',), '+510')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.64',), '-156'),\n  ('variant scenario 1', ('13.76',), '+1276'),\n  ('variant scenario 2', ('11.19',), '+1019')],\n [('control underdog', ('2.50',), '+150'),\n  ('control favourite', ('1.50',), '-200'),\n  ('boundary evens', ('2.00',), '+100'),\n  ('boundary half-cent rounds up', ('2.005',), '+101'),\n  ('boundary no-profit price', ('1.00',), 'invalid'),\n  ('control short favourite', ('1.08',), '-1250'),\n  ('regression: favourite formula', ('1.108',), '-926'),\n  ('variant scenario 1', ('4.59',), '+359'),\n  ('variant scenario 2', ('5.05',), '+405')]]\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-decimal-to-american-favourite-formula","generated_at":"2026-09-29T14:50:29.966535+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Sportsbooks display the same price in decimal and American formats and must agree at every boundary.","repair":"Use 100 / (d - 1) for prices below 2.","root_cause":"The favourite branch multiplies the profit by 100 instead of dividing 100 by it.","sha256":"9299d08cee3ca80a78f5b6071641dcb32541b1dbe940a687070fa6c5d4fccde2","title":"Favourite moneyline computed with the underdog formula · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.83,"exit_code":1,"observations":[{"actual":"+150","check":"control underdog","expected":"+150","passed":true},{"actual":"-67","check":"control favourite","expected":"-200","passed":false},{"actual":"+100","check":"boundary evens","expected":"+100","passed":true},{"actual":"+101","check":"boundary half-cent rounds up","expected":"+101","passed":true},{"actual":"invalid","check":"boundary no-profit price","expected":"invalid","passed":true},{"actual":"-93","check":"control short favourite","expected":"-1250","passed":false},{"actual":"-72","check":"regression: favourite formula","expected":"-254","passed":false},{"actual":"+164","check":"variant scenario 1","expected":"+164","passed":true},{"actual":"+544","check":"variant scenario 2","expected":"+544","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control underdog\", \"actual\": \"+150\", \"expected\": \"+150\", \"passed\": true}, {\"check\": \"control favourite\", \"actual\": \"-67\", \"expected\": \"-200\", \"passed\": false}, {\"check\": \"boundary evens\", \"actual\": \"+100\", \"expected\": \"+100\", \"passed\": true}, {\"check\": \"boundary half-cent rounds up\", \"actual\": \"+101\", \"expected\": \"+101\", \"passed\": true}, {\"check\": \"boundary no-profit price\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"control short favourite\", \"actual\": \"-93\", \"expected\": \"-1250\", \"passed\": false}, {\"check\": \"regression: favourite formula\", \"actual\": \"-72\", \"expected\": \"-254\", \"passed\": false}, {\"check\": \"variant scenario 1\", \"actual\": \"+164\", \"expected\": \"+164\", \"passed\": true}, {\"check\": \"variant scenario 2\", \"actual\": \"+544\", \"expected\": \"+544\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":47.372,"exit_code":1,"observations":[{"actual":"+150","check":"control underdog","expected":"+150","passed":true},{"actual":"-50","check":"control favourite","expected":"-200","passed":false},{"actual":"+100","check":"boundary evens","expected":"+100","passed":true},{"actual":"+101","check":"boundary half-cent rounds up","expected":"+101","passed":true},{"actual":"invalid","check":"boundary no-profit price","expected":"invalid","passed":true},{"actual":"-8","check":"control short favourite","expected":"-1250","passed":false},{"actual":"-39","check":"regression: favourite formula","expected":"-254","passed":false},{"actual":"+164","check":"variant scenario 1","expected":"+164","passed":true},{"actual":"+544","check":"variant scenario 2","expected":"+544","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control underdog\", \"actual\": \"+150\", \"expected\": \"+150\", \"passed\": true}, {\"check\": \"control favourite\", \"actual\": \"-50\", \"expected\": \"-200\", \"passed\": false}, {\"check\": \"boundary evens\", \"actual\": \"+100\", \"expected\": \"+100\", \"passed\": true}, {\"check\": \"boundary half-cent rounds up\", \"actual\": \"+101\", \"expected\": \"+101\", \"passed\": true}, {\"check\": \"boundary no-profit price\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"control short favourite\", \"actual\": \"-8\", \"expected\": \"-1250\", \"passed\": false}, {\"check\": \"regression: favourite formula\", \"actual\": \"-39\", \"expected\": \"-254\", \"passed\": false}, {\"check\": \"variant scenario 1\", \"actual\": \"+164\", \"expected\": \"+164\", \"passed\": true}, {\"check\": \"variant scenario 2\", \"actual\": \"+544\", \"expected\": \"+544\", \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.762,"exit_code":0,"observations":[{"actual":"+150","check":"control underdog","expected":"+150","passed":true},{"actual":"-200","check":"control favourite","expected":"-200","passed":true},{"actual":"+100","check":"boundary evens","expected":"+100","passed":true},{"actual":"+101","check":"boundary half-cent rounds up","expected":"+101","passed":true},{"actual":"invalid","check":"boundary no-profit price","expected":"invalid","passed":true},{"actual":"-1250","check":"control short favourite","expected":"-1250","passed":true},{"actual":"-254","check":"regression: favourite formula","expected":"-254","passed":true},{"actual":"+164","check":"variant scenario 1","expected":"+164","passed":true},{"actual":"+544","check":"variant scenario 2","expected":"+544","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control underdog\", \"actual\": \"+150\", \"expected\": \"+150\", \"passed\": true}, {\"check\": \"control favourite\", \"actual\": \"-200\", \"expected\": \"-200\", \"passed\": true}, {\"check\": \"boundary evens\", \"actual\": \"+100\", \"expected\": \"+100\", \"passed\": true}, {\"check\": \"boundary half-cent rounds up\", \"actual\": \"+101\", \"expected\": \"+101\", \"passed\": true}, {\"check\": \"boundary no-profit price\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"control short favourite\", \"actual\": \"-1250\", \"expected\": \"-1250\", \"passed\": true}, {\"check\": \"regression: favourite formula\", \"actual\": \"-254\", \"expected\": \"-254\", \"passed\": true}, {\"check\": \"variant scenario 1\", \"actual\": \"+164\", \"expected\": \"+164\", \"passed\": true}, {\"check\": \"variant scenario 2\", \"actual\": \"+544\", \"expected\": \"+544\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}