{"abstract":"A Thursday trade settles on Monday only by accident; a Friday trade settles Monday instead of Tuesday.","category":"Currency rounding and FX conversion","checks":7,"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.","evaluation_group":"w2-currency_rounding_and_fx_conversion-fx-spot-value-date","failed_approach":"Counting weekdays but ignoring holidays on intermediate days still undercounts around non-USD holidays.","family":"w2-currency_rounding_and_fx_conversion-fx-spot-value-date-business-day-counting","id":"FA-62176","implementations":{"attempt":{"sha256":"c8d9d01979e8d6a7cd18b9bb0ffba018c32ca1c6cebbef8c268c8b367a46c9c6","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 {base, quote} == {'USD', 'CAD'} 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 x.weekday() < 5: n += 1\n    while not good(x, [base, quote]): x += timedelta(days=1)\n    return x.isoformat()\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression business-day-counting 1', ('2026-03-06', 'EURUSD', {}), '2026-03-10'),\n  ('regression business-day-counting 2', ('2026-03-02', 'EURUSD', {'EUR': ['2026-03-03']}), '2026-03-05'),\n  ('partial repair guard 2', ('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  ('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 business-day-counting 1', ('2026-04-28', 'GBPJPY', {'JPY': ['2026-04-29', '2026-04-30']}), '2026-05-04'),\n  ('regression business-day-counting 2',\n   ('2026-03-30', 'EURGBP', {'EUR': ['2026-03-31', '2026-04-04'], 'CAD': ['2026-04-02'], 'GBP': ['2026-04-03']}),\n   '2026-04-02'),\n  ('partial repair guard 2',\n   ('2026-10-09', 'GBPJPY',\n    {'JPY': ['2026-10-11', '2026-10-12', '2026-10-13'],\n     'EUR': ['2026-10-14'],\n     'CAD': ['2026-10-10', '2026-10-11', '2026-10-12', '2026-10-13'],\n     'GBP': ['2026-10-12', '2026-10-14']}),\n   '2026-10-16'),\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 business-day-counting 1',\n   ('2026-10-09', 'GBPJPY',\n    {'JPY': ['2026-10-11', '2026-10-12', '2026-10-13'],\n     'EUR': ['2026-10-14'],\n     'CAD': ['2026-10-10', '2026-10-11', '2026-10-12', '2026-10-13'],\n     'GBP': ['2026-10-12', '2026-10-14']}),\n   '2026-10-16'),\n  ('regression business-day-counting 2',\n   ('2026-08-14', 'GBPJPY',\n    {'USD': [], 'JPY': ['2026-08-15', '2026-08-17', '2026-08-19'], 'EUR': ['2026-08-15', '2026-08-17']}),\n   '2026-08-20'),\n  ('partial repair guard 2',\n   ('2026-07-22', 'EURUSD', {'EUR': ['2026-07-23', '2026-07-24', '2026-07-25'], 'CAD': ['2026-07-23', '2026-07-26']}),\n   '2026-07-28'),\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 business-day-counting 1',\n   ('2026-07-22', 'EURUSD', {'EUR': ['2026-07-23', '2026-07-24', '2026-07-25'], 'CAD': ['2026-07-23', '2026-07-26']}),\n   '2026-07-28'),\n  ('regression business-day-counting 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  ('partial repair guard 2',\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  ('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 business-day-counting 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  ('regression business-day-counting 2',\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: 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":"9b77750f9f27ea4f43a9b687a749ae54d8f35b0f49f9d4f1219178a51ec4fc2b","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 {base, quote} == {'USD', 'CAD'} else 2\n    non_usd = [c for c in (base, quote) if c != 'USD']\n    x = d + timedelta(days=lag)\n    while not good(x, [base, quote]): x += timedelta(days=1)\n    return x.isoformat()\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression business-day-counting 1', ('2026-03-06', 'EURUSD', {}), '2026-03-10'),\n  ('regression business-day-counting 2', ('2026-03-02', 'EURUSD', {'EUR': ['2026-03-03']}), '2026-03-05'),\n  ('partial repair guard 2', ('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  ('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 business-day-counting 1', ('2026-04-28', 'GBPJPY', {'JPY': ['2026-04-29', '2026-04-30']}), '2026-05-04'),\n  ('regression business-day-counting 2',\n   ('2026-03-30', 'EURGBP', {'EUR': ['2026-03-31', '2026-04-04'], 'CAD': ['2026-04-02'], 'GBP': ['2026-04-03']}),\n   '2026-04-02'),\n  ('partial repair guard 2',\n   ('2026-10-09', 'GBPJPY',\n    {'JPY': ['2026-10-11', '2026-10-12', '2026-10-13'],\n     'EUR': ['2026-10-14'],\n     'CAD': ['2026-10-10', '2026-10-11', '2026-10-12', '2026-10-13'],\n     'GBP': ['2026-10-12', '2026-10-14']}),\n   '2026-10-16'),\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 business-day-counting 1',\n   ('2026-10-09', 'GBPJPY',\n    {'JPY': ['2026-10-11', '2026-10-12', '2026-10-13'],\n     'EUR': ['2026-10-14'],\n     'CAD': ['2026-10-10', '2026-10-11', '2026-10-12', '2026-10-13'],\n     'GBP': ['2026-10-12', '2026-10-14']}),\n   '2026-10-16'),\n  ('regression business-day-counting 2',\n   ('2026-08-14', 'GBPJPY',\n    {'USD': [], 'JPY': ['2026-08-15', '2026-08-17', '2026-08-19'], 'EUR': ['2026-08-15', '2026-08-17']}),\n   '2026-08-20'),\n  ('partial repair guard 2',\n   ('2026-07-22', 'EURUSD', {'EUR': ['2026-07-23', '2026-07-24', '2026-07-25'], 'CAD': ['2026-07-23', '2026-07-26']}),\n   '2026-07-28'),\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 business-day-counting 1',\n   ('2026-07-22', 'EURUSD', {'EUR': ['2026-07-23', '2026-07-24', '2026-07-25'], 'CAD': ['2026-07-23', '2026-07-26']}),\n   '2026-07-28'),\n  ('regression business-day-counting 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  ('partial repair guard 2',\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  ('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 business-day-counting 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  ('regression business-day-counting 2',\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: 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"},"fixed":{"sha256":"21bb5a302e89107aa1ba8a28a8ce9e3c2cd11e4866431b13fdcc11dbe729e2b4","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 {base, quote} == {'USD', 'CAD'} 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 business-day-counting 1', ('2026-03-06', 'EURUSD', {}), '2026-03-10'),\n  ('regression business-day-counting 2', ('2026-03-02', 'EURUSD', {'EUR': ['2026-03-03']}), '2026-03-05'),\n  ('partial repair guard 2', ('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  ('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 business-day-counting 1', ('2026-04-28', 'GBPJPY', {'JPY': ['2026-04-29', '2026-04-30']}), '2026-05-04'),\n  ('regression business-day-counting 2',\n   ('2026-03-30', 'EURGBP', {'EUR': ['2026-03-31', '2026-04-04'], 'CAD': ['2026-04-02'], 'GBP': ['2026-04-03']}),\n   '2026-04-02'),\n  ('partial repair guard 2',\n   ('2026-10-09', 'GBPJPY',\n    {'JPY': ['2026-10-11', '2026-10-12', '2026-10-13'],\n     'EUR': ['2026-10-14'],\n     'CAD': ['2026-10-10', '2026-10-11', '2026-10-12', '2026-10-13'],\n     'GBP': ['2026-10-12', '2026-10-14']}),\n   '2026-10-16'),\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 business-day-counting 1',\n   ('2026-10-09', 'GBPJPY',\n    {'JPY': ['2026-10-11', '2026-10-12', '2026-10-13'],\n     'EUR': ['2026-10-14'],\n     'CAD': ['2026-10-10', '2026-10-11', '2026-10-12', '2026-10-13'],\n     'GBP': ['2026-10-12', '2026-10-14']}),\n   '2026-10-16'),\n  ('regression business-day-counting 2',\n   ('2026-08-14', 'GBPJPY',\n    {'USD': [], 'JPY': ['2026-08-15', '2026-08-17', '2026-08-19'], 'EUR': ['2026-08-15', '2026-08-17']}),\n   '2026-08-20'),\n  ('partial repair guard 2',\n   ('2026-07-22', 'EURUSD', {'EUR': ['2026-07-23', '2026-07-24', '2026-07-25'], 'CAD': ['2026-07-23', '2026-07-26']}),\n   '2026-07-28'),\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 business-day-counting 1',\n   ('2026-07-22', 'EURUSD', {'EUR': ['2026-07-23', '2026-07-24', '2026-07-25'], 'CAD': ['2026-07-23', '2026-07-26']}),\n   '2026-07-28'),\n  ('regression business-day-counting 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  ('partial repair guard 2',\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  ('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 business-day-counting 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  ('regression business-day-counting 2',\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: 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-business-day-counting","generated_at":"2026-09-29T14:47:02.133956+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":"Count the lag in business days, applying the intermediate and final-day rules.","root_cause":"The lag is added in calendar days and the result is rolled to the next good day.","sha256":"15b7b4a938e9a6f53ad3d0194f00b20f1238fb0dce4089aab1eec26c06941cc7","title":"Spot is computed as two calendar days and then rolled forward · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.874,"exit_code":1,"observations":[{"actual":"2026-03-10","check":"regression business-day-counting 1","expected":"2026-03-10","passed":true},{"actual":"2026-03-04","check":"regression business-day-counting 2","expected":"2026-03-05","passed":false},{"actual":"2026-05-01","check":"partial repair guard 2","expected":"2026-05-04","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 business-day-counting 1\", \"actual\": \"2026-03-10\", \"expected\": \"2026-03-10\", \"passed\": true}, {\"check\": \"regression business-day-counting 2\", \"actual\": \"2026-03-04\", \"expected\": \"2026-03-05\", \"passed\": false}, {\"check\": \"partial repair guard 2\", \"actual\": \"2026-05-01\", \"expected\": \"2026-05-04\", \"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":39.799,"exit_code":1,"observations":[{"actual":"2026-03-09","check":"regression business-day-counting 1","expected":"2026-03-10","passed":false},{"actual":"2026-03-04","check":"regression business-day-counting 2","expected":"2026-03-05","passed":false},{"actual":"2026-05-01","check":"partial repair guard 2","expected":"2026-05-04","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 business-day-counting 1\", \"actual\": \"2026-03-09\", \"expected\": \"2026-03-10\", \"passed\": false}, {\"check\": \"regression business-day-counting 2\", \"actual\": \"2026-03-04\", \"expected\": \"2026-03-05\", \"passed\": false}, {\"check\": \"partial repair guard 2\", \"actual\": \"2026-05-01\", \"expected\": \"2026-05-04\", \"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"},"fixed":{"elapsed_ms":40.893,"exit_code":0,"observations":[{"actual":"2026-03-10","check":"regression business-day-counting 1","expected":"2026-03-10","passed":true},{"actual":"2026-03-05","check":"regression business-day-counting 2","expected":"2026-03-05","passed":true},{"actual":"2026-05-04","check":"partial repair guard 2","expected":"2026-05-04","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":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression business-day-counting 1\", \"actual\": \"2026-03-10\", \"expected\": \"2026-03-10\", \"passed\": true}, {\"check\": \"regression business-day-counting 2\", \"actual\": \"2026-03-05\", \"expected\": \"2026-03-05\", \"passed\": true}, {\"check\": \"partial repair guard 2\", \"actual\": \"2026-05-04\", \"expected\": \"2026-05-04\", \"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\": true}\n"}},"verified":true,"visibility":"public"}