Skip to content

Add Maryland FAMLI payroll contributions - #10674

Draft
MaxGhenis wants to merge 3 commits into
mainfrom
md-famli-contributions
Draft

MaxGhenis wants to merge 3 commits into
mainfrom
md-famli-contributions

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

What and why

PolicyEngine US had no Maryland Family and Medical Leave Insurance (FAMLI) contributions. This PR adds them: parameters, variables, tests, and the same wiring into payroll tax and household net income that Colorado FAMLI, Maine and Delaware paid leave use.

What the sources say

An audit on 2026-11-05 gave three leads: a January 1, 2027 start, withholding of up to half, and a 0.9% rate. Each value below comes from the statute, the regulations and Maryland Labor's current guidance. The start and the rate hold. "Up to half" matches the regulation, but the statute sets the default more firmly: the employer shall deduct the employee's 50% unless it elects to pay some or all of it.

Value Model Source
Start January 1, 2027; zero before § 8.3-601(a)(1)(i); 2025 ch. 363 moved the date
Total rate 0.9% for wages paid in 2027. The statute fixes no number: it caps the rate at 1.2% and has the Secretary set it § 8.3-601(a)(1)(ii)1, (b), (d); COMAR 09.42.02.01B(3); FAQ question 1 (updated October 2026): "In April 2026, MD Labor reaffirmed a total contribution rate for FAMLI of 0.9%."
Wage base Wages up to the Social Security wage base: $192,300 in 2027 § 8.3-601(a)(1)(ii)2; COMAR 09.42.02.01B(2), .04A, .08A
Wages Unemployment insurance wages: payroll_tax_gross_wages, with 401(k) deferrals in and cafeteria plan and dependent care amounts out § 8.3-101(r); § 8-101(aa); COMAR 09.32.01.14; employer guide p. 19
Employee share 50% of the total, 0.45% of wages, at any employer § 8.3-601(e)(1)(ii), (e)(2); COMAR 09.42.02.05
Employer share 50% of the total, 0.45% of wages § 8.3-601(e)(1)(i)
Small employer Below 15 employees: no employer share, and the employee share still applies § 8.3-601(a)(1)(i); COMAR 09.42.02.06; E-26-002

Worked example: $50,000 of wages in 2027 gives $225 from the employee and $225 from an employer of 15 or more. Wages at or above $192,300 give $865.35 each. Every parameter cites its sources in its metadata.

How it reaches net income

  • Employee: md_employee_famli_contribution → md_employee_state_payroll_tax → employee_state_payroll_tax → employee_payroll_tax → household_tax_before_refundable_credits → household_net_income, and also spm_unit_payroll_tax.
  • Employer: md_employer_famli_contribution → md_employer_additional_state_payroll_tax → employer_additional_state_payroll_tax → employer_state_payroll_tax → employer_payroll_tax. It stays out of net income, as the other states' employer shares do. employer_total_additional_state_payroll_tax gets the same branch for employer-level inputs.

Invariants

policyengine_us/tests/core/test_md_famli_invariants.py checks these over drawn inputs:

  1. Nothing before 2027. Both shares and the state payroll tax equal zero in 2026, at any wages and employer size.
  2. Base. Taxable wages equal gross wages less cafeteria plan and dependent care amounts, floored at zero and capped at the wage base. 401(k) deferrals stay in.
  3. Split and conservation. The employee pays 0.45% of the base at any employer. At 15 or more employees the two shares sum to 0.9% of the base. Below 15 the employer owes nothing.
  4. Bounds. In 2027 each share runs from 0 to $865.35.
  5. Monotonicity. Both shares rise weakly with wages. The employer share rises weakly with employer size, and the employee share ignores it.
  6. Geography. Every Maryland amount equals zero outside Maryland.
  7. Flow. Employee, tax-unit and SPM unit payroll tax exceed a Virginia twin's by exactly the employee share, and net income falls short of it by that share. The employer share leaves net income unchanged. A whole-model run on five households, with and without the employee share, shows the same fall.
  8. Differential. For a one-worker employer, the employer-level total equals the worker-level employer share.
  9. Parameters. The total rate never exceeds the 1.2% statutory cap, and the employee share stays between 0 and 1.

Source-conflict candidate

us-md:famli-wages-401k-deferrals. Section 8-101(aa)(3)(iv)1 leaves out a payment to a § 401(a) trust made on an employee's behalf, without separating employer contributions from salary reductions. COMAR 09.32.01.14A(2)(a) leaves out only deferred compensation not deducted from salary, and Maryland Labor's employer guide calls elective 401(k) deferrals taxable. The model follows the regulation and the guide. With $60,000 of salary and a $4,000 deferral, the employee owes $270; taking the deferral out would give $252.

