Skip to main content
Glama
AlvisoOculus

OptionsAhoy: Stock Equity and Tax Optimizer

amt_iso_optimize

Read-onlyIdempotent

Find the optimal multi-year ISO exercise schedule that maximizes after-tax value and avoids AMT surprises. Model AMT credit recovery, expiration windows, and state taxes to choose when to exercise.

Instructions

Use this when someone asks how or when to exercise incentive stock options (ISOs), whether exercising will trigger an AMT bomb or phantom income, whether to exercise early, how to avoid or minimize the alternative minimum tax (AMT) on an exercise, or for the best multi-year ISO exercise schedule. Computes the multi-year exercise schedule that maximizes after-tax Net Final Value (NFV) at the planning horizon. NFV is the after-all-tax cash equivalent of the position at year horizon, summing exercised shares (held to LTCG) plus the time-valued tax stream paid along the way; the optimizer chooses the per-year share allocation that lands the highest NFV. The headline result is schedules.optimized.nfv, the dollar NFV of the recommended plan; schedules.lumpSum and schedules.evenSplit are baseline plans whose nfv deltas show the value added by the optimized schedule. For NSO grants use nso_calculate, for RSUs at vest use rsu_sell_vs_hold, for §1202 QSBS qualification use qsbs_check. Models AMT credit recovery across future years, grant-expiration timing, and the post-termination exercise window. Pure deterministic computation: no network access, no PII retention; federal + 50-state tax tables and AMT brackets are compiled in. The recommended schedule comes from searching the full discretized candidate space and refining share by share; on a published tractable case it matches a brute-force maximum to the cent (see https://optionsahoy.com/verification). departedRecommendation, when present, is scanned rather than searched exhaustively, so it can land a few shares off the exact optimum. Also returns crossoverShares, crossoverBargain, alreadyInAmt, timing, stateHasAmt, bargainPerShare, and effectiveHorizon; see outputSchema for the full shape. Example call: {shares: 10000, strike: 2, fmv: 200, expectedGrowth: 0.15, volatility: 0.5, filingStatus: "married_joint", ordinaryIncome: 400000, stateCode: "CA", carryforwardCredit: 0, horizon: 4, cashReturnRate: 0.05, grantDate: "2022-01-15", hasLeftCompany: false, terminationDate: null}. Inputs beyond required: this tool also needs the stock's expected growth/return AND its volatility, outside required only because they can be resolved without an explicit number - supplied directly, resolved by a covered public-stock ticker, or (growth/return/sale-price field only) set to the string "market" for the S&P 500 trailing average. Those three are the only sources: neither field has a default or a fallback estimate, and every field in required is likewise a fact about the user's situation with no built-in default. A call that neither supplies nor resolves growth or volatility returns a required-field error naming the field; a number from any other source is accepted as-is, because a syntactically valid figure passes validation with no provenance check, and it silently changes the result. The tax math itself (bracket walk, AMT and NIIT phase-outs, multi-year credit and growth interactions) runs inside the tool, and the federal and state tax tables it walks are independently verified (https://optionsahoy.com/verification). Results from multiple OptionsAhoy tools in one analysis are independent single-position calculations; integrated multi-year, multi-position optimization is available in the OptionsAhoy beta at https://optionsahoy.com/beta?src=mcp_multi.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
fmvYesCurrent fair market value per share, USD. Anchors year-1 of the growth path; future years compound from here using expectedGrowth and volatilityDrag. Must come from the user.
sharesYesTotal Incentive Stock Option (ISO) shares available to exercise across the planning horizon. Must come from the user.
strikeYesStrike price per share, USD. Must come from the user.
tickerNoOptional public-stock symbol (e.g. "NVDA", "AAPL"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and the implied vol as of the last close for any unsupplied volatility. Growth and vol come from different sources, so some symbols resolve only one, and a vol that is not current resolves as nothing. A field the ticker cannot resolve falls through to a "required field" error naming that field: pass it explicitly, or (for the growth/return/sale-price field) pass the string "market" for the S&P 500 trailing average; never invent a number. The covered-tickers resource (resources/list) lists which symbols resolve growth.
horizonYesPlanning horizon in years (1..10). The optimizer searches all feasible per-year share allocations across this many years. The user's choice, not a modelling detail, and it changes the answer: use the value they gave, and if they gave none, ask for it rather than assuming one.
grantDateYesISO grant date (YYYY-MM-DD). Drives the 10-year statutory grant expiration (IRC §422) and the 2-year qualifying-disposition threshold from grant.
stateCodeYesTwo-letter US state code (e.g. CA, NY, TX). Drives state ordinary brackets, state long-term capital gains (LTCG) treatment, and state AMT (CA, CO, CT, MN).
volatilityNoAnnualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the volatility itself, not a pre-computed drag: the tool derives the horizon-cumulative drag internally, and the correct formula is horizon-dependent. This value must come from the user or from a `ticker` that resolves it as of the last market close; if neither supplies it, ask the user rather than estimating one.
filingStatusYesFederal filing status. Drives the ordinary-bracket walk, the AMT exemption tier ($90,100 single / $140,200 MFJ for 2026), and the AMT exemption phaseout start ($500,000 single / $1,000,000 MFJ).
cashReturnRateNoAnnual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Optional: defaults to 0.04 (4%, a short-Treasury-like after-tax yield) when omitted, and an explicit value overrides that default. At 0 the math collapses to a nominal sum.
expectedGrowthNoAnnual expected stock growth as a decimal (0.10 = 10%), or the string "market" to use the S&P 500 trailing average when the user has no view. Required unless `ticker` resolves it from trailing CAGR. This tool has no default for it: a value not stated by the user, not resolved by a covered `ticker`, and not the "market" sentinel is outside the input contract.
hasLeftCompanyYesTrue if the user has separated from the company. Activates the 90-day post-termination ISO exercise window measured from terminationDate.
ordinaryIncomeYesAnnual ordinary income before this exercise, USD. Baseline for the bracket walk and the AMT exemption phaseout. Must come from the user. This is taxable income after deductions, not gross wages: the engine applies no standard or itemized deduction to it.
volatilityDragNoAlternative to `volatility`: the multiplicative price haircut already computed for the planning horizon. Supply this OR `volatility` (if both are given, volatilityDrag wins). This field is for a drag figure that already exists from a prior computation; the drag formula is horizon-dependent, so a figure derived for a different horizon does not carry over. Supplying `volatility` instead lets the tool derive it.
terminationDateNoSeparation date (YYYY-MM-DD). Required only when hasLeftCompany=true (it drives the 90-day exercise-window deadline); omit it or pass null when still employed. No longer in `required` so the common employed case needs no placeholder.
carryforwardCreditNoExisting federal AMT credit (Minimum Tax Credit, Form 8801) carryforward from prior tax years, USD. Recoverable in future years where regular federal tax exceeds tentative minimum tax. Optional; defaults to 0, which is correct for most first-time exercisers. Only a prior-year AMT credit makes it non-zero.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
timingYesTiming constraints derived from grantDate and (when departed) terminationDate.
schedulesYesThe three candidate exercise schedules, each evaluated at the effective horizon. Their nfv values are directly comparable; optimized is the highest-NFV schedule the optimizer found.
stateHasAmtYesTrue when the user state levies its own AMT (CA, CO, CT, MN).
alreadyInAmtYesTrue when the user owes AMT even with zero exercise (regular tax below tentative minimum tax at baseline income).
bargainPerShareYesYear-1 bargain element per share in dollars: max(0, fmv - strike).
crossoverSharesYesMaximum whole shares exercisable in year 1 before federal AMT exceeds regular tax (the AMT crossover).
crossoverBargainYesBargain element in dollars at the crossover share count: crossoverShares x (fmv - strike).
effectiveHorizonYesHorizon actually used by the schedules: min(requested horizon, timing.maxHorizon).
departedRecommendationNoPresent only when hasLeftCompany=true and the 90-day post-termination window is still open: the partial-exercise quantity with the highest expected after-tax value found by a scan over candidate share counts, which can land a few shares off the exact optimum.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv1.10.2
    • changedInput schema / properties / ticker / description
      Previous value: -"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and a cached implied vol for any unsupplied volatility. Growth and volatility come from two separate cached snapshots, so some symbols resolve only one of the two fields. A symbol not in a given table falls through to a \"required field\" error for exactly the field it could not resolve: pass that field explicitly, or (for the growth/return/sale-price field) pass the string \"market\" for the S&P 500 trailing average; never invent a number. The covered-tickers resource (resources/list) lists which symbols resolve which field."New value: +"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and the implied vol as of the last close for any unsupplied volatility. Growth and vol come from different sources, so some symbols resolve only one, and a vol that is not current resolves as nothing. A field the ticker cannot resolve falls through to a \"required field\" error naming that field: pass it explicitly, or (for the growth/return/sale-price field) pass the string \"market\" for the S&P 500 trailing average; never invent a number. The covered-tickers resource (resources/list) lists which symbols resolve growth."
    • changedInput schema / properties / volatility / description
      Previous value: -"Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the volatility itself, not a pre-computed drag: the tool derives the horizon-cumulative drag internally, and the correct formula is horizon-dependent. This value must come from the user or from a `ticker` that resolves it from the cached implied-vol table; if neither supplies it, ask the user rather than estimating one."New value: +"Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the volatility itself, not a pre-computed drag: the tool derives the horizon-cumulative drag internally, and the correct formula is horizon-dependent. This value must come from the user or from a `ticker` that resolves it as of the last market close; if neither supplies it, ask the user rather than estimating one."
  2. Changed19 schema fields changedv1.10.1
    • changedInput schema / properties / carryforwardCredit / description
      Previous value: -"Existing federal AMT credit (Minimum Tax Credit, Form 8801) carryforward from prior tax years, USD. Recoverable in future years where regular federal tax exceeds tentative minimum tax. Optional; defaults to 0 (most first-time exercisers have none), so do not ask the user for it unless they mention a prior-year AMT credit."New value: +"Existing federal AMT credit (Minimum Tax Credit, Form 8801) carryforward from prior tax years, USD. Recoverable in future years where regular federal tax exceeds tentative minimum tax. Optional; defaults to 0, which is correct for most first-time exercisers. Only a prior-year AMT credit makes it non-zero."
    • changedInput schema / properties / cashReturnRate / description
      Previous value: -"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Optional: defaults to 0.04 (4%, a short-Treasury-like after-tax yield) when omitted, so you need not ask the user for it; pass an explicit value if the user states one. At 0 the math collapses to a nominal sum."New value: +"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Optional: defaults to 0.04 (4%, a short-Treasury-like after-tax yield) when omitted, and an explicit value overrides that default. At 0 the math collapses to a nominal sum."
    • changedInput schema / properties / expectedGrowth / description
      Previous value: -"Annual expected stock growth as a decimal (0.10 = 10%). Required unless `ticker` resolves it from trailing CAGR."New value: +"Annual expected stock growth as a decimal (0.10 = 10%), or the string \"market\" to use the S&P 500 trailing average when the user has no view. Required unless `ticker` resolves it from trailing CAGR. This tool has no default for it: a value not stated by the user, not resolved by a covered `ticker`, and not the \"market\" sentinel is outside the input contract."
    • changedInput schema / properties / expectedGrowth / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "string"
      +]
    • changedInput schema / properties / fmv / description
      Previous value: -"Current fair market value per share, USD. Anchors year-1 of the growth path; future years compound from here using expectedGrowth and volatilityDrag."New value: +"Current fair market value per share, USD. Anchors year-1 of the growth path; future years compound from here using expectedGrowth and volatilityDrag. Must come from the user."
    • changedInput schema / properties / horizon / description
      Previous value: -"Planning horizon in years (1..10). The optimizer searches all feasible per-year share allocations across this many years."New value: +"Planning horizon in years (1..10). The optimizer searches all feasible per-year share allocations across this many years. The user's choice, not a modelling detail, and it changes the answer: use the value they gave, and if they gave none, ask for it rather than assuming one."
    • changedInput schema / properties / ordinaryIncome / description
      Previous value: -"Annual W-2 ordinary income before this exercise, USD. Baseline for the bracket walk and the AMT exemption phaseout."New value: +"Annual ordinary income before this exercise, USD. Baseline for the bracket walk and the AMT exemption phaseout. Must come from the user. This is taxable income after deductions, not gross wages: the engine applies no standard or itemized deduction to it."
    • changedInput schema / properties / shares / description
      Previous value: -"Total Incentive Stock Option (ISO) shares available to exercise across the planning horizon."New value: +"Total Incentive Stock Option (ISO) shares available to exercise across the planning horizon. Must come from the user."
    • changedInput schema / properties / strike / description
      Previous value: -"Strike price per share, USD."New value: +"Strike price per share, USD. Must come from the user."
    • changedInput schema / properties / ticker / description
      Previous value: -"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and a cached implied vol for any unsupplied volatility. Growth and volatility come from two separate cached snapshots, so some symbols resolve only one of the two fields. A symbol not in a given table falls through to a \"required field\" error for exactly the field it could not resolve, so pass that field explicitly (or use a fully covered symbol) rather than inventing it. The covered-tickers resource (resources/list) lists which symbols resolve which field."New value: +"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and a cached implied vol for any unsupplied volatility. Growth and volatility come from two separate cached snapshots, so some symbols resolve only one of the two fields. A symbol not in a given table falls through to a \"required field\" error for exactly the field it could not resolve: pass that field explicitly, or (for the growth/return/sale-price field) pass the string \"market\" for the S&P 500 trailing average; never invent a number. The covered-tickers resource (resources/list) lists which symbols resolve which field."
    • changedInput schema / properties / volatility / description
      Previous value: -"Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the user-supplied volatility directly; the tool computes the horizon-cumulative drag internally. The model MUST NOT compute drag itself; the correct formula is horizon-dependent and most models get it wrong. If the user does not supply a volatility number AND no `ticker` resolves it from the cached implied-vol table, ASK them."New value: +"Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the volatility itself, not a pre-computed drag: the tool derives the horizon-cumulative drag internally, and the correct formula is horizon-dependent. This value must come from the user or from a `ticker` that resolves it from the cached implied-vol table; if neither supplies it, ask the user rather than estimating one."
    • changedInput schema / properties / volatilityDrag / description
      Previous value: -"Alternative to `volatility`: the multiplicative price haircut already computed for the planning horizon. Supply this OR `volatility` (if both are given, volatilityDrag wins). Most callers should pass `volatility` and let the tool compute the drag; only pass this if you already have a horizon drag figure. The model MUST NOT compute it itself."New value: +"Alternative to `volatility`: the multiplicative price haircut already computed for the planning horizon. Supply this OR `volatility` (if both are given, volatilityDrag wins). This field is for a drag figure that already exists from a prior computation; the drag formula is horizon-dependent, so a figure derived for a different horizon does not carry over. Supplying `volatility` instead lets the tool derive it."
    • changedOutput schema / properties / departedRecommendation / description
      Previous value: -"Present only when hasLeftCompany=true and the 90-day post-termination window is still open: the partial-exercise quantity that maximizes expected after-tax value."New value: +"Present only when hasLeftCompany=true and the 90-day post-termination window is still open: the partial-exercise quantity with the highest expected after-tax value found by a scan over candidate share counts, which can land a few shares off the exact optimum."
    • changedOutput schema / properties / departedRecommendation / properties / recommendedSchedule / properties / nfv / description
      Previous value: -"After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. The headline number to report."New value: +"After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. This is the summary figure each schedule is scored on."
    • changedOutput schema / properties / departedRecommendation / properties / recommendedShares / description
      Previous value: -"Optimal share count to exercise within the window."New value: +"Share count to exercise within the window, the best found by the scan."
    • changedOutput schema / properties / schedules / description
      Previous value: -"The three candidate exercise schedules, each evaluated at the effective horizon. Compare nfv across them; optimized is the recommended plan."New value: +"The three candidate exercise schedules, each evaluated at the effective horizon. Their nfv values are directly comparable; optimized is the highest-NFV schedule the optimizer found."
    • changedOutput schema / properties / schedules / properties / evenSplit / properties / nfv / description
      Previous value: -"After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. The headline number to report."New value: +"After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. This is the summary figure each schedule is scored on."
    • changedOutput schema / properties / schedules / properties / lumpSum / properties / nfv / description
      Previous value: -"After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. The headline number to report."New value: +"After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. This is the summary figure each schedule is scored on."
    • changedOutput schema / properties / schedules / properties / optimized / properties / nfv / description
      Previous value: -"After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. The headline number to report."New value: +"After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. This is the summary figure each schedule is scored on."
  3. Changed5 schema fields changedv1.9.8
    • changedInput schema / properties / carryforwardCredit / description
      Previous value: -"Existing federal AMT credit (Minimum Tax Credit, Form 8801) carryforward from prior tax years, USD. Recoverable in future years where regular federal tax exceeds tentative minimum tax."New value: +"Existing federal AMT credit (Minimum Tax Credit, Form 8801) carryforward from prior tax years, USD. Recoverable in future years where regular federal tax exceeds tentative minimum tax. Optional; defaults to 0 (most first-time exercisers have none), so do not ask the user for it unless they mention a prior-year AMT credit."
    • changedInput schema / properties / ticker / description
      Previous value: -"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and a cached implied vol for any unsupplied volatility. About 90 large-cap symbols resolve a return; a slightly smaller set (~85) also resolves volatility. A symbol not in a given table falls through to a \"required field\" error for exactly the field it could not resolve, so pass that field explicitly (or use a fully covered symbol) rather than inventing it."New value: +"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and a cached implied vol for any unsupplied volatility. Growth and volatility come from two separate cached snapshots, so some symbols resolve only one of the two fields. A symbol not in a given table falls through to a \"required field\" error for exactly the field it could not resolve, so pass that field explicitly (or use a fully covered symbol) rather than inventing it. The covered-tickers resource (resources/list) lists which symbols resolve which field."
    • addedInput schema / properties / volatility / maximum
      Added value: +5
    • addedInput schema / properties / volatilityDrag
      Added value: +{
      +  "description": "Alternative to `volatility`: the multiplicative price haircut already computed for the planning horizon. Supply this OR `volatility` (if both are given, volatilityDrag wins). Most callers should pass `volatility` and let the tool compute the drag; only pass this if you already have a horizon drag figure. The model MUST NOT compute it itself.",
      +  "maximum": 0.99,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "shares",
      -  "strike",
      -  "fmv",
      -  "filingStatus",
      -  "ordinaryIncome",
      -  "stateCode",
      -  "carryforwardCredit",
      -  "horizon",
      -  "grantDate",
      -  "hasLeftCompany"
      -]New value: +[
      +  "shares",
      +  "strike",
      +  "fmv",
      +  "filingStatus",
      +  "ordinaryIncome",
      +  "stateCode",
      +  "horizon",
      +  "grantDate",
      +  "hasLeftCompany"
      +]
  4. Changed7 schema fields changedv1.9.7
    • changedInput schema / properties / cashReturnRate / description
      Previous value: -"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Required. The model MUST NOT invent this value; ask the user (e.g. \"what after-tax yield should I use for idle cash, e.g. ~5% for short-term Treasury?\"). At 0 the math collapses to a nominal sum."New value: +"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Optional: defaults to 0.04 (4%, a short-Treasury-like after-tax yield) when omitted, so you need not ask the user for it; pass an explicit value if the user states one. At 0 the math collapses to a nominal sum."
    • addedInput schema / properties / stateCode / enum
      Added value: +[
      +  "AK",
      +  "AL",
      +  "AR",
      +  "AZ",
      +  "CA",
      +  "CO",
      +  "CT",
      +  "DC",
      +  "DE",
      +  "FL",
      +  "GA",
      +  "HI",
      +  "IA",
      +  "ID",
      +  "IL",
      +  "IN",
      +  "KS",
      +  "KY",
      +  "LA",
      +  "MA",
      +  "MD",
      +  "ME",
      +  "MI",
      +  "MN",
      +  "MO",
      +  "MS",
      +  "MT",
      +  "NC",
      +  "ND",
      +  "NE",
      +  "NH",
      +  "NJ",
      +  "NM",
      +  "NV",
      +  "NY",
      +  "OH",
      +  "OK",
      +  "OR",
      +  "PA",
      +  "RI",
      +  "SC",
      +  "SD",
      +  "TN",
      +  "TX",
      +  "UT",
      +  "VA",
      +  "VT",
      +  "WA",
      +  "WI",
      +  "WV",
      +  "WY"
      +]
    • removedInput schema / properties / stateCode / pattern
      Removed value: -"^[A-Z]{2}$"
    • changedInput schema / properties / terminationDate / description
      Previous value: -"Separation date (YYYY-MM-DD) when hasLeftCompany=true; null when still employed. Together with hasLeftCompany, drives the 90-day exercise window deadline."New value: +"Separation date (YYYY-MM-DD). Required only when hasLeftCompany=true (it drives the 90-day exercise-window deadline); omit it or pass null when still employed. No longer in `required` so the common employed case needs no placeholder."
    • changedInput schema / properties / ticker / description
      Previous value: -"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field AND a cached implied vol for any unsupplied volatility, instead of requiring the caller to invent either. Most large-cap public symbols are covered; unknown tickers fall through to \"required field\" errors so the model knows to ask the user."New value: +"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and a cached implied vol for any unsupplied volatility. About 90 large-cap symbols resolve a return; a slightly smaller set (~85) also resolves volatility. A symbol not in a given table falls through to a \"required field\" error for exactly the field it could not resolve, so pass that field explicitly (or use a fully covered symbol) rather than inventing it."
    • changedInput schema / properties / volatility / description
      Previous value: -"Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the user-supplied volatility directly; the tool computes the horizon-cumulative drag internally. The model MUST NOT compute drag itself — the correct formula is horizon-dependent and most models get it wrong. If the user does not supply a volatility number AND no `ticker` resolves it from the cached implied-vol table, ASK them."New value: +"Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the user-supplied volatility directly; the tool computes the horizon-cumulative drag internally. The model MUST NOT compute drag itself; the correct formula is horizon-dependent and most models get it wrong. If the user does not supply a volatility number AND no `ticker` resolves it from the cached implied-vol table, ASK them."
    • changedInput schema / required
      Previous value: -[
      -  "shares",
      -  "strike",
      -  "fmv",
      -  "filingStatus",
      -  "ordinaryIncome",
      -  "stateCode",
      -  "carryforwardCredit",
      -  "horizon",
      -  "cashReturnRate",
      -  "grantDate",
      -  "hasLeftCompany",
      -  "terminationDate"
      -]New value: +[
      +  "shares",
      +  "strike",
      +  "fmv",
      +  "filingStatus",
      +  "ordinaryIncome",
      +  "stateCode",
      +  "carryforwardCredit",
      +  "horizon",
      +  "grantDate",
      +  "hasLeftCompany"
      +]
  5. Changed3 schema fields changedv1.9.2
    • changedInput schema / properties / ticker / description
      Previous value: -"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes the ticker's trailing CAGR for any unsupplied expected-return / sale-price field instead of requiring the caller to invent one. ~90 symbols covered; unknown tickers fall through to \"required field\" errors so the model knows to ask the user."New value: +"Optional public-stock symbol (e.g. \"NVDA\", \"AAPL\"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field AND a cached implied vol for any unsupplied volatility, instead of requiring the caller to invent either. Most large-cap public symbols are covered; unknown tickers fall through to \"required field\" errors so the model knows to ask the user."
    • changedInput schema / properties / volatility / description
      Previous value: -"Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the user-supplied volatility directly; the tool computes the horizon-cumulative drag internally. The model MUST NOT compute drag itself — the correct formula is horizon-dependent and most models get it wrong. If the user does not supply a volatility number, ASK them."New value: +"Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the user-supplied volatility directly; the tool computes the horizon-cumulative drag internally. The model MUST NOT compute drag itself — the correct formula is horizon-dependent and most models get it wrong. If the user does not supply a volatility number AND no `ticker` resolves it from the cached implied-vol table, ASK them."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "description": "ISO/AMT exercise optimization result. All dollar amounts are USD.",
      +  "properties": {
      +    "alreadyInAmt": {
      +      "description": "True when the user owes AMT even with zero exercise (regular tax below tentative minimum tax at baseline income).",
      +      "type": "boolean"
      +    },
      +    "bargainPerShare": {
      +      "description": "Year-1 bargain element per share in dollars: max(0, fmv - strike).",
      +      "type": "number"
      +    },
      +    "crossoverBargain": {
      +      "description": "Bargain element in dollars at the crossover share count: crossoverShares x (fmv - strike).",
      +      "type": "number"
      +    },
      +    "crossoverShares": {
      +      "description": "Maximum whole shares exercisable in year 1 before federal AMT exceeds regular tax (the AMT crossover).",
      +      "type": "integer"
      +    },
      +    "departedRecommendation": {
      +      "description": "Present only when hasLeftCompany=true and the 90-day post-termination window is still open: the partial-exercise quantity that maximizes expected after-tax value.",
      +      "properties": {
      +        "curve": {
      +          "description": "Share-count vs after-tax-value curve sampled uniformly across [0, total shares], for charting.",
      +          "items": {
      +            "properties": {
      +              "exerciseTax": {
      +                "description": "AMT cost in dollars at this share count.",
      +                "type": "number"
      +              },
      +              "netValue": {
      +                "description": "Expected after-tax value in dollars at this share count.",
      +                "type": "number"
      +              },
      +              "shares": {
      +                "description": "Exercised share count at this sample point.",
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "shares",
      +              "netValue",
      +              "exerciseTax"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "fullExerciseNetValue": {
      +          "description": "Expected after-tax value in dollars at the hold horizon if all shares are exercised.",
      +          "type": "number"
      +        },
      +        "fullExerciseShares": {
      +          "description": "Total shares available (the exercise-everything alternative).",
      +          "type": "integer"
      +        },
      +        "fullExerciseTax": {
      +          "description": "AMT cost in dollars of exercising all shares.",
      +          "type": "number"
      +        },
      +        "futureFmvPerShare": {
      +          "description": "Projected FMV per share in dollars at the hold horizon.",
      +          "type": "number"
      +        },
      +        "holdYears": {
      +          "description": "Post-exercise hold horizon in years used for the comparison.",
      +          "type": "number"
      +        },
      +        "recommendedExerciseTax": {
      +          "description": "AMT cost in dollars at the recommended share count.",
      +          "type": "number"
      +        },
      +        "recommendedNetValue": {
      +          "description": "Expected after-tax value in dollars at the hold horizon for the recommended count.",
      +          "type": "number"
      +        },
      +        "recommendedSchedule": {
      +          "description": "Year-by-year tax schedule for the recommended share count.",
      +          "properties": {
      +            "amtPremiumFV": {
      +              "description": "Future-valued AMT premium stream (exercise tax paid above the no-exercise baseline, compounded at cashReturnRate to the horizon) in dollars.",
      +              "type": "number"
      +            },
      +            "baselineRegularTax": {
      +              "description": "Tax owed with no exercise at all (regular federal + state on ordinary income, summed across the horizon) in dollars.",
      +              "type": "number"
      +            },
      +            "creditEarned": {
      +              "description": "Federal AMT credit generated across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "creditRecovered": {
      +              "description": "Federal AMT credit recovered across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "creditRemaining": {
      +              "description": "Federal AMT credit still unrecovered at the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "exerciseTax": {
      +              "description": "totalTax minus baselineRegularTax: the marginal tax cost of exercising, in dollars.",
      +              "type": "number"
      +            },
      +            "federalLTCG": {
      +              "description": "Federal long-term capital gains tax (including NIIT) on grossGain in dollars.",
      +              "type": "number"
      +            },
      +            "grossGain": {
      +              "description": "shares x (projected FMV at horizon - strike): the LTCG-eligible gain in dollars.",
      +              "type": "number"
      +            },
      +            "label": {
      +              "description": "Which candidate plan this schedule represents.",
      +              "enum": [
      +                "lump_sum",
      +                "even_split",
      +                "optimized"
      +              ],
      +              "type": "string"
      +            },
      +            "nfv": {
      +              "description": "After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. The headline number to report.",
      +              "type": "number"
      +            },
      +            "stateLTCG": {
      +              "description": "State long-term capital gains tax on grossGain in dollars.",
      +              "type": "number"
      +            },
      +            "totalTax": {
      +              "description": "Total cash tax paid across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "years": {
      +              "description": "Per-year detail, one entry per year of the effective horizon.",
      +              "items": {
      +                "description": "Exercise and tax detail for one calendar year of the schedule.",
      +                "properties": {
      +                  "amtOwedFederal": {
      +                    "description": "Federal AMT owed above regular tax this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "amtOwedState": {
      +                    "description": "State AMT owed above regular state tax this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "bargain": {
      +                    "description": "Bargain element recognized this year in dollars: shares x (projected FMV - strike).",
      +                    "type": "number"
      +                  },
      +                  "cashTax": {
      +                    "description": "Total cash tax paid this year in dollars: federal + state, net of credit recovery.",
      +                    "type": "number"
      +                  },
      +                  "creditRecovered": {
      +                    "description": "Federal AMT credit applied (recovered) this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "regularFederal": {
      +                    "description": "Regular federal income tax for the year in dollars (ordinary income only, before AMT).",
      +                    "type": "number"
      +                  },
      +                  "regularState": {
      +                    "description": "Regular state income tax for the year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "shares": {
      +                    "description": "ISO shares exercised this year.",
      +                    "type": "number"
      +                  },
      +                  "tmtFederal": {
      +                    "description": "Federal tentative minimum tax for the year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "tmtState": {
      +                    "description": "State tentative minimum tax for the year in dollars (0 in states without AMT).",
      +                    "type": "number"
      +                  },
      +                  "year": {
      +                    "description": "Schedule year, 1-indexed (1 = current year).",
      +                    "type": "integer"
      +                  }
      +                },
      +                "required": [
      +                  "year",
      +                  "shares",
      +                  "bargain",
      +                  "regularFederal",
      +                  "regularState",
      +                  "tmtFederal",
      +                  "tmtState",
      +                  "amtOwedFederal",
      +                  "amtOwedState",
      +                  "creditRecovered",
      +                  "cashTax"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "years",
      +            "totalTax",
      +            "baselineRegularTax",
      +            "exerciseTax",
      +            "creditEarned",
      +            "creditRecovered",
      +            "creditRemaining",
      +            "grossGain",
      +            "federalLTCG",
      +            "stateLTCG",
      +            "amtPremiumFV",
      +            "nfv"
      +          ],
      +          "type": "object"
      +        },
      +        "recommendedShares": {
      +          "description": "Optimal share count to exercise within the window.",
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "recommendedShares",
      +        "recommendedExerciseTax",
      +        "recommendedNetValue",
      +        "fullExerciseShares",
      +        "fullExerciseTax",
      +        "fullExerciseNetValue",
      +        "holdYears",
      +        "futureFmvPerShare",
      +        "recommendedSchedule",
      +        "curve"
      +      ],
      +      "type": "object"
      +    },
      +    "effectiveHorizon": {
      +      "description": "Horizon actually used by the schedules: min(requested horizon, timing.maxHorizon).",
      +      "type": "integer"
      +    },
      +    "schedules": {
      +      "description": "The three candidate exercise schedules, each evaluated at the effective horizon. Compare nfv across them; optimized is the recommended plan.",
      +      "properties": {
      +        "evenSplit": {
      +          "description": "Exercise shares/horizon shares each year.",
      +          "properties": {
      +            "amtPremiumFV": {
      +              "description": "Future-valued AMT premium stream (exercise tax paid above the no-exercise baseline, compounded at cashReturnRate to the horizon) in dollars.",
      +              "type": "number"
      +            },
      +            "baselineRegularTax": {
      +              "description": "Tax owed with no exercise at all (regular federal + state on ordinary income, summed across the horizon) in dollars.",
      +              "type": "number"
      +            },
      +            "creditEarned": {
      +              "description": "Federal AMT credit generated across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "creditRecovered": {
      +              "description": "Federal AMT credit recovered across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "creditRemaining": {
      +              "description": "Federal AMT credit still unrecovered at the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "exerciseTax": {
      +              "description": "totalTax minus baselineRegularTax: the marginal tax cost of exercising, in dollars.",
      +              "type": "number"
      +            },
      +            "federalLTCG": {
      +              "description": "Federal long-term capital gains tax (including NIIT) on grossGain in dollars.",
      +              "type": "number"
      +            },
      +            "grossGain": {
      +              "description": "shares x (projected FMV at horizon - strike): the LTCG-eligible gain in dollars.",
      +              "type": "number"
      +            },
      +            "label": {
      +              "description": "Which candidate plan this schedule represents.",
      +              "enum": [
      +                "lump_sum",
      +                "even_split",
      +                "optimized"
      +              ],
      +              "type": "string"
      +            },
      +            "nfv": {
      +              "description": "After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. The headline number to report.",
      +              "type": "number"
      +            },
      +            "stateLTCG": {
      +              "description": "State long-term capital gains tax on grossGain in dollars.",
      +              "type": "number"
      +            },
      +            "totalTax": {
      +              "description": "Total cash tax paid across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "years": {
      +              "description": "Per-year detail, one entry per year of the effective horizon.",
      +              "items": {
      +                "description": "Exercise and tax detail for one calendar year of the schedule.",
      +                "properties": {
      +                  "amtOwedFederal": {
      +                    "description": "Federal AMT owed above regular tax this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "amtOwedState": {
      +                    "description": "State AMT owed above regular state tax this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "bargain": {
      +                    "description": "Bargain element recognized this year in dollars: shares x (projected FMV - strike).",
      +                    "type": "number"
      +                  },
      +                  "cashTax": {
      +                    "description": "Total cash tax paid this year in dollars: federal + state, net of credit recovery.",
      +                    "type": "number"
      +                  },
      +                  "creditRecovered": {
      +                    "description": "Federal AMT credit applied (recovered) this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "regularFederal": {
      +                    "description": "Regular federal income tax for the year in dollars (ordinary income only, before AMT).",
      +                    "type": "number"
      +                  },
      +                  "regularState": {
      +                    "description": "Regular state income tax for the year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "shares": {
      +                    "description": "ISO shares exercised this year.",
      +                    "type": "number"
      +                  },
      +                  "tmtFederal": {
      +                    "description": "Federal tentative minimum tax for the year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "tmtState": {
      +                    "description": "State tentative minimum tax for the year in dollars (0 in states without AMT).",
      +                    "type": "number"
      +                  },
      +                  "year": {
      +                    "description": "Schedule year, 1-indexed (1 = current year).",
      +                    "type": "integer"
      +                  }
      +                },
      +                "required": [
      +                  "year",
      +                  "shares",
      +                  "bargain",
      +                  "regularFederal",
      +                  "regularState",
      +                  "tmtFederal",
      +                  "tmtState",
      +                  "amtOwedFederal",
      +                  "amtOwedState",
      +                  "creditRecovered",
      +                  "cashTax"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "years",
      +            "totalTax",
      +            "baselineRegularTax",
      +            "exerciseTax",
      +            "creditEarned",
      +            "creditRecovered",
      +            "creditRemaining",
      +            "grossGain",
      +            "federalLTCG",
      +            "stateLTCG",
      +            "amtPremiumFV",
      +            "nfv"
      +          ],
      +          "type": "object"
      +        },
      +        "lumpSum": {
      +          "description": "Exercise all shares in year 1.",
      +          "properties": {
      +            "amtPremiumFV": {
      +              "description": "Future-valued AMT premium stream (exercise tax paid above the no-exercise baseline, compounded at cashReturnRate to the horizon) in dollars.",
      +              "type": "number"
      +            },
      +            "baselineRegularTax": {
      +              "description": "Tax owed with no exercise at all (regular federal + state on ordinary income, summed across the horizon) in dollars.",
      +              "type": "number"
      +            },
      +            "creditEarned": {
      +              "description": "Federal AMT credit generated across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "creditRecovered": {
      +              "description": "Federal AMT credit recovered across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "creditRemaining": {
      +              "description": "Federal AMT credit still unrecovered at the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "exerciseTax": {
      +              "description": "totalTax minus baselineRegularTax: the marginal tax cost of exercising, in dollars.",
      +              "type": "number"
      +            },
      +            "federalLTCG": {
      +              "description": "Federal long-term capital gains tax (including NIIT) on grossGain in dollars.",
      +              "type": "number"
      +            },
      +            "grossGain": {
      +              "description": "shares x (projected FMV at horizon - strike): the LTCG-eligible gain in dollars.",
      +              "type": "number"
      +            },
      +            "label": {
      +              "description": "Which candidate plan this schedule represents.",
      +              "enum": [
      +                "lump_sum",
      +                "even_split",
      +                "optimized"
      +              ],
      +              "type": "string"
      +            },
      +            "nfv": {
      +              "description": "After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. The headline number to report.",
      +              "type": "number"
      +            },
      +            "stateLTCG": {
      +              "description": "State long-term capital gains tax on grossGain in dollars.",
      +              "type": "number"
      +            },
      +            "totalTax": {
      +              "description": "Total cash tax paid across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "years": {
      +              "description": "Per-year detail, one entry per year of the effective horizon.",
      +              "items": {
      +                "description": "Exercise and tax detail for one calendar year of the schedule.",
      +                "properties": {
      +                  "amtOwedFederal": {
      +                    "description": "Federal AMT owed above regular tax this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "amtOwedState": {
      +                    "description": "State AMT owed above regular state tax this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "bargain": {
      +                    "description": "Bargain element recognized this year in dollars: shares x (projected FMV - strike).",
      +                    "type": "number"
      +                  },
      +                  "cashTax": {
      +                    "description": "Total cash tax paid this year in dollars: federal + state, net of credit recovery.",
      +                    "type": "number"
      +                  },
      +                  "creditRecovered": {
      +                    "description": "Federal AMT credit applied (recovered) this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "regularFederal": {
      +                    "description": "Regular federal income tax for the year in dollars (ordinary income only, before AMT).",
      +                    "type": "number"
      +                  },
      +                  "regularState": {
      +                    "description": "Regular state income tax for the year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "shares": {
      +                    "description": "ISO shares exercised this year.",
      +                    "type": "number"
      +                  },
      +                  "tmtFederal": {
      +                    "description": "Federal tentative minimum tax for the year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "tmtState": {
      +                    "description": "State tentative minimum tax for the year in dollars (0 in states without AMT).",
      +                    "type": "number"
      +                  },
      +                  "year": {
      +                    "description": "Schedule year, 1-indexed (1 = current year).",
      +                    "type": "integer"
      +                  }
      +                },
      +                "required": [
      +                  "year",
      +                  "shares",
      +                  "bargain",
      +                  "regularFederal",
      +                  "regularState",
      +                  "tmtFederal",
      +                  "tmtState",
      +                  "amtOwedFederal",
      +                  "amtOwedState",
      +                  "creditRecovered",
      +                  "cashTax"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "years",
      +            "totalTax",
      +            "baselineRegularTax",
      +            "exerciseTax",
      +            "creditEarned",
      +            "creditRecovered",
      +            "creditRemaining",
      +            "grossGain",
      +            "federalLTCG",
      +            "stateLTCG",
      +            "amtPremiumFV",
      +            "nfv"
      +          ],
      +          "type": "object"
      +        },
      +        "optimized": {
      +          "description": "The NFV-maximal per-year allocation found by the optimizer. The recommended plan.",
      +          "properties": {
      +            "amtPremiumFV": {
      +              "description": "Future-valued AMT premium stream (exercise tax paid above the no-exercise baseline, compounded at cashReturnRate to the horizon) in dollars.",
      +              "type": "number"
      +            },
      +            "baselineRegularTax": {
      +              "description": "Tax owed with no exercise at all (regular federal + state on ordinary income, summed across the horizon) in dollars.",
      +              "type": "number"
      +            },
      +            "creditEarned": {
      +              "description": "Federal AMT credit generated across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "creditRecovered": {
      +              "description": "Federal AMT credit recovered across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "creditRemaining": {
      +              "description": "Federal AMT credit still unrecovered at the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "exerciseTax": {
      +              "description": "totalTax minus baselineRegularTax: the marginal tax cost of exercising, in dollars.",
      +              "type": "number"
      +            },
      +            "federalLTCG": {
      +              "description": "Federal long-term capital gains tax (including NIIT) on grossGain in dollars.",
      +              "type": "number"
      +            },
      +            "grossGain": {
      +              "description": "shares x (projected FMV at horizon - strike): the LTCG-eligible gain in dollars.",
      +              "type": "number"
      +            },
      +            "label": {
      +              "description": "Which candidate plan this schedule represents.",
      +              "enum": [
      +                "lump_sum",
      +                "even_split",
      +                "optimized"
      +              ],
      +              "type": "string"
      +            },
      +            "nfv": {
      +              "description": "After-tax Net Final Value at the horizon in dollars: grossGain - federalLTCG - stateLTCG - amtPremiumFV. The headline number to report.",
      +              "type": "number"
      +            },
      +            "stateLTCG": {
      +              "description": "State long-term capital gains tax on grossGain in dollars.",
      +              "type": "number"
      +            },
      +            "totalTax": {
      +              "description": "Total cash tax paid across the horizon in dollars.",
      +              "type": "number"
      +            },
      +            "years": {
      +              "description": "Per-year detail, one entry per year of the effective horizon.",
      +              "items": {
      +                "description": "Exercise and tax detail for one calendar year of the schedule.",
      +                "properties": {
      +                  "amtOwedFederal": {
      +                    "description": "Federal AMT owed above regular tax this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "amtOwedState": {
      +                    "description": "State AMT owed above regular state tax this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "bargain": {
      +                    "description": "Bargain element recognized this year in dollars: shares x (projected FMV - strike).",
      +                    "type": "number"
      +                  },
      +                  "cashTax": {
      +                    "description": "Total cash tax paid this year in dollars: federal + state, net of credit recovery.",
      +                    "type": "number"
      +                  },
      +                  "creditRecovered": {
      +                    "description": "Federal AMT credit applied (recovered) this year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "regularFederal": {
      +                    "description": "Regular federal income tax for the year in dollars (ordinary income only, before AMT).",
      +                    "type": "number"
      +                  },
      +                  "regularState": {
      +                    "description": "Regular state income tax for the year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "shares": {
      +                    "description": "ISO shares exercised this year.",
      +                    "type": "number"
      +                  },
      +                  "tmtFederal": {
      +                    "description": "Federal tentative minimum tax for the year in dollars.",
      +                    "type": "number"
      +                  },
      +                  "tmtState": {
      +                    "description": "State tentative minimum tax for the year in dollars (0 in states without AMT).",
      +                    "type": "number"
      +                  },
      +                  "year": {
      +                    "description": "Schedule year, 1-indexed (1 = current year).",
      +                    "type": "integer"
      +                  }
      +                },
      +                "required": [
      +                  "year",
      +                  "shares",
      +                  "bargain",
      +                  "regularFederal",
      +                  "regularState",
      +                  "tmtFederal",
      +                  "tmtState",
      +                  "amtOwedFederal",
      +                  "amtOwedState",
      +                  "creditRecovered",
      +                  "cashTax"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "years",
      +            "totalTax",
      +            "baselineRegularTax",
      +            "exerciseTax",
      +            "creditEarned",
      +            "creditRecovered",
      +            "creditRemaining",
      +            "grossGain",
      +            "federalLTCG",
      +            "stateLTCG",
      +            "amtPremiumFV",
      +            "nfv"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "lumpSum",
      +        "evenSplit",
      +        "optimized"
      +      ],
      +      "type": "object"
      +    },
      +    "stateHasAmt": {
      +      "description": "True when the user state levies its own AMT (CA, CO, CT, MN).",
      +      "type": "boolean"
      +    },
      +    "timing": {
      +      "description": "Timing constraints derived from grantDate and (when departed) terminationDate.",
      +      "properties": {
      +        "daysUntilWindowClose": {
      +          "description": "Days until the post-termination exercise window closes (can be negative when already past); null while still employed.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "exerciseWindowClose": {
      +          "description": "Post-termination exercise deadline (terminationDate + 90 days) as an ISO 8601 date-time string; null while still employed.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "grantExpiration": {
      +          "description": "Grant expiration date: grantDate + 10 years (IRC 422 maximum ISO term). ISO 8601 date-time string.",
      +          "type": "string"
      +        },
      +        "maxHorizon": {
      +          "description": "Maximum usable planning horizon in years (1..10), capped by grant expiration or the post-termination window.",
      +          "type": "integer"
      +        },
      +        "qdEligibleDate": {
      +          "description": "Earliest qualifying-disposition date measured from grant: grantDate + 2 years. ISO 8601 date-time string.",
      +          "type": "string"
      +        },
      +        "qdNotYetEligible": {
      +          "description": "True when grantDate + 2 years is still in the future (a sale today could not be a qualifying disposition).",
      +          "type": "boolean"
      +        },
      +        "windowClosed": {
      +          "description": "True when the user departed and the 90-day exercise deadline has already passed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "grantExpiration",
      +        "qdEligibleDate",
      +        "exerciseWindowClose",
      +        "maxHorizon",
      +        "daysUntilWindowClose",
      +        "windowClosed",
      +        "qdNotYetEligible"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "crossoverShares",
      +    "crossoverBargain",
      +    "alreadyInAmt",
      +    "schedules",
      +    "stateHasAmt",
      +    "bargainPerShare",
      +    "timing",
      +    "effectiveHorizon"
      +  ],
      +  "type": "object"
      +}
  6. Changed1 schema field changedv1.7.0
    • changedInput schema / properties / cashReturnRate / description
      Previous value: -"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Ask the user (e.g. \"what after-tax yield should I use for idle cash, e.g. ~5% for short-term Treasury?\"). At 0 the math collapses to a nominal sum."New value: +"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Required. The model MUST NOT invent this value; ask the user (e.g. \"what after-tax yield should I use for idle cash, e.g. ~5% for short-term Treasury?\"). At 0 the math collapses to a nominal sum."
  7. Changed1 schema field changedv1.3.6
    • changedInput schema / properties / cashReturnRate / description
      Previous value: -"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Required. The model MUST NOT invent this value; ask the user (e.g. \"what after-tax yield should I use for idle cash, e.g. ~5% for short-term Treasury?\"). At 0 the math collapses to a nominal sum."New value: +"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Ask the user (e.g. \"what after-tax yield should I use for idle cash, e.g. ~5% for short-term Treasury?\"). At 0 the math collapses to a nominal sum."
  8. Changed4 schema fields changedv1.3.4
    • changedInput schema / properties / cashReturnRate / description
      Previous value: -"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). At 0 the math collapses to a nominal sum."New value: +"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Required. The model MUST NOT invent this value; ask the user (e.g. \"what after-tax yield should I use for idle cash, e.g. ~5% for short-term Treasury?\"). At 0 the math collapses to a nominal sum."
    • addedInput schema / properties / volatility
      Added value: +{
      +  "description": "Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the user-supplied volatility directly; the tool computes the horizon-cumulative drag internally. The model MUST NOT compute drag itself — the correct formula is horizon-dependent and most models get it wrong. If the user does not supply a volatility number, ASK them.",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • removedInput schema / properties / volatilityDrag
      Removed value: -{
      -  "description": "Multiplicative haircut on the terminal-FMV growth path (0..0.99), capturing the half-variance correction in compounded returns. 0 = no drag, 0.20 = 20% haircut at horizon.",
      -  "maximum": 0.99,
      -  "minimum": 0,
      -  "type": "number"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "shares",
      -  "strike",
      -  "fmv",
      -  "volatilityDrag",
      -  "filingStatus",
      -  "ordinaryIncome",
      -  "stateCode",
      -  "carryforwardCredit",
      -  "horizon",
      -  "cashReturnRate",
      -  "grantDate",
      -  "hasLeftCompany",
      -  "terminationDate"
      -]New value: +[
      +  "shares",
      +  "strike",
      +  "fmv",
      +  "filingStatus",
      +  "ordinaryIncome",
      +  "stateCode",
      +  "carryforwardCredit",
      +  "horizon",
      +  "cashReturnRate",
      +  "grantDate",
      +  "hasLeftCompany",
      +  "terminationDate"
      +]
  9. Changed13 schema fields changedv1.2.2
    • addedInput schema / properties / carryforwardCredit / description
      Added value: +"Existing federal AMT credit (Minimum Tax Credit, Form 8801) carryforward from prior tax years, USD. Recoverable in future years where regular federal tax exceeds tentative minimum tax."
    • addedInput schema / properties / cashReturnRate / description
      Added value: +"Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). At 0 the math collapses to a nominal sum."
    • addedInput schema / properties / filingStatus / description
      Added value: +"Federal filing status. Drives the ordinary-bracket walk, the AMT exemption tier ($90,100 single / $140,200 MFJ for 2026), and the AMT exemption phaseout start ($500,000 single / $1,000,000 MFJ)."
    • addedInput schema / properties / fmv / description
      Added value: +"Current fair market value per share, USD. Anchors year-1 of the growth path; future years compound from here using expectedGrowth and volatilityDrag."
    • addedInput schema / properties / grantDate / description
      Added value: +"ISO grant date (YYYY-MM-DD). Drives the 10-year statutory grant expiration (IRC §422) and the 2-year qualifying-disposition threshold from grant."
    • addedInput schema / properties / hasLeftCompany / description
      Added value: +"True if the user has separated from the company. Activates the 90-day post-termination ISO exercise window measured from terminationDate."
    • addedInput schema / properties / horizon / description
      Added value: +"Planning horizon in years (1..10). The optimizer searches all feasible per-year share allocations across this many years."
    • addedInput schema / properties / ordinaryIncome / description
      Added value: +"Annual W-2 ordinary income before this exercise, USD. Baseline for the bracket walk and the AMT exemption phaseout."
    • addedInput schema / properties / shares / description
      Added value: +"Total Incentive Stock Option (ISO) shares available to exercise across the planning horizon."
    • addedInput schema / properties / stateCode / description
      Added value: +"Two-letter US state code (e.g. CA, NY, TX). Drives state ordinary brackets, state long-term capital gains (LTCG) treatment, and state AMT (CA, CO, CT, MN)."
    • addedInput schema / properties / strike / description
      Added value: +"Strike price per share, USD."
    • addedInput schema / properties / terminationDate / description
      Added value: +"Separation date (YYYY-MM-DD) when hasLeftCompany=true; null when still employed. Together with hasLeftCompany, drives the 90-day exercise window deadline."
    • addedInput schema / properties / volatilityDrag / description
      Added value: +"Multiplicative haircut on the terminal-FMV growth path (0..0.99), capturing the half-variance correction in compounded returns. 0 = no drag, 0.20 = 20% haircut at horizon."
  10. First observedv1.2.0

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (read-only, idempotent, non-destructive), the description discloses that it is a pure deterministic computation with no network access and no PII retention, that tax tables are compiled in and independently verified, and that the optimizer searches the full candidate space except for departedRecommendation, which can land a few shares off. It also warns that unsupplied growth/volatility cause a required-field error and that any syntactically valid number is accepted without provenance checking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long (roughly 600 words) and dense, but for a 16-parameter tool with complex tax behavior, most sentences earn their place. It front-loads usage triggers and sibling routing, then provides an example call and behavioral caveats; only minor redundancy exists between 'pure deterministic computation' and the later statement that tax math runs inside the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool of this complexity, the description is remarkably complete: it provides an example call, error behavior for unresolved fields, optimization-method details, the departedRecommendation caveat, deterministic/no-network guarantees, and points to the output schema for the full return shape. The presence of an output schema means return values don't need to be spelled out, and the description still names the headline result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real value beyond the schema: it explains how expectedGrowth and volatility can be resolved via a ticker or the 'market' sentinel, clarifies that cashReturnRate is used to time-value the tax stream, and stresses that neither field has a default. This is meaningful semantic context, not just schema repetition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: it computes the multi-year ISO exercise schedule that maximizes after-tax Net Final Value, and the trigger questions (AMT bomb, phantom income, early exercise, minimizing AMT) leave no doubt about the tool's role. It also names sibling tools (nso_calculate, rsu_sell_vs_hold, qsbs_check) so an agent can distinguish it from alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use this tool (ISO exercise questions, AMT avoidance, multi-year scheduling) and gives direct routing to alternatives for NSOs, RSUs, and QSBS. It also clarifies a boundary case by noting multi-position integrated optimization is not included here, pointing to the beta.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.