FA-61801 / Options payoff and settlement / Open access
Exercise notice acceptance cutoff: the time cutoff is applied to the day before expiry · case 01
Early exercise notices filed the evening before expiry are rejected.
ROOT CAUSE
Earlier-day acceptance requires at least two days before expiry.
VERIFIED REPAIR
Accept every notice on a date before expiry.
Unsuccessful approach: Applying the cutoff to every day up to expiry rejects routine early exercises.
Case contract
Inputs expiry date, submission [y,m,d,hh,mm], cutoff [hh,mm], extension minutes and member flag. Notices after the expiry date are "expired"; notices on earlier dates are "accepted"; on the expiry date a notice is accepted if its minute of day <= cutoff (+extension for members), else "late".
Why this case matters
Option expiry, exercise and settlement engines move cash and shares; a wrong branch misstates obligations.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import datetime
N = 1
observations = []
def solve(expiry, submit, cutoff, extension, member):
e = datetime.date(*expiry)
y, m, d, hh, mm = submit
sd = datetime.date(y, m, d)
if sd > e:
return 'expired'
if (e - sd).days > 1:
return 'accepted'
limit = cutoff[0] * 60 + cutoff[1] + (extension if member else 0)
return 'accepted' if hh * 60 + mm <= limit else 'late'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression earlier-day notices 1', [[2025, 10, 12], [2025, 10, 11, 19, 30], [17, 30], 30, False], 'accepted'], ['regression earlier-day notices 2', [[2022, 7, 29], [2022, 7, 28, 18, 30], [17, 30], 0, False], 'accepted'], ['partial repair probe 1', [[2020, 3, 27], [2020, 3, 25, 16, 30], [16, 0], 0, False], 'accepted'], ['partial repair probe 2', [[2020, 6, 27], [2020, 6, 25, 18, 31], [17, 0], 30, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2023, 11, 14], [2023, 11, 14, 18, 30], [17, 0], 90, False], 'late'], ['normal control 2', [[2029, 7, 24], [2029, 7, 22, 14, 30], [16, 0], 30, False], 'accepted'], ['normal control 3', [[2029, 2, 28], [2029, 2, 23, 15, 29], [16, 0], 90, True], 'accepted']], [['regression earlier-day notices 1', [[2027, 2, 25], [2027, 2, 24, 19, 0], [17, 30], 0, False], 'accepted'], ['regression earlier-day notices 2', [[2021, 2, 28], [2021, 2, 27, 18, 31], [17, 0], 0, True], 'accepted'], ['partial repair probe 1', [[2024, 7, 30], [2024, 7, 25, 18, 0], [17, 30], 30, True], 'accepted'], ['partial repair probe 2', [[2023, 7, 31], [2023, 7, 26, 19, 30], [17, 30], 90, True], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2023, 5, 6], [2023, 5, 6, 18, 0], [17, 30], 90, True], 'accepted'], ['normal control 2', [[2024, 4, 30], [2024, 5, 1, 16, 0], [16, 0], 0, False], 'expired'], ['normal control 3', [[2022, 12, 31], [2022, 12, 31, 18, 0], [17, 0], 0, False], 'late']], [['regression earlier-day notices 1', [[2026, 5, 10], [2026, 5, 9, 19, 30], [17, 30], 90, True], 'accepted'], ['regression earlier-day notices 2', [[2020, 4, 26], [2020, 4, 25, 18, 0], [17, 0], 0, True], 'accepted'], ['partial repair probe 1', [[2026, 12, 31], [2026, 12, 29, 19, 1], [17, 30], 0, False], 'accepted'], ['partial repair probe 2', [[2024, 9, 27], [2024, 9, 25, 19, 0], [17, 30], 0, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2021, 6, 30], [2021, 6, 30, 17, 30], [17, 0], 0, False], 'late'], ['normal control 2', [[2027, 10, 1], [2027, 10, 1, 16, 59], [17, 0], 90, True], 'accepted'], ['normal control 3', [[2020, 1, 31], [2020, 1, 31, 19, 30], [17, 30], 90, True], 'late']], [['regression earlier-day notices 1', [[2021, 7, 12], [2021, 7, 11, 18, 0], [17, 0], 30, True], 'accepted'], ['regression earlier-day notices 2', [[2020, 4, 10], [2020, 4, 9, 18, 31], [17, 0], 30, False], 'accepted'], ['partial repair probe 1', [[2023, 7, 23], [2023, 7, 18, 18, 0], [17, 0], 0, False], 'accepted'], ['partial repair probe 2', [[2021, 3, 13], [2021, 3, 8, 19, 0], [17, 0], 90, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2025, 5, 6], [2025, 5, 1, 17, 29], [17, 30], 0, True], 'accepted'], ['normal control 2', [[2024, 9, 24], [2024, 9, 24, 7, 0], [17, 0], 0, True], 'accepted'], ['normal control 3', [[2024, 6, 27], [2024, 6, 26, 16, 29], [17, 0], 30, True], 'accepted']], [['regression earlier-day notices 1', [[2021, 2, 27], [2021, 2, 26, 17, 30], [16, 0], 90, False], 'accepted'], ['regression earlier-day notices 2', [[2026, 12, 25], [2026, 12, 24, 18, 0], [17, 30], 30, False], 'accepted'], ['partial repair probe 1', [[2023, 1, 30], [2023, 1, 25, 19, 0], [17, 30], 90, True], 'accepted'], ['partial repair probe 2', [[2028, 3, 27], [2028, 3, 22, 18, 0], [17, 0], 0, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2022, 7, 17], [2022, 7, 15, 16, 0], [17, 30], 90, False], 'accepted'], ['normal control 2', [[2030, 2, 28], [2030, 2, 28, 16, 1], [16, 0], 90, False], 'late'], ['normal control 3', [[2024, 3, 29], [2024, 3, 28, 16, 0], [16, 0], 0, False], 'accepted']]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression earlier-day notices 1 | late | accepted | Failed |
| regression earlier-day notices 2 | late | accepted | Failed |
| partial repair probe 1 | accepted | accepted | Passed |
| partial repair probe 2 | accepted | accepted | Passed |
| boundary control 1 | accepted | accepted | Passed |
| normal control 1 | late | late | Passed |
| normal control 2 | accepted | accepted | Passed |
| normal control 3 | accepted | accepted | Passed |
SHA-256 / 06e163728cb4be56c4194dc1813639fc03028a98a4ecd8a53a9af8372aec8052
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import datetime
N = 1
observations = []
def solve(expiry, submit, cutoff, extension, member):
e = datetime.date(*expiry)
y, m, d, hh, mm = submit
sd = datetime.date(y, m, d)
if sd > e:
return 'expired'
if sd < e and hh * 60 + mm <= cutoff[0] * 60 + cutoff[1]:
return 'accepted'
if sd < e:
return 'late'
limit = cutoff[0] * 60 + cutoff[1] + (extension if member else 0)
return 'accepted' if hh * 60 + mm <= limit else 'late'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression earlier-day notices 1', [[2025, 10, 12], [2025, 10, 11, 19, 30], [17, 30], 30, False], 'accepted'], ['regression earlier-day notices 2', [[2022, 7, 29], [2022, 7, 28, 18, 30], [17, 30], 0, False], 'accepted'], ['partial repair probe 1', [[2020, 3, 27], [2020, 3, 25, 16, 30], [16, 0], 0, False], 'accepted'], ['partial repair probe 2', [[2020, 6, 27], [2020, 6, 25, 18, 31], [17, 0], 30, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2023, 11, 14], [2023, 11, 14, 18, 30], [17, 0], 90, False], 'late'], ['normal control 2', [[2029, 7, 24], [2029, 7, 22, 14, 30], [16, 0], 30, False], 'accepted'], ['normal control 3', [[2029, 2, 28], [2029, 2, 23, 15, 29], [16, 0], 90, True], 'accepted']], [['regression earlier-day notices 1', [[2027, 2, 25], [2027, 2, 24, 19, 0], [17, 30], 0, False], 'accepted'], ['regression earlier-day notices 2', [[2021, 2, 28], [2021, 2, 27, 18, 31], [17, 0], 0, True], 'accepted'], ['partial repair probe 1', [[2024, 7, 30], [2024, 7, 25, 18, 0], [17, 30], 30, True], 'accepted'], ['partial repair probe 2', [[2023, 7, 31], [2023, 7, 26, 19, 30], [17, 30], 90, True], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2023, 5, 6], [2023, 5, 6, 18, 0], [17, 30], 90, True], 'accepted'], ['normal control 2', [[2024, 4, 30], [2024, 5, 1, 16, 0], [16, 0], 0, False], 'expired'], ['normal control 3', [[2022, 12, 31], [2022, 12, 31, 18, 0], [17, 0], 0, False], 'late']], [['regression earlier-day notices 1', [[2026, 5, 10], [2026, 5, 9, 19, 30], [17, 30], 90, True], 'accepted'], ['regression earlier-day notices 2', [[2020, 4, 26], [2020, 4, 25, 18, 0], [17, 0], 0, True], 'accepted'], ['partial repair probe 1', [[2026, 12, 31], [2026, 12, 29, 19, 1], [17, 30], 0, False], 'accepted'], ['partial repair probe 2', [[2024, 9, 27], [2024, 9, 25, 19, 0], [17, 30], 0, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2021, 6, 30], [2021, 6, 30, 17, 30], [17, 0], 0, False], 'late'], ['normal control 2', [[2027, 10, 1], [2027, 10, 1, 16, 59], [17, 0], 90, True], 'accepted'], ['normal control 3', [[2020, 1, 31], [2020, 1, 31, 19, 30], [17, 30], 90, True], 'late']], [['regression earlier-day notices 1', [[2021, 7, 12], [2021, 7, 11, 18, 0], [17, 0], 30, True], 'accepted'], ['regression earlier-day notices 2', [[2020, 4, 10], [2020, 4, 9, 18, 31], [17, 0], 30, False], 'accepted'], ['partial repair probe 1', [[2023, 7, 23], [2023, 7, 18, 18, 0], [17, 0], 0, False], 'accepted'], ['partial repair probe 2', [[2021, 3, 13], [2021, 3, 8, 19, 0], [17, 0], 90, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2025, 5, 6], [2025, 5, 1, 17, 29], [17, 30], 0, True], 'accepted'], ['normal control 2', [[2024, 9, 24], [2024, 9, 24, 7, 0], [17, 0], 0, True], 'accepted'], ['normal control 3', [[2024, 6, 27], [2024, 6, 26, 16, 29], [17, 0], 30, True], 'accepted']], [['regression earlier-day notices 1', [[2021, 2, 27], [2021, 2, 26, 17, 30], [16, 0], 90, False], 'accepted'], ['regression earlier-day notices 2', [[2026, 12, 25], [2026, 12, 24, 18, 0], [17, 30], 30, False], 'accepted'], ['partial repair probe 1', [[2023, 1, 30], [2023, 1, 25, 19, 0], [17, 30], 90, True], 'accepted'], ['partial repair probe 2', [[2028, 3, 27], [2028, 3, 22, 18, 0], [17, 0], 0, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2022, 7, 17], [2022, 7, 15, 16, 0], [17, 30], 90, False], 'accepted'], ['normal control 2', [[2030, 2, 28], [2030, 2, 28, 16, 1], [16, 0], 90, False], 'late'], ['normal control 3', [[2024, 3, 29], [2024, 3, 28, 16, 0], [16, 0], 0, False], 'accepted']]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression earlier-day notices 1 | late | accepted | Failed |
| regression earlier-day notices 2 | late | accepted | Failed |
| partial repair probe 1 | late | accepted | Failed |
| partial repair probe 2 | late | accepted | Failed |
| boundary control 1 | accepted | accepted | Passed |
| normal control 1 | late | late | Passed |
| normal control 2 | accepted | accepted | Passed |
| normal control 3 | accepted | accepted | Passed |
SHA-256 / f46da359bb8befe2167b46cfb77e86785d2ec5526c9ec87ccc42a1d42c7ea155
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import datetime
N = 1
observations = []
def solve(expiry, submit, cutoff, extension, member):
e = datetime.date(*expiry)
y, m, d, hh, mm = submit
sd = datetime.date(y, m, d)
if sd > e:
return 'expired'
if sd < e:
return 'accepted'
limit = cutoff[0] * 60 + cutoff[1] + (extension if member else 0)
return 'accepted' if hh * 60 + mm <= limit else 'late'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression earlier-day notices 1', [[2025, 10, 12], [2025, 10, 11, 19, 30], [17, 30], 30, False], 'accepted'], ['regression earlier-day notices 2', [[2022, 7, 29], [2022, 7, 28, 18, 30], [17, 30], 0, False], 'accepted'], ['partial repair probe 1', [[2020, 3, 27], [2020, 3, 25, 16, 30], [16, 0], 0, False], 'accepted'], ['partial repair probe 2', [[2020, 6, 27], [2020, 6, 25, 18, 31], [17, 0], 30, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2023, 11, 14], [2023, 11, 14, 18, 30], [17, 0], 90, False], 'late'], ['normal control 2', [[2029, 7, 24], [2029, 7, 22, 14, 30], [16, 0], 30, False], 'accepted'], ['normal control 3', [[2029, 2, 28], [2029, 2, 23, 15, 29], [16, 0], 90, True], 'accepted']], [['regression earlier-day notices 1', [[2027, 2, 25], [2027, 2, 24, 19, 0], [17, 30], 0, False], 'accepted'], ['regression earlier-day notices 2', [[2021, 2, 28], [2021, 2, 27, 18, 31], [17, 0], 0, True], 'accepted'], ['partial repair probe 1', [[2024, 7, 30], [2024, 7, 25, 18, 0], [17, 30], 30, True], 'accepted'], ['partial repair probe 2', [[2023, 7, 31], [2023, 7, 26, 19, 30], [17, 30], 90, True], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2023, 5, 6], [2023, 5, 6, 18, 0], [17, 30], 90, True], 'accepted'], ['normal control 2', [[2024, 4, 30], [2024, 5, 1, 16, 0], [16, 0], 0, False], 'expired'], ['normal control 3', [[2022, 12, 31], [2022, 12, 31, 18, 0], [17, 0], 0, False], 'late']], [['regression earlier-day notices 1', [[2026, 5, 10], [2026, 5, 9, 19, 30], [17, 30], 90, True], 'accepted'], ['regression earlier-day notices 2', [[2020, 4, 26], [2020, 4, 25, 18, 0], [17, 0], 0, True], 'accepted'], ['partial repair probe 1', [[2026, 12, 31], [2026, 12, 29, 19, 1], [17, 30], 0, False], 'accepted'], ['partial repair probe 2', [[2024, 9, 27], [2024, 9, 25, 19, 0], [17, 30], 0, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2021, 6, 30], [2021, 6, 30, 17, 30], [17, 0], 0, False], 'late'], ['normal control 2', [[2027, 10, 1], [2027, 10, 1, 16, 59], [17, 0], 90, True], 'accepted'], ['normal control 3', [[2020, 1, 31], [2020, 1, 31, 19, 30], [17, 30], 90, True], 'late']], [['regression earlier-day notices 1', [[2021, 7, 12], [2021, 7, 11, 18, 0], [17, 0], 30, True], 'accepted'], ['regression earlier-day notices 2', [[2020, 4, 10], [2020, 4, 9, 18, 31], [17, 0], 30, False], 'accepted'], ['partial repair probe 1', [[2023, 7, 23], [2023, 7, 18, 18, 0], [17, 0], 0, False], 'accepted'], ['partial repair probe 2', [[2021, 3, 13], [2021, 3, 8, 19, 0], [17, 0], 90, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2025, 5, 6], [2025, 5, 1, 17, 29], [17, 30], 0, True], 'accepted'], ['normal control 2', [[2024, 9, 24], [2024, 9, 24, 7, 0], [17, 0], 0, True], 'accepted'], ['normal control 3', [[2024, 6, 27], [2024, 6, 26, 16, 29], [17, 0], 30, True], 'accepted']], [['regression earlier-day notices 1', [[2021, 2, 27], [2021, 2, 26, 17, 30], [16, 0], 90, False], 'accepted'], ['regression earlier-day notices 2', [[2026, 12, 25], [2026, 12, 24, 18, 0], [17, 30], 30, False], 'accepted'], ['partial repair probe 1', [[2023, 1, 30], [2023, 1, 25, 19, 0], [17, 30], 90, True], 'accepted'], ['partial repair probe 2', [[2028, 3, 27], [2028, 3, 22, 18, 0], [17, 0], 0, False], 'accepted'], ['boundary control 1', [[2024, 6, 21], [2024, 6, 21, 17, 30], [17, 30], 0, False], 'accepted'], ['normal control 1', [[2022, 7, 17], [2022, 7, 15, 16, 0], [17, 30], 90, False], 'accepted'], ['normal control 2', [[2030, 2, 28], [2030, 2, 28, 16, 1], [16, 0], 90, False], 'late'], ['normal control 3', [[2024, 3, 29], [2024, 3, 28, 16, 0], [16, 0], 0, False], 'accepted']]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression earlier-day notices 1 | accepted | accepted | Passed |
| regression earlier-day notices 2 | accepted | accepted | Passed |
| partial repair probe 1 | accepted | accepted | Passed |
| partial repair probe 2 | accepted | accepted | Passed |
| boundary control 1 | accepted | accepted | Passed |
| normal control 1 | late | late | Passed |
| normal control 2 | accepted | accepted | Passed |
| normal control 3 | accepted | accepted | Passed |
SHA-256 / 786ee5386ee30f837aea571d705e5bb33498c3f9e71b4ea9f2db0f857190e813
Verification & scope
A deterministic toy contract stated explicitly in the contract field; no claim of conformance to any exchange or clearing rulebook. 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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:46:58.711820+00:00.
Case digest / 985ed22ad151b615546d04cf8864dc38b85fd9e0f57a357516c2498cef0b3dc4