every model spec’d & versioned · harness ✓ greenchangelog →

Docs · Model reference

espp

Verified · spec v1.0.0

Inputs

FieldTypeValid domain
annualContributionfloat500 – 25,000
discountPctfloat0 – 0.15
priceAtGrantfloat5 – 500
priceAtPurchasefloat5 – 500
lookbackchoiceyes | no
marginalOrdinaryRatefloat0.1 – 0.37
  • Immediate-sale (disqualifying disposition) scenario only; domain edges approximate §423 limits (15% max discount; the $25,000 cap is on grant-date FMV, which the contribution-only domain does not recompute — see spec exclusions).

All fields required. Out-of-domain values are rejected with per-field errors — never clamped. Unknown fields are rejected.

Live example — generated from the real engine

Request
POST /api/v1/models/espp
{
  "annualContribution": 13000,
  "discountPct": 0.08,
  "priceAtGrant": 253,
  "priceAtPurchase": 253,
  "lookback": "yes",
  "marginalOrdinaryRate": 0.24
}
Response (chart arrays compacted)
{
  "ok": true,
  "model": "espp",
  "specVersion": "1.0.0",
  "contractUrl": "/api/v1/models/espp",
  "specUrl": "/api/v1/models/espp/spec",
  "inputs": {
    "annualContribution": 13000,
    "discountPct": 0.08,
    "priceAtGrant": 253,
    "priceAtPurchase": 253,
    "lookback": "yes",
    "marginalOrdinaryRate": 0.24
  },
  "outputs": {
    "purchasePrice": 232.76000000000002,
    "sharesPurchased": 55.85152087987626,
    "marketValueAtPurchase": 14130.434782608694,
    "bargainElement": 1130.4347826086941,
    "ordinaryIncomeTax": 271.3043478260866,
    "afterTaxProfit": 859.1304347826076,
    "preTaxReturnRate": 0.08695652173913032,
    "afterTaxReturnRate": 0.06608695652173904
  },
  "sentinels": [],
  "assumptions": [
    "Implements model spec espp v1.0.0 (dual-implementation verified).",
    "Immediate-sale (disqualifying disposition) scenario only; domain edges approximate §423 limits (15% max discount; the $25,000 cap is on grant-date FMV, which the contribution-only domain does not recompute — see spec exclusions)."
  ],
  "facts": [],
  "record": {
    "sha256": "40369267c54487f8cae78aa214e53210b7ca3baefbfcdc9683415b442e639351",
    "fields": [
      "model",
      "specVersion",
      "inputs",
      "outputs"
    ],
    "howToVerify": "Store this record with any advice or agent output built on these numbers. To verify later: build {model, specVersion, inputs, outputs} from the stored response, serialize as JSON with object keys sorted recursively (no whitespace), and SHA-256 it — a match proves the numbers came from this spec version with these inputs, unaltered."
  },
  "disclaimer": "Illustrative planning model, not financial advice. Outputs follow the published model spec exactly; read the spec for assumptions and exclusions before relying on any number."
}

This example is executed against the production engine when the page builds — it cannot drift from the API's real behavior.