@invaro/opentax 0.10.1 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bundle/index.js CHANGED
@@ -28951,7 +28951,7 @@ import { homedir } from "node:os";
28951
28951
  import { join } from "node:path";
28952
28952
 
28953
28953
  // dist/version.js
28954
- var COMPOSER_VERSION = "0.10.1";
28954
+ var COMPOSER_VERSION = "0.11.1";
28955
28955
 
28956
28956
  // dist/phone-home.js
28957
28957
  var ENDPOINT = "https://opentax.invaro.ai/api/t";
@@ -47536,11 +47536,17 @@ var facts = [
47536
47536
  rationale: "A rental is passive unless the taxpayer shows otherwise (\xA7 469(c)(2)); passive rental income is net investment income (\xA7 1411(c)(1)(A)(i), (c)(2)(A))"
47537
47537
  }
47538
47538
  },
47539
+ {
47540
+ id: "businessMilesDrivenFromJuly",
47541
+ type: "int",
47542
+ min: "0",
47543
+ description: "TY2026 only: the part of businessMilesDriven driven on or after July 1, 2026, which takes the 76\xA2/mile rate of Announcement 2026-11 (the earlier miles take 72.5\xA2, Notice 2026-10). Asked only for 2026 when businessMilesDriven is entered."
47544
+ },
47539
47545
  {
47540
47546
  id: "businessMilesDriven",
47541
47547
  type: "int",
47542
47548
  min: "0",
47543
- description: "Business miles driven for the optional standard mileage rate (70\xA2/mile for 2025 per Notice 2025-5; 72.5\xA2/mile for 2026 per Notice 2026-10) \u2014 the standalone target us.federal.vehicle_standard_mileage computes the deduction; subtract it from your Schedule C profit yourself.",
47549
+ description: "Business miles driven during the year for the optional standard mileage rate (70\xA2/mile for 2025 per Notice 2025-5; for 2026, 72.5\xA2/mile through June 30 per Notice 2026-10 and 76\xA2/mile from July 1 per Announcement 2026-11 \u2014 give the July\u2013December miles in businessMilesDrivenFromJuly) \u2014 the standalone target us.federal.vehicle_standard_mileage computes the deduction; subtract it from your Schedule C profit yourself.",
47544
47550
  default: {
47545
47551
  value: "0",
47546
47552
  rationale: "Assumed no business mileage absent contrary input"
@@ -47625,11 +47631,17 @@ var facts = [
47625
47631
  rationale: "Assumed no deductible investment interest absent contrary input"
47626
47632
  }
47627
47633
  },
47634
+ {
47635
+ id: "gamblingWinnings",
47636
+ type: "money",
47637
+ min: "0",
47638
+ description: "Gains from wagering transactions for the year (Form W-2G and all other gambling winnings) \u2014 the \xA7 165(d)(1)(B) limit on the TY2026+ gambling loss deduction. Used only for that limit: the winnings themselves must also be included in income (for example in otherOrdinaryIncome). Asked only for TY2026 and later when gamblingLossesItemized is entered. In dollars."
47639
+ },
47628
47640
  {
47629
47641
  id: "gamblingLossesItemized",
47630
47642
  type: "money",
47631
47643
  min: "0",
47632
- description: "Gambling losses deductible as an itemized deduction (\xA7 165(d), Schedule A line 16) \u2014 LIMITED TO GAMBLING WINNINGS included in income: enter min(losses paid, winnings reported), attested by the input (the engine does not track the per-session limit). TY2025: the full limited amount deducts; the OBBBA 90%-of-losses haircut (\xA7 165(d) as amended) applies only to taxable years beginning after 12/31/2025. Itemized-only; never reduces winnings directly. In dollars.",
47644
+ description: "Gambling losses for the \xA7 165(d) itemized deduction (Schedule A line 16). TY2025: enter min(losses paid, winnings reported) \u2014 the full limited amount deducts. TY2026 and later: enter the TOTAL wagering losses for the year (including any deduction incurred in carrying on a wagering transaction, \xA7 165(d)(2)); the engine allows 90 percent of them, limited to gamblingWinnings (\xA7 165(d)(1) as amended by OBBBA \xA7 70114). Itemized-only; never reduces winnings directly. In dollars.",
47633
47645
  default: {
47634
47646
  value: "0",
47635
47647
  rationale: "Assumed no deductible gambling losses absent contrary input"
@@ -47793,7 +47805,7 @@ var facts = [
47793
47805
  id: "educatorExpenses",
47794
47806
  type: "money",
47795
47807
  min: "0",
47796
- description: "TAXPAYER's eligible educator classroom expenses (\xA7 62(a)(2)(D)) \u2014 capped at $300 for 2025 (indexed). K-12 teachers/counselors/aides with 900+ hours (attested). A spouse who is ALSO an eligible educator gets a separate $300 cap: put the spouse's expenses in spouseEducatorExpenses, never summed here. In dollars.",
47808
+ description: "TAXPAYER's eligible educator classroom expenses (\xA7 62(a)(2)(D)) \u2014 capped at $300 for 2025 and $350 for 2026 and 2027 (indexed). K-12 teachers/counselors/aides with 900+ hours (attested). A spouse who is ALSO an eligible educator gets a separate cap: put the spouse's expenses in spouseEducatorExpenses, never summed here. In dollars.",
47797
47809
  default: {
47798
47810
  value: "0",
47799
47811
  rationale: "Assumed no educator expenses absent contrary input"
@@ -47803,7 +47815,7 @@ var facts = [
47803
47815
  id: "spouseEducatorExpenses",
47804
47816
  type: "money",
47805
47817
  min: "0",
47806
- description: "SPOUSE's eligible educator classroom expenses (\xA7 62(a)(2)(D)) \u2014 separately capped at $300 for 2025 (per-educator cap; an MFJ couple of two educators deducts up to $600 total). In dollars.",
47818
+ description: "SPOUSE's eligible educator classroom expenses (\xA7 62(a)(2)(D)) \u2014 separately capped at $300 for 2025 and $350 for 2026 and 2027 (per-educator cap; an MFJ couple of two educators deducts up to $600 / $700 total). In dollars.",
47807
47819
  default: {
47808
47820
  value: "0",
47809
47821
  rationale: "Assumed the spouse is not an eligible educator absent contrary input"
@@ -52450,7 +52462,7 @@ function hsaRule(version2, effectiveFrom, effectiveTo, selfCents, familyCents, s
52450
52462
  }
52451
52463
  };
52452
52464
  }
52453
- function studentLoanRule(version2, effectiveFrom, effectiveTo, jointThresholdCents, jointRangeCents, source, yearLabel) {
52465
+ function studentLoanRule(version2, effectiveFrom, effectiveTo, jointThresholdCents, jointRangeCents, source, yearLabel, thresholdCents = "8500000") {
52454
52466
  const magi2 = ruleRef("us.federal.agi_before_student_loan");
52455
52467
  const threshold2 = {
52456
52468
  kind: "if",
@@ -52485,8 +52497,7 @@ function studentLoanRule(version2, effectiveFrom, effectiveTo, jointThresholdCen
52485
52497
  parameters: {
52486
52498
  cap: { value: "250000", type: "money" },
52487
52499
  // $2,500, not indexed
52488
- threshold: { value: "8500000", type: "money" },
52489
- // $85,000
52500
+ threshold: { value: thresholdCents, type: "money" },
52490
52501
  range: { value: "1500000", type: "money" },
52491
52502
  // $15,000
52492
52503
  thresholdJoint: { value: jointThresholdCents, type: "money" },
@@ -52574,8 +52585,33 @@ function sepRule(version2, effectiveFrom, effectiveTo, limitCents, source, yearL
52574
52585
  var adjustmentRules = [
52575
52586
  hsaRule(1, "2025-01-01", "2026-01-01", "430000", "855000", "Rev. Proc. 2024-25", "2025"),
52576
52587
  hsaRule(2, "2026-01-01", "2027-01-01", "440000", "875000", "Rev. Proc. 2025-19", "2026"),
52588
+ hsaRule(3, "2027-01-01", "2028-01-01", "450000", "900000", "Rev. Proc. 2026-24 \xA7 3.01(1)", "2027"),
52577
52589
  sepRule(1, "2025-01-01", "2026-01-01", "7000000", "Notice 2024-80", "2025", "$70,000"),
52578
52590
  sepRule(2, "2026-01-01", "2027-01-01", "7200000", "Notice 2025-67", "2026", "$72,000"),
52591
+ {
52592
+ id: "us.federal.sep_deduction",
52593
+ version: 3,
52594
+ jurisdiction: "us.federal",
52595
+ title: "SEP / solo-401(k) employer contribution deduction (TY2027: the \xA7 415(c) limit is not yet published)",
52596
+ citation: {
52597
+ source: "26 U.S.C. \xA7\xA7 404(a)(8), (h), 415(c), (d)",
52598
+ section: "\xA7 404(h); \xA7 415(c)(1)(A), (d)",
52599
+ url: "https://www.law.cornell.edu/uscode/text/26/415",
52600
+ excerpt: "The deduction is limited by the \xA7 415(c)(1)(A) annual addition limit, which \xA7 415(d) adjusts each year; the IRS publishes the 2027 amount in its annual retirement-plan cost-of-living notice, which is not yet out. A 2027 return with a SEP or solo-401(k) employer contribution refuses rather than guess; with none, the deduction is $0."
52601
+ },
52602
+ effectiveFrom: "2027-01-01",
52603
+ effectiveTo: "2028-01-01",
52604
+ output: { type: "money" },
52605
+ formula: {
52606
+ kind: "if",
52607
+ cond: { kind: "cmp", op: "gt", left: fact("sepContribution"), right: zero },
52608
+ then: {
52609
+ kind: "unsupported",
52610
+ reason: "the 2027 \xA7 415(c) annual addition limit is not yet published by the IRS \u2014 a 2027 SEP or solo-401(k) employer contribution is not modeled until it is"
52611
+ },
52612
+ else: zero
52613
+ }
52614
+ },
52579
52615
  {
52580
52616
  id: "us.federal.sehi_deduction",
52581
52617
  version: 1,
@@ -52640,6 +52676,17 @@ var adjustmentRules = [
52640
52676
  // $175,000 threshold, $30,000 range ($175k–$205k)
52641
52677
  "Rev. Proc. 2025-32 \xA7 4.29",
52642
52678
  "2026"
52679
+ ),
52680
+ studentLoanRule(
52681
+ 3,
52682
+ "2027-01-01",
52683
+ "2028-01-01",
52684
+ "18000000",
52685
+ "3000000",
52686
+ // $180,000 threshold, $30,000 range ($180k–$210k)
52687
+ "Rev. Proc. 2026-35 \xA7 3.31",
52688
+ "2027",
52689
+ "9000000"
52643
52690
  )
52644
52691
  ];
52645
52692
 
@@ -52681,6 +52728,20 @@ var TY2026 = {
52681
52728
  hoh: { brackets: B26.hoh, zeroMax: 66200, fifteenMax: 579600 },
52682
52729
  mfs: { brackets: B26.mfs, zeroMax: 49450, fifteenMax: 306850 }
52683
52730
  };
52731
+ var B27 = {
52732
+ single: table([0, 12800, 52025, 109125, 208325, 264550, 661375]),
52733
+ mfj: table([0, 25600, 104050, 218250, 416650, 529100, 793650]),
52734
+ hoh: table([0, 18250, 69650, 109100, 208300, 264550, 661350]),
52735
+ mfs: table([0, 12800, 52025, 109125, 208325, 264550, 396825])
52736
+ };
52737
+ var TY2027 = {
52738
+ single: { brackets: B27.single, zeroMax: 51050, fifteenMax: 563200 },
52739
+ mfj: { brackets: B27.mfj, zeroMax: 102100, fifteenMax: 633600 },
52740
+ qss: { brackets: B27.mfj, zeroMax: 102100, fifteenMax: 633600 },
52741
+ hoh: { brackets: B27.hoh, zeroMax: 68350, fifteenMax: 598400 },
52742
+ mfs: { brackets: B27.mfs, zeroMax: 51050, fifteenMax: 316800 }
52743
+ };
52744
+ var TABLES_BY_YEAR = { "2025": TY2025, "2026": TY2026, "2027": TY2027 };
52684
52745
  var taxable = ruleRef2("us.federal.taxable_income");
52685
52746
  var ordinary = ruleRef2("us.federal.ordinary_taxable_income");
52686
52747
  function statusTax(sy) {
@@ -52884,7 +52945,7 @@ function taxTableRule(version2, effectiveFrom, effectiveTo, tables, yearLabel, m
52884
52945
  };
52885
52946
  }
52886
52947
  function ordinaryRateTaxExpr(base, statusFactId, year) {
52887
- const tables = year === "2025" ? TY2025 : TY2026;
52948
+ const tables = TABLES_BY_YEAR[year];
52888
52949
  const perStatus = (sy) => ({
52889
52950
  kind: "if",
52890
52951
  cond: { kind: "cmp", op: "lt", left: base, right: money2("10000000") },
@@ -52945,8 +53006,15 @@ var incomeTaxRules = [
52945
53006
  url: "https://www.irs.gov/pub/irs-drop/rp-25-32.pdf",
52946
53007
  excerpt: "2026 ordinary rate tables (10\u201337%); maximum zero rate amounts $49,450/$98,900/$66,200/$49,450 and maximum 15% rate amounts $545,500/$613,700/$579,600/$306,850 by filing status. Qualified Dividends and Capital Gain Tax Worksheet line 22: tax on the ordinary part from the Tax Table if it is less than $100,000, otherwise the Tax Computation Worksheet."
52947
53008
  }),
53009
+ incomeTaxRule(5, "2027-01-01", "2028-01-01", TY2027, "2027", {
53010
+ source: "26 U.S.C. \xA7 1(h), (j); Rev. Proc. 2026-35",
53011
+ section: "\xA7 1(j)(2), (j)(5); Rev. Proc. 2026-35 \xA7\xA7 3.01, 3.03",
53012
+ url: "https://www.irs.gov/pub/irs-drop/rp-26-35.pdf",
53013
+ excerpt: "2027 ordinary rate tables (10\u201337%): single 10% to $12,800, 12% to $52,025, 22% to $109,125, 24% to $208,325, 32% to $264,550, 35% to $661,375, 37% above ($396,825 MFS; joint $25,600 / $104,050 / $218,250 / $416,650 / $529,100 / $793,650; head of household $18,250 / $69,650 / $109,100 / $208,300 / $264,550 / $661,350). Maximum zero rate amounts $51,050/$102,100/$68,350/$51,050 and maximum 15% rate amounts $563,200/$633,600/$598,400/$316,800 (single/joint/head of household/MFS). Qualified Dividends and Capital Gain Tax Worksheet line 22: tax on the ordinary part from the Tax Table if it is less than $100,000, otherwise the Tax Computation Worksheet."
53014
+ }),
52948
53015
  taxTableRule(1, "2025-01-01", "2026-01-01", TY2025, "2025", "Sampled entries verified against the printed 2025 Publication 1040 table."),
52949
- taxTableRule(2, "2026-01-01", "2027-01-01", TY2026, "2026", "The official 2026 table publishes with the 2026 filing season; entries here are computed by the same published method over the 2026 brackets.")
53016
+ taxTableRule(2, "2026-01-01", "2027-01-01", TY2026, "2026", "The official 2026 table publishes with the 2026 filing season; entries here are computed by the same published method over the 2026 brackets."),
53017
+ taxTableRule(3, "2027-01-01", "2028-01-01", TY2027, "2027", "The official 2027 table publishes with the 2027 filing season; entries here are computed by the same published method over the 2027 brackets (Rev. Proc. 2026-35 \xA7 3.01).")
52950
53018
  ];
52951
53019
 
52952
53020
  // ../corpus-us-federal/dist/rules/amt.js
@@ -52978,6 +53046,7 @@ var line13 = ruleRef3("us.federal.amt.capital_gain_amount");
52978
53046
  var qdcgLine5 = ruleRef3("us.federal.ordinary_taxable_income");
52979
53047
  var SOURCE_2025 = "Form 6251 (2025) and instructions; Rev. Proc. 2024-40 \xA7 2.11";
52980
53048
  var SOURCE_2026 = "Form 6251 (2026, draft created 5/26/26); Rev. Proc. 2025-32 \xA7\xA7 3.10\u20133.11; Pub. L. 119-21 (OBBBA) \xA7 70107";
53049
+ var SOURCE_2027 = "Rev. Proc. 2026-35 \xA7\xA7 3.03, 3.11; Form 6251 line structure as on the 2026 draft (the 2027 form is not yet published); Pub. L. 119-21 (OBBBA) \xA7 70107";
52981
53050
  var F6251_URL = "https://www.irs.gov/pub/irs-pdf/f6251.pdf";
52982
53051
  var Y2025 = {
52983
53052
  year: "2025",
@@ -53019,6 +53088,26 @@ var Y2026 = {
53019
53088
  cg: TY2026,
53020
53089
  amountsNote: "For 2026: exemptions $90,100 ($140,200 joint/QSS; $70,100 MFS) phasing out at 50% of AMTI over $500,000 ($1,000,000 joint/QSS; $500,000 MFS); 26% up to $244,500 ($122,250 MFS), above that 28% less $4,890 ($2,445 MFS)."
53021
53090
  };
53091
+ var Y2027 = {
53092
+ year: "2027",
53093
+ from: "2027-01-01",
53094
+ to: "2028-01-01",
53095
+ source: SOURCE_2027,
53096
+ exemptSingle: "9300000",
53097
+ exemptJoint: "14470000",
53098
+ exemptMfs: "7235000",
53099
+ threshSingle: "51595000",
53100
+ threshJoint: "103190000",
53101
+ threshMfs: "51595000",
53102
+ phaseRate: "50",
53103
+ mfsZeroAt: "66065000",
53104
+ break28: "25250000",
53105
+ break28Mfs: "12625000",
53106
+ sub28: "505000",
53107
+ sub28Mfs: "252500",
53108
+ cg: TY2027,
53109
+ amountsNote: "For 2027: exemptions $93,000 ($144,700 joint/QSS; $72,350 MFS) phasing out at 50% of AMTI over $515,950 ($1,031,900 joint/QSS; $515,950 MFS), completely phased out at $701,950 / $1,321,300 / $660,650; 26% up to $252,500 ($126,250 MFS), above that 28% less $5,050 ($2,525 MFS)."
53110
+ };
53022
53111
  var byStatus = (single, joint, mfs) => ({
53023
53112
  kind: "match",
53024
53113
  on: fact3("filingStatus"),
@@ -53176,8 +53265,10 @@ function tmtRule(version2, y) {
53176
53265
  var amtRules = [
53177
53266
  amtiRule(1, Y2025),
53178
53267
  amtiRule(2, Y2026),
53268
+ amtiRule(3, Y2027),
53179
53269
  exemptionRule(1, Y2025),
53180
53270
  exemptionRule(2, Y2026),
53271
+ exemptionRule(3, Y2027),
53181
53272
  {
53182
53273
  id: "us.federal.amt.taxable_excess",
53183
53274
  version: 1,
@@ -53210,6 +53301,7 @@ var amtRules = [
53210
53301
  },
53211
53302
  tmtRule(1, Y2025),
53212
53303
  tmtRule(2, Y2026),
53304
+ tmtRule(3, Y2027),
53213
53305
  {
53214
53306
  id: "us.federal.amt",
53215
53307
  version: 3,
@@ -53292,7 +53384,7 @@ function cumulative(yearFactId, periodFactId) {
53292
53384
  else: zero2
53293
53385
  };
53294
53386
  }
53295
- function quarterRule(q, year, from, to, proratedLimitCents, proratedLabel, withQbiMinimum) {
53387
+ function quarterRule(q, year, from, to, proratedLimitCents, proratedLabel, qbiMinimum) {
53296
53388
  const cumWages = cumulative("wages", q.wagesFact);
53297
53389
  const cumSE = cumulative("selfEmploymentNetProfit", q.seFact);
53298
53390
  const netEarn = {
@@ -53360,11 +53452,11 @@ function quarterRule(q, year, from, to, proratedLimitCents, proratedLabel, withQ
53360
53452
  { kind: "mulRate", base: tiBeforeQbi, rate: { num: "20", den: "100" }, round: "half-up" }
53361
53453
  ]
53362
53454
  };
53363
- const qbi = withQbiMinimum ? {
53455
+ const qbi = qbiMinimum ? {
53364
53456
  kind: "if",
53365
- cond: { kind: "cmp", op: "ge", left: qbiBase, right: money4("100000") },
53366
- then: { kind: "max", args: [qbiCore, money4("40000")] },
53367
- // OBBBA $400 min
53457
+ cond: { kind: "cmp", op: "ge", left: qbiBase, right: money4(qbiMinimum.testCents) },
53458
+ then: { kind: "max", args: [qbiCore, money4(qbiMinimum.deductionCents)] },
53459
+ // § 199A(i) minimum
53368
53460
  else: qbiCore
53369
53461
  } : qbiCore;
53370
53462
  const ti = { kind: "max0", arg: { kind: "sub", left: tiBeforeQbi, right: qbi } };
@@ -53398,12 +53490,12 @@ function quarterRule(q, year, from, to, proratedLimitCents, proratedLabel, withQ
53398
53490
  };
53399
53491
  return {
53400
53492
  id: `us.federal.estimated.annualized_installment_q${q.n}`,
53401
- version: year === "2025" ? 3 : 4,
53493
+ version: { "2025": 3, "2026": 4, "2027": 5 }[year],
53402
53494
  // v1/v2 predated the per-bucket capital-loss facts in the scope guard
53403
53495
  jurisdiction: J2,
53404
53496
  title: `Annualized-income required installment #${q.n} (\xA7 6654(d)(2), TY${year})`,
53405
53497
  citation: {
53406
- source: `26 U.S.C. \xA7 6654(d)(2); ${year} Form 2210 Schedule AI`,
53498
+ source: year === "2027" ? "26 U.S.C. \xA7 6654(d)(2); Form 2210 Schedule AI as printed for 2025 (the 2027 form is not yet published); Rev. Proc. 2026-35; 91 FR 67380" : `26 U.S.C. \xA7 6654(d)(2); ${year} Form 2210 Schedule AI`,
53407
53499
  section: "\xA7 6654(d)(2); Schedule AI",
53408
53500
  url: "https://www.irs.gov/forms-pubs/about-form-2210",
53409
53501
  excerpt: `Installment #${q.n}: annualize the period's income by ${q.num === q.den ? "1" : Number(q.num) / Number(q.den)} (Schedule AI line 2), standard deduction in full (line 7), annualized SE tax per Part II (prorated social security limit ${proratedLabel}; printed factor-embedded rates), take ${Number(q.pct.num) / (Number(q.pct.den) / 100)}% of the resulting tax (line 20), subtract earlier columns' installments, and cap at 25% of the required annual payment plus amounts saved in earlier columns (lines 22\u201327). [Scope: the wage + self-employment core; anything else refuses. Per-column credits (line 18) not modeled \u2014 can only overstate an installment, conservative. Exact cents; the paper form's whole-dollar rounding may differ by small amounts. Cumulative period facts are demanded only for nonzero year amounts.]`
@@ -53426,9 +53518,23 @@ var P2025 = ["4402500", "7337500", "11740000", "17610000"];
53426
53518
  var L2025 = ["$44,025", "$73,375", "$117,400", "$176,100"];
53427
53519
  var P2026 = ["4612500", "7687500", "12300000", "18450000"];
53428
53520
  var L2026 = ["$46,125 (from the $184,500 base)", "$76,875", "$123,000", "$184,500"];
53521
+ var P2027 = ["4807500", "8012500", "12820000", "19230000"];
53522
+ var L2027 = ["$48,075 (from the $192,300 base, 91 FR 67380)", "$80,125", "$128,200", "$192,300"];
53429
53523
  var annualizedInstallmentRules = [
53430
- ...QUARTERS.map((q) => quarterRule(q, "2025", "2025-01-01", "2026-01-01", P2025[q.n - 1], L2025[q.n - 1], false)),
53431
- ...QUARTERS.map((q) => quarterRule(q, "2026", "2026-01-01", "2027-01-01", P2026[q.n - 1], L2026[q.n - 1], true))
53524
+ ...QUARTERS.map((q) => quarterRule(q, "2025", "2025-01-01", "2026-01-01", P2025[q.n - 1], L2025[q.n - 1], null)),
53525
+ ...QUARTERS.map((q) => quarterRule(q, "2026", "2026-01-01", "2027-01-01", P2026[q.n - 1], L2026[q.n - 1], {
53526
+ deductionCents: "40000",
53527
+ // $400
53528
+ testCents: "100000"
53529
+ // $1,000
53530
+ })),
53531
+ ...QUARTERS.map((q) => (
53532
+ // Rev. Proc. 2026-35 § 3.28(2): the minimum is $415 and the QBI test $1,030
53533
+ quarterRule(q, "2027", "2027-01-01", "2028-01-01", P2027[q.n - 1], L2027[q.n - 1], {
53534
+ deductionCents: "41500",
53535
+ testCents: "103000"
53536
+ })
53537
+ ))
53432
53538
  ];
53433
53539
 
53434
53540
  // ../corpus-us-federal/dist/rules/capital-losses.js
@@ -54057,7 +54163,7 @@ function section179Rule(version2, from, to, capCents, thresholdCents, capLabel,
54057
54163
  source: `26 U.S.C. \xA7 179, as amended by Pub. L. 119-21 (OBBBA \xA7 70306); ${sourceLabel}`,
54058
54164
  section: "\xA7 179(b)(1)\u2013(3)",
54059
54165
  url: "https://www.law.cornell.edu/uscode/text/26/179",
54060
- excerpt: `"The aggregate cost which may be taken into account under subsection (a) for any taxable year shall not exceed ${capLabel}" \u2014 "reduced (but not below zero) by the amount by which the cost of section 179 property placed in service during such taxable year exceeds ${thresholdLabel}" (${yearLabel}; the OBBBA amounts apply to taxable years beginning after December 31, 2024). The \xA7 179(b)(3)(A) limit caps the deduction at taxable income from the active conduct of a trade or business computed without \xA7 179 \u2014 approximated here as gross income less ordinary/depreciation/research/interest deductions, capital gains excluded (enter active amounts only if this limit binds); the excess carries forward (\xA7 179(b)(3)(B), its own target). [The \xA7 179(b)(5) SUV cap ($32,000 for 2026, Rev. Proc. 2025-32 \xA7 3.24) and the \xA7 280F passenger-auto interaction are not modeled \u2014 exclude vehicles; primary use: qualified real property that \xA7 168(k) cannot reach.]`
54166
+ excerpt: `"The aggregate cost which may be taken into account under subsection (a) for any taxable year shall not exceed ${capLabel}" \u2014 "reduced (but not below zero) by the amount by which the cost of section 179 property placed in service during such taxable year exceeds ${thresholdLabel}" (${yearLabel}; the OBBBA amounts apply to taxable years beginning after December 31, 2024). The \xA7 179(b)(3)(A) limit caps the deduction at taxable income from the active conduct of a trade or business computed without \xA7 179 \u2014 approximated here as gross income less ordinary/depreciation/research/interest deductions, capital gains excluded (enter active amounts only if this limit binds); the excess carries forward (\xA7 179(b)(3)(B), its own target). [The \xA7 179(b)(5) SUV cap (${{ TY2025: "$31,300 for 2025, Rev. Proc. 2024-40 \xA7 2.25", TY2026: "$32,000 for 2026, Rev. Proc. 2025-32 \xA7 3.24", TY2027: "$33,100 for 2027, Rev. Proc. 2026-35 \xA7 3.26" }[yearLabel]}) and the \xA7 280F passenger-auto interaction are not modeled \u2014 exclude vehicles; primary use: qualified real property that \xA7 168(k) cannot reach.]`
54061
54167
  },
54062
54168
  effectiveFrom: from,
54063
54169
  effectiveTo: to,
@@ -54281,10 +54387,14 @@ var corporate1120Rules = [
54281
54387
  },
54282
54388
  interestRule(1, "2025-01-01", "2026-01-01", "3100000000", "$31,000,000", "2025"),
54283
54389
  interestRule(2, "2026-01-01", "2027-01-01", "3200000000", "$32,000,000", "2026"),
54390
+ interestRule(3, "2027-01-01", "2028-01-01", "3300000000", "$33,000,000", "2027"),
54391
+ // Rev. Proc. 2026-35 § 3.32
54284
54392
  section179Rule(1, "2025-01-01", "2026-01-01", "250000000", "400000000", "$2,500,000", "$4,000,000", "TY2025", "Rev. Proc. 2025-32 \xA7 2.10 (OBBBA statutory amounts)"),
54285
54393
  section179Rule(2, "2026-01-01", "2027-01-01", "256000000", "409000000", "$2,560,000", "$4,090,000", "TY2026", "Rev. Proc. 2025-32 \xA7 3.24, verbatim"),
54394
+ section179Rule(3, "2027-01-01", "2028-01-01", "264000000", "423000000", "$2,640,000", "$4,230,000", "TY2027", "Rev. Proc. 2026-35 \xA7 3.26, verbatim"),
54286
54395
  section179CarryforwardRule(1, "2025-01-01", "2026-01-01", "250000000", "400000000", "TY2025"),
54287
54396
  section179CarryforwardRule(2, "2026-01-01", "2027-01-01", "256000000", "409000000", "TY2026"),
54397
+ section179CarryforwardRule(3, "2027-01-01", "2028-01-01", "264000000", "423000000", "TY2027"),
54288
54398
  corpCharitableRule(7, "2025-01-01", "2026-01-01", false, "TY2025"),
54289
54399
  corpCharitableRule(8, "2026-01-01", void 0, true, "TY2026+, permanent"),
54290
54400
  {
@@ -54847,7 +54957,8 @@ var qsbsRules = [
54847
54957
  excerpt: "For qualified small business stock acquired after July 4, 2025: 50 percent of gain excluded after a 3-year holding period, 75 percent after 4 years, 100 percent after 5 years; per-issuer limit the greater of $15,000,000 (indexed after 2026) or 10 times basis [the 10\xD7-basis alternative is not modeled \u2014 the flat cap is conservative]; issuer aggregate gross assets must not exceed $75,000,000. For stock acquired after September 27, 2010 and on or before July 4, 2025: 100 percent excluded after 5 years, $10,000,000 cap. [Assumed and disclosed: original issuance for money/services, active qualified trade or business, and the asset test; earlier-vintage stock (50%/75% legacy with \xA7 1(h)(4) 28%-rate gain and the 7% AMT preference) REFUSES. The non-excluded remainder of the new 50%/75% tiers is likewise 28%-rate gain \u2014 do not enter it as longTermCapitalGains; this target answers the exclusion amount only.]"
54848
54958
  },
54849
54959
  effectiveFrom: "2025-01-01",
54850
- // statutory: open-ended
54960
+ effectiveTo: "2027-01-01",
54961
+ // § 1202(b)(5) indexes the $15,000,000 for taxable years beginning after 2026 (v2)
54851
54962
  output: { type: "money" },
54852
54963
  parameters: {
54853
54964
  capNew: { value: "1500000000", type: "money" },
@@ -54861,6 +54972,33 @@ var qsbsRules = [
54861
54972
  then: money12("0"),
54862
54973
  else: tiers
54863
54974
  }
54975
+ },
54976
+ {
54977
+ id: "us.federal.qsbs_exclusion",
54978
+ version: 2,
54979
+ jurisdiction: "us.federal",
54980
+ title: "QSBS gain exclusion \u2014 OBBBA tiers (50/75/100% at 3/4/5 years) or prior-law 100% at 5 years",
54981
+ citation: {
54982
+ source: "26 U.S.C. \xA7 1202, as amended by Pub. L. 119-21 (OBBBA); Rev. Proc. 2026-35 \xA7 3.42(1) (the $15,000,000 limit is $15,480,000 for 2027)",
54983
+ section: "\xA7 1202(a), (b)",
54984
+ url: "https://www.law.cornell.edu/uscode/text/26/1202",
54985
+ excerpt: "For qualified small business stock acquired after July 4, 2025: 50 percent of gain excluded after a 3-year holding period, 75 percent after 4 years, 100 percent after 5 years; per-issuer limit the greater of $15,000,000 (indexed after 2026) or 10 times basis [the 10\xD7-basis alternative is not modeled \u2014 the flat cap is conservative]; issuer aggregate gross assets must not exceed $77,390,000 for 2027 (the $75,000,000 amount as adjusted, Rev. Proc. 2026-35 \xA7 3.42(2)). For stock acquired after September 27, 2010 and on or before July 4, 2025: 100 percent excluded after 5 years, $10,000,000 cap. [Assumed and disclosed: original issuance for money/services, active qualified trade or business, and the asset test; earlier-vintage stock (50%/75% legacy with \xA7 1(h)(4) 28%-rate gain and the 7% AMT preference) REFUSES. The non-excluded remainder of the new 50%/75% tiers is likewise 28%-rate gain \u2014 do not enter it as longTermCapitalGains; this target answers the exclusion amount only.]"
54986
+ },
54987
+ effectiveFrom: "2027-01-01",
54988
+ effectiveTo: "2028-01-01",
54989
+ output: { type: "money" },
54990
+ parameters: {
54991
+ capNew: { value: "1548000000", type: "money" },
54992
+ // $15,480,000 (Rev. Proc. 2026-35 § 3.42(1))
54993
+ capOld: { value: "1000000000", type: "money" }
54994
+ // $10,000,000
54995
+ },
54996
+ formula: {
54997
+ kind: "if",
54998
+ cond: { kind: "cmp", op: "eq", left: fact12("qsbsGain"), right: money12("0") },
54999
+ then: money12("0"),
55000
+ else: tiers
55001
+ }
54864
55002
  }
54865
55003
  ];
54866
55004
 
@@ -55146,7 +55284,7 @@ function adoptionAllowedRule(version2, from, to, maxCents, thresholdCents, yearL
55146
55284
  jurisdiction: J8,
55147
55285
  title: `Adoption credit after the MAGI phase-out (\xA7 23, ${yearLabel})`,
55148
55286
  citation: {
55149
- source: `26 U.S.C. \xA7 23, as amended by Pub. L. 119-21 (OBBBA) \xA7 70402; ${yearLabel === "TY2025" ? "Rev. Proc. 2024-40 \xA7 2.04" : "Rev. Proc. 2025-32 \xA7 3.04"}`,
55287
+ source: `26 U.S.C. \xA7 23, as amended by Pub. L. 119-21 (OBBBA) \xA7 70402; ${{ TY2025: "Rev. Proc. 2024-40 \xA7 2.04", TY2026: "Rev. Proc. 2025-32 \xA7 3.04", TY2027: "Rev. Proc. 2026-35 \xA7 3.04" }[yearLabel]}`,
55150
55288
  section: "\xA7 23(a)\u2013(b), (f)",
55151
55289
  url: "https://www.law.cornell.edu/uscode/text/26/23",
55152
55290
  excerpt: `${amountsExcerpt} A special-needs adoption is treated as having paid the maximum regardless of actual expenses (\xA7 23(a)(3)). The credit is reduced by the ratio of the MAGI excess over the threshold to $40,000 (\xA7 23(b)(2)(A) \u2014 the $40,000 span is NOT indexed; MAGI is AGI without \xA7\xA7 911/931/933, \xA7 23(b)(2)(B) \u2014 MAGI \u2248 AGI here, disclosed). Married taxpayers only on a joint return (\xA7 23(f)(1), rules similar to \xA7 21(e)(2)) \u2014 MFS: $0; the living-apart exception is not modeled (conservative). The \xA7 23(a)(2) expense-timing rules (year after payment for pre-final years; foreign adoptions only when final) are attested by the input.`
@@ -55226,6 +55364,7 @@ var creditBlockRules = [
55226
55364
  "The applicable percentage is '35 percent reduced (but not below 20 percent) by 1 percentage point for each $2,000 (or fraction thereof) by which the taxpayer's adjusted gross income for the taxable year exceeds $15,000' (pre-OBBBA text, in force for taxable years beginning before 2026 per OBBBA \xA7 70405(b)). Expenses capped at $3,000 (one qualifying individual) / $6,000 (two or more), \xA7 21(c), net of the \xA7 129 exclusion (netted by the input); limited to earned income \u2014 on a joint return, to the lesser spouse's earned income (\xA7 21(d)(1)). Married only on a joint return (\xA7 21(e)(2)) \u2014 MFS: $0; the \xA7 21(e)(4) living-apart exception and \xA7 21(d)(2) deemed student-spouse income are not modeled (conservative). Qualifying-individual status (\xA7 21(b)(1): dependent under 13, or incapable of self-care) is attested by the count input."
55227
55365
  ),
55228
55366
  cdccTentativeRule(4, "2026-01-01", "2027-01-01", pct2026, "TY2026: OBBBA 50% \u2192 35% \u2192 20%", "OBBBA \xA7 70405 (taxable years beginning after December 31, 2025): the applicable percentage 'means 50 percent\u2014 (A) reduced (but not below 35 percent) by 1 percentage point for each $2,000 or fraction thereof by which the taxpayer's adjusted gross income for the taxable year exceeds $15,000, and (B) further reduced (but not below 20 percent) by 1 percentage point for each $2,000 ($4,000 in the case of a joint return) or fraction thereof by which the taxpayer's adjusted gross income for the taxable year exceeds $75,000 ($150,000 in the case of a joint return).' Expense caps $3,000/$6,000 (\xA7 21(c), unindexed, unchanged by the OBBBA), limited to earned income \u2014 joint returns to the lesser spouse's earned income (\xA7 21(d)(1)). Married only on a joint return (\xA7 21(e)(2)) \u2014 MFS: $0; \xA7 21(e)(4) and \xA7 21(d)(2) not modeled (conservative). Qualifying-individual status attested by the count input."),
55367
+ cdccTentativeRule(5, "2027-01-01", "2028-01-01", pct2026, "TY2027: OBBBA 50% \u2192 35% \u2192 20%", "OBBBA \xA7 70405 (taxable years beginning after December 31, 2025): the applicable percentage 'means 50 percent\u2014 (A) reduced (but not below 35 percent) by 1 percentage point for each $2,000 or fraction thereof by which the taxpayer's adjusted gross income for the taxable year exceeds $15,000, and (B) further reduced (but not below 20 percent) by 1 percentage point for each $2,000 ($4,000 in the case of a joint return) or fraction thereof by which the taxpayer's adjusted gross income for the taxable year exceeds $75,000 ($150,000 in the case of a joint return).' None of these amounts is indexed (Rev. Proc. 2026-35 lists no \xA7 21 item), so 2027 applies them unchanged. Expense caps $3,000/$6,000 (\xA7 21(c)), limited to earned income \u2014 joint returns to the lesser spouse's earned income (\xA7 21(d)(1)). Married only on a joint return (\xA7 21(e)(2)) \u2014 MFS: $0; \xA7 21(e)(4) and \xA7 21(d)(2) not modeled (conservative). Qualifying-individual status attested by the count input."),
55229
55368
  {
55230
55369
  id: "us.federal.cdcc",
55231
55370
  version: 1,
@@ -55254,6 +55393,39 @@ var creditBlockRules = [
55254
55393
  t20: saversTier("5250000", "3937500", "2625000"),
55255
55394
  t10: saversTier("8050000", "6037500", "4025000")
55256
55395
  }, "TY2026", "Notice 2025-67", "For 2026 (Notice 2025-67): joint 50% to $48,500, 20% to $52,500, 10% to $80,500; head of household $36,375/$39,375/$60,375; all other statuses $24,250/$26,250/$40,250 \u2014 zero above."),
55396
+ {
55397
+ id: "us.federal.savers.tentative",
55398
+ version: 3,
55399
+ jurisdiction: J8,
55400
+ title: "Saver's credit before the liability limit (TY2027: ABLE contributions only; AGI limits not yet published)",
55401
+ citation: {
55402
+ source: "26 U.S.C. \xA7 25B(a), (d)(1), as amended by Pub. L. 117-328 (SECURE 2.0) \xA7 103 and Pub. L. 119-21 (OBBBA) \xA7 70116",
55403
+ section: "\xA7 25B(a), (b), (d)(1)",
55404
+ url: "https://www.law.cornell.edu/uscode/text/26/25B",
55405
+ excerpt: "From 2027, qualified retirement savings contributions are 'the amount of contributions made by the eligible individual during such taxable year to the ABLE account (within the meaning of section 529A) of which such individual is the designated beneficiary'; IRA contributions and elective deferrals count only 'in the case of any taxable year beginning before January 1, 2027' (\xA7 25B(d)(1); SECURE 2.0 \xA7 103 replaces them with the \xA7 6433 Saver's Match). The per-person cap becomes $2,100 for taxable years beginning after December 31, 2026 (OBBBA \xA7 70116(b)). The 2027 \xA7 25B(b) AGI limits are inflation-adjusted in the IRS's annual retirement-plan notice, which is not yet published \u2014 so a 2027 return with saver's contributions refuses rather than guess; with none, the credit is $0."
55406
+ },
55407
+ effectiveFrom: "2027-01-01",
55408
+ effectiveTo: "2028-01-01",
55409
+ output: { type: "money" },
55410
+ formula: {
55411
+ kind: "if",
55412
+ cond: {
55413
+ kind: "or",
55414
+ args: [
55415
+ gt03(fact13("saversContributions")),
55416
+ {
55417
+ kind: "and",
55418
+ args: [isStatus3("mfj"), gt03(fact13("saversContributionsSpouse"))]
55419
+ }
55420
+ ]
55421
+ },
55422
+ then: {
55423
+ kind: "unsupported",
55424
+ reason: "the 2027 saver's credit counts only ABLE-account contributions (\xA7 25B(d)(1) after SECURE 2.0 \xA7 103), up to $2,100, and its 2027 AGI limits are not yet published by the IRS \u2014 not modeled for 2027"
55425
+ },
55426
+ else: zero7
55427
+ }
55428
+ },
55257
55429
  {
55258
55430
  id: "us.federal.savers_credit",
55259
55431
  version: 1,
@@ -55290,8 +55462,10 @@ var creditBlockRules = [
55290
55462
  },
55291
55463
  adoptionAllowedRule(1, "2025-01-01", "2026-01-01", "1728000", "25919000", "TY2025", "For taxable years beginning in 2025, the credit allowed for an adoption of a child with special needs is $17,280; the maximum credit allowed for other adoptions is the amount of qualified adoption expenses up to $17,280; phase-out begins at modified adjusted gross income in excess of $259,190 and is complete at $299,190 (Rev. Proc. 2024-40 \xA7 2.04, verbatim)."),
55292
55464
  adoptionAllowedRule(2, "2026-01-01", "2027-01-01", "1767000", "26508000", "TY2026", "For taxable years beginning in 2026, the credit allowed for an adoption of a child with special needs is $17,670; the maximum credit allowed for other adoptions is the amount of qualified adoption expenses up to $17,670; phase-out begins at modified adjusted gross income in excess of $265,080 and is complete at $305,080 (Rev. Proc. 2025-32 \xA7 3.04, verbatim)."),
55465
+ adoptionAllowedRule(3, "2027-01-01", "2028-01-01", "1825000", "27368000", "TY2027", "For taxable years beginning in 2027, under \xA7 23(a)(3), the credit allowed for an adoption of a child with special needs is $18,250. Under \xA7 23(b)(1), the maximum credit allowed for other adoptions is the amount of qualified adoption expenses up to $18,250. The available adoption credit begins to phase out under \xA7 23(b)(2)(A) for taxpayers with modified adjusted gross income in excess of $273,680 and is completely phased out for taxpayers with modified adjusted gross income of $313,680 or more (Rev. Proc. 2026-35 \xA7 3.04)."),
55293
55466
  adoptionRefundableRule(1, "2025-01-01", "2026-01-01", "500000", "$5,000", "statutory, unindexed for 2025"),
55294
55467
  adoptionRefundableRule(2, "2026-01-01", "2027-01-01", "512000", "$5,120", "Rev. Proc. 2025-32 \xA7 3.04(3)"),
55468
+ adoptionRefundableRule(3, "2027-01-01", "2028-01-01", "528000", "$5,280", "Rev. Proc. 2026-35 \xA7 3.04(3)"),
55295
55469
  {
55296
55470
  id: "us.federal.adoption.nonrefundable",
55297
55471
  version: 2,
@@ -55414,6 +55588,42 @@ var ctcRules = [
55414
55588
  ]
55415
55589
  }
55416
55590
  },
55591
+ {
55592
+ id: "us.federal.ctc.tentative",
55593
+ version: 4,
55594
+ jurisdiction: J9,
55595
+ title: "Child tax credit + credit for other dependents, before phase-out (TY2027)",
55596
+ citation: {
55597
+ source: "26 U.S.C. \xA7 24(a), (h)(4), as amended by Pub. L. 119-21 (OBBBA) \xA7 70104; Rev. Proc. 2026-35 \xA7 3.05",
55598
+ section: "\xA7 24(a), (h)(2), (h)(4)",
55599
+ url: "https://www.law.cornell.edu/uscode/text/26/24",
55600
+ excerpt: "For taxable years beginning in 2027, the maximum amount of the credit allowed under \xA7 24(a) is $2,300 (Rev. Proc. 2026-35 \xA7 3.05(1)). \xA7 24(h)(4): 'The credit determined under subsection (a) (after the application of paragraph (2)) shall be increased by $500 for each dependent of the taxpayer (as defined in section 152) other than a qualifying child' \u2014 unindexed, never refundable (the \xA7 24(d)(1)(A) ACTC cross-reference excludes it via (h)(5)'s per-child cap), subject to the same \xA7 24(b) phase-out as part of the combined credit (Schedule 8812 line 8). [\xA7 24(h)(4)(B) noncitizen exception and the dependent's TIN requirement (\xA7 24(e)) attested by the count.]"
55601
+ },
55602
+ effectiveFrom: "2027-01-01",
55603
+ effectiveTo: "2028-01-01",
55604
+ output: { type: "money" },
55605
+ parameters: {
55606
+ perChild: { value: "230000", type: "money" },
55607
+ // $2,300
55608
+ perOtherDependent: { value: "50000", type: "money" }
55609
+ // $500, unindexed
55610
+ },
55611
+ formula: {
55612
+ kind: "add",
55613
+ args: [
55614
+ {
55615
+ kind: "mulInt",
55616
+ base: { kind: "param", name: "perChild" },
55617
+ count: fact14("qualifyingChildren")
55618
+ },
55619
+ {
55620
+ kind: "mulInt",
55621
+ base: { kind: "param", name: "perOtherDependent" },
55622
+ count: fact14("otherDependents")
55623
+ }
55624
+ ]
55625
+ }
55626
+ },
55417
55627
  {
55418
55628
  id: "us.federal.ctc.phaseout_threshold",
55419
55629
  version: 1,
@@ -55569,7 +55779,9 @@ var ctcRules = [
55569
55779
  url: "https://www.law.cornell.edu/uscode/text/26/24",
55570
55780
  excerpt: "The credit is refundable up to $1,700 per qualifying child (2025 and 2026, as adjusted), limited to 15 percent of so much of earned income as exceeds $2,500, and to the portion of the credit not used against tax. [The \xA7 24(d)(1)(B)(ii) alternative for taxpayers with 3+ children (social security taxes minus EIC) is NOT modeled \u2014 it can only increase the refund at very low earned income; disclosed. Earned income approximated as wages.]"
55571
55781
  },
55572
- ...FROM6,
55782
+ effectiveFrom: "2025-01-01",
55783
+ effectiveTo: "2027-01-01",
55784
+ // the $1,700 refundable amount is indexed; 2027 is v4
55573
55785
  output: { type: "money" },
55574
55786
  parameters: {
55575
55787
  refundableCapPerChild: { value: "170000", type: "money" },
@@ -55632,6 +55844,81 @@ var ctcRules = [
55632
55844
  ]
55633
55845
  }
55634
55846
  },
55847
+ {
55848
+ id: "us.federal.actc",
55849
+ version: 4,
55850
+ jurisdiction: J9,
55851
+ title: "Additional child tax credit \u2014 refundable, TY2027 (simplified: 3+-child SS-tax alternative not modeled)",
55852
+ citation: {
55853
+ source: "26 U.S.C. \xA7 24(d), (h)(5); Rev. Proc. 2026-35 \xA7 3.05(2)",
55854
+ section: "\xA7 24(d)(1); \xA7 24(h)(5)",
55855
+ url: "https://www.law.cornell.edu/uscode/text/26/24",
55856
+ excerpt: "The credit is refundable up to $1,800 per qualifying child (2027, as adjusted \u2014 Rev. Proc. 2026-35 \xA7 3.05(2)), limited to 15 percent of so much of earned income as exceeds $2,500, and to the portion of the credit not used against tax. [The \xA7 24(d)(1)(B)(ii) alternative for taxpayers with 3+ children (social security taxes minus EIC) is NOT modeled \u2014 it can only increase the refund at very low earned income; disclosed. Earned income approximated as wages.]"
55857
+ },
55858
+ effectiveFrom: "2027-01-01",
55859
+ effectiveTo: "2028-01-01",
55860
+ output: { type: "money" },
55861
+ parameters: {
55862
+ refundableCapPerChild: { value: "180000", type: "money" },
55863
+ // $1,800
55864
+ earnedIncomeFloor: { value: "250000", type: "money" }
55865
+ // $2,500
55866
+ },
55867
+ formula: {
55868
+ kind: "min",
55869
+ args: [
55870
+ // the part of the credit the liability limit left unused
55871
+ {
55872
+ kind: "max0",
55873
+ arg: {
55874
+ kind: "sub",
55875
+ left: ruleRef12("us.federal.ctc.after_phaseout"),
55876
+ right: ruleRef12("us.federal.ctc")
55877
+ }
55878
+ },
55879
+ // refundable cap: $1,800 per qualifying child
55880
+ {
55881
+ kind: "mulInt",
55882
+ base: { kind: "param", name: "refundableCapPerChild" },
55883
+ count: fact14("qualifyingChildren")
55884
+ },
55885
+ // 15% of earned income (wages + SE earnings net of ½ SE tax) above $2,500
55886
+ {
55887
+ kind: "mulRate",
55888
+ base: {
55889
+ kind: "max0",
55890
+ arg: {
55891
+ kind: "sub",
55892
+ left: {
55893
+ kind: "add",
55894
+ args: [
55895
+ fact14("wages"),
55896
+ {
55897
+ kind: "max0",
55898
+ arg: {
55899
+ kind: "sub",
55900
+ left: ruleRef12("us.federal.se_net_profit"),
55901
+ right: ruleRef12("us.federal.se_tax_half_deduction")
55902
+ }
55903
+ }
55904
+ ]
55905
+ },
55906
+ right: {
55907
+ kind: "add",
55908
+ args: [
55909
+ { kind: "param", name: "earnedIncomeFloor" },
55910
+ // Schedule C net loss reduces § 24(d) earned income too
55911
+ fact14("scheduleCNetLoss")
55912
+ ]
55913
+ }
55914
+ }
55915
+ },
55916
+ rate: { num: "15", den: "100" },
55917
+ round: "half-up"
55918
+ }
55919
+ ]
55920
+ }
55921
+ },
55635
55922
  {
55636
55923
  id: "us.federal.income_tax_after_credits",
55637
55924
  version: 6,
@@ -55760,9 +56047,11 @@ var dependentRules = [
55760
56047
  },
55761
56048
  qualifyingRelativeRule(1, "2025-01-01", "2026-01-01", "520000", "2025", "Rev. Proc. 2024-40 \xA7 2.24 ($5,200)"),
55762
56049
  qualifyingRelativeRule(2, "2026-01-01", "2027-01-01", "530000", "2026", "Rev. Proc. 2025-32 \xA7 4.23 ($5,300)"),
56050
+ qualifyingRelativeRule(3, "2027-01-01", "2028-01-01", "550000", "2027", "Rev. Proc. 2026-35 \xA7 3.25 ($5,500)"),
55763
56051
  ...[
55764
56052
  { version: 1, from: "2025-01-01", to: "2026-01-01", limit: "520000", year: "2025", revProc: "Rev. Proc. 2024-40 \xA7 2.24 ($5,200)" },
55765
- { version: 2, from: "2026-01-01", to: "2027-01-01", limit: "530000", year: "2026", revProc: "Rev. Proc. 2025-32 \xA7 4.23 ($5,300)" }
56053
+ { version: 2, from: "2026-01-01", to: "2027-01-01", limit: "530000", year: "2026", revProc: "Rev. Proc. 2025-32 \xA7 4.23 ($5,300)" },
56054
+ { version: 3, from: "2027-01-01", to: "2028-01-01", limit: "550000", year: "2027", revProc: "Rev. Proc. 2026-35 \xA7 3.25 ($5,500)" }
55766
56055
  ].map(({ version: version2, from, to, limit, year, revProc }) => ({
55767
56056
  id: "us.federal.dependent.qualifying_relative.multiple_support",
55768
56057
  version: version2,
@@ -56130,6 +56419,17 @@ var TY20262 = {
56130
56419
  completedMFJ0: 26820,
56131
56420
  investmentLimit: 12200
56132
56421
  };
56422
+ var TY20272 = {
56423
+ eia: [8960, 13450, 18880, 18880],
56424
+ max: [685, 4573, 7552, 8496],
56425
+ thresholdOther0: 11210,
56426
+ thresholdMFJ0: 18730,
56427
+ thresholdOtherKids: 24660,
56428
+ thresholdMFJKids: 32170,
56429
+ completedOther0: 20164,
56430
+ completedMFJ0: 27684,
56431
+ investmentLimit: 12600
56432
+ };
56133
56433
  var dollars = (d3) => (BigInt(d3) * 100n).toString();
56134
56434
  var earned = {
56135
56435
  // A Schedule C net loss reduces § 32(c)(2) earned income (Pub. 596 worksheet:
@@ -56393,6 +56693,7 @@ var eitcRules = [
56393
56693
  // netted results ("capital gain net income", § 32(i)(1)(C))
56394
56694
  eitcRule(14, "2025-01-01", "2026-01-01", TY20252, "2025", "Rev. Proc. 2024-40 \xA7 2.06"),
56395
56695
  eitcRule(15, "2026-01-01", "2027-01-01", TY20262, "2026", "Rev. Proc. 2025-32 \xA7 4.06"),
56696
+ eitcRule(16, "2027-01-01", "2028-01-01", TY20272, "2027", "Rev. Proc. 2026-35 \xA7 3.06"),
56396
56697
  // us.federal.eitc_no_age_gate (new): the same § 32(a)-(b),(f),(i) formula with
56397
56698
  // the childless § 32(c)(1)(A)(ii) age gate removed, for state EITC statutes
56398
56699
  // that decouple from it (35 ILCS 5/212(b-5)/(b-10), IL P.A. 102-700) — see
@@ -56408,6 +56709,12 @@ var eitcRules = [
56408
56709
  ageGate: false,
56409
56710
  titleSuffix: "Earned income credit, \xA7 32(c)(1)(A)(ii) childless age gate REMOVED (TY2026; for state decoupling statutes only)",
56410
56711
  extraExcerpt: NO_AGE_GATE_EXCERPT
56712
+ }),
56713
+ eitcRule(5, "2027-01-01", "2028-01-01", TY20272, "2027", "Rev. Proc. 2026-35 \xA7 3.06", {
56714
+ ruleId: "us.federal.eitc_no_age_gate",
56715
+ ageGate: false,
56716
+ titleSuffix: "Earned income credit, \xA7 32(c)(1)(A)(ii) childless age gate REMOVED (TY2027; for state decoupling statutes only)",
56717
+ extraExcerpt: NO_AGE_GATE_EXCERPT
56411
56718
  })
56412
56719
  ];
56413
56720
 
@@ -56496,9 +56803,11 @@ function feieStackingRule(version2, from, to, year) {
56496
56803
  var feieRules = [
56497
56804
  feieExclusionRule(1, "2025-01-01", "2026-01-01", "13000000", "$130,000", "Rev. Proc. 2024-40 \xA7 2.39"),
56498
56805
  feieExclusionRule(2, "2026-01-01", "2027-01-01", "13290000", "$132,900", "Rev. Proc. 2025-32 \xA7 4.39"),
56806
+ feieExclusionRule(3, "2027-01-01", "2028-01-01", "13730000", "$137,300", "Rev. Proc. 2026-35 \xA7 3.41"),
56499
56807
  // v3/v4: the preferential-income refusal guard also catches the standalone qualifiedDividends fact
56500
56808
  feieStackingRule(3, "2025-01-01", "2026-01-01", "2025"),
56501
56809
  feieStackingRule(4, "2026-01-01", "2027-01-01", "2026"),
56810
+ feieStackingRule(5, "2027-01-01", "2028-01-01", "2027"),
56502
56811
  {
56503
56812
  id: "us.federal.eitc.feie_denial",
56504
56813
  version: 1,
@@ -56584,7 +56893,8 @@ function fmt(cents) {
56584
56893
  }
56585
56894
  var fiduciaryRules = [
56586
56895
  fiduciaryRule(1, "2025-01-01", "2026-01-01", "315000", "1145000", "1565000", "TY2025", "Rev. Proc. 2024-40 \xA7 2.01"),
56587
- fiduciaryRule(2, "2026-01-01", "2027-01-01", "330000", "1170000", "1600000", "TY2026", "Rev. Proc. 2025-32 \xA7 4.01")
56896
+ fiduciaryRule(2, "2026-01-01", "2027-01-01", "330000", "1170000", "1600000", "TY2026", "Rev. Proc. 2025-32 \xA7 4.01"),
56897
+ fiduciaryRule(3, "2027-01-01", "2028-01-01", "340000", "1210000", "1650000", "TY2027", "Rev. Proc. 2026-35 \xA7 3.01")
56588
56898
  ];
56589
56899
 
56590
56900
  // ../corpus-us-federal/dist/rules/ptc.js
@@ -56699,12 +57009,14 @@ var assistanceAmount = (pctCents) => ({
56699
57009
  function ptcRule(version2, from, to, fplFirstPersonCents, fplPerAdditionalCents, tiers2, above400, yearLabel, excerpt) {
56700
57010
  const inRange = above400 === "cliff" ? {
56701
57011
  kind: "if",
57012
+ // compare the income itself to 4 × the poverty line: the floored
57013
+ // percentage reads income a few dollars over the line as 400.00%
57014
+ // (Form 8962 Worksheet 2 tests line 1 against line 2 × 4.0)
56702
57015
  cond: {
56703
57016
  kind: "cmp",
56704
57017
  op: "gt",
56705
- left: fplPercentCents,
56706
- right: money19("40000")
56707
- // 400.00%
57018
+ left: householdIncome,
57019
+ right: { kind: "mulInt", base: povertyLine, count: { kind: "int", value: "4" } }
56708
57020
  },
56709
57021
  then: zero12,
56710
57022
  else: assistanceAmount(tierChain(
@@ -56739,7 +57051,7 @@ function ptcRule(version2, from, to, fplFirstPersonCents, fplPerAdditionalCents,
56739
57051
  jurisdiction: J13,
56740
57052
  title: `Premium tax credit (\xA7 36B, ${yearLabel})`,
56741
57053
  citation: {
56742
- source: from >= "2026-01-01" ? "26 U.S.C. \xA7 36B (post-ARPA-sunset); Rev. Proc. 2025-25 \xA7 3.01; 90 FR 5917 (2025 HHS poverty guidelines)" : "26 U.S.C. \xA7 36B(b)(3)(A)(iii), (c)(1)(E) (ARPA/IRA, sunset before 2026); Rev. Proc. 2024-35 \xA7 2.01; 89 FR 2961 (2024 HHS poverty guidelines)",
57054
+ source: from >= "2027-01-01" ? "26 U.S.C. \xA7 36B, as amended by Pub. L. 119-21 (OBBBA) \xA7\xA7 71301, 71302, 71305; Rev. Proc. 2026-26 \xA7 3.01; 91 FR 1797 (2026 HHS poverty guidelines)" : from >= "2026-01-01" ? "26 U.S.C. \xA7 36B (post-ARPA-sunset); Rev. Proc. 2025-25 \xA7 3.01; 90 FR 5917 (2025 HHS poverty guidelines)" : "26 U.S.C. \xA7 36B(b)(3)(A)(iii), (c)(1)(E) (ARPA/IRA, sunset before 2026); Rev. Proc. 2024-35 \xA7 2.01; 89 FR 2961 (2024 HHS poverty guidelines)",
56743
57055
  section: "\xA7 36B(b), (c)(1), (d)",
56744
57056
  url: "https://www.law.cornell.edu/uscode/text/26/36B",
56745
57057
  excerpt
@@ -56800,6 +57112,15 @@ var TIERS_2025 = [
56800
57112
  { lo: "25000", hi: "30000", initial: "400", final: "600" },
56801
57113
  { lo: "30000", hi: "40000", initial: "600", final: "850" }
56802
57114
  ];
57115
+ var TIERS_2027 = [
57116
+ { lo: "10000", hi: "13300", initial: "215", final: "215" },
57117
+ { lo: "13300", hi: "15000", initial: "323", final: "430" },
57118
+ { lo: "15000", hi: "20000", initial: "430", final: "678" },
57119
+ { lo: "20000", hi: "25000", initial: "678", final: "866" },
57120
+ { lo: "25000", hi: "30000", initial: "866", final: "1022" },
57121
+ { lo: "30000", hi: "40001", initial: "1022", final: "1022" }
57122
+ // "but not more than 400%" — inclusive
57123
+ ];
56803
57124
  var TIERS_2026 = [
56804
57125
  { lo: "10000", hi: "13300", initial: "210", final: "210" },
56805
57126
  { lo: "13300", hi: "15000", initial: "314", final: "419" },
@@ -56888,8 +57209,8 @@ var ptcRules = [
56888
57209
  `For taxable years beginning after December 31, 2020, and before January 1, 2026, the enhanced table applies (\xA7 36B(b)(3)(A)(iii); Rev. Proc. 2024-35: 0% to 150% FPL, rising linearly to 8.5% at 300\u2013400%) and subparagraph (A) is applied 'without regard to "but does not exceed 400 percent"' (\xA7 36B(c)(1)(E)) \u2014 8.5% with NO income cliff. Premium assistance is the lesser of enrollment premiums or the excess of the SLCSP benchmark over the applicable percentage of household income (\xA7 36B(b)(2)). Household income = MAGI + tax-exempt interest + the \xA7 911 exclusion + nontaxable social security (\xA7 36B(d)(2)(B)); poverty line per the 2024 HHS guidelines (89 FR 2961: $15,060 + $5,380/person, 48 contiguous states \u2014 Alaska/Hawaii's higher guidelines not modeled, conservative). Below 100% FPL: not an applicable taxpayer \u2014 $0 (\xA7 36B(c)(1)(A); the (c)(1)(B) immigrant special rule not modeled, conservative) \u2014 unless the Marketplace estimated at enrollment that household income would be at least 100% FPL and advance payments were made (Reg. \xA7 1.36B-2(b)(6); 2025 Form 8962 instructions, 'Estimated household income at least 100% of the federal poverty line'), when the 0% first-tier percentage applies. Household income below zero counts as zero (Form 8962 line 3). Married filing separately: $0 (\xA7 36B(c)(1)(C); the abuse/abandonment exception not modeled). [Monthly computation annualized; dependents' MAGI and the \xA7 36B(c)(2) employer-coverage/affordability disqualifications attested by the inputs; Form 8962's whole-percent and 4-decimal table rounding may differ sub-dollar \u2014 statutory linear interpolation encoded.]`
56889
57210
  ),
56890
57211
  ptcRule(
56891
- 5,
56892
- // v3 gave $0 below 100% FPL even under Reg. § 1.36B-2(b)(6) and let household income go negative
57212
+ 6,
57213
+ // v5 tested the 400% cliff on the floored percentage, so income just over 4 × the poverty line kept the credit; v3 gave $0 below 100% FPL even under Reg. § 1.36B-2(b)(6) and let household income go negative
56893
57214
  "2026-01-01",
56894
57215
  "2027-01-01",
56895
57216
  "1565000",
@@ -56902,6 +57223,21 @@ var ptcRules = [
56902
57223
  "TY2026: indexed statutory table, the 400% cliff returns",
56903
57224
  "For taxable years beginning in 2026 the ARPA/IRA enhancements have sunset by their own terms: the applicable percentage comes from the indexed statutory table (Rev. Proc. 2025-25 \xA7 3.01: 2.10% under 133% FPL; 3.14\u21924.19 at 133\u2013150; 4.19\u21926.60 at 150\u2013200; 6.60\u21928.44 at 200\u2013250; 8.44\u21929.96 at 250\u2013300; 9.96 at 300\u2013400), and the term 'applicable taxpayer' again requires household income that 'does not exceed 400 percent of\u2026 the poverty line' (\xA7 36B(c)(1)(A)) \u2014 one dollar past 400% FPL destroys the entire credit. Premium assistance is the lesser of enrollment premiums or the SLCSP benchmark minus the applicable percentage of household income (\xA7 36B(b)(2)). Household income = MAGI + tax-exempt interest + the \xA7 911 exclusion + nontaxable social security (\xA7 36B(d)(2)(B)); poverty line per the 2025 HHS guidelines (90 FR 5917: $15,650 + $5,500/person, 48 contiguous states \u2014 AK/HI not modeled, conservative). Below 100% FPL: $0 (\xA7 36B(c)(1)(A); OBBBA \xA7 71302 struck the (c)(1)(B) special rule) \u2014 unless the Marketplace estimated at enrollment that household income would be at least 100% but no more than 400% FPL and advance payments were made (Reg. \xA7 1.36B-2(b)(6); 2026 draft Form 8962 instructions), when the 2.10% first-tier percentage applies. Household income below zero counts as zero (Form 8962 line 3). MFS: $0 (\xA7 36B(c)(1)(C)). [Monthly computation annualized; dependents' MAGI and employer-coverage disqualifications attested; Form 8962 rounding may differ sub-dollar.]"
56904
57225
  ),
57226
+ ptcRule(
57227
+ 7,
57228
+ // the 400% cliff tests household income against 4 × the poverty line, not the floored percentage
57229
+ "2027-01-01",
57230
+ "2028-01-01",
57231
+ "1596000",
57232
+ // $15,960 (2026 guidelines, used for TY2027)
57233
+ "568000",
57234
+ // $5,680 per additional person
57235
+ TIERS_2027,
57236
+ // over 400% FPL → not an applicable taxpayer → $0 credit
57237
+ "cliff",
57238
+ "TY2027: indexed statutory table, the 400% cliff",
57239
+ "For taxable years beginning in 2027 the applicable percentage comes from the indexed statutory table (Rev. Proc. 2026-26 \xA7 3.01: 2.15% under 133% FPL; 3.23\u21924.30 at 133\u2013150; 4.30\u21926.78 at 150\u2013200; 6.78\u21928.66 at 200\u2013250; 8.66\u219210.22 at 250\u2013300; 10.22 at 300\u2013400), and the term 'applicable taxpayer' requires household income that 'does not exceed 400 percent of\u2026 the poverty line' (\xA7 36B(c)(1)(A)). Premium assistance is the lesser of enrollment premiums or the SLCSP benchmark minus the applicable percentage of household income (\xA7 36B(b)(2)). Household income = MAGI + tax-exempt interest + the \xA7 911 exclusion + nontaxable social security (\xA7 36B(d)(2)(B)); poverty line per the 2026 HHS guidelines (91 FR 1797: $15,960 + $5,680/person, 48 contiguous states \u2014 AK/HI not modeled, conservative). Below 100% FPL: $0 (\xA7 36B(c)(1)(A)) \u2014 unless the Marketplace estimated at enrollment that household income would be at least 100% but no more than 400% FPL and advance payments were made (Reg. \xA7 1.36B-2(b)(6)), when the 2.15% first-tier percentage applies. Household income below zero counts as zero (Form 8962 line 3). MFS: $0 (\xA7 36B(c)(1)(C)). From 2027 (OBBBA \xA7 71301, effective for taxable years beginning after December 31, 2026) the credit is limited to eligible individuals as that section defines them (citizens, lawful permanent residents and the other listed groups); the inputs attest that every covered individual qualifies. Excess advance payments are repaid in full (OBBBA \xA7 71305). [Monthly computation annualized; dependents' MAGI and employer-coverage disqualifications attested; Form 8962 rounding may differ sub-dollar; the 2027 Form 8962 is not yet published.]"
57240
+ ),
56905
57241
  {
56906
57242
  id: "us.federal.ptc.net",
56907
57243
  version: 1,
@@ -57017,6 +57353,7 @@ function householdRule(version2, from, to, thresholdCents, thresholdLabel, sourc
57017
57353
  var residualRules = [
57018
57354
  householdRule(1, "2025-01-01", "2026-01-01", "280000", "$2,800", "89 FR 85276; 2025 Instructions for Schedule H"),
57019
57355
  householdRule(2, "2026-01-01", "2027-01-01", "300000", "$3,000", "90 FR 49047"),
57356
+ householdRule(3, "2027-01-01", "2028-01-01", "310000", "$3,100", "91 FR 67380 (SSA, Cost-of-Living Increase and Other Determinations for 2027)"),
57020
57357
  {
57021
57358
  id: "us.federal.estimated.required_annual_payment.farmer",
57022
57359
  version: 1,
@@ -57149,6 +57486,8 @@ function payrollRule(version2, from, to, wageBaseCents, yearLabel, baseLabel) {
57149
57486
  var employerRules = [
57150
57487
  payrollRule(1, "2025-01-01", "2026-01-01", "17610000", "2025", "$176,100"),
57151
57488
  payrollRule(2, "2026-01-01", "2027-01-01", "18450000", "2026", "$184,500"),
57489
+ payrollRule(3, "2027-01-01", "2028-01-01", "19230000", "2027", "$192,300"),
57490
+ // 91 FR 67380
57152
57491
  {
57153
57492
  id: "us.federal.credit.research_asc",
57154
57493
  version: 1,
@@ -57635,7 +57974,9 @@ var incomeRules = [
57635
57974
  url: "https://www.law.cornell.edu/uscode/text/26/62",
57636
57975
  excerpt: "adjusted gross income means gross income minus\u2026 the deduction allowed by section 164(f) [half of SE tax]\u2026 the deduction allowed by section 223 [HSA]\u2026 the deductions allowed by section 404 [self-employed retirement plans]\u2026 the deduction allowed by section 162(l) [self-employed health insurance]\u2026 the deductions\u2026 [for] expenses\u2026 of eligible educators (\xA7 62(a)(2)(D) \u2014 $300 cap PER ELIGIBLE EDUCATOR for 2025 (an MFJ couple of two educators deducts up to $600: use educatorExpenses for the taxpayer and spouseEducatorExpenses for the spouse, each capped separately), the 2025 indexed amount)\u2026 [and] penalties forfeited because of premature withdrawal of funds from time savings accounts or deposits (\xA7 62(a)(9), uncapped)."
57637
57976
  },
57638
- ...FROM10,
57977
+ effectiveFrom: "2025-01-01",
57978
+ effectiveTo: "2026-01-01",
57979
+ // the § 62(a)(2)(D) amount is indexed: $350 from 2026 (v6)
57639
57980
  output: { type: "money" },
57640
57981
  parameters: {
57641
57982
  educatorCap: { value: "30000", type: "money" }
@@ -57666,6 +58007,50 @@ var incomeRules = [
57666
58007
  ]
57667
58008
  }
57668
58009
  },
58010
+ {
58011
+ id: "us.federal.above_the_line_adjustments",
58012
+ version: 6,
58013
+ // v5 kept the 2025 $300 educator amount in 2026; Rev. Proc. 2025-32 § 4.12 sets $350 for 2026 and Rev. Proc. 2026-35 § 3.13 keeps $350 for 2027
58014
+ jurisdiction: J17,
58015
+ title: "Above-the-line adjustments before the student-loan deduction (\xBD SE tax + HSA + SEP + SE health insurance + educator + early-withdrawal penalty)",
58016
+ citation: {
58017
+ source: "26 U.S.C. \xA7 62(a)(1), (a)(2)(D), (a)(6), (a)(9), (a)(17), (a)(19)",
58018
+ section: "\xA7 62(a)",
58019
+ url: "https://www.law.cornell.edu/uscode/text/26/62",
58020
+ excerpt: "adjusted gross income means gross income minus\u2026 the deduction allowed by section 164(f) [half of SE tax]\u2026 the deduction allowed by section 223 [HSA]\u2026 the deductions allowed by section 404 [self-employed retirement plans]\u2026 the deduction allowed by section 162(l) [self-employed health insurance]\u2026 the deductions\u2026 [for] expenses\u2026 of eligible educators (\xA7 62(a)(2)(D) \u2014 $350 cap PER ELIGIBLE EDUCATOR for 2026 and 2027 (Rev. Proc. 2025-32 \xA7 4.12; Rev. Proc. 2026-35 \xA7 3.13 \u2014 an MFJ couple of two educators deducts up to $700: use educatorExpenses for the taxpayer and spouseEducatorExpenses for the spouse, each capped separately))\u2026 [and] penalties forfeited because of premature withdrawal of funds from time savings accounts or deposits (\xA7 62(a)(9), uncapped)."
58021
+ },
58022
+ effectiveFrom: "2026-01-01",
58023
+ effectiveTo: "2028-01-01",
58024
+ output: { type: "money" },
58025
+ parameters: {
58026
+ educatorCap: { value: "35000", type: "money" }
58027
+ // $350 (2026 and 2027)
58028
+ },
58029
+ formula: {
58030
+ kind: "add",
58031
+ args: [
58032
+ ruleRef20("us.federal.se_tax_half_deduction"),
58033
+ ruleRef20("us.federal.hsa_deduction"),
58034
+ ruleRef20("us.federal.sep_deduction"),
58035
+ ruleRef20("us.federal.sehi_deduction"),
58036
+ {
58037
+ kind: "min",
58038
+ args: [fact25("educatorExpenses"), { kind: "param", name: "educatorCap" }]
58039
+ },
58040
+ // § 62(a)(2)(D): the $300 cap is PER eligible educator — a spouse who
58041
+ // is also an eligible educator gets their own cap
58042
+ {
58043
+ kind: "min",
58044
+ args: [fact25("spouseEducatorExpenses"), { kind: "param", name: "educatorCap" }]
58045
+ },
58046
+ fact25("earlyWithdrawalPenaltyPaid"),
58047
+ // pre-TCJA § 215/§ 62(a)(10): pre-2019-instrument alimony paid
58048
+ fact25("alimonyPaidPre2019"),
58049
+ // Schedule 1 lines 24a-z write-in adjustments (attested total)
58050
+ fact25("otherAdjustments")
58051
+ ]
58052
+ }
58053
+ },
57669
58054
  {
57670
58055
  id: "us.federal.agi_before_student_loan",
57671
58056
  version: 2,
@@ -57997,6 +58382,7 @@ var internationalAndRemainderRules = [
57997
58382
  section250Rule(2, "2026-01-01", void 0, { num: "3334", den: "10000" }, { num: "40", den: "100" }, "TY2026+: 33.34% of FDDEI + 40% of NCTI (OBBBA)", "For taxable years beginning after December 31, 2025 (OBBBA): FDII becomes FOREIGN-DERIVED DEDUCTION ELIGIBLE INCOME and GILTI becomes NET CFC TESTED INCOME, QBAI (the 10% deemed tangible return) is ABOLISHED, and the deduction is 33.34 percent of FDDEI plus 40 percent of NCTI (effective rates 14% and 12.6\u201314%), limited by \xA7 250(a)(2) pro-rata scaling against taxable income computed without this section. [Include the \xA7 78 gross-up in the NCTI input; the 90% NCTI foreign-tax-credit allowance and \xA7 59A BEAT (10.5% from 2026) are not modeled \u2014 disclosed.]"),
57998
58383
  eblRule(1, "2025-01-01", "2026-01-01", "31300000", "62600000", "2025 Instructions for Form 461", "2025", "$313,000 ($626,000 for joint returns) for 2025"),
57999
58384
  eblRule(2, "2026-01-01", "2027-01-01", "25600000", "51200000", "Rev. Proc. 2025-32 \xA7 3.31", "2026", '"$256,000 ($512,000 for joint returns)" for 2026 (Rev. Proc. 2025-32 \xA7 3.31, verbatim \u2014 a DECREASE from 2025)'),
58385
+ eblRule(3, "2027-01-01", "2028-01-01", "26400000", "52800000", "Rev. Proc. 2026-35 \xA7 3.33", "2027", '"$264,000 ($528,000 for joint returns)" for 2027 (Rev. Proc. 2026-35 \xA7 3.33, verbatim)'),
58000
58386
  {
58001
58387
  id: "us.federal.corp.gbc_allowed",
58002
58388
  version: 2,
@@ -58268,8 +58654,8 @@ var investmentTaxRules = [
58268
58654
  },
58269
58655
  {
58270
58656
  id: "us.federal.additional_medicare_tax",
58271
- version: 4,
58272
- // v3 had one self-employed person; Form 8959 line 8 combines both spouses' Schedule SE line 6 on a joint return. v2 rounded once combined; the printed Form 8959 rounds Parts I and II per line
58657
+ version: 5,
58658
+ // v4 counted net earnings under $400, which are not self-employment income (§ 1402(b); Schedule SE line 6 is blank when line 4c is under $400). v3 had one self-employed person; Form 8959 line 8 combines both spouses' Schedule SE line 6 on a joint return. v2 rounded once combined; the printed Form 8959 rounds Parts I and II per line
58273
58659
  jurisdiction: "us.federal",
58274
58660
  title: "Additional Medicare Tax (0.9%; Form 8959 uses medicareWages box 5 when given, else box-1 wages)",
58275
58661
  citation: {
@@ -58294,11 +58680,21 @@ var investmentTaxRules = [
58294
58680
  round: "half-up"
58295
58681
  });
58296
58682
  const wagesPart = pct09({ kind: "max0", arg: { kind: "sub", left: mw, right: amThreshold } });
58683
+ const seIncome = (ruleId) => ({
58684
+ kind: "if",
58685
+ cond: { kind: "cmp", op: "lt", left: ruleRef22(ruleId), right: money24("40000") },
58686
+ then: money24("0"),
58687
+ else: ruleRef22(ruleId)
58688
+ });
58689
+ const line8 = {
58690
+ kind: "add",
58691
+ args: [seIncome("us.federal.se_net_earnings"), seIncome("us.federal.se_net_earnings.spouse")]
58692
+ };
58297
58693
  const sePart = pct09({
58298
58694
  kind: "max0",
58299
58695
  arg: {
58300
58696
  kind: "sub",
58301
- left: { kind: "add", args: [ruleRef22("us.federal.se_net_earnings"), ruleRef22("us.federal.se_net_earnings.spouse")] },
58697
+ left: line8,
58302
58698
  right: { kind: "max0", arg: { kind: "sub", left: amThreshold, right: mw } }
58303
58699
  }
58304
58700
  });
@@ -58306,7 +58702,7 @@ var investmentTaxRules = [
58306
58702
  kind: "max0",
58307
58703
  arg: {
58308
58704
  kind: "sub",
58309
- left: { kind: "add", args: [mw, { kind: "add", args: [ruleRef22("us.federal.se_net_earnings"), ruleRef22("us.federal.se_net_earnings.spouse")] }] },
58705
+ left: { kind: "add", args: [mw, line8] },
58310
58706
  right: amThreshold
58311
58707
  }
58312
58708
  });
@@ -58565,7 +58961,31 @@ var iraRules = [
58565
58961
  // $129,000
58566
58962
  thresholdSpousal: "24200000"
58567
58963
  // $242,000
58568
- }, "Notice 2025-67", "For 2026 the deductible amount rises to $7,500 ($8,600 if age 50+ \u2014 the $1,100 catch-up is the first indexed increase under \xA7 219(b)(5)(C)); phase-out ranges $81,000\u2013$91,000 (single/HoH), $129,000\u2013$149,000 (joint/QSS), $0\u2013$10,000 (MFS \u2014 but \xA7 219(g)(4): an MFS filer who lived apart from the spouse at ALL times during the year is not treated as married, so the single range applies and no spousal attribution occurs; set mfsLivedApartAllYear); $242,000\u2013$252,000 where only the spouse participates.")
58964
+ }, "Notice 2025-67", "For 2026 the deductible amount rises to $7,500 ($8,600 if age 50+ \u2014 the $1,100 catch-up is the first indexed increase under \xA7 219(b)(5)(C)); phase-out ranges $81,000\u2013$91,000 (single/HoH), $129,000\u2013$149,000 (joint/QSS), $0\u2013$10,000 (MFS \u2014 but \xA7 219(g)(4): an MFS filer who lived apart from the spouse at ALL times during the year is not treated as married, so the single range applies and no spousal attribution occurs; set mfsLivedApartAllYear); $242,000\u2013$252,000 where only the spouse participates."),
58965
+ {
58966
+ id: "us.federal.ira_deduction",
58967
+ version: 4,
58968
+ jurisdiction: J19,
58969
+ title: "Traditional IRA deduction (TY2027: the \xA7 219 amounts are not yet published)",
58970
+ citation: {
58971
+ source: "26 U.S.C. \xA7 219(b)(5), (g)",
58972
+ section: "\xA7 219(b)(5)(C), (D); \xA7 219(g)(8)",
58973
+ url: "https://www.law.cornell.edu/uscode/text/26/219",
58974
+ excerpt: "The deductible amount, its catch-up and the active-participant phase-out ranges are inflation-adjusted each year (\xA7 219(b)(5)(C)\u2013(D), (g)(8)); the IRS publishes the 2027 amounts in its annual retirement-plan cost-of-living notice, which is not yet out. A 2027 return with a traditional IRA contribution refuses rather than guess; with none, the deduction is $0."
58975
+ },
58976
+ effectiveFrom: "2027-01-01",
58977
+ effectiveTo: "2028-01-01",
58978
+ output: { type: "money" },
58979
+ formula: {
58980
+ kind: "if",
58981
+ cond: { kind: "cmp", op: "gt", left: fact28("iraContribution"), right: { kind: "money", cents: "0" } },
58982
+ then: {
58983
+ kind: "unsupported",
58984
+ reason: "the 2027 IRA deduction limits and phase-out ranges are not yet published by the IRS \u2014 a 2027 traditional IRA contribution is not modeled until they are"
58985
+ },
58986
+ else: { kind: "money", cents: "0" }
58987
+ }
58988
+ }
58569
58989
  ];
58570
58990
 
58571
58991
  // ../corpus-us-federal/dist/rules/ira-8606.js
@@ -58770,6 +59190,14 @@ var itemizedRules = [
58770
59190
  { cap: "4040000", threshold: "50500000", thresholdMfs: "25250000" },
58771
59191
  { year: "2026", cap: "$40,400", capHalf: "20,200", threshold: "$505,000" }
58772
59192
  ),
59193
+ saltRule(
59194
+ 5,
59195
+ "2027-01-01",
59196
+ "2028-01-01",
59197
+ // § 164(b)(7)(A)(iii), (B)(ii)(III): 101 percent of the 2026 amounts
59198
+ { cap: "4080400", threshold: "51005000", thresholdMfs: "25502500" },
59199
+ { year: "2027", cap: "$40,804", capHalf: "20,402", threshold: "$510,050" }
59200
+ ),
58773
59201
  {
58774
59202
  id: "us.federal.mortgage_interest_deduction",
58775
59203
  version: 1,
@@ -58920,17 +59348,60 @@ var itemizedRules = [
58920
59348
  ]
58921
59349
  }
58922
59350
  },
59351
+ {
59352
+ id: "us.federal.gambling_loss_deduction",
59353
+ version: 1,
59354
+ jurisdiction: J21,
59355
+ title: "Gambling loss deduction (\xA7 165(d), Schedule A line 16; TY2025: the attested winnings-limited amount)",
59356
+ citation: {
59357
+ source: "26 U.S.C. \xA7 165(d) (as in effect for 2025)",
59358
+ section: "\xA7 165(d)",
59359
+ url: "https://www.law.cornell.edu/uscode/text/26/165",
59360
+ excerpt: "'Losses from wagering transactions shall be allowed only to the extent of the gains from such transactions' (\xA7 165(d) before OBBBA \xA7 70114, which applies to taxable years beginning after December 31, 2025). The input attests the winnings-limited amount."
59361
+ },
59362
+ effectiveFrom: "2025-01-01",
59363
+ effectiveTo: "2026-01-01",
59364
+ output: { type: "money" },
59365
+ formula: fact30("gamblingLossesItemized")
59366
+ },
59367
+ {
59368
+ id: "us.federal.gambling_loss_deduction",
59369
+ version: 2,
59370
+ jurisdiction: J21,
59371
+ title: "Gambling loss deduction (\xA7 165(d) as amended by OBBBA: 90 percent of losses, limited to winnings)",
59372
+ citation: {
59373
+ source: "26 U.S.C. \xA7 165(d), as amended by Pub. L. 119-21 (OBBBA) \xA7 70114",
59374
+ section: "\xA7 165(d)(1)",
59375
+ url: "https://www.law.cornell.edu/uscode/text/26/165",
59376
+ excerpt: "For purposes of losses from wagering transactions, the amount allowed as a deduction for any taxable year\u2014 '(A) shall be equal to 90 percent of the amount of such losses during such taxable year, and (B) shall be allowed only to the extent of the gains from such transactions during such taxable year' (\xA7 165(d)(1)); 'losses from wagering transactions' includes any deduction otherwise allowable incurred in carrying on any wagering transaction (\xA7 165(d)(2)). Effective for taxable years beginning after December 31, 2025 (OBBBA \xA7 70114(b))."
59377
+ },
59378
+ effectiveFrom: "2026-01-01",
59379
+ // permanent: open-ended
59380
+ output: { type: "money" },
59381
+ formula: {
59382
+ kind: "if",
59383
+ cond: { kind: "cmp", op: "gt", left: fact30("gamblingLossesItemized"), right: zero18 },
59384
+ then: {
59385
+ kind: "min",
59386
+ args: [
59387
+ { kind: "mulRate", base: fact30("gamblingLossesItemized"), rate: { num: "90", den: "100" }, round: "half-up" },
59388
+ fact30("gamblingWinnings")
59389
+ ]
59390
+ },
59391
+ else: zero18
59392
+ }
59393
+ },
58923
59394
  {
58924
59395
  id: "us.federal.itemized_deductions_before_limitation",
58925
- version: 4,
58926
- // v2 lacked investment interest (§ 163(d)) and noncash charitable; v4 adds gambling losses (§ 165(d), Schedule A line 16) as an attested-limited fact
59396
+ version: 5,
59397
+ // v4 added the attested gambling loss fact at 100% in every year; v5 takes us.federal.gambling_loss_deduction (90% from 2026). v2 lacked investment interest (§ 163(d)) and noncash charitable
58927
59398
  jurisdiction: J21,
58928
59399
  title: "Itemized deductions before the \xA7 68 overall limitation (SALT + mortgage + charitable cash/noncash + medical + casualty + investment interest + gambling losses)",
58929
59400
  citation: {
58930
59401
  source: "26 U.S.C. \xA7 63(d)",
58931
59402
  section: "\xA7 63(d)",
58932
59403
  url: "https://www.law.cornell.edu/uscode/text/26/63",
58933
- excerpt: "'Itemized deductions' means the deductions allowable under this chapter other than (1) the deductions allowable in arriving at adjusted gross income, and (2) any deduction referred to in any paragraph of subsection (b). [Modeled Schedule A lines: taxes (\xA7 164), home mortgage interest (\xA7 163(h)), gifts to charity (\xA7 170) \u2014 cash via the limited charitable rule, noncash as the attested-allowed Form 8283 amount \u2014 medical (\xA7 213), casualty losses (\xA7 165(h), Form 4684), investment interest (\xA7 163(d)) as the attested post-Form-4952 allowed amount, and gambling losses (\xA7 165(d), Schedule A line 16) as the attested winnings-limited amount (TY2025: 100% of the limited amount; the OBBBA 90% haircut begins TY2026). Other miscellaneous itemized deductions are not modeled \u2014 conservative.]"
59404
+ excerpt: "'Itemized deductions' means the deductions allowable under this chapter other than (1) the deductions allowable in arriving at adjusted gross income, and (2) any deduction referred to in any paragraph of subsection (b). [Modeled Schedule A lines: taxes (\xA7 164), home mortgage interest (\xA7 163(h)), gifts to charity (\xA7 170) \u2014 cash via the limited charitable rule, noncash as the attested-allowed Form 8283 amount \u2014 medical (\xA7 213), casualty losses (\xA7 165(h), Form 4684), investment interest (\xA7 163(d)) as the attested post-Form-4952 allowed amount, and gambling losses (\xA7 165(d), Schedule A line 16) from us.federal.gambling_loss_deduction (TY2025: the attested winnings-limited amount; TY2026+: 90 percent of the losses, limited to the winnings). Other miscellaneous itemized deductions are not modeled \u2014 conservative.]"
58934
59405
  },
58935
59406
  effectiveFrom: "2025-01-01",
58936
59407
  // structural: open-ended
@@ -58945,7 +59416,7 @@ var itemizedRules = [
58945
59416
  ruleRef24("us.federal.medical_expense_deduction"),
58946
59417
  ruleRef24("us.federal.casualty_loss_deduction"),
58947
59418
  fact30("investmentInterestDeduction"),
58948
- fact30("gamblingLossesItemized"),
59419
+ ruleRef24("us.federal.gambling_loss_deduction"),
58949
59420
  fact30("otherItemizedDeductions")
58950
59421
  ]
58951
59422
  }
@@ -59053,6 +59524,93 @@ var itemizedRules = [
59053
59524
  };
59054
59525
  })()
59055
59526
  },
59527
+ {
59528
+ id: "us.federal.itemized_deductions",
59529
+ version: 3,
59530
+ jurisdiction: J21,
59531
+ title: "Itemized deductions after the \xA7 68 overall limitation (TY2027: 2/37 of the amount over the 37% bracket)",
59532
+ citation: {
59533
+ source: "26 U.S.C. \xA7 68, as amended by Pub. L. 119-21 (OBBBA) \xA7 70111; Rev. Proc. 2026-35 \xA7 3.01",
59534
+ section: "\xA7 68(a), (b)",
59535
+ url: "https://www.law.cornell.edu/uscode/text/26/68",
59536
+ excerpt: "For taxable years beginning after December 31, 2025, itemized deductions are reduced by 2/37 of the lesser of (1) such amount of itemized deductions, or (2) so much of the taxable income of the taxpayer for the taxable year (determined without regard to this section and increased by such amount of itemized deductions) as exceeds the dollar amount at which the 37 percent rate bracket under section 1 begins (Rev. Proc. 2026-35 \xA7 3.01: $661,375 single, $661,350 head of household, $793,650 MFJ/QSS, $396,825 MFS for 2027); applied after the application of any other limitation (\xA7 68(b)). [The taxable-income term nets out every deduction except the itemized deductions themselves; the \xA7 199A interaction is NOT modeled \u2014 when both would apply, this rule refuses rather than guess.]"
59537
+ },
59538
+ effectiveFrom: "2027-01-01",
59539
+ effectiveTo: "2028-01-01",
59540
+ // the 37%-bracket start is indexed
59541
+ output: { type: "money" },
59542
+ formula: (() => {
59543
+ const itemizedPre = ruleRef24("us.federal.itemized_deductions_before_limitation");
59544
+ const tiIncreased = {
59545
+ kind: "max0",
59546
+ arg: {
59547
+ kind: "sub",
59548
+ left: agi,
59549
+ right: {
59550
+ kind: "add",
59551
+ args: [
59552
+ ruleRef24("us.federal.senior_deduction"),
59553
+ ruleRef24("us.federal.tips_deduction"),
59554
+ ruleRef24("us.federal.overtime_deduction"),
59555
+ ruleRef24("us.federal.car_loan_interest_deduction")
59556
+ ]
59557
+ }
59558
+ }
59559
+ };
59560
+ const bracket37Start = {
59561
+ kind: "match",
59562
+ on: fact30("filingStatus"),
59563
+ cases: [
59564
+ { when: "single", value: money27("66137500") },
59565
+ // $661,375
59566
+ { when: "hoh", value: money27("66135000") },
59567
+ // $661,350
59568
+ { when: "mfj", value: money27("79365000") },
59569
+ // $793,650
59570
+ { when: "qss", value: money27("79365000") },
59571
+ // $793,650
59572
+ { when: "mfs", value: money27("39682500") }
59573
+ // $396,825
59574
+ ]
59575
+ };
59576
+ const reductionBase = {
59577
+ kind: "min",
59578
+ args: [
59579
+ itemizedPre,
59580
+ { kind: "max0", arg: { kind: "sub", left: tiIncreased, right: bracket37Start } }
59581
+ ]
59582
+ };
59583
+ return {
59584
+ kind: "if",
59585
+ cond: {
59586
+ kind: "and",
59587
+ args: [
59588
+ {
59589
+ kind: "cmp",
59590
+ op: "gt",
59591
+ left: ruleRef24("us.federal.se_net_profit"),
59592
+ right: zero18
59593
+ },
59594
+ { kind: "cmp", op: "gt", left: reductionBase, right: zero18 }
59595
+ ]
59596
+ },
59597
+ then: {
59598
+ kind: "unsupported",
59599
+ reason: "the \xA7 68 overall limitation and the \xA7 199A deduction interact through the taxable-income term \u2014 this combination is not modeled yet"
59600
+ },
59601
+ else: {
59602
+ kind: "sub",
59603
+ left: itemizedPre,
59604
+ right: {
59605
+ kind: "mulRate",
59606
+ base: reductionBase,
59607
+ rate: { num: "2", den: "37" },
59608
+ round: "half-up"
59609
+ }
59610
+ }
59611
+ };
59612
+ })()
59613
+ },
59056
59614
  {
59057
59615
  id: "us.federal.deduction_election",
59058
59616
  version: 3,
@@ -59203,12 +59761,41 @@ var kiddieRules = [
59203
59761
  ]
59204
59762
  }
59205
59763
  },
59764
+ {
59765
+ id: "us.federal.kiddie.net_unearned_income",
59766
+ version: 2,
59767
+ jurisdiction: J22,
59768
+ title: "Net unearned income of a \xA7 1(g) child (TY2027)",
59769
+ citation: {
59770
+ ...CITE4,
59771
+ section: "\xA7 1(g)(4); Rev. Proc. 2026-35 \xA7 3.02",
59772
+ excerpt: "\u2026the excess of the portion of adjusted gross income\u2026 not attributable to earned income, over the sum of the amount in effect under section 63(c)(5)(A) ($1,400 for taxable years beginning in 2027 \u2014 Rev. Proc. 2026-35 \xA7 3.02: 'the amount in \xA7 1(g)(4)(A)(ii)(I)\u2026 is $1,400') plus the greater of that amount or the itemized deductions directly connected \u2014 $2,800 with none such (child itemized deductions not modeled); shall not exceed the child's taxable income. [Unearned income \u2248 taxable interest \u2014 the child's capital gains refuse in the tax rule; disclosed.]"
59773
+ },
59774
+ effectiveFrom: "2027-01-01",
59775
+ effectiveTo: "2028-01-01",
59776
+ output: { type: "money" },
59777
+ parameters: {
59778
+ threshold: { value: "280000", type: "money" }
59779
+ // $2,800 = 2 × $1,400
59780
+ },
59781
+ formula: {
59782
+ kind: "min",
59783
+ args: [
59784
+ {
59785
+ kind: "max0",
59786
+ arg: { kind: "sub", left: fact31("taxableInterest"), right: param17("threshold") }
59787
+ },
59788
+ ruleRef25("us.federal.taxable_income")
59789
+ ]
59790
+ }
59791
+ },
59206
59792
  // v3/v4: the § 1(g) capital-gains refusal guard also catches the standalone qualifiedDividends fact
59207
59793
  // v5/v6: the refusal guard also catches shortTermCapitalGains/ordinaryDividends (unearned income
59208
59794
  // the "unearned income ≈ taxable interest" approximation in net_unearned_income would otherwise drop)
59209
59795
  // v5/v6: the refusal guard predated the per-bucket capital-loss facts and netCapitalLoss
59210
59796
  kiddieTaxRule(7, "2025-01-01", "2026-01-01", "2025"),
59211
59797
  kiddieTaxRule(8, "2026-01-01", "2027-01-01", "2026"),
59798
+ kiddieTaxRule(9, "2027-01-01", "2028-01-01", "2027"),
59212
59799
  {
59213
59800
  id: "us.federal.income_tax_before_credits.kiddie",
59214
59801
  version: 1,
@@ -59225,6 +59812,23 @@ var kiddieRules = [
59225
59812
  applicability: fact31("isSubjectToKiddieTax"),
59226
59813
  formula: ruleRef25("us.federal.kiddie_tax"),
59227
59814
  overrides: { ruleId: "us.federal.income_tax_before_credits", priority: 20 }
59815
+ },
59816
+ {
59817
+ id: "us.federal.income_tax_before_credits.kiddie",
59818
+ version: 2,
59819
+ jurisdiction: J22,
59820
+ title: "\xA7 1(g) override: a kiddie child's income tax is the Form 8615 tax",
59821
+ citation: {
59822
+ ...CITE4,
59823
+ section: "\xA7 1(g)(1)",
59824
+ excerpt: "In the case of any child to whom this subsection applies, the tax imposed by this section shall be equal to the greater of [the regular tax or the Form 8615 sum] \u2014 this override replaces the ordinary income-tax computation (including the Tax Table method, which the Form 8615 computation applies internally)."
59825
+ },
59826
+ effectiveFrom: "2027-01-01",
59827
+ effectiveTo: "2028-01-01",
59828
+ output: { type: "money" },
59829
+ applicability: fact31("isSubjectToKiddieTax"),
59830
+ formula: ruleRef25("us.federal.kiddie_tax"),
59831
+ overrides: { ruleId: "us.federal.income_tax_before_credits", priority: 20 }
59228
59832
  }
59229
59833
  ];
59230
59834
 
@@ -59471,7 +60075,66 @@ function mileageRule(version2, from, to, rateNum, rateLabel, noticeLabel) {
59471
60075
  }
59472
60076
  var mileageRules = [
59473
60077
  mileageRule(1, "2025-01-01", "2026-01-01", "700", "70 cents", "Notice 2025-5"),
59474
- mileageRule(2, "2026-01-01", "2027-01-01", "725", "72.5 cents", "Notice 2026-10")
60078
+ {
60079
+ id: "us.federal.vehicle_standard_mileage",
60080
+ version: 3,
60081
+ // v2 applied 72.5¢ to every 2026 mile; Announcement 2026-11 raised the rate to 76¢ from July 1, 2026
60082
+ jurisdiction: J23,
60083
+ title: "Business standard mileage deduction (2026: 72.5 cents/mile through June 30, 76 cents/mile from July 1)",
60084
+ citation: {
60085
+ source: "Notice 2026-10; Announcement 2026-11 (2026-29 I.R.B.); Rev. Proc. 2019-46",
60086
+ section: "Announcement 2026-11",
60087
+ url: "https://www.irs.gov/irb/2026-29_irb",
60088
+ excerpt: "Notice 2026-10 set the 2026 business standard mileage rate at 72.5 cents per mile. Announcement 2026-11 revised it: 'The revised standard mileage rates are: (1) Business 76 cents per mile' and they 'apply to deductible transportation expenses paid or incurred for business\u2026 on or after July 1, 2026'; 'The standard mileage rates set forth in Notice 2026-10 continue to apply to deductible transportation expenses paid or incurred\u2026 before July 1, 2026.' [A STANDALONE determination in lieu of actual vehicle expenses (Rev. Proc. 2019-46 rules attested): subtract the result from your Schedule C profit yourself \u2014 it changes SE tax and QBI.]"
60089
+ },
60090
+ effectiveFrom: "2026-01-01",
60091
+ effectiveTo: "2027-01-01",
60092
+ output: { type: "money" },
60093
+ formula: {
60094
+ kind: "if",
60095
+ cond: {
60096
+ kind: "cmp",
60097
+ op: "gt",
60098
+ left: fact32("businessMilesDriven"),
60099
+ right: { kind: "int", value: "0" }
60100
+ },
60101
+ then: {
60102
+ kind: "if",
60103
+ cond: {
60104
+ kind: "cmp",
60105
+ op: "gt",
60106
+ left: fact32("businessMilesDrivenFromJuly"),
60107
+ right: fact32("businessMilesDriven")
60108
+ },
60109
+ then: {
60110
+ kind: "unsupported",
60111
+ reason: "businessMilesDrivenFromJuly is part of businessMilesDriven and cannot exceed it"
60112
+ },
60113
+ else: {
60114
+ kind: "add",
60115
+ args: [
60116
+ {
60117
+ kind: "mulRate",
60118
+ base: {
60119
+ kind: "mulInt",
60120
+ base: money29("100"),
60121
+ count: { kind: "sub", left: fact32("businessMilesDriven"), right: fact32("businessMilesDrivenFromJuly") }
60122
+ },
60123
+ rate: { num: "725", den: "1000" },
60124
+ round: "half-up"
60125
+ },
60126
+ {
60127
+ kind: "mulRate",
60128
+ base: { kind: "mulInt", base: money29("100"), count: fact32("businessMilesDrivenFromJuly") },
60129
+ rate: { num: "760", den: "1000" },
60130
+ round: "half-up"
60131
+ }
60132
+ ]
60133
+ }
60134
+ },
60135
+ else: money29("0")
60136
+ }
60137
+ }
59475
60138
  ];
59476
60139
 
59477
60140
  // ../corpus-us-federal/dist/rules/pension.js
@@ -59788,7 +60451,9 @@ var actcMaximum = {
59788
60451
  url: "https://www.irs.gov/instructions/i1040s8",
59789
60452
  excerpt: "Worksheet B line 2: number of qualifying children under age 17 with the required social security number \xD7 $1,700; line 4: earned income over $2,500; line 5: 15% of line 4; line 13: the smaller of line 2 or line 12. [Line 12 is the larger of line 5 and the 3+-child social security tax alternative (lines 6\u201311), which is NOT modeled \u2014 it can only raise the maximum at very low earned income; disclosed. Earned income approximated as wages + self-employment earnings net of the \xBD SE deduction, less a Schedule C net loss.]"
59790
60453
  },
59791
- ...FROM15,
60454
+ effectiveFrom: "2025-01-01",
60455
+ effectiveTo: "2027-01-01",
60456
+ // the § 24(h)(5) amount is indexed: $1,800 for 2027 (v2)
59792
60457
  output: { type: "money" },
59793
60458
  parameters: {
59794
60459
  refundableCapPerChild: { value: "170000", type: "money" },
@@ -59803,6 +60468,33 @@ var actcMaximum = {
59803
60468
  round: "half-up"
59804
60469
  })
59805
60470
  };
60471
+ var actcMaximum2027 = {
60472
+ id: `${J26}.actc.maximum`,
60473
+ version: 2,
60474
+ jurisdiction: J26,
60475
+ title: "Maximum additional child tax credit (Schedule 8812 Credit Limit Worksheet B, line 13; TY2027)",
60476
+ citation: {
60477
+ source: "26 U.S.C. \xA7 24(d)(1), (h)(5); Rev. Proc. 2026-35 \xA7 3.05(2); Credit Limit Worksheet B as in the 2025 Instructions for Schedule 8812",
60478
+ section: "\xA7 24(d)(1)(B)(i); \xA7 24(h)(5)",
60479
+ url: "https://www.irs.gov/instructions/i1040s8",
60480
+ excerpt: "Worksheet B line 2: number of qualifying children under age 17 with the required social security number \xD7 $1,800 (the 2027 \xA7 24(d)(1)(A) amount, Rev. Proc. 2026-35 \xA7 3.05(2)); line 4: earned income over $2,500; line 5: 15% of line 4; line 13: the smaller of line 2 or line 12. [Line 12 is the larger of line 5 and the 3+-child social security tax alternative (lines 6\u201311), which is NOT modeled \u2014 it can only raise the maximum at very low earned income; disclosed. Earned income approximated as wages + self-employment earnings net of the \xBD SE deduction, less a Schedule C net loss.]"
60481
+ },
60482
+ effectiveFrom: "2027-01-01",
60483
+ effectiveTo: "2028-01-01",
60484
+ output: { type: "money" },
60485
+ parameters: {
60486
+ refundableCapPerChild: { value: "180000", type: "money" },
60487
+ // $1,800 (2027)
60488
+ earnedIncomeFloor: { value: "250000", type: "money" }
60489
+ // $2,500
60490
+ },
60491
+ formula: min4({ kind: "mulInt", base: param18("refundableCapPerChild"), count: fact35("qualifyingChildren") }, {
60492
+ kind: "mulRate",
60493
+ base: max06(sub4(add4(fact35("wages"), max06(sub4(ruleRef30("us.federal.se_net_profit"), ruleRef30("us.federal.se_tax_half_deduction")))), add4(param18("earnedIncomeFloor"), fact35("scheduleCNetLoss")))),
60494
+ rate: { num: "15", den: "100" },
60495
+ round: "half-up"
60496
+ })
60497
+ };
59806
60498
  var worksheetBApplies = {
59807
60499
  id: `${J26}.energy.clean.worksheet_b_applies`,
59808
60500
  version: 1,
@@ -59882,6 +60574,7 @@ var residentialEnergyRules = [
59882
60574
  excerpt: "Line 13: 'Add lines 6b, 11, and 12'."
59883
60575
  }, add4(ruleRef30(`${J26}.energy.clean.line6b`), ruleRef30(`${J26}.energy.clean.line11`), ruleRef30(`${J26}.energy.clean.line12`))),
59884
60576
  actcMaximum,
60577
+ actcMaximum2027,
59885
60578
  worksheetBApplies,
59886
60579
  line("clean.ctc_for_limit", "Child tax credit amount subtracted in the Form 5695 line 14 and Form 8839 line 17 worksheets (Form 1040 line 19, or Schedule 8812 Worksheet B line 14)", {
59887
60580
  source: "2025 Instructions for Form 5695, Residential Clean Energy Credit Limit Worksheet\u2014Line 14, footnote; 2025 Instructions for Schedule 8812, Credit Limit Worksheet B line 14",
@@ -73193,6 +73886,32 @@ var thresholdRules = [
73193
73886
  ]
73194
73887
  }
73195
73888
  },
73889
+ {
73890
+ id: `${J29}.qbi.threshold`,
73891
+ version: 3,
73892
+ jurisdiction: J29,
73893
+ title: "\xA7 199A threshold amount (TY2027)",
73894
+ citation: {
73895
+ source: "26 U.S.C. \xA7 199A(e)(2); Rev. Proc. 2026-35 \xA7 3.28(1)",
73896
+ section: "\xA7 199A(e)(2)",
73897
+ url: CORNELL,
73898
+ excerpt: "For taxable years beginning in 2027, the threshold amounts under \xA7 199A(e)(2) are $416,600 (married filing jointly), $208,325 (married filing separately) and $208,300 (all other returns); the phase-in range ends at $566,600, $283,325 and $283,300 (Rev. Proc. 2026-35 \xA7 3.28(1))."
73899
+ },
73900
+ effectiveFrom: "2027-01-01",
73901
+ effectiveTo: "2028-01-01",
73902
+ output: { type: "money" },
73903
+ formula: {
73904
+ kind: "match",
73905
+ on: fact39("filingStatus"),
73906
+ cases: [
73907
+ { when: "mfj", value: money36("41660000") },
73908
+ { when: "mfs", value: money36("20832500") },
73909
+ { when: "single", value: money36("20830000") },
73910
+ { when: "hoh", value: money36("20830000") },
73911
+ { when: "qss", value: money36("20830000") }
73912
+ ]
73913
+ }
73914
+ },
73196
73915
  {
73197
73916
  id: `${J29}.qbi.phase_in_range`,
73198
73917
  version: 1,
@@ -73225,6 +73944,22 @@ var thresholdRules = [
73225
73944
  output: { type: "money" },
73226
73945
  formula: iff23(isStatus32("mfj"), money36("15000000"), money36("7500000"))
73227
73946
  },
73947
+ {
73948
+ id: `${J29}.qbi.phase_in_range`,
73949
+ version: 3,
73950
+ jurisdiction: J29,
73951
+ title: "\xA7 199A phase-in range (TY2027: $75,000, $150,000 joint \u2014 OBBBA \xA7 70105)",
73952
+ citation: {
73953
+ source: "26 U.S.C. \xA7 199A(b)(3)(B), (d)(3) as amended by OBBBA \xA7 70105; Rev. Proc. 2026-35 \xA7 3.28(1)",
73954
+ section: "\xA7 199A(b)(3)(B)(ii)(II)",
73955
+ url: CORNELL,
73956
+ excerpt: "For taxable years beginning after December 31, 2025, the phase-in range is $75,000 ($150,000 for a joint return)."
73957
+ },
73958
+ effectiveFrom: "2027-01-01",
73959
+ effectiveTo: "2028-01-01",
73960
+ output: { type: "money" },
73961
+ formula: iff23(isStatus32("mfj"), money36("15000000"), money36("7500000"))
73962
+ },
73228
73963
  rule(`${J29}.qbi.excess_over_threshold`, "Taxable income before the QBI deduction over the \xA7 199A threshold (Form 8995-A line 22)", "\xA7 199A(b)(3)(B)", CORNELL, "Form 8995-A Part III line 22: subtract line 21 (threshold) from line 20 (taxable income before qualified business income deduction). [Zero at or below the threshold.]", "money", max028(sub28(ruleRef33(`${J29}.taxable_income_before_qbi`), ruleRef33(`${J29}.qbi.threshold`))))
73229
73964
  ];
73230
73965
  function scheduleA(u, amount) {
@@ -73340,7 +74075,7 @@ var hasBusinessIncome = {
73340
74075
  ]
73341
74076
  };
73342
74077
  var taxableBeforeQbi = ruleRef34("us.federal.taxable_income_before_qbi");
73343
- function qbiRule(version2, effectiveFrom, effectiveTo, yearLabel, source, withMinimum) {
74078
+ function qbiRule(version2, effectiveFrom, effectiveTo, yearLabel, source, minimum) {
73344
74079
  const overall = pctOf3("20", "100", {
73345
74080
  kind: "max0",
73346
74081
  arg: {
@@ -73353,8 +74088,8 @@ function qbiRule(version2, effectiveFrom, effectiveTo, yearLabel, source, withMi
73353
74088
  }
73354
74089
  });
73355
74090
  const limited = { kind: "min", args: [ruleRef34("us.federal.qbi.total_component"), overall] };
73356
- const withFloor = withMinimum ? {
73357
- // OBBBA § 70105: $400 minimum when QBI ≥ $1,000 (TY2026+)
74091
+ const withFloor = minimum ? {
74092
+ // OBBBA § 70105: the § 199A(i) minimum (TY2026+; indexed after 2026)
73358
74093
  kind: "if",
73359
74094
  cond: { kind: "cmp", op: "ge", left: ruleRef34("us.federal.qbi.active_total"), right: param23("minQbiFloor") },
73360
74095
  then: { kind: "max", args: [limited, param23("minDeduction")] },
@@ -73369,16 +74104,14 @@ function qbiRule(version2, effectiveFrom, effectiveTo, yearLabel, source, withMi
73369
74104
  source: `26 U.S.C. \xA7 199A; ${source}`,
73370
74105
  section: "\xA7 199A(a)\u2013(d)",
73371
74106
  url: "https://www.law.cornell.edu/uscode/text/26/199A",
73372
- excerpt: `The lesser of the combined qualified business income amount \u2014 20 percent of each business's QBI, limited above the \xA7 199A(e)(2) threshold by that business's W-2 wages and UBIA and phased in over the ${yearLabel === "2025" ? "$50,000 ($100,000 joint) range" : "OBBBA-widened $75,000 ($150,000 joint) range (\xA7 70105, taxable years after 2025)"}, after the SSTB applicable percentage, aggregation and loss netting (us.federal.qbi.total_component) \u2014 or 20 percent of taxable income (without this deduction) less net capital gain.${withMinimum ? " OBBBA \xA7 70105 $400 minimum deduction with at least $1,000 of QBI (active participation assumed \u2014 disclosed)." : ""} [No REIT/PTP component or cooperative patron reduction; W-2 wages and UBIA default to $0, which is conservative; exact ratios where Form 8995-A rounds percentages \u2014 disclosed.]`
74107
+ excerpt: `The lesser of the combined qualified business income amount \u2014 20 percent of each business's QBI, limited above the \xA7 199A(e)(2) threshold by that business's W-2 wages and UBIA and phased in over the ${yearLabel === "2025" ? "$50,000 ($100,000 joint) range" : "OBBBA-widened $75,000 ($150,000 joint) range (\xA7 70105, taxable years after 2025)"}, after the SSTB applicable percentage, aggregation and loss netting (us.federal.qbi.total_component) \u2014 or 20 percent of taxable income (without this deduction) less net capital gain.${minimum ? ` OBBBA \xA7 70105 minimum deduction of $${Number(minimum.deductionCents) / 100} with at least $${(Number(minimum.testCents) / 100).toLocaleString("en-US")} of QBI from qualified businesses (active participation assumed \u2014 disclosed).` : ""} [No REIT/PTP component or cooperative patron reduction; W-2 wages and UBIA default to $0, which is conservative; exact ratios where Form 8995-A rounds percentages \u2014 disclosed.]`
73373
74108
  },
73374
74109
  effectiveFrom,
73375
74110
  effectiveTo,
73376
74111
  output: { type: "money" },
73377
- parameters: withMinimum ? {
73378
- minDeduction: { value: "40000", type: "money" },
73379
- // $400
73380
- minQbiFloor: { value: "100000", type: "money" }
73381
- // $1,000
74112
+ parameters: minimum ? {
74113
+ minDeduction: { value: minimum.deductionCents, type: "money" },
74114
+ minQbiFloor: { value: minimum.testCents, type: "money" }
73382
74115
  } : {},
73383
74116
  formula: {
73384
74117
  kind: "if",
@@ -73396,7 +74129,7 @@ var qbiRules = [
73396
74129
  "2026-01-01",
73397
74130
  "2025",
73398
74131
  "Rev. Proc. 2024-40 \xA7 2.27",
73399
- false
74132
+ null
73400
74133
  ),
73401
74134
  qbiRule(
73402
74135
  14,
@@ -73405,8 +74138,9 @@ var qbiRules = [
73405
74138
  "2027-01-01",
73406
74139
  "2026",
73407
74140
  "Rev. Proc. 2025-32 \xA7 4.26; OBBBA \xA7 70105 (range + $400 minimum)",
73408
- true
74141
+ { deductionCents: "40000", testCents: "100000" }
73409
74142
  ),
74143
+ qbiRule(15, "2027-01-01", "2028-01-01", "2027", "Rev. Proc. 2026-35 \xA7 3.28; OBBBA \xA7 70105", { deductionCents: "41500", testCents: "103000" }),
73410
74144
  ...qbiBusinessRules
73411
74145
  ];
73412
74146
 
@@ -73608,8 +74342,11 @@ var selfEmploymentRules = [
73608
74342
  // $176,100
73609
74343
  seTaxRule(taxpayer, 2, "2026-01-01", "2027-01-01", "18450000", "2026"),
73610
74344
  // $184,500
74345
+ seTaxRule(taxpayer, 3, "2027-01-01", "2028-01-01", "19230000", "2027"),
74346
+ // $192,300 (91 FR 67380)
73611
74347
  seTaxRule(spouse, 1, "2025-01-01", "2026-01-01", "17610000", "2025"),
73612
74348
  seTaxRule(spouse, 2, "2026-01-01", "2027-01-01", "18450000", "2026"),
74349
+ seTaxRule(spouse, 3, "2027-01-01", "2028-01-01", "19230000", "2027"),
73613
74350
  {
73614
74351
  id: "us.federal.se_tax",
73615
74352
  version: 7,
@@ -74037,6 +74774,37 @@ var standardDeductionRules = [
74037
74774
  ]
74038
74775
  }
74039
74776
  },
74777
+ {
74778
+ id: "us.federal.standard_deduction.base_amount",
74779
+ version: 4,
74780
+ jurisdiction: J30,
74781
+ title: "Basic standard deduction amount by filing status (TY2027)",
74782
+ citation: {
74783
+ source: "26 U.S.C. \xA7 63(c); Rev. Proc. 2026-35",
74784
+ section: "Rev. Proc. 2026-35 \xA7 3.15(1)",
74785
+ url: "https://www.irs.gov/pub/irs-drop/rp-26-35.pdf",
74786
+ excerpt: "For taxable years beginning in 2027, the standard deduction amounts under \xA7 63(c)(2) are as follows: $33,200 (married individuals filing joint returns and surviving spouses), $24,925 (heads of households), $16,600 (unmarried individuals other than surviving spouses and heads of households), $16,600 (married individuals filing separate returns)."
74787
+ },
74788
+ effectiveFrom: "2027-01-01",
74789
+ effectiveTo: "2028-01-01",
74790
+ output: { type: "money" },
74791
+ formula: {
74792
+ kind: "match",
74793
+ on: fact44("filingStatus"),
74794
+ cases: [
74795
+ { when: "single", value: money41("1660000") },
74796
+ // $16,600
74797
+ { when: "mfs", value: money41("1660000") },
74798
+ // $16,600
74799
+ { when: "mfj", value: money41("3320000") },
74800
+ // $33,200
74801
+ { when: "qss", value: money41("3320000") },
74802
+ // $33,200 (surviving spouse)
74803
+ { when: "hoh", value: money41("2492500") }
74804
+ // $24,925
74805
+ ]
74806
+ }
74807
+ },
74040
74808
  {
74041
74809
  id: "us.federal.standard_deduction.base",
74042
74810
  version: 1,
@@ -74088,6 +74856,39 @@ var standardDeductionRules = [
74088
74856
  },
74089
74857
  overrides: { ruleId: "us.federal.standard_deduction.base", priority: 10 }
74090
74858
  },
74859
+ {
74860
+ id: "us.federal.standard_deduction.dependent_limit",
74861
+ version: 2,
74862
+ jurisdiction: J30,
74863
+ title: "Limitation on basic standard deduction of a dependent (TY2027)",
74864
+ citation: {
74865
+ source: "26 U.S.C. \xA7 63(c)(5); Rev. Proc. 2026-35 \xA7 3.15(2)",
74866
+ section: "\xA7 63(c)(5)",
74867
+ url: "https://www.irs.gov/pub/irs-drop/rp-26-35.pdf",
74868
+ excerpt: "For taxable years beginning in 2027, the standard deduction amount under \xA7 63(c)(5) for an individual who may be claimed as a dependent by another taxpayer cannot exceed the greater of (1) $1,400, or (2) the sum of $500 and the individual's earned income."
74869
+ },
74870
+ effectiveFrom: "2027-01-01",
74871
+ effectiveTo: "2028-01-01",
74872
+ output: { type: "money" },
74873
+ applicability: fact44("isClaimedAsDependent"),
74874
+ // min(normal base amount, max($1,400, earned income + $500)); earned income ≈ wages
74875
+ formula: {
74876
+ kind: "min",
74877
+ args: [
74878
+ ruleRef38("us.federal.standard_deduction.base_amount"),
74879
+ {
74880
+ kind: "max",
74881
+ args: [
74882
+ money41("140000"),
74883
+ // $1,400
74884
+ { kind: "add", args: [fact44("wages"), money41("50000")] }
74885
+ // + $500
74886
+ ]
74887
+ }
74888
+ ]
74889
+ },
74890
+ overrides: { ruleId: "us.federal.standard_deduction.base", priority: 10 }
74891
+ },
74091
74892
  {
74092
74893
  id: "us.federal.standard_deduction.mfs_spouse_itemizes",
74093
74894
  version: 1,
@@ -74127,6 +74928,12 @@ var standardDeductionRules = [
74127
74928
  married: "$1,650",
74128
74929
  unmarried: "$2,050"
74129
74930
  }),
74931
+ additionalRule(3, "2027-01-01", "2028-01-01", "170000", "210000", {
74932
+ sourceRevProc: "Rev. Proc. 2026-35 \xA7 3.15(3)",
74933
+ year: "2027",
74934
+ married: "$1,700",
74935
+ unmarried: "$2,100"
74936
+ }),
74130
74937
  {
74131
74938
  id: "us.federal.standard_deduction",
74132
74939
  version: 1,
@@ -74391,7 +75198,7 @@ var tipsOvertimeRules = [
74391
75198
  // ../corpus-us-federal/dist/index.js
74392
75199
  var corpusInput = {
74393
75200
  name: "@invaro/opentax-corpus-us-federal",
74394
- version: "0.44.0",
75201
+ version: "0.45.0",
74395
75202
  rules: [
74396
75203
  ...corporateRules,
74397
75204
  ...corporate1120Rules,
@@ -74969,6 +75776,7 @@ var INDIVIDUAL_GROUPS = {
74969
75776
  "selfEmployedHealthPremiums",
74970
75777
  "homeOfficeSquareFeet",
74971
75778
  "businessMilesDriven",
75779
+ "businessMilesDrivenFromJuly",
74972
75780
  "aggregateBusinessLoss"
74973
75781
  ],
74974
75782
  adjustments: [
@@ -74999,6 +75807,7 @@ var INDIVIDUAL_GROUPS = {
74999
75807
  "noncashCharitableContributions",
75000
75808
  "investmentInterestDeduction",
75001
75809
  "gamblingLossesItemized",
75810
+ "gamblingWinnings",
75002
75811
  "otherItemizedDeductions",
75003
75812
  "casualtyFederalDisasterLosses",
75004
75813
  "casualtyQualifiedDisasterLosses",