@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/http.js CHANGED
@@ -40352,7 +40352,7 @@ var IncompleteReturnError = class extends OpenTaxError {
40352
40352
  };
40353
40353
 
40354
40354
  // dist/version.js
40355
- var COMPOSER_VERSION = "0.10.1";
40355
+ var COMPOSER_VERSION = "0.11.1";
40356
40356
 
40357
40357
  // ../solve/dist/sweep.js
40358
40358
  function evaluateAt(corpus2, baseFacts, options, atCents) {
@@ -49441,11 +49441,17 @@ var facts = [
49441
49441
  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))"
49442
49442
  }
49443
49443
  },
49444
+ {
49445
+ id: "businessMilesDrivenFromJuly",
49446
+ type: "int",
49447
+ min: "0",
49448
+ 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."
49449
+ },
49444
49450
  {
49445
49451
  id: "businessMilesDriven",
49446
49452
  type: "int",
49447
49453
  min: "0",
49448
- 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.",
49454
+ 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.",
49449
49455
  default: {
49450
49456
  value: "0",
49451
49457
  rationale: "Assumed no business mileage absent contrary input"
@@ -49530,11 +49536,17 @@ var facts = [
49530
49536
  rationale: "Assumed no deductible investment interest absent contrary input"
49531
49537
  }
49532
49538
  },
49539
+ {
49540
+ id: "gamblingWinnings",
49541
+ type: "money",
49542
+ min: "0",
49543
+ 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."
49544
+ },
49533
49545
  {
49534
49546
  id: "gamblingLossesItemized",
49535
49547
  type: "money",
49536
49548
  min: "0",
49537
- 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.",
49549
+ 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.",
49538
49550
  default: {
49539
49551
  value: "0",
49540
49552
  rationale: "Assumed no deductible gambling losses absent contrary input"
@@ -49698,7 +49710,7 @@ var facts = [
49698
49710
  id: "educatorExpenses",
49699
49711
  type: "money",
49700
49712
  min: "0",
49701
- 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.",
49713
+ 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.",
49702
49714
  default: {
49703
49715
  value: "0",
49704
49716
  rationale: "Assumed no educator expenses absent contrary input"
@@ -49708,7 +49720,7 @@ var facts = [
49708
49720
  id: "spouseEducatorExpenses",
49709
49721
  type: "money",
49710
49722
  min: "0",
49711
- 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.",
49723
+ 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.",
49712
49724
  default: {
49713
49725
  value: "0",
49714
49726
  rationale: "Assumed the spouse is not an eligible educator absent contrary input"
@@ -54355,7 +54367,7 @@ function hsaRule(version2, effectiveFrom, effectiveTo, selfCents, familyCents, s
54355
54367
  }
54356
54368
  };
54357
54369
  }
54358
- function studentLoanRule(version2, effectiveFrom, effectiveTo, jointThresholdCents, jointRangeCents, source, yearLabel) {
54370
+ function studentLoanRule(version2, effectiveFrom, effectiveTo, jointThresholdCents, jointRangeCents, source, yearLabel, thresholdCents = "8500000") {
54359
54371
  const magi2 = ruleRef("us.federal.agi_before_student_loan");
54360
54372
  const threshold2 = {
54361
54373
  kind: "if",
@@ -54390,8 +54402,7 @@ function studentLoanRule(version2, effectiveFrom, effectiveTo, jointThresholdCen
54390
54402
  parameters: {
54391
54403
  cap: { value: "250000", type: "money" },
54392
54404
  // $2,500, not indexed
54393
- threshold: { value: "8500000", type: "money" },
54394
- // $85,000
54405
+ threshold: { value: thresholdCents, type: "money" },
54395
54406
  range: { value: "1500000", type: "money" },
54396
54407
  // $15,000
54397
54408
  thresholdJoint: { value: jointThresholdCents, type: "money" },
@@ -54479,8 +54490,33 @@ function sepRule(version2, effectiveFrom, effectiveTo, limitCents, source, yearL
54479
54490
  var adjustmentRules = [
54480
54491
  hsaRule(1, "2025-01-01", "2026-01-01", "430000", "855000", "Rev. Proc. 2024-25", "2025"),
54481
54492
  hsaRule(2, "2026-01-01", "2027-01-01", "440000", "875000", "Rev. Proc. 2025-19", "2026"),
54493
+ hsaRule(3, "2027-01-01", "2028-01-01", "450000", "900000", "Rev. Proc. 2026-24 \xA7 3.01(1)", "2027"),
54482
54494
  sepRule(1, "2025-01-01", "2026-01-01", "7000000", "Notice 2024-80", "2025", "$70,000"),
54483
54495
  sepRule(2, "2026-01-01", "2027-01-01", "7200000", "Notice 2025-67", "2026", "$72,000"),
54496
+ {
54497
+ id: "us.federal.sep_deduction",
54498
+ version: 3,
54499
+ jurisdiction: "us.federal",
54500
+ title: "SEP / solo-401(k) employer contribution deduction (TY2027: the \xA7 415(c) limit is not yet published)",
54501
+ citation: {
54502
+ source: "26 U.S.C. \xA7\xA7 404(a)(8), (h), 415(c), (d)",
54503
+ section: "\xA7 404(h); \xA7 415(c)(1)(A), (d)",
54504
+ url: "https://www.law.cornell.edu/uscode/text/26/415",
54505
+ 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."
54506
+ },
54507
+ effectiveFrom: "2027-01-01",
54508
+ effectiveTo: "2028-01-01",
54509
+ output: { type: "money" },
54510
+ formula: {
54511
+ kind: "if",
54512
+ cond: { kind: "cmp", op: "gt", left: fact("sepContribution"), right: zero },
54513
+ then: {
54514
+ kind: "unsupported",
54515
+ 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"
54516
+ },
54517
+ else: zero
54518
+ }
54519
+ },
54484
54520
  {
54485
54521
  id: "us.federal.sehi_deduction",
54486
54522
  version: 1,
@@ -54545,6 +54581,17 @@ var adjustmentRules = [
54545
54581
  // $175,000 threshold, $30,000 range ($175k–$205k)
54546
54582
  "Rev. Proc. 2025-32 \xA7 4.29",
54547
54583
  "2026"
54584
+ ),
54585
+ studentLoanRule(
54586
+ 3,
54587
+ "2027-01-01",
54588
+ "2028-01-01",
54589
+ "18000000",
54590
+ "3000000",
54591
+ // $180,000 threshold, $30,000 range ($180k–$210k)
54592
+ "Rev. Proc. 2026-35 \xA7 3.31",
54593
+ "2027",
54594
+ "9000000"
54548
54595
  )
54549
54596
  ];
54550
54597
 
@@ -54586,6 +54633,20 @@ var TY2026 = {
54586
54633
  hoh: { brackets: B26.hoh, zeroMax: 66200, fifteenMax: 579600 },
54587
54634
  mfs: { brackets: B26.mfs, zeroMax: 49450, fifteenMax: 306850 }
54588
54635
  };
54636
+ var B27 = {
54637
+ single: table([0, 12800, 52025, 109125, 208325, 264550, 661375]),
54638
+ mfj: table([0, 25600, 104050, 218250, 416650, 529100, 793650]),
54639
+ hoh: table([0, 18250, 69650, 109100, 208300, 264550, 661350]),
54640
+ mfs: table([0, 12800, 52025, 109125, 208325, 264550, 396825])
54641
+ };
54642
+ var TY2027 = {
54643
+ single: { brackets: B27.single, zeroMax: 51050, fifteenMax: 563200 },
54644
+ mfj: { brackets: B27.mfj, zeroMax: 102100, fifteenMax: 633600 },
54645
+ qss: { brackets: B27.mfj, zeroMax: 102100, fifteenMax: 633600 },
54646
+ hoh: { brackets: B27.hoh, zeroMax: 68350, fifteenMax: 598400 },
54647
+ mfs: { brackets: B27.mfs, zeroMax: 51050, fifteenMax: 316800 }
54648
+ };
54649
+ var TABLES_BY_YEAR = { "2025": TY2025, "2026": TY2026, "2027": TY2027 };
54589
54650
  var taxable = ruleRef2("us.federal.taxable_income");
54590
54651
  var ordinary = ruleRef2("us.federal.ordinary_taxable_income");
54591
54652
  function statusTax(sy) {
@@ -54789,7 +54850,7 @@ function taxTableRule(version2, effectiveFrom, effectiveTo, tables, yearLabel, m
54789
54850
  };
54790
54851
  }
54791
54852
  function ordinaryRateTaxExpr(base, statusFactId, year) {
54792
- const tables = year === "2025" ? TY2025 : TY2026;
54853
+ const tables = TABLES_BY_YEAR[year];
54793
54854
  const perStatus = (sy) => ({
54794
54855
  kind: "if",
54795
54856
  cond: { kind: "cmp", op: "lt", left: base, right: money2("10000000") },
@@ -54850,8 +54911,15 @@ var incomeTaxRules = [
54850
54911
  url: "https://www.irs.gov/pub/irs-drop/rp-25-32.pdf",
54851
54912
  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."
54852
54913
  }),
54914
+ incomeTaxRule(5, "2027-01-01", "2028-01-01", TY2027, "2027", {
54915
+ source: "26 U.S.C. \xA7 1(h), (j); Rev. Proc. 2026-35",
54916
+ section: "\xA7 1(j)(2), (j)(5); Rev. Proc. 2026-35 \xA7\xA7 3.01, 3.03",
54917
+ url: "https://www.irs.gov/pub/irs-drop/rp-26-35.pdf",
54918
+ 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."
54919
+ }),
54853
54920
  taxTableRule(1, "2025-01-01", "2026-01-01", TY2025, "2025", "Sampled entries verified against the printed 2025 Publication 1040 table."),
54854
- 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.")
54921
+ 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."),
54922
+ 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).")
54855
54923
  ];
54856
54924
 
54857
54925
  // ../corpus-us-federal/dist/rules/amt.js
@@ -54883,6 +54951,7 @@ var line13 = ruleRef3("us.federal.amt.capital_gain_amount");
54883
54951
  var qdcgLine5 = ruleRef3("us.federal.ordinary_taxable_income");
54884
54952
  var SOURCE_2025 = "Form 6251 (2025) and instructions; Rev. Proc. 2024-40 \xA7 2.11";
54885
54953
  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";
54954
+ 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";
54886
54955
  var F6251_URL = "https://www.irs.gov/pub/irs-pdf/f6251.pdf";
54887
54956
  var Y2025 = {
54888
54957
  year: "2025",
@@ -54924,6 +54993,26 @@ var Y2026 = {
54924
54993
  cg: TY2026,
54925
54994
  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)."
54926
54995
  };
54996
+ var Y2027 = {
54997
+ year: "2027",
54998
+ from: "2027-01-01",
54999
+ to: "2028-01-01",
55000
+ source: SOURCE_2027,
55001
+ exemptSingle: "9300000",
55002
+ exemptJoint: "14470000",
55003
+ exemptMfs: "7235000",
55004
+ threshSingle: "51595000",
55005
+ threshJoint: "103190000",
55006
+ threshMfs: "51595000",
55007
+ phaseRate: "50",
55008
+ mfsZeroAt: "66065000",
55009
+ break28: "25250000",
55010
+ break28Mfs: "12625000",
55011
+ sub28: "505000",
55012
+ sub28Mfs: "252500",
55013
+ cg: TY2027,
55014
+ 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)."
55015
+ };
54927
55016
  var byStatus = (single, joint, mfs) => ({
54928
55017
  kind: "match",
54929
55018
  on: fact3("filingStatus"),
@@ -55081,8 +55170,10 @@ function tmtRule(version2, y) {
55081
55170
  var amtRules = [
55082
55171
  amtiRule(1, Y2025),
55083
55172
  amtiRule(2, Y2026),
55173
+ amtiRule(3, Y2027),
55084
55174
  exemptionRule(1, Y2025),
55085
55175
  exemptionRule(2, Y2026),
55176
+ exemptionRule(3, Y2027),
55086
55177
  {
55087
55178
  id: "us.federal.amt.taxable_excess",
55088
55179
  version: 1,
@@ -55115,6 +55206,7 @@ var amtRules = [
55115
55206
  },
55116
55207
  tmtRule(1, Y2025),
55117
55208
  tmtRule(2, Y2026),
55209
+ tmtRule(3, Y2027),
55118
55210
  {
55119
55211
  id: "us.federal.amt",
55120
55212
  version: 3,
@@ -55197,7 +55289,7 @@ function cumulative(yearFactId, periodFactId) {
55197
55289
  else: zero2
55198
55290
  };
55199
55291
  }
55200
- function quarterRule(q, year, from, to, proratedLimitCents, proratedLabel, withQbiMinimum) {
55292
+ function quarterRule(q, year, from, to, proratedLimitCents, proratedLabel, qbiMinimum) {
55201
55293
  const cumWages = cumulative("wages", q.wagesFact);
55202
55294
  const cumSE = cumulative("selfEmploymentNetProfit", q.seFact);
55203
55295
  const netEarn = {
@@ -55265,11 +55357,11 @@ function quarterRule(q, year, from, to, proratedLimitCents, proratedLabel, withQ
55265
55357
  { kind: "mulRate", base: tiBeforeQbi, rate: { num: "20", den: "100" }, round: "half-up" }
55266
55358
  ]
55267
55359
  };
55268
- const qbi = withQbiMinimum ? {
55360
+ const qbi = qbiMinimum ? {
55269
55361
  kind: "if",
55270
- cond: { kind: "cmp", op: "ge", left: qbiBase, right: money4("100000") },
55271
- then: { kind: "max", args: [qbiCore, money4("40000")] },
55272
- // OBBBA $400 min
55362
+ cond: { kind: "cmp", op: "ge", left: qbiBase, right: money4(qbiMinimum.testCents) },
55363
+ then: { kind: "max", args: [qbiCore, money4(qbiMinimum.deductionCents)] },
55364
+ // § 199A(i) minimum
55273
55365
  else: qbiCore
55274
55366
  } : qbiCore;
55275
55367
  const ti = { kind: "max0", arg: { kind: "sub", left: tiBeforeQbi, right: qbi } };
@@ -55303,12 +55395,12 @@ function quarterRule(q, year, from, to, proratedLimitCents, proratedLabel, withQ
55303
55395
  };
55304
55396
  return {
55305
55397
  id: `us.federal.estimated.annualized_installment_q${q.n}`,
55306
- version: year === "2025" ? 3 : 4,
55398
+ version: { "2025": 3, "2026": 4, "2027": 5 }[year],
55307
55399
  // v1/v2 predated the per-bucket capital-loss facts in the scope guard
55308
55400
  jurisdiction: J2,
55309
55401
  title: `Annualized-income required installment #${q.n} (\xA7 6654(d)(2), TY${year})`,
55310
55402
  citation: {
55311
- source: `26 U.S.C. \xA7 6654(d)(2); ${year} Form 2210 Schedule AI`,
55403
+ 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`,
55312
55404
  section: "\xA7 6654(d)(2); Schedule AI",
55313
55405
  url: "https://www.irs.gov/forms-pubs/about-form-2210",
55314
55406
  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.]`
@@ -55331,9 +55423,23 @@ var P2025 = ["4402500", "7337500", "11740000", "17610000"];
55331
55423
  var L2025 = ["$44,025", "$73,375", "$117,400", "$176,100"];
55332
55424
  var P2026 = ["4612500", "7687500", "12300000", "18450000"];
55333
55425
  var L2026 = ["$46,125 (from the $184,500 base)", "$76,875", "$123,000", "$184,500"];
55426
+ var P2027 = ["4807500", "8012500", "12820000", "19230000"];
55427
+ var L2027 = ["$48,075 (from the $192,300 base, 91 FR 67380)", "$80,125", "$128,200", "$192,300"];
55334
55428
  var annualizedInstallmentRules = [
55335
- ...QUARTERS.map((q) => quarterRule(q, "2025", "2025-01-01", "2026-01-01", P2025[q.n - 1], L2025[q.n - 1], false)),
55336
- ...QUARTERS.map((q) => quarterRule(q, "2026", "2026-01-01", "2027-01-01", P2026[q.n - 1], L2026[q.n - 1], true))
55429
+ ...QUARTERS.map((q) => quarterRule(q, "2025", "2025-01-01", "2026-01-01", P2025[q.n - 1], L2025[q.n - 1], null)),
55430
+ ...QUARTERS.map((q) => quarterRule(q, "2026", "2026-01-01", "2027-01-01", P2026[q.n - 1], L2026[q.n - 1], {
55431
+ deductionCents: "40000",
55432
+ // $400
55433
+ testCents: "100000"
55434
+ // $1,000
55435
+ })),
55436
+ ...QUARTERS.map((q) => (
55437
+ // Rev. Proc. 2026-35 § 3.28(2): the minimum is $415 and the QBI test $1,030
55438
+ quarterRule(q, "2027", "2027-01-01", "2028-01-01", P2027[q.n - 1], L2027[q.n - 1], {
55439
+ deductionCents: "41500",
55440
+ testCents: "103000"
55441
+ })
55442
+ ))
55337
55443
  ];
55338
55444
 
55339
55445
  // ../corpus-us-federal/dist/rules/capital-losses.js
@@ -55962,7 +56068,7 @@ function section179Rule(version2, from, to, capCents, thresholdCents, capLabel,
55962
56068
  source: `26 U.S.C. \xA7 179, as amended by Pub. L. 119-21 (OBBBA \xA7 70306); ${sourceLabel}`,
55963
56069
  section: "\xA7 179(b)(1)\u2013(3)",
55964
56070
  url: "https://www.law.cornell.edu/uscode/text/26/179",
55965
- 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.]`
56071
+ 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.]`
55966
56072
  },
55967
56073
  effectiveFrom: from,
55968
56074
  effectiveTo: to,
@@ -56186,10 +56292,14 @@ var corporate1120Rules = [
56186
56292
  },
56187
56293
  interestRule(1, "2025-01-01", "2026-01-01", "3100000000", "$31,000,000", "2025"),
56188
56294
  interestRule(2, "2026-01-01", "2027-01-01", "3200000000", "$32,000,000", "2026"),
56295
+ interestRule(3, "2027-01-01", "2028-01-01", "3300000000", "$33,000,000", "2027"),
56296
+ // Rev. Proc. 2026-35 § 3.32
56189
56297
  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)"),
56190
56298
  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"),
56299
+ 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"),
56191
56300
  section179CarryforwardRule(1, "2025-01-01", "2026-01-01", "250000000", "400000000", "TY2025"),
56192
56301
  section179CarryforwardRule(2, "2026-01-01", "2027-01-01", "256000000", "409000000", "TY2026"),
56302
+ section179CarryforwardRule(3, "2027-01-01", "2028-01-01", "264000000", "423000000", "TY2027"),
56193
56303
  corpCharitableRule(7, "2025-01-01", "2026-01-01", false, "TY2025"),
56194
56304
  corpCharitableRule(8, "2026-01-01", void 0, true, "TY2026+, permanent"),
56195
56305
  {
@@ -56752,7 +56862,8 @@ var qsbsRules = [
56752
56862
  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.]"
56753
56863
  },
56754
56864
  effectiveFrom: "2025-01-01",
56755
- // statutory: open-ended
56865
+ effectiveTo: "2027-01-01",
56866
+ // § 1202(b)(5) indexes the $15,000,000 for taxable years beginning after 2026 (v2)
56756
56867
  output: { type: "money" },
56757
56868
  parameters: {
56758
56869
  capNew: { value: "1500000000", type: "money" },
@@ -56766,6 +56877,33 @@ var qsbsRules = [
56766
56877
  then: money12("0"),
56767
56878
  else: tiers
56768
56879
  }
56880
+ },
56881
+ {
56882
+ id: "us.federal.qsbs_exclusion",
56883
+ version: 2,
56884
+ jurisdiction: "us.federal",
56885
+ title: "QSBS gain exclusion \u2014 OBBBA tiers (50/75/100% at 3/4/5 years) or prior-law 100% at 5 years",
56886
+ citation: {
56887
+ 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)",
56888
+ section: "\xA7 1202(a), (b)",
56889
+ url: "https://www.law.cornell.edu/uscode/text/26/1202",
56890
+ 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.]"
56891
+ },
56892
+ effectiveFrom: "2027-01-01",
56893
+ effectiveTo: "2028-01-01",
56894
+ output: { type: "money" },
56895
+ parameters: {
56896
+ capNew: { value: "1548000000", type: "money" },
56897
+ // $15,480,000 (Rev. Proc. 2026-35 § 3.42(1))
56898
+ capOld: { value: "1000000000", type: "money" }
56899
+ // $10,000,000
56900
+ },
56901
+ formula: {
56902
+ kind: "if",
56903
+ cond: { kind: "cmp", op: "eq", left: fact12("qsbsGain"), right: money12("0") },
56904
+ then: money12("0"),
56905
+ else: tiers
56906
+ }
56769
56907
  }
56770
56908
  ];
56771
56909
 
@@ -57051,7 +57189,7 @@ function adoptionAllowedRule(version2, from, to, maxCents, thresholdCents, yearL
57051
57189
  jurisdiction: J8,
57052
57190
  title: `Adoption credit after the MAGI phase-out (\xA7 23, ${yearLabel})`,
57053
57191
  citation: {
57054
- 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"}`,
57192
+ 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]}`,
57055
57193
  section: "\xA7 23(a)\u2013(b), (f)",
57056
57194
  url: "https://www.law.cornell.edu/uscode/text/26/23",
57057
57195
  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.`
@@ -57131,6 +57269,7 @@ var creditBlockRules = [
57131
57269
  "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."
57132
57270
  ),
57133
57271
  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."),
57272
+ 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."),
57134
57273
  {
57135
57274
  id: "us.federal.cdcc",
57136
57275
  version: 1,
@@ -57159,6 +57298,39 @@ var creditBlockRules = [
57159
57298
  t20: saversTier("5250000", "3937500", "2625000"),
57160
57299
  t10: saversTier("8050000", "6037500", "4025000")
57161
57300
  }, "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."),
57301
+ {
57302
+ id: "us.federal.savers.tentative",
57303
+ version: 3,
57304
+ jurisdiction: J8,
57305
+ title: "Saver's credit before the liability limit (TY2027: ABLE contributions only; AGI limits not yet published)",
57306
+ citation: {
57307
+ 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",
57308
+ section: "\xA7 25B(a), (b), (d)(1)",
57309
+ url: "https://www.law.cornell.edu/uscode/text/26/25B",
57310
+ 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."
57311
+ },
57312
+ effectiveFrom: "2027-01-01",
57313
+ effectiveTo: "2028-01-01",
57314
+ output: { type: "money" },
57315
+ formula: {
57316
+ kind: "if",
57317
+ cond: {
57318
+ kind: "or",
57319
+ args: [
57320
+ gt03(fact13("saversContributions")),
57321
+ {
57322
+ kind: "and",
57323
+ args: [isStatus3("mfj"), gt03(fact13("saversContributionsSpouse"))]
57324
+ }
57325
+ ]
57326
+ },
57327
+ then: {
57328
+ kind: "unsupported",
57329
+ 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"
57330
+ },
57331
+ else: zero7
57332
+ }
57333
+ },
57162
57334
  {
57163
57335
  id: "us.federal.savers_credit",
57164
57336
  version: 1,
@@ -57195,8 +57367,10 @@ var creditBlockRules = [
57195
57367
  },
57196
57368
  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)."),
57197
57369
  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)."),
57370
+ 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)."),
57198
57371
  adoptionRefundableRule(1, "2025-01-01", "2026-01-01", "500000", "$5,000", "statutory, unindexed for 2025"),
57199
57372
  adoptionRefundableRule(2, "2026-01-01", "2027-01-01", "512000", "$5,120", "Rev. Proc. 2025-32 \xA7 3.04(3)"),
57373
+ adoptionRefundableRule(3, "2027-01-01", "2028-01-01", "528000", "$5,280", "Rev. Proc. 2026-35 \xA7 3.04(3)"),
57200
57374
  {
57201
57375
  id: "us.federal.adoption.nonrefundable",
57202
57376
  version: 2,
@@ -57319,6 +57493,42 @@ var ctcRules = [
57319
57493
  ]
57320
57494
  }
57321
57495
  },
57496
+ {
57497
+ id: "us.federal.ctc.tentative",
57498
+ version: 4,
57499
+ jurisdiction: J9,
57500
+ title: "Child tax credit + credit for other dependents, before phase-out (TY2027)",
57501
+ citation: {
57502
+ 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",
57503
+ section: "\xA7 24(a), (h)(2), (h)(4)",
57504
+ url: "https://www.law.cornell.edu/uscode/text/26/24",
57505
+ 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.]"
57506
+ },
57507
+ effectiveFrom: "2027-01-01",
57508
+ effectiveTo: "2028-01-01",
57509
+ output: { type: "money" },
57510
+ parameters: {
57511
+ perChild: { value: "230000", type: "money" },
57512
+ // $2,300
57513
+ perOtherDependent: { value: "50000", type: "money" }
57514
+ // $500, unindexed
57515
+ },
57516
+ formula: {
57517
+ kind: "add",
57518
+ args: [
57519
+ {
57520
+ kind: "mulInt",
57521
+ base: { kind: "param", name: "perChild" },
57522
+ count: fact14("qualifyingChildren")
57523
+ },
57524
+ {
57525
+ kind: "mulInt",
57526
+ base: { kind: "param", name: "perOtherDependent" },
57527
+ count: fact14("otherDependents")
57528
+ }
57529
+ ]
57530
+ }
57531
+ },
57322
57532
  {
57323
57533
  id: "us.federal.ctc.phaseout_threshold",
57324
57534
  version: 1,
@@ -57474,7 +57684,9 @@ var ctcRules = [
57474
57684
  url: "https://www.law.cornell.edu/uscode/text/26/24",
57475
57685
  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.]"
57476
57686
  },
57477
- ...FROM6,
57687
+ effectiveFrom: "2025-01-01",
57688
+ effectiveTo: "2027-01-01",
57689
+ // the $1,700 refundable amount is indexed; 2027 is v4
57478
57690
  output: { type: "money" },
57479
57691
  parameters: {
57480
57692
  refundableCapPerChild: { value: "170000", type: "money" },
@@ -57537,6 +57749,81 @@ var ctcRules = [
57537
57749
  ]
57538
57750
  }
57539
57751
  },
57752
+ {
57753
+ id: "us.federal.actc",
57754
+ version: 4,
57755
+ jurisdiction: J9,
57756
+ title: "Additional child tax credit \u2014 refundable, TY2027 (simplified: 3+-child SS-tax alternative not modeled)",
57757
+ citation: {
57758
+ source: "26 U.S.C. \xA7 24(d), (h)(5); Rev. Proc. 2026-35 \xA7 3.05(2)",
57759
+ section: "\xA7 24(d)(1); \xA7 24(h)(5)",
57760
+ url: "https://www.law.cornell.edu/uscode/text/26/24",
57761
+ 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.]"
57762
+ },
57763
+ effectiveFrom: "2027-01-01",
57764
+ effectiveTo: "2028-01-01",
57765
+ output: { type: "money" },
57766
+ parameters: {
57767
+ refundableCapPerChild: { value: "180000", type: "money" },
57768
+ // $1,800
57769
+ earnedIncomeFloor: { value: "250000", type: "money" }
57770
+ // $2,500
57771
+ },
57772
+ formula: {
57773
+ kind: "min",
57774
+ args: [
57775
+ // the part of the credit the liability limit left unused
57776
+ {
57777
+ kind: "max0",
57778
+ arg: {
57779
+ kind: "sub",
57780
+ left: ruleRef12("us.federal.ctc.after_phaseout"),
57781
+ right: ruleRef12("us.federal.ctc")
57782
+ }
57783
+ },
57784
+ // refundable cap: $1,800 per qualifying child
57785
+ {
57786
+ kind: "mulInt",
57787
+ base: { kind: "param", name: "refundableCapPerChild" },
57788
+ count: fact14("qualifyingChildren")
57789
+ },
57790
+ // 15% of earned income (wages + SE earnings net of ½ SE tax) above $2,500
57791
+ {
57792
+ kind: "mulRate",
57793
+ base: {
57794
+ kind: "max0",
57795
+ arg: {
57796
+ kind: "sub",
57797
+ left: {
57798
+ kind: "add",
57799
+ args: [
57800
+ fact14("wages"),
57801
+ {
57802
+ kind: "max0",
57803
+ arg: {
57804
+ kind: "sub",
57805
+ left: ruleRef12("us.federal.se_net_profit"),
57806
+ right: ruleRef12("us.federal.se_tax_half_deduction")
57807
+ }
57808
+ }
57809
+ ]
57810
+ },
57811
+ right: {
57812
+ kind: "add",
57813
+ args: [
57814
+ { kind: "param", name: "earnedIncomeFloor" },
57815
+ // Schedule C net loss reduces § 24(d) earned income too
57816
+ fact14("scheduleCNetLoss")
57817
+ ]
57818
+ }
57819
+ }
57820
+ },
57821
+ rate: { num: "15", den: "100" },
57822
+ round: "half-up"
57823
+ }
57824
+ ]
57825
+ }
57826
+ },
57540
57827
  {
57541
57828
  id: "us.federal.income_tax_after_credits",
57542
57829
  version: 6,
@@ -57665,9 +57952,11 @@ var dependentRules = [
57665
57952
  },
57666
57953
  qualifyingRelativeRule(1, "2025-01-01", "2026-01-01", "520000", "2025", "Rev. Proc. 2024-40 \xA7 2.24 ($5,200)"),
57667
57954
  qualifyingRelativeRule(2, "2026-01-01", "2027-01-01", "530000", "2026", "Rev. Proc. 2025-32 \xA7 4.23 ($5,300)"),
57955
+ qualifyingRelativeRule(3, "2027-01-01", "2028-01-01", "550000", "2027", "Rev. Proc. 2026-35 \xA7 3.25 ($5,500)"),
57668
57956
  ...[
57669
57957
  { version: 1, from: "2025-01-01", to: "2026-01-01", limit: "520000", year: "2025", revProc: "Rev. Proc. 2024-40 \xA7 2.24 ($5,200)" },
57670
- { version: 2, from: "2026-01-01", to: "2027-01-01", limit: "530000", year: "2026", revProc: "Rev. Proc. 2025-32 \xA7 4.23 ($5,300)" }
57958
+ { version: 2, from: "2026-01-01", to: "2027-01-01", limit: "530000", year: "2026", revProc: "Rev. Proc. 2025-32 \xA7 4.23 ($5,300)" },
57959
+ { version: 3, from: "2027-01-01", to: "2028-01-01", limit: "550000", year: "2027", revProc: "Rev. Proc. 2026-35 \xA7 3.25 ($5,500)" }
57671
57960
  ].map(({ version: version2, from, to, limit, year, revProc }) => ({
57672
57961
  id: "us.federal.dependent.qualifying_relative.multiple_support",
57673
57962
  version: version2,
@@ -58035,6 +58324,17 @@ var TY20262 = {
58035
58324
  completedMFJ0: 26820,
58036
58325
  investmentLimit: 12200
58037
58326
  };
58327
+ var TY20272 = {
58328
+ eia: [8960, 13450, 18880, 18880],
58329
+ max: [685, 4573, 7552, 8496],
58330
+ thresholdOther0: 11210,
58331
+ thresholdMFJ0: 18730,
58332
+ thresholdOtherKids: 24660,
58333
+ thresholdMFJKids: 32170,
58334
+ completedOther0: 20164,
58335
+ completedMFJ0: 27684,
58336
+ investmentLimit: 12600
58337
+ };
58038
58338
  var dollars = (d3) => (BigInt(d3) * 100n).toString();
58039
58339
  var earned = {
58040
58340
  // A Schedule C net loss reduces § 32(c)(2) earned income (Pub. 596 worksheet:
@@ -58298,6 +58598,7 @@ var eitcRules = [
58298
58598
  // netted results ("capital gain net income", § 32(i)(1)(C))
58299
58599
  eitcRule(14, "2025-01-01", "2026-01-01", TY20252, "2025", "Rev. Proc. 2024-40 \xA7 2.06"),
58300
58600
  eitcRule(15, "2026-01-01", "2027-01-01", TY20262, "2026", "Rev. Proc. 2025-32 \xA7 4.06"),
58601
+ eitcRule(16, "2027-01-01", "2028-01-01", TY20272, "2027", "Rev. Proc. 2026-35 \xA7 3.06"),
58301
58602
  // us.federal.eitc_no_age_gate (new): the same § 32(a)-(b),(f),(i) formula with
58302
58603
  // the childless § 32(c)(1)(A)(ii) age gate removed, for state EITC statutes
58303
58604
  // that decouple from it (35 ILCS 5/212(b-5)/(b-10), IL P.A. 102-700) — see
@@ -58313,6 +58614,12 @@ var eitcRules = [
58313
58614
  ageGate: false,
58314
58615
  titleSuffix: "Earned income credit, \xA7 32(c)(1)(A)(ii) childless age gate REMOVED (TY2026; for state decoupling statutes only)",
58315
58616
  extraExcerpt: NO_AGE_GATE_EXCERPT
58617
+ }),
58618
+ eitcRule(5, "2027-01-01", "2028-01-01", TY20272, "2027", "Rev. Proc. 2026-35 \xA7 3.06", {
58619
+ ruleId: "us.federal.eitc_no_age_gate",
58620
+ ageGate: false,
58621
+ titleSuffix: "Earned income credit, \xA7 32(c)(1)(A)(ii) childless age gate REMOVED (TY2027; for state decoupling statutes only)",
58622
+ extraExcerpt: NO_AGE_GATE_EXCERPT
58316
58623
  })
58317
58624
  ];
58318
58625
 
@@ -58401,9 +58708,11 @@ function feieStackingRule(version2, from, to, year) {
58401
58708
  var feieRules = [
58402
58709
  feieExclusionRule(1, "2025-01-01", "2026-01-01", "13000000", "$130,000", "Rev. Proc. 2024-40 \xA7 2.39"),
58403
58710
  feieExclusionRule(2, "2026-01-01", "2027-01-01", "13290000", "$132,900", "Rev. Proc. 2025-32 \xA7 4.39"),
58711
+ feieExclusionRule(3, "2027-01-01", "2028-01-01", "13730000", "$137,300", "Rev. Proc. 2026-35 \xA7 3.41"),
58404
58712
  // v3/v4: the preferential-income refusal guard also catches the standalone qualifiedDividends fact
58405
58713
  feieStackingRule(3, "2025-01-01", "2026-01-01", "2025"),
58406
58714
  feieStackingRule(4, "2026-01-01", "2027-01-01", "2026"),
58715
+ feieStackingRule(5, "2027-01-01", "2028-01-01", "2027"),
58407
58716
  {
58408
58717
  id: "us.federal.eitc.feie_denial",
58409
58718
  version: 1,
@@ -58489,7 +58798,8 @@ function fmt(cents) {
58489
58798
  }
58490
58799
  var fiduciaryRules = [
58491
58800
  fiduciaryRule(1, "2025-01-01", "2026-01-01", "315000", "1145000", "1565000", "TY2025", "Rev. Proc. 2024-40 \xA7 2.01"),
58492
- fiduciaryRule(2, "2026-01-01", "2027-01-01", "330000", "1170000", "1600000", "TY2026", "Rev. Proc. 2025-32 \xA7 4.01")
58801
+ fiduciaryRule(2, "2026-01-01", "2027-01-01", "330000", "1170000", "1600000", "TY2026", "Rev. Proc. 2025-32 \xA7 4.01"),
58802
+ fiduciaryRule(3, "2027-01-01", "2028-01-01", "340000", "1210000", "1650000", "TY2027", "Rev. Proc. 2026-35 \xA7 3.01")
58493
58803
  ];
58494
58804
 
58495
58805
  // ../corpus-us-federal/dist/rules/ptc.js
@@ -58604,12 +58914,14 @@ var assistanceAmount = (pctCents) => ({
58604
58914
  function ptcRule(version2, from, to, fplFirstPersonCents, fplPerAdditionalCents, tiers2, above400, yearLabel, excerpt) {
58605
58915
  const inRange = above400 === "cliff" ? {
58606
58916
  kind: "if",
58917
+ // compare the income itself to 4 × the poverty line: the floored
58918
+ // percentage reads income a few dollars over the line as 400.00%
58919
+ // (Form 8962 Worksheet 2 tests line 1 against line 2 × 4.0)
58607
58920
  cond: {
58608
58921
  kind: "cmp",
58609
58922
  op: "gt",
58610
- left: fplPercentCents,
58611
- right: money19("40000")
58612
- // 400.00%
58923
+ left: householdIncome,
58924
+ right: { kind: "mulInt", base: povertyLine, count: { kind: "int", value: "4" } }
58613
58925
  },
58614
58926
  then: zero12,
58615
58927
  else: assistanceAmount(tierChain(
@@ -58644,7 +58956,7 @@ function ptcRule(version2, from, to, fplFirstPersonCents, fplPerAdditionalCents,
58644
58956
  jurisdiction: J13,
58645
58957
  title: `Premium tax credit (\xA7 36B, ${yearLabel})`,
58646
58958
  citation: {
58647
- 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)",
58959
+ 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)",
58648
58960
  section: "\xA7 36B(b), (c)(1), (d)",
58649
58961
  url: "https://www.law.cornell.edu/uscode/text/26/36B",
58650
58962
  excerpt
@@ -58705,6 +59017,15 @@ var TIERS_2025 = [
58705
59017
  { lo: "25000", hi: "30000", initial: "400", final: "600" },
58706
59018
  { lo: "30000", hi: "40000", initial: "600", final: "850" }
58707
59019
  ];
59020
+ var TIERS_2027 = [
59021
+ { lo: "10000", hi: "13300", initial: "215", final: "215" },
59022
+ { lo: "13300", hi: "15000", initial: "323", final: "430" },
59023
+ { lo: "15000", hi: "20000", initial: "430", final: "678" },
59024
+ { lo: "20000", hi: "25000", initial: "678", final: "866" },
59025
+ { lo: "25000", hi: "30000", initial: "866", final: "1022" },
59026
+ { lo: "30000", hi: "40001", initial: "1022", final: "1022" }
59027
+ // "but not more than 400%" — inclusive
59028
+ ];
58708
59029
  var TIERS_2026 = [
58709
59030
  { lo: "10000", hi: "13300", initial: "210", final: "210" },
58710
59031
  { lo: "13300", hi: "15000", initial: "314", final: "419" },
@@ -58793,8 +59114,8 @@ var ptcRules = [
58793
59114
  `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.]`
58794
59115
  ),
58795
59116
  ptcRule(
58796
- 5,
58797
- // v3 gave $0 below 100% FPL even under Reg. § 1.36B-2(b)(6) and let household income go negative
59117
+ 6,
59118
+ // 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
58798
59119
  "2026-01-01",
58799
59120
  "2027-01-01",
58800
59121
  "1565000",
@@ -58807,6 +59128,21 @@ var ptcRules = [
58807
59128
  "TY2026: indexed statutory table, the 400% cliff returns",
58808
59129
  "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.]"
58809
59130
  ),
59131
+ ptcRule(
59132
+ 7,
59133
+ // the 400% cliff tests household income against 4 × the poverty line, not the floored percentage
59134
+ "2027-01-01",
59135
+ "2028-01-01",
59136
+ "1596000",
59137
+ // $15,960 (2026 guidelines, used for TY2027)
59138
+ "568000",
59139
+ // $5,680 per additional person
59140
+ TIERS_2027,
59141
+ // over 400% FPL → not an applicable taxpayer → $0 credit
59142
+ "cliff",
59143
+ "TY2027: indexed statutory table, the 400% cliff",
59144
+ "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.]"
59145
+ ),
58810
59146
  {
58811
59147
  id: "us.federal.ptc.net",
58812
59148
  version: 1,
@@ -58922,6 +59258,7 @@ function householdRule(version2, from, to, thresholdCents, thresholdLabel, sourc
58922
59258
  var residualRules = [
58923
59259
  householdRule(1, "2025-01-01", "2026-01-01", "280000", "$2,800", "89 FR 85276; 2025 Instructions for Schedule H"),
58924
59260
  householdRule(2, "2026-01-01", "2027-01-01", "300000", "$3,000", "90 FR 49047"),
59261
+ householdRule(3, "2027-01-01", "2028-01-01", "310000", "$3,100", "91 FR 67380 (SSA, Cost-of-Living Increase and Other Determinations for 2027)"),
58925
59262
  {
58926
59263
  id: "us.federal.estimated.required_annual_payment.farmer",
58927
59264
  version: 1,
@@ -59054,6 +59391,8 @@ function payrollRule(version2, from, to, wageBaseCents, yearLabel, baseLabel) {
59054
59391
  var employerRules = [
59055
59392
  payrollRule(1, "2025-01-01", "2026-01-01", "17610000", "2025", "$176,100"),
59056
59393
  payrollRule(2, "2026-01-01", "2027-01-01", "18450000", "2026", "$184,500"),
59394
+ payrollRule(3, "2027-01-01", "2028-01-01", "19230000", "2027", "$192,300"),
59395
+ // 91 FR 67380
59057
59396
  {
59058
59397
  id: "us.federal.credit.research_asc",
59059
59398
  version: 1,
@@ -59540,7 +59879,9 @@ var incomeRules = [
59540
59879
  url: "https://www.law.cornell.edu/uscode/text/26/62",
59541
59880
  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)."
59542
59881
  },
59543
- ...FROM10,
59882
+ effectiveFrom: "2025-01-01",
59883
+ effectiveTo: "2026-01-01",
59884
+ // the § 62(a)(2)(D) amount is indexed: $350 from 2026 (v6)
59544
59885
  output: { type: "money" },
59545
59886
  parameters: {
59546
59887
  educatorCap: { value: "30000", type: "money" }
@@ -59571,6 +59912,50 @@ var incomeRules = [
59571
59912
  ]
59572
59913
  }
59573
59914
  },
59915
+ {
59916
+ id: "us.federal.above_the_line_adjustments",
59917
+ version: 6,
59918
+ // 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
59919
+ jurisdiction: J17,
59920
+ title: "Above-the-line adjustments before the student-loan deduction (\xBD SE tax + HSA + SEP + SE health insurance + educator + early-withdrawal penalty)",
59921
+ citation: {
59922
+ source: "26 U.S.C. \xA7 62(a)(1), (a)(2)(D), (a)(6), (a)(9), (a)(17), (a)(19)",
59923
+ section: "\xA7 62(a)",
59924
+ url: "https://www.law.cornell.edu/uscode/text/26/62",
59925
+ 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)."
59926
+ },
59927
+ effectiveFrom: "2026-01-01",
59928
+ effectiveTo: "2028-01-01",
59929
+ output: { type: "money" },
59930
+ parameters: {
59931
+ educatorCap: { value: "35000", type: "money" }
59932
+ // $350 (2026 and 2027)
59933
+ },
59934
+ formula: {
59935
+ kind: "add",
59936
+ args: [
59937
+ ruleRef20("us.federal.se_tax_half_deduction"),
59938
+ ruleRef20("us.federal.hsa_deduction"),
59939
+ ruleRef20("us.federal.sep_deduction"),
59940
+ ruleRef20("us.federal.sehi_deduction"),
59941
+ {
59942
+ kind: "min",
59943
+ args: [fact25("educatorExpenses"), { kind: "param", name: "educatorCap" }]
59944
+ },
59945
+ // § 62(a)(2)(D): the $300 cap is PER eligible educator — a spouse who
59946
+ // is also an eligible educator gets their own cap
59947
+ {
59948
+ kind: "min",
59949
+ args: [fact25("spouseEducatorExpenses"), { kind: "param", name: "educatorCap" }]
59950
+ },
59951
+ fact25("earlyWithdrawalPenaltyPaid"),
59952
+ // pre-TCJA § 215/§ 62(a)(10): pre-2019-instrument alimony paid
59953
+ fact25("alimonyPaidPre2019"),
59954
+ // Schedule 1 lines 24a-z write-in adjustments (attested total)
59955
+ fact25("otherAdjustments")
59956
+ ]
59957
+ }
59958
+ },
59574
59959
  {
59575
59960
  id: "us.federal.agi_before_student_loan",
59576
59961
  version: 2,
@@ -59902,6 +60287,7 @@ var internationalAndRemainderRules = [
59902
60287
  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.]"),
59903
60288
  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"),
59904
60289
  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)'),
60290
+ 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)'),
59905
60291
  {
59906
60292
  id: "us.federal.corp.gbc_allowed",
59907
60293
  version: 2,
@@ -60173,8 +60559,8 @@ var investmentTaxRules = [
60173
60559
  },
60174
60560
  {
60175
60561
  id: "us.federal.additional_medicare_tax",
60176
- version: 4,
60177
- // 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
60562
+ version: 5,
60563
+ // 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
60178
60564
  jurisdiction: "us.federal",
60179
60565
  title: "Additional Medicare Tax (0.9%; Form 8959 uses medicareWages box 5 when given, else box-1 wages)",
60180
60566
  citation: {
@@ -60199,11 +60585,21 @@ var investmentTaxRules = [
60199
60585
  round: "half-up"
60200
60586
  });
60201
60587
  const wagesPart = pct09({ kind: "max0", arg: { kind: "sub", left: mw, right: amThreshold } });
60588
+ const seIncome = (ruleId) => ({
60589
+ kind: "if",
60590
+ cond: { kind: "cmp", op: "lt", left: ruleRef22(ruleId), right: money24("40000") },
60591
+ then: money24("0"),
60592
+ else: ruleRef22(ruleId)
60593
+ });
60594
+ const line8 = {
60595
+ kind: "add",
60596
+ args: [seIncome("us.federal.se_net_earnings"), seIncome("us.federal.se_net_earnings.spouse")]
60597
+ };
60202
60598
  const sePart = pct09({
60203
60599
  kind: "max0",
60204
60600
  arg: {
60205
60601
  kind: "sub",
60206
- left: { kind: "add", args: [ruleRef22("us.federal.se_net_earnings"), ruleRef22("us.federal.se_net_earnings.spouse")] },
60602
+ left: line8,
60207
60603
  right: { kind: "max0", arg: { kind: "sub", left: amThreshold, right: mw } }
60208
60604
  }
60209
60605
  });
@@ -60211,7 +60607,7 @@ var investmentTaxRules = [
60211
60607
  kind: "max0",
60212
60608
  arg: {
60213
60609
  kind: "sub",
60214
- left: { kind: "add", args: [mw, { kind: "add", args: [ruleRef22("us.federal.se_net_earnings"), ruleRef22("us.federal.se_net_earnings.spouse")] }] },
60610
+ left: { kind: "add", args: [mw, line8] },
60215
60611
  right: amThreshold
60216
60612
  }
60217
60613
  });
@@ -60470,7 +60866,31 @@ var iraRules = [
60470
60866
  // $129,000
60471
60867
  thresholdSpousal: "24200000"
60472
60868
  // $242,000
60473
- }, "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.")
60869
+ }, "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."),
60870
+ {
60871
+ id: "us.federal.ira_deduction",
60872
+ version: 4,
60873
+ jurisdiction: J19,
60874
+ title: "Traditional IRA deduction (TY2027: the \xA7 219 amounts are not yet published)",
60875
+ citation: {
60876
+ source: "26 U.S.C. \xA7 219(b)(5), (g)",
60877
+ section: "\xA7 219(b)(5)(C), (D); \xA7 219(g)(8)",
60878
+ url: "https://www.law.cornell.edu/uscode/text/26/219",
60879
+ 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."
60880
+ },
60881
+ effectiveFrom: "2027-01-01",
60882
+ effectiveTo: "2028-01-01",
60883
+ output: { type: "money" },
60884
+ formula: {
60885
+ kind: "if",
60886
+ cond: { kind: "cmp", op: "gt", left: fact28("iraContribution"), right: { kind: "money", cents: "0" } },
60887
+ then: {
60888
+ kind: "unsupported",
60889
+ 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"
60890
+ },
60891
+ else: { kind: "money", cents: "0" }
60892
+ }
60893
+ }
60474
60894
  ];
60475
60895
 
60476
60896
  // ../corpus-us-federal/dist/rules/ira-8606.js
@@ -60675,6 +61095,14 @@ var itemizedRules = [
60675
61095
  { cap: "4040000", threshold: "50500000", thresholdMfs: "25250000" },
60676
61096
  { year: "2026", cap: "$40,400", capHalf: "20,200", threshold: "$505,000" }
60677
61097
  ),
61098
+ saltRule(
61099
+ 5,
61100
+ "2027-01-01",
61101
+ "2028-01-01",
61102
+ // § 164(b)(7)(A)(iii), (B)(ii)(III): 101 percent of the 2026 amounts
61103
+ { cap: "4080400", threshold: "51005000", thresholdMfs: "25502500" },
61104
+ { year: "2027", cap: "$40,804", capHalf: "20,402", threshold: "$510,050" }
61105
+ ),
60678
61106
  {
60679
61107
  id: "us.federal.mortgage_interest_deduction",
60680
61108
  version: 1,
@@ -60825,17 +61253,60 @@ var itemizedRules = [
60825
61253
  ]
60826
61254
  }
60827
61255
  },
61256
+ {
61257
+ id: "us.federal.gambling_loss_deduction",
61258
+ version: 1,
61259
+ jurisdiction: J21,
61260
+ title: "Gambling loss deduction (\xA7 165(d), Schedule A line 16; TY2025: the attested winnings-limited amount)",
61261
+ citation: {
61262
+ source: "26 U.S.C. \xA7 165(d) (as in effect for 2025)",
61263
+ section: "\xA7 165(d)",
61264
+ url: "https://www.law.cornell.edu/uscode/text/26/165",
61265
+ 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."
61266
+ },
61267
+ effectiveFrom: "2025-01-01",
61268
+ effectiveTo: "2026-01-01",
61269
+ output: { type: "money" },
61270
+ formula: fact30("gamblingLossesItemized")
61271
+ },
61272
+ {
61273
+ id: "us.federal.gambling_loss_deduction",
61274
+ version: 2,
61275
+ jurisdiction: J21,
61276
+ title: "Gambling loss deduction (\xA7 165(d) as amended by OBBBA: 90 percent of losses, limited to winnings)",
61277
+ citation: {
61278
+ source: "26 U.S.C. \xA7 165(d), as amended by Pub. L. 119-21 (OBBBA) \xA7 70114",
61279
+ section: "\xA7 165(d)(1)",
61280
+ url: "https://www.law.cornell.edu/uscode/text/26/165",
61281
+ 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))."
61282
+ },
61283
+ effectiveFrom: "2026-01-01",
61284
+ // permanent: open-ended
61285
+ output: { type: "money" },
61286
+ formula: {
61287
+ kind: "if",
61288
+ cond: { kind: "cmp", op: "gt", left: fact30("gamblingLossesItemized"), right: zero18 },
61289
+ then: {
61290
+ kind: "min",
61291
+ args: [
61292
+ { kind: "mulRate", base: fact30("gamblingLossesItemized"), rate: { num: "90", den: "100" }, round: "half-up" },
61293
+ fact30("gamblingWinnings")
61294
+ ]
61295
+ },
61296
+ else: zero18
61297
+ }
61298
+ },
60828
61299
  {
60829
61300
  id: "us.federal.itemized_deductions_before_limitation",
60830
- version: 4,
60831
- // v2 lacked investment interest (§ 163(d)) and noncash charitable; v4 adds gambling losses (§ 165(d), Schedule A line 16) as an attested-limited fact
61301
+ version: 5,
61302
+ // 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
60832
61303
  jurisdiction: J21,
60833
61304
  title: "Itemized deductions before the \xA7 68 overall limitation (SALT + mortgage + charitable cash/noncash + medical + casualty + investment interest + gambling losses)",
60834
61305
  citation: {
60835
61306
  source: "26 U.S.C. \xA7 63(d)",
60836
61307
  section: "\xA7 63(d)",
60837
61308
  url: "https://www.law.cornell.edu/uscode/text/26/63",
60838
- 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.]"
61309
+ 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.]"
60839
61310
  },
60840
61311
  effectiveFrom: "2025-01-01",
60841
61312
  // structural: open-ended
@@ -60850,7 +61321,7 @@ var itemizedRules = [
60850
61321
  ruleRef24("us.federal.medical_expense_deduction"),
60851
61322
  ruleRef24("us.federal.casualty_loss_deduction"),
60852
61323
  fact30("investmentInterestDeduction"),
60853
- fact30("gamblingLossesItemized"),
61324
+ ruleRef24("us.federal.gambling_loss_deduction"),
60854
61325
  fact30("otherItemizedDeductions")
60855
61326
  ]
60856
61327
  }
@@ -60958,6 +61429,93 @@ var itemizedRules = [
60958
61429
  };
60959
61430
  })()
60960
61431
  },
61432
+ {
61433
+ id: "us.federal.itemized_deductions",
61434
+ version: 3,
61435
+ jurisdiction: J21,
61436
+ title: "Itemized deductions after the \xA7 68 overall limitation (TY2027: 2/37 of the amount over the 37% bracket)",
61437
+ citation: {
61438
+ source: "26 U.S.C. \xA7 68, as amended by Pub. L. 119-21 (OBBBA) \xA7 70111; Rev. Proc. 2026-35 \xA7 3.01",
61439
+ section: "\xA7 68(a), (b)",
61440
+ url: "https://www.law.cornell.edu/uscode/text/26/68",
61441
+ 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.]"
61442
+ },
61443
+ effectiveFrom: "2027-01-01",
61444
+ effectiveTo: "2028-01-01",
61445
+ // the 37%-bracket start is indexed
61446
+ output: { type: "money" },
61447
+ formula: (() => {
61448
+ const itemizedPre = ruleRef24("us.federal.itemized_deductions_before_limitation");
61449
+ const tiIncreased = {
61450
+ kind: "max0",
61451
+ arg: {
61452
+ kind: "sub",
61453
+ left: agi,
61454
+ right: {
61455
+ kind: "add",
61456
+ args: [
61457
+ ruleRef24("us.federal.senior_deduction"),
61458
+ ruleRef24("us.federal.tips_deduction"),
61459
+ ruleRef24("us.federal.overtime_deduction"),
61460
+ ruleRef24("us.federal.car_loan_interest_deduction")
61461
+ ]
61462
+ }
61463
+ }
61464
+ };
61465
+ const bracket37Start = {
61466
+ kind: "match",
61467
+ on: fact30("filingStatus"),
61468
+ cases: [
61469
+ { when: "single", value: money27("66137500") },
61470
+ // $661,375
61471
+ { when: "hoh", value: money27("66135000") },
61472
+ // $661,350
61473
+ { when: "mfj", value: money27("79365000") },
61474
+ // $793,650
61475
+ { when: "qss", value: money27("79365000") },
61476
+ // $793,650
61477
+ { when: "mfs", value: money27("39682500") }
61478
+ // $396,825
61479
+ ]
61480
+ };
61481
+ const reductionBase = {
61482
+ kind: "min",
61483
+ args: [
61484
+ itemizedPre,
61485
+ { kind: "max0", arg: { kind: "sub", left: tiIncreased, right: bracket37Start } }
61486
+ ]
61487
+ };
61488
+ return {
61489
+ kind: "if",
61490
+ cond: {
61491
+ kind: "and",
61492
+ args: [
61493
+ {
61494
+ kind: "cmp",
61495
+ op: "gt",
61496
+ left: ruleRef24("us.federal.se_net_profit"),
61497
+ right: zero18
61498
+ },
61499
+ { kind: "cmp", op: "gt", left: reductionBase, right: zero18 }
61500
+ ]
61501
+ },
61502
+ then: {
61503
+ kind: "unsupported",
61504
+ reason: "the \xA7 68 overall limitation and the \xA7 199A deduction interact through the taxable-income term \u2014 this combination is not modeled yet"
61505
+ },
61506
+ else: {
61507
+ kind: "sub",
61508
+ left: itemizedPre,
61509
+ right: {
61510
+ kind: "mulRate",
61511
+ base: reductionBase,
61512
+ rate: { num: "2", den: "37" },
61513
+ round: "half-up"
61514
+ }
61515
+ }
61516
+ };
61517
+ })()
61518
+ },
60961
61519
  {
60962
61520
  id: "us.federal.deduction_election",
60963
61521
  version: 3,
@@ -61108,12 +61666,41 @@ var kiddieRules = [
61108
61666
  ]
61109
61667
  }
61110
61668
  },
61669
+ {
61670
+ id: "us.federal.kiddie.net_unearned_income",
61671
+ version: 2,
61672
+ jurisdiction: J22,
61673
+ title: "Net unearned income of a \xA7 1(g) child (TY2027)",
61674
+ citation: {
61675
+ ...CITE4,
61676
+ section: "\xA7 1(g)(4); Rev. Proc. 2026-35 \xA7 3.02",
61677
+ 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.]"
61678
+ },
61679
+ effectiveFrom: "2027-01-01",
61680
+ effectiveTo: "2028-01-01",
61681
+ output: { type: "money" },
61682
+ parameters: {
61683
+ threshold: { value: "280000", type: "money" }
61684
+ // $2,800 = 2 × $1,400
61685
+ },
61686
+ formula: {
61687
+ kind: "min",
61688
+ args: [
61689
+ {
61690
+ kind: "max0",
61691
+ arg: { kind: "sub", left: fact31("taxableInterest"), right: param17("threshold") }
61692
+ },
61693
+ ruleRef25("us.federal.taxable_income")
61694
+ ]
61695
+ }
61696
+ },
61111
61697
  // v3/v4: the § 1(g) capital-gains refusal guard also catches the standalone qualifiedDividends fact
61112
61698
  // v5/v6: the refusal guard also catches shortTermCapitalGains/ordinaryDividends (unearned income
61113
61699
  // the "unearned income ≈ taxable interest" approximation in net_unearned_income would otherwise drop)
61114
61700
  // v5/v6: the refusal guard predated the per-bucket capital-loss facts and netCapitalLoss
61115
61701
  kiddieTaxRule(7, "2025-01-01", "2026-01-01", "2025"),
61116
61702
  kiddieTaxRule(8, "2026-01-01", "2027-01-01", "2026"),
61703
+ kiddieTaxRule(9, "2027-01-01", "2028-01-01", "2027"),
61117
61704
  {
61118
61705
  id: "us.federal.income_tax_before_credits.kiddie",
61119
61706
  version: 1,
@@ -61130,6 +61717,23 @@ var kiddieRules = [
61130
61717
  applicability: fact31("isSubjectToKiddieTax"),
61131
61718
  formula: ruleRef25("us.federal.kiddie_tax"),
61132
61719
  overrides: { ruleId: "us.federal.income_tax_before_credits", priority: 20 }
61720
+ },
61721
+ {
61722
+ id: "us.federal.income_tax_before_credits.kiddie",
61723
+ version: 2,
61724
+ jurisdiction: J22,
61725
+ title: "\xA7 1(g) override: a kiddie child's income tax is the Form 8615 tax",
61726
+ citation: {
61727
+ ...CITE4,
61728
+ section: "\xA7 1(g)(1)",
61729
+ 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)."
61730
+ },
61731
+ effectiveFrom: "2027-01-01",
61732
+ effectiveTo: "2028-01-01",
61733
+ output: { type: "money" },
61734
+ applicability: fact31("isSubjectToKiddieTax"),
61735
+ formula: ruleRef25("us.federal.kiddie_tax"),
61736
+ overrides: { ruleId: "us.federal.income_tax_before_credits", priority: 20 }
61133
61737
  }
61134
61738
  ];
61135
61739
 
@@ -61376,7 +61980,66 @@ function mileageRule(version2, from, to, rateNum, rateLabel, noticeLabel) {
61376
61980
  }
61377
61981
  var mileageRules = [
61378
61982
  mileageRule(1, "2025-01-01", "2026-01-01", "700", "70 cents", "Notice 2025-5"),
61379
- mileageRule(2, "2026-01-01", "2027-01-01", "725", "72.5 cents", "Notice 2026-10")
61983
+ {
61984
+ id: "us.federal.vehicle_standard_mileage",
61985
+ version: 3,
61986
+ // v2 applied 72.5¢ to every 2026 mile; Announcement 2026-11 raised the rate to 76¢ from July 1, 2026
61987
+ jurisdiction: J23,
61988
+ title: "Business standard mileage deduction (2026: 72.5 cents/mile through June 30, 76 cents/mile from July 1)",
61989
+ citation: {
61990
+ source: "Notice 2026-10; Announcement 2026-11 (2026-29 I.R.B.); Rev. Proc. 2019-46",
61991
+ section: "Announcement 2026-11",
61992
+ url: "https://www.irs.gov/irb/2026-29_irb",
61993
+ 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.]"
61994
+ },
61995
+ effectiveFrom: "2026-01-01",
61996
+ effectiveTo: "2027-01-01",
61997
+ output: { type: "money" },
61998
+ formula: {
61999
+ kind: "if",
62000
+ cond: {
62001
+ kind: "cmp",
62002
+ op: "gt",
62003
+ left: fact32("businessMilesDriven"),
62004
+ right: { kind: "int", value: "0" }
62005
+ },
62006
+ then: {
62007
+ kind: "if",
62008
+ cond: {
62009
+ kind: "cmp",
62010
+ op: "gt",
62011
+ left: fact32("businessMilesDrivenFromJuly"),
62012
+ right: fact32("businessMilesDriven")
62013
+ },
62014
+ then: {
62015
+ kind: "unsupported",
62016
+ reason: "businessMilesDrivenFromJuly is part of businessMilesDriven and cannot exceed it"
62017
+ },
62018
+ else: {
62019
+ kind: "add",
62020
+ args: [
62021
+ {
62022
+ kind: "mulRate",
62023
+ base: {
62024
+ kind: "mulInt",
62025
+ base: money29("100"),
62026
+ count: { kind: "sub", left: fact32("businessMilesDriven"), right: fact32("businessMilesDrivenFromJuly") }
62027
+ },
62028
+ rate: { num: "725", den: "1000" },
62029
+ round: "half-up"
62030
+ },
62031
+ {
62032
+ kind: "mulRate",
62033
+ base: { kind: "mulInt", base: money29("100"), count: fact32("businessMilesDrivenFromJuly") },
62034
+ rate: { num: "760", den: "1000" },
62035
+ round: "half-up"
62036
+ }
62037
+ ]
62038
+ }
62039
+ },
62040
+ else: money29("0")
62041
+ }
62042
+ }
61380
62043
  ];
61381
62044
 
61382
62045
  // ../corpus-us-federal/dist/rules/pension.js
@@ -61693,7 +62356,9 @@ var actcMaximum = {
61693
62356
  url: "https://www.irs.gov/instructions/i1040s8",
61694
62357
  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.]"
61695
62358
  },
61696
- ...FROM15,
62359
+ effectiveFrom: "2025-01-01",
62360
+ effectiveTo: "2027-01-01",
62361
+ // the § 24(h)(5) amount is indexed: $1,800 for 2027 (v2)
61697
62362
  output: { type: "money" },
61698
62363
  parameters: {
61699
62364
  refundableCapPerChild: { value: "170000", type: "money" },
@@ -61708,6 +62373,33 @@ var actcMaximum = {
61708
62373
  round: "half-up"
61709
62374
  })
61710
62375
  };
62376
+ var actcMaximum2027 = {
62377
+ id: `${J26}.actc.maximum`,
62378
+ version: 2,
62379
+ jurisdiction: J26,
62380
+ title: "Maximum additional child tax credit (Schedule 8812 Credit Limit Worksheet B, line 13; TY2027)",
62381
+ citation: {
62382
+ 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",
62383
+ section: "\xA7 24(d)(1)(B)(i); \xA7 24(h)(5)",
62384
+ url: "https://www.irs.gov/instructions/i1040s8",
62385
+ 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.]"
62386
+ },
62387
+ effectiveFrom: "2027-01-01",
62388
+ effectiveTo: "2028-01-01",
62389
+ output: { type: "money" },
62390
+ parameters: {
62391
+ refundableCapPerChild: { value: "180000", type: "money" },
62392
+ // $1,800 (2027)
62393
+ earnedIncomeFloor: { value: "250000", type: "money" }
62394
+ // $2,500
62395
+ },
62396
+ formula: min4({ kind: "mulInt", base: param18("refundableCapPerChild"), count: fact35("qualifyingChildren") }, {
62397
+ kind: "mulRate",
62398
+ 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")))),
62399
+ rate: { num: "15", den: "100" },
62400
+ round: "half-up"
62401
+ })
62402
+ };
61711
62403
  var worksheetBApplies = {
61712
62404
  id: `${J26}.energy.clean.worksheet_b_applies`,
61713
62405
  version: 1,
@@ -61787,6 +62479,7 @@ var residentialEnergyRules = [
61787
62479
  excerpt: "Line 13: 'Add lines 6b, 11, and 12'."
61788
62480
  }, add4(ruleRef30(`${J26}.energy.clean.line6b`), ruleRef30(`${J26}.energy.clean.line11`), ruleRef30(`${J26}.energy.clean.line12`))),
61789
62481
  actcMaximum,
62482
+ actcMaximum2027,
61790
62483
  worksheetBApplies,
61791
62484
  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)", {
61792
62485
  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",
@@ -75098,6 +75791,32 @@ var thresholdRules = [
75098
75791
  ]
75099
75792
  }
75100
75793
  },
75794
+ {
75795
+ id: `${J29}.qbi.threshold`,
75796
+ version: 3,
75797
+ jurisdiction: J29,
75798
+ title: "\xA7 199A threshold amount (TY2027)",
75799
+ citation: {
75800
+ source: "26 U.S.C. \xA7 199A(e)(2); Rev. Proc. 2026-35 \xA7 3.28(1)",
75801
+ section: "\xA7 199A(e)(2)",
75802
+ url: CORNELL,
75803
+ 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))."
75804
+ },
75805
+ effectiveFrom: "2027-01-01",
75806
+ effectiveTo: "2028-01-01",
75807
+ output: { type: "money" },
75808
+ formula: {
75809
+ kind: "match",
75810
+ on: fact39("filingStatus"),
75811
+ cases: [
75812
+ { when: "mfj", value: money36("41660000") },
75813
+ { when: "mfs", value: money36("20832500") },
75814
+ { when: "single", value: money36("20830000") },
75815
+ { when: "hoh", value: money36("20830000") },
75816
+ { when: "qss", value: money36("20830000") }
75817
+ ]
75818
+ }
75819
+ },
75101
75820
  {
75102
75821
  id: `${J29}.qbi.phase_in_range`,
75103
75822
  version: 1,
@@ -75130,6 +75849,22 @@ var thresholdRules = [
75130
75849
  output: { type: "money" },
75131
75850
  formula: iff23(isStatus32("mfj"), money36("15000000"), money36("7500000"))
75132
75851
  },
75852
+ {
75853
+ id: `${J29}.qbi.phase_in_range`,
75854
+ version: 3,
75855
+ jurisdiction: J29,
75856
+ title: "\xA7 199A phase-in range (TY2027: $75,000, $150,000 joint \u2014 OBBBA \xA7 70105)",
75857
+ citation: {
75858
+ 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)",
75859
+ section: "\xA7 199A(b)(3)(B)(ii)(II)",
75860
+ url: CORNELL,
75861
+ excerpt: "For taxable years beginning after December 31, 2025, the phase-in range is $75,000 ($150,000 for a joint return)."
75862
+ },
75863
+ effectiveFrom: "2027-01-01",
75864
+ effectiveTo: "2028-01-01",
75865
+ output: { type: "money" },
75866
+ formula: iff23(isStatus32("mfj"), money36("15000000"), money36("7500000"))
75867
+ },
75133
75868
  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`))))
75134
75869
  ];
75135
75870
  function scheduleA(u, amount) {
@@ -75245,7 +75980,7 @@ var hasBusinessIncome = {
75245
75980
  ]
75246
75981
  };
75247
75982
  var taxableBeforeQbi = ruleRef34("us.federal.taxable_income_before_qbi");
75248
- function qbiRule(version2, effectiveFrom, effectiveTo, yearLabel, source, withMinimum) {
75983
+ function qbiRule(version2, effectiveFrom, effectiveTo, yearLabel, source, minimum) {
75249
75984
  const overall = pctOf3("20", "100", {
75250
75985
  kind: "max0",
75251
75986
  arg: {
@@ -75258,8 +75993,8 @@ function qbiRule(version2, effectiveFrom, effectiveTo, yearLabel, source, withMi
75258
75993
  }
75259
75994
  });
75260
75995
  const limited = { kind: "min", args: [ruleRef34("us.federal.qbi.total_component"), overall] };
75261
- const withFloor = withMinimum ? {
75262
- // OBBBA § 70105: $400 minimum when QBI ≥ $1,000 (TY2026+)
75996
+ const withFloor = minimum ? {
75997
+ // OBBBA § 70105: the § 199A(i) minimum (TY2026+; indexed after 2026)
75263
75998
  kind: "if",
75264
75999
  cond: { kind: "cmp", op: "ge", left: ruleRef34("us.federal.qbi.active_total"), right: param23("minQbiFloor") },
75265
76000
  then: { kind: "max", args: [limited, param23("minDeduction")] },
@@ -75274,16 +76009,14 @@ function qbiRule(version2, effectiveFrom, effectiveTo, yearLabel, source, withMi
75274
76009
  source: `26 U.S.C. \xA7 199A; ${source}`,
75275
76010
  section: "\xA7 199A(a)\u2013(d)",
75276
76011
  url: "https://www.law.cornell.edu/uscode/text/26/199A",
75277
- 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.]`
76012
+ 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.]`
75278
76013
  },
75279
76014
  effectiveFrom,
75280
76015
  effectiveTo,
75281
76016
  output: { type: "money" },
75282
- parameters: withMinimum ? {
75283
- minDeduction: { value: "40000", type: "money" },
75284
- // $400
75285
- minQbiFloor: { value: "100000", type: "money" }
75286
- // $1,000
76017
+ parameters: minimum ? {
76018
+ minDeduction: { value: minimum.deductionCents, type: "money" },
76019
+ minQbiFloor: { value: minimum.testCents, type: "money" }
75287
76020
  } : {},
75288
76021
  formula: {
75289
76022
  kind: "if",
@@ -75301,7 +76034,7 @@ var qbiRules = [
75301
76034
  "2026-01-01",
75302
76035
  "2025",
75303
76036
  "Rev. Proc. 2024-40 \xA7 2.27",
75304
- false
76037
+ null
75305
76038
  ),
75306
76039
  qbiRule(
75307
76040
  14,
@@ -75310,8 +76043,9 @@ var qbiRules = [
75310
76043
  "2027-01-01",
75311
76044
  "2026",
75312
76045
  "Rev. Proc. 2025-32 \xA7 4.26; OBBBA \xA7 70105 (range + $400 minimum)",
75313
- true
76046
+ { deductionCents: "40000", testCents: "100000" }
75314
76047
  ),
76048
+ qbiRule(15, "2027-01-01", "2028-01-01", "2027", "Rev. Proc. 2026-35 \xA7 3.28; OBBBA \xA7 70105", { deductionCents: "41500", testCents: "103000" }),
75315
76049
  ...qbiBusinessRules
75316
76050
  ];
75317
76051
 
@@ -75513,8 +76247,11 @@ var selfEmploymentRules = [
75513
76247
  // $176,100
75514
76248
  seTaxRule(taxpayer, 2, "2026-01-01", "2027-01-01", "18450000", "2026"),
75515
76249
  // $184,500
76250
+ seTaxRule(taxpayer, 3, "2027-01-01", "2028-01-01", "19230000", "2027"),
76251
+ // $192,300 (91 FR 67380)
75516
76252
  seTaxRule(spouse, 1, "2025-01-01", "2026-01-01", "17610000", "2025"),
75517
76253
  seTaxRule(spouse, 2, "2026-01-01", "2027-01-01", "18450000", "2026"),
76254
+ seTaxRule(spouse, 3, "2027-01-01", "2028-01-01", "19230000", "2027"),
75518
76255
  {
75519
76256
  id: "us.federal.se_tax",
75520
76257
  version: 7,
@@ -75942,6 +76679,37 @@ var standardDeductionRules = [
75942
76679
  ]
75943
76680
  }
75944
76681
  },
76682
+ {
76683
+ id: "us.federal.standard_deduction.base_amount",
76684
+ version: 4,
76685
+ jurisdiction: J30,
76686
+ title: "Basic standard deduction amount by filing status (TY2027)",
76687
+ citation: {
76688
+ source: "26 U.S.C. \xA7 63(c); Rev. Proc. 2026-35",
76689
+ section: "Rev. Proc. 2026-35 \xA7 3.15(1)",
76690
+ url: "https://www.irs.gov/pub/irs-drop/rp-26-35.pdf",
76691
+ 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)."
76692
+ },
76693
+ effectiveFrom: "2027-01-01",
76694
+ effectiveTo: "2028-01-01",
76695
+ output: { type: "money" },
76696
+ formula: {
76697
+ kind: "match",
76698
+ on: fact44("filingStatus"),
76699
+ cases: [
76700
+ { when: "single", value: money41("1660000") },
76701
+ // $16,600
76702
+ { when: "mfs", value: money41("1660000") },
76703
+ // $16,600
76704
+ { when: "mfj", value: money41("3320000") },
76705
+ // $33,200
76706
+ { when: "qss", value: money41("3320000") },
76707
+ // $33,200 (surviving spouse)
76708
+ { when: "hoh", value: money41("2492500") }
76709
+ // $24,925
76710
+ ]
76711
+ }
76712
+ },
75945
76713
  {
75946
76714
  id: "us.federal.standard_deduction.base",
75947
76715
  version: 1,
@@ -75993,6 +76761,39 @@ var standardDeductionRules = [
75993
76761
  },
75994
76762
  overrides: { ruleId: "us.federal.standard_deduction.base", priority: 10 }
75995
76763
  },
76764
+ {
76765
+ id: "us.federal.standard_deduction.dependent_limit",
76766
+ version: 2,
76767
+ jurisdiction: J30,
76768
+ title: "Limitation on basic standard deduction of a dependent (TY2027)",
76769
+ citation: {
76770
+ source: "26 U.S.C. \xA7 63(c)(5); Rev. Proc. 2026-35 \xA7 3.15(2)",
76771
+ section: "\xA7 63(c)(5)",
76772
+ url: "https://www.irs.gov/pub/irs-drop/rp-26-35.pdf",
76773
+ 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."
76774
+ },
76775
+ effectiveFrom: "2027-01-01",
76776
+ effectiveTo: "2028-01-01",
76777
+ output: { type: "money" },
76778
+ applicability: fact44("isClaimedAsDependent"),
76779
+ // min(normal base amount, max($1,400, earned income + $500)); earned income ≈ wages
76780
+ formula: {
76781
+ kind: "min",
76782
+ args: [
76783
+ ruleRef38("us.federal.standard_deduction.base_amount"),
76784
+ {
76785
+ kind: "max",
76786
+ args: [
76787
+ money41("140000"),
76788
+ // $1,400
76789
+ { kind: "add", args: [fact44("wages"), money41("50000")] }
76790
+ // + $500
76791
+ ]
76792
+ }
76793
+ ]
76794
+ },
76795
+ overrides: { ruleId: "us.federal.standard_deduction.base", priority: 10 }
76796
+ },
75996
76797
  {
75997
76798
  id: "us.federal.standard_deduction.mfs_spouse_itemizes",
75998
76799
  version: 1,
@@ -76032,6 +76833,12 @@ var standardDeductionRules = [
76032
76833
  married: "$1,650",
76033
76834
  unmarried: "$2,050"
76034
76835
  }),
76836
+ additionalRule(3, "2027-01-01", "2028-01-01", "170000", "210000", {
76837
+ sourceRevProc: "Rev. Proc. 2026-35 \xA7 3.15(3)",
76838
+ year: "2027",
76839
+ married: "$1,700",
76840
+ unmarried: "$2,100"
76841
+ }),
76035
76842
  {
76036
76843
  id: "us.federal.standard_deduction",
76037
76844
  version: 1,
@@ -76296,7 +77103,7 @@ var tipsOvertimeRules = [
76296
77103
  // ../corpus-us-federal/dist/index.js
76297
77104
  var corpusInput = {
76298
77105
  name: "@invaro/opentax-corpus-us-federal",
76299
- version: "0.44.0",
77106
+ version: "0.45.0",
76300
77107
  rules: [
76301
77108
  ...corporateRules,
76302
77109
  ...corporate1120Rules,
@@ -76874,6 +77681,7 @@ var INDIVIDUAL_GROUPS = {
76874
77681
  "selfEmployedHealthPremiums",
76875
77682
  "homeOfficeSquareFeet",
76876
77683
  "businessMilesDriven",
77684
+ "businessMilesDrivenFromJuly",
76877
77685
  "aggregateBusinessLoss"
76878
77686
  ],
76879
77687
  adjustments: [
@@ -76904,6 +77712,7 @@ var INDIVIDUAL_GROUPS = {
76904
77712
  "noncashCharitableContributions",
76905
77713
  "investmentInterestDeduction",
76906
77714
  "gamblingLossesItemized",
77715
+ "gamblingWinnings",
76907
77716
  "otherItemizedDeductions",
76908
77717
  "casualtyFederalDisasterLosses",
76909
77718
  "casualtyQualifiedDisasterLosses",