Skip to content

Add ZIP code-level HUD payment standards for Texas and Kansas#8738

Open
hua7450 wants to merge 6 commits into
PolicyEngine:mainfrom
hua7450:tx-zip-payment-standards
Open

Add ZIP code-level HUD payment standards for Texas and Kansas#8738
hua7450 wants to merge 6 commits into
PolicyEngine:mainfrom
hua7450:tx-zip-payment-standards

Conversation

@hua7450

@hua7450 hua7450 commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator

Summary

Resolves Housing Choice Voucher (HCV) payment standards at the ZIP-code level for Texas and Kansas, replacing the county-level Fair Market Rent where finer data exists (~1,059 covered ZIPs). Previously pha_payment_standard only varied by county (plus a hardcoded LA County schedule).

  • Texas — published PHA schedules (TDHCA + Houston HHA) plus HUD Small Area FMRs for the 4 mandatory-SAFMR metros.
  • Kansas — HUD Small Area FMRs for the 2 mandatory-SAFMR metros only (Kansas has no statewide PHA schedule to adopt), with the county FMR elsewhere.

How

pha_payment_standard resolves from most to least geographically specific:

  1. Published ZIP payment standardzip_code_payment_standard (a PHA's actually-adopted schedule)
  2. Metro Small Area FMRsmall_area_fair_market_rent, used only where safmr_used_for_hcv is true (a mandatory-SAFMR metro)
  3. LA County local schedule — unchanged
  4. County FMRhud_fair_market_rent, unchanged

ZIP paths only fire on a match, so county-level and microsimulation households (where zip_code is unset) are unaffected. Where a ZIP has both a published standard and a SAFMR, the published standard wins.

Data

State Source Coverage Bedrooms Year
TX TDHCA published HCV payment standards 284 ZIPs / 34 counties 0–6 2025
TX Houston Housing Authority (HHA) published standards 146 ZIPs (tiered A/B/C/D) 0–6 2025
TX HUD Small Area FMRs (Beaumont-Port Arthur, Dallas, Fort Worth-Arlington, San Antonio-New Braunfels) 550 ZIPs 0–4 FY2026
KS HUD Small Area FMRs (Kansas City, MO-KS [KS side] and Wichita, KS) 174 ZIPs (91 + 83) 0–4 FY2026

TX published standards total 430 ZIPs (284 TDHCA + 146 HHA); TX combined distinct coverage is 885 ZIPs. Adding Kansas's 174 SAFMR ZIPs gives ~1,059 distinct covered ZIPs. The SAFMR table now holds 724 ZIPs across 6 metros.

hud_area_name in small_area_fair_market_rents.csv is suffixed with the 2-letter state (e.g. Dallas, TX, Wichita, KS) so metros read unambiguously across states; the bi-state Kansas City metro's KS-side rows are labeled Kansas City, KS.

  • Published standards: parameters/gov/hud/payment_standards/zip_code_payment_standards.csv
  • SAFMR: parameters/gov/hud/fmr/small_area_fair_market_rents.csv

Variables

  • Filled small_area_fair_market_rent (ZIP→SAFMR lookup) and safmr_used_for_hcv (designated-metro gate)
  • Added zip_code_payment_standard (ZIP→published-standard lookup)
  • Rewired pha_payment_standard

This also activates the Harris Rent Relief Act contrib reform's SAFMR-based rent cap for the covered metros — it consumes small_area_fair_market_rent / safmr_used_for_hcv, which were previously stubs (see the changed changelog fragment).

Notes / limitations

  • Coverage is where ZIP-level rent data exists (published PHA schedules + mandatory-SAFMR metros). Elsewhere (rural TX/KS, non-mandatory metros) the county FMR applies, matching HUD policy.
  • Houston is not a mandatory-SAFMR metro (HUD publishes SAFMR data for it but does not mandate its use), so Houston ZIPs use HHA's adopted published standards, not SAFMR.
  • Kansas is SAFMR-only. Kansas has no TDHCA-style statewide balance-of-state PHA (HCV is fragmented across ~23 local PHAs), so only the two mandatory-SAFMR metros are modeled. For the bi-state Kansas City metro, only the KS-side ZIPs are bundled. Wichita HA sets standards at 100% of SAFMR (so we match it exactly); the KCK hold-harmless floor and Johnson County's 90–110% tiering are not modeled (raw SAFMR is used there).
  • small_area_fair_market_rent carries data only for the designated TX/KS metros (0 elsewhere), so the Harris reform's SAFMR-based rent cap is non-zero only there.
  • Year labels follow the published data (published standards 2025, SAFMR FY2026); the framework imputes the nearest available year.

Verification

  • TDHCA published standards (284 ZIPs × 7 bedrooms) re-extracted from the source PDF via two independent engines — 0 mismatches.
  • Houston HHA standards (146 ZIPs × 7 bedrooms) transcribed from HHA's published payment-standard schedule (effective 2025-01-01).
  • SAFMR (724 ZIPs × 5 bedrooms: 550 TX + 174 KS) extracted from HUD's FY2026 revised SAFMR file (fy2026_safmrs_revised.xlsx), filtered to the mandatory metros; the designated-metro set for both states verified against HUD's Designated SAFMR Areas list (Aug 2024). The bi-state Kansas City metro is filtered to KS-side ZIPs.
  • pd.merge order-preservation confirmed on scrambled multi-household vectors; both ZIP merges now use validate="many_to_one".

Test plan

  • Unit tests for small_area_fair_market_rent, zip_code_payment_standard, safmr_used_for_hcv, and precedence/state cases in pha_payment_standard (TX and KS, including Kansas City MO-side and Topeka exclusions)
  • CI passes

🤖 Generated with Claude Code

hua7450 and others added 2 commits June 23, 2026 15:16
Resolve Housing Choice Voucher payment standards at the ZIP level for
Texas. Two ZIP-keyed sources feed pha_payment_standard ahead of the
county FMR fallback:

- TDHCA's published 2025 payment standards for its 34-county service
  area (284 ZIPs, 0-6 bedrooms).
- HUD FY2026 Small Area FMRs for the four mandatory-SAFMR metros
  (Houston, Dallas, San Antonio, Fort Worth; 834 ZIPs, 0-4 bedrooms).

pha_payment_standard precedence is now: published ZIP standard, then
metro SAFMR, then the LA County local schedule, then county FMR. The
ZIP paths only fire on a match, so county/microsim households are
unchanged. Fills the previously stubbed small_area_fair_market_rent and
safmr_used_for_hcv variables.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecov Bot commented Jun 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (9f9d644) to head (c7fcd4c).
⚠️ Report is 142 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #8738   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            2         4    +2     
  Lines           37        82   +45     
=========================================
+ Hits            37        82   +45     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 2 commits June 24, 2026 17:02
safmr_used_for_hcv is now backed by an explicit list of HUD's
mandatory-SAFMR metros (the SAFMR_HCV_DESIGNATED_METROS constant; 24 CFR
888.113) rather than `small_area_fair_market_rent > 0`, and
pha_payment_standard gates its metro branch on it. This keeps raw SAFMR
data available for other uses (e.g. a reform's rent cap) without those
ZIPs adopting SAFMR as their HCV payment standard. Behavior is unchanged
for the current data (the four Texas metros).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The SAFMR-for-HCV designation was sourced from the metros that happened to
be in the SAFMR data file rather than HUD's mandatory list, wrongly
including Houston. Per HUD Notice PIH 2023-32 Appendix A the mandatory
Texas metros are Dallas, Fort Worth-Arlington, San Antonio (2018 cohort)
and Beaumont-Port Arthur (2024 cohort); Houston is not designated.

- Correct SAFMR_HCV_DESIGNATED_METROS and re-scope the SAFMR data to the
  four mandatory metros (drop Houston, add Beaumont-Port Arthur).
- Encode Houston Housing Authority's adopted tiered payment standards in
  zip_code_payment_standards.csv, so Houston ZIPs use HHA's standard
  (e.g. 77002 2BR = $1,628) with safmr_used_for_hcv = false.
- Update tests, READMEs, and the loader docstring.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add Houston HHA full-coverage ZIPs 77407 (Tier A) and 77587 (Tier D),
  which previously fell back to the county FMR
- Floor the SAFMR branch in pha_payment_standard on a present value, so a
  missing SAFMR falls back to the county FMR instead of collapsing to $0
- Add validate="many_to_one" to both ZIP merges to fail fast on a
  duplicate join key (mirrors the county-FMR loader guard)
- Add documentation/reference to safmr_used_for_hcv; add the HHA source to
  zip_code_payment_standard.reference; credit HHA in the changelog
- Add regression tests for 77407/77587 and a discriminating
  published-over-SAFMR overlap case (75010)
- Correct README counts (146 Houston ZIPs, 9 partially-covered ZIPs)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 marked this pull request as ready for review June 30, 2026 20:38
- Add 174 Kansas ZIPs to small_area_fair_market_rents.csv for the two
  mandatory-SAFMR metros: Kansas City, KS (91 KS-side ZIPs) and Wichita, KS
  (83 ZIPs), from HUD FY2026 SAFMRs
- Suffix hud_area_name with the 2-letter state (e.g. "Dallas, TX",
  "Wichita, KS") so metros read unambiguously across states; the bi-state
  Kansas City metro uses the KS-side label
- Add "Kansas City, KS" and "Wichita, KS" to SAFMR_HCV_DESIGNATED_METROS
- Add 10 Kansas tests (SAFMR lookup, designation gate incl. MO-side and
  Topeka exclusions, end-to-end payment standard) and update the README
- County FMR remains the fallback outside the mandatory-SAFMR metros

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 changed the title Add ZIP code-level HUD payment standards for Texas Add ZIP code-level HUD payment standards for Texas and Kansas Jul 1, 2026
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