{"abstract":"Term-percent premiums ignore the spot conversion of the notional.","category":"Options payoff and settlement","checks":8,"contract":"Inputs quote, quote type, base notional, spot and pip size. pips: term premium = quote*pip*notional, base = term/spot. pct_base: base = quote/100*notional, term = base*spot. pct_term: term = quote/100*notional*spot, base = term/spot. Exact fractions; return [term, base] rounded to 2 as floats.","contract_signature":"quote, quote_type, notional, spot, pip","evaluation_group":"w2-options_payoff_and_settlement-fx-premium-conversion","failed_approach":"Dividing the notional by spot converts in the wrong direction.","family":"w2-options_payoff_and_settlement-fx-premium-conversion-percent-of-term-notional","id":"FA-61721","implementations":{"attempt":{"sha256":"c2dd60dc8de31a3035d6257987d24bfe0ce26dbbbe4b84faa09ec622df75995e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(quote, quote_type, notional, spot, pip):\n    q = Fraction(str(quote))\n    s = Fraction(str(spot))\n    N = Fraction(notional)\n    pp = Fraction(str(pip))\n    if quote_type == 'pips':\n        term = q * pp * N\n        base = term / s\n    elif quote_type == 'pct_base':\n        base = q / 100 * N\n        term = base * s\n    else:\n        term = q / 100 * N / s\n        base = term / s\n    return [float(round(term, 2)), float(round(base, 2))]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression percent of term notional 1', [0.85, 'pct_term', 250000, 1.2712, 0.0001], [2701.3, 2125.0]], ['regression percent of term notional 2', [1.25, 'pct_term', 250000, 149.35, 0.01], [466718.75, 3125.0]], ['partial repair probe 1', [12.5, 'pct_term', 250000, 1.0845, 0.0001], [33890.62, 31250.0]], ['partial repair probe 2', [45.0, 'pct_term', 1000000, 1.0845, 0.0001], [488025.0, 450000.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [12.5, 'pct_base', 1000000, 149.35, 0.01], [18668750.0, 125000.0]], ['normal control 2', [110.0, 'pips', 1000000, 1.2712, 0.0001], [11000.0, 8653.24]], ['normal control 3', [12.5, 'pips', 5000000, 149.35, 0.01], [625000.0, 4184.8]]], [['regression percent of term notional 1', [12.5, 'pct_term', 5000000, 149.35, 0.01], [93343750.0, 625000.0]], ['regression percent of term notional 2', [0.85, 'pct_term', 1000000, 1.2712, 0.0001], [10805.2, 8500.0]], ['partial repair probe 1', [1.25, 'pct_term', 5000000, 1.2712, 0.0001], [79450.0, 62500.0]], ['partial repair probe 2', [110.0, 'pct_term', 250000, 149.35, 0.01], [41071250.0, 275000.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [110.0, 'pct_base', 1000000, 1.2712, 0.0001], [1398320.0, 1100000.0]], ['normal control 2', [110.0, 'pct_base', 5000000, 1.2712, 0.0001], [6991600.0, 5500000.0]], ['normal control 3', [45.0, 'pips', 250000, 149.35, 0.01], [112500.0, 753.26]]], [['regression percent of term notional 1', [1.25, 'pct_term', 1000000, 1.0845, 0.0001], [13556.25, 12500.0]], ['regression percent of term notional 2', [0.85, 'pct_term', 1000000, 149.35, 0.01], [1269475.0, 8500.0]], ['partial repair probe 1', [45.0, 'pct_term', 1000000, 1.2712, 0.0001], [572040.0, 450000.0]], ['partial repair probe 2', [45.0, 'pct_term', 250000, 1.0845, 0.0001], [122006.25, 112500.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [12.5, 'pct_base', 1000000, 1.0845, 0.0001], [135562.5, 125000.0]], ['normal control 2', [110.0, 'pct_base', 250000, 1.0845, 0.0001], [298237.5, 275000.0]], ['normal control 3', [1.25, 'pips', 250000, 1.0845, 0.0001], [31.25, 28.82]]], [['regression percent of term notional 1', [45.0, 'pct_term', 250000, 149.35, 0.01], [16801875.0, 112500.0]], ['regression percent of term notional 2', [110.0, 'pct_term', 1000000, 1.0845, 0.0001], [1192950.0, 1100000.0]], ['partial repair probe 1', [45.0, 'pct_term', 5000000, 149.35, 0.01], [336037500.0, 2250000.0]], ['partial repair probe 2', [45.0, 'pct_term', 250000, 1.2712, 0.0001], [143010.0, 112500.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [45.0, 'pips', 250000, 1.2712, 0.0001], [1125.0, 884.99]], ['normal control 2', [1.25, 'pct_base', 250000, 1.0845, 0.0001], [3389.06, 3125.0]], ['normal control 3', [1.25, 'pct_base', 250000, 1.2712, 0.0001], [3972.5, 3125.0]]], [['regression percent of term notional 1', [45.0, 'pct_term', 1000000, 149.35, 0.01], [67207500.0, 450000.0]], ['regression percent of term notional 2', [1.25, 'pct_term', 250000, 149.35, 0.01], [466718.75, 3125.0]], ['partial repair probe 1', [1.25, 'pct_term', 250000, 1.2712, 0.0001], [3972.5, 3125.0]], ['partial repair probe 2', [12.5, 'pct_term', 1000000, 1.0845, 0.0001], [135562.5, 125000.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [0.85, 'pips', 5000000, 1.2712, 0.0001], [425.0, 334.33]], ['normal control 2', [1.25, 'pct_base', 5000000, 1.2712, 0.0001], [79450.0, 62500.0]], ['normal control 3', [110.0, 'pct_base', 1000000, 149.35, 0.01], [164285000.0, 1100000.0]]]]\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":"c3da58ae77cf9f7b8f4932abc7de6a74c5a93e48c7eb6b6a576c9bc63d05fb13","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(quote, quote_type, notional, spot, pip):\n    q = Fraction(str(quote))\n    s = Fraction(str(spot))\n    N = Fraction(notional)\n    pp = Fraction(str(pip))\n    if quote_type == 'pips':\n        term = q * pp * N\n        base = term / s\n    elif quote_type == 'pct_base':\n        base = q / 100 * N\n        term = base * s\n    else:\n        term = q / 100 * N\n        base = term / s\n    return [float(round(term, 2)), float(round(base, 2))]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression percent of term notional 1', [0.85, 'pct_term', 250000, 1.2712, 0.0001], [2701.3, 2125.0]], ['regression percent of term notional 2', [1.25, 'pct_term', 250000, 149.35, 0.01], [466718.75, 3125.0]], ['partial repair probe 1', [12.5, 'pct_term', 250000, 1.0845, 0.0001], [33890.62, 31250.0]], ['partial repair probe 2', [45.0, 'pct_term', 1000000, 1.0845, 0.0001], [488025.0, 450000.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [12.5, 'pct_base', 1000000, 149.35, 0.01], [18668750.0, 125000.0]], ['normal control 2', [110.0, 'pips', 1000000, 1.2712, 0.0001], [11000.0, 8653.24]], ['normal control 3', [12.5, 'pips', 5000000, 149.35, 0.01], [625000.0, 4184.8]]], [['regression percent of term notional 1', [12.5, 'pct_term', 5000000, 149.35, 0.01], [93343750.0, 625000.0]], ['regression percent of term notional 2', [0.85, 'pct_term', 1000000, 1.2712, 0.0001], [10805.2, 8500.0]], ['partial repair probe 1', [1.25, 'pct_term', 5000000, 1.2712, 0.0001], [79450.0, 62500.0]], ['partial repair probe 2', [110.0, 'pct_term', 250000, 149.35, 0.01], [41071250.0, 275000.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [110.0, 'pct_base', 1000000, 1.2712, 0.0001], [1398320.0, 1100000.0]], ['normal control 2', [110.0, 'pct_base', 5000000, 1.2712, 0.0001], [6991600.0, 5500000.0]], ['normal control 3', [45.0, 'pips', 250000, 149.35, 0.01], [112500.0, 753.26]]], [['regression percent of term notional 1', [1.25, 'pct_term', 1000000, 1.0845, 0.0001], [13556.25, 12500.0]], ['regression percent of term notional 2', [0.85, 'pct_term', 1000000, 149.35, 0.01], [1269475.0, 8500.0]], ['partial repair probe 1', [45.0, 'pct_term', 1000000, 1.2712, 0.0001], [572040.0, 450000.0]], ['partial repair probe 2', [45.0, 'pct_term', 250000, 1.0845, 0.0001], [122006.25, 112500.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [12.5, 'pct_base', 1000000, 1.0845, 0.0001], [135562.5, 125000.0]], ['normal control 2', [110.0, 'pct_base', 250000, 1.0845, 0.0001], [298237.5, 275000.0]], ['normal control 3', [1.25, 'pips', 250000, 1.0845, 0.0001], [31.25, 28.82]]], [['regression percent of term notional 1', [45.0, 'pct_term', 250000, 149.35, 0.01], [16801875.0, 112500.0]], ['regression percent of term notional 2', [110.0, 'pct_term', 1000000, 1.0845, 0.0001], [1192950.0, 1100000.0]], ['partial repair probe 1', [45.0, 'pct_term', 5000000, 149.35, 0.01], [336037500.0, 2250000.0]], ['partial repair probe 2', [45.0, 'pct_term', 250000, 1.2712, 0.0001], [143010.0, 112500.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [45.0, 'pips', 250000, 1.2712, 0.0001], [1125.0, 884.99]], ['normal control 2', [1.25, 'pct_base', 250000, 1.0845, 0.0001], [3389.06, 3125.0]], ['normal control 3', [1.25, 'pct_base', 250000, 1.2712, 0.0001], [3972.5, 3125.0]]], [['regression percent of term notional 1', [45.0, 'pct_term', 1000000, 149.35, 0.01], [67207500.0, 450000.0]], ['regression percent of term notional 2', [1.25, 'pct_term', 250000, 149.35, 0.01], [466718.75, 3125.0]], ['partial repair probe 1', [1.25, 'pct_term', 250000, 1.2712, 0.0001], [3972.5, 3125.0]], ['partial repair probe 2', [12.5, 'pct_term', 1000000, 1.0845, 0.0001], [135562.5, 125000.0]], ['boundary control 1', [10.0, 'pips', 1000000, 1.1, 0.0001], [1000.0, 909.09]], ['normal control 1', [0.85, 'pips', 5000000, 1.2712, 0.0001], [425.0, 334.33]], ['normal control 2', [1.25, 'pct_base', 5000000, 1.2712, 0.0001], [79450.0, 62500.0]], ['normal control 3', [110.0, 'pct_base', 1000000, 149.35, 0.01], [164285000.0, 1100000.0]]]]\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-fx-premium-conversion-percent-of-term-notional","generated_at":"2026-09-29T14:46:57.898007+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 pct_term branch omits the spot factor.","sha256":"d64f95b33000a34362debd931bc8b886c1b5a03ca60e3a578e527abb36c1d604","title":"FX option premium quote conversion: term-percentage premiums use the base notional · 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":45.434,"exit_code":1,"observations":[{"actual":[1671.65,1315.02],"check":"regression percent of term notional 1","expected":[2701.3,2125.0],"passed":false},{"actual":[20.92,0.14],"check":"regression percent of term notional 2","expected":[466718.75,3125.0],"passed":false},{"actual":[28815.12,26569.96],"check":"partial repair probe 1","expected":[33890.62,31250.0],"passed":false},{"actual":[414937.76,382607.43],"check":"partial repair probe 2","expected":[488025.0,450000.0],"passed":false},{"actual":[1000.0,909.09],"check":"boundary control 1","expected":[1000.0,909.09],"passed":true},{"actual":[18668750.0,125000.0],"check":"normal control 1","expected":[18668750.0,125000.0],"passed":true},{"actual":[11000.0,8653.24],"check":"normal control 2","expected":[11000.0,8653.24],"passed":true},{"actual":[625000.0,4184.8],"check":"normal control 3","expected":[625000.0,4184.8],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression percent of term notional 1\", \"actual\": [1671.65, 1315.02], \"expected\": [2701.3, 2125.0], \"passed\": false}, {\"check\": \"regression percent of term notional 2\", \"actual\": [20.92, 0.14], \"expected\": [466718.75, 3125.0], \"passed\": false}, {\"check\": \"partial repair probe 1\", \"actual\": [28815.12, 26569.96], \"expected\": [33890.62, 31250.0], \"passed\": false}, {\"check\": \"partial repair probe 2\", \"actual\": [414937.76, 382607.43], \"expected\": [488025.0, 450000.0], \"passed\": false}, {\"check\": \"boundary control 1\", \"actual\": [1000.0, 909.09], \"expected\": [1000.0, 909.09], \"passed\": true}, {\"check\": \"normal control 1\", \"actual\": [18668750.0, 125000.0], \"expected\": [18668750.0, 125000.0], \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": [11000.0, 8653.24], \"expected\": [11000.0, 8653.24], \"passed\": true}, {\"check\": \"normal control 3\", \"actual\": [625000.0, 4184.8], \"expected\": [625000.0, 4184.8], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.796,"exit_code":1,"observations":[{"actual":[2125.0,1671.65],"check":"regression percent of term notional 1","expected":[2701.3,2125.0],"passed":false},{"actual":[3125.0,20.92],"check":"regression percent of term notional 2","expected":[466718.75,3125.0],"passed":false},{"actual":[31250.0,28815.12],"check":"partial repair probe 1","expected":[33890.62,31250.0],"passed":false},{"actual":[450000.0,414937.76],"check":"partial repair probe 2","expected":[488025.0,450000.0],"passed":false},{"actual":[1000.0,909.09],"check":"boundary control 1","expected":[1000.0,909.09],"passed":true},{"actual":[18668750.0,125000.0],"check":"normal control 1","expected":[18668750.0,125000.0],"passed":true},{"actual":[11000.0,8653.24],"check":"normal control 2","expected":[11000.0,8653.24],"passed":true},{"actual":[625000.0,4184.8],"check":"normal control 3","expected":[625000.0,4184.8],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression percent of term notional 1\", \"actual\": [2125.0, 1671.65], \"expected\": [2701.3, 2125.0], \"passed\": false}, {\"check\": \"regression percent of term notional 2\", \"actual\": [3125.0, 20.92], \"expected\": [466718.75, 3125.0], \"passed\": false}, {\"check\": \"partial repair probe 1\", \"actual\": [31250.0, 28815.12], \"expected\": [33890.62, 31250.0], \"passed\": false}, {\"check\": \"partial repair probe 2\", \"actual\": [450000.0, 414937.76], \"expected\": [488025.0, 450000.0], \"passed\": false}, {\"check\": \"boundary control 1\", \"actual\": [1000.0, 909.09], \"expected\": [1000.0, 909.09], \"passed\": true}, {\"check\": \"normal control 1\", \"actual\": [18668750.0, 125000.0], \"expected\": [18668750.0, 125000.0], \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": [11000.0, 8653.24], \"expected\": [11000.0, 8653.24], \"passed\": true}, {\"check\": \"normal control 3\", \"actual\": [625000.0, 4184.8], \"expected\": [625000.0, 4184.8], \"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."}}