@trajectonomics/tax 0.2.0-alpha.1 → 0.2.0-alpha.2

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.
@@ -394,6 +394,7 @@ export declare enum UsStateField {
394
394
  Surtax = "state.surtax",
395
395
  SurtaxThreshold = "state.surtaxThreshold",
396
396
  PhaseOutThreshold = "state.phaseOutThreshold",
397
+ PhaseOutReductionStep = "state.phaseOutReductionStep",
397
398
  CreditsPersonal = "state.credits.personal",
398
399
  CreditsDependent = "state.credits.dependent",
399
400
  CreditsClaimedNonRefundable = "state.credits.claimedNonRefundable",
@@ -572,11 +573,15 @@ type UsStatePerStatus = Readonly<Record<UsFilingStatus, number>>;
572
573
  /**
573
574
  * Linear phase-out to zero: the allowed share falls from 1 to 0 as federal AGI rises from
574
575
  * `start` to `start + width` (Maine standard deduction, 36 M.R.S. § 5124-C(2)).
576
+ *
577
+ * When `reductionStep` is set, the removed amount is rounded down to that multiple in major
578
+ * dollars before subtraction (South Carolina SCIAD, S.C. Code § 12-6-1140(15)(c)).
575
579
  */
576
580
  interface UsStateLinearPhaseOut {
577
581
  readonly kind: "linear";
578
582
  readonly start: UsStatePerStatus;
579
583
  readonly width: UsStatePerStatus;
584
+ readonly reductionStep?: number;
580
585
  }
581
586
  /**
582
587
  * Stepped disallowance: `ratePerStep` of the amount is disallowed for each `step` dollars, or
@@ -603,6 +608,20 @@ interface UsStateTieredPhaseOut {
603
608
  }
604
609
  /** Statutory income-based reduction of a deduction or exemption. */
605
610
  type UsStatePhaseOut = UsStateLinearPhaseOut | UsStateSteppedPhaseOut | UsStateTieredPhaseOut;
611
+ /**
612
+ * Verification levels for a state's 2026 parameter table, from the strongest to the weakest.
613
+ *
614
+ * - `unconfirmed`: neither an official document nor a matching secondary report was read.
615
+ * - `reported`: only secondary reports (news, vendor summaries) agree with the table.
616
+ * - `partial`: an official document confirms some figures (rates or amounts) but not all.
617
+ * - `official`: an official state document or enacted bill confirms every figure.
618
+ *
619
+ * Every level is recorded per state in `references/SOURCES.md` with the document URL and
620
+ * retrieval date.
621
+ */
622
+ export declare const US_STATE_VERIFICATION_LEVELS: readonly ["official", "partial", "reported", "unconfirmed"];
623
+ /** How far a state's 2026 parameter table is verified against an official document. */
624
+ type UsStateVerification = (typeof US_STATE_VERIFICATION_LEVELS)[number];
606
625
  /** Surtax threshold: one amount for every filing status, or an amount per filing status. */
607
626
  type UsStateSurtaxThreshold = number | Readonly<Record<UsFilingStatus, number>>;
608
627
  /** Optional millionaire or high-income surtax applied above a taxable-income threshold. */
@@ -624,6 +643,7 @@ interface UsStateParameters {
624
643
  readonly surtax?: UsStateSurtax;
625
644
  readonly standardDeductionPhaseOut?: UsStatePhaseOut;
626
645
  readonly dependentExemptionPhaseOut?: UsStatePhaseOut;
646
+ readonly verification: UsStateVerification;
627
647
  }
628
648
  /**
629
649
  * Consolidated statutory parameter table for all 50 US states and the District of Columbia
@@ -645,5 +665,5 @@ export declare const us: TaxSystem<UsTaxInput, "USD", UsTaxBreakdown>;
645
665
  * @statute IRC § 1 et seq.; state individual income tax statutes for Tax Year 2026.
646
666
  */
647
667
  export declare function calculateUsTax(input: UsTaxInput): TaxResult<"USD", UsTaxBreakdown>;
648
- export { type UsAdjustmentsBreakdown, type UsAdjustmentsInput, type UsAmtBreakdown, type UsChildCreditsBreakdown, type UsCreditsBreakdown, type UsCreditsInput, type UsEducationCreditStudent, type UsEducationCreditsBreakdown, type UsEitcBreakdown, type UsFicaBreakdown, UsPayrollField as UsFicaField, type UsFilingStatus, type UsIncomeInput, type UsItemizedBreakdown, type UsItemizedDeductionsInput, type UsNiitBreakdown, type UsPreferentialSlice, type UsScheduleSeBreakdown, type UsStandardDeductionBreakdown, type UsStateBreakdown, type UsStateCode, type UsStateCreditsBreakdown, type UsStateCreditsInput, type UsStateParameters, type UsStateSurtax, type UsStateTaxType, type UsTaxBreakdown, type UsTaxInput };
668
+ export { type UsAdjustmentsBreakdown, type UsAdjustmentsInput, type UsAmtBreakdown, type UsChildCreditsBreakdown, type UsCreditsBreakdown, type UsCreditsInput, type UsEducationCreditStudent, type UsEducationCreditsBreakdown, type UsEitcBreakdown, type UsFicaBreakdown, UsPayrollField as UsFicaField, type UsFilingStatus, type UsIncomeInput, type UsItemizedBreakdown, type UsItemizedDeductionsInput, type UsNiitBreakdown, type UsPreferentialSlice, type UsScheduleSeBreakdown, type UsStandardDeductionBreakdown, type UsStateBreakdown, type UsStateCode, type UsStateCreditsBreakdown, type UsStateCreditsInput, type UsStateParameters, type UsStateSurtax, type UsStateTaxType, type UsStateVerification, type UsTaxBreakdown, type UsTaxInput };
649
669
  //# sourceMappingURL=index.d.cts.map
@@ -394,6 +394,7 @@ export declare enum UsStateField {
394
394
  Surtax = "state.surtax",
395
395
  SurtaxThreshold = "state.surtaxThreshold",
396
396
  PhaseOutThreshold = "state.phaseOutThreshold",
397
+ PhaseOutReductionStep = "state.phaseOutReductionStep",
397
398
  CreditsPersonal = "state.credits.personal",
398
399
  CreditsDependent = "state.credits.dependent",
399
400
  CreditsClaimedNonRefundable = "state.credits.claimedNonRefundable",
@@ -572,11 +573,15 @@ type UsStatePerStatus = Readonly<Record<UsFilingStatus, number>>;
572
573
  /**
573
574
  * Linear phase-out to zero: the allowed share falls from 1 to 0 as federal AGI rises from
574
575
  * `start` to `start + width` (Maine standard deduction, 36 M.R.S. § 5124-C(2)).
576
+ *
577
+ * When `reductionStep` is set, the removed amount is rounded down to that multiple in major
578
+ * dollars before subtraction (South Carolina SCIAD, S.C. Code § 12-6-1140(15)(c)).
575
579
  */
576
580
  interface UsStateLinearPhaseOut {
577
581
  readonly kind: "linear";
578
582
  readonly start: UsStatePerStatus;
579
583
  readonly width: UsStatePerStatus;
584
+ readonly reductionStep?: number;
580
585
  }
581
586
  /**
582
587
  * Stepped disallowance: `ratePerStep` of the amount is disallowed for each `step` dollars, or
@@ -603,6 +608,20 @@ interface UsStateTieredPhaseOut {
603
608
  }
604
609
  /** Statutory income-based reduction of a deduction or exemption. */
605
610
  type UsStatePhaseOut = UsStateLinearPhaseOut | UsStateSteppedPhaseOut | UsStateTieredPhaseOut;
611
+ /**
612
+ * Verification levels for a state's 2026 parameter table, from the strongest to the weakest.
613
+ *
614
+ * - `unconfirmed`: neither an official document nor a matching secondary report was read.
615
+ * - `reported`: only secondary reports (news, vendor summaries) agree with the table.
616
+ * - `partial`: an official document confirms some figures (rates or amounts) but not all.
617
+ * - `official`: an official state document or enacted bill confirms every figure.
618
+ *
619
+ * Every level is recorded per state in `references/SOURCES.md` with the document URL and
620
+ * retrieval date.
621
+ */
622
+ export declare const US_STATE_VERIFICATION_LEVELS: readonly ["official", "partial", "reported", "unconfirmed"];
623
+ /** How far a state's 2026 parameter table is verified against an official document. */
624
+ type UsStateVerification = (typeof US_STATE_VERIFICATION_LEVELS)[number];
606
625
  /** Surtax threshold: one amount for every filing status, or an amount per filing status. */
607
626
  type UsStateSurtaxThreshold = number | Readonly<Record<UsFilingStatus, number>>;
608
627
  /** Optional millionaire or high-income surtax applied above a taxable-income threshold. */
@@ -624,6 +643,7 @@ interface UsStateParameters {
624
643
  readonly surtax?: UsStateSurtax;
625
644
  readonly standardDeductionPhaseOut?: UsStatePhaseOut;
626
645
  readonly dependentExemptionPhaseOut?: UsStatePhaseOut;
646
+ readonly verification: UsStateVerification;
627
647
  }
628
648
  /**
629
649
  * Consolidated statutory parameter table for all 50 US states and the District of Columbia
@@ -645,5 +665,5 @@ export declare const us: TaxSystem<UsTaxInput, "USD", UsTaxBreakdown>;
645
665
  * @statute IRC § 1 et seq.; state individual income tax statutes for Tax Year 2026.
646
666
  */
647
667
  export declare function calculateUsTax(input: UsTaxInput): TaxResult<"USD", UsTaxBreakdown>;
648
- export { type UsAdjustmentsBreakdown, type UsAdjustmentsInput, type UsAmtBreakdown, type UsChildCreditsBreakdown, type UsCreditsBreakdown, type UsCreditsInput, type UsEducationCreditStudent, type UsEducationCreditsBreakdown, type UsEitcBreakdown, type UsFicaBreakdown, UsPayrollField as UsFicaField, type UsFilingStatus, type UsIncomeInput, type UsItemizedBreakdown, type UsItemizedDeductionsInput, type UsNiitBreakdown, type UsPreferentialSlice, type UsScheduleSeBreakdown, type UsStandardDeductionBreakdown, type UsStateBreakdown, type UsStateCode, type UsStateCreditsBreakdown, type UsStateCreditsInput, type UsStateParameters, type UsStateSurtax, type UsStateTaxType, type UsTaxBreakdown, type UsTaxInput };
668
+ export { type UsAdjustmentsBreakdown, type UsAdjustmentsInput, type UsAmtBreakdown, type UsChildCreditsBreakdown, type UsCreditsBreakdown, type UsCreditsInput, type UsEducationCreditStudent, type UsEducationCreditsBreakdown, type UsEitcBreakdown, type UsFicaBreakdown, UsPayrollField as UsFicaField, type UsFilingStatus, type UsIncomeInput, type UsItemizedBreakdown, type UsItemizedDeductionsInput, type UsNiitBreakdown, type UsPreferentialSlice, type UsScheduleSeBreakdown, type UsStandardDeductionBreakdown, type UsStateBreakdown, type UsStateCode, type UsStateCreditsBreakdown, type UsStateCreditsInput, type UsStateParameters, type UsStateSurtax, type UsStateTaxType, type UsStateVerification, type UsTaxBreakdown, type UsTaxInput };
649
669
  //# sourceMappingURL=index.d.mts.map
package/dist/us/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as usd, d as toMinorUnits, f as multiplySafeInteger, h as TaxValidationError, n as evaluateBrackets, s as applyPercentage, t as clampCap, u as fromMinorUnits } from "../clamp-CdcDymBJ.mjs";
1
+ import { a as usd, d as toMinorUnits, f as multiplySafeInteger, h as TaxValidationError, n as evaluateBrackets, p as validateMonetaryAmount, s as applyPercentage, t as clampCap, u as fromMinorUnits } from "../clamp-CdcDymBJ.mjs";
2
2
  // src/us/parameters/amt.ts
3
3
  /**
4
4
  * Statutory 2026 Alternative Minimum Tax (AMT) exemptions, phaseouts, and rates.
@@ -423,6 +423,7 @@ let UsStateField = /* @__PURE__ */ function(UsStateField) {
423
423
  UsStateField["Surtax"] = "state.surtax";
424
424
  UsStateField["SurtaxThreshold"] = "state.surtaxThreshold";
425
425
  UsStateField["PhaseOutThreshold"] = "state.phaseOutThreshold";
426
+ UsStateField["PhaseOutReductionStep"] = "state.phaseOutReductionStep";
426
427
  UsStateField["CreditsPersonal"] = "state.credits.personal";
427
428
  UsStateField["CreditsDependent"] = "state.credits.dependent";
428
429
  UsStateField["CreditsClaimedNonRefundable"] = "state.credits.claimedNonRefundable";
@@ -513,6 +514,7 @@ function defineState(def) {
513
514
  personalCredit: exemptionAmounts(personalCredit[0], personalCredit[1], personalCredit[2]),
514
515
  dependentExemption: def.dependentExemption ?? 0,
515
516
  dependentCredit: def.dependentCredit ?? 0,
517
+ verification: def.verification,
516
518
  ...optionalRules(def)
517
519
  };
518
520
  }
@@ -532,6 +534,7 @@ const FLAT_STATES_A = [
532
534
  defineState({
533
535
  code: "AZ",
534
536
  name: "Arizona",
537
+ verification: "unconfirmed",
535
538
  type: "flat",
536
539
  single: [[0, .025]],
537
540
  mfj: [[0, .025]],
@@ -545,6 +548,7 @@ const FLAT_STATES_A = [
545
548
  defineState({
546
549
  code: "CO",
547
550
  name: "Colorado",
551
+ verification: "unconfirmed",
548
552
  type: "flat",
549
553
  single: [[0, .044]],
550
554
  mfj: [[0, .044]],
@@ -553,6 +557,7 @@ const FLAT_STATES_A = [
553
557
  defineState({
554
558
  code: "GA",
555
559
  name: "Georgia",
560
+ verification: "official",
556
561
  type: "flat",
557
562
  single: [[0, .0499]],
558
563
  mfj: [[0, .0499]],
@@ -566,6 +571,7 @@ const FLAT_STATES_A = [
566
571
  defineState({
567
572
  code: "ID",
568
573
  name: "Idaho",
574
+ verification: "reported",
569
575
  type: "flat",
570
576
  single: [[4811, .053]],
571
577
  mfj: [[9622, .053]],
@@ -574,6 +580,7 @@ const FLAT_STATES_A = [
574
580
  defineState({
575
581
  code: "IL",
576
582
  name: "Illinois",
583
+ verification: "reported",
577
584
  type: "flat",
578
585
  single: [[0, .0495]],
579
586
  mfj: [[0, .0495]],
@@ -584,6 +591,7 @@ const FLAT_STATES_A = [
584
591
  defineState({
585
592
  code: "IN",
586
593
  name: "Indiana",
594
+ verification: "reported",
587
595
  type: "flat",
588
596
  single: [[0, .0295]],
589
597
  mfj: [[0, .0295]],
@@ -594,6 +602,7 @@ const FLAT_STATES_A = [
594
602
  defineState({
595
603
  code: "IA",
596
604
  name: "Iowa",
605
+ verification: "official",
597
606
  type: "flat",
598
607
  single: [[0, .038]],
599
608
  mfj: [[0, .038]],
@@ -607,6 +616,7 @@ const FLAT_STATES_B = [
607
616
  defineState({
608
617
  code: "KY",
609
618
  name: "Kentucky",
619
+ verification: "official",
610
620
  type: "flat",
611
621
  single: [[0, .035]],
612
622
  mfj: [[0, .035]],
@@ -619,6 +629,7 @@ const FLAT_STATES_B = [
619
629
  defineState({
620
630
  code: "MA",
621
631
  name: "Massachusetts",
632
+ verification: "reported",
622
633
  type: "flat",
623
634
  single: [[0, .05]],
624
635
  mfj: [[0, .05]],
@@ -637,6 +648,7 @@ const FLAT_STATES_B = [
637
648
  defineState({
638
649
  code: "MI",
639
650
  name: "Michigan",
651
+ verification: "reported",
640
652
  type: "flat",
641
653
  single: [[0, .0425]],
642
654
  mfj: [[0, .0425]],
@@ -647,6 +659,7 @@ const FLAT_STATES_B = [
647
659
  defineState({
648
660
  code: "MS",
649
661
  name: "Mississippi",
662
+ verification: "unconfirmed",
650
663
  type: "flat",
651
664
  single: [[1e4, .04]],
652
665
  mfj: [[1e4, .04]],
@@ -657,6 +670,7 @@ const FLAT_STATES_B = [
657
670
  defineState({
658
671
  code: "NC",
659
672
  name: "North Carolina",
673
+ verification: "official",
660
674
  type: "flat",
661
675
  single: [[0, .0399]],
662
676
  mfj: [[0, .0399]],
@@ -665,6 +679,7 @@ const FLAT_STATES_B = [
665
679
  defineState({
666
680
  code: "PA",
667
681
  name: "Pennsylvania",
682
+ verification: "unconfirmed",
668
683
  type: "flat",
669
684
  single: [[0, .0307]],
670
685
  mfj: [[0, .0307]],
@@ -673,6 +688,7 @@ const FLAT_STATES_B = [
673
688
  defineState({
674
689
  code: "UT",
675
690
  name: "Utah",
691
+ verification: "official",
676
692
  type: "flat",
677
693
  single: [[0, .0445]],
678
694
  mfj: [[0, .0445]],
@@ -689,6 +705,7 @@ const FLAT_STATES_B = [
689
705
  const FLAT_STATES_C = [defineState({
690
706
  code: "LA",
691
707
  name: "Louisiana",
708
+ verification: "official",
692
709
  type: "flat",
693
710
  single: [[0, .03]],
694
711
  mfj: [[0, .03]],
@@ -700,6 +717,7 @@ const FLAT_STATES_C = [defineState({
700
717
  }), defineState({
701
718
  code: "OH",
702
719
  name: "Ohio",
720
+ verification: "partial",
703
721
  type: "flat",
704
722
  single: [[26050, .0275]],
705
723
  mfj: [[26050, .0275]],
@@ -724,6 +742,7 @@ function noTaxState(code, name) {
724
742
  return defineState({
725
743
  code,
726
744
  name,
745
+ verification: "official",
727
746
  type: "none",
728
747
  single: [[0, 0]],
729
748
  mfj: [[0, 0]],
@@ -758,6 +777,7 @@ const NO_TAX_STATES = [
758
777
  const US_2026_STATE_AL = defineState({
759
778
  code: "AL",
760
779
  name: "Alabama",
780
+ verification: "unconfirmed",
761
781
  type: "progressive",
762
782
  single: [
763
783
  [0, .02],
@@ -785,14 +805,16 @@ const US_2026_STATE_AL = defineState({
785
805
  /**
786
806
  * 2026 Arkansas individual income tax parameters.
787
807
  *
788
- * Brackets from the DFA 2026 withholding formula (0% to $5,599, then 2%, 3%, 3.4%); the top rate is
789
- * 3.7% after H.B. 1001 (retroactive to 2026-01-01), as reported by EY and Bloomberg Tax.
808
+ * Brackets from the DFA 2026 withholding formula now served (0% to $5,599, then 2%, 3%, 3.4%
809
+ * to $26,399 and 3.70% above), with the $2,470 deduction and the $29 per-exemption credit. The formula is a single-employee formula and prints no joint table, so the joint
810
+ * schedule the engine applies to married filers stays unconfirmed.
790
811
  *
791
812
  * @statute Ark. Code Ann. § 26-51-201
792
813
  */
793
814
  const US_2026_STATE_AR = defineState({
794
815
  code: "AR",
795
816
  name: "Arkansas",
817
+ verification: "partial",
796
818
  type: "progressive",
797
819
  single: [
798
820
  [5600, .02],
@@ -814,14 +836,17 @@ const US_2026_STATE_AR = defineState({
814
836
  /**
815
837
  * 2026 California individual income tax parameters.
816
838
  *
817
- * FTB 2026 indexed schedules, deduction ($5,900/$11,800) and exemption credits ($158/$316,
818
- * $491 per dependent). 1% mental health services surtax above $1,000,000.
839
+ * FTB 2026 rate schedules for all three filing statuses. The 2026 standard deduction
840
+ * ($5,900/$11,800) and exemption credits ($158/$316, $491 per dependent) are still the
841
+ * 2025 values x 1.034 because FTB has not published the 2026 index. 1% mental health services
842
+ * surtax above $1,000,000.
819
843
  *
820
844
  * @statute Cal. Rev. & Tax. Code § 17041
821
845
  */
822
846
  const US_2026_STATE_CA = defineState({
823
847
  code: "CA",
824
848
  name: "California",
849
+ verification: "partial",
825
850
  type: "progressive",
826
851
  single: [
827
852
  [0, .01],
@@ -877,6 +902,7 @@ const US_2026_STATE_CA = defineState({
877
902
  const US_2026_STATE_CT = defineState({
878
903
  code: "CT",
879
904
  name: "Connecticut",
905
+ verification: "official",
880
906
  type: "progressive",
881
907
  single: [
882
908
  [0, .02],
@@ -922,6 +948,7 @@ const US_2026_STATE_CT = defineState({
922
948
  const US_2026_STATE_DC = defineState({
923
949
  code: "DC",
924
950
  name: "District of Columbia",
951
+ verification: "unconfirmed",
925
952
  type: "progressive",
926
953
  single: [
927
954
  [0, .04],
@@ -956,6 +983,7 @@ const US_2026_STATE_DC = defineState({
956
983
  const US_2026_STATE_DE = defineState({
957
984
  code: "DE",
958
985
  name: "Delaware",
986
+ verification: "unconfirmed",
959
987
  type: "progressive",
960
988
  single: [
961
989
  [2e3, .022],
@@ -990,6 +1018,7 @@ const US_2026_STATE_DE = defineState({
990
1018
  const US_2026_STATE_HI = defineState({
991
1019
  code: "HI",
992
1020
  name: "Hawaii",
1021
+ verification: "official",
993
1022
  type: "progressive",
994
1023
  single: [
995
1024
  [0, .014],
@@ -1050,6 +1079,7 @@ const US_2026_STATE_HI = defineState({
1050
1079
  const US_2026_STATE_KS = defineState({
1051
1080
  code: "KS",
1052
1081
  name: "Kansas",
1082
+ verification: "unconfirmed",
1053
1083
  type: "progressive",
1054
1084
  single: [[0, .052], [23e3, .0558]],
1055
1085
  mfj: [[0, .052], [46e3, .0558]],
@@ -1070,6 +1100,7 @@ const US_2026_STATE_KS = defineState({
1070
1100
  const US_2026_STATE_MD = defineState({
1071
1101
  code: "MD",
1072
1102
  name: "Maryland",
1103
+ verification: "official",
1073
1104
  type: "progressive",
1074
1105
  single: [
1075
1106
  [0, .02],
@@ -1119,6 +1150,7 @@ const US_2026_STATE_MD = defineState({
1119
1150
  const US_2026_STATE_ME = defineState({
1120
1151
  code: "ME",
1121
1152
  name: "Maine",
1153
+ verification: "official",
1122
1154
  type: "progressive",
1123
1155
  single: [
1124
1156
  [0, .058],
@@ -1182,6 +1214,7 @@ const US_2026_STATE_ME = defineState({
1182
1214
  const US_2026_STATE_MN = defineState({
1183
1215
  code: "MN",
1184
1216
  name: "Minnesota",
1217
+ verification: "official",
1185
1218
  type: "progressive",
1186
1219
  single: [
1187
1220
  [0, .0535],
@@ -1252,6 +1285,7 @@ const US_2026_STATE_MN = defineState({
1252
1285
  const US_2026_STATE_MO = defineState({
1253
1286
  code: "MO",
1254
1287
  name: "Missouri",
1288
+ verification: "official",
1255
1289
  type: "progressive",
1256
1290
  single: [
1257
1291
  [1348, .02],
@@ -1282,6 +1316,7 @@ const US_2026_STATE_MO = defineState({
1282
1316
  const US_2026_STATE_MT = defineState({
1283
1317
  code: "MT",
1284
1318
  name: "Montana",
1319
+ verification: "partial",
1285
1320
  type: "progressive",
1286
1321
  single: [[0, .047], [47500, .0565]],
1287
1322
  mfj: [[0, .047], [95e3, .0565]],
@@ -1296,6 +1331,7 @@ const US_2026_STATE_MT = defineState({
1296
1331
  const US_2026_STATE_ND = defineState({
1297
1332
  code: "ND",
1298
1333
  name: "North Dakota",
1334
+ verification: "unconfirmed",
1299
1335
  type: "progressive",
1300
1336
  single: [[48475, .0195], [244825, .025]],
1301
1337
  mfj: [[80975, .0195], [298075, .025]],
@@ -1312,6 +1348,7 @@ const US_2026_STATE_ND = defineState({
1312
1348
  const US_2026_STATE_NE = defineState({
1313
1349
  code: "NE",
1314
1350
  name: "Nebraska",
1351
+ verification: "unconfirmed",
1315
1352
  type: "progressive",
1316
1353
  single: [
1317
1354
  [0, .0246],
@@ -1336,6 +1373,7 @@ const US_2026_STATE_NE = defineState({
1336
1373
  const US_2026_STATE_NJ = defineState({
1337
1374
  code: "NJ",
1338
1375
  name: "New Jersey",
1376
+ verification: "unconfirmed",
1339
1377
  type: "progressive",
1340
1378
  single: [
1341
1379
  [0, .014],
@@ -1370,6 +1408,7 @@ const US_2026_STATE_NJ = defineState({
1370
1408
  const US_2026_STATE_NM = defineState({
1371
1409
  code: "NM",
1372
1410
  name: "New Mexico",
1411
+ verification: "unconfirmed",
1373
1412
  type: "progressive",
1374
1413
  single: [
1375
1414
  [0, .015],
@@ -1401,6 +1440,7 @@ const US_2026_STATE_NM = defineState({
1401
1440
  const US_2026_STATE_NY = defineState({
1402
1441
  code: "NY",
1403
1442
  name: "New York",
1443
+ verification: "partial",
1404
1444
  type: "progressive",
1405
1445
  single: [
1406
1446
  [0, .039],
@@ -1452,6 +1492,7 @@ const US_2026_STATE_NY = defineState({
1452
1492
  const US_2026_STATE_OK = defineState({
1453
1493
  code: "OK",
1454
1494
  name: "Oklahoma",
1495
+ verification: "unconfirmed",
1455
1496
  type: "progressive",
1456
1497
  single: [
1457
1498
  [3750, .025],
@@ -1481,6 +1522,7 @@ const US_2026_STATE_OK = defineState({
1481
1522
  const US_2026_STATE_OR = defineState({
1482
1523
  code: "OR",
1483
1524
  name: "Oregon",
1525
+ verification: "unconfirmed",
1484
1526
  type: "progressive",
1485
1527
  single: [
1486
1528
  [0, .0475],
@@ -1512,6 +1554,7 @@ const US_2026_STATE_OR = defineState({
1512
1554
  const US_2026_STATE_RI = defineState({
1513
1555
  code: "RI",
1514
1556
  name: "Rhode Island",
1557
+ verification: "unconfirmed",
1515
1558
  type: "progressive",
1516
1559
  single: [
1517
1560
  [0, .0375],
@@ -1531,28 +1574,52 @@ const US_2026_STATE_RI = defineState({
1531
1574
  /**
1532
1575
  * 2026 South Carolina individual income tax parameters.
1533
1576
  *
1534
- * @statute S.C. Code Ann. § 12-6-510
1577
+ * Act 110 of 2026 (H.4216, ratified R 117, signed 2026-03-30) replaces the 0% / 3% / 6%
1578
+ * schedule with a 1.99% band to $30,000 and 5.21% above, expressed in the act as "5.21% times
1579
+ * the amount minus $966" (5.21% x 30,000 - 1.99% x 30,000 = 966, so the two bands meet at
1580
+ * $597). It also replaces the federal standard deduction with the South Carolina Income
1581
+ * Adjusted Deduction (SCIAD) of $15,000 single and separate, $22,500 head of household,
1582
+ * $30,000 joint, reduced by (federal AGI - start) / width and floored to $10.
1583
+ *
1584
+ * The $30,000 bracket is indexed under § 12-6-520 and the dependent exemption is indexed
1585
+ * annually; neither 2026 amount is published, so the $4,930 exemption is carried forward
1586
+ * without a 2026 source and the table is recorded as partial. The act also
1587
+ * raised the earned income tax credit to 125% of the federal credit capped at $200; no state
1588
+ * EITC is modelled in this engine.
1589
+ *
1590
+ * @statute S.C. Code §§ 12-6-510(C) (as amended by Act 110 of 2026), 12-6-1140(15)
1535
1591
  */
1592
+ /** Both filing-status axes share one table: the act taxes South Carolina taxable income the same way. */
1593
+ const SC_TIERS = [[0, .0199], [3e4, .0521]];
1536
1594
  const US_2026_STATE_SC = defineState({
1537
1595
  code: "SC",
1538
1596
  name: "South Carolina",
1597
+ verification: "partial",
1539
1598
  type: "progressive",
1540
- single: [
1541
- [0, 0],
1542
- [3640, .03],
1543
- [18230, .06]
1544
- ],
1545
- mfj: [
1546
- [0, 0],
1547
- [3640, .03],
1548
- [18230, .06]
1549
- ],
1599
+ single: SC_TIERS,
1600
+ mfj: SC_TIERS,
1550
1601
  std: [
1551
- 16100,
1552
- 32200,
1553
- 24150
1602
+ 15e3,
1603
+ 3e4,
1604
+ 22500
1554
1605
  ],
1555
- dependentExemption: 4930
1606
+ dependentExemption: 4930,
1607
+ standardDeductionPhaseOut: {
1608
+ kind: "linear",
1609
+ start: {
1610
+ single: 4e4,
1611
+ married_filing_jointly: 8e4,
1612
+ married_filing_separately: 4e4,
1613
+ head_of_household: 6e4
1614
+ },
1615
+ width: {
1616
+ single: 55e3,
1617
+ married_filing_jointly: 11e4,
1618
+ married_filing_separately: 55e3,
1619
+ head_of_household: 82500
1620
+ },
1621
+ reductionStep: 10
1622
+ }
1556
1623
  });
1557
1624
  // src/us/state/parameters/progressive/va.ts
1558
1625
  /**
@@ -1563,6 +1630,7 @@ const US_2026_STATE_SC = defineState({
1563
1630
  const US_2026_STATE_VA = defineState({
1564
1631
  code: "VA",
1565
1632
  name: "Virginia",
1633
+ verification: "reported",
1566
1634
  type: "progressive",
1567
1635
  single: [
1568
1636
  [0, .02],
@@ -1593,6 +1661,7 @@ const US_2026_STATE_VA = defineState({
1593
1661
  const US_2026_STATE_VT = defineState({
1594
1662
  code: "VT",
1595
1663
  name: "Vermont",
1664
+ verification: "unconfirmed",
1596
1665
  type: "progressive",
1597
1666
  single: [
1598
1667
  [0, .0335],
@@ -1620,6 +1689,7 @@ const US_2026_STATE_VT = defineState({
1620
1689
  const US_2026_STATE_WI = defineState({
1621
1690
  code: "WI",
1622
1691
  name: "Wisconsin",
1692
+ verification: "unconfirmed",
1623
1693
  type: "progressive",
1624
1694
  single: [
1625
1695
  [0, .035],
@@ -1671,6 +1741,7 @@ const PROGRESSIVE_STATES = [
1671
1741
  defineState({
1672
1742
  code: "WV",
1673
1743
  name: "West Virginia",
1744
+ verification: "official",
1674
1745
  type: "progressive",
1675
1746
  single: [
1676
1747
  [0, .0211],
@@ -1693,6 +1764,24 @@ const PROGRESSIVE_STATES = [
1693
1764
  }),
1694
1765
  US_2026_STATE_WI
1695
1766
  ];
1767
+ // src/us/state/parameters/verification.ts
1768
+ /**
1769
+ * Verification levels for a state's 2026 parameter table, from the strongest to the weakest.
1770
+ *
1771
+ * - `unconfirmed`: neither an official document nor a matching secondary report was read.
1772
+ * - `reported`: only secondary reports (news, vendor summaries) agree with the table.
1773
+ * - `partial`: an official document confirms some figures (rates or amounts) but not all.
1774
+ * - `official`: an official state document or enacted bill confirms every figure.
1775
+ *
1776
+ * Every level is recorded per state in `references/SOURCES.md` with the document URL and
1777
+ * retrieval date.
1778
+ */
1779
+ const US_STATE_VERIFICATION_LEVELS = [
1780
+ "official",
1781
+ "partial",
1782
+ "reported",
1783
+ "unconfirmed"
1784
+ ];
1696
1785
  // src/us/state/parameters/index.ts
1697
1786
  /**
1698
1787
  * Consolidated statutory parameter table for all 50 US states and the District of Columbia
@@ -2548,10 +2637,18 @@ function calculateUsStateCredits(taxBeforeCreditsCents, personalCreditCents, dep
2548
2637
  function cents(amounts, status, currency) {
2549
2638
  return toMinorUnits(amounts[status], currency, "state.phaseOutThreshold");
2550
2639
  }
2640
+ function reductionStepCents(step, currency) {
2641
+ validateMonetaryAmount(step, "state.phaseOutReductionStep");
2642
+ const centsPerStep = toMinorUnits(step, currency, "state.phaseOutReductionStep");
2643
+ if (centsPerStep < 1) throw new TaxValidationError("state.phaseOutReductionStep", step, "Reduction step must be at least one minor unit");
2644
+ return centsPerStep;
2645
+ }
2551
2646
  function linearReduction(amountCents, excessCents, rule, status, currency) {
2552
2647
  const widthCents = cents(rule.width, status, currency);
2553
2648
  if (excessCents >= widthCents) return amountCents;
2554
- return Math.round(amountCents * excessCents / widthCents);
2649
+ if (rule.reductionStep === void 0) return Math.round(amountCents * excessCents / widthCents);
2650
+ const step = reductionStepCents(rule.reductionStep, currency);
2651
+ return Math.floor(amountCents * excessCents / (widthCents * step)) * step;
2555
2652
  }
2556
2653
  function steppedReduction(amountCents, excessCents, rule, status, currency) {
2557
2654
  const steps = Math.ceil(excessCents / cents(rule.step, status, currency));
@@ -2567,12 +2664,15 @@ function tieredReduction(amountCents, agiCents, rule, status, currency) {
2567
2664
  /**
2568
2665
  * Applies a statutory income-based phase-out to a deduction or exemption.
2569
2666
  *
2570
- * Math: linear removes amount x (AGI - start) / width; stepped removes ratePerStep of the
2571
- * amount for each step or fraction above start (capped at 100%); tiered removes
2572
- * rate x (AGI up to second - start) + secondRate x (AGI - second), capped at maxShare of the
2573
- * amount. Nothing is removed at or below the start threshold.
2574
- * Units: AGI and amounts are integer cents; thresholds are major dollars converted to cents.
2575
- * Throws: TaxValidationError if a threshold cannot be represented as safe integer cents.
2667
+ * Math: linear removes amount x (AGI - start) / width, rounded down to any `reductionStep`
2668
+ * multiple; stepped removes ratePerStep of the amount for each step or fraction above start
2669
+ * (capped at 100%); tiered removes rate x (AGI up to second - start) + secondRate x (AGI -
2670
+ * second), capped at maxShare of the amount. Nothing is removed at or below the start
2671
+ * threshold.
2672
+ * Units: AGI and amounts are integer cents; thresholds and any reduction step are major dollars
2673
+ * converted to cents.
2674
+ * Throws: TaxValidationError if a threshold cannot be represented as safe integer cents, or if
2675
+ * a reduction step is negative or below one minor unit.
2576
2676
  *
2577
2677
  * @param amountCents Deduction or exemption before the phase-out, in integer cents.
2578
2678
  * @param agiCents Federal adjusted gross income in integer cents.
@@ -2580,7 +2680,8 @@ function tieredReduction(amountCents, agiCents, rule, status, currency) {
2580
2680
  * @param phaseOut Optional statutory phase-out rule.
2581
2681
  * @param currency Supported statutory currency threaded for minor-unit conversion.
2582
2682
  * @returns The amount still allowed after the phase-out, in integer cents.
2583
- * @statute 36 M.R.S. § 5124-C(2); Minn. Stat. §§ 290.0121 subd. 2, 290.0123 subd. 5.
2683
+ * @statute 36 M.R.S. § 5124-C(2); S.C. Code § 12-6-1140(15); Minn. Stat. §§ 290.0121 subd. 2,
2684
+ * 290.0123 subd. 5.
2584
2685
  */
2585
2686
  function applyUsStatePhaseOut(amountCents, agiCents, status, phaseOut, currency) {
2586
2687
  if (!phaseOut) return amountCents;
@@ -2892,6 +2993,6 @@ const us = {
2892
2993
  function calculateUsTax(input) {
2893
2994
  return us.calculate(input);
2894
2995
  }
2895
- export { US_2026_ABOVE_THE_LINE_CAPS, US_2026_ADDITIONAL_STANDARD_DEDUCTION, US_2026_AMT, US_2026_CREDITS, US_2026_ITEMIZED, US_2026_NIIT, US_2026_ORDINARY_BRACKETS, US_2026_PARAMETERS, US_2026_PAYROLL, US_2026_PREFERENTIAL_BRACKETS, US_2026_STANDARD_DEDUCTION, US_2026_STATE_PARAMETERS, US_STATE_CODES, UsAdjustmentField, UsAmtField, UsCreditField, UsDeductionField, UsPayrollField as UsFicaField, UsPayrollField, UsIncomeField, UsStateField, UsTaxField, calculateUsTax, us };
2996
+ export { US_2026_ABOVE_THE_LINE_CAPS, US_2026_ADDITIONAL_STANDARD_DEDUCTION, US_2026_AMT, US_2026_CREDITS, US_2026_ITEMIZED, US_2026_NIIT, US_2026_ORDINARY_BRACKETS, US_2026_PARAMETERS, US_2026_PAYROLL, US_2026_PREFERENTIAL_BRACKETS, US_2026_STANDARD_DEDUCTION, US_2026_STATE_PARAMETERS, US_STATE_CODES, US_STATE_VERIFICATION_LEVELS, UsAdjustmentField, UsAmtField, UsCreditField, UsDeductionField, UsPayrollField as UsFicaField, UsPayrollField, UsIncomeField, UsStateField, UsTaxField, calculateUsTax, us };
2896
2997
 
2897
2998
  //# sourceMappingURL=index.mjs.map