every model spec’d & versioned · Concordance-tested 2×changelog →

Docs · Model reference

charitable-bunching

spec v1.0.0 · 250 open cases

Inputs

FieldTypeValid domain
filingStatuschoicesingle | married
agifloat30,000 – 1,500,000
iraDistributionsfloat0 – 300,000
ageint50 – 95
annualGivingfloat0 – 150,000
otherItemizedDeductionsfloat0 – 100,000
bunchYearsint2 – 5
  • agi is each year's AGI before any QCD and includes iraDistributions (values above agi are read as agi). Whole-year ages: QCD eligibility modeled at 71+. Cash gifts above the 60% AGI limit are reported, not carried forward (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/charitable-bunching
{
  "filingStatus": "single",
  "agi": 765000,
  "iraDistributions": 150000,
  "age": 73,
  "annualGiving": 75000,
  "otherItemizedDeductions": 50000,
  "bunchYears": 4
}
Response (chart arrays compacted)
{
  "ok": true,
  "model": "charitable-bunching",
  "specVersion": "1.0.0",
  "contractUrl": "/api/v1/models/charitable-bunching",
  "specUrl": "/api/v1/models/charitable-bunching/spec",
  "inputs": {
    "filingStatus": "single",
    "agi": 765000,
    "iraDistributions": 150000,
    "age": 73,
    "annualGiving": 75000,
    "otherItemizedDeductions": 50000,
    "bunchYears": 4
  },
  "outputs": {
    "eligibleForQcd": 1,
    "qcdPerYear": 75000,
    "standardDeduction": 16100,
    "bestRoute": "qcd",
    "bestSavingVsEveryYear": 11403,
    "routes": {
      "everyYear": {
        "totalTax": 786384,
        "taxSavedVsEveryYear": 0,
        "totalDeductions": 458500,
        "itemizedYears": 4,
        "excessOverAgiLimit": 0,
        "yearlyTax": [
          196596,
          196596,
          "… 2 more"
        ]
      },
      "bunched": {
        "totalTax": 782233.2635135135,
        "taxSavedVsEveryYear": 4150.7364864865085,
        "totalDeductions": 481342.5675675675,
        "itemizedYears": 4,
        "excessOverAgiLimit": 0,
        "yearlyTax": [
          117711.5135135135,
          221507.25,
          "… 2 more"
        ]
      },
      "qcd": {
        "totalTax": 774981,
        "taxSavedVsEveryYear": 11403,
        "totalDeductions": 189318.9189189189,
        "itemizedYears": 4,
        "excessOverAgiLimit": 0,
        "yearlyTax": [
          193745.25,
          193745.25,
          "… 2 more"
        ]
      },
      "qcdBunched": {
        "totalTax": 774981,
        "taxSavedVsEveryYear": 11403,
        "totalDeductions": 189318.9189189189,
        "itemizedYears": 4,
        "excessOverAgiLimit": 0,
        "yearlyTax": [
          193745.25,
          193745.25,
          "… 2 more"
        ]
      }
    }
  },
  "sentinels": [],
  "assumptions": [
    "Implements model spec charitable-bunching v1.0.0 (Concordance-tested: independently reimplemented from the spec).",
    "agi is each year's AGI before any QCD and includes iraDistributions (values above agi are read as agi). Whole-year ages: QCD eligibility modeled at 71+. Cash gifts above the 60% AGI limit are reported, not carried forward (spec exclusions)."
  ],
  "facts": [
    {
      "id": "irs.standard-deduction.single.2026",
      "label": "Standard deduction, single filer",
      "value": 16100,
      "period": "TY2026",
      "source": "IRS TY2026 announcements (Notice 2025-67; Rev. Proc. 2025-32 newsroom page)"
    },
    {
      "id": "irs.standard-deduction.mfj.2026",
      "label": "Standard deduction, married filing jointly",
      "value": 32200,
      "period": "TY2026",
      "source": "IRS TY2026 announcements (Notice 2025-67; Rev. Proc. 2025-32 newsroom page)"
    },
    {
      "id": "irs.charitable.nonitemizer-cap.single.2026",
      "label": "Charitable deduction for non-itemizers, cash gifts cap (§170(p)), single",
      "value": 1000,
      "period": "TY2026",
      "source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70424); IRS One Big Beautiful Bill provisions page"
    },
    {
      "id": "irs.charitable.nonitemizer-cap.mfj.2026",
      "label": "Charitable deduction for non-itemizers, cash gifts cap (§170(p)), joint return",
      "value": 2000,
      "period": "TY2026",
      "source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70424); IRS One Big Beautiful Bill provisions page"
    },
    {
      "id": "irs.charitable.agi-floor.2026",
      "label": "Floor on itemized charitable deductions, share of contribution base (§170(b)(1)(I))",
      "value": 0.005,
      "period": "TY2026 onward",
      "source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70425)"
    },
    {
      "id": "irs.charitable.cash-agi-limit.2026",
      "label": "Limit on cash gifts to public charities, share of contribution base (§170(b)(1)(G)(i))",
      "value": 0.6,
      "period": "TY2026 onward",
      "source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70425(b)), as codified at 26 U.S.C. 170(b)(1)(G)(i)"
    },
    {
      "id": "irs.itemized.benefit-limit-fraction.2026",
      "label": "Reduction of itemized deductions for the 37% bracket (§68(a)), fraction",
      "value": 0.05405405405405406,
      "period": "TY2026 onward",
      "source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70111)"
    },
    {
      "id": "irs.qcd.annual-limit.2026",
      "label": "Qualified charitable distribution annual limit (§408(d)(8)(A))",
      "value": 111000,
      "period": "TY2026",
      "source": "IRS Notice 2025-67 (2026 retirement plan COLAs)"
    }
  ],
  "record": {
    "sha256": "55a7349bccf2585cd6d1eea57295d0f541f4ec25f888f093d0eee918db22d451",
    "fields": [
      "model",
      "specVersion",
      "inputs",
      "outputs"
    ],
    "model": "charitable-bunching",
    "specVersion": "1.0.0",
    "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. The signature proves Worthune minted the hash: Ed25519 over \"worthune-record:v1:\" + sha256, checked against the key with this keyId at /api/v1/records/keys.",
    "signature": {
      "alg": "Ed25519",
      "keyId": "rk_1c0d1a4f745f3947",
      "value": "rEwRq0g43UU2KYoiPfkvUrLs7DVOBEIet6mnds6-pnQ6mSEGunPe_e0J6o2yuTgYQzDeY4xK3vk6ahOZjTiBDA",
      "message": "worthune-record:v1:55a7349bccf2585cd6d1eea57295d0f541f4ec25f888f093d0eee918db22d451"
    }
  },
  "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.