This PR takes step 1 of the process: the candidate item, short captures under source_conflicts/sources/us-md/, and YAML cases that pin the reading. Case 14 of md_famli_taxable_wages.yaml and case 11 of md_employee_famli_contribution.yaml hold them. It adds no marker, because the rulespec-us entry and the marker follow the merge.

Overlap with #10285

#10285 adds state_payroll_premium_deduction_share and edits the same three aggregator files plus candidates.yaml. Whichever lands second needs to reconcile Maryland. Maryland should take the share input, with any undeducted part going to the employer at any size, because § 8.3-601(e)(2)(ii) lets an employer deduct less and COMAR 09.42.02.07 treats a missed deduction as an election to pay. Default results stay the same either way.

Limitations

  • The employer deducts the full employee share and pays only its own share. An election to pay more waits on Let employers deduct less than the permitted state payroll premium, and apply Massachusetts' PFML cap swap from 2027 #10285.
  • employer_headcount holds one annual whole number. Maryland counts employees quarterly until an employer has four quarters of reports, then uses the prior year's average, and it counts employees outside Maryland too.
  • Household state stands in for work state.
  • One person's wages stand in for each job, though the cap applies to each job separately (FAQ question 19).
  • The model leaves out approved private plans and the Declaration of Intent escrow before them, federal employees (the repo has no flag for them), a sole owner who is a company's only employee (§ 8.3-101(h)(2)), self-employed participants, and Maryland Department of Health reimbursements under § 8.3-601(f).
  • The 0.9% carries forward past 2027 until the Secretary sets the 2028 rate, due by November 1, 2027.
  • state_and_local_sales_or_income_tax reads state and local income tax, so these contributions don't reach the federal itemized deduction, and neither does any other state's paid-leave contribution. This PR takes no position on their deductibility.

Test plan

  • YAML tests: 43 cases with hand-computed values for 2026 (no contribution) and 2027, under policyengine_us/tests/policy/baseline/gov/states/md/tax/payroll/famli/. All pass.
  • Invariant tests: policyengine_us/tests/core/test_md_famli_invariants.py (4 tests). A throwaway script injected 14 deliberate bugs (rate, share, threshold, cap, 401(k) deferrals, cafeteria amounts, size gates, dropped aggregator entries, the employer-level base). The checks caught all 14, and the control run passed before and after.
  • Source-conflict candidate recorded; test_source_conflicts.py passes.
  • ruff format and ruff check on the changed Python.
  • Changelog fragment in changelog.d/.

Why Python: YAML pins values at chosen points, but a YAML case can't compare one person's output with another's. These tests compare twins that differ in one fact, and the worker-level path with the employer-level path. The expected values come from the statute and the 0.9% rate, not from the parameters.

Cost (local macOS run under heavy host load, not Linux CI): the test bodies take 12.1 s, of which the whole-model run takes 8.3 s. Peak memory for the file reaches 1.47 GB, against 1.01 GB for model import and collection alone, so the tests add about 0.46 GB while they run. The file joins CI's existing core group, which the Makefile records at 13.3 GB and 11:51 in CI run 38141803955. This PR adds no jobs or matrix entries. CI's own timing for the group will show the effect there; no extra runs went to measuring it.

axiom: TheAxiomFoundation/rulespec-us#2050 queued (Md. Code, Lab. & Empl. § 8.3-601, proposed corpus citation us-md/statute/gle/8.3-601). Missing corpus text blocks the signed encoder; axiom-corpus#893 requests it.

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits November 6, 2026 06:03
Maryland's Family and Medical Leave Insurance contributions begin January 1,
2027. Maryland Labor set the total rate at 0.9% of wages up to the Social
Security wage base for 2027. Employees pay half (Lab. & Empl. s. 8.3-601(e)),
and employers of 15 or more employees pay the other half.

The contributions enter employee_state_payroll_tax and the employer-side state
payroll tax totals, so the employee side lowers household net income through
employee_payroll_tax, as the other state paid-leave programs do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Maryland's wage definition can be read to exclude a deferral paid to a qualified
trust, while COMAR 09.32.01.14A(2)(a) leaves out only deferred compensation not
deducted from salary, and Maryland Labor's employer guide calls elective 401(k)
deferrals taxable. The model follows the regulation and the guide. The reading
goes into source_conflicts/candidates.yaml with short excerpts and YAML cases
that pin it.

The new invariant tests check what holds for every input: the wage base, the
employee and employer split, bounds, monotonicity, geography, the flow into
payroll tax and net income, and agreement between the worker-level and
employer-level paths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant