FAILURE MAP
← Case archive

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

The source leg multiplies by the per-USD rate instead of dividing · case 01

Converting euros to yen overstates the result by the square of the euro rate relationship.

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

ROOT CAUSE

Rates are units per USD, but the source amount is multiplied by rate[frm] when moving into USD.

VERIFIED REPAIR

Divide by the source rate to reach USD and multiply by the target rate to leave USD.

Unsuccessful approach: Flipping both legs treats the table as USD per unit, which is the inverse of the stated quote convention.

Case contract

solve(amount, frm, to, rates): rates maps a currency to units of that currency per 1 USD (decimal strings); USD is implicitly 1 when absent. Convert exactly as amount / rate[frm] * rate[to] with no intermediate rounding, then round half-even to the target exponent (USD/EUR/GBP/CHF/SEK/NOK 2, JPY/KRW 0, KWD 3, CLF 4) and return a plain string. A missing rate returns 'ERR:no-rate:<code>', a zero or negative rate 'ERR:bad-rate:<code>' (source checked first).

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(amount, frm, to, rates):
    exps = {'USD': 2, 'EUR': 2, 'GBP': 2, 'CHF': 2, 'SEK': 2, 'NOK': 2, 'JPY': 0, 'KRW': 0, 'KWD': 3, 'CLF': 4}
    def rate(c):
        if c == 'USD' and c not in rates: return Decimal(1)
        if c not in rates: return None
        return Decimal(rates[c])
    rf, rt = rate(frm), rate(to)
    for c, r in ((frm, rf), (to, rt)):
        if r is None: return 'ERR:no-rate:' + c
        if r <= 0: return 'ERR:bad-rate:' + c
    usd = Decimal(amount) * rf
    out = usd * rt
    return format(out.quantize(Decimal(1).scaleb(-exps[to]), rounding=ROUND_HALF_EVEN), 'f')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression leg-direction 1',
   ('100', 'EUR', 'JPY',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16453'),
  ('regression leg-direction 2',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33'),
  ('partial repair guard 2',
   ('100.00', 'USD', 'KWD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '30.710'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK'),
  ('control: won to franc',
   ('250000', 'KRW', 'CHF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '162.68'),
  ('control: yen to unit of account',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')],
 [('regression leg-direction 1',
   ('250000', 'KRW', 'CHF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '162.68'),
  ('regression leg-direction 2',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('partial repair guard 1',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
  ('control: explicit usd rate', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
  ('control: usd absent', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11')],
 [('regression leg-direction 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
  ('regression leg-direction 2',
   ('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
   '69130.43'),
  ('partial repair guard 1',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('partial repair guard 2', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
  ('control: euro to yen',
   ('100', 'EUR', 'JPY',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16453'),
  ('control: usd to dinar',
   ('100.00', 'USD', 'KWD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '30.710'),
  ('control: pound to usd',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33')],
 [('regression leg-direction 1',
   ('183948.179', 'CHF', 'EUR',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '192287.61'),
  ('regression leg-direction 2',
   ('16420.708', 'CLF', 'CLF', {'EUR': '0.92', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451', 'CHF': '0.8801'}),
   '16420.7080'),
  ('partial repair guard 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
  ('partial repair guard 2',
   ('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
   '69130.43'),
  ('control: euro to yen',
   ('100', 'EUR', 'JPY',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16453'),
  ('control: usd to dinar',
   ('100.00', 'USD', 'KWD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '30.710'),
  ('control: pound to usd',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK')],
 [('regression leg-direction 1',
   ('113222', 'EUR', 'CLF',
    {'EUR': '0.92', 'JPY': '151.37', 'KWD': '0.3071', 'GBP': '0.7893', 'CLF': '0.02451', 'CHF': '0.8801'}),
   '3016.3818'),
  ('regression leg-direction 2',
   ('19481.34', 'KWD', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '63436.47'),
  ('partial repair guard 1',
   ('183948.179', 'CHF', 'EUR',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '192287.61'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK'),
  ('control: won to franc',
   ('250000', 'KRW', 'CHF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '162.68'),
  ('control: yen to unit of account',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')]]
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 leg-direction 11392616453Failed
regression leg-direction 23.956.33Failed
partial repair guard 230.71030.710Passed
control: missing targetERR:no-rate:SEKERR:no-rate:SEKPassed
control: won to franc297583812.50162.68Failed
control: yen to unit of account371004.159916.1920Failed
control: zero rate targetERR:bad-rate:CHFERR:bad-rate:CHFPassed

SHA-256 / d6c44ec7d3ba8c9d109782b4133bad029bc1711246118efec2bbb0ce20ab6504

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(amount, frm, to, rates):
    exps = {'USD': 2, 'EUR': 2, 'GBP': 2, 'CHF': 2, 'SEK': 2, 'NOK': 2, 'JPY': 0, 'KRW': 0, 'KWD': 3, 'CLF': 4}
    def rate(c):
        if c == 'USD' and c not in rates: return Decimal(1)
        if c not in rates: return None
        return Decimal(rates[c])
    rf, rt = rate(frm), rate(to)
    for c, r in ((frm, rf), (to, rt)):
        if r is None: return 'ERR:no-rate:' + c
        if r <= 0: return 'ERR:bad-rate:' + c
    usd = Decimal(amount) * rf
    out = usd / rt
    return format(out.quantize(Decimal(1).scaleb(-exps[to]), rounding=ROUND_HALF_EVEN), 'f')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression leg-direction 1',
   ('100', 'EUR', 'JPY',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16453'),
  ('regression leg-direction 2',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33'),
  ('partial repair guard 2',
   ('100.00', 'USD', 'KWD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '30.710'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK'),
  ('control: won to franc',
   ('250000', 'KRW', 'CHF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '162.68'),
  ('control: yen to unit of account',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')],
 [('regression leg-direction 1',
   ('250000', 'KRW', 'CHF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '162.68'),
  ('regression leg-direction 2',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('partial repair guard 1',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
  ('control: explicit usd rate', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
  ('control: usd absent', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11')],
 [('regression leg-direction 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
  ('regression leg-direction 2',
   ('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
   '69130.43'),
  ('partial repair guard 1',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('partial repair guard 2', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
  ('control: euro to yen',
   ('100', 'EUR', 'JPY',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16453'),
  ('control: usd to dinar',
   ('100.00', 'USD', 'KWD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '30.710'),
  ('control: pound to usd',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33')],
 [('regression leg-direction 1',
   ('183948.179', 'CHF', 'EUR',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '192287.61'),
  ('regression leg-direction 2',
   ('16420.708', 'CLF', 'CLF', {'EUR': '0.92', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451', 'CHF': '0.8801'}),
   '16420.7080'),
  ('partial repair guard 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
  ('partial repair guard 2',
   ('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
   '69130.43'),
  ('control: euro to yen',
   ('100', 'EUR', 'JPY',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16453'),
  ('control: usd to dinar',
   ('100.00', 'USD', 'KWD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '30.710'),
  ('control: pound to usd',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK')],
 [('regression leg-direction 1',
   ('113222', 'EUR', 'CLF',
    {'EUR': '0.92', 'JPY': '151.37', 'KWD': '0.3071', 'GBP': '0.7893', 'CLF': '0.02451', 'CHF': '0.8801'}),
   '3016.3818'),
  ('regression leg-direction 2',
   ('19481.34', 'KWD', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '63436.47'),
  ('partial repair guard 1',
   ('183948.179', 'CHF', 'EUR',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '192287.61'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK'),
  ('control: won to franc',
   ('250000', 'KRW', 'CHF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '162.68'),
  ('control: yen to unit of account',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')]]
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 leg-direction 1116453Failed
regression leg-direction 23.956.33Failed
partial repair guard 2325.62730.710Failed
control: missing targetERR:no-rate:SEKERR:no-rate:SEKPassed
control: won to franc384189296.67162.68Failed
control: yen to unit of account617578483.476116.1920Failed
control: zero rate targetERR:bad-rate:CHFERR:bad-rate:CHFPassed

SHA-256 / d0c4be9fe817d210d916ee622ce5c819ccd5e4240b577e03489a8a9b45fffa25

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(amount, frm, to, rates):
    exps = {'USD': 2, 'EUR': 2, 'GBP': 2, 'CHF': 2, 'SEK': 2, 'NOK': 2, 'JPY': 0, 'KRW': 0, 'KWD': 3, 'CLF': 4}
    def rate(c):
        if c == 'USD' and c not in rates: return Decimal(1)
        if c not in rates: return None
        return Decimal(rates[c])
    rf, rt = rate(frm), rate(to)
    for c, r in ((frm, rf), (to, rt)):
        if r is None: return 'ERR:no-rate:' + c
        if r <= 0: return 'ERR:bad-rate:' + c
    usd = Decimal(amount) / rf
    out = usd * rt
    return format(out.quantize(Decimal(1).scaleb(-exps[to]), rounding=ROUND_HALF_EVEN), 'f')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression leg-direction 1',
   ('100', 'EUR', 'JPY',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16453'),
  ('regression leg-direction 2',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33'),
  ('partial repair guard 2',
   ('100.00', 'USD', 'KWD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '30.710'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK'),
  ('control: won to franc',
   ('250000', 'KRW', 'CHF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '162.68'),
  ('control: yen to unit of account',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')],
 [('regression leg-direction 1',
   ('250000', 'KRW', 'CHF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '162.68'),
  ('regression leg-direction 2',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('partial repair guard 1',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
  ('control: explicit usd rate', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
  ('control: usd absent', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11')],
 [('regression leg-direction 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
  ('regression leg-direction 2',
   ('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
   '69130.43'),
  ('partial repair guard 1',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('partial repair guard 2', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
  ('control: euro to yen',
   ('100', 'EUR', 'JPY',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16453'),
  ('control: usd to dinar',
   ('100.00', 'USD', 'KWD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '30.710'),
  ('control: pound to usd',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33')],
 [('regression leg-direction 1',
   ('183948.179', 'CHF', 'EUR',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '192287.61'),
  ('regression leg-direction 2',
   ('16420.708', 'CLF', 'CLF', {'EUR': '0.92', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451', 'CHF': '0.8801'}),
   '16420.7080'),
  ('partial repair guard 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
  ('partial repair guard 2',
   ('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
   '69130.43'),
  ('control: euro to yen',
   ('100', 'EUR', 'JPY',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16453'),
  ('control: usd to dinar',
   ('100.00', 'USD', 'KWD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '30.710'),
  ('control: pound to usd',
   ('5', 'GBP', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '6.33'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK')],
 [('regression leg-direction 1',
   ('113222', 'EUR', 'CLF',
    {'EUR': '0.92', 'JPY': '151.37', 'KWD': '0.3071', 'GBP': '0.7893', 'CLF': '0.02451', 'CHF': '0.8801'}),
   '3016.3818'),
  ('regression leg-direction 2',
   ('19481.34', 'KWD', 'USD',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '63436.47'),
  ('partial repair guard 1',
   ('183948.179', 'CHF', 'EUR',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '192287.61'),
  ('control: missing target',
   ('1', 'EUR', 'SEK',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   'ERR:no-rate:SEK'),
  ('control: won to franc',
   ('250000', 'KRW', 'CHF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '162.68'),
  ('control: yen to unit of account',
   ('99999', 'JPY', 'CLF',
    {'EUR': '0.92',
     'JPY': '151.37',
     'KRW': '1352.5',
     'KWD': '0.3071',
     'GBP': '0.7893',
     'CLF': '0.02451',
     'CHF': '0.8801'}),
   '16.1920'),
  ('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')]]
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 leg-direction 11645316453Passed
regression leg-direction 26.336.33Passed
partial repair guard 230.71030.710Passed
control: missing targetERR:no-rate:SEKERR:no-rate:SEKPassed
control: won to franc162.68162.68Passed
control: yen to unit of account16.192016.1920Passed
control: zero rate targetERR:bad-rate:CHFERR:bad-rate:CHFPassed

SHA-256 / 16588d69801e00da82127f0f1348ace93c78d0c4a81221710293015ad91d21fc

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:46:59.349363+00:00.

Case digest / dfdceccb36af7449b907dbc7a8124033aad843d79d96dfefccbeaa5479905a02