FAILURE MAP
← Case archive

FA-61571 / Options payoff and settlement / Open access

Special opening settlement value for index options: a component that did not open contributes zero · case 01

Settlement values drop sharply when any component is halted at the open.

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

ROOT CAUSE

A missing opening price is replaced with zero instead of the last close.

VERIFIED REPAIR

Use the last close when the component did not open.

Unsuccessful approach: Skipping the component entirely still removes its weight from the index.

Case contract

Inputs components [weight, opening price or None, last close] and a divisor. Each component uses its opening price, or its last close if it did not open. Settlement = sum(weight*price)/divisor computed in Decimal and rounded half-up to cents. Return as a string.

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
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN, ROUND_DOWN
N = 1
observations = []
def solve(components, divisor):
    total = Decimal(0)
    for w, op, close in components:
        px = op if op is not None else 0
        total += Decimal(str(w)) * Decimal(str(px))
    val = (total / Decimal(str(divisor))).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
    return str(val)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression missing open fallback 1', [[[2, None, 115.206], [1, 23.708, 24.652], [0.5, 181.789, 183.252], [2, None, 61.839]], 1], '468.69'], ['regression missing open fallback 2', [[[1.5, None, 24.688], [2, 160.56, 157.77], [1.5, 200.672, 196.322], [3, None, 98.648], [0.5, None, 125.74], [2, 171.321, 172.59]], 2], '680.31'], ['partial repair probe 1', [[[0.5, None, 183.66], [3, 112.315, 112.462]], 4], '107.19'], ['partial repair probe 2', [[[1, None, 10.0], [2, 5.0, 4.0]], 2], '10.00'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1.5, 20.89, 21.872], [0.5, 159.942, 166.962], [2, 58.292, 55.668], [0.5, 183.012, 190.231], [2, 101.494, 106.674]], 2], '261.19'], ['normal control 2', [[[3, 20.48, 20.008], [1.5, 192.549, 189.685], [1, 21.121, 20.491]], 1.25], '297.11'], ['normal control 3', [[[2, 126.363, 124.863], [1, 36.194, 37.017]], 4], '72.23']], [['regression missing open fallback 1', [[[1, 131.736, 138.663], [1.5, 18.442, 18.4], [1.5, None, 24.689], [2, 175.625, 170.018], [3, None, 36.68], [0.5, None, 100.175]], 1.25], '566.25'], ['regression missing open fallback 2', [[[0.5, 160.034, 165.009], [1.5, None, 102.934], [2, 170.712, 162.745]], 4], '143.96'], ['partial repair probe 1', [[[3, None, 81.632], [1.5, 104.297, 105.567], [0.5, 71.467, 69.509], [0.5, 130.197, 132.774], [1, None, 25.693], [1.5, None, 155.608]], 4], '190.32'], ['partial repair probe 2', [[[2, 148.425, 155.968], [3, 57.773, 58.691], [0.5, None, 89.993], [1.5, 191.911, 189.651]], 4], '200.76'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1.5, 35.143, 35.426], [3, 100.617, 103.832], [2, 62.405, 64.429], [2, 80.435, 77.472], [1, 160.139, 152.67]], 1], '800.38'], ['normal control 2', [[[3, 41.378, 43.445], [1, 179.886, 183.213]], 2], '152.01'], ['normal control 3', [[[1, 135.435, 132.265], [3, 78.206, 76.521]], 1], '370.05']], [['regression missing open fallback 1', [[[3, None, 123.886], [0.5, 86.486, 87.731]], 4], '103.73'], ['regression missing open fallback 2', [[[2, 104.342, 106.91], [2, 170.083, 167.568], [1.5, 195.932, 197.972], [1.5, None, 12.919]], 8], '107.77'], ['partial repair probe 1', [[[0.5, None, 167.745], [2, None, 61.499], [1, None, 116.451], [1.5, None, 106.319]], 1], '482.80'], ['partial repair probe 2', [[[3, 135.281, 140.494], [1, None, 68.724], [0.5, 75.18, 76.215]], 1.25], '409.73'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1, 50.757, 51.824], [1, 200.665, 193.258]], 1], '251.42'], ['normal control 2', [[[0.5, 43.515, 43.189], [1.5, 16.167, 16.829], [0.5, 26.702, 26.791]], 8], '7.42'], ['normal control 3', [[[3, 171.072, 165.043], [2, 154.659, 157.216]], 8], '102.82']], [['regression missing open fallback 1', [[[3, 131.008, 134.072], [3, None, 37.926]], 2], '253.40'], ['regression missing open fallback 2', [[[1, 24.616, 23.898], [1, 153.481, 149.285], [2, 183.518, 192.455], [3, None, 166.179], [3, 154.43, 148.43]], 1.25], '1205.57'], ['partial repair probe 1', [[[1.5, 97.392, 97.058], [1.5, None, 76.047], [1, None, 33.703], [0.5, 21.086, 20.886]], 1.25], '243.52'], ['partial repair probe 2', [[[3, None, 179.355], [1.5, 148.385, 144.973], [3, 109.86, 107.267], [1.5, 110.668, 116.093], [3, 146.596, 143.988]], 2], '848.01'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1.5, 18.607, 19.247], [3, 54.074, 54.599], [3, 39.606, 37.821], [3, 109.319, 113.328]], 1.25], '509.53'], ['normal control 2', [[[0.5, 171.205, 173.383], [1, 180.229, 188.896]], 8], '33.23'], ['normal control 3', [[[1.5, 174.784, 180.819], [2, 16.585, 16.819], [1.5, 76.094, 74.256], [2, 90.607, 91.954], [3, 59.168, 59.298]], 8], '96.03']], [['regression missing open fallback 1', [[[2, None, 92.239], [1.5, None, 96.198], [1.5, None, 175.435], [2, 82.14, 84.56]], 0.5], '1512.42'], ['regression missing open fallback 2', [[[1, 155.316, 157.069], [3, None, 132.876], [3, None, 48.224], [0.5, 15.731, 15.984], [1, 32.783, 32.681]], 4], '184.82'], ['partial repair probe 1', [[[0.5, None, 62.2], [1.5, 195.28, 190.501], [3, 27.194, 28.41], [3, 40.239, 38.732]], 1], '526.32'], ['partial repair probe 2', [[[1, None, 186.885], [0.5, None, 185.823]], 4], '69.95'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[3, 80.305, 81.452], [3, 192.096, 191.063], [0.5, 174.687, 183.553], [1, 118.658, 123.09]], 1], '1023.20'], ['normal control 2', [[[3, 31.476, 31.712], [1, 35.573, 36.594], [1.5, 77.187, 76.073], [0.5, 163.144, 157.997]], 4], '81.84'], ['normal control 3', [[[0.5, 66.287, 64.704], [3, 79.954, 82.764]], 2], '136.50']]]
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 missing open fallback 1114.60468.69Failed
regression missing open fallback 2482.39680.31Failed
partial repair probe 184.24107.19Failed
partial repair probe 25.0010.00Failed
boundary control 110.0110.01Passed
normal control 1261.19261.19Passed
normal control 2297.11297.11Passed
normal control 372.2372.23Passed

