FAILURE MAP
← Case archive

FA-61786 / Options payoff and settlement / Open access

Early call exercise before an ex-dividend date: a dividend equal to extrinsic value triggers exercise · case 01

Exercise happens when the holder is indifferent.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The comparison is >=.

VERIFIED REPAIR

Exercise only when the dividend strictly exceeds extrinsic value.

Unsuccessful approach: Requiring a one-cent margin rejects dividends exactly one cent above.

Case contract

Inputs call price, spot, strike, dividend and whether today is the last cum-dividend day. Exercise only on the last cum-dividend day, only if the call is in the money, and only if the dividend is strictly greater than the call's extrinsic value (price - intrinsic). Amounts compared exactly in cents. Return true/false.

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

N = 1
observations = []
def solve(call_price, S, K, dividend, last_cum_day):
    c = round(call_price * 100)
    intrinsic = max(round(S * 100) - round(K * 100), 0)
    if not last_cum_day or intrinsic == 0:
        return False
    extrinsic = c - intrinsic
    return round(dividend * 100) >= extrinsic
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression break-even tie 1', [15.5, 105.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [8.5, 98.0, 90.0, 0.5, True], False], ['partial repair probe 1', [15.25, 105.0, 90.0, 0.26, True], True], ['partial repair probe 2', [5.5, 105.0, 100.0, 0.51, True], True], ['normal control 1', [21.0, 120.0, 100.0, 0.5, True], False], ['normal control 2', [0.5, 100.0, 100.0, 0.51, True], False], ['normal control 3', [0.5, 100.0, 100.0, 0.5, False], False], ['normal control 4', [1.5, 100.0, 110.0, 1.51, True], False]], [['regression break-even tie 1', [10.5, 100.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [16.5, 105.0, 90.0, 1.5, True], False], ['partial repair probe 1', [15.5, 105.0, 90.0, 0.51, True], True], ['partial repair probe 2', [10.25, 120.0, 110.0, 0.26, True], True], ['normal control 1', [0.25, 98.0, 110.0, 1.0, True], False], ['normal control 2', [0.5, 98.0, 110.0, 0.5, True], False], ['normal control 3', [1.5, 100.0, 100.0, 1.0, True], False], ['normal control 4', [0.25, 98.0, 100.0, 0.26, True], False]], [['regression break-even tie 1', [8.5, 98.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [11.5, 120.0, 110.0, 1.5, True], False], ['partial repair probe 1', [20.25, 120.0, 100.0, 0.26, True], True], ['partial repair probe 2', [11.5, 120.0, 110.0, 1.51, True], True], ['normal control 1', [5.05, 105.0, 100.0, 0.5, True], True], ['normal control 2', [0.25, 105.0, 110.0, 0.5, True], False], ['normal control 3', [10.5, 120.0, 110.0, 1.0, True], True], ['normal control 4', [1.0, 98.0, 100.0, 0.5, True], False]], [['regression break-even tie 1', [15.5, 105.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [20.25, 120.0, 100.0, 0.25, True], False], ['partial repair probe 1', [11.0, 120.0, 110.0, 1.01, True], True], ['partial repair probe 2', [5.5, 105.0, 100.0, 0.51, True], True], ['normal control 1', [8.05, 98.0, 90.0, 0.05, False], False], ['normal control 2', [0.25, 100.0, 110.0, 0.5, True], False], ['normal control 3', [9.5, 98.0, 90.0, 1.51, False], False], ['normal control 4', [1.0, 98.0, 100.0, 1.0, True], False]], [['regression break-even tie 1', [10.25, 120.0, 110.0, 0.25, True], False], ['regression break-even tie 2', [11.0, 120.0, 110.0, 1.0, True], False], ['partial repair probe 1', [11.0, 120.0, 110.0, 1.01, True], True], ['partial repair probe 2', [6.5, 105.0, 100.0, 1.51, True], True], ['normal control 1', [0.5, 105.0, 110.0, 0.25, True], False], ['normal control 2', [1.0, 98.0, 100.0, 0.5, True], False], ['normal control 3', [8.05, 98.0, 90.0, 0.060000000000000005, False], False], ['normal control 4', [0.25, 98.0, 100.0, 1.0, True], False]]]
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 fixtureActualExpectedOutcome
regression break-even tie 1TrueFalseFailed
regression break-even tie 2TrueFalseFailed
partial repair probe 1TrueTruePassed
partial repair probe 2TrueTruePassed
normal control 1FalseFalsePassed
normal control 2FalseFalsePassed
normal control 3FalseFalsePassed
normal control 4FalseFalsePassed

