FAILURE MAP
← Case archive

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

Net positions are computed as paid minus received · case 01

Currencies we receive are reported as outgoing payments.

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

ROOT CAUSE

The paid leg is added and the received leg subtracted.

VERIFIED REPAIR

Received amounts increase and paid amounts decrease the net.

Unsuccessful approach: Reporting absolute nets hides which side pays.

Case contract

solve(trades): each trade is [pay_ccy, pay_amount, recv_ccy, recv_amount] from our side. Net per currency = received - paid. Return [[ccy, net], ...] sorted by currency code, omitting currencies whose net is exactly zero; nets are plain strings at the currency exponent (JPY 0, KWD 3, else 2).

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(trades):
    exps = {'JPY': 0, 'KWD': 3}
    net = {}
    for pay_c, pay_a, rec_c, rec_a in trades:
        net[pay_c] = net.get(pay_c, Decimal(0)) + Decimal(pay_a)
        net[rec_c] = net.get(rec_c, Decimal(0)) - Decimal(rec_a)
    out = []
    for c in sorted(net):
        v = net[c]
        if v == 0: continue
        out.append([c, format(v.quantize(Decimal(1).scaleb(-exps.get(c, 2))), 'f')])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression net-direction 1', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('regression net-direction 2', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),
  ('control: empty', ([],), []),
  ('control: unsorted codes',
   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),
   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']])],
 [('regression net-direction 1', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),
  ('regression net-direction 2',
   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),
   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),
  ('control: empty', ([],), []),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), [])],
 [('regression net-direction 1',
   ([['JPY', '1806', 'KWD', '4720.108'], ['USD', '3724.50', 'JPY', '222'], ['KWD', '4720.108', 'JPY', '1806']],),
   [['JPY', '222'], ['USD', '-3724.50']]),
  ('regression net-direction 2',
   ([['GBP', '3755.04', 'GBP', '2258.67'], ['JPY', '4', 'GBP', '4532.21'], ['USD', '3940', 'EUR', '3321.70'],
     ['KWD', '2315', 'JPY', '2875']],),
   [['EUR', '3321.70'], ['GBP', '3035.84'], ['JPY', '2871'], ['KWD', '-2315.000'], ['USD', '-3940.00']]),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])],
 [('regression net-direction 1',
   ([['USD', '3559.19', 'EUR', '1234.78'], ['USD', '3870', 'KWD', '4202'], ['USD', '3791.99', 'KWD', '3508.411'],
     ['USD', '3404.57', 'GBP', '663.83']],),
   [['EUR', '1234.78'], ['GBP', '663.83'], ['KWD', '7710.411'], ['USD', '-14625.75']]),
  ('regression net-direction 2',
   ([['USD', '1062.91', 'GBP', '4208.76'], ['EUR', '468.58', 'EUR', '2562.98'], ['GBP', '4208.76', 'USD', '1062.91']],),
   [['EUR', '2094.40']]),
  ('partial repair guard 2',
   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),
   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),
  ('control: empty', ([],), []),
  ('control: unsorted codes',
   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),
   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']])],
 [('regression net-direction 1',
   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),
   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),
  ('regression net-direction 2',
   ([['GBP', '2181', 'KWD', '1051.460'], ['JPY', '550', 'EUR', '3789'], ['USD', '506.38', 'JPY', '1697'],
     ['KWD', '1052.629', 'EUR', '763.75']],),
   [['EUR', '4552.75'], ['GBP', '-2181.00'], ['JPY', '1147'], ['KWD', '-1.169'], ['USD', '-506.38']]),
  ('partial repair guard 2',
   ([['EUR', '4958.34', 'JPY', '456'], ['KWD', '149.894', 'EUR', '4865.00'], ['GBP', '4322.22', 'GBP', '4150.09'],
     ['USD', '4134', 'GBP', '151.91'], ['JPY', '456', 'EUR', '4958.34']],),
   [['EUR', '4865.00'], ['GBP', '-20.22'], ['KWD', '-149.894'], ['USD', '-4134.00']]),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])]]
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 net-direction 1[['JPY', '-16200'], ['USD', '108.35']][['JPY', '16200'], ['USD', '-108.35']]Failed
regression net-direction 2[['GBP', '-4.00'], ['USD', '5.00']][['GBP', '4.00'], ['USD', '-5.00']]Failed
control: fully offset[][]Passed
control: same currency swap[['KWD', '0.250']][['KWD', '-0.250']]Failed
control: empty[][]Passed
control: unsorted codes[['CHF', '-0.88'], ['EUR', '-0.92'], ['GBP', '0.79'], ['KWD', '0.307']][['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]Failed

SHA-256 / 905d25996c3eb386435432e1a7c1e32ee4c8b9e9e4c054875a09d845c5c97778

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(trades):
    exps = {'JPY': 0, 'KWD': 3}
    net = {}
    for pay_c, pay_a, rec_c, rec_a in trades:
        net[pay_c] = net.get(pay_c, Decimal(0)) - Decimal(pay_a)
        net[rec_c] = net.get(rec_c, Decimal(0)) + Decimal(rec_a)
    out = []
    for c in sorted(net):
        v = abs(net[c])
        if v == 0: continue
        out.append([c, format(v.quantize(Decimal(1).scaleb(-exps.get(c, 2))), 'f')])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression net-direction 1', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('regression net-direction 2', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),
  ('control: empty', ([],), []),
  ('control: unsorted codes',
   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),
   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']])],
 [('regression net-direction 1', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),
  ('regression net-direction 2',
   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),
   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),
  ('control: empty', ([],), []),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), [])],
 [('regression net-direction 1',
   ([['JPY', '1806', 'KWD', '4720.108'], ['USD', '3724.50', 'JPY', '222'], ['KWD', '4720.108', 'JPY', '1806']],),
   [['JPY', '222'], ['USD', '-3724.50']]),
  ('regression net-direction 2',
   ([['GBP', '3755.04', 'GBP', '2258.67'], ['JPY', '4', 'GBP', '4532.21'], ['USD', '3940', 'EUR', '3321.70'],
     ['KWD', '2315', 'JPY', '2875']],),
   [['EUR', '3321.70'], ['GBP', '3035.84'], ['JPY', '2871'], ['KWD', '-2315.000'], ['USD', '-3940.00']]),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])],
 [('regression net-direction 1',
   ([['USD', '3559.19', 'EUR', '1234.78'], ['USD', '3870', 'KWD', '4202'], ['USD', '3791.99', 'KWD', '3508.411'],
     ['USD', '3404.57', 'GBP', '663.83']],),
   [['EUR', '1234.78'], ['GBP', '663.83'], ['KWD', '7710.411'], ['USD', '-14625.75']]),
  ('regression net-direction 2',
   ([['USD', '1062.91', 'GBP', '4208.76'], ['EUR', '468.58', 'EUR', '2562.98'], ['GBP', '4208.76', 'USD', '1062.91']],),
   [['EUR', '2094.40']]),
  ('partial repair guard 2',
   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),
   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),
  ('control: empty', ([],), []),
  ('control: unsorted codes',
   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),
   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']])],
 [('regression net-direction 1',
   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),
   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),
  ('regression net-direction 2',
   ([['GBP', '2181', 'KWD', '1051.460'], ['JPY', '550', 'EUR', '3789'], ['USD', '506.38', 'JPY', '1697'],
     ['KWD', '1052.629', 'EUR', '763.75']],),
   [['EUR', '4552.75'], ['GBP', '-2181.00'], ['JPY', '1147'], ['KWD', '-1.169'], ['USD', '-506.38']]),
  ('partial repair guard 2',
   ([['EUR', '4958.34', 'JPY', '456'], ['KWD', '149.894', 'EUR', '4865.00'], ['GBP', '4322.22', 'GBP', '4150.09'],
     ['USD', '4134', 'GBP', '151.91'], ['JPY', '456', 'EUR', '4958.34']],),
   [['EUR', '4865.00'], ['GBP', '-20.22'], ['KWD', '-149.894'], ['USD', '-4134.00']]),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])]]
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 net-direction 1[['JPY', '16200'], ['USD', '108.35']][['JPY', '16200'], ['USD', '-108.35']]Failed
regression net-direction 2[['GBP', '4.00'], ['USD', '5.00']][['GBP', '4.00'], ['USD', '-5.00']]Failed
control: fully offset[][]Passed
control: same currency swap[['KWD', '0.250']][['KWD', '-0.250']]Failed
control: empty[][]Passed
control: unsorted codes[['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '0.79'], ['KWD', '0.307']][['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]Failed

SHA-256 / 5c98061ec0beeec70f95294492d4ac2521fc64fe10d3b5eadaa74f268a3cf16e

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(trades):
    exps = {'JPY': 0, 'KWD': 3}
    net = {}
    for pay_c, pay_a, rec_c, rec_a in trades:
        net[pay_c] = net.get(pay_c, Decimal(0)) - Decimal(pay_a)
        net[rec_c] = net.get(rec_c, Decimal(0)) + Decimal(rec_a)
    out = []
    for c in sorted(net):
        v = net[c]
        if v == 0: continue
        out.append([c, format(v.quantize(Decimal(1).scaleb(-exps.get(c, 2))), 'f')])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression net-direction 1', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('regression net-direction 2', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),
  ('control: empty', ([],), []),
  ('control: unsorted codes',
   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),
   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']])],
 [('regression net-direction 1', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),
  ('regression net-direction 2',
   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),
   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),
  ('control: empty', ([],), []),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), [])],
 [('regression net-direction 1',
   ([['JPY', '1806', 'KWD', '4720.108'], ['USD', '3724.50', 'JPY', '222'], ['KWD', '4720.108', 'JPY', '1806']],),
   [['JPY', '222'], ['USD', '-3724.50']]),
  ('regression net-direction 2',
   ([['GBP', '3755.04', 'GBP', '2258.67'], ['JPY', '4', 'GBP', '4532.21'], ['USD', '3940', 'EUR', '3321.70'],
     ['KWD', '2315', 'JPY', '2875']],),
   [['EUR', '3321.70'], ['GBP', '3035.84'], ['JPY', '2871'], ['KWD', '-2315.000'], ['USD', '-3940.00']]),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])],
 [('regression net-direction 1',
   ([['USD', '3559.19', 'EUR', '1234.78'], ['USD', '3870', 'KWD', '4202'], ['USD', '3791.99', 'KWD', '3508.411'],
     ['USD', '3404.57', 'GBP', '663.83']],),
   [['EUR', '1234.78'], ['GBP', '663.83'], ['KWD', '7710.411'], ['USD', '-14625.75']]),
  ('regression net-direction 2',
   ([['USD', '1062.91', 'GBP', '4208.76'], ['EUR', '468.58', 'EUR', '2562.98'], ['GBP', '4208.76', 'USD', '1062.91']],),
   [['EUR', '2094.40']]),
  ('partial repair guard 2',
   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),
   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),
  ('control: empty', ([],), []),
  ('control: unsorted codes',
   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),
   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']])],
 [('regression net-direction 1',
   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),
   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),
  ('regression net-direction 2',
   ([['GBP', '2181', 'KWD', '1051.460'], ['JPY', '550', 'EUR', '3789'], ['USD', '506.38', 'JPY', '1697'],
     ['KWD', '1052.629', 'EUR', '763.75']],),
   [['EUR', '4552.75'], ['GBP', '-2181.00'], ['JPY', '1147'], ['KWD', '-1.169'], ['USD', '-506.38']]),
  ('partial repair guard 2',
   ([['EUR', '4958.34', 'JPY', '456'], ['KWD', '149.894', 'EUR', '4865.00'], ['GBP', '4322.22', 'GBP', '4150.09'],
     ['USD', '4134', 'GBP', '151.91'], ['JPY', '456', 'EUR', '4958.34']],),
   [['EUR', '4865.00'], ['GBP', '-20.22'], ['KWD', '-149.894'], ['USD', '-4134.00']]),
  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),
   [['JPY', '16200'], ['USD', '-108.35']]),
  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),
  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),
  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])]]
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 net-direction 1[['JPY', '16200'], ['USD', '-108.35']][['JPY', '16200'], ['USD', '-108.35']]Passed
regression net-direction 2[['GBP', '4.00'], ['USD', '-5.00']][['GBP', '4.00'], ['USD', '-5.00']]Passed
control: fully offset[][]Passed
control: same currency swap[['KWD', '-0.250']][['KWD', '-0.250']]Passed
control: empty[][]Passed
control: unsorted codes[['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']][['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]Passed

SHA-256 / 93fd22727a7738839711cc55c0b24c8b414f9c1ca479a600cfb6b0cfa8298dcc

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

Case digest / 133d83f93de6bd696799bfb3051c80e62ed91e902463a4c3e74c4e32895508eb