{"abstract":"Payments booked on the cutover date are divided by the factor although they are already in the new currency.","category":"Currency rounding and FX conversion","checks":8,"contract":"solve(amount_minor, date, cutover, factor, old_exp, new_exp): amounts dated on or after the cutover (ISO date strings) are already in the new currency and returned unchanged as [amount_minor, 'native']. Earlier amounts are old-currency minor units: new = amount_minor / factor * 10**(new_exp - old_exp), rounded half away from zero, returned as [new, 'converted']. factor is old units per new unit.","contract_signature":"amount_minor, date, cutover, factor, old_exp, new_exp","evaluation_group":"w2-currency_rounding_and_fx_conversion-currency-redenomination","failed_approach":"Comparing only year and month treats earlier days of the cutover month as native.","family":"w2-currency_rounding_and_fx_conversion-currency-redenomination-cutover-boundary","id":"FA-62236","implementations":{"attempt":{"sha256":"5e382a5b4874a63002d46b242de4464a5cfaabc6c2ed213fff4f96857fb4b78b","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(amount_minor, date, cutover, factor, old_exp, new_exp):\n    if date[:7] >= cutover[:7]: return [amount_minor, 'native']\n    v = Decimal(amount_minor) / factor * Decimal(10) ** (new_exp - old_exp)\n    return [int(v.quantize(Decimal(1), rounding=ROUND_HALF_UP)), 'converted']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression cutover-boundary 1', (500, '2026-07-01', '2026-07-01', 10000, 2, 2), [500, 'native']),\n  ('regression cutover-boundary 2', (7086273, '2026-07-15', '2026-07-15', 1000, 0, 3), [7086273, 'native']),\n  ('partial repair guard 1', (99999, '2026-07-15', '2026-07-20', 100, 2, 2), [1000, 'converted']),\n  ('partial repair guard 2', (13591002, '2026-07-05', '2026-07-15', 1000, 2, 3), [135910, 'converted']),\n  ('control: before cutover', (1234567, '2026-06-30', '2026-07-01', 10000, 2, 2), [123, 'converted']),\n  ('control: negative tie', (-15000, '2026-01-01', '2026-07-01', 10000, 2, 2), [-2, 'converted']),\n  ('control: exponent gain', (1234567, '2025-12-31', '2026-01-01', 1000, 0, 2), [123457, 'converted']),\n  ('control: after', (77, '2027-01-01', '2026-07-01', 10000, 2, 2), [77, 'native'])],\n [('regression cutover-boundary 1', (23477950, '2026-07-01', '2026-07-01', 10000, 2, 3), [23477950, 'native']),\n  ('regression cutover-boundary 2', (7192253, '2026-07-01', '2026-07-01', 10000, 2, 3), [7192253, 'native']),\n  ('partial repair guard 1', (10748129, '2026-07-06', '2026-07-20', 10000, 0, 2), [107481, 'converted']),\n  ('partial repair guard 2', (13003559, '2026-07-14', '2026-07-20', 10000, 2, 3), [13004, 'converted']),\n  ('control: exponent gain', (1234567, '2025-12-31', '2026-01-01', 1000, 0, 2), [123457, 'converted']),\n  ('control: same month earlier', (99999, '2026-07-15', '2026-07-20', 100, 2, 2), [1000, 'converted']),\n  ('control: after', (77, '2027-01-01', '2026-07-01', 10000, 2, 2), [77, 'native']),\n  ('control: small old amount', (4999, '2026-06-01', '2026-07-01', 10000, 2, 2), [0, 'converted'])],\n [('regression cutover-boundary 1', (12703023, '2026-07-15', '2026-07-15', 1000, 2, 2), [12703023, 'native']),\n  ('regression cutover-boundary 2', (500, '2026-07-01', '2026-07-01', 10000, 2, 2), [500, 'native']),\n  ('partial repair guard 1', (20559948, '2026-07-01', '2026-07-20', 10000, 0, 3), [2055995, 'converted']),\n  ('partial repair guard 2', (9508148, '2026-07-07', '2026-07-20', 1000, 0, 3), [9508148, 'converted']),\n  ('control: small old amount', (4999, '2026-06-01', '2026-07-01', 10000, 2, 2), [0, 'converted']),\n  ('control: before cutover', (1234567, '2026-06-30', '2026-07-01', 10000, 2, 2), [123, 'converted']),\n  ('control: negative tie', (-15000, '2026-01-01', '2026-07-01', 10000, 2, 2), [-2, 'converted']),\n  ('control: exponent gain', (1234567, '2025-12-31', '2026-01-01', 1000, 0, 2), [123457, 'converted'])],\n [('regression cutover-boundary 1', (7086273, '2026-07-15', '2026-07-15', 1000, 0, 3), [7086273, 'native']),\n  ('regression cutover-boundary 2', (23477950, '2026-07-01', '2026-07-01', 10000, 2, 3), [23477950, 'native']),\n  ('partial repair guard 1', (1287988, '2026-07-12', '2026-07-15', 100, 0, 3), [12879880, 'converted']),\n  ('partial repair guard 2', (20017420, '2026-07-14', '2026-07-15', 100, 0, 0), [200174, 'converted']),\n  ('control: cutover day', (500, '2026-07-01', '2026-07-01', 10000, 2, 2), [500, 'native']),\n  ('control: exponent gain', (1234567, '2025-12-31', '2026-01-01', 1000, 0, 2), [123457, 'converted']),\n  ('control: same month earlier', (99999, '2026-07-15', '2026-07-20', 100, 2, 2), [1000, 'converted']),\n  ('control: after', (77, '2027-01-01', '2026-07-01', 10000, 2, 2), [77, 'native'])],\n [('regression cutover-boundary 1', (7192253, '2026-07-01', '2026-07-01', 10000, 2, 3), [7192253, 'native']),\n  ('regression cutover-boundary 2', (12703023, '2026-07-15', '2026-07-15', 1000, 2, 2), [12703023, 'native']),\n  ('partial repair guard 1', (25651605, '2026-07-03', '2026-07-20', 100, 0, 2), [25651605, 'converted']),\n  ('partial repair guard 2', (25919315, '2026-07-02', '2026-07-15', 100, 2, 0), [2592, 'converted']),\n  ('control: after', (77, '2027-01-01', '2026-07-01', 10000, 2, 2), [77, 'native']),\n  ('control: small old amount', (4999, '2026-06-01', '2026-07-01', 10000, 2, 2), [0, 'converted']),\n  ('control: before cutover', (1234567, '2026-06-30', '2026-07-01', 10000, 2, 2), [123, 'converted']),\n  ('control: negative tie', (-15000, '2026-01-01', '2026-07-01', 10000, 2, 2), [-2, 'converted'])]]\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":"5e8fbe299df725ad44787a959613941f125102a646bcfbe6d7130ae61672fd6a","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(amount_minor, date, cutover, factor, old_exp, new_exp):\n    if date > cutover: return [amount_minor, 'native']\n    v = Decimal(amount_minor) / factor * Decimal(10) ** (new_exp - old_exp)\n    return [int(v.quantize(Decimal(1), rounding=ROUND_HALF_UP)), 'converted']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression cutover-boundary 1', (500, '2026-07-01', '2026-07-01', 10000, 2, 2), [500, 'native']),\n  ('regression cutover-boundary 2', (7086273, '2026-07-15', '2026-07-15', 1000, 0, 3), [7086273, 'native']),\n  ('partial repair guard 1', (99999, '2026-07-15', '2026-07-20', 100, 2, 2), [1000, 'converted']),\n  ('partial repair guard 2', (13591002, '2026-07-05', '2026-07-15', 1000, 2, 3), [135910, 'converted']),\n  ('control: before cutover', (1234567, '2026-06-30', '2026-07-01', 10000, 2, 2), [123, 'converted']),\n  ('control: negative tie', (-15000, '2026-01-01', '2026-07-01', 10000, 2, 2), [-2, 'converted']),\n  ('control: exponent gain', (1234567, '2025-12-31', '2026-01-01', 1000, 0, 2), [123457, 'converted']),\n  ('control: after', (77, '2027-01-01', '2026-07-01', 10000, 2, 2), [77, 'native'])],\n [('regression cutover-boundary 1', (23477950, '2026-07-01', '2026-07-01', 10000, 2, 3), [23477950, 'native']),\n  ('regression cutover-boundary 2', (7192253, '2026-07-01', '2026-07-01', 10000, 2, 3), [7192253, 'native']),\n  ('partial repair guard 1', (10748129, '2026-07-06', '2026-07-20', 10000, 0, 2), [107481, 'converted']),\n  ('partial repair guard 2', (13003559, '2026-07-14', '2026-07-20', 10000, 2, 3), [13004, 'converted']),\n  ('control: exponent gain', (1234567, '2025-12-31', '2026-01-01', 1000, 0, 2), [123457, 'converted']),\n  ('control: same month earlier', (99999, '2026-07-15', '2026-07-20', 100, 2, 2), [1000, 'converted']),\n  ('control: after', (77, '2027-01-01', '2026-07-01', 10000, 2, 2), [77, 'native']),\n  ('control: small old amount', (4999, '2026-06-01', '2026-07-01', 10000, 2, 2), [0, 'converted'])],\n [('regression cutover-boundary 1', (12703023, '2026-07-15', '2026-07-15', 1000, 2, 2), [12703023, 'native']),\n  ('regression cutover-boundary 2', (500, '2026-07-01', '2026-07-01', 10000, 2, 2), [500, 'native']),\n  ('partial repair guard 1', (20559948, '2026-07-01', '2026-07-20', 10000, 0, 3), [2055995, 'converted']),\n  ('partial repair guard 2', (9508148, '2026-07-07', '2026-07-20', 1000, 0, 3), [9508148, 'converted']),\n  ('control: small old amount', (4999, '2026-06-01', '2026-07-01', 10000, 2, 2), [0, 'converted']),\n  ('control: before cutover', (1234567, '2026-06-30', '2026-07-01', 10000, 2, 2), [123, 'converted']),\n  ('control: negative tie', (-15000, '2026-01-01', '2026-07-01', 10000, 2, 2), [-2, 'converted']),\n  ('control: exponent gain', (1234567, '2025-12-31', '2026-01-01', 1000, 0, 2), [123457, 'converted'])],\n [('regression cutover-boundary 1', (7086273, '2026-07-15', '2026-07-15', 1000, 0, 3), [7086273, 'native']),\n  ('regression cutover-boundary 2', (23477950, '2026-07-01', '2026-07-01', 10000, 2, 3), [23477950, 'native']),\n  ('partial repair guard 1', (1287988, '2026-07-12', '2026-07-15', 100, 0, 3), [12879880, 'converted']),\n  ('partial repair guard 2', (20017420, '2026-07-14', '2026-07-15', 100, 0, 0), [200174, 'converted']),\n  ('control: cutover day', (500, '2026-07-01', '2026-07-01', 10000, 2, 2), [500, 'native']),\n  ('control: exponent gain', (1234567, '2025-12-31', '2026-01-01', 1000, 0, 2), [123457, 'converted']),\n  ('control: same month earlier', (99999, '2026-07-15', '2026-07-20', 100, 2, 2), [1000, 'converted']),\n  ('control: after', (77, '2027-01-01', '2026-07-01', 10000, 2, 2), [77, 'native'])],\n [('regression cutover-boundary 1', (7192253, '2026-07-01', '2026-07-01', 10000, 2, 3), [7192253, 'native']),\n  ('regression cutover-boundary 2', (12703023, '2026-07-15', '2026-07-15', 1000, 2, 2), [12703023, 'native']),\n  ('partial repair guard 1', (25651605, '2026-07-03', '2026-07-20', 100, 0, 2), [25651605, 'converted']),\n  ('partial repair guard 2', (25919315, '2026-07-02', '2026-07-15', 100, 2, 0), [2592, 'converted']),\n  ('control: after', (77, '2027-01-01', '2026-07-01', 10000, 2, 2), [77, 'native']),\n  ('control: small old amount', (4999, '2026-06-01', '2026-07-01', 10000, 2, 2), [0, 'converted']),\n  ('control: before cutover', (1234567, '2026-06-30', '2026-07-01', 10000, 2, 2), [123, 'converted']),\n  ('control: negative tie', (-15000, '2026-01-01', '2026-07-01', 10000, 2, 2), [-2, 'converted'])]]\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-currency-redenomination-cutover-boundary","generated_at":"2026-09-29T14:47:02.686720+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.","root_cause":"The native test uses date > cutover.","sha256":"a07ef4fd08c48df2d705366d79ee716d4386386e95b3ed97b70313ecd3bcf333","title":"Amounts dated on the cutover day are redenominated a second time · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":41.258,"exit_code":1,"observations":[{"actual":[500,"native"],"check":"regression cutover-boundary 1","expected":[500,"native"],"passed":true},{"actual":[7086273,"native"],"check":"regression cutover-boundary 2","expected":[7086273,"native"],"passed":true},{"actual":[99999,"native"],"check":"partial repair guard 1","expected":[1000,"converted"],"passed":false},{"actual":[13591002,"native"],"check":"partial repair guard 2","expected":[135910,"converted"],"passed":false},{"actual":[123,"converted"],"check":"control: before cutover","expected":[123,"converted"],"passed":true},{"actual":[-2,"converted"],"check":"control: negative tie","expected":[-2,"converted"],"passed":true},{"actual":[123457,"converted"],"check":"control: exponent gain","expected":[123457,"converted"],"passed":true},{"actual":[77,"native"],"check":"control: after","expected":[77,"native"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression cutover-boundary 1\", \"actual\": [500, \"native\"], \"expected\": [500, \"native\"], \"passed\": true}, {\"check\": \"regression cutover-boundary 2\", \"actual\": [7086273, \"native\"], \"expected\": [7086273, \"native\"], \"passed\": true}, {\"check\": \"partial repair guard 1\", \"actual\": [99999, \"native\"], \"expected\": [1000, \"converted\"], \"passed\": false}, {\"check\": \"partial repair guard 2\", \"actual\": [13591002, \"native\"], \"expected\": [135910, \"converted\"], \"passed\": false}, {\"check\": \"control: before cutover\", \"actual\": [123, \"converted\"], \"expected\": [123, \"converted\"], \"passed\": true}, {\"check\": \"control: negative tie\", \"actual\": [-2, \"converted\"], \"expected\": [-2, \"converted\"], \"passed\": true}, {\"check\": \"control: exponent gain\", \"actual\": [123457, \"converted\"], \"expected\": [123457, \"converted\"], \"passed\": true}, {\"check\": \"control: after\", \"actual\": [77, \"native\"], \"expected\": [77, \"native\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.181,"exit_code":1,"observations":[{"actual":[0,"converted"],"check":"regression cutover-boundary 1","expected":[500,"native"],"passed":false},{"actual":[7086273,"converted"],"check":"regression cutover-boundary 2","expected":[7086273,"native"],"passed":false},{"actual":[1000,"converted"],"check":"partial repair guard 1","expected":[1000,"converted"],"passed":true},{"actual":[135910,"converted"],"check":"partial repair guard 2","expected":[135910,"converted"],"passed":true},{"actual":[123,"converted"],"check":"control: before cutover","expected":[123,"converted"],"passed":true},{"actual":[-2,"converted"],"check":"control: negative tie","expected":[-2,"converted"],"passed":true},{"actual":[123457,"converted"],"check":"control: exponent gain","expected":[123457,"converted"],"passed":true},{"actual":[77,"native"],"check":"control: after","expected":[77,"native"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression cutover-boundary 1\", \"actual\": [0, \"converted\"], \"expected\": [500, \"native\"], \"passed\": false}, {\"check\": \"regression cutover-boundary 2\", \"actual\": [7086273, \"converted\"], \"expected\": [7086273, \"native\"], \"passed\": false}, {\"check\": \"partial repair guard 1\", \"actual\": [1000, \"converted\"], \"expected\": [1000, \"converted\"], \"passed\": true}, {\"check\": \"partial repair guard 2\", \"actual\": [135910, \"converted\"], \"expected\": [135910, \"converted\"], \"passed\": true}, {\"check\": \"control: before cutover\", \"actual\": [123, \"converted\"], \"expected\": [123, \"converted\"], \"passed\": true}, {\"check\": \"control: negative tie\", \"actual\": [-2, \"converted\"], \"expected\": [-2, \"converted\"], \"passed\": true}, {\"check\": \"control: exponent gain\", \"actual\": [123457, \"converted\"], \"expected\": [123457, \"converted\"], \"passed\": true}, {\"check\": \"control: after\", \"actual\": [77, \"native\"], \"expected\": [77, \"native\"], \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}