FAILURE MAP
← Case archive

FA-62256 / Currency rounding and FX conversion / Open access

A XXXUSD quote is used as units per USD without inversion · case 01

EURJPY is computed as 139.7 instead of 164.0.

Verified by executionVariant 1 · 6 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The c+'USD' quote (USD per c) is returned directly as c per USD.

VERIFIED REPAIR

Invert quotes where USD is the quote currency.

Unsuccessful approach: Inverting both orientations fixes XXXUSD legs but breaks USDXXX legs.

Case 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'.

Why this case matters

Currency amounts must be rounded at the right stage and in the right unit, or ledgers, quotes and settlements drift by minor units.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_FLOOR, ROUND_CEILING, ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN
N = 1
observations = []
def solve(quotes, target):
    def per_usd(c):
        if c == 'USD': return Decimal(1)
        if 'USD' + c in quotes: return Decimal(quotes['USD' + c])
        if c + 'USD' in quotes: return Decimal(quotes[c + 'USD'])
        return None
    b, q = target[:3], target[3:]
    pb, pq = per_usd(b), per_usd(q)
    if pb is None or pq is None: return 'ERR:no-quote'
    return format((pq / pb).quantize(Decimal('0.000001'), rounding=ROUND_HALF_EVEN), 'f')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression quote-orientation 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),
   '164.009395'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513'),
  ('control: direct usd base',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000'),
  ('control: usd quote',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),
   '0.006606'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote'),
  ('control: franc aussie',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443')],
 [('regression quote-orientation 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935'),
  ('partial repair guard 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),
   '0.006606'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote'),
  ('control: both orientations',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDEUR': '0.9231'},
    'EURCHF'),
   '0.953418'),
  ('control: euro yen',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),
   '164.009395'),
  ('control: sterling euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513')],
 [('regression quote-orientation 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),
   '0.581922'),
  ('regression quote-orientation 2',
   ({'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577',
     'JPYUSD': '0.006610'},
    'CHFGBP'),
   '0.898209'),
  ('partial repair guard 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDEUR': '0.9231'},
    'EURCHF'),
   '0.953418'),
  ('control: usd to euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935'),
  ('control: euro yen',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),
   '164.009395'),
  ('control: sterling euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513'),
  ('control: direct usd base',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000')],
 [('regression quote-orientation 1',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'EURAUD'),
   '1.638687'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'USDGBP'),
   '0.790514'),
  ('partial repair guard 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),
   '0.581922'),
  ('control: sterling euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513'),
  ('control: direct usd base',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000'),
  ('control: usd quote',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),
   '0.006606'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote')],
 [('regression quote-orientation 1',
   ({'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'EURGBP'), '0.856369'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'CADGBP'),
   '0.582245'),
  ('partial repair guard 1',
   ({'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577',
     'JPYUSD': '0.006610'},
    'CHFGBP'),
   '0.898209'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'EURAUD'),
   '1.638687'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote'),
  ('control: franc aussie',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443'),
  ('control: both orientations',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDEUR': '0.9231'},
    'EURCHF'),
   '0.953418'),
  ('control: usd to euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935')]]
for label, args, expected in cases[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression quote-orientation 1139.704661164.009395Failed
regression quote-orientation 20.8565221.167513Failed
control: direct usd base151.370000151.370000Passed
control: usd quote0.0066060.006606Passed
control: missing legERR:no-quoteERR:no-quotePassed
control: franc aussie0.7512781.718443Failed

SHA-256 / 17d9f7fd6adc121248393a46f670e2ffe2d0e7862b546988fb388c94958e6868

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_FLOOR, ROUND_CEILING, ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN
N = 1
observations = []
def solve(quotes, target):
    def per_usd(c):
        if c == 'USD': return Decimal(1)
        if 'USD' + c in quotes: return 1 / Decimal(quotes['USD' + c])
        if c + 'USD' in quotes: return Decimal(quotes[c + 'USD'])
        return None
    b, q = target[:3], target[3:]
    pb, pq = per_usd(b), per_usd(q)
    if pb is None or pq is None: return 'ERR:no-quote'
    return format((pq / pb).quantize(Decimal('0.000001'), rounding=ROUND_HALF_EVEN), 'f')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression quote-orientation 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),
   '164.009395'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513'),
  ('control: direct usd base',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000'),
  ('control: usd quote',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),
   '0.006606'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote'),
  ('control: franc aussie',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443')],
 [('regression quote-orientation 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935'),
  ('partial repair guard 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),
   '0.006606'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote'),
  ('control: both orientations',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDEUR': '0.9231'},
    'EURCHF'),
   '0.953418'),
  ('control: euro yen',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),
   '164.009395'),
  ('control: sterling euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513')],
 [('regression quote-orientation 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),
   '0.581922'),
  ('regression quote-orientation 2',
   ({'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577',
     'JPYUSD': '0.006610'},
    'CHFGBP'),
   '0.898209'),
  ('partial repair guard 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDEUR': '0.9231'},
    'EURCHF'),
   '0.953418'),
  ('control: usd to euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935'),
  ('control: euro yen',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),
   '164.009395'),
  ('control: sterling euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513'),
  ('control: direct usd base',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000')],
 [('regression quote-orientation 1',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'EURAUD'),
   '1.638687'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'USDGBP'),
   '0.790514'),
  ('partial repair guard 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),
   '0.581922'),
  ('control: sterling euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513'),
  ('control: direct usd base',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000'),
  ('control: usd quote',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),
   '0.006606'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote')],
 [('regression quote-orientation 1',
   ({'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'EURGBP'), '0.856369'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'CADGBP'),
   '0.582245'),
  ('partial repair guard 1',
   ({'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577',
     'JPYUSD': '0.006610'},
    'CHFGBP'),
   '0.898209'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'EURAUD'),
   '1.638687'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote'),
  ('control: franc aussie',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443'),
  ('control: both orientations',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDEUR': '0.9231'},
    'EURCHF'),
   '0.953418'),
  ('control: usd to euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935')]]
for label, args, expected in cases[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression quote-orientation 10.006097164.009395Failed
regression quote-orientation 20.8565221.167513Failed
control: direct usd base0.006606151.370000Failed
control: usd quote151.3700000.006606Failed
control: missing legERR:no-quoteERR:no-quotePassed
control: franc aussie0.5819221.718443Failed

SHA-256 / c36f5fafd7b97addd1ca398ef4fceb72fea4f1099402ecd8fd42692e1536ba89

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_FLOOR, ROUND_CEILING, ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN
N = 1
observations = []
def solve(quotes, target):
    def per_usd(c):
        if c == 'USD': return Decimal(1)
        if 'USD' + c in quotes: return Decimal(quotes['USD' + c])
        if c + 'USD' in quotes: return 1 / Decimal(quotes[c + 'USD'])
        return None
    b, q = target[:3], target[3:]
    pb, pq = per_usd(b), per_usd(q)
    if pb is None or pq is None: return 'ERR:no-quote'
    return format((pq / pb).quantize(Decimal('0.000001'), rounding=ROUND_HALF_EVEN), 'f')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression quote-orientation 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),
   '164.009395'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513'),
  ('control: direct usd base',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000'),
  ('control: usd quote',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),
   '0.006606'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote'),
  ('control: franc aussie',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443')],
 [('regression quote-orientation 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935'),
  ('partial repair guard 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),
   '0.006606'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote'),
  ('control: both orientations',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDEUR': '0.9231'},
    'EURCHF'),
   '0.953418'),
  ('control: euro yen',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),
   '164.009395'),
  ('control: sterling euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513')],
 [('regression quote-orientation 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),
   '0.581922'),
  ('regression quote-orientation 2',
   ({'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577',
     'JPYUSD': '0.006610'},
    'CHFGBP'),
   '0.898209'),
  ('partial repair guard 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDEUR': '0.9231'},
    'EURCHF'),
   '0.953418'),
  ('control: usd to euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935'),
  ('control: euro yen',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURJPY'),
   '164.009395'),
  ('control: sterling euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513'),
  ('control: direct usd base',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000')],
 [('regression quote-orientation 1',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'EURAUD'),
   '1.638687'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'USDGBP'),
   '0.790514'),
  ('partial repair guard 1',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'AUDCHF'),
   '0.581922'),
  ('control: sterling euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'GBPEUR'),
   '1.167513'),
  ('control: direct usd base',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDJPY'),
   '151.370000'),
  ('control: usd quote',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'JPYUSD'),
   '0.006606'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote')],
 [('regression quote-orientation 1',
   ({'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612', 'USDEUR': '0.9231'}, 'EURGBP'), '0.856369'),
  ('regression quote-orientation 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'CADGBP'),
   '0.582245'),
  ('partial repair guard 1',
   ({'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577',
     'JPYUSD': '0.006610'},
    'CHFGBP'),
   '0.898209'),
  ('partial repair guard 2',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDCAD': '1.3577'},
    'EURAUD'),
   '1.638687'),
  ('control: missing leg',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'EURSEK'),
   'ERR:no-quote'),
  ('control: franc aussie',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'CHFAUD'),
   '1.718443'),
  ('control: both orientations',
   ({'USDJPY': '151.37',
     'EURUSD': '1.0835',
     'GBPUSD': '1.2650',
     'USDCHF': '0.8801',
     'AUDUSD': '0.6612',
     'USDEUR': '0.9231'},
    'EURCHF'),
   '0.953418'),
  ('control: usd to euro',
   ({'USDJPY': '151.37', 'EURUSD': '1.0835', 'GBPUSD': '1.2650', 'USDCHF': '0.8801', 'AUDUSD': '0.6612'}, 'USDEUR'),
   '0.922935')]]
for label, args, expected in cases[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression quote-orientation 1164.009395164.009395Passed
regression quote-orientation 21.1675131.167513Passed
control: direct usd base151.370000151.370000Passed
control: usd quote0.0066060.006606Passed
control: missing legERR:no-quoteERR:no-quotePassed
control: franc aussie1.7184431.718443Passed

SHA-256 / eb0295bba9d898ea0bdd9d87a000b280d6e8f3fa79afe6f5b66bb039315ed599

Verification & scope

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.

Observations recorded using Python 3.12.14 at 2026-09-29T14:47:02.993705+00:00.

Case digest / fbaab3ea94a282b948c6b322c99d7e6526c26afdd1c1999dc6df01177468eedb