{"abstract":"Breakevens are reported outside the segment where value changes sign.","category":"Options payoff and settlement","checks":8,"contract":"Inputs legs [kind C/P/S, strike (purchase price for stock S), signed qty, premium] and a multiplier. Expiry value V(S) = multiplier * sum(q*(intrinsic - premium)) for options and q*(S - price) for stock, in exact fractions. Breakpoints are 0 and every strike. Tail slope = V(top+1)-V(top). Max gain is None if the slope > 0 else the max over breakpoints; max loss is None if slope < 0 else the min. Breakevens are zeros at breakpoints and linear-interpolated sign changes between them and in the tail. Return [gain, loss, breakevens] rounded to 4.","contract_signature":"legs, multiplier","evaluation_group":"w2-options_payoff_and_settlement-strategy-risk-profile","failed_approach":"Using the segment midpoint is only right for symmetric segments.","family":"w2-options_payoff_and_settlement-strategy-risk-profile-breakeven-interpolation","id":"FA-61501","implementations":{"attempt":{"sha256":"e0bb3fc817c9d48c1e882ee3f2059e6a1ceea9af8fc76bcc8eb18d70f6627d44","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(legs, multiplier):\n    def value(S):\n        t = Fraction(0)\n        for kind, k, q, prem in legs:\n            p = Fraction(str(prem))\n            if kind == 'C':\n                t += q * (max(S - k, 0) - p)\n            elif kind == 'P':\n                t += q * (max(k - S, 0) - p)\n            else:\n                t += q * (S - k)\n        return t * multiplier\n    pts = sorted(set([0] + [leg[1] for leg in legs]))\n    top = pts[-1]\n    slope = value(top + 1) - value(top)\n    vals = [value(p) for p in pts]\n    gain = None if slope > 0 else max(vals)\n    loss = None if slope < 0 else min(vals)\n    bes = []\n    for a, b in zip(pts, pts[1:]):\n        va, vb = value(a), value(b)\n        if va == 0:\n            bes.append(Fraction(a))\n        elif va * vb < 0:\n            bes.append(a + Fraction(b - a, 2))\n    vt = value(top)\n    if vt == 0:\n        bes.append(Fraction(top))\n    elif vt * slope < 0:\n        bes.append(top - vt / slope)\n    def r4(x):\n        return None if x is None else float(round(x, 4))\n    return [r4(gain), r4(loss), [r4(x) for x in sorted(set(bes))]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression breakeven interpolation 1', [[['C', 100, -1, 2.0], ['C', 80, 1, 1.25], ['C', 95, 2, 5.1], ['C', 115, 1, 1.25]], 100], [None, -1070.0, [90.7]]], ['regression breakeven interpolation 2', [[['P', 95, -1, 7.75]], 100], [775.0, -8725.0, [87.25]]], ['partial repair probe 1', [[['C', 115, -1, 3.4], ['C', 95, 2, 3.4], ['C', 105, -1, 1.25]], 100], [2785.0, -215.0, [96.075]]], ['partial repair probe 2', [[['P', 85, -1, 2.0]], 100], [200.0, -8300.0, [83.0]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['S', 105, -1, 0.0], ['C', 110, 1, 0.5], ['C', 80, 2, 3.4]], 1], [None, 17.7, []]], ['normal control 2', [[['P', 100, 2, 0.5], ['C', 105, 2, 0.5], ['S', 90, 1, 0.0]], 1], [None, 8.0, []]], ['normal control 3', [[['C', 85, -1, 1.25]], 1], [1.25, None, [86.25]]]], [['regression breakeven interpolation 1', [[['S', 120, -1, 0.0], ['S', 90, 2, 0.0]], 100], [None, -6000.0, [60.0]]], ['regression breakeven interpolation 2', [[['C', 85, -1, 3.4], ['C', 80, -1, 1.25]], 1], [4.65, None, [84.65]]], ['partial repair probe 1', [[['S', 100, 2, 0.0], ['S', 120, 1, 0.0], ['P', 100, -2, 5.1]], 100], [None, -50980.0, [103.2667]]], ['partial repair probe 2', [[['C', 115, -2, 7.75], ['P', 105, -1, 2.0]], 1], [17.5, None, [87.5, 123.75]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['C', 100, -2, 3.4], ['C', 105, 2, 3.4]], 1], [0.0, -10.0, [0.0, 100.0]]], ['normal control 2', [[['S', 95, -1, 0.0], ['C', 105, 2, 2.0], ['S', 110, 1, 0.0]], 1], [None, -19.0, [114.5]]], ['normal control 3', [[['C', 95, 1, 7.75], ['P', 120, 1, 5.1], ['C', 110, 1, 7.75]], 1], [None, 4.4, []]]], [['regression breakeven interpolation 1', [[['P', 110, -1, 5.1], ['P', 95, 1, 1.25]], 100], [385.0, -1115.0, [106.15]]], ['regression breakeven interpolation 2', [[['S', 115, 1, 0.0], ['P', 120, 1, 0.5], ['C', 110, 2, 3.4]], 1], [None, -2.3, [111.15]]], ['partial repair probe 1', [[['C', 110, -2, 5.1], ['P', 80, -1, 3.4]], 1], [13.6, None, [66.4, 116.8]]], ['partial repair probe 2', [[['C', 90, -1, 0.5], ['P', 90, -2, 5.1]], 1], [10.7, None, [84.65, 100.7]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['C', 90, -2, 3.4]], 1], [6.8, None, [93.4]]], ['normal control 2', [[['C', 105, -1, 0.5]], 100], [50.0, None, [105.5]]], ['normal control 3', [[['P', 115, -1, 3.4], ['C', 110, 2, 5.1], ['S', 115, -1, 0.0], ['C', 95, -2, 2.0]], 100], [-280.0, None, []]]], [['regression breakeven interpolation 1', [[['C', 120, -1, 7.75], ['S', 80, -2, 0.0], ['C', 95, -1, 1.25]], 1], [169.0, None, [84.5]]], ['regression breakeven interpolation 2', [[['P', 110, -2, 2.0]], 100], [400.0, -21600.0, [108.0]]], ['partial repair probe 1', [[['P', 110, 1, 1.25]], 100], [10875.0, -125.0, [108.75]]], ['partial repair probe 2', [[['P', 110, -1, 3.4]], 100], [340.0, -10660.0, [106.6]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['C', 105, 1, 7.75]], 100], [None, -775.0, [112.75]]], ['normal control 2', [[['C', 80, 1, 5.1], ['S', 85, 1, 0.0]], 1], [None, -90.1, [85.05]]], ['normal control 3', [[['C', 85, 2, 0.5]], 100], [None, -100.0, [85.5]]]], [['regression breakeven interpolation 1', [[['P', 80, -1, 7.75]], 1], [7.75, -72.25, [72.25]]], ['regression breakeven interpolation 2', [[['C', 90, 1, 7.75], ['P', 105, -2, 1.25]], 1], [None, -215.25, [101.75]]], ['partial repair probe 1', [[['P', 120, -2, 7.75], ['P', 105, 1, 1.25], ['P', 100, 2, 1.25], ['C', 115, 2, 0.5]], 1], [None, -24.25, [75.75, 114.625]]], ['partial repair probe 2', [[['C', 85, 2, 1.25], ['P', 100, -2, 5.1], ['P', 100, 1, 2.0]], 1], [None, -94.3, [88.1]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['S', 100, 1, 0.0], ['C', 105, -2, 2.0], ['P', 105, 1, 2.0], ['C', 95, 2, 1.25]], 1], [None, 4.5, []]], ['normal control 2', [[['S', 90, 1, 0.0], ['P', 115, 1, 7.75]], 1], [None, 17.25, []]], ['normal control 3', [[['C', 105, 1, 3.4]], 100], [None, -340.0, [108.4]]]]]\nfor label, args, expected in fixtures[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":"a49abd99191f80e84ea6ae72c64f3efc3dbaaeef2307a644bcf6c5784e59d9a3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(legs, multiplier):\n    def value(S):\n        t = Fraction(0)\n        for kind, k, q, prem in legs:\n            p = Fraction(str(prem))\n            if kind == 'C':\n                t += q * (max(S - k, 0) - p)\n            elif kind == 'P':\n                t += q * (max(k - S, 0) - p)\n            else:\n                t += q * (S - k)\n        return t * multiplier\n    pts = sorted(set([0] + [leg[1] for leg in legs]))\n    top = pts[-1]\n    slope = value(top + 1) - value(top)\n    vals = [value(p) for p in pts]\n    gain = None if slope > 0 else max(vals)\n    loss = None if slope < 0 else min(vals)\n    bes = []\n    for a, b in zip(pts, pts[1:]):\n        va, vb = value(a), value(b)\n        if va == 0:\n            bes.append(Fraction(a))\n        elif va * vb < 0:\n            bes.append(a + va * (b - a) / (vb - va))\n    vt = value(top)\n    if vt == 0:\n        bes.append(Fraction(top))\n    elif vt * slope < 0:\n        bes.append(top - vt / slope)\n    def r4(x):\n        return None if x is None else float(round(x, 4))\n    return [r4(gain), r4(loss), [r4(x) for x in sorted(set(bes))]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression breakeven interpolation 1', [[['C', 100, -1, 2.0], ['C', 80, 1, 1.25], ['C', 95, 2, 5.1], ['C', 115, 1, 1.25]], 100], [None, -1070.0, [90.7]]], ['regression breakeven interpolation 2', [[['P', 95, -1, 7.75]], 100], [775.0, -8725.0, [87.25]]], ['partial repair probe 1', [[['C', 115, -1, 3.4], ['C', 95, 2, 3.4], ['C', 105, -1, 1.25]], 100], [2785.0, -215.0, [96.075]]], ['partial repair probe 2', [[['P', 85, -1, 2.0]], 100], [200.0, -8300.0, [83.0]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['S', 105, -1, 0.0], ['C', 110, 1, 0.5], ['C', 80, 2, 3.4]], 1], [None, 17.7, []]], ['normal control 2', [[['P', 100, 2, 0.5], ['C', 105, 2, 0.5], ['S', 90, 1, 0.0]], 1], [None, 8.0, []]], ['normal control 3', [[['C', 85, -1, 1.25]], 1], [1.25, None, [86.25]]]], [['regression breakeven interpolation 1', [[['S', 120, -1, 0.0], ['S', 90, 2, 0.0]], 100], [None, -6000.0, [60.0]]], ['regression breakeven interpolation 2', [[['C', 85, -1, 3.4], ['C', 80, -1, 1.25]], 1], [4.65, None, [84.65]]], ['partial repair probe 1', [[['S', 100, 2, 0.0], ['S', 120, 1, 0.0], ['P', 100, -2, 5.1]], 100], [None, -50980.0, [103.2667]]], ['partial repair probe 2', [[['C', 115, -2, 7.75], ['P', 105, -1, 2.0]], 1], [17.5, None, [87.5, 123.75]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['C', 100, -2, 3.4], ['C', 105, 2, 3.4]], 1], [0.0, -10.0, [0.0, 100.0]]], ['normal control 2', [[['S', 95, -1, 0.0], ['C', 105, 2, 2.0], ['S', 110, 1, 0.0]], 1], [None, -19.0, [114.5]]], ['normal control 3', [[['C', 95, 1, 7.75], ['P', 120, 1, 5.1], ['C', 110, 1, 7.75]], 1], [None, 4.4, []]]], [['regression breakeven interpolation 1', [[['P', 110, -1, 5.1], ['P', 95, 1, 1.25]], 100], [385.0, -1115.0, [106.15]]], ['regression breakeven interpolation 2', [[['S', 115, 1, 0.0], ['P', 120, 1, 0.5], ['C', 110, 2, 3.4]], 1], [None, -2.3, [111.15]]], ['partial repair probe 1', [[['C', 110, -2, 5.1], ['P', 80, -1, 3.4]], 1], [13.6, None, [66.4, 116.8]]], ['partial repair probe 2', [[['C', 90, -1, 0.5], ['P', 90, -2, 5.1]], 1], [10.7, None, [84.65, 100.7]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['C', 90, -2, 3.4]], 1], [6.8, None, [93.4]]], ['normal control 2', [[['C', 105, -1, 0.5]], 100], [50.0, None, [105.5]]], ['normal control 3', [[['P', 115, -1, 3.4], ['C', 110, 2, 5.1], ['S', 115, -1, 0.0], ['C', 95, -2, 2.0]], 100], [-280.0, None, []]]], [['regression breakeven interpolation 1', [[['C', 120, -1, 7.75], ['S', 80, -2, 0.0], ['C', 95, -1, 1.25]], 1], [169.0, None, [84.5]]], ['regression breakeven interpolation 2', [[['P', 110, -2, 2.0]], 100], [400.0, -21600.0, [108.0]]], ['partial repair probe 1', [[['P', 110, 1, 1.25]], 100], [10875.0, -125.0, [108.75]]], ['partial repair probe 2', [[['P', 110, -1, 3.4]], 100], [340.0, -10660.0, [106.6]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['C', 105, 1, 7.75]], 100], [None, -775.0, [112.75]]], ['normal control 2', [[['C', 80, 1, 5.1], ['S', 85, 1, 0.0]], 1], [None, -90.1, [85.05]]], ['normal control 3', [[['C', 85, 2, 0.5]], 100], [None, -100.0, [85.5]]]], [['regression breakeven interpolation 1', [[['P', 80, -1, 7.75]], 1], [7.75, -72.25, [72.25]]], ['regression breakeven interpolation 2', [[['C', 90, 1, 7.75], ['P', 105, -2, 1.25]], 1], [None, -215.25, [101.75]]], ['partial repair probe 1', [[['P', 120, -2, 7.75], ['P', 105, 1, 1.25], ['P', 100, 2, 1.25], ['C', 115, 2, 0.5]], 1], [None, -24.25, [75.75, 114.625]]], ['partial repair probe 2', [[['C', 85, 2, 1.25], ['P', 100, -2, 5.1], ['P', 100, 1, 2.0]], 1], [None, -94.3, [88.1]]], ['boundary control 1', [[['C', 100, 1, 2.0]], 100], [None, -200.0, [102.0]]], ['normal control 1', [[['S', 100, 1, 0.0], ['C', 105, -2, 2.0], ['P', 105, 1, 2.0], ['C', 95, 2, 1.25]], 1], [None, 4.5, []]], ['normal control 2', [[['S', 90, 1, 0.0], ['P', 115, 1, 7.75]], 1], [None, 17.25, []]], ['normal control 3', [[['C', 105, 1, 3.4]], 100], [None, -340.0, [108.4]]]]]\nfor label, args, expected in fixtures[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 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-options_payoff_and_settlement-strategy-risk-profile-breakeven-interpolation","generated_at":"2026-09-29T14:46:55.754914+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Option expiry, exercise and settlement engines move cash and shares; a wrong branch misstates obligations.","root_cause":"The interpolation adds va*(b-a)/(vb-va) instead of subtracting it.","sha256":"b320d1461a444573b548f5483af78ea2ee1885d506e6639bf459c0fe6962e153","title":"Option strategy max gain, max loss and breakevens: interpolated breakevens use the wrong sign · 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.746,"exit_code":1,"observations":[{"actual":[null,-1070.0,[87.5]],"check":"regression breakeven interpolation 1","expected":[null,-1070.0,[90.7]],"passed":false},{"actual":[775.0,-8725.0,[47.5]],"check":"regression breakeven interpolation 2","expected":[775.0,-8725.0,[87.25]],"passed":false},{"actual":[2785.0,-215.0,[100.0]],"check":"partial repair probe 1","expected":[2785.0,-215.0,[96.075]],"passed":false},{"actual":[200.0,-8300.0,[42.5]],"check":"partial repair probe 2","expected":[200.0,-8300.0,[83.0]],"passed":false},{"actual":[null,-200.0,[102.0]],"check":"boundary control 1","expected":[null,-200.0,[102.0]],"passed":true},{"actual":[null,17.7,[]],"check":"normal control 1","expected":[null,17.7,[]],"passed":true},{"actual":[null,8.0,[]],"check":"normal control 2","expected":[null,8.0,[]],"passed":true},{"actual":[1.25,null,[86.25]],"check":"normal control 3","expected":[1.25,null,[86.25]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression breakeven interpolation 1\", \"actual\": [null, -1070.0, [87.5]], \"expected\": [null, -1070.0, [90.7]], \"passed\": false}, {\"check\": \"regression breakeven interpolation 2\", \"actual\": [775.0, -8725.0, [47.5]], \"expected\": [775.0, -8725.0, [87.25]], \"passed\": false}, {\"check\": \"partial repair probe 1\", \"actual\": [2785.0, -215.0, [100.0]], \"expected\": [2785.0, -215.0, [96.075]], \"passed\": false}, {\"check\": \"partial repair probe 2\", \"actual\": [200.0, -8300.0, [42.5]], \"expected\": [200.0, -8300.0, [83.0]], \"passed\": false}, {\"check\": \"boundary control 1\", \"actual\": [null, -200.0, [102.0]], \"expected\": [null, -200.0, [102.0]], \"passed\": true}, {\"check\": \"normal control 1\", \"actual\": [null, 17.7, []], \"expected\": [null, 17.7, []], \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": [null, 8.0, []], \"expected\": [null, 8.0, []], \"passed\": true}, {\"check\": \"normal control 3\", \"actual\": [1.25, null, [86.25]], \"expected\": [1.25, null, [86.25]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.613,"exit_code":1,"observations":[{"actual":[null,-1070.0,[69.3]],"check":"regression breakeven interpolation 1","expected":[null,-1070.0,[90.7]],"passed":false},{"actual":[775.0,-8725.0,[-87.25]],"check":"regression breakeven interpolation 2","expected":[775.0,-8725.0,[87.25]],"passed":false},{"actual":[2785.0,-215.0,[93.925]],"check":"partial repair probe 1","expected":[2785.0,-215.0,[96.075]],"passed":false},{"actual":[200.0,-8300.0,[-83.0]],"check":"partial repair probe 2","expected":[200.0,-8300.0,[83.0]],"passed":false},{"actual":[null,-200.0,[102.0]],"check":"boundary control 1","expected":[null,-200.0,[102.0]],"passed":true},{"actual":[null,17.7,[]],"check":"normal control 1","expected":[null,17.7,[]],"passed":true},{"actual":[null,8.0,[]],"check":"normal control 2","expected":[null,8.0,[]],"passed":true},{"actual":[1.25,null,[86.25]],"check":"normal control 3","expected":[1.25,null,[86.25]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression breakeven interpolation 1\", \"actual\": [null, -1070.0, [69.3]], \"expected\": [null, -1070.0, [90.7]], \"passed\": false}, {\"check\": \"regression breakeven interpolation 2\", \"actual\": [775.0, -8725.0, [-87.25]], \"expected\": [775.0, -8725.0, [87.25]], \"passed\": false}, {\"check\": \"partial repair probe 1\", \"actual\": [2785.0, -215.0, [93.925]], \"expected\": [2785.0, -215.0, [96.075]], \"passed\": false}, {\"check\": \"partial repair probe 2\", \"actual\": [200.0, -8300.0, [-83.0]], \"expected\": [200.0, -8300.0, [83.0]], \"passed\": false}, {\"check\": \"boundary control 1\", \"actual\": [null, -200.0, [102.0]], \"expected\": [null, -200.0, [102.0]], \"passed\": true}, {\"check\": \"normal control 1\", \"actual\": [null, 17.7, []], \"expected\": [null, 17.7, []], \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": [null, 8.0, []], \"expected\": [null, 8.0, []], \"passed\": true}, {\"check\": \"normal control 3\", \"actual\": [1.25, null, [86.25]], \"expected\": [1.25, null, [86.25]], \"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."}}