{"abstract":"USDCAD trades settle a business day late.","category":"Currency rounding and FX conversion","checks":8,"contract":"solve(trade, pair, holidays): stipulated spot value-date rule. USDCAD/CADUSD settle T+1, every other pair T+2. Count forward from the trade date: a day before the final one counts only if it is a weekday and not a holiday of the non-USD currencies of the pair; the value date itself must be a weekday that is a holiday in neither currency. holidays maps currency to ISO date strings. Return the ISO value date.","contract_signature":"trade, pair, holidays","evaluation_group":"w2-currency_rounding_and_fx_conversion-fx-spot-value-date","failed_approach":"Applying T+1 to every CAD pair also shortens EURCAD settlement.","family":"w2-currency_rounding_and_fx_conversion-fx-spot-value-date-cad-settlement-lag","id":"FA-62171","implementations":{"attempt":{"sha256":"164d98da322cc1719d47eae8d9981433541589cdf73261abd79b7a07e5f40e41","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom datetime import date, timedelta\nN = 1\nobservations = []\ndef solve(trade, pair, holidays):\n    d = date.fromisoformat(trade)\n    base, quote = pair[:3], pair[3:]\n    def good(x, ccys):\n        return x.weekday() < 5 and all(x.isoformat() not in holidays.get(c, []) for c in ccys)\n    lag = 1 if 'CAD' in (base, quote) else 2\n    non_usd = [c for c in (base, quote) if c != 'USD']\n    x, n = d, 0\n    while n < lag:\n        x += timedelta(days=1)\n        if good(x, non_usd if n < lag - 1 else [base, quote]):\n            n += 1\n    return x.isoformat()\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression cad-settlement-lag 1', ('2026-03-02', 'USDCAD', {}), '2026-03-03'),\n  ('regression cad-settlement-lag 2',\n   ('2026-07-17', 'CADUSD', {'EUR': ['2026-07-20', '2026-07-22'], 'CAD': ['2026-07-20']}), '2026-07-21'),\n  ('partial repair guard 1', ('2026-03-02', 'EURCAD', {}), '2026-03-04'),\n  ('partial repair guard 2',\n   ('2026-02-24', 'EURCAD',\n    {'JPY': ['2026-02-25', '2026-02-26', '2026-02-28'], 'CAD': ['2026-02-26', '2026-02-27', '2026-03-01'], 'GBP': []}),\n   '2026-03-02'),\n  ('control: plain t+2', ('2026-03-02', 'EURUSD', {}), '2026-03-04'),\n  ('control: over weekend', ('2026-03-05', 'EURUSD', {}), '2026-03-09'),\n  ('control: usd holiday t+1', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-03']}), '2026-03-04'),\n  ('control: usd holiday on spot', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-04']}), '2026-03-05')],\n [('regression cad-settlement-lag 1', ('2026-06-15', 'CADUSD', {}), '2026-06-16'),\n  ('regression cad-settlement-lag 2',\n   ('2026-02-03', 'CADUSD',\n    {'JPY': ['2026-02-04'], 'EUR': ['2026-02-04', '2026-02-07', '2026-02-08'], 'CAD': ['2026-02-07', '2026-02-08']}),\n   '2026-02-04'),\n  ('partial repair guard 1',\n   ('2026-03-19', 'EURCAD',\n    {'JPY': ['2026-03-20', '2026-03-21', '2026-03-22', '2026-03-23', '2026-03-24'],\n     'EUR': ['2026-03-24'],\n     'CAD': ['2026-03-24'],\n     'GBP': ['2026-03-20', '2026-03-21', '2026-03-22']}),\n   '2026-03-23'),\n  ('partial repair guard 2',\n   ('2026-02-16', 'EURCAD',\n    {'USD': ['2026-02-17', '2026-02-18', '2026-02-20'],\n     'EUR': ['2026-02-17', '2026-02-21'],\n     'CAD': [],\n     'GBP': ['2026-02-17', '2026-02-20']}),\n   '2026-02-19'),\n  ('control: usd holiday on spot', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-04']}), '2026-03-05'),\n  ('control: cad t+1', ('2026-03-02', 'USDCAD', {}), '2026-03-03'),\n  ('control: euro holiday t+1', ('2026-03-02', 'EURUSD', {'EUR': ['2026-03-03']}), '2026-03-05'),\n  ('control: cross with cad', ('2026-03-02', 'EURCAD', {}), '2026-03-04')],\n [('regression cad-settlement-lag 1',\n   ('2026-08-21', 'USDCAD',\n    {'USD': ['2026-08-23', '2026-08-25', '2026-08-26'],\n     'JPY': ['2026-08-23', '2026-08-25'],\n     'EUR': ['2026-08-24', '2026-08-25', '2026-08-26'],\n     'GBP': ['2026-08-22', '2026-08-24']}),\n   '2026-08-24'),\n  ('regression cad-settlement-lag 2',\n   ('2026-10-05', 'USDCAD', {'EUR': ['2026-10-06', '2026-10-07', '2026-10-09'], 'GBP': []}), '2026-10-06'),\n  ('partial repair guard 1',\n   ('2026-03-23', 'EURCAD',\n    {'JPY': ['2026-03-27'], 'EUR': ['2026-03-25'], 'CAD': ['2026-03-24', '2026-03-26'], 'GBP': ['2026-03-25']}),\n   '2026-03-30'),\n  ('partial repair guard 2',\n   ('2026-02-03', 'EURCAD',\n    {'USD': ['2026-02-07'], 'JPY': ['2026-02-04', '2026-02-05', '2026-02-07', '2026-02-08'], 'GBP': ['2026-02-08']}),\n   '2026-02-05'),\n  ('control: cross with cad', ('2026-03-02', 'EURCAD', {}), '2026-03-04'),\n  ('control: cad usd holiday', ('2026-03-06', 'CADUSD', {'USD': ['2026-03-09']}), '2026-03-10'),\n  ('control: yen cross', ('2026-04-28', 'GBPJPY', {'JPY': ['2026-04-29', '2026-04-30']}), '2026-05-04'),\n  ('control: plain t+2', ('2026-03-02', 'EURUSD', {}), '2026-03-04')],\n [('regression cad-settlement-lag 1',\n   ('2026-09-17', 'CADUSD',\n    {'JPY': ['2026-09-22'], 'CAD': ['2026-09-18', '2026-09-20'], 'GBP': ['2026-09-20', '2026-09-21']}),\n   '2026-09-21'),\n  ('regression cad-settlement-lag 2', ('2026-04-23', 'USDCAD', {'EUR': ['2026-04-24']}), '2026-04-24'),\n  ('partial repair guard 1',\n   ('2026-08-28', 'EURCAD',\n    {'USD': ['2026-08-30', '2026-08-31', '2026-09-01'],\n     'EUR': ['2026-08-31', '2026-09-01'],\n     'CAD': ['2026-08-29', '2026-08-31'],\n     'GBP': ['2026-08-29', '2026-09-01']}),\n   '2026-09-03'),\n  ('partial repair guard 2',\n   ('2026-03-19', 'EURCAD', {'USD': ['2026-03-21'], 'JPY': ['2026-03-20'], 'EUR': ['2026-03-20'], 'CAD': []}),\n   '2026-03-24'),\n  ('control: plain t+2', ('2026-03-02', 'EURUSD', {}), '2026-03-04'),\n  ('control: over weekend', ('2026-03-05', 'EURUSD', {}), '2026-03-09'),\n  ('control: usd holiday t+1', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-03']}), '2026-03-04'),\n  ('control: usd holiday on spot', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-04']}), '2026-03-05')],\n [('regression cad-settlement-lag 1',\n   ('2026-08-10', 'USDCAD',\n    {'JPY': ['2026-08-11', '2026-08-13'],\n     'EUR': ['2026-08-11', '2026-08-13', '2026-08-15'],\n     'GBP': ['2026-08-12', '2026-08-15']}),\n   '2026-08-11'),\n  ('regression cad-settlement-lag 2',\n   ('2026-03-30', 'CADUSD', {'EUR': ['2026-04-04'], 'GBP': ['2026-04-01', '2026-04-03']}), '2026-03-31'),\n  ('partial repair guard 1',\n   ('2026-06-29', 'EURCAD', {'EUR': ['2026-06-30', '2026-07-04'], 'GBP': ['2026-06-30', '2026-07-04']}), '2026-07-02'),\n  ('partial repair guard 2',\n   ('2026-06-05', 'EURCAD',\n    {'USD': ['2026-06-06', '2026-06-10'],\n     'EUR': ['2026-06-08', '2026-06-09'],\n     'CAD': ['2026-06-09'],\n     'GBP': ['2026-06-07', '2026-06-10']}),\n   '2026-06-11'),\n  ('control: usd holiday on spot', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-04']}), '2026-03-05'),\n  ('control: cad t+1', ('2026-03-02', 'USDCAD', {}), '2026-03-03'),\n  ('control: euro holiday t+1', ('2026-03-02', 'EURUSD', {'EUR': ['2026-03-03']}), '2026-03-05'),\n  ('control: cross with cad', ('2026-03-02', 'EURCAD', {}), '2026-03-04')]]\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":"72bb091c2af17cdcc4535856964ab1856b1753a7cbd9e6aa22cd5cec1f7715b6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom datetime import date, timedelta\nN = 1\nobservations = []\ndef solve(trade, pair, holidays):\n    d = date.fromisoformat(trade)\n    base, quote = pair[:3], pair[3:]\n    def good(x, ccys):\n        return x.weekday() < 5 and all(x.isoformat() not in holidays.get(c, []) for c in ccys)\n    lag = 2\n    non_usd = [c for c in (base, quote) if c != 'USD']\n    x, n = d, 0\n    while n < lag:\n        x += timedelta(days=1)\n        if good(x, non_usd if n < lag - 1 else [base, quote]):\n            n += 1\n    return x.isoformat()\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression cad-settlement-lag 1', ('2026-03-02', 'USDCAD', {}), '2026-03-03'),\n  ('regression cad-settlement-lag 2',\n   ('2026-07-17', 'CADUSD', {'EUR': ['2026-07-20', '2026-07-22'], 'CAD': ['2026-07-20']}), '2026-07-21'),\n  ('partial repair guard 1', ('2026-03-02', 'EURCAD', {}), '2026-03-04'),\n  ('partial repair guard 2',\n   ('2026-02-24', 'EURCAD',\n    {'JPY': ['2026-02-25', '2026-02-26', '2026-02-28'], 'CAD': ['2026-02-26', '2026-02-27', '2026-03-01'], 'GBP': []}),\n   '2026-03-02'),\n  ('control: plain t+2', ('2026-03-02', 'EURUSD', {}), '2026-03-04'),\n  ('control: over weekend', ('2026-03-05', 'EURUSD', {}), '2026-03-09'),\n  ('control: usd holiday t+1', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-03']}), '2026-03-04'),\n  ('control: usd holiday on spot', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-04']}), '2026-03-05')],\n [('regression cad-settlement-lag 1', ('2026-06-15', 'CADUSD', {}), '2026-06-16'),\n  ('regression cad-settlement-lag 2',\n   ('2026-02-03', 'CADUSD',\n    {'JPY': ['2026-02-04'], 'EUR': ['2026-02-04', '2026-02-07', '2026-02-08'], 'CAD': ['2026-02-07', '2026-02-08']}),\n   '2026-02-04'),\n  ('partial repair guard 1',\n   ('2026-03-19', 'EURCAD',\n    {'JPY': ['2026-03-20', '2026-03-21', '2026-03-22', '2026-03-23', '2026-03-24'],\n     'EUR': ['2026-03-24'],\n     'CAD': ['2026-03-24'],\n     'GBP': ['2026-03-20', '2026-03-21', '2026-03-22']}),\n   '2026-03-23'),\n  ('partial repair guard 2',\n   ('2026-02-16', 'EURCAD',\n    {'USD': ['2026-02-17', '2026-02-18', '2026-02-20'],\n     'EUR': ['2026-02-17', '2026-02-21'],\n     'CAD': [],\n     'GBP': ['2026-02-17', '2026-02-20']}),\n   '2026-02-19'),\n  ('control: usd holiday on spot', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-04']}), '2026-03-05'),\n  ('control: cad t+1', ('2026-03-02', 'USDCAD', {}), '2026-03-03'),\n  ('control: euro holiday t+1', ('2026-03-02', 'EURUSD', {'EUR': ['2026-03-03']}), '2026-03-05'),\n  ('control: cross with cad', ('2026-03-02', 'EURCAD', {}), '2026-03-04')],\n [('regression cad-settlement-lag 1',\n   ('2026-08-21', 'USDCAD',\n    {'USD': ['2026-08-23', '2026-08-25', '2026-08-26'],\n     'JPY': ['2026-08-23', '2026-08-25'],\n     'EUR': ['2026-08-24', '2026-08-25', '2026-08-26'],\n     'GBP': ['2026-08-22', '2026-08-24']}),\n   '2026-08-24'),\n  ('regression cad-settlement-lag 2',\n   ('2026-10-05', 'USDCAD', {'EUR': ['2026-10-06', '2026-10-07', '2026-10-09'], 'GBP': []}), '2026-10-06'),\n  ('partial repair guard 1',\n   ('2026-03-23', 'EURCAD',\n    {'JPY': ['2026-03-27'], 'EUR': ['2026-03-25'], 'CAD': ['2026-03-24', '2026-03-26'], 'GBP': ['2026-03-25']}),\n   '2026-03-30'),\n  ('partial repair guard 2',\n   ('2026-02-03', 'EURCAD',\n    {'USD': ['2026-02-07'], 'JPY': ['2026-02-04', '2026-02-05', '2026-02-07', '2026-02-08'], 'GBP': ['2026-02-08']}),\n   '2026-02-05'),\n  ('control: cross with cad', ('2026-03-02', 'EURCAD', {}), '2026-03-04'),\n  ('control: cad usd holiday', ('2026-03-06', 'CADUSD', {'USD': ['2026-03-09']}), '2026-03-10'),\n  ('control: yen cross', ('2026-04-28', 'GBPJPY', {'JPY': ['2026-04-29', '2026-04-30']}), '2026-05-04'),\n  ('control: plain t+2', ('2026-03-02', 'EURUSD', {}), '2026-03-04')],\n [('regression cad-settlement-lag 1',\n   ('2026-09-17', 'CADUSD',\n    {'JPY': ['2026-09-22'], 'CAD': ['2026-09-18', '2026-09-20'], 'GBP': ['2026-09-20', '2026-09-21']}),\n   '2026-09-21'),\n  ('regression cad-settlement-lag 2', ('2026-04-23', 'USDCAD', {'EUR': ['2026-04-24']}), '2026-04-24'),\n  ('partial repair guard 1',\n   ('2026-08-28', 'EURCAD',\n    {'USD': ['2026-08-30', '2026-08-31', '2026-09-01'],\n     'EUR': ['2026-08-31', '2026-09-01'],\n     'CAD': ['2026-08-29', '2026-08-31'],\n     'GBP': ['2026-08-29', '2026-09-01']}),\n   '2026-09-03'),\n  ('partial repair guard 2',\n   ('2026-03-19', 'EURCAD', {'USD': ['2026-03-21'], 'JPY': ['2026-03-20'], 'EUR': ['2026-03-20'], 'CAD': []}),\n   '2026-03-24'),\n  ('control: plain t+2', ('2026-03-02', 'EURUSD', {}), '2026-03-04'),\n  ('control: over weekend', ('2026-03-05', 'EURUSD', {}), '2026-03-09'),\n  ('control: usd holiday t+1', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-03']}), '2026-03-04'),\n  ('control: usd holiday on spot', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-04']}), '2026-03-05')],\n [('regression cad-settlement-lag 1',\n   ('2026-08-10', 'USDCAD',\n    {'JPY': ['2026-08-11', '2026-08-13'],\n     'EUR': ['2026-08-11', '2026-08-13', '2026-08-15'],\n     'GBP': ['2026-08-12', '2026-08-15']}),\n   '2026-08-11'),\n  ('regression cad-settlement-lag 2',\n   ('2026-03-30', 'CADUSD', {'EUR': ['2026-04-04'], 'GBP': ['2026-04-01', '2026-04-03']}), '2026-03-31'),\n  ('partial repair guard 1',\n   ('2026-06-29', 'EURCAD', {'EUR': ['2026-06-30', '2026-07-04'], 'GBP': ['2026-06-30', '2026-07-04']}), '2026-07-02'),\n  ('partial repair guard 2',\n   ('2026-06-05', 'EURCAD',\n    {'USD': ['2026-06-06', '2026-06-10'],\n     'EUR': ['2026-06-08', '2026-06-09'],\n     'CAD': ['2026-06-09'],\n     'GBP': ['2026-06-07', '2026-06-10']}),\n   '2026-06-11'),\n  ('control: usd holiday on spot', ('2026-03-02', 'EURUSD', {'USD': ['2026-03-04']}), '2026-03-05'),\n  ('control: cad t+1', ('2026-03-02', 'USDCAD', {}), '2026-03-03'),\n  ('control: euro holiday t+1', ('2026-03-02', 'EURUSD', {'EUR': ['2026-03-03']}), '2026-03-05'),\n  ('control: cross with cad', ('2026-03-02', 'EURCAD', {}), '2026-03-04')]]\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-fx-spot-value-date-cad-settlement-lag","generated_at":"2026-09-29T14:47:02.101550+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 T+1 exception for the USD/CAD pair is missing.","sha256":"f78c66a5416ae239b3084c05378212fb92a535f06a1c6354be6dcddf3362bc1f","title":"USDCAD is settled T+2 like other pairs · 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":43.158,"exit_code":1,"observations":[{"actual":"2026-03-03","check":"regression cad-settlement-lag 1","expected":"2026-03-03","passed":true},{"actual":"2026-07-21","check":"regression cad-settlement-lag 2","expected":"2026-07-21","passed":true},{"actual":"2026-03-03","check":"partial repair guard 1","expected":"2026-03-04","passed":false},{"actual":"2026-02-25","check":"partial repair guard 2","expected":"2026-03-02","passed":false},{"actual":"2026-03-04","check":"control: plain t+2","expected":"2026-03-04","passed":true},{"actual":"2026-03-09","check":"control: over weekend","expected":"2026-03-09","passed":true},{"actual":"2026-03-04","check":"control: usd holiday t+1","expected":"2026-03-04","passed":true},{"actual":"2026-03-05","check":"control: usd holiday on spot","expected":"2026-03-05","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression cad-settlement-lag 1\", \"actual\": \"2026-03-03\", \"expected\": \"2026-03-03\", \"passed\": true}, {\"check\": \"regression cad-settlement-lag 2\", \"actual\": \"2026-07-21\", \"expected\": \"2026-07-21\", \"passed\": true}, {\"check\": \"partial repair guard 1\", \"actual\": \"2026-03-03\", \"expected\": \"2026-03-04\", \"passed\": false}, {\"check\": \"partial repair guard 2\", \"actual\": \"2026-02-25\", \"expected\": \"2026-03-02\", \"passed\": false}, {\"check\": \"control: plain t+2\", \"actual\": \"2026-03-04\", \"expected\": \"2026-03-04\", \"passed\": true}, {\"check\": \"control: over weekend\", \"actual\": \"2026-03-09\", \"expected\": \"2026-03-09\", \"passed\": true}, {\"check\": \"control: usd holiday t+1\", \"actual\": \"2026-03-04\", \"expected\": \"2026-03-04\", \"passed\": true}, {\"check\": \"control: usd holiday on spot\", \"actual\": \"2026-03-05\", \"expected\": \"2026-03-05\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.277,"exit_code":1,"observations":[{"actual":"2026-03-04","check":"regression cad-settlement-lag 1","expected":"2026-03-03","passed":false},{"actual":"2026-07-22","check":"regression cad-settlement-lag 2","expected":"2026-07-21","passed":false},{"actual":"2026-03-04","check":"partial repair guard 1","expected":"2026-03-04","passed":true},{"actual":"2026-03-02","check":"partial repair guard 2","expected":"2026-03-02","passed":true},{"actual":"2026-03-04","check":"control: plain t+2","expected":"2026-03-04","passed":true},{"actual":"2026-03-09","check":"control: over weekend","expected":"2026-03-09","passed":true},{"actual":"2026-03-04","check":"control: usd holiday t+1","expected":"2026-03-04","passed":true},{"actual":"2026-03-05","check":"control: usd holiday on spot","expected":"2026-03-05","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression cad-settlement-lag 1\", \"actual\": \"2026-03-04\", \"expected\": \"2026-03-03\", \"passed\": false}, {\"check\": \"regression cad-settlement-lag 2\", \"actual\": \"2026-07-22\", \"expected\": \"2026-07-21\", \"passed\": false}, {\"check\": \"partial repair guard 1\", \"actual\": \"2026-03-04\", \"expected\": \"2026-03-04\", \"passed\": true}, {\"check\": \"partial repair guard 2\", \"actual\": \"2026-03-02\", \"expected\": \"2026-03-02\", \"passed\": true}, {\"check\": \"control: plain t+2\", \"actual\": \"2026-03-04\", \"expected\": \"2026-03-04\", \"passed\": true}, {\"check\": \"control: over weekend\", \"actual\": \"2026-03-09\", \"expected\": \"2026-03-09\", \"passed\": true}, {\"check\": \"control: usd holiday t+1\", \"actual\": \"2026-03-04\", \"expected\": \"2026-03-04\", \"passed\": true}, {\"check\": \"control: usd holiday on spot\", \"actual\": \"2026-03-05\", \"expected\": \"2026-03-05\", \"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."}}