{"abstract":"A net of five dollars is written as '5' rather than '5.00'.","category":"Currency rounding and FX conversion","checks":7,"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).","evaluation_group":"w2-currency_rounding_and_fx_conversion-multicurrency-settlement-netting","failed_approach":"Quantizing every currency to two decimals mis-formats yen and dinar nets.","family":"w2-currency_rounding_and_fx_conversion-multicurrency-settlement-netting-net-exponent","id":"FA-62106","implementations":{"attempt":{"sha256":"025facf7059ef4e383c9148fd99298a07fe9751bad07e5a320432fa8752b25a2","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(trades):\n    exps = {'JPY': 0, 'KWD': 3}\n    net = {}\n    for pay_c, pay_a, rec_c, rec_a in trades:\n        net[pay_c] = net.get(pay_c, Decimal(0)) - Decimal(pay_a)\n        net[rec_c] = net.get(rec_c, Decimal(0)) + Decimal(rec_a)\n    out = []\n    for c in sorted(net):\n        v = net[c]\n        if v == 0: continue\n        out.append([c, format(v.quantize(Decimal('0.01')), 'f')])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression net-exponent 1', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),\n  ('regression net-exponent 2',\n   ([['GBP', '3755.04', 'GBP', '2258.67'], ['JPY', '4', 'GBP', '4532.21'], ['USD', '3940', 'EUR', '3321.70'],\n     ['KWD', '2315', 'JPY', '2875']],),\n   [['EUR', '3321.70'], ['GBP', '3035.84'], ['JPY', '2871'], ['KWD', '-2315.000'], ['USD', '-3940.00']]),\n  ('partial repair guard 1', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),\n  ('partial repair guard 2', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('control: empty', ([],), []),\n  ('control: unsorted codes',\n   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),\n   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']])],\n [('regression net-exponent 1',\n   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),\n   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),\n  ('regression net-exponent 2',\n   ([['GBP', '2181', 'KWD', '1051.460'], ['JPY', '550', 'EUR', '3789'], ['USD', '506.38', 'JPY', '1697'],\n     ['KWD', '1052.629', 'EUR', '763.75']],),\n   [['EUR', '4552.75'], ['GBP', '-2181.00'], ['JPY', '1147'], ['KWD', '-1.169'], ['USD', '-506.38']]),\n  ('partial repair guard 1',\n   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),\n   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),\n  ('partial repair guard 2',\n   ([['JPY', '1806', 'KWD', '4720.108'], ['USD', '3724.50', 'JPY', '222'], ['KWD', '4720.108', 'JPY', '1806']],),\n   [['JPY', '222'], ['USD', '-3724.50']]),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),\n  ('control: empty', ([],), []),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']])],\n [('regression net-exponent 1',\n   ([['EUR', '4958.34', 'JPY', '456'], ['KWD', '149.894', 'EUR', '4865.00'], ['GBP', '4322.22', 'GBP', '4150.09'],\n     ['USD', '4134', 'GBP', '151.91'], ['JPY', '456', 'EUR', '4958.34']],),\n   [['EUR', '4865.00'], ['GBP', '-20.22'], ['KWD', '-149.894'], ['USD', '-4134.00']]),\n  ('regression net-exponent 2', ([['USD', '313.17', 'GBP', '4250'], ['USD', '4617', 'JPY', '3628']],),\n   [['GBP', '4250.00'], ['JPY', '3628'], ['USD', '-4930.17']]),\n  ('partial repair guard 1',\n   ([['GBP', '3755.04', 'GBP', '2258.67'], ['JPY', '4', 'GBP', '4532.21'], ['USD', '3940', 'EUR', '3321.70'],\n     ['KWD', '2315', 'JPY', '2875']],),\n   [['EUR', '3321.70'], ['GBP', '3035.84'], ['JPY', '2871'], ['KWD', '-2315.000'], ['USD', '-3940.00']]),\n  ('partial repair guard 2',\n   ([['USD', '3559.19', 'EUR', '1234.78'], ['USD', '3870', 'KWD', '4202'], ['USD', '3791.99', 'KWD', '3508.411'],\n     ['USD', '3404.57', 'GBP', '663.83']],),\n   [['EUR', '1234.78'], ['GBP', '663.83'], ['KWD', '7710.411'], ['USD', '-14625.75']]),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),\n  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])],\n [('regression net-exponent 1',\n   ([['JPY', '1210', 'GBP', '400.13'], ['JPY', '1882', 'EUR', '1387'], ['JPY', '133', 'KWD', '4882'],\n     ['GBP', '400.13', 'JPY', '1210']],),\n   [['EUR', '1387.00'], ['JPY', '-2015'], ['KWD', '4882.000']]),\n  ('regression net-exponent 2',\n   ([['EUR', '2398.23', 'JPY', '1126'], ['JPY', '3068', 'JPY', '622'], ['KWD', '86.693', 'GBP', '3555'],\n     ['KWD', '3551', 'JPY', '3728']],),\n   [['EUR', '-2398.23'], ['GBP', '3555.00'], ['JPY', '2408'], ['KWD', '-3637.693']]),\n  ('partial repair guard 1',\n   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),\n   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),\n  ('partial repair guard 2',\n   ([['GBP', '2181', 'KWD', '1051.460'], ['JPY', '550', 'EUR', '3789'], ['USD', '506.38', 'JPY', '1697'],\n     ['KWD', '1052.629', 'EUR', '763.75']],),\n   [['EUR', '4552.75'], ['GBP', '-2181.00'], ['JPY', '1147'], ['KWD', '-1.169'], ['USD', '-506.38']]),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),\n  ('control: empty', ([],), []),\n  ('control: unsorted codes',\n   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),\n   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']])],\n [('regression net-exponent 1',\n   ([['GBP', '3480.24', 'KWD', '2947.345'], ['GBP', '1426.56', 'USD', '1564'], ['KWD', '4552.575', 'GBP', '4813.80'],\n     ['EUR', '2477.75', 'GBP', '2397.09']],),\n   [['EUR', '-2477.75'], ['GBP', '2304.09'], ['KWD', '-1605.230'], ['USD', '1564.00']]),\n  ('regression net-exponent 2',\n   ([['USD', '1923', 'GBP', '3301'], ['JPY', '4033', 'JPY', '2447'], ['USD', '819.80', 'EUR', '4094.27'],\n     ['USD', '2815.32', 'JPY', '479']],),\n   [['EUR', '4094.27'], ['GBP', '3301.00'], ['JPY', '-1107'], ['USD', '-5558.12']]),\n  ('partial repair guard 1',\n   ([['EUR', '4958.34', 'JPY', '456'], ['KWD', '149.894', 'EUR', '4865.00'], ['GBP', '4322.22', 'GBP', '4150.09'],\n     ['USD', '4134', 'GBP', '151.91'], ['JPY', '456', 'EUR', '4958.34']],),\n   [['EUR', '4865.00'], ['GBP', '-20.22'], ['KWD', '-149.894'], ['USD', '-4134.00']]),\n  ('partial repair guard 2', ([['USD', '313.17', 'GBP', '4250'], ['USD', '4617', 'JPY', '3628']],),\n   [['GBP', '4250.00'], ['JPY', '3628'], ['USD', '-4930.17']]),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),\n  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])]]\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":"7e27d28ff53d47e607085fbfb6ba4d024400ab774cf969beaa1517eb07fae48a","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(trades):\n    exps = {'JPY': 0, 'KWD': 3}\n    net = {}\n    for pay_c, pay_a, rec_c, rec_a in trades:\n        net[pay_c] = net.get(pay_c, Decimal(0)) - Decimal(pay_a)\n        net[rec_c] = net.get(rec_c, Decimal(0)) + Decimal(rec_a)\n    out = []\n    for c in sorted(net):\n        v = net[c]\n        if v == 0: continue\n        out.append([c, format(v, 'f')])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression net-exponent 1', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),\n  ('regression net-exponent 2',\n   ([['GBP', '3755.04', 'GBP', '2258.67'], ['JPY', '4', 'GBP', '4532.21'], ['USD', '3940', 'EUR', '3321.70'],\n     ['KWD', '2315', 'JPY', '2875']],),\n   [['EUR', '3321.70'], ['GBP', '3035.84'], ['JPY', '2871'], ['KWD', '-2315.000'], ['USD', '-3940.00']]),\n  ('partial repair guard 1', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),\n  ('partial repair guard 2', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('control: empty', ([],), []),\n  ('control: unsorted codes',\n   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),\n   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']])],\n [('regression net-exponent 1',\n   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),\n   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),\n  ('regression net-exponent 2',\n   ([['GBP', '2181', 'KWD', '1051.460'], ['JPY', '550', 'EUR', '3789'], ['USD', '506.38', 'JPY', '1697'],\n     ['KWD', '1052.629', 'EUR', '763.75']],),\n   [['EUR', '4552.75'], ['GBP', '-2181.00'], ['JPY', '1147'], ['KWD', '-1.169'], ['USD', '-506.38']]),\n  ('partial repair guard 1',\n   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),\n   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),\n  ('partial repair guard 2',\n   ([['JPY', '1806', 'KWD', '4720.108'], ['USD', '3724.50', 'JPY', '222'], ['KWD', '4720.108', 'JPY', '1806']],),\n   [['JPY', '222'], ['USD', '-3724.50']]),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),\n  ('control: empty', ([],), []),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']])],\n [('regression net-exponent 1',\n   ([['EUR', '4958.34', 'JPY', '456'], ['KWD', '149.894', 'EUR', '4865.00'], ['GBP', '4322.22', 'GBP', '4150.09'],\n     ['USD', '4134', 'GBP', '151.91'], ['JPY', '456', 'EUR', '4958.34']],),\n   [['EUR', '4865.00'], ['GBP', '-20.22'], ['KWD', '-149.894'], ['USD', '-4134.00']]),\n  ('regression net-exponent 2', ([['USD', '313.17', 'GBP', '4250'], ['USD', '4617', 'JPY', '3628']],),\n   [['GBP', '4250.00'], ['JPY', '3628'], ['USD', '-4930.17']]),\n  ('partial repair guard 1',\n   ([['GBP', '3755.04', 'GBP', '2258.67'], ['JPY', '4', 'GBP', '4532.21'], ['USD', '3940', 'EUR', '3321.70'],\n     ['KWD', '2315', 'JPY', '2875']],),\n   [['EUR', '3321.70'], ['GBP', '3035.84'], ['JPY', '2871'], ['KWD', '-2315.000'], ['USD', '-3940.00']]),\n  ('partial repair guard 2',\n   ([['USD', '3559.19', 'EUR', '1234.78'], ['USD', '3870', 'KWD', '4202'], ['USD', '3791.99', 'KWD', '3508.411'],\n     ['USD', '3404.57', 'GBP', '663.83']],),\n   [['EUR', '1234.78'], ['GBP', '663.83'], ['KWD', '7710.411'], ['USD', '-14625.75']]),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),\n  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])],\n [('regression net-exponent 1',\n   ([['JPY', '1210', 'GBP', '400.13'], ['JPY', '1882', 'EUR', '1387'], ['JPY', '133', 'KWD', '4882'],\n     ['GBP', '400.13', 'JPY', '1210']],),\n   [['EUR', '1387.00'], ['JPY', '-2015'], ['KWD', '4882.000']]),\n  ('regression net-exponent 2',\n   ([['EUR', '2398.23', 'JPY', '1126'], ['JPY', '3068', 'JPY', '622'], ['KWD', '86.693', 'GBP', '3555'],\n     ['KWD', '3551', 'JPY', '3728']],),\n   [['EUR', '-2398.23'], ['GBP', '3555.00'], ['JPY', '2408'], ['KWD', '-3637.693']]),\n  ('partial repair guard 1',\n   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),\n   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),\n  ('partial repair guard 2',\n   ([['GBP', '2181', 'KWD', '1051.460'], ['JPY', '550', 'EUR', '3789'], ['USD', '506.38', 'JPY', '1697'],\n     ['KWD', '1052.629', 'EUR', '763.75']],),\n   [['EUR', '4552.75'], ['GBP', '-2181.00'], ['JPY', '1147'], ['KWD', '-1.169'], ['USD', '-506.38']]),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),\n  ('control: empty', ([],), []),\n  ('control: unsorted codes',\n   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),\n   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']])],\n [('regression net-exponent 1',\n   ([['GBP', '3480.24', 'KWD', '2947.345'], ['GBP', '1426.56', 'USD', '1564'], ['KWD', '4552.575', 'GBP', '4813.80'],\n     ['EUR', '2477.75', 'GBP', '2397.09']],),\n   [['EUR', '-2477.75'], ['GBP', '2304.09'], ['KWD', '-1605.230'], ['USD', '1564.00']]),\n  ('regression net-exponent 2',\n   ([['USD', '1923', 'GBP', '3301'], ['JPY', '4033', 'JPY', '2447'], ['USD', '819.80', 'EUR', '4094.27'],\n     ['USD', '2815.32', 'JPY', '479']],),\n   [['EUR', '4094.27'], ['GBP', '3301.00'], ['JPY', '-1107'], ['USD', '-5558.12']]),\n  ('partial repair guard 1',\n   ([['EUR', '4958.34', 'JPY', '456'], ['KWD', '149.894', 'EUR', '4865.00'], ['GBP', '4322.22', 'GBP', '4150.09'],\n     ['USD', '4134', 'GBP', '151.91'], ['JPY', '456', 'EUR', '4958.34']],),\n   [['EUR', '4865.00'], ['GBP', '-20.22'], ['KWD', '-149.894'], ['USD', '-4134.00']]),\n  ('partial repair guard 2', ([['USD', '313.17', 'GBP', '4250'], ['USD', '4617', 'JPY', '3628']],),\n   [['GBP', '4250.00'], ['JPY', '3628'], ['USD', '-4930.17']]),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),\n  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])]]\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":"217260206e6a62b2aa2aa7cc045ac6158e7ba8f34c575af68f60395f04fcf952","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(trades):\n    exps = {'JPY': 0, 'KWD': 3}\n    net = {}\n    for pay_c, pay_a, rec_c, rec_a in trades:\n        net[pay_c] = net.get(pay_c, Decimal(0)) - Decimal(pay_a)\n        net[rec_c] = net.get(rec_c, Decimal(0)) + Decimal(rec_a)\n    out = []\n    for c in sorted(net):\n        v = net[c]\n        if v == 0: continue\n        out.append([c, format(v.quantize(Decimal(1).scaleb(-exps.get(c, 2))), 'f')])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression net-exponent 1', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),\n  ('regression net-exponent 2',\n   ([['GBP', '3755.04', 'GBP', '2258.67'], ['JPY', '4', 'GBP', '4532.21'], ['USD', '3940', 'EUR', '3321.70'],\n     ['KWD', '2315', 'JPY', '2875']],),\n   [['EUR', '3321.70'], ['GBP', '3035.84'], ['JPY', '2871'], ['KWD', '-2315.000'], ['USD', '-3940.00']]),\n  ('partial repair guard 1', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),\n  ('partial repair guard 2', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('control: empty', ([],), []),\n  ('control: unsorted codes',\n   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),\n   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']])],\n [('regression net-exponent 1',\n   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),\n   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),\n  ('regression net-exponent 2',\n   ([['GBP', '2181', 'KWD', '1051.460'], ['JPY', '550', 'EUR', '3789'], ['USD', '506.38', 'JPY', '1697'],\n     ['KWD', '1052.629', 'EUR', '763.75']],),\n   [['EUR', '4552.75'], ['GBP', '-2181.00'], ['JPY', '1147'], ['KWD', '-1.169'], ['USD', '-506.38']]),\n  ('partial repair guard 1',\n   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),\n   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),\n  ('partial repair guard 2',\n   ([['JPY', '1806', 'KWD', '4720.108'], ['USD', '3724.50', 'JPY', '222'], ['KWD', '4720.108', 'JPY', '1806']],),\n   [['JPY', '222'], ['USD', '-3724.50']]),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),\n  ('control: empty', ([],), []),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']])],\n [('regression net-exponent 1',\n   ([['EUR', '4958.34', 'JPY', '456'], ['KWD', '149.894', 'EUR', '4865.00'], ['GBP', '4322.22', 'GBP', '4150.09'],\n     ['USD', '4134', 'GBP', '151.91'], ['JPY', '456', 'EUR', '4958.34']],),\n   [['EUR', '4865.00'], ['GBP', '-20.22'], ['KWD', '-149.894'], ['USD', '-4134.00']]),\n  ('regression net-exponent 2', ([['USD', '313.17', 'GBP', '4250'], ['USD', '4617', 'JPY', '3628']],),\n   [['GBP', '4250.00'], ['JPY', '3628'], ['USD', '-4930.17']]),\n  ('partial repair guard 1',\n   ([['GBP', '3755.04', 'GBP', '2258.67'], ['JPY', '4', 'GBP', '4532.21'], ['USD', '3940', 'EUR', '3321.70'],\n     ['KWD', '2315', 'JPY', '2875']],),\n   [['EUR', '3321.70'], ['GBP', '3035.84'], ['JPY', '2871'], ['KWD', '-2315.000'], ['USD', '-3940.00']]),\n  ('partial repair guard 2',\n   ([['USD', '3559.19', 'EUR', '1234.78'], ['USD', '3870', 'KWD', '4202'], ['USD', '3791.99', 'KWD', '3508.411'],\n     ['USD', '3404.57', 'GBP', '663.83']],),\n   [['EUR', '1234.78'], ['GBP', '663.83'], ['KWD', '7710.411'], ['USD', '-14625.75']]),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),\n  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])],\n [('regression net-exponent 1',\n   ([['JPY', '1210', 'GBP', '400.13'], ['JPY', '1882', 'EUR', '1387'], ['JPY', '133', 'KWD', '4882'],\n     ['GBP', '400.13', 'JPY', '1210']],),\n   [['EUR', '1387.00'], ['JPY', '-2015'], ['KWD', '4882.000']]),\n  ('regression net-exponent 2',\n   ([['EUR', '2398.23', 'JPY', '1126'], ['JPY', '3068', 'JPY', '622'], ['KWD', '86.693', 'GBP', '3555'],\n     ['KWD', '3551', 'JPY', '3728']],),\n   [['EUR', '-2398.23'], ['GBP', '3555.00'], ['JPY', '2408'], ['KWD', '-3637.693']]),\n  ('partial repair guard 1',\n   ([['EUR', '4780', 'GBP', '4817.42'], ['EUR', '937.30', 'JPY', '1728'], ['GBP', '394', 'USD', '949']],),\n   [['EUR', '-5717.30'], ['GBP', '4423.42'], ['JPY', '1728'], ['USD', '949.00']]),\n  ('partial repair guard 2',\n   ([['GBP', '2181', 'KWD', '1051.460'], ['JPY', '550', 'EUR', '3789'], ['USD', '506.38', 'JPY', '1697'],\n     ['KWD', '1052.629', 'EUR', '763.75']],),\n   [['EUR', '4552.75'], ['GBP', '-2181.00'], ['JPY', '1147'], ['KWD', '-1.169'], ['USD', '-506.38']]),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']]),\n  ('control: empty', ([],), []),\n  ('control: unsorted codes',\n   ([['USD', '1.00', 'EUR', '0.92'], ['GBP', '0.79', 'USD', '1.00'], ['KWD', '0.307', 'CHF', '0.88']],),\n   [['CHF', '0.88'], ['EUR', '0.92'], ['GBP', '-0.79'], ['KWD', '-0.307']]),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']])],\n [('regression net-exponent 1',\n   ([['GBP', '3480.24', 'KWD', '2947.345'], ['GBP', '1426.56', 'USD', '1564'], ['KWD', '4552.575', 'GBP', '4813.80'],\n     ['EUR', '2477.75', 'GBP', '2397.09']],),\n   [['EUR', '-2477.75'], ['GBP', '2304.09'], ['KWD', '-1605.230'], ['USD', '1564.00']]),\n  ('regression net-exponent 2',\n   ([['USD', '1923', 'GBP', '3301'], ['JPY', '4033', 'JPY', '2447'], ['USD', '819.80', 'EUR', '4094.27'],\n     ['USD', '2815.32', 'JPY', '479']],),\n   [['EUR', '4094.27'], ['GBP', '3301.00'], ['JPY', '-1107'], ['USD', '-5558.12']]),\n  ('partial repair guard 1',\n   ([['EUR', '4958.34', 'JPY', '456'], ['KWD', '149.894', 'EUR', '4865.00'], ['GBP', '4322.22', 'GBP', '4150.09'],\n     ['USD', '4134', 'GBP', '151.91'], ['JPY', '456', 'EUR', '4958.34']],),\n   [['EUR', '4865.00'], ['GBP', '-20.22'], ['KWD', '-149.894'], ['USD', '-4134.00']]),\n  ('partial repair guard 2', ([['USD', '313.17', 'GBP', '4250'], ['USD', '4617', 'JPY', '3628']],),\n   [['GBP', '4250.00'], ['JPY', '3628'], ['USD', '-4930.17']]),\n  ('control: chained trades', ([['USD', '108.35', 'EUR', '100.00'], ['EUR', '100.00', 'JPY', '16200']],),\n   [['JPY', '16200'], ['USD', '-108.35']]),\n  ('control: short amounts', ([['USD', '5', 'GBP', '4']],), [['GBP', '4.00'], ['USD', '-5.00']]),\n  ('control: fully offset', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('control: same currency swap', ([['KWD', '1.250', 'KWD', '1.000']],), [['KWD', '-0.250']])]]\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-multicurrency-settlement-netting-net-exponent","generated_at":"2026-09-29T14:47:01.462110+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":"Quantize each net to its currency exponent before formatting.","root_cause":"The summed Decimal is formatted without quantizing to the currency exponent.","sha256":"6f2edb95bbb155de3c9311bd8c6e7282fe5845307bfc97a9a25a893a8cafc053","title":"Net amounts are emitted with the raw Decimal exponent · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.353,"exit_code":1,"observations":[{"actual":[["GBP","4.00"],["USD","-5.00"]],"check":"regression net-exponent 1","expected":[["GBP","4.00"],["USD","-5.00"]],"passed":true},{"actual":[["EUR","3321.70"],["GBP","3035.84"],["JPY","2871.00"],["KWD","-2315.00"],["USD","-3940.00"]],"check":"regression net-exponent 2","expected":[["EUR","3321.70"],["GBP","3035.84"],["JPY","2871"],["KWD","-2315.000"],["USD","-3940.00"]],"passed":false},{"actual":[["KWD","-0.25"]],"check":"partial repair guard 1","expected":[["KWD","-0.250"]],"passed":false},{"actual":[["JPY","16200.00"],["USD","-108.35"]],"check":"partial repair guard 2","expected":[["JPY","16200"],["USD","-108.35"]],"passed":false},{"actual":[],"check":"control: fully offset","expected":[],"passed":true},{"actual":[],"check":"control: empty","expected":[],"passed":true},{"actual":[["CHF","0.88"],["EUR","0.92"],["GBP","-0.79"],["KWD","-0.31"]],"check":"control: unsorted codes","expected":[["CHF","0.88"],["EUR","0.92"],["GBP","-0.79"],["KWD","-0.307"]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression net-exponent 1\", \"actual\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"expected\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"passed\": true}, {\"check\": \"regression net-exponent 2\", \"actual\": [[\"EUR\", \"3321.70\"], [\"GBP\", \"3035.84\"], [\"JPY\", \"2871.00\"], [\"KWD\", \"-2315.00\"], [\"USD\", \"-3940.00\"]], \"expected\": [[\"EUR\", \"3321.70\"], [\"GBP\", \"3035.84\"], [\"JPY\", \"2871\"], [\"KWD\", \"-2315.000\"], [\"USD\", \"-3940.00\"]], \"passed\": false}, {\"check\": \"partial repair guard 1\", \"actual\": [[\"KWD\", \"-0.25\"]], \"expected\": [[\"KWD\", \"-0.250\"]], \"passed\": false}, {\"check\": \"partial repair guard 2\", \"actual\": [[\"JPY\", \"16200.00\"], [\"USD\", \"-108.35\"]], \"expected\": [[\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"passed\": false}, {\"check\": \"control: fully offset\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"control: empty\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"control: unsorted codes\", \"actual\": [[\"CHF\", \"0.88\"], [\"EUR\", \"0.92\"], [\"GBP\", \"-0.79\"], [\"KWD\", \"-0.31\"]], \"expected\": [[\"CHF\", \"0.88\"], [\"EUR\", \"0.92\"], [\"GBP\", \"-0.79\"], [\"KWD\", \"-0.307\"]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.289,"exit_code":1,"observations":[{"actual":[["GBP","4"],["USD","-5"]],"check":"regression net-exponent 1","expected":[["GBP","4.00"],["USD","-5.00"]],"passed":false},{"actual":[["EUR","3321.70"],["GBP","3035.84"],["JPY","2871"],["KWD","-2315"],["USD","-3940"]],"check":"regression net-exponent 2","expected":[["EUR","3321.70"],["GBP","3035.84"],["JPY","2871"],["KWD","-2315.000"],["USD","-3940.00"]],"passed":false},{"actual":[["KWD","-0.250"]],"check":"partial repair guard 1","expected":[["KWD","-0.250"]],"passed":true},{"actual":[["JPY","16200"],["USD","-108.35"]],"check":"partial repair guard 2","expected":[["JPY","16200"],["USD","-108.35"]],"passed":true},{"actual":[],"check":"control: fully offset","expected":[],"passed":true},{"actual":[],"check":"control: empty","expected":[],"passed":true},{"actual":[["CHF","0.88"],["EUR","0.92"],["GBP","-0.79"],["KWD","-0.307"]],"check":"control: unsorted codes","expected":[["CHF","0.88"],["EUR","0.92"],["GBP","-0.79"],["KWD","-0.307"]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression net-exponent 1\", \"actual\": [[\"GBP\", \"4\"], [\"USD\", \"-5\"]], \"expected\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"passed\": false}, {\"check\": \"regression net-exponent 2\", \"actual\": [[\"EUR\", \"3321.70\"], [\"GBP\", \"3035.84\"], [\"JPY\", \"2871\"], [\"KWD\", \"-2315\"], [\"USD\", \"-3940\"]], \"expected\": [[\"EUR\", \"3321.70\"], [\"GBP\", \"3035.84\"], [\"JPY\", \"2871\"], [\"KWD\", \"-2315.000\"], [\"USD\", \"-3940.00\"]], \"passed\": false}, {\"check\": \"partial repair guard 1\", \"actual\": [[\"KWD\", \"-0.250\"]], \"expected\": [[\"KWD\", \"-0.250\"]], \"passed\": true}, {\"check\": \"partial repair guard 2\", \"actual\": [[\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"expected\": [[\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"passed\": true}, {\"check\": \"control: fully offset\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"control: empty\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"control: unsorted codes\", \"actual\": [[\"CHF\", \"0.88\"], [\"EUR\", \"0.92\"], [\"GBP\", \"-0.79\"], [\"KWD\", \"-0.307\"]], \"expected\": [[\"CHF\", \"0.88\"], [\"EUR\", \"0.92\"], [\"GBP\", \"-0.79\"], [\"KWD\", \"-0.307\"]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.947,"exit_code":0,"observations":[{"actual":[["GBP","4.00"],["USD","-5.00"]],"check":"regression net-exponent 1","expected":[["GBP","4.00"],["USD","-5.00"]],"passed":true},{"actual":[["EUR","3321.70"],["GBP","3035.84"],["JPY","2871"],["KWD","-2315.000"],["USD","-3940.00"]],"check":"regression net-exponent 2","expected":[["EUR","3321.70"],["GBP","3035.84"],["JPY","2871"],["KWD","-2315.000"],["USD","-3940.00"]],"passed":true},{"actual":[["KWD","-0.250"]],"check":"partial repair guard 1","expected":[["KWD","-0.250"]],"passed":true},{"actual":[["JPY","16200"],["USD","-108.35"]],"check":"partial repair guard 2","expected":[["JPY","16200"],["USD","-108.35"]],"passed":true},{"actual":[],"check":"control: fully offset","expected":[],"passed":true},{"actual":[],"check":"control: empty","expected":[],"passed":true},{"actual":[["CHF","0.88"],["EUR","0.92"],["GBP","-0.79"],["KWD","-0.307"]],"check":"control: unsorted codes","expected":[["CHF","0.88"],["EUR","0.92"],["GBP","-0.79"],["KWD","-0.307"]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression net-exponent 1\", \"actual\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"expected\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"passed\": true}, {\"check\": \"regression net-exponent 2\", \"actual\": [[\"EUR\", \"3321.70\"], [\"GBP\", \"3035.84\"], [\"JPY\", \"2871\"], [\"KWD\", \"-2315.000\"], [\"USD\", \"-3940.00\"]], \"expected\": [[\"EUR\", \"3321.70\"], [\"GBP\", \"3035.84\"], [\"JPY\", \"2871\"], [\"KWD\", \"-2315.000\"], [\"USD\", \"-3940.00\"]], \"passed\": true}, {\"check\": \"partial repair guard 1\", \"actual\": [[\"KWD\", \"-0.250\"]], \"expected\": [[\"KWD\", \"-0.250\"]], \"passed\": true}, {\"check\": \"partial repair guard 2\", \"actual\": [[\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"expected\": [[\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"passed\": true}, {\"check\": \"control: fully offset\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"control: empty\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"control: unsorted codes\", \"actual\": [[\"CHF\", \"0.88\"], [\"EUR\", \"0.92\"], [\"GBP\", \"-0.79\"], [\"KWD\", \"-0.307\"]], \"expected\": [[\"CHF\", \"0.88\"], [\"EUR\", \"0.92\"], [\"GBP\", \"-0.79\"], [\"KWD\", \"-0.307\"]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}