{"abstract":"A currency that nets to zero still produces a zero payment instruction.","category":"Currency rounding and FX conversion","checks":6,"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":"Filtering on the formatted text '0' misses zeros rendered with minor digits such as '0.00'.","family":"w2-currency_rounding_and_fx_conversion-multicurrency-settlement-netting-zero-net-omission","id":"FA-62096","implementations":{"attempt":{"sha256":"7aac2437fc6dacb01e205c588b7e2e01a394e58690c9ad85b92e41f82a26f9cc","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 format(v.quantize(Decimal(1).scaleb(-exps.get(c, 2))), 'f') == '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 zero-net-omission 1', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('regression zero-net-omission 2', ([['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: 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 [('regression zero-net-omission 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  ('regression zero-net-omission 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 zero-net-omission 1', ([['JPY', '2849', 'USD', '3944.10'], ['USD', '3944.10', 'JPY', '2849']],), []),\n  ('regression zero-net-omission 2',\n   ([['USD', '1062.91', 'GBP', '4208.76'], ['EUR', '468.58', 'EUR', '2562.98'], ['GBP', '4208.76', 'USD', '1062.91']],),\n   [['EUR', '2094.40']]),\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 zero-net-omission 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 zero-net-omission 2', ([['USD', '4066.17', 'EUR', '2513'], ['EUR', '2513', 'USD', '4066.17']],), []),\n  ('partial repair guard 2',\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  ('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 zero-net-omission 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 zero-net-omission 2',\n   ([['USD', '4986.84', 'JPY', '4037'], ['EUR', '357', 'EUR', '2273.42'], ['JPY', '4037', 'USD', '4986.84']],),\n   [['EUR', '1916.42']]),\n  ('partial repair guard 2',\n   ([['GBP', '3621.77', 'USD', '651.33'], ['GBP', '1148.32', 'EUR', '4519'], ['EUR', '1042.18', 'KWD', '4279.575'],\n     ['USD', '651.33', 'GBP', '3621.77']],),\n   [['EUR', '3476.82'], ['GBP', '-1148.32'], ['KWD', '4279.575']]),\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":"0192588186f90a19f88c07c41cf2f2441192dfa72e5d36a758db397dbb66a6b4","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        pass\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 zero-net-omission 1', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('regression zero-net-omission 2', ([['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: 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 [('regression zero-net-omission 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  ('regression zero-net-omission 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 zero-net-omission 1', ([['JPY', '2849', 'USD', '3944.10'], ['USD', '3944.10', 'JPY', '2849']],), []),\n  ('regression zero-net-omission 2',\n   ([['USD', '1062.91', 'GBP', '4208.76'], ['EUR', '468.58', 'EUR', '2562.98'], ['GBP', '4208.76', 'USD', '1062.91']],),\n   [['EUR', '2094.40']]),\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 zero-net-omission 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 zero-net-omission 2', ([['USD', '4066.17', 'EUR', '2513'], ['EUR', '2513', 'USD', '4066.17']],), []),\n  ('partial repair guard 2',\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  ('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 zero-net-omission 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 zero-net-omission 2',\n   ([['USD', '4986.84', 'JPY', '4037'], ['EUR', '357', 'EUR', '2273.42'], ['JPY', '4037', 'USD', '4986.84']],),\n   [['EUR', '1916.42']]),\n  ('partial repair guard 2',\n   ([['GBP', '3621.77', 'USD', '651.33'], ['GBP', '1148.32', 'EUR', '4519'], ['EUR', '1042.18', 'KWD', '4279.575'],\n     ['USD', '651.33', 'GBP', '3621.77']],),\n   [['EUR', '3476.82'], ['GBP', '-1148.32'], ['KWD', '4279.575']]),\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":"7714ddb60b096a59da3028066a888f34934d214324b26d407f94bb3fd2e8018e","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 zero-net-omission 1', ([['USD', '10.00', 'EUR', '9.20'], ['EUR', '9.20', 'USD', '10.00']],), []),\n  ('regression zero-net-omission 2', ([['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: 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 [('regression zero-net-omission 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  ('regression zero-net-omission 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 zero-net-omission 1', ([['JPY', '2849', 'USD', '3944.10'], ['USD', '3944.10', 'JPY', '2849']],), []),\n  ('regression zero-net-omission 2',\n   ([['USD', '1062.91', 'GBP', '4208.76'], ['EUR', '468.58', 'EUR', '2562.98'], ['GBP', '4208.76', 'USD', '1062.91']],),\n   [['EUR', '2094.40']]),\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 zero-net-omission 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 zero-net-omission 2', ([['USD', '4066.17', 'EUR', '2513'], ['EUR', '2513', 'USD', '4066.17']],), []),\n  ('partial repair guard 2',\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  ('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 zero-net-omission 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 zero-net-omission 2',\n   ([['USD', '4986.84', 'JPY', '4037'], ['EUR', '357', 'EUR', '2273.42'], ['JPY', '4037', 'USD', '4986.84']],),\n   [['EUR', '1916.42']]),\n  ('partial repair guard 2',\n   ([['GBP', '3621.77', 'USD', '651.33'], ['GBP', '1148.32', 'EUR', '4519'], ['EUR', '1042.18', 'KWD', '4279.575'],\n     ['USD', '651.33', 'GBP', '3621.77']],),\n   [['EUR', '3476.82'], ['GBP', '-1148.32'], ['KWD', '4279.575']]),\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-zero-net-omission","generated_at":"2026-09-29T14:47:01.369067+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":"Skip currencies whose net Decimal equals zero.","root_cause":"Zero nets are not filtered before emitting instructions.","sha256":"ceb5fec14e4387294d184d222704b1282123cf026ed26caaa5901c2dba0bc342","title":"Fully offset currencies remain in the settlement instruction list · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.211,"exit_code":1,"observations":[{"actual":[["EUR","0.00"],["USD","0.00"]],"check":"regression zero-net-omission 1","expected":[],"passed":false},{"actual":[["EUR","0.00"],["JPY","16200"],["USD","-108.35"]],"check":"regression zero-net-omission 2","expected":[["JPY","16200"],["USD","-108.35"]],"passed":false},{"actual":[["GBP","4.00"],["USD","-5.00"]],"check":"control: short amounts","expected":[["GBP","4.00"],["USD","-5.00"]],"passed":true},{"actual":[["KWD","-0.250"]],"check":"control: same currency swap","expected":[["KWD","-0.250"]],"passed":true},{"actual":[],"check":"control: empty","expected":[],"passed":true},{"actual":[["CHF","0.88"],["EUR","0.92"],["GBP","-0.79"],["KWD","-0.307"],["USD","0.00"]],"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 zero-net-omission 1\", \"actual\": [[\"EUR\", \"0.00\"], [\"USD\", \"0.00\"]], \"expected\": [], \"passed\": false}, {\"check\": \"regression zero-net-omission 2\", \"actual\": [[\"EUR\", \"0.00\"], [\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"expected\": [[\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"passed\": false}, {\"check\": \"control: short amounts\", \"actual\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"expected\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"passed\": true}, {\"check\": \"control: same currency swap\", \"actual\": [[\"KWD\", \"-0.250\"]], \"expected\": [[\"KWD\", \"-0.250\"]], \"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\"], [\"USD\", \"0.00\"]], \"expected\": [[\"CHF\", \"0.88\"], [\"EUR\", \"0.92\"], [\"GBP\", \"-0.79\"], [\"KWD\", \"-0.307\"]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.374,"exit_code":1,"observations":[{"actual":[["EUR","0.00"],["USD","0.00"]],"check":"regression zero-net-omission 1","expected":[],"passed":false},{"actual":[["EUR","0.00"],["JPY","16200"],["USD","-108.35"]],"check":"regression zero-net-omission 2","expected":[["JPY","16200"],["USD","-108.35"]],"passed":false},{"actual":[["GBP","4.00"],["USD","-5.00"]],"check":"control: short amounts","expected":[["GBP","4.00"],["USD","-5.00"]],"passed":true},{"actual":[["KWD","-0.250"]],"check":"control: same currency swap","expected":[["KWD","-0.250"]],"passed":true},{"actual":[],"check":"control: empty","expected":[],"passed":true},{"actual":[["CHF","0.88"],["EUR","0.92"],["GBP","-0.79"],["KWD","-0.307"],["USD","0.00"]],"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 zero-net-omission 1\", \"actual\": [[\"EUR\", \"0.00\"], [\"USD\", \"0.00\"]], \"expected\": [], \"passed\": false}, {\"check\": \"regression zero-net-omission 2\", \"actual\": [[\"EUR\", \"0.00\"], [\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"expected\": [[\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"passed\": false}, {\"check\": \"control: short amounts\", \"actual\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"expected\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"passed\": true}, {\"check\": \"control: same currency swap\", \"actual\": [[\"KWD\", \"-0.250\"]], \"expected\": [[\"KWD\", \"-0.250\"]], \"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\"], [\"USD\", \"0.00\"]], \"expected\": [[\"CHF\", \"0.88\"], [\"EUR\", \"0.92\"], [\"GBP\", \"-0.79\"], [\"KWD\", \"-0.307\"]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.661,"exit_code":0,"observations":[{"actual":[],"check":"regression zero-net-omission 1","expected":[],"passed":true},{"actual":[["JPY","16200"],["USD","-108.35"]],"check":"regression zero-net-omission 2","expected":[["JPY","16200"],["USD","-108.35"]],"passed":true},{"actual":[["GBP","4.00"],["USD","-5.00"]],"check":"control: short amounts","expected":[["GBP","4.00"],["USD","-5.00"]],"passed":true},{"actual":[["KWD","-0.250"]],"check":"control: same currency swap","expected":[["KWD","-0.250"]],"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 zero-net-omission 1\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"regression zero-net-omission 2\", \"actual\": [[\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"expected\": [[\"JPY\", \"16200\"], [\"USD\", \"-108.35\"]], \"passed\": true}, {\"check\": \"control: short amounts\", \"actual\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"expected\": [[\"GBP\", \"4.00\"], [\"USD\", \"-5.00\"]], \"passed\": true}, {\"check\": \"control: same currency swap\", \"actual\": [[\"KWD\", \"-0.250\"]], \"expected\": [[\"KWD\", \"-0.250\"]], \"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"}