SHA-256 / fbdad43036c9d74161dc1dd1c3553207b3f9d04e3b5a2aa32b9fe6f024281a77

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(call_price, S, K, dividend, last_cum_day):
    c = round(call_price * 100)
    intrinsic = max(round(S * 100) - round(K * 100), 0)
    if not last_cum_day or intrinsic == 0:
        return False
    extrinsic = c - intrinsic
    return round(dividend * 100) > extrinsic + 1
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression break-even tie 1', [15.5, 105.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [8.5, 98.0, 90.0, 0.5, True], False], ['partial repair probe 1', [15.25, 105.0, 90.0, 0.26, True], True], ['partial repair probe 2', [5.5, 105.0, 100.0, 0.51, True], True], ['normal control 1', [21.0, 120.0, 100.0, 0.5, True], False], ['normal control 2', [0.5, 100.0, 100.0, 0.51, True], False], ['normal control 3', [0.5, 100.0, 100.0, 0.5, False], False], ['normal control 4', [1.5, 100.0, 110.0, 1.51, True], False]], [['regression break-even tie 1', [10.5, 100.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [16.5, 105.0, 90.0, 1.5, True], False], ['partial repair probe 1', [15.5, 105.0, 90.0, 0.51, True], True], ['partial repair probe 2', [10.25, 120.0, 110.0, 0.26, True], True], ['normal control 1', [0.25, 98.0, 110.0, 1.0, True], False], ['normal control 2', [0.5, 98.0, 110.0, 0.5, True], False], ['normal control 3', [1.5, 100.0, 100.0, 1.0, True], False], ['normal control 4', [0.25, 98.0, 100.0, 0.26, True], False]], [['regression break-even tie 1', [8.5, 98.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [11.5, 120.0, 110.0, 1.5, True], False], ['partial repair probe 1', [20.25, 120.0, 100.0, 0.26, True], True], ['partial repair probe 2', [11.5, 120.0, 110.0, 1.51, True], True], ['normal control 1', [5.05, 105.0, 100.0, 0.5, True], True], ['normal control 2', [0.25, 105.0, 110.0, 0.5, True], False], ['normal control 3', [10.5, 120.0, 110.0, 1.0, True], True], ['normal control 4', [1.0, 98.0, 100.0, 0.5, True], False]], [['regression break-even tie 1', [15.5, 105.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [20.25, 120.0, 100.0, 0.25, True], False], ['partial repair probe 1', [11.0, 120.0, 110.0, 1.01, True], True], ['partial repair probe 2', [5.5, 105.0, 100.0, 0.51, True], True], ['normal control 1', [8.05, 98.0, 90.0, 0.05, False], False], ['normal control 2', [0.25, 100.0, 110.0, 0.5, True], False], ['normal control 3', [9.5, 98.0, 90.0, 1.51, False], False], ['normal control 4', [1.0, 98.0, 100.0, 1.0, True], False]], [['regression break-even tie 1', [10.25, 120.0, 110.0, 0.25, True], False], ['regression break-even tie 2', [11.0, 120.0, 110.0, 1.0, True], False], ['partial repair probe 1', [11.0, 120.0, 110.0, 1.01, True], True], ['partial repair probe 2', [6.5, 105.0, 100.0, 1.51, True], True], ['normal control 1', [0.5, 105.0, 110.0, 0.25, True], False], ['normal control 2', [1.0, 98.0, 100.0, 0.5, True], False], ['normal control 3', [8.05, 98.0, 90.0, 0.060000000000000005, False], False], ['normal control 4', [0.25, 98.0, 100.0, 1.0, True], False]]]
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 fixtureActualExpectedOutcome
regression break-even tie 1FalseFalsePassed
regression break-even tie 2FalseFalsePassed
partial repair probe 1FalseTrueFailed
partial repair probe 2FalseTrueFailed
normal control 1FalseFalsePassed
normal control 2FalseFalsePassed
normal control 3FalseFalsePassed
normal control 4FalseFalsePassed

