{"abstract":"American puts lose their early exercise premium.","category":"Options payoff and settlement","checks":8,"contract":"Inputs kind, spot S, strike K, rate r, volatility sigma, maturity T in years and steps. dt=T/steps, u=exp(sigma*sqrt(dt)), d=1/u, p=(exp(r*dt)-d)/(u-d), disc=exp(-r*dt). Roll back from terminal payoffs; at each node take max(continuation, immediate exercise at that node's price). Return the root rounded to 6.","contract_signature":"kind, S, K, r, sigma, T, steps","evaluation_group":"w2-options_payoff_and_settlement-crr-american","failed_approach":"Evaluating the payoff at the terminal node price for that index uses the wrong price level.","family":"w2-options_payoff_and_settlement-crr-american-early-exercise-value","id":"FA-61516","implementations":{"attempt":{"sha256":"03321b612329d2787280bffebc29fe4dae2780a6d4603fad59a5623c57f5df30","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(kind, S, K, r, sigma, T, steps):\n    dt = T / steps\n    u = math.exp(sigma * math.sqrt(dt))\n    d = 1 / u\n    p = (math.exp(r * dt) - d) / (u - d)\n    disc = math.exp(-r * dt)\n    def pay(s):\n        return max(s - K, 0.0) if kind == 'C' else max(K - s, 0.0)\n    vals = [pay(S * u ** j * d ** (steps - j)) for j in range(steps + 1)]\n    for i in range(steps - 1, -1, -1):\n        vals = [max(disc * (p * vals[j + 1] + (1 - p) * vals[j]), pay(S * u ** j * d ** (steps - j))) for j in range(i + 1)]\n    return round(vals[0], 6)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression early exercise value 1', ['P', 80.0, 105.0, 0.05, 0.25, 2.0, 5], 25.210167], ['regression early exercise value 2', ['P', 100.0, 100.0, 0.0, 0.4, 2.0, 5], 23.343597], ['partial repair probe 1', ['P', 80.0, 105.0, 0.0, 0.25, 0.5, 3], 25.390902], ['normal control 1', ['C', 110.0, 100.0, 0.08, 0.4, 1.0, 3], 27.248875], ['normal control 2', ['C', 110.0, 90.0, 0.05, 0.25, 0.25, 12], 21.337289], ['normal control 3', ['C', 110.0, 105.0, 0.08, 0.25, 0.25, 5], 9.501783], ['normal control 4', ['C', 95.0, 105.0, 0.0, 0.25, 0.25, 3], 1.45145], ['normal control 5', ['C', 100.0, 90.0, 0.01, 0.15, 0.25, 25], 10.448278]], [['regression early exercise value 1', ['P', 100.0, 105.0, 0.08, 0.4, 1.0, 12], 15.430377], ['regression early exercise value 2', ['P', 80.0, 90.0, 0.08, 0.25, 0.5, 5], 10.841628], ['partial repair probe 1', ['P', 80.0, 105.0, 0.0, 0.15, 2.0, 3], 26.088253], ['partial repair probe 2', ['P', 80.0, 100.0, 0.0, 0.15, 2.0, 3], 21.605448], ['normal control 1', ['C', 95.0, 105.0, 0.0, 0.15, 1.0, 5], 2.309033], ['normal control 2', ['C', 95.0, 105.0, 0.01, 0.25, 2.0, 3], 10.862909], ['normal control 3', ['C', 80.0, 100.0, 0.01, 0.4, 1.0, 25], 6.577995], ['normal control 4', ['C', 80.0, 90.0, 0.0, 0.25, 2.0, 25], 7.653711]], [['regression early exercise value 1', ['P', 110.0, 105.0, 0.0, 0.25, 0.25, 12], 3.309833], ['regression early exercise value 2', ['P', 95.0, 100.0, 0.01, 0.25, 1.0, 25], 11.824535], ['partial repair probe 1', ['P', 80.0, 105.0, 0.0, 0.25, 0.5, 3], 25.390902], ['partial repair probe 2', ['P', 80.0, 100.0, 0.0, 0.25, 0.5, 3], 20.925093], ['normal control 1', ['C', 80.0, 90.0, 0.0, 0.25, 0.5, 3], 1.993475], ['normal control 2', ['C', 95.0, 100.0, 0.01, 0.15, 0.25, 5], 1.165015], ['normal control 3', ['C', 80.0, 100.0, 0.08, 0.15, 1.0, 3], 0.879347], ['normal control 4', ['C', 110.0, 105.0, 0.05, 0.15, 0.5, 5], 9.10462]], [['regression early exercise value 1', ['P', 95.0, 105.0, 0.05, 0.4, 0.25, 25], 13.262218], ['regression early exercise value 2', ['P', 95.0, 100.0, 0.08, 0.15, 0.25, 5], 5.303147], ['partial repair probe 1', ['P', 80.0, 100.0, 0.0, 0.15, 0.5, 5], 20.039153], ['normal control 1', ['C', 110.0, 90.0, 0.0, 0.4, 0.25, 3], 21.805173], ['normal control 2', ['C', 100.0, 90.0, 0.0, 0.15, 2.0, 3], 13.704549], ['normal control 3', ['C', 100.0, 100.0, 0.08, 0.4, 1.0, 25], 19.526386], ['normal control 4', ['C', 80.0, 90.0, 0.0, 0.15, 0.5, 25], 0.605969], ['normal control 5', ['C', 80.0, 105.0, 0.01, 0.4, 0.25, 12], 0.754375]], [['regression early exercise value 1', ['P', 110.0, 100.0, 0.08, 0.25, 0.5, 3], 2.270558], ['regression early exercise value 2', ['P', 110.0, 90.0, 0.08, 0.4, 2.0, 5], 8.982113], ['partial repair probe 1', ['P', 80.0, 105.0, 0.0, 0.15, 2.0, 3], 26.088253], ['partial repair probe 2', ['P', 80.0, 105.0, 0.0, 0.15, 0.5, 3], 25.0], ['normal control 1', ['C', 80.0, 105.0, 0.05, 0.4, 0.25, 12], 0.832557], ['normal control 2', ['C', 100.0, 100.0, 0.0, 0.4, 2.0, 12], 21.811807], ['normal control 3', ['C', 95.0, 100.0, 0.08, 0.15, 0.5, 3], 3.266989], ['normal control 4', ['C', 80.0, 90.0, 0.05, 0.25, 0.5, 25], 2.803238]]]\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":"cc02ac68543d3167a2f477f30f584e1f1eff78eb7af00542514b575883d8355d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(kind, S, K, r, sigma, T, steps):\n    dt = T / steps\n    u = math.exp(sigma * math.sqrt(dt))\n    d = 1 / u\n    p = (math.exp(r * dt) - d) / (u - d)\n    disc = math.exp(-r * dt)\n    def pay(s):\n        return max(s - K, 0.0) if kind == 'C' else max(K - s, 0.0)\n    vals = [pay(S * u ** j * d ** (steps - j)) for j in range(steps + 1)]\n    for i in range(steps - 1, -1, -1):\n        vals = [max(disc * (p * vals[j + 1] + (1 - p) * vals[j]), max(S * u ** j * d ** (i - j) - K, 0.0)) for j in range(i + 1)]\n    return round(vals[0], 6)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression early exercise value 1', ['P', 80.0, 105.0, 0.05, 0.25, 2.0, 5], 25.210167], ['regression early exercise value 2', ['P', 100.0, 100.0, 0.0, 0.4, 2.0, 5], 23.343597], ['partial repair probe 1', ['P', 80.0, 105.0, 0.0, 0.25, 0.5, 3], 25.390902], ['normal control 1', ['C', 110.0, 100.0, 0.08, 0.4, 1.0, 3], 27.248875], ['normal control 2', ['C', 110.0, 90.0, 0.05, 0.25, 0.25, 12], 21.337289], ['normal control 3', ['C', 110.0, 105.0, 0.08, 0.25, 0.25, 5], 9.501783], ['normal control 4', ['C', 95.0, 105.0, 0.0, 0.25, 0.25, 3], 1.45145], ['normal control 5', ['C', 100.0, 90.0, 0.01, 0.15, 0.25, 25], 10.448278]], [['regression early exercise value 1', ['P', 100.0, 105.0, 0.08, 0.4, 1.0, 12], 15.430377], ['regression early exercise value 2', ['P', 80.0, 90.0, 0.08, 0.25, 0.5, 5], 10.841628], ['partial repair probe 1', ['P', 80.0, 105.0, 0.0, 0.15, 2.0, 3], 26.088253], ['partial repair probe 2', ['P', 80.0, 100.0, 0.0, 0.15, 2.0, 3], 21.605448], ['normal control 1', ['C', 95.0, 105.0, 0.0, 0.15, 1.0, 5], 2.309033], ['normal control 2', ['C', 95.0, 105.0, 0.01, 0.25, 2.0, 3], 10.862909], ['normal control 3', ['C', 80.0, 100.0, 0.01, 0.4, 1.0, 25], 6.577995], ['normal control 4', ['C', 80.0, 90.0, 0.0, 0.25, 2.0, 25], 7.653711]], [['regression early exercise value 1', ['P', 110.0, 105.0, 0.0, 0.25, 0.25, 12], 3.309833], ['regression early exercise value 2', ['P', 95.0, 100.0, 0.01, 0.25, 1.0, 25], 11.824535], ['partial repair probe 1', ['P', 80.0, 105.0, 0.0, 0.25, 0.5, 3], 25.390902], ['partial repair probe 2', ['P', 80.0, 100.0, 0.0, 0.25, 0.5, 3], 20.925093], ['normal control 1', ['C', 80.0, 90.0, 0.0, 0.25, 0.5, 3], 1.993475], ['normal control 2', ['C', 95.0, 100.0, 0.01, 0.15, 0.25, 5], 1.165015], ['normal control 3', ['C', 80.0, 100.0, 0.08, 0.15, 1.0, 3], 0.879347], ['normal control 4', ['C', 110.0, 105.0, 0.05, 0.15, 0.5, 5], 9.10462]], [['regression early exercise value 1', ['P', 95.0, 105.0, 0.05, 0.4, 0.25, 25], 13.262218], ['regression early exercise value 2', ['P', 95.0, 100.0, 0.08, 0.15, 0.25, 5], 5.303147], ['partial repair probe 1', ['P', 80.0, 100.0, 0.0, 0.15, 0.5, 5], 20.039153], ['normal control 1', ['C', 110.0, 90.0, 0.0, 0.4, 0.25, 3], 21.805173], ['normal control 2', ['C', 100.0, 90.0, 0.0, 0.15, 2.0, 3], 13.704549], ['normal control 3', ['C', 100.0, 100.0, 0.08, 0.4, 1.0, 25], 19.526386], ['normal control 4', ['C', 80.0, 90.0, 0.0, 0.15, 0.5, 25], 0.605969], ['normal control 5', ['C', 80.0, 105.0, 0.01, 0.4, 0.25, 12], 0.754375]], [['regression early exercise value 1', ['P', 110.0, 100.0, 0.08, 0.25, 0.5, 3], 2.270558], ['regression early exercise value 2', ['P', 110.0, 90.0, 0.08, 0.4, 2.0, 5], 8.982113], ['partial repair probe 1', ['P', 80.0, 105.0, 0.0, 0.15, 2.0, 3], 26.088253], ['partial repair probe 2', ['P', 80.0, 105.0, 0.0, 0.15, 0.5, 3], 25.0], ['normal control 1', ['C', 80.0, 105.0, 0.05, 0.4, 0.25, 12], 0.832557], ['normal control 2', ['C', 100.0, 100.0, 0.0, 0.4, 2.0, 12], 21.811807], ['normal control 3', ['C', 95.0, 100.0, 0.08, 0.15, 0.5, 3], 3.266989], ['normal control 4', ['C', 80.0, 90.0, 0.05, 0.25, 0.5, 25], 2.803238]]]\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-crr-american-early-exercise-value","generated_at":"2026-09-29T14:46:56.047783+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 immediate exercise value always uses the call payoff.","sha256":"82a52483dfc1316b293e0ea1ca2e2109d6057c17d6afdc1919024ab189d8c1c0","title":"Cox-Ross-Rubinstein American option tree: the early-exercise test prices puts as calls · 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":41.748,"exit_code":1,"observations":[{"actual":68.713085,"check":"regression early exercise value 1","expected":25.210167,"passed":false},{"actual":71.77356,"check":"regression early exercise value 2","expected":23.343597,"passed":false},{"actual":46.10004,"check":"partial repair probe 1","expected":25.390902,"passed":false},{"actual":27.248875,"check":"normal control 1","expected":27.248875,"passed":true},{"actual":21.337289,"check":"normal control 2","expected":21.337289,"passed":true},{"actual":9.501783,"check":"normal control 3","expected":9.501783,"passed":true},{"actual":1.45145,"check":"normal control 4","expected":1.45145,"passed":true},{"actual":10.448278,"check":"normal control 5","expected":10.448278,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression early exercise value 1\", \"actual\": 68.713085, \"expected\": 25.210167, \"passed\": false}, {\"check\": \"regression early exercise value 2\", \"actual\": 71.77356, \"expected\": 23.343597, \"passed\": false}, {\"check\": \"partial repair probe 1\", \"actual\": 46.10004, \"expected\": 25.390902, \"passed\": false}, {\"check\": \"normal control 1\", \"actual\": 27.248875, \"expected\": 27.248875, \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": 21.337289, \"expected\": 21.337289, \"passed\": true}, {\"check\": \"normal control 3\", \"actual\": 9.501783, \"expected\": 9.501783, \"passed\": true}, {\"check\": \"normal control 4\", \"actual\": 1.45145, \"expected\": 1.45145, \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": 10.448278, \"expected\": 10.448278, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.722,"exit_code":1,"observations":[{"actual":24.567697,"check":"regression early exercise value 1","expected":25.210167,"passed":false},{"actual":42.117121,"check":"regression early exercise value 2","expected":23.343597,"passed":false},{"actual":25.390902,"check":"partial repair probe 1","expected":25.390902,"passed":true},{"actual":27.248875,"check":"normal control 1","expected":27.248875,"passed":true},{"actual":21.337289,"check":"normal control 2","expected":21.337289,"passed":true},{"actual":9.501783,"check":"normal control 3","expected":9.501783,"passed":true},{"actual":1.45145,"check":"normal control 4","expected":1.45145,"passed":true},{"actual":10.448278,"check":"normal control 5","expected":10.448278,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression early exercise value 1\", \"actual\": 24.567697, \"expected\": 25.210167, \"passed\": false}, {\"check\": \"regression early exercise value 2\", \"actual\": 42.117121, \"expected\": 23.343597, \"passed\": false}, {\"check\": \"partial repair probe 1\", \"actual\": 25.390902, \"expected\": 25.390902, \"passed\": true}, {\"check\": \"normal control 1\", \"actual\": 27.248875, \"expected\": 27.248875, \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": 21.337289, \"expected\": 21.337289, \"passed\": true}, {\"check\": \"normal control 3\", \"actual\": 9.501783, \"expected\": 9.501783, \"passed\": true}, {\"check\": \"normal control 4\", \"actual\": 1.45145, \"expected\": 1.45145, \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": 10.448278, \"expected\": 10.448278, \"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."}}