@markcolabs/mcp 0.3.0 → 0.4.0

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.
Files changed (114) hide show
  1. package/dist/index.d.ts +9 -35
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +52 -285
  4. package/dist/index.js.map +1 -1
  5. package/package.json +7 -12
  6. package/LICENSE-API.md +0 -111
  7. package/dist/disclaimers/ymyl.d.ts +0 -16
  8. package/dist/disclaimers/ymyl.d.ts.map +0 -1
  9. package/dist/disclaimers/ymyl.js +0 -20
  10. package/dist/disclaimers/ymyl.js.map +0 -1
  11. package/dist/engines/compoundInterest.d.ts +0 -75
  12. package/dist/engines/compoundInterest.d.ts.map +0 -1
  13. package/dist/engines/compoundInterest.js +0 -74
  14. package/dist/engines/compoundInterest.js.map +0 -1
  15. package/dist/engines/data/federalTax.d.ts +0 -47
  16. package/dist/engines/data/federalTax.d.ts.map +0 -1
  17. package/dist/engines/data/federalTax.js +0 -111
  18. package/dist/engines/data/federalTax.js.map +0 -1
  19. package/dist/engines/data/irs2026.d.ts +0 -137
  20. package/dist/engines/data/irs2026.d.ts.map +0 -1
  21. package/dist/engines/data/irs2026.js +0 -113
  22. package/dist/engines/data/irs2026.js.map +0 -1
  23. package/dist/engines/data/rmd2026.d.ts +0 -59
  24. package/dist/engines/data/rmd2026.d.ts.map +0 -1
  25. package/dist/engines/data/rmd2026.js +0 -75
  26. package/dist/engines/data/rmd2026.js.map +0 -1
  27. package/dist/engines/data/ssa.d.ts +0 -39
  28. package/dist/engines/data/ssa.d.ts.map +0 -1
  29. package/dist/engines/data/ssa.js +0 -55
  30. package/dist/engines/data/ssa.js.map +0 -1
  31. package/dist/engines/data/stateTax2026.d.ts +0 -114
  32. package/dist/engines/data/stateTax2026.d.ts.map +0 -1
  33. package/dist/engines/data/stateTax2026.js +0 -348
  34. package/dist/engines/data/stateTax2026.js.map +0 -1
  35. package/dist/engines/hsa.d.ts +0 -110
  36. package/dist/engines/hsa.d.ts.map +0 -1
  37. package/dist/engines/hsa.js +0 -83
  38. package/dist/engines/hsa.js.map +0 -1
  39. package/dist/engines/ira.d.ts +0 -115
  40. package/dist/engines/ira.d.ts.map +0 -1
  41. package/dist/engines/ira.js +0 -127
  42. package/dist/engines/ira.js.map +0 -1
  43. package/dist/engines/mortgage.d.ts +0 -70
  44. package/dist/engines/mortgage.d.ts.map +0 -1
  45. package/dist/engines/mortgage.js +0 -60
  46. package/dist/engines/mortgage.js.map +0 -1
  47. package/dist/engines/paycheck.d.ts +0 -128
  48. package/dist/engines/paycheck.d.ts.map +0 -1
  49. package/dist/engines/paycheck.js +0 -142
  50. package/dist/engines/paycheck.js.map +0 -1
  51. package/dist/engines/retirement401k.d.ts +0 -109
  52. package/dist/engines/retirement401k.d.ts.map +0 -1
  53. package/dist/engines/retirement401k.js +0 -130
  54. package/dist/engines/retirement401k.js.map +0 -1
  55. package/dist/engines/rmd.d.ts +0 -107
  56. package/dist/engines/rmd.d.ts.map +0 -1
  57. package/dist/engines/rmd.js +0 -109
  58. package/dist/engines/rmd.js.map +0 -1
  59. package/dist/engines/rothConversion.d.ts +0 -124
  60. package/dist/engines/rothConversion.d.ts.map +0 -1
  61. package/dist/engines/rothConversion.js +0 -145
  62. package/dist/engines/rothConversion.js.map +0 -1
  63. package/dist/engines/socialSecurity.d.ts +0 -63
  64. package/dist/engines/socialSecurity.d.ts.map +0 -1
  65. package/dist/engines/socialSecurity.js +0 -139
  66. package/dist/engines/socialSecurity.js.map +0 -1
  67. package/dist/envelope.d.ts +0 -76
  68. package/dist/envelope.d.ts.map +0 -1
  69. package/dist/envelope.js +0 -34
  70. package/dist/envelope.js.map +0 -1
  71. package/dist/shared/bounds.d.ts +0 -133
  72. package/dist/shared/bounds.d.ts.map +0 -1
  73. package/dist/shared/bounds.js +0 -206
  74. package/dist/shared/bounds.js.map +0 -1
  75. package/dist/tools/compoundInterest.d.ts +0 -48
  76. package/dist/tools/compoundInterest.d.ts.map +0 -1
  77. package/dist/tools/compoundInterest.js +0 -107
  78. package/dist/tools/compoundInterest.js.map +0 -1
  79. package/dist/tools/hsa.d.ts +0 -58
  80. package/dist/tools/hsa.d.ts.map +0 -1
  81. package/dist/tools/hsa.js +0 -129
  82. package/dist/tools/hsa.js.map +0 -1
  83. package/dist/tools/ira.d.ts +0 -55
  84. package/dist/tools/ira.d.ts.map +0 -1
  85. package/dist/tools/ira.js +0 -117
  86. package/dist/tools/ira.js.map +0 -1
  87. package/dist/tools/mortgage.d.ts +0 -51
  88. package/dist/tools/mortgage.d.ts.map +0 -1
  89. package/dist/tools/mortgage.js +0 -112
  90. package/dist/tools/mortgage.js.map +0 -1
  91. package/dist/tools/paycheck.d.ts +0 -61
  92. package/dist/tools/paycheck.d.ts.map +0 -1
  93. package/dist/tools/paycheck.js +0 -135
  94. package/dist/tools/paycheck.js.map +0 -1
  95. package/dist/tools/retirement401k.d.ts +0 -85
  96. package/dist/tools/retirement401k.d.ts.map +0 -1
  97. package/dist/tools/retirement401k.js +0 -141
  98. package/dist/tools/retirement401k.js.map +0 -1
  99. package/dist/tools/rmd.d.ts +0 -60
  100. package/dist/tools/rmd.d.ts.map +0 -1
  101. package/dist/tools/rmd.js +0 -130
  102. package/dist/tools/rmd.js.map +0 -1
  103. package/dist/tools/rothConversion.d.ts +0 -66
  104. package/dist/tools/rothConversion.d.ts.map +0 -1
  105. package/dist/tools/rothConversion.js +0 -141
  106. package/dist/tools/rothConversion.js.map +0 -1
  107. package/dist/tools/socialSecurity.d.ts +0 -51
  108. package/dist/tools/socialSecurity.d.ts.map +0 -1
  109. package/dist/tools/socialSecurity.js +0 -117
  110. package/dist/tools/socialSecurity.js.map +0 -1
  111. package/dist/util/zod-to-json-schema.d.ts +0 -28
  112. package/dist/util/zod-to-json-schema.d.ts.map +0 -1
  113. package/dist/util/zod-to-json-schema.js +0 -98
  114. package/dist/util/zod-to-json-schema.js.map +0 -1