SHA-256 / bcf1507355d38734f6455be9e3f78177a55323761e7e75cb864c9f2ad839b635

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN, ROUND_DOWN
N = 1
observations = []
def solve(components, divisor):
    total = Decimal(0)
    for w, op, close in components:
        if op is None:
            continue
        px = op
        total += Decimal(str(w)) * Decimal(str(px))
    val = (total / Decimal(str(divisor))).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
    return str(val)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression missing open fallback 1', [[[2, None, 115.206], [1, 23.708, 24.652], [0.5, 181.789, 183.252], [2, None, 61.839]], 1], '468.69'], ['regression missing open fallback 2', [[[1.5, None, 24.688], [2, 160.56, 157.77], [1.5, 200.672, 196.322], [3, None, 98.648], [0.5, None, 125.74], [2, 171.321, 172.59]], 2], '680.31'], ['partial repair probe 1', [[[0.5, None, 183.66], [3, 112.315, 112.462]], 4], '107.19'], ['partial repair probe 2', [[[1, None, 10.0], [2, 5.0, 4.0]], 2], '10.00'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1.5, 20.89, 21.872], [0.5, 159.942, 166.962], [2, 58.292, 55.668], [0.5, 183.012, 190.231], [2, 101.494, 106.674]], 2], '261.19'], ['normal control 2', [[[3, 20.48, 20.008], [1.5, 192.549, 189.685], [1, 21.121, 20.491]], 1.25], '297.11'], ['normal control 3', [[[2, 126.363, 124.863], [1, 36.194, 37.017]], 4], '72.23']], [['regression missing open fallback 1', [[[1, 131.736, 138.663], [1.5, 18.442, 18.4], [1.5, None, 24.689], [2, 175.625, 170.018], [3, None, 36.68], [0.5, None, 100.175]], 1.25], '566.25'], ['regression missing open fallback 2', [[[0.5, 160.034, 165.009], [1.5, None, 102.934], [2, 170.712, 162.745]], 4], '143.96'], ['partial repair probe 1', [[[3, None, 81.632], [1.5, 104.297, 105.567], [0.5, 71.467, 69.509], [0.5, 130.197, 132.774], [1, None, 25.693], [1.5, None, 155.608]], 4], '190.32'], ['partial repair probe 2', [[[2, 148.425, 155.968], [3, 57.773, 58.691], [0.5, None, 89.993], [1.5, 191.911, 189.651]], 4], '200.76'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1.5, 35.143, 35.426], [3, 100.617, 103.832], [2, 62.405, 64.429], [2, 80.435, 77.472], [1, 160.139, 152.67]], 1], '800.38'], ['normal control 2', [[[3, 41.378, 43.445], [1, 179.886, 183.213]], 2], '152.01'], ['normal control 3', [[[1, 135.435, 132.265], [3, 78.206, 76.521]], 1], '370.05']], [['regression missing open fallback 1', [[[3, None, 123.886], [0.5, 86.486, 87.731]], 4], '103.73'], ['regression missing open fallback 2', [[[2, 104.342, 106.91], [2, 170.083, 167.568], [1.5, 195.932, 197.972], [1.5, None, 12.919]], 8], '107.77'], ['partial repair probe 1', [[[0.5, None, 167.745], [2, None, 61.499], [1, None, 116.451], [1.5, None, 106.319]], 1], '482.80'], ['partial repair probe 2', [[[3, 135.281, 140.494], [1, None, 68.724], [0.5, 75.18, 76.215]], 1.25], '409.73'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1, 50.757, 51.824], [1, 200.665, 193.258]], 1], '251.42'], ['normal control 2', [[[0.5, 43.515, 43.189], [1.5, 16.167, 16.829], [0.5, 26.702, 26.791]], 8], '7.42'], ['normal control 3', [[[3, 171.072, 165.043], [2, 154.659, 157.216]], 8], '102.82']], [['regression missing open fallback 1', [[[3, 131.008, 134.072], [3, None, 37.926]], 2], '253.40'], ['regression missing open fallback 2', [[[1, 24.616, 23.898], [1, 153.481, 149.285], [2, 183.518, 192.455], [3, None, 166.179], [3, 154.43, 148.43]], 1.25], '1205.57'], ['partial repair probe 1', [[[1.5, 97.392, 97.058], [1.5, None, 76.047], [1, None, 33.703], [0.5, 21.086, 20.886]], 1.25], '243.52'], ['partial repair probe 2', [[[3, None, 179.355], [1.5, 148.385, 144.973], [3, 109.86, 107.267], [1.5, 110.668, 116.093], [3, 146.596, 143.988]], 2], '848.01'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1.5, 18.607, 19.247], [3, 54.074, 54.599], [3, 39.606, 37.821], [3, 109.319, 113.328]], 1.25], '509.53'], ['normal control 2', [[[0.5, 171.205, 173.383], [1, 180.229, 188.896]], 8], '33.23'], ['normal control 3', [[[1.5, 174.784, 180.819], [2, 16.585, 16.819], [1.5, 76.094, 74.256], [2, 90.607, 91.954], [3, 59.168, 59.298]], 8], '96.03']], [['regression missing open fallback 1', [[[2, None, 92.239], [1.5, None, 96.198], [1.5, None, 175.435], [2, 82.14, 84.56]], 0.5], '1512.42'], ['regression missing open fallback 2', [[[1, 155.316, 157.069], [3, None, 132.876], [3, None, 48.224], [0.5, 15.731, 15.984], [1, 32.783, 32.681]], 4], '184.82'], ['partial repair probe 1', [[[0.5, None, 62.2], [1.5, 195.28, 190.501], [3, 27.194, 28.41], [3, 40.239, 38.732]], 1], '526.32'], ['partial repair probe 2', [[[1, None, 186.885], [0.5, None, 185.823]], 4], '69.95'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[3, 80.305, 81.452], [3, 192.096, 191.063], [0.5, 174.687, 183.553], [1, 118.658, 123.09]], 1], '1023.20'], ['normal control 2', [[[3, 31.476, 31.712], [1, 35.573, 36.594], [1.5, 77.187, 76.073], [0.5, 163.144, 157.997]], 4], '81.84'], ['normal control 3', [[[0.5, 66.287, 64.704], [3, 79.954, 82.764]], 2], '136.50']]]
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 missing open fallback 1114.60468.69Failed
regression missing open fallback 2482.39680.31Failed
partial repair probe 184.24107.19Failed
partial repair probe 25.0010.00Failed
boundary control 110.0110.01Passed
normal control 1261.19261.19Passed
normal control 2297.11297.11Passed
normal control 372.2372.23Passed

SHA-256 / 7b92207ded447d65ae131e28d7d6fec48af982dbbd0d9530d7fe465a263c9ca7

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN, ROUND_DOWN
N = 1
observations = []
def solve(components, divisor):
    total = Decimal(0)
    for w, op, close in components:
        px = op if op is not None else close
        total += Decimal(str(w)) * Decimal(str(px))
    val = (total / Decimal(str(divisor))).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
    return str(val)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression missing open fallback 1', [[[2, None, 115.206], [1, 23.708, 24.652], [0.5, 181.789, 183.252], [2, None, 61.839]], 1], '468.69'], ['regression missing open fallback 2', [[[1.5, None, 24.688], [2, 160.56, 157.77], [1.5, 200.672, 196.322], [3, None, 98.648], [0.5, None, 125.74], [2, 171.321, 172.59]], 2], '680.31'], ['partial repair probe 1', [[[0.5, None, 183.66], [3, 112.315, 112.462]], 4], '107.19'], ['partial repair probe 2', [[[1, None, 10.0], [2, 5.0, 4.0]], 2], '10.00'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1.5, 20.89, 21.872], [0.5, 159.942, 166.962], [2, 58.292, 55.668], [0.5, 183.012, 190.231], [2, 101.494, 106.674]], 2], '261.19'], ['normal control 2', [[[3, 20.48, 20.008], [1.5, 192.549, 189.685], [1, 21.121, 20.491]], 1.25], '297.11'], ['normal control 3', [[[2, 126.363, 124.863], [1, 36.194, 37.017]], 4], '72.23']], [['regression missing open fallback 1', [[[1, 131.736, 138.663], [1.5, 18.442, 18.4], [1.5, None, 24.689], [2, 175.625, 170.018], [3, None, 36.68], [0.5, None, 100.175]], 1.25], '566.25'], ['regression missing open fallback 2', [[[0.5, 160.034, 165.009], [1.5, None, 102.934], [2, 170.712, 162.745]], 4], '143.96'], ['partial repair probe 1', [[[3, None, 81.632], [1.5, 104.297, 105.567], [0.5, 71.467, 69.509], [0.5, 130.197, 132.774], [1, None, 25.693], [1.5, None, 155.608]], 4], '190.32'], ['partial repair probe 2', [[[2, 148.425, 155.968], [3, 57.773, 58.691], [0.5, None, 89.993], [1.5, 191.911, 189.651]], 4], '200.76'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1.5, 35.143, 35.426], [3, 100.617, 103.832], [2, 62.405, 64.429], [2, 80.435, 77.472], [1, 160.139, 152.67]], 1], '800.38'], ['normal control 2', [[[3, 41.378, 43.445], [1, 179.886, 183.213]], 2], '152.01'], ['normal control 3', [[[1, 135.435, 132.265], [3, 78.206, 76.521]], 1], '370.05']], [['regression missing open fallback 1', [[[3, None, 123.886], [0.5, 86.486, 87.731]], 4], '103.73'], ['regression missing open fallback 2', [[[2, 104.342, 106.91], [2, 170.083, 167.568], [1.5, 195.932, 197.972], [1.5, None, 12.919]], 8], '107.77'], ['partial repair probe 1', [[[0.5, None, 167.745], [2, None, 61.499], [1, None, 116.451], [1.5, None, 106.319]], 1], '482.80'], ['partial repair probe 2', [[[3, 135.281, 140.494], [1, None, 68.724], [0.5, 75.18, 76.215]], 1.25], '409.73'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1, 50.757, 51.824], [1, 200.665, 193.258]], 1], '251.42'], ['normal control 2', [[[0.5, 43.515, 43.189], [1.5, 16.167, 16.829], [0.5, 26.702, 26.791]], 8], '7.42'], ['normal control 3', [[[3, 171.072, 165.043], [2, 154.659, 157.216]], 8], '102.82']], [['regression missing open fallback 1', [[[3, 131.008, 134.072], [3, None, 37.926]], 2], '253.40'], ['regression missing open fallback 2', [[[1, 24.616, 23.898], [1, 153.481, 149.285], [2, 183.518, 192.455], [3, None, 166.179], [3, 154.43, 148.43]], 1.25], '1205.57'], ['partial repair probe 1', [[[1.5, 97.392, 97.058], [1.5, None, 76.047], [1, None, 33.703], [0.5, 21.086, 20.886]], 1.25], '243.52'], ['partial repair probe 2', [[[3, None, 179.355], [1.5, 148.385, 144.973], [3, 109.86, 107.267], [1.5, 110.668, 116.093], [3, 146.596, 143.988]], 2], '848.01'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[1.5, 18.607, 19.247], [3, 54.074, 54.599], [3, 39.606, 37.821], [3, 109.319, 113.328]], 1.25], '509.53'], ['normal control 2', [[[0.5, 171.205, 173.383], [1, 180.229, 188.896]], 8], '33.23'], ['normal control 3', [[[1.5, 174.784, 180.819], [2, 16.585, 16.819], [1.5, 76.094, 74.256], [2, 90.607, 91.954], [3, 59.168, 59.298]], 8], '96.03']], [['regression missing open fallback 1', [[[2, None, 92.239], [1.5, None, 96.198], [1.5, None, 175.435], [2, 82.14, 84.56]], 0.5], '1512.42'], ['regression missing open fallback 2', [[[1, 155.316, 157.069], [3, None, 132.876], [3, None, 48.224], [0.5, 15.731, 15.984], [1, 32.783, 32.681]], 4], '184.82'], ['partial repair probe 1', [[[0.5, None, 62.2], [1.5, 195.28, 190.501], [3, 27.194, 28.41], [3, 40.239, 38.732]], 1], '526.32'], ['partial repair probe 2', [[[1, None, 186.885], [0.5, None, 185.823]], 4], '69.95'], ['boundary control 1', [[[1, 10.005, 10.0]], 1], '10.01'], ['normal control 1', [[[3, 80.305, 81.452], [3, 192.096, 191.063], [0.5, 174.687, 183.553], [1, 118.658, 123.09]], 1], '1023.20'], ['normal control 2', [[[3, 31.476, 31.712], [1, 35.573, 36.594], [1.5, 77.187, 76.073], [0.5, 163.144, 157.997]], 4], '81.84'], ['normal control 3', [[[0.5, 66.287, 64.704], [3, 79.954, 82.764]], 2], '136.50']]]
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 missing open fallback 1468.69468.69Passed
regression missing open fallback 2680.31680.31Passed
partial repair probe 1107.19107.19Passed
partial repair probe 210.0010.00Passed
boundary control 110.0110.01Passed
normal control 1261.19261.19Passed
normal control 2297.11297.11Passed
normal control 372.2372.23Passed

SHA-256 / d50b26e49533e238ad54a420f099e4620a8729d81b8ad73cb98c3685d9b70871

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

Case digest / 901147f77a42d79a29e7707c7742a3a38d726261375a48ae17bd8aed5e54369c