{"abstract":"\"2/1 on\" is priced as 3.00 instead of 1.50.","category":"Betting odds conversion","checks":10,"contract":"Parse traditional fractional odds text, case-insensitively: \"a/b\" or \"a-b\" with positive integers, \"evens\"/\"evs\"/\"even\" for 1/1, and an optional trailing \" on\" meaning odds-on (the fraction is inverted, \"2/1 on\" = 1/2). Zero parts or anything else return \"invalid\". Return [decimal price rounded half up to two decimals, reduced profit fraction \"a/b\"].","evaluation_group":"w2-odds-conversion-fractional-odds-parser","failed_approach":"Inverting the decimal price instead of the fraction produces a sub-1 decimal and leaves the fraction un-inverted.","family":"w2-odds-conversion-fractional-odds-parser-odds-on-inversion","id":"FA-84391","implementations":{"attempt":{"sha256":"b69d08886f320ac1a2cbd93850d8e3c6072245c067b4a051de6e0ddd5fdf0c97","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(text):\n    t = text.strip().lower()\n    on = t.endswith(' on')\n    if on:\n        t = t[:-3].strip()\n    if t in ('evens', 'evs', 'even'):\n        frac = Fraction(1)\n    else:\n        for sep in ('/', '-'):\n            if sep in t:\n                a, _, b = t.partition(sep)\n                break\n        else:\n            return 'invalid'\n        if not a.isdigit() or not b.isdigit() or int(b) == 0 or int(a) == 0:\n            return 'invalid'\n        frac = Fraction(int(a), int(b))\n    dec = 1 + frac\n    if on:\n        dec = 1 / dec\n    cents = math.floor(dec * 100 + Fraction(1, 2))\n    return ['%d.%02d' % (cents // 100, cents % 100), '%d/%d' % (frac.numerator, frac.denominator)]\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 five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('3/6 on',), ['3.00', '2/1']),\n  ('variant scenario 1', ('evens',), ['2.00', '1/1']),\n  ('variant scenario 2', ('12/5',), ['3.40', '12/5'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('15/13 ON',), ['1.87', '13/15']),\n  ('variant scenario 1', ('evens',), ['2.00', '1/1']),\n  ('variant scenario 2', ('10/8',), ['2.25', '5/4'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('4/1 ON',), ['1.25', '1/4']),\n  ('variant scenario 1', ('1/8',), ['1.13', '1/8']),\n  ('variant scenario 2', ('3-3',), ['2.00', '1/1'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('11/8 ON',), ['1.73', '8/11']),\n  ('variant scenario 1', ('4/3',), ['2.33', '4/3']),\n  ('variant scenario 2', ('2/3',), ['1.67', '2/3'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('3-6 ON',), ['3.00', '2/1']),\n  ('variant scenario 1', ('2/10',), ['1.20', '1/5']),\n  ('variant scenario 2', ('5/4',), ['2.25', '5/4'])]]\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":"80a6f1a833a4ddb269497fe643606abbb30594b8d7d0de67571c6a01927d0ed0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(text):\n    t = text.strip().lower()\n    on = t.endswith(' on')\n    if on:\n        t = t[:-3].strip()\n    if t in ('evens', 'evs', 'even'):\n        frac = Fraction(1)\n    else:\n        for sep in ('/', '-'):\n            if sep in t:\n                a, _, b = t.partition(sep)\n                break\n        else:\n            return 'invalid'\n        if not a.isdigit() or not b.isdigit() or int(b) == 0 or int(a) == 0:\n            return 'invalid'\n        frac = Fraction(int(a), int(b))\n    dec = 1 + frac\n    cents = math.floor(dec * 100 + Fraction(1, 2))\n    return ['%d.%02d' % (cents // 100, cents % 100), '%d/%d' % (frac.numerator, frac.denominator)]\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 five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('3/6 on',), ['3.00', '2/1']),\n  ('variant scenario 1', ('evens',), ['2.00', '1/1']),\n  ('variant scenario 2', ('12/5',), ['3.40', '12/5'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('15/13 ON',), ['1.87', '13/15']),\n  ('variant scenario 1', ('evens',), ['2.00', '1/1']),\n  ('variant scenario 2', ('10/8',), ['2.25', '5/4'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('4/1 ON',), ['1.25', '1/4']),\n  ('variant scenario 1', ('1/8',), ['1.13', '1/8']),\n  ('variant scenario 2', ('3-3',), ['2.00', '1/1'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('11/8 ON',), ['1.73', '8/11']),\n  ('variant scenario 1', ('4/3',), ['2.33', '4/3']),\n  ('variant scenario 2', ('2/3',), ['1.67', '2/3'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('3-6 ON',), ['3.00', '2/1']),\n  ('variant scenario 1', ('2/10',), ['1.20', '1/5']),\n  ('variant scenario 2', ('5/4',), ['2.25', '5/4'])]]\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":"0e1cb4a6b378eba1657023fc1d34a472b6d905f6fc0105a71b7a444d1dd11957","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nimport math\nN = 1\nobservations = []\ndef solve(text):\n    t = text.strip().lower()\n    on = t.endswith(' on')\n    if on:\n        t = t[:-3].strip()\n    if t in ('evens', 'evs', 'even'):\n        frac = Fraction(1)\n    else:\n        for sep in ('/', '-'):\n            if sep in t:\n                a, _, b = t.partition(sep)\n                break\n        else:\n            return 'invalid'\n        if not a.isdigit() or not b.isdigit() or int(b) == 0 or int(a) == 0:\n            return 'invalid'\n        frac = Fraction(int(a), int(b))\n    if on:\n        frac = 1 / frac\n    dec = 1 + frac\n    cents = math.floor(dec * 100 + Fraction(1, 2))\n    return ['%d.%02d' % (cents // 100, cents % 100), '%d/%d' % (frac.numerator, frac.denominator)]\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 five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('3/6 on',), ['3.00', '2/1']),\n  ('variant scenario 1', ('evens',), ['2.00', '1/1']),\n  ('variant scenario 2', ('12/5',), ['3.40', '12/5'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('15/13 ON',), ['1.87', '13/15']),\n  ('variant scenario 1', ('evens',), ['2.00', '1/1']),\n  ('variant scenario 2', ('10/8',), ['2.25', '5/4'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('4/1 ON',), ['1.25', '1/4']),\n  ('variant scenario 1', ('1/8',), ['1.13', '1/8']),\n  ('variant scenario 2', ('3-3',), ['2.00', '1/1'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('11/8 ON',), ['1.73', '8/11']),\n  ('variant scenario 1', ('4/3',), ['2.33', '4/3']),\n  ('variant scenario 2', ('2/3',), ['1.67', '2/3'])],\n [('control five to two', ('5/2',), ['3.50', '5/2']),\n  ('control hyphen separator', ('11-4',), ['3.75', '11/4']),\n  ('boundary evens alias', ('EVS',), ['2.00', '1/1']),\n  ('boundary odds-on suffix', ('2/1 on',), ['1.50', '1/2']),\n  ('boundary unreduced input', ('4/6',), ['1.67', '2/3']),\n  ('boundary zero denominator', ('5/0',), 'invalid'),\n  ('control half-up rounding', ('1/8',), ['1.13', '1/8']),\n  ('regression: odds on inversion', ('3-6 ON',), ['3.00', '2/1']),\n  ('variant scenario 1', ('2/10',), ['1.20', '1/5']),\n  ('variant scenario 2', ('5/4',), ['2.25', '5/4'])]]\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-fractional-odds-parser-odds-on-inversion","generated_at":"2026-09-29T14:50:30.440790+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Racing feeds and manual price entry use traditional fractional notation with odds-on suffixes.","repair":"Invert the fraction for odds-on prices before deriving the decimal price.","root_cause":"The \" on\" suffix is removed but the fraction is never inverted.","sha256":"276a45b60919fc948277864620b6cf50cbccbd89afdc075ef94137150f99c04a","title":"Odds-on suffix stripped but the price not inverted · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.666,"exit_code":1,"observations":[{"actual":["3.50","5/2"],"check":"control five to two","expected":["3.50","5/2"],"passed":true},{"actual":["3.75","11/4"],"check":"control hyphen separator","expected":["3.75","11/4"],"passed":true},{"actual":["2.00","1/1"],"check":"boundary evens alias","expected":["2.00","1/1"],"passed":true},{"actual":["0.33","2/1"],"check":"boundary odds-on suffix","expected":["1.50","1/2"],"passed":false},{"actual":["1.67","2/3"],"check":"boundary unreduced input","expected":["1.67","2/3"],"passed":true},{"actual":"invalid","check":"boundary zero denominator","expected":"invalid","passed":true},{"actual":["1.13","1/8"],"check":"control half-up rounding","expected":["1.13","1/8"],"passed":true},{"actual":["0.67","1/2"],"check":"regression: odds on inversion","expected":["3.00","2/1"],"passed":false},{"actual":["2.00","1/1"],"check":"variant scenario 1","expected":["2.00","1/1"],"passed":true},{"actual":["3.40","12/5"],"check":"variant scenario 2","expected":["3.40","12/5"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control five to two\", \"actual\": [\"3.50\", \"5/2\"], \"expected\": [\"3.50\", \"5/2\"], \"passed\": true}, {\"check\": \"control hyphen separator\", \"actual\": [\"3.75\", \"11/4\"], \"expected\": [\"3.75\", \"11/4\"], \"passed\": true}, {\"check\": \"boundary evens alias\", \"actual\": [\"2.00\", \"1/1\"], \"expected\": [\"2.00\", \"1/1\"], \"passed\": true}, {\"check\": \"boundary odds-on suffix\", \"actual\": [\"0.33\", \"2/1\"], \"expected\": [\"1.50\", \"1/2\"], \"passed\": false}, {\"check\": \"boundary unreduced input\", \"actual\": [\"1.67\", \"2/3\"], \"expected\": [\"1.67\", \"2/3\"], \"passed\": true}, {\"check\": \"boundary zero denominator\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"control half-up rounding\", \"actual\": [\"1.13\", \"1/8\"], \"expected\": [\"1.13\", \"1/8\"], \"passed\": true}, {\"check\": \"regression: odds on inversion\", \"actual\": [\"0.67\", \"1/2\"], \"expected\": [\"3.00\", \"2/1\"], \"passed\": false}, {\"check\": \"variant scenario 1\", \"actual\": [\"2.00\", \"1/1\"], \"expected\": [\"2.00\", \"1/1\"], \"passed\": true}, {\"check\": \"variant scenario 2\", \"actual\": [\"3.40\", \"12/5\"], \"expected\": [\"3.40\", \"12/5\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.337,"exit_code":1,"observations":[{"actual":["3.50","5/2"],"check":"control five to two","expected":["3.50","5/2"],"passed":true},{"actual":["3.75","11/4"],"check":"control hyphen separator","expected":["3.75","11/4"],"passed":true},{"actual":["2.00","1/1"],"check":"boundary evens alias","expected":["2.00","1/1"],"passed":true},{"actual":["3.00","2/1"],"check":"boundary odds-on suffix","expected":["1.50","1/2"],"passed":false},{"actual":["1.67","2/3"],"check":"boundary unreduced input","expected":["1.67","2/3"],"passed":true},{"actual":"invalid","check":"boundary zero denominator","expected":"invalid","passed":true},{"actual":["1.13","1/8"],"check":"control half-up rounding","expected":["1.13","1/8"],"passed":true},{"actual":["1.50","1/2"],"check":"regression: odds on inversion","expected":["3.00","2/1"],"passed":false},{"actual":["2.00","1/1"],"check":"variant scenario 1","expected":["2.00","1/1"],"passed":true},{"actual":["3.40","12/5"],"check":"variant scenario 2","expected":["3.40","12/5"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control five to two\", \"actual\": [\"3.50\", \"5/2\"], \"expected\": [\"3.50\", \"5/2\"], \"passed\": true}, {\"check\": \"control hyphen separator\", \"actual\": [\"3.75\", \"11/4\"], \"expected\": [\"3.75\", \"11/4\"], \"passed\": true}, {\"check\": \"boundary evens alias\", \"actual\": [\"2.00\", \"1/1\"], \"expected\": [\"2.00\", \"1/1\"], \"passed\": true}, {\"check\": \"boundary odds-on suffix\", \"actual\": [\"3.00\", \"2/1\"], \"expected\": [\"1.50\", \"1/2\"], \"passed\": false}, {\"check\": \"boundary unreduced input\", \"actual\": [\"1.67\", \"2/3\"], \"expected\": [\"1.67\", \"2/3\"], \"passed\": true}, {\"check\": \"boundary zero denominator\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"control half-up rounding\", \"actual\": [\"1.13\", \"1/8\"], \"expected\": [\"1.13\", \"1/8\"], \"passed\": true}, {\"check\": \"regression: odds on inversion\", \"actual\": [\"1.50\", \"1/2\"], \"expected\": [\"3.00\", \"2/1\"], \"passed\": false}, {\"check\": \"variant scenario 1\", \"actual\": [\"2.00\", \"1/1\"], \"expected\": [\"2.00\", \"1/1\"], \"passed\": true}, {\"check\": \"variant scenario 2\", \"actual\": [\"3.40\", \"12/5\"], \"expected\": [\"3.40\", \"12/5\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.438,"exit_code":0,"observations":[{"actual":["3.50","5/2"],"check":"control five to two","expected":["3.50","5/2"],"passed":true},{"actual":["3.75","11/4"],"check":"control hyphen separator","expected":["3.75","11/4"],"passed":true},{"actual":["2.00","1/1"],"check":"boundary evens alias","expected":["2.00","1/1"],"passed":true},{"actual":["1.50","1/2"],"check":"boundary odds-on suffix","expected":["1.50","1/2"],"passed":true},{"actual":["1.67","2/3"],"check":"boundary unreduced input","expected":["1.67","2/3"],"passed":true},{"actual":"invalid","check":"boundary zero denominator","expected":"invalid","passed":true},{"actual":["1.13","1/8"],"check":"control half-up rounding","expected":["1.13","1/8"],"passed":true},{"actual":["3.00","2/1"],"check":"regression: odds on inversion","expected":["3.00","2/1"],"passed":true},{"actual":["2.00","1/1"],"check":"variant scenario 1","expected":["2.00","1/1"],"passed":true},{"actual":["3.40","12/5"],"check":"variant scenario 2","expected":["3.40","12/5"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control five to two\", \"actual\": [\"3.50\", \"5/2\"], \"expected\": [\"3.50\", \"5/2\"], \"passed\": true}, {\"check\": \"control hyphen separator\", \"actual\": [\"3.75\", \"11/4\"], \"expected\": [\"3.75\", \"11/4\"], \"passed\": true}, {\"check\": \"boundary evens alias\", \"actual\": [\"2.00\", \"1/1\"], \"expected\": [\"2.00\", \"1/1\"], \"passed\": true}, {\"check\": \"boundary odds-on suffix\", \"actual\": [\"1.50\", \"1/2\"], \"expected\": [\"1.50\", \"1/2\"], \"passed\": true}, {\"check\": \"boundary unreduced input\", \"actual\": [\"1.67\", \"2/3\"], \"expected\": [\"1.67\", \"2/3\"], \"passed\": true}, {\"check\": \"boundary zero denominator\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"control half-up rounding\", \"actual\": [\"1.13\", \"1/8\"], \"expected\": [\"1.13\", \"1/8\"], \"passed\": true}, {\"check\": \"regression: odds on inversion\", \"actual\": [\"3.00\", \"2/1\"], \"expected\": [\"3.00\", \"2/1\"], \"passed\": true}, {\"check\": \"variant scenario 1\", \"actual\": [\"2.00\", \"1/1\"], \"expected\": [\"2.00\", \"1/1\"], \"passed\": true}, {\"check\": \"variant scenario 2\", \"actual\": [\"3.40\", \"12/5\"], \"expected\": [\"3.40\", \"12/5\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}