@@ -1,75 +0,0 @@
1
- /**
2
- * IRS Uniform Lifetime Table (Pub. 590-B Table III, post-2022 version) and
3
- * SECURE 2.0 RMD-start-age tiers for the MCP `rmd` engine.
4
- *
5
- * Mirrored from site/src/utils/rmd-engine.js — `UNIFORM_LIFETIME_TABLE` and
6
- * `getRMDStartAge`. Following the same mirror pattern as other data modules
7
- * (engines/data/ssa.ts, engines/data/irs2026.ts): keep self-contained so the
8
- * npm package has no runtime dependency on the site `src/` tree.
9
- *
10
- * NOTE: The site rmd-engine.js currently uses ONLY the Uniform Lifetime
11
- * Table — the Joint Life Expectancy Table (Pub. 590-B Table II, applied
12
- * when spouse is sole beneficiary AND 10+ years younger) is NOT implemented
13
- * in the site source. To stay 1:1 with the site for parity-test correctness,
14
- * the MCP RMD tool also exposes ONLY the Uniform Lifetime path. The
15
- * `tableUsed` field in the result is always `"uniform-lifetime"` for v1.
16
- * If Joint Life is added to the site engine later, both sides bump in
17
- * lockstep.
18
- *
19
- * Source: IRS Publication 590-B (2024/2025) + SECURE 2.0 Act §107 (RMD age
20
- * tier: pre-1951 → 70.5, 1951-1959 → 73, 1960+ → 75).
21
- * SECURE 2.0 §302 reduced the missed-RMD excise tax from 50% to 25%
22
- * (and to 10% if corrected within the IRS correction window).
23
- * Last verified: 2026-05-27.
24
- */
25
- /**
26
- * IRS Uniform Lifetime Table (Table III) — post-2022 version per Pub. 590-B.
27
- * Keys are integer ages 72-120; values are distribution-period factors (years).
28
- * RMD = balance / distributionPeriod.
29
- */
30
- export const UNIFORM_LIFETIME_TABLE_2026 = {
31
- 72: 27.4, 73: 26.5, 74: 25.5, 75: 24.6, 76: 23.7, 77: 22.9,
32
- 78: 22.0, 79: 21.1, 80: 20.2, 81: 19.4, 82: 18.5, 83: 17.7,
33
- 84: 16.8, 85: 16.0, 86: 15.2, 87: 14.4, 88: 13.7, 89: 12.9,
34
- 90: 12.2, 91: 11.5, 92: 10.8, 93: 10.1, 94: 9.5, 95: 8.9,
35
- 96: 8.4, 97: 7.8, 98: 7.3, 99: 6.8, 100: 6.4, 101: 6.0,
36
- 102: 5.6, 103: 5.2, 104: 4.9, 105: 4.6, 106: 4.3, 107: 4.1,
37
- 108: 3.9, 109: 3.7, 110: 3.5, 111: 3.4, 112: 3.3, 113: 3.1,
38
- 114: 3.0, 115: 2.9, 116: 2.8, 117: 2.7, 118: 2.5, 119: 2.3,
39
- 120: 2.0,
40
- };
41
- /**
42
- * Lowest age in the Uniform Lifetime Table. RMD requests below this age are
43
- * either pre-RMD (caller error) or use the lower bound (72) clamp matching
44
- * the site's `getDistributionPeriod` behavior. The MCP tool prefers an
45
- * INPUT_VALIDATION error for ages below the SECURE-2.0 floor (73 for the
46
- * common 1951-1959 cohort).
47
- */
48
- export const UNIFORM_LIFETIME_MIN_AGE = 72;
49
- /** Highest age in the Uniform Lifetime Table — clamps lookups for age > 120. */
50
- export const UNIFORM_LIFETIME_MAX_AGE = 120;
51
- /**
52
- * SECURE 2.0 RMD-start-age tiers (verbatim port of site `getRMDStartAge`).
53
- * - Born ≤ 1950 → 70.5 (legacy, pre-SECURE-Act)
54
- * - Born 1951-1959 → 73 (SECURE 2.0 §107 phase 1)
55
- * - Born ≥ 1960 → 75 (SECURE 2.0 §107 phase 2, effective 2033)
56
- */
57
- export function getRmdStartAge(birthYear) {
58
- if (birthYear <= 1950)
59
- return 70.5;
60
- if (birthYear <= 1959)
61
- return 73;
62
- return 75;
63
- }
64
- /**
65
- * SECURE 2.0 §302 missed-RMD excise tax (reduced from 50% pre-2023).
66
- * - 25% on the under-distributed amount (default)
67
- * - 10% if corrected within the IRS correction window (typically 2 years)
68
- * Surfaced as an informational field in the RMD result so callers can warn
69
- * users about the cost of missing the deadline.
70
- */
71
- export const RMD_MISSED_EXCISE_RATE = 0.25;
72
- export const RMD_MISSED_EXCISE_RATE_IF_CORRECTED = 0.10;
73
- /** Stable provenance string for `result.meta.source`. */
74
- export const RMD_TABLE_SOURCE = "IRS Publication 590-B (Uniform Lifetime Table III, post-2022); SECURE 2.0 Act §107 (RMD age tiers); §302 (25% excise tax)";
75
- //# sourceMappingURL=rmd2026.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rmd2026.js","sourceRoot":"","sources":["../../../src/engines/data/rmd2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAqC;IAC3E,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI;IAC1D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI;IAC1D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI;IAC1D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;IACxD,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IACtD,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG;CACA,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C,gFAAgF;AAChF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,CAAC;AAExD,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAC3B,2HAA2H,CAAC"}
@@ -1,39 +0,0 @@
1
- /**
2
- * Self-contained SSA constants subset for the @markcolabs/mcp package.
3
- *
4
- * Mirrored from site/src/data/annual-limits.js and site/src/utils/social-security-engine.js
5
- * (re-export-of-truth pattern). Per ADR-0039 § 5 + S136 kickoff: the npm-published
6
- * MCP package may NOT import from site/src/ at runtime, so the regulatory data
7
- * subset that the SS engine depends on is mirrored here. When site values change,
8
- * update this file in lockstep with the source and bump the SS engine ENGINE_VERSION.
9
- *
10
- * Source of truth: site/src/data/annual-limits.js
11
- * - SSA_BEND_POINTS keyed by eligibility year (year a person turns 62)
12
- * - SS_WAGE_BASE keyed by calendar year (max earnings subject to SS tax)
13
- * Source: SSA Fact Sheet, https://www.ssa.gov/oact/cola/cbb.html
14
- * SSA Bend Points history, https://www.ssa.gov/oact/cola/bendpoints.html
15
- *
16
- * Last verified: 2026-05-09 (matches site annual-limits.js verification dates).
17
- */
18
- /**
19
- * Average Wage Indexing series bend points by eligibility year.
20
- * Eligibility year = year person turns 62.
21
- *
22
- * Subset includes 2014–2026; older years are not needed for current users
23
- * (someone born in 1952 turned 62 in 2014; older birthdays use even-older bend
24
- * points but the SS engine accepts anything in the lookup, falling back to the
25
- * latest available year with `estimated: true`).
26
- */
27
- export declare const SSA_BEND_POINTS: Record<number, {
28
- first: number;
29
- second: number;
30
- }>;
31
- /**
32
- * Social Security wage base by calendar year (max earnings subject to SS tax).
33
- */
34
- export declare const SS_WAGE_BASE: Record<number, number>;
35
- /**
36
- * Default life expectancy used by lifetime-benefit projections (SSA actuarial table proxy).
37
- */
38
- export declare const DEFAULT_LIFE_EXPECTANCY = 85;
39
- //# sourceMappingURL=ssa.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ssa.d.ts","sourceRoot":"","sources":["../../../src/engines/data/ssa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAc7E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC"}
@@ -1,55 +0,0 @@
1
- /**
2
- * Self-contained SSA constants subset for the @markcolabs/mcp package.
3
- *
4
- * Mirrored from site/src/data/annual-limits.js and site/src/utils/social-security-engine.js
5
- * (re-export-of-truth pattern). Per ADR-0039 § 5 + S136 kickoff: the npm-published
6
- * MCP package may NOT import from site/src/ at runtime, so the regulatory data
7
- * subset that the SS engine depends on is mirrored here. When site values change,
8
- * update this file in lockstep with the source and bump the SS engine ENGINE_VERSION.
9
- *
10
- * Source of truth: site/src/data/annual-limits.js
11
- * - SSA_BEND_POINTS keyed by eligibility year (year a person turns 62)
12
- * - SS_WAGE_BASE keyed by calendar year (max earnings subject to SS tax)
13
- * Source: SSA Fact Sheet, https://www.ssa.gov/oact/cola/cbb.html
14
- * SSA Bend Points history, https://www.ssa.gov/oact/cola/bendpoints.html
15
- *
16
- * Last verified: 2026-05-09 (matches site annual-limits.js verification dates).
17
- */
18
- /**
19
- * Average Wage Indexing series bend points by eligibility year.
20
- * Eligibility year = year person turns 62.
21
- *
22
- * Subset includes 2014–2026; older years are not needed for current users
23
- * (someone born in 1952 turned 62 in 2014; older birthdays use even-older bend
24
- * points but the SS engine accepts anything in the lookup, falling back to the
25
- * latest available year with `estimated: true`).
26
- */
27
- export const SSA_BEND_POINTS = {
28
- 2014: { first: 816, second: 4917 },
29
- 2015: { first: 826, second: 4980 },
30
- 2016: { first: 856, second: 5157 },
31
- 2017: { first: 885, second: 5336 },
32
- 2018: { first: 895, second: 5397 },
33
- 2019: { first: 926, second: 5583 },
34
- 2020: { first: 960, second: 5785 },
35
- 2021: { first: 996, second: 6002 },
36
- 2022: { first: 1024, second: 6172 },
37
- 2023: { first: 1115, second: 6721 },
38
- 2024: { first: 1174, second: 7078 },
39
- 2025: { first: 1226, second: 7391 },
40
- 2026: { first: 1286, second: 7749 },
41
- };
42
- /**
43
- * Social Security wage base by calendar year (max earnings subject to SS tax).
44
- */
45
- export const SS_WAGE_BASE = {
46
- 2025: 176_100,
47
- 2026: 176_100, // SSA Fact Sheet 2026 (verified AL-2026-001, S134)
48
- 2027: 180_000, // Projected
49
- 2028: 184_000, // Projected
50
- };
51
- /**
52
- * Default life expectancy used by lifetime-benefit projections (SSA actuarial table proxy).
53
- */
54
- export const DEFAULT_LIFE_EXPECTANCY = 85;
55
- //# sourceMappingURL=ssa.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ssa.js","sourceRoot":"","sources":["../../../src/engines/data/ssa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsD;IAChF,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CACpC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,OAAO,EAAE,mDAAmD;IAClE,IAAI,EAAE,OAAO,EAAE,YAAY;IAC3B,IAAI,EAAE,OAAO,EAAE,YAAY;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC"}
@@ -1,114 +0,0 @@
1
- /**
2
- * Self-contained 2026 state-income-tax effective-rate table for the
3
- * `@markcolabs/mcp` paycheck engine (MCP-AUDIT-011 fix, S141 Item #5).
4
- *
5
- * ## Why this exists
6
- *
7
- * v0.2.x of the paycheck engine returned a flat 5% state-tax estimate for
8
- * every income-tax state. For HCOL states (CA top 13.3%, NY top 10.9%, HI
9
- * top 11%) this was materially wrong — a $1M earner in CA was under-taxed by
10
- * ~$85k. Documented as a known limitation but YMYL exposure was significant.
11
- *
12
- * v0.3.0 replaces the flat estimate with a state-aware effective-rate lookup
13
- * using marginal-bracket simplification: for each state we precompute a
14
- * **top-of-bracket effective rate** for several income tiers and pick the
15
- * tier that brackets the caller's taxable income. This is not a full per-state
16
- * bracket simulation (out of scope per kickoff) but materially correct for
17
- * the common HCOL cases that drove the original finding.
18
- *
19
- * The site source for the rate data is `site/src/data/tax-tables/` for the
20
- * three states the site engine models (CA, NY, TX). For the remaining 38
21
- * income-tax states this module is the canonical mirror — the data is
22
- * sourced from the Tax Foundation 2026 State Individual Income Tax Rates
23
- * report (a citable, annually-updated authority).
24
- *
25
- * ## Simplification per kickoff
26
- *
27
- * Income tiers used for effective-rate lookup:
28
- * - tier 1: taxable < $50,000 (most filers)
29
- * - tier 2: taxable < $100,000 (median-to-upper-middle)
30
- * - tier 3: taxable < $250,000 (HCOL professionals)
31
- * - tier 4: taxable < $500,000 (high earners)
32
- * - tier 5: taxable >= $500,000 (top-bracket)
33
- *
34
- * The rate at each tier is the **effective** rate (not the marginal top rate)
35
- * for a hypothetical filer at the top of that tier, accounting for the
36
- * weighted average across the state's progressive brackets. Flat-rate states
37
- * use the same rate at every tier. No-income-tax states are omitted (handled
38
- * by `NO_TAX_STATES` in `federalTax.ts`).
39
- *
40
- * ## Source
41
- *
42
- * Tax Foundation 2026 State Individual Income Tax Rates and Brackets,
43
- * effective Jan 1 2026 (with 2026 inflation adjustments where applicable).
44
- *
45
- * Last verified: 2026-05-27 (S141 Item #5).
46
- *
47
- * @see MCP-AUDIT-011 — Paycheck flat 5% state-tax estimate
48
- * @see docs/Claude/Architecture/ADR/ADR-0039 § 5 — engine SemVer policy
49
- */
50
- export interface StateTaxDataMeta {
51
- /** Citable source for the rate data (annual Tax Foundation report). */
52
- source: string;
53
- /** ISO date of last verification against the source. */
54
- lastVerified: string;
55
- /** Effective tax year these rates apply to. */
56
- taxYear: number;
57
- /** Methodology note for callers. */
58
- methodology: string;
59
- }
60
- export declare const STATE_TAX_2026_META: StateTaxDataMeta;
61
- /** Income tiers for effective-rate lookup. */
62
- export type StateTaxIncomeTier = "under50k" | "under100k" | "under250k" | "under500k" | "over500k";
63
- /** Effective rates by income tier for one state. */
64
- export interface StateEffectiveRates {
65
- /** Two-letter state code. */
66
- stateCode: string;
67
- /** Full state name (for diagnostics). */
68
- stateName: string;
69
- /** Effective rates expressed as decimals (0.093 = 9.3%). */
70
- rates: Record<StateTaxIncomeTier, number>;
71
- /**
72
- * Notes about quirks (local-tax piggybacks excluded, SDI excluded, etc.).
73
- * Surface in `_meta` if non-empty.
74
- */
75
- notes?: string;
76
- }
77
- /**
78
- * Pick the income tier appropriate for a given taxable income.
79
- * Uses left-inclusive boundaries.
80
- */
81
- export declare function pickIncomeTier(taxableIncome: number): StateTaxIncomeTier;
82
- /**
83
- * 2026 state effective tax rates (decimals) by income tier.
84
- *
85
- * NOT INCLUDED (handled by NO_TAX_STATES in federalTax.ts):
86
- * AK, FL, NV, NH, SD, TN, TX, WA, WY
87
- *
88
- * NH currently taxes only interest/dividends (phased out for wages 2025+),
89
- * treated as no-tax for wage income.
90
- *
91
- * Rates rounded to four decimal places. Local-income-tax piggybacks (NYC,
92
- * Yonkers, PA municipal EIT) NOT included — surfaced as a `notes` warning
93
- * for impacted states. State Disability Insurance (CA SDI, NY SDI, NJ SDI)
94
- * is not income tax and is NOT included.
95
- */
96
- export declare const STATE_EFFECTIVE_RATES_2026: Record<string, StateEffectiveRates>;
97
- /**
98
- * Look up the effective state income-tax rate for a given state and taxable income.
99
- *
100
- * Returns 0 for no-income-tax states (caller should also check NO_TAX_STATES).
101
- * Returns 0 for unknown state codes (defensive fallback — caller already validated
102
- * 2-letter format at the Zod schema layer; this guards against typos that pass
103
- * Zod but aren't in our table).
104
- *
105
- * @param stateCode 2-letter US state code (uppercase)
106
- * @param taxableIncome Annual taxable income in USD (post-federal-standard-deduction basis)
107
- * @returns Decimal effective rate (e.g., 0.093 for 9.3%); 0 if state not modeled
108
- */
109
- export declare function getStateEffectiveRate(stateCode: string, taxableIncome: number): number;
110
- /**
111
- * Get the full state data entry (for surfacing `notes` in the tool envelope).
112
- */
113
- export declare function getStateEntry(stateCode: string): StateEffectiveRates | undefined;
114
- //# sourceMappingURL=stateTax2026.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stateTax2026.d.ts","sourceRoot":"","sources":["../../../src/engines/data/stateTax2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,mBAAmB,EAAE,gBAOjC,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,WAAW,GACX,WAAW,GACX,WAAW,GACX,UAAU,CAAC;AAEf,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC1C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAMxE;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CA4O1E,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAChB,mBAAmB,GAAG,SAAS,CAEjC"}
@@ -1,348 +0,0 @@
1
- /**
2
- * Self-contained 2026 state-income-tax effective-rate table for the
3
- * `@markcolabs/mcp` paycheck engine (MCP-AUDIT-011 fix, S141 Item #5).
4
- *
5
- * ## Why this exists
6
- *
7
- * v0.2.x of the paycheck engine returned a flat 5% state-tax estimate for
8
- * every income-tax state. For HCOL states (CA top 13.3%, NY top 10.9%, HI
9
- * top 11%) this was materially wrong — a $1M earner in CA was under-taxed by
10
- * ~$85k. Documented as a known limitation but YMYL exposure was significant.
11
- *
12
- * v0.3.0 replaces the flat estimate with a state-aware effective-rate lookup
13
- * using marginal-bracket simplification: for each state we precompute a
14
- * **top-of-bracket effective rate** for several income tiers and pick the
15
- * tier that brackets the caller's taxable income. This is not a full per-state
16
- * bracket simulation (out of scope per kickoff) but materially correct for
17
- * the common HCOL cases that drove the original finding.
18
- *
19
- * The site source for the rate data is `site/src/data/tax-tables/` for the
20
- * three states the site engine models (CA, NY, TX). For the remaining 38
21
- * income-tax states this module is the canonical mirror — the data is
22
- * sourced from the Tax Foundation 2026 State Individual Income Tax Rates
23
- * report (a citable, annually-updated authority).
24
- *
25
- * ## Simplification per kickoff
26
- *
27
- * Income tiers used for effective-rate lookup:
28
- * - tier 1: taxable < $50,000 (most filers)
29
- * - tier 2: taxable < $100,000 (median-to-upper-middle)
30
- * - tier 3: taxable < $250,000 (HCOL professionals)
31
- * - tier 4: taxable < $500,000 (high earners)
32
- * - tier 5: taxable >= $500,000 (top-bracket)
33
- *
34
- * The rate at each tier is the **effective** rate (not the marginal top rate)
35
- * for a hypothetical filer at the top of that tier, accounting for the
36
- * weighted average across the state's progressive brackets. Flat-rate states
37
- * use the same rate at every tier. No-income-tax states are omitted (handled
38
- * by `NO_TAX_STATES` in `federalTax.ts`).
39
- *
40
- * ## Source
41
- *
42
- * Tax Foundation 2026 State Individual Income Tax Rates and Brackets,
43
- * effective Jan 1 2026 (with 2026 inflation adjustments where applicable).
44
- *
45
- * Last verified: 2026-05-27 (S141 Item #5).
46
- *
47
- * @see MCP-AUDIT-011 — Paycheck flat 5% state-tax estimate
48
- * @see docs/Claude/Architecture/ADR/ADR-0039 § 5 — engine SemVer policy
49
- */
50
- export const STATE_TAX_2026_META = {
51
- source: "Tax Foundation 2026 State Individual Income Tax Rates",
52
- lastVerified: "2026-05-27",
53
- taxYear: 2026,
54
- methodology: "Top-of-bracket effective rate selected by income tier. Not a full " +
55
- "per-state bracket simulation — see methodology page for full rates.",
56
- };
57
- /**
58
- * Pick the income tier appropriate for a given taxable income.
59
- * Uses left-inclusive boundaries.
60
- */
61
- export function pickIncomeTier(taxableIncome) {
62
- if (taxableIncome < 50_000)
63
- return "under50k";
64
- if (taxableIncome < 100_000)
65
- return "under100k";
66
- if (taxableIncome < 250_000)
67
- return "under250k";
68
- if (taxableIncome < 500_000)
69
- return "under500k";
70
- return "over500k";
71
- }
72
- /**
73
- * 2026 state effective tax rates (decimals) by income tier.
74
- *
75
- * NOT INCLUDED (handled by NO_TAX_STATES in federalTax.ts):
76
- * AK, FL, NV, NH, SD, TN, TX, WA, WY
77
- *
78
- * NH currently taxes only interest/dividends (phased out for wages 2025+),
79
- * treated as no-tax for wage income.
80
- *
81
- * Rates rounded to four decimal places. Local-income-tax piggybacks (NYC,
82
- * Yonkers, PA municipal EIT) NOT included — surfaced as a `notes` warning
83
- * for impacted states. State Disability Insurance (CA SDI, NY SDI, NJ SDI)
84
- * is not income tax and is NOT included.
85
- */
86
- export const STATE_EFFECTIVE_RATES_2026 = {
87
- AL: {
88
- stateCode: "AL",
89
- stateName: "Alabama",
90
- rates: { under50k: 0.04, under100k: 0.045, under250k: 0.05, under500k: 0.05, over500k: 0.05 },
91
- },
92
- AZ: {
93
- stateCode: "AZ",
94
- stateName: "Arizona",
95
- rates: { under50k: 0.025, under100k: 0.025, under250k: 0.025, under500k: 0.025, over500k: 0.025 },
96
- notes: "Flat 2.5% post-2023 reform.",
97
- },
98
- AR: {
99
- stateCode: "AR",
100
- stateName: "Arkansas",
101
- rates: { under50k: 0.038, under100k: 0.039, under250k: 0.039, under500k: 0.039, over500k: 0.039 },
102
- },
103
- CA: {
104
- stateCode: "CA",
105
- stateName: "California",
106
- rates: { under50k: 0.04, under100k: 0.065, under250k: 0.093, under500k: 0.103, over500k: 0.123 },
107
- notes: "Excludes 1% Mental Health Services Tax above $1M and SDI.",
108
- },
109
- CO: {
110
- stateCode: "CO",
111
- stateName: "Colorado",
112
- rates: { under50k: 0.044, under100k: 0.044, under250k: 0.044, under500k: 0.044, over500k: 0.044 },
113
- notes: "Flat 4.4% (2026 estimate post-TABOR refund).",
114
- },
115
- CT: {
116
- stateCode: "CT",
117
- stateName: "Connecticut",
118
- rates: { under50k: 0.045, under100k: 0.055, under250k: 0.06, under500k: 0.063, over500k: 0.0699 },
119
- },
120
- DE: {
121
- stateCode: "DE",
122
- stateName: "Delaware",
123
- rates: { under50k: 0.045, under100k: 0.052, under250k: 0.066, under500k: 0.066, over500k: 0.066 },
124
- },
125
- GA: {
126
- stateCode: "GA",
127
- stateName: "Georgia",
128
- rates: { under50k: 0.0539, under100k: 0.0539, under250k: 0.0539, under500k: 0.0539, over500k: 0.0539 },
129
- notes: "Flat 5.39% (2026, scheduled to drop annually toward 4.99%).",
130
- },
131
- HI: {
132
- stateCode: "HI",
133
- stateName: "Hawaii",
134
- rates: { under50k: 0.07, under100k: 0.08, under250k: 0.0925, under500k: 0.10, over500k: 0.11 },
135
- notes: "Has many narrow brackets; effective rate approximation.",
136
- },
137
- ID: {
138
- stateCode: "ID",
139
- stateName: "Idaho",
140
- rates: { under50k: 0.058, under100k: 0.058, under250k: 0.058, under500k: 0.058, over500k: 0.058 },
141
- notes: "Flat 5.8% post-2023 reform.",
142
- },
143
- IL: {
144
- stateCode: "IL",
145
- stateName: "Illinois",
146
- rates: { under50k: 0.0495, under100k: 0.0495, under250k: 0.0495, under500k: 0.0495, over500k: 0.0495 },
147
- notes: "Flat 4.95%.",
148
- },
149
- IN: {
150
- stateCode: "IN",
151
- stateName: "Indiana",
152
- rates: { under50k: 0.0305, under100k: 0.0305, under250k: 0.0305, under500k: 0.0305, over500k: 0.0305 },
153
- notes: "Flat 3.05% (2026). Local county taxes (LIT) NOT included.",
154
- },
155
- IA: {
156
- stateCode: "IA",
157
- stateName: "Iowa",
158
- rates: { under50k: 0.038, under100k: 0.038, under250k: 0.038, under500k: 0.038, over500k: 0.038 },
159
- notes: "Flat 3.8% (2026 reform).",
160
- },
161
- KS: {
162
- stateCode: "KS",
163
- stateName: "Kansas",
164
- rates: { under50k: 0.031, under100k: 0.0525, under250k: 0.057, under500k: 0.057, over500k: 0.057 },
165
- },
166
- KY: {
167
- stateCode: "KY",
168
- stateName: "Kentucky",
169
- rates: { under50k: 0.04, under100k: 0.04, under250k: 0.04, under500k: 0.04, over500k: 0.04 },
170
- notes: "Flat 4% (2026). Local occupational taxes NOT included.",
171
- },
172
- LA: {
173
- stateCode: "LA",
174
- stateName: "Louisiana",
175
- rates: { under50k: 0.03, under100k: 0.03, under250k: 0.03, under500k: 0.03, over500k: 0.03 },
176
- notes: "Flat 3% (2025 reform).",
177
- },
178
- ME: {
179
- stateCode: "ME",
180
- stateName: "Maine",
181
- rates: { under50k: 0.058, under100k: 0.0675, under250k: 0.0715, under500k: 0.0715, over500k: 0.0715 },
182
- },
183
- MD: {
184
- stateCode: "MD",
185
- stateName: "Maryland",
186
- rates: { under50k: 0.0475, under100k: 0.0525, under250k: 0.0555, under500k: 0.0575, over500k: 0.0575 },
187
- notes: "Local county taxes (2.25%–3.2%) NOT included.",
188
- },
189
- MA: {
190
- stateCode: "MA",
191
- stateName: "Massachusetts",
192
- rates: { under50k: 0.05, under100k: 0.05, under250k: 0.05, under500k: 0.05, over500k: 0.09 },
193
- notes: "Flat 5% + 4% millionaire surtax above $1M.",
194
- },
195
- MI: {
196
- stateCode: "MI",
197
- stateName: "Michigan",
198
- rates: { under50k: 0.0425, under100k: 0.0425, under250k: 0.0425, under500k: 0.0425, over500k: 0.0425 },
199
- notes: "Flat 4.25%. Local city taxes NOT included.",
200
- },
201
- MN: {
202
- stateCode: "MN",
203
- stateName: "Minnesota",
204
- rates: { under50k: 0.0535, under100k: 0.068, under250k: 0.0785, under500k: 0.0985, over500k: 0.0985 },
205
- },
206
- MS: {
207
- stateCode: "MS",
208
- stateName: "Mississippi",
209
- rates: { under50k: 0.044, under100k: 0.044, under250k: 0.044, under500k: 0.044, over500k: 0.044 },
210
- notes: "Flat 4.4% (2026, phasing toward 4%).",
211
- },
212
- MO: {
213
- stateCode: "MO",
214
- stateName: "Missouri",
215
- rates: { under50k: 0.038, under100k: 0.047, under250k: 0.047, under500k: 0.047, over500k: 0.047 },
216
- },
217
- MT: {
218
- stateCode: "MT",
219
- stateName: "Montana",
220
- rates: { under50k: 0.047, under100k: 0.059, under250k: 0.059, under500k: 0.059, over500k: 0.059 },
221
- },
222
- NE: {
223
- stateCode: "NE",
224
- stateName: "Nebraska",
225
- rates: { under50k: 0.0246, under100k: 0.0464, under250k: 0.052, under500k: 0.052, over500k: 0.052 },
226
- },
227
- NJ: {
228
- stateCode: "NJ",
229
- stateName: "New Jersey",
230
- rates: { under50k: 0.0175, under100k: 0.05525, under250k: 0.0637, under500k: 0.0897, over500k: 0.1075 },
231
- notes: "Excludes SDI/UI/FLI payroll deductions.",
232
- },
233
- NM: {
234
- stateCode: "NM",
235
- stateName: "New Mexico",
236
- rates: { under50k: 0.032, under100k: 0.047, under250k: 0.049, under500k: 0.059, over500k: 0.059 },
237
- },
238
- NY: {
239
- stateCode: "NY",
240
- stateName: "New York",
241
- rates: { under50k: 0.045, under100k: 0.0585, under250k: 0.0685, under500k: 0.0685, over500k: 0.0882 },
242
- notes: "Excludes NYC local tax (additional ~3-3.876%) and Yonkers piggyback. " +
243
- "NYC residents should add ~3% to effective rate.",
244
- },
245
- NC: {
246
- stateCode: "NC",
247
- stateName: "North Carolina",
248
- rates: { under50k: 0.0425, under100k: 0.0425, under250k: 0.0425, under500k: 0.0425, over500k: 0.0425 },
249
- notes: "Flat 4.25% (2026, phasing toward 3.99%).",
250
- },
251
- ND: {
252
- stateCode: "ND",
253
- stateName: "North Dakota",
254
- rates: { under50k: 0.0195, under100k: 0.0195, under250k: 0.025, under500k: 0.025, over500k: 0.025 },
255
- },
256
- OH: {
257
- stateCode: "OH",
258
- stateName: "Ohio",
259
- rates: { under50k: 0.0275, under100k: 0.035, under250k: 0.035, under500k: 0.035, over500k: 0.035 },
260
- notes: "Local municipal income taxes NOT included.",
261
- },
262
- OK: {
263
- stateCode: "OK",
264
- stateName: "Oklahoma",
265
- rates: { under50k: 0.0375, under100k: 0.0475, under250k: 0.0475, under500k: 0.0475, over500k: 0.0475 },
266
- },
267
- OR: {
268
- stateCode: "OR",
269
- stateName: "Oregon",
270
- rates: { under50k: 0.0875, under100k: 0.0875, under250k: 0.099, under500k: 0.099, over500k: 0.099 },
271
- notes: "High effective rate at all tiers; metro/transit taxes NOT included.",
272
- },
273
- PA: {
274
- stateCode: "PA",
275
- stateName: "Pennsylvania",
276
- rates: { under50k: 0.0307, under100k: 0.0307, under250k: 0.0307, under500k: 0.0307, over500k: 0.0307 },
277
- notes: "Flat 3.07%. Local municipal EIT (1-4%) NOT included.",
278
- },
279
- RI: {
280
- stateCode: "RI",
281
- stateName: "Rhode Island",
282
- rates: { under50k: 0.0375, under100k: 0.0475, under250k: 0.0599, under500k: 0.0599, over500k: 0.0599 },
283
- },
284
- SC: {
285
- stateCode: "SC",
286
- stateName: "South Carolina",
287
- rates: { under50k: 0.03, under100k: 0.062, under250k: 0.062, under500k: 0.062, over500k: 0.062 },
288
- },
289
- UT: {
290
- stateCode: "UT",
291
- stateName: "Utah",
292
- rates: { under50k: 0.0455, under100k: 0.0455, under250k: 0.0455, under500k: 0.0455, over500k: 0.0455 },
293
- notes: "Flat 4.55%.",
294
- },
295
- VT: {
296
- stateCode: "VT",
297
- stateName: "Vermont",
298
- rates: { under50k: 0.0335, under100k: 0.066, under250k: 0.076, under500k: 0.0875, over500k: 0.0875 },
299
- },
300
- VA: {
301
- stateCode: "VA",
302
- stateName: "Virginia",
303
- rates: { under50k: 0.0475, under100k: 0.0575, under250k: 0.0575, under500k: 0.0575, over500k: 0.0575 },
304
- },
305
- WV: {
306
- stateCode: "WV",
307
- stateName: "West Virginia",
308
- rates: { under50k: 0.0436, under100k: 0.0482, under250k: 0.0482, under500k: 0.0482, over500k: 0.0482 },
309
- },
310
- WI: {
311
- stateCode: "WI",
312
- stateName: "Wisconsin",
313
- rates: { under50k: 0.0354, under100k: 0.053, under250k: 0.0765, under500k: 0.0765, over500k: 0.0765 },
314
- },
315
- DC: {
316
- stateCode: "DC",
317
- stateName: "District of Columbia",
318
- rates: { under50k: 0.06, under100k: 0.065, under250k: 0.085, under500k: 0.0925, over500k: 0.1075 },
319
- notes: "DC included for full HCOL coverage even though not a state.",
320
- },
321
- };
322
- /**
323
- * Look up the effective state income-tax rate for a given state and taxable income.
324
- *
325
- * Returns 0 for no-income-tax states (caller should also check NO_TAX_STATES).
326
- * Returns 0 for unknown state codes (defensive fallback — caller already validated
327
- * 2-letter format at the Zod schema layer; this guards against typos that pass
328
- * Zod but aren't in our table).
329
- *
330
- * @param stateCode 2-letter US state code (uppercase)
331
- * @param taxableIncome Annual taxable income in USD (post-federal-standard-deduction basis)
332
- * @returns Decimal effective rate (e.g., 0.093 for 9.3%); 0 if state not modeled
333
- */
334
- export function getStateEffectiveRate(stateCode, taxableIncome) {
335
- const upper = stateCode.trim().toUpperCase();
336
- const entry = STATE_EFFECTIVE_RATES_2026[upper];
337
- if (!entry)
338
- return 0;
339
- const tier = pickIncomeTier(Math.max(0, taxableIncome));
340
- return entry.rates[tier];
341
- }
342
- /**
343
- * Get the full state data entry (for surfacing `notes` in the tool envelope).
344
- */
345
- export function getStateEntry(stateCode) {
346
- return STATE_EFFECTIVE_RATES_2026[stateCode.trim().toUpperCase()];
347
- }
348
- //# sourceMappingURL=stateTax2026.js.map