{"abstract":"EURJPY is computed as 139.7 instead of 164.0.","category":"Currency rounding and FX conversion","checks":6,"contract":"solve(quotes, target): quotes maps six-letter pairs to rates (QUOTE units per BASE unit). For currency c, units per USD are: 1 for USD; quotes['USD'+c] if present (authoritative when both orientations exist); else 1/quotes[c+'USD']; else unknown. The target BBBQQQ rate = (QQQ per USD)/(BBB per USD), rounded half-even to 6 decimals and returned as a string; an unknown leg returns 'ERR:no-quote'.","evaluation_group":"w2-currency_rounding_and_fx_conversion-usd-quote-convention-cross","failed_approach":"Inverting both orientations fixes XXXUSD legs but breaks USDXXX legs.","family":"w2-currency_rounding_and_fx_conversion-usd-quote-convention-cross-quote-orientation","id":"FA-62256","implementations":{"attempt":{"sha256":"c36f5fafd7b97addd1ca398ef4fceb72fea4f1099402ecd8fd42692e1536ba89","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_FLOOR, ROUND_CEILING, ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN\nN = 1\nobservations = []\ndef solve(quotes, target):\n    def per_usd(c):\n        if c == 'USD': return Decimal(1)\n        if 'USD' + c in quotes: return 1 / Decimal(quotes['USD' + c])\n        if c + 'USD' in quotes: return Decimal(quotes[c + 'USD'])\n        return None\n    b, q = target[:3], target[3:]\n    pb, pq = per_usd(b), per_usd(q)\n    if pb is None or pq is None: return 'ERR:no-quote'\n    return format((pq / pb).quantize(Decimal('0.000001'), rounding=ROUND_HALF_EVEN), 'f')\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression quote-orientation 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),\n   '164.009395'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513'),\n  ('control: direct usd base',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000'),\n  ('control: usd quote',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),\n   '0.006606'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote'),\n  ('control: franc aussie',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443')],\n [('regression quote-orientation 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935'),\n  ('partial repair guard 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),\n   '0.006606'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote'),\n  ('control: both orientations',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDEUR': '0.9231'},\n    'EURCHF'),\n   '0.953418'),\n  ('control: euro yen',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),\n   '164.009395'),\n  ('control: sterling euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513')],\n [('regression quote-orientation 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),\n   '0.581922'),\n  ('regression quote-orientation 2',\n   ({'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577',\n     'JPYUSD': '0.006610'},\n    'CHFGBP'),\n   '0.898209'),\n  ('partial repair guard 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDEUR': '0.9231'},\n    'EURCHF'),\n   '0.953418'),\n  ('control: usd to euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935'),\n  ('control: euro yen',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),\n   '164.009395'),\n  ('control: sterling euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513'),\n  ('control: direct usd base',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000')],\n [('regression quote-orientation 1',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'EURAUD'),\n   '1.638687'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'USDGBP'),\n   '0.790514'),\n  ('partial repair guard 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),\n   '0.581922'),\n  ('control: sterling euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513'),\n  ('control: direct usd base',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000'),\n  ('control: usd quote',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),\n   '0.006606'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote')],\n [('regression quote-orientation 1',\n   ({'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'EURGBP'), '0.856369'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'CADGBP'),\n   '0.582245'),\n  ('partial repair guard 1',\n   ({'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577',\n     'JPYUSD': '0.006610'},\n    'CHFGBP'),\n   '0.898209'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'EURAUD'),\n   '1.638687'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote'),\n  ('control: franc aussie',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443'),\n  ('control: both orientations',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDEUR': '0.9231'},\n    'EURCHF'),\n   '0.953418'),\n  ('control: usd to euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935')]]\nfor label, args, expected in cases[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":"17d9f7fd6adc121248393a46f670e2ffe2d0e7862b546988fb388c94958e6868","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_FLOOR, ROUND_CEILING, ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN\nN = 1\nobservations = []\ndef solve(quotes, target):\n    def per_usd(c):\n        if c == 'USD': return Decimal(1)\n        if 'USD' + c in quotes: return Decimal(quotes['USD' + c])\n        if c + 'USD' in quotes: return Decimal(quotes[c + 'USD'])\n        return None\n    b, q = target[:3], target[3:]\n    pb, pq = per_usd(b), per_usd(q)\n    if pb is None or pq is None: return 'ERR:no-quote'\n    return format((pq / pb).quantize(Decimal('0.000001'), rounding=ROUND_HALF_EVEN), 'f')\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression quote-orientation 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),\n   '164.009395'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513'),\n  ('control: direct usd base',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000'),\n  ('control: usd quote',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),\n   '0.006606'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote'),\n  ('control: franc aussie',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443')],\n [('regression quote-orientation 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935'),\n  ('partial repair guard 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),\n   '0.006606'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote'),\n  ('control: both orientations',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDEUR': '0.9231'},\n    'EURCHF'),\n   '0.953418'),\n  ('control: euro yen',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),\n   '164.009395'),\n  ('control: sterling euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513')],\n [('regression quote-orientation 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),\n   '0.581922'),\n  ('regression quote-orientation 2',\n   ({'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577',\n     'JPYUSD': '0.006610'},\n    'CHFGBP'),\n   '0.898209'),\n  ('partial repair guard 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDEUR': '0.9231'},\n    'EURCHF'),\n   '0.953418'),\n  ('control: usd to euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935'),\n  ('control: euro yen',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),\n   '164.009395'),\n  ('control: sterling euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513'),\n  ('control: direct usd base',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000')],\n [('regression quote-orientation 1',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'EURAUD'),\n   '1.638687'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'USDGBP'),\n   '0.790514'),\n  ('partial repair guard 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),\n   '0.581922'),\n  ('control: sterling euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513'),\n  ('control: direct usd base',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000'),\n  ('control: usd quote',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),\n   '0.006606'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote')],\n [('regression quote-orientation 1',\n   ({'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'EURGBP'), '0.856369'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'CADGBP'),\n   '0.582245'),\n  ('partial repair guard 1',\n   ({'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577',\n     'JPYUSD': '0.006610'},\n    'CHFGBP'),\n   '0.898209'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'EURAUD'),\n   '1.638687'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote'),\n  ('control: franc aussie',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443'),\n  ('control: both orientations',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDEUR': '0.9231'},\n    'EURCHF'),\n   '0.953418'),\n  ('control: usd to euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935')]]\nfor label, args, expected in cases[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":"eb0295bba9d898ea0bdd9d87a000b280d6e8f3fa79afe6f5b66bb039315ed599","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_FLOOR, ROUND_CEILING, ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN\nN = 1\nobservations = []\ndef solve(quotes, target):\n    def per_usd(c):\n        if c == 'USD': return Decimal(1)\n        if 'USD' + c in quotes: return Decimal(quotes['USD' + c])\n        if c + 'USD' in quotes: return 1 / Decimal(quotes[c + 'USD'])\n        return None\n    b, q = target[:3], target[3:]\n    pb, pq = per_usd(b), per_usd(q)\n    if pb is None or pq is None: return 'ERR:no-quote'\n    return format((pq / pb).quantize(Decimal('0.000001'), rounding=ROUND_HALF_EVEN), 'f')\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression quote-orientation 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),\n   '164.009395'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513'),\n  ('control: direct usd base',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000'),\n  ('control: usd quote',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),\n   '0.006606'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote'),\n  ('control: franc aussie',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443')],\n [('regression quote-orientation 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935'),\n  ('partial repair guard 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),\n   '0.006606'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote'),\n  ('control: both orientations',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDEUR': '0.9231'},\n    'EURCHF'),\n   '0.953418'),\n  ('control: euro yen',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),\n   '164.009395'),\n  ('control: sterling euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513')],\n [('regression quote-orientation 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),\n   '0.581922'),\n  ('regression quote-orientation 2',\n   ({'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577',\n     'JPYUSD': '0.006610'},\n    'CHFGBP'),\n   '0.898209'),\n  ('partial repair guard 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDEUR': '0.9231'},\n    'EURCHF'),\n   '0.953418'),\n  ('control: usd to euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935'),\n  ('control: euro yen',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),\n   '164.009395'),\n  ('control: sterling euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513'),\n  ('control: direct usd base',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000')],\n [('regression quote-orientation 1',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'EURAUD'),\n   '1.638687'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'USDGBP'),\n   '0.790514'),\n  ('partial repair guard 1',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),\n   '0.581922'),\n  ('control: sterling euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),\n   '1.167513'),\n  ('control: direct usd base',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),\n   '151.370000'),\n  ('control: usd quote',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),\n   '0.006606'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote')],\n [('regression quote-orientation 1',\n   ({'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'EURGBP'), '0.856369'),\n  ('regression quote-orientation 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'CADGBP'),\n   '0.582245'),\n  ('partial repair guard 1',\n   ({'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577',\n     'JPYUSD': '0.006610'},\n    'CHFGBP'),\n   '0.898209'),\n  ('partial repair guard 2',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDCAD': '1.3577'},\n    'EURAUD'),\n   '1.638687'),\n  ('control: missing leg',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),\n   'ERR:no-quote'),\n  ('control: franc aussie',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),\n   '1.718443'),\n  ('control: both orientations',\n   ({'USDJPY': '151.37',\n     'EURUSD': '1.0835',\n     'GBPUSD': '1.2650',\n     'USDCHF': '0.8801',\n     'AUDUSD': '0.6612',\n     'USDEUR': '0.9231'},\n    'EURCHF'),\n   '0.953418'),\n  ('control: usd to euro',\n   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),\n   '0.922935')]]\nfor label, args, expected in cases[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":"A deterministic, bounded teaching model with a stipulated toy contract; it makes no claim of conformance to any real regulation, standard, or institution's rules. 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-currency_rounding_and_fx_conversion-usd-quote-convention-cross-quote-orientation","generated_at":"2026-09-29T14:47:02.993705+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Currency amounts must be rounded at the right stage and in the right unit, or ledgers, quotes and settlements drift by minor units.","repair":"Invert quotes where USD is the quote currency.","root_cause":"The c+'USD' quote (USD per c) is returned directly as c per USD.","sha256":"fbaab3ea94a282b948c6b322c99d7e6526c26afdd1c1999dc6df01177468eedb","title":"A XXXUSD quote is used as units per USD without inversion · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":45.203,"exit_code":1,"observations":[{"actual":"0.006097","check":"regression quote-orientation 1","expected":"164.009395","passed":false},{"actual":"0.856522","check":"regression quote-orientation 2","expected":"1.167513","passed":false},{"actual":"0.006606","check":"control: direct usd base","expected":"151.370000","passed":false},{"actual":"151.370000","check":"control: usd quote","expected":"0.006606","passed":false},{"actual":"ERR:no-quote","check":"control: missing leg","expected":"ERR:no-quote","passed":true},{"actual":"0.581922","check":"control: franc aussie","expected":"1.718443","passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression quote-orientation 1\", \"actual\": \"0.006097\", \"expected\": \"164.009395\", \"passed\": false}, {\"check\": \"regression quote-orientation 2\", \"actual\": \"0.856522\", \"expected\": \"1.167513\", \"passed\": false}, {\"check\": \"control: direct usd base\", \"actual\": \"0.006606\", \"expected\": \"151.370000\", \"passed\": false}, {\"check\": \"control: usd quote\", \"actual\": \"151.370000\", \"expected\": \"0.006606\", \"passed\": false}, {\"check\": \"control: missing leg\", \"actual\": \"ERR:no-quote\", \"expected\": \"ERR:no-quote\", \"passed\": true}, {\"check\": \"control: franc aussie\", \"actual\": \"0.581922\", \"expected\": \"1.718443\", \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.899,"exit_code":1,"observations":[{"actual":"139.704661","check":"regression quote-orientation 1","expected":"164.009395","passed":false},{"actual":"0.856522","check":"regression quote-orientation 2","expected":"1.167513","passed":false},{"actual":"151.370000","check":"control: direct usd base","expected":"151.370000","passed":true},{"actual":"0.006606","check":"control: usd quote","expected":"0.006606","passed":true},{"actual":"ERR:no-quote","check":"control: missing leg","expected":"ERR:no-quote","passed":true},{"actual":"0.751278","check":"control: franc aussie","expected":"1.718443","passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression quote-orientation 1\", \"actual\": \"139.704661\", \"expected\": \"164.009395\", \"passed\": false}, {\"check\": \"regression quote-orientation 2\", \"actual\": \"0.856522\", \"expected\": \"1.167513\", \"passed\": false}, {\"check\": \"control: direct usd base\", \"actual\": \"151.370000\", \"expected\": \"151.370000\", \"passed\": true}, {\"check\": \"control: usd quote\", \"actual\": \"0.006606\", \"expected\": \"0.006606\", \"passed\": true}, {\"check\": \"control: missing leg\", \"actual\": \"ERR:no-quote\", \"expected\": \"ERR:no-quote\", \"passed\": true}, {\"check\": \"control: franc aussie\", \"actual\": \"0.751278\", \"expected\": \"1.718443\", \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.553,"exit_code":0,"observations":[{"actual":"164.009395","check":"regression quote-orientation 1","expected":"164.009395","passed":true},{"actual":"1.167513","check":"regression quote-orientation 2","expected":"1.167513","passed":true},{"actual":"151.370000","check":"control: direct usd base","expected":"151.370000","passed":true},{"actual":"0.006606","check":"control: usd quote","expected":"0.006606","passed":true},{"actual":"ERR:no-quote","check":"control: missing leg","expected":"ERR:no-quote","passed":true},{"actual":"1.718443","check":"control: franc aussie","expected":"1.718443","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression quote-orientation 1\", \"actual\": \"164.009395\", \"expected\": \"164.009395\", \"passed\": true}, {\"check\": \"regression quote-orientation 2\", \"actual\": \"1.167513\", \"expected\": \"1.167513\", \"passed\": true}, {\"check\": \"control: direct usd base\", \"actual\": \"151.370000\", \"expected\": \"151.370000\", \"passed\": true}, {\"check\": \"control: usd quote\", \"actual\": \"0.006606\", \"expected\": \"0.006606\", \"passed\": true}, {\"check\": \"control: missing leg\", \"actual\": \"ERR:no-quote\", \"expected\": \"ERR:no-quote\", \"passed\": true}, {\"check\": \"control: franc aussie\", \"actual\": \"1.718443\", \"expected\": \"1.718443\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}