SHA-256 / 7c7c5f44d425e98dd5c718fde0b2a553d342e96fe3ba191342b96fad68c2eac2

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(call_price, S, K, dividend, last_cum_day):
    c = round(call_price * 100)
    intrinsic = max(round(S * 100) - round(K * 100), 0)
    if not last_cum_day or intrinsic == 0:
        return False
    extrinsic = c - intrinsic
    return round(dividend * 100) > extrinsic
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression break-even tie 1', [15.5, 105.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [8.5, 98.0, 90.0, 0.5, True], False], ['partial repair probe 1', [15.25, 105.0, 90.0, 0.26, True], True], ['partial repair probe 2', [5.5, 105.0, 100.0, 0.51, True], True], ['normal control 1', [21.0, 120.0, 100.0, 0.5, True], False], ['normal control 2', [0.5, 100.0, 100.0, 0.51, True], False], ['normal control 3', [0.5, 100.0, 100.0, 0.5, False], False], ['normal control 4', [1.5, 100.0, 110.0, 1.51, True], False]], [['regression break-even tie 1', [10.5, 100.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [16.5, 105.0, 90.0, 1.5, True], False], ['partial repair probe 1', [15.5, 105.0, 90.0, 0.51, True], True], ['partial repair probe 2', [10.25, 120.0, 110.0, 0.26, True], True], ['normal control 1', [0.25, 98.0, 110.0, 1.0, True], False], ['normal control 2', [0.5, 98.0, 110.0, 0.5, True], False], ['normal control 3', [1.5, 100.0, 100.0, 1.0, True], False], ['normal control 4', [0.25, 98.0, 100.0, 0.26, True], False]], [['regression break-even tie 1', [8.5, 98.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [11.5, 120.0, 110.0, 1.5, True], False], ['partial repair probe 1', [20.25, 120.0, 100.0, 0.26, True], True], ['partial repair probe 2', [11.5, 120.0, 110.0, 1.51, True], True], ['normal control 1', [5.05, 105.0, 100.0, 0.5, True], True], ['normal control 2', [0.25, 105.0, 110.0, 0.5, True], False], ['normal control 3', [10.5, 120.0, 110.0, 1.0, True], True], ['normal control 4', [1.0, 98.0, 100.0, 0.5, True], False]], [['regression break-even tie 1', [15.5, 105.0, 90.0, 0.5, True], False], ['regression break-even tie 2', [20.25, 120.0, 100.0, 0.25, True], False], ['partial repair probe 1', [11.0, 120.0, 110.0, 1.01, True], True], ['partial repair probe 2', [5.5, 105.0, 100.0, 0.51, True], True], ['normal control 1', [8.05, 98.0, 90.0, 0.05, False], False], ['normal control 2', [0.25, 100.0, 110.0, 0.5, True], False], ['normal control 3', [9.5, 98.0, 90.0, 1.51, False], False], ['normal control 4', [1.0, 98.0, 100.0, 1.0, True], False]], [['regression break-even tie 1', [10.25, 120.0, 110.0, 0.25, True], False], ['regression break-even tie 2', [11.0, 120.0, 110.0, 1.0, True], False], ['partial repair probe 1', [11.0, 120.0, 110.0, 1.01, True], True], ['partial repair probe 2', [6.5, 105.0, 100.0, 1.51, True], True], ['normal control 1', [0.5, 105.0, 110.0, 0.25, True], False], ['normal control 2', [1.0, 98.0, 100.0, 0.5, True], False], ['normal control 3', [8.05, 98.0, 90.0, 0.060000000000000005, False], False], ['normal control 4', [0.25, 98.0, 100.0, 1.0, True], False]]]
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 fixtureActualExpectedOutcome
regression break-even tie 1FalseFalsePassed
regression break-even tie 2FalseFalsePassed
partial repair probe 1TrueTruePassed
partial repair probe 2TrueTruePassed
normal control 1FalseFalsePassed
normal control 2FalseFalsePassed
normal control 3FalseFalsePassed
normal control 4FalseFalsePassed

SHA-256 / 33d57d828a5552e3c164ae04b857a1e32d57f4c2e8570bbb10d3d806cd5e9faf

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.517489+00:00.

Case digest / 06fe5b26b6e7121c9643c453ffa2feb98e58c1ea8e1ae1c523023f28ac4c00b7