Skip to content

Harris County FY2027 budget investigation: executive summary of method, for forensic review

Prepared 2026-09-21, Central Daylight Time (UTC-5); revised 2026-09-23 (revision 2) after the independent review in independent_review_2026-09-23/. Section 14 lists what the review found, what was changed and what was not. Work folder: /git/Texas/HarrisCounty.

The investigation, the report and every file in this folder were produced by an AI assistant (Claude, model Claude Fable 5.1, running in the Claude Code tool) acting on written instructions from the folder's owner, in a single working session on 2026-09-21. No county employee, elected official or journalist was contacted. No public-information request was filed. Every document used is public and was downloaded from the internet; the URL, retrieval date and local copy of each are listed in REFERENCES.md. The owner supplied the questions only; they did not supply documents, figures or conclusions. No human reviewed the report before it was delivered.

This summary explains what was asked, what was delivered, how the evidence was gathered and processed, which figures are copied from documents and which are computed, the judgment calls made, the defects found (including two found while preparing this summary) and how a reviewer can re-verify every step.

1. Requests and deliverables

# Time (CDT) Request, condensed Where the answer is
1 16:39 Thorough analysis of the FY2027 budget: find all public budget reports; compare with the FY2026 budget and FY2026 actual spending; explain the "$186 million shortfall" behind the tax-rate increase; is the budget higher; PDF with summary and graphs; investigate whether pay increases and spending are "hidden"; save all sources and a reference document report/Harris_County_FY2027_Budget_Investigation.pdf Sections 1-5, 7, 8, Appendix A; REFERENCES.md; sources/
2 ~16:47 "Tool loaded." (acknowledgement, no task) none
3 18:11 Details of specific salaries, FY2026 vs FY2027 Report Section 6A; notes/salary_comparison_2026_vs_2027.md; data/salary_plan_*.csv, data/le_step_plan_*.csv, data/elected_officials_salaries_fy26_fy27.csv
4 18:49 The benefits increase; "county employees don't pay for health care" Report Section 6B; notes/healthcare_benefits_investigation.md; data/health_benefits_fy26_fy27.json
5 19:30 Do constables and sheriff's officers get overtime pay Report Section 6A (closing paragraphs); notes/overtime_and_extra_pay_law_enforcement.md
6 19:48 City of Houston vs Harris County pay for similar job titles Report Section 6C; notes/city_vs_county_pay_comparison.md; data/coh_*.csv
7 22:31 This summary, for a forensic auditor AUDIT_SUMMARY.md, MANIFEST_SHA256.txt, notes/session_command_log.md, notes/data_file_provenance.md

The verbatim wording of each request is in notes/session_command_log.md under "User requests".

2. Deliverables inventory

Item Location Facts
Report report/Harris_County_FY2027_Budget_Investigation.pdf Revision 2: 31 pages, letter size, built 2026-09-23 by scripts/build_report.py (ReportLab 4.4.10); revision 1 was 29 pages, 2,098,155 bytes, built 2026-09-21 20:47 CDT. The PDF's internal CreationDate is a placeholder (1980-01-01) because the build ran inside nix-shell, which sets SOURCE_DATE_EPOCH; the build time is the file's modification time.
Charts charts/ 13 PNG files (c1-c12, kpi_row), 200 dpi, built by scripts/make_charts.py from data/.
Data data/ 25 files: summary_metrics.json (every figure used in the report, each block annotated with its source document and page), 22 CSV tables, one JSON (health benefits), one text summary (tax worksheets). data/text/: 31 plain-text extractions of the source PDFs.
Sources sources/ 889 files, 240 MB: official county documents (official/, with sub-folders auditor/, tax_office/, benefits/, hcso_policies/, mirrored_by_reduceflooding/, renders/), one independent analysis (analysis/), 68 saved news pages (news/), City of Houston documents (city_of_houston/, including 759 files in classifications/).
Notes notes/ Topic write-ups (salaries, health benefits, overtime, City comparison), facts extracted from each news article, Baker Institute text, download logs, the session command log, the provenance map, the record of removed files.
Scripts scripts/ Two download scripts (bash), two parsers, the chart builder and the report builder (Python).
Reference document REFERENCES.md URL, retrieval date, local file name and "used for" for every source (sections A1-A3 official, B analysis, C news, C2-C5 sources added for requests 3-6, D data files, E audit trail).
Orientation README.md Headline answers, folder layout, regeneration commands, caveats.
Integrity MANIFEST_SHA256.txt SHA-256 of every file in the folder except the manifest itself.

3. Chronology

All times CDT on 2026-09-21, from the session transcript and file modification times.

Time Event
16:39 Request 1 received.
16:41-17:19 Official documents located on the county OMB, Auditor and Tax Office sites and downloaded with scripts/download_sources.sh (curl with resume and retries); output in notes/download_log_1.txt to download_log_4.txt. Web pages that catalogue the documents saved as HTML.
16:43-17:28 News and analysis pages located by web search, read, and saved with scripts/save_news_copies.sh (notes/news_copy_log.txt). Facts extracted into notes/news_extracts_part1.md and part2.md.
17:14 All official PDFs converted to text (pdftotext -layout) into data/text/.
17:18-17:34 Department tables parsed to CSV (parse_tables.py, parse_vol2_changes.py); sums checked against printed totals. Fixes applied inline at 17:20 and 17:33 (see Section 11).
17:31-17:36 Tax Office Form 50-856 worksheets for the four county entities extracted and summarised (data/tax_rate_worksheets_2026_summary.txt).
17:42-17:46 summary_metrics.json completed; charts and first report build; README.md and REFERENCES.md written. Request 1 answered.
18:11-18:30 Request 3: salary plans (FY26 plans, new plan, law-enforcement step plans, elected officials) parsed from Vol. I v3 pp. 454-531; Section 6A added; report rebuilt.
18:49-19:15 Request 4: benefits guides and premium page downloaded; Health Insurance Fund figures reconciled across the budget book, ACFR and monthly reports; Section 6B added.
19:30-19:45 Request 5: HCSO policies saved; overtime figures from the Auditor's monthly reports; constable back-pay agreement from news reports; overtime paragraphs added to 6A.
19:48-20:47 Request 6: City of Houston classification lists, pay structure, payroll open data, benefits, pension and contract documents downloaded; matched-title tables built; Section 6C added; final rebuild of charts, report, README and REFERENCES at 20:46-20:47.
21:38 Automatic compaction of the assistant's working context (the transcript itself is complete).
22:31 Request 7 received. Reproducibility re-run of the parsers exposed the unsaved-fix defect (Section 11); scripts repaired at 22:37 and verified; 24 mis-saved 404 pages removed; command log, provenance map, this summary and the manifest written.

4. Environment and tools

Component Version / detail
Host Workstation fire-zfs, NixOS 26.05.20260903.a5cc6f2 (Yarara), Linux 6.18.49.
Shell environment for processing nix-shell -p poppler-utils "python3.withPackages (ps: with ps; [ matplotlib reportlab pypdf pdfplumber openpyxl pandas numpy ])"
Python 3.13.15; matplotlib 3.10.9; reportlab 4.4.10; pypdf 6.15.0; pdfplumber 0.11.9; pandas 2.3.3; numpy 2.4.4
PDF tools poppler-utils 26.06.0 (pdftotext, pdfinfo, pdftoppm), qpdf
Download curl (resume -C -, --retry 3, browser User-Agent where a site rejected the default client)
Discovery and reading The assistant's web-search tool (53 queries) and web-fetch tool (87 fetches). These return processed page text to the assistant; the saved copies in sources/ were made separately with curl, so a saved copy can differ from what was read if the page changed in the minutes between the two calls.
Charts matplotlib, Agg backend, text.parse_math off; palette from the data-visualisation guideline loaded at the start of the session (blue, orange, aqua, yellow, red, greys).
Report reportlab platypus (SimpleDocTemplate, letter), images embedded from charts/.

Every command run, in order, with its embedded Python, is in notes/session_command_log.md (359 tool calls: 181 shell commands, 87 web fetches, 53 web searches, 35 file reads, 2 skill loads, 1 tool lookup).

5. How the evidence was gathered

5.1 Discovery

  • Budget books. The county OMB "Budget Documents" page (sources/official/budget_documents_page_2026-09-21.html) lists every posted budget file; the FY2027 Volume I versions 1-3, Volume II, the Tax Code 26.18 "Budget and Tax Rate Information" posting, and the FY2026, FY2025 and FY2024 books were downloaded from the URLs on that page.
  • Auditor. The Auditor's index pages for monthly financial statements, ACFRs and the annual estimates of available resources were saved; the June 2026, March 2026 and September 2025 monthly reports, the FY2025 ACFR and the FY2025 and FY2026 Final Estimates of Available Resources (FEAR) were downloaded from them. The FY2027 FEAR was not posted as a separate file (its URL returned 404 five times, logged); it was found bound into Volume I v3 at PDF pp. 141-453 and used from there.
  • Tax rates. The Tax Office "Jurisdiction Tax Rates" page identified the four county jurisdictions (Jur040 County, Jur041 Flood Control, Jur042 Port, Jur043 Hospital District); their 2026 Form 50-856 worksheets were downloaded. An initial guess (Jur669) turned out to be an emergency-services district and was discarded.
  • Benefits, policies. The county benefits site (premium page, 2026 Employee Guide, 2027 Retiree Guide) and the Sheriff's Office policy site (policies 216, 217, 218, 244, 249, 704).
  • City of Houston. HR compensation pages (classification lists, pay structure), the City open-data portal's CKAN API (package_show for the payroll dataset, saved as coh_payroll_package.json; payroll 2025 and 2026 CSVs), the FY2027 budget overview, benefits rates, the HPOU contract overview, the HMEPS and HPOPS actuarial valuations.
  • Independent analysis and news. The Baker Institute report (July 2026) and roughly fifty news items found by web search, chosen to cover each event in the budget timeline (May 2025 pay-parity vote to the Sept. 17 2026 adoption) and each figure quoted by officials.

5.2 Retrieval and logging

Official documents were fetched with scripts/download_sources.sh, which retries up to five times, resumes partial files and logs URL, outcome and byte count. News copies were fetched with scripts/save_news_copies.sh, which logs the HTTP status and size of each file. Two downloads arrived truncated on the first attempt (the Five-Year Financial Plan and the 2026 Employee Benefits Guide) and were resumed; page counts were then checked with pdfinfo. Responses that were error pages (under about 1.2 KB) were deleted rather than kept as "sources".

5.3 Not obtainable

Houston Chronicle and KHOU pages block automated retrieval (HTTP 403). Chronicle reporting was used through Yahoo News syndicated copies of the same articles, which are saved; the Chronicle URLs and titles are listed in REFERENCES.md section C as "not retrievable". KHOU items were not used for any figure. Third-party payroll aggregators (OpenPayrolls, OpenGovPay) also block retrieval and were not used. Search-engine snippets from blocked pages were relied on only where they agreed with a primary document.

5.4 Obtained from third parties rather than the county's servers

Three county documents came from mirrors: the OMB FY27 Budget Town Hall slides and the Aug. 17 2026 Commissioners Court special-meeting agenda from ReduceFlooding.com (sources/official/mirrored_by_reduceflooding/), and the June 2024 Five-Year Financial Plan from a Constant Contact file link cited by the Baker Institute. Their provenance is stated wherever they are cited. Figures taken from them (the CLS/S build-up by category; the May 2026 $129M/$257M deficit chart; the 2024 structural-deficit scenarios) are supporting context; the headline numbers in the report rest on the budget books, the Auditor's reports and the tax worksheets.

6. How the evidence was processed

6.1 Text extraction

Every PDF was converted with pdftotext -layout into data/text/<name>.txt, one form-feed per page. Scripts address "text pages" (form-feed count); the report cites the printed page numbers of the county documents. The two differ by the front matter (for Vol. I v3, printed p. 103 is text page 117).

6.2 Scripted parsing, with checks

  • scripts/parse_tables.py reads four department tables by regular expression (department number, name, N numeric columns; a name fragment wrapped onto a second line is joined to the preceding line; reading stops at the "Working Capital" or "TOTAL GENERAL FUND" line so that non-departmental lines and other funds are excluded). It prints column sums, which match the printed totals:
  • FY27 Vol. I v3 Appendix A: 2,439,307,253 / 2,632,527,628 / 2,769,425,324 / 3,095,400,000 (FY24 actual, FY25 actual, FY26 adopted, FY27 adopted). The printed FY25 total is 2,632,527,626; the lines sum to 2 dollars more, a rounding artefact in the printed lines.
  • FY26 Vol. I Appendix A: 2,175,058,722 / 2,439,307,253 / 2,669,419,872 / 2,769,425,324. The FY24 actual and FY26 adopted columns agree to the dollar with the FY27 book, an independent check of both parses.
  • Auditor June 30 2026 by-department (revision 2): 81 departments summing to 2,863,994,103 original budget, 3,120,848,773 adjusted, 2,048,293,715 spent in nine months, 667,030,760 encumbered, all equal to the printed TOTAL GENERAL FUND line (the script asserts this). Revision 1 had 78 rows: the parser dropped Appraisal District (091), Justice of the Peace 8-2 (382) and County Extension Service (821) because of currency markers and a footnoted negative encumbrance, understating the adjusted-budget total by $22.9M and spending plus encumbrances by $16.4M; the first edition of this summary wrongly attributed the shortfall to non-departmental lines. The Auditor's "original budget" exceeds the budget book's 2,769,425,324 because it includes the commissioners' 75% rollover and other post-adoption allocations (Auditor p. 61 footnote).
  • Auditor Sept. 30 2025 by-department (FY25, revision 2): 81 departments, 2,907,069,131 original, 2,971,902,038 adjusted, 2,633,288,045 spent, equal to the printed total.
  • scripts/parse_vol2_changes.py (revision 2) reads only the department-level "Change Table" of each of the 83 departments in the 1,212-page Volume II, keeps continuation pages, keeps every dollar line with its fund label, and checks that opening budget plus changes equals closing budget for every table (all 83 reconcile) and that the 81 General Fund departments' changes sum to 325,974,676, the Appendix A increase. Output: 698 lines, data/vol2_change_items_by_department.csv; items aggregated across the 81 county departments and across all 83 tables, data/vol2_change_items_aggregated.csv; the per-table reconciliation, data/vol2_change_table_reconciliation.csv; positions, data/vol2_le_positions.csv. Revision 1 matched the substring "Change Table", which also selected the "Program Change Table" beneath each department table, so 817 of its 1,433 lines were program-level components of the department lines and the category totals were overstated (group health $156.5M instead of $81.5M county / $87.5M all tables; staffing $44.7M instead of $30.8M; pension -$16.0M instead of -$8.0M; pay equity shown gross without the equal central offset). The report uses Vol. I for headline figures and Vol. II for the distribution by department and for the additive reconciliation in Table 2b.
  • scripts/make_charts.py also writes data/fy27_vs_fy26_by_department.csv, the merge of the FY27 Appendix A parse with the Auditor's June 2026 adjusted budget and spent-plus-encumbered columns; it is the table printed in the report's Appendix A.

Both parsers were re-run on 2026-09-21 at 22:37 CDT and reproduce all seven CSVs byte for byte (see Section 11 for why this had to be repaired first).

6.3 Parsing done inline (preserved verbatim in the command log)

The following data files were produced by Python or shell run inline during the session rather than by a saved script. The exact code is in notes/session_command_log.md; notes/data_file_provenance.md gives the time of each command that produced or touched each file. - Salary plans from Vol. I v3 pp. 454-531: salary_plan_fy26.csv (FY26 general/management/judicial/appointed plans), salary_plan_new_fy27.csv (the new 20-grade plan, 758 titles), salary_plan_fy26_vs_new_matched_titles.csv, new_salary_plan_grades_fy27.csv, le_step_plan_fy26.csv, le_step_plan_new_fy27.csv, vol2_labor_nonlabor_by_department.csv. - Tax worksheets: tax_rate_worksheets_2026_summary.txt (selected lines of the four Form 50-856 worksheets; the numeric columns sit at the far right of the text extraction and an early cut that truncated them was corrected). - City of Houston: coh_job_classifications.csv (908 classifications parsed from the two list PDFs), coh_civilian_pay_structure.csv (from the HTML pay-structure page), coh_payroll_2026_median_by_grade.csv (medians of annual base pay by pay grade from the 2026 payroll CSV, full-time employees), coh_vs_county_matched_titles.csv (69 exact title matches).

6.4 Hand-transcribed figures

These were typed from the cited pages, not parsed. They are the figures a reviewer should check first, against the page numbers given in summary_metrics.json and REFERENCES.md: - data/summary_metrics.json: all blocks (budget totals, FEAR totals and working capital, revenue history, deficit forecasts, cost drivers, healthcare, pay parity, pay equity, elected salaries, tax-rate history, property-tax revenue, headcount, salaries and benefits, indigent defense, contract patrol, Dept. 202 lines, votes, worksheet lines, FY27 FEAR letter, overtime, City comparison summary). - data/health_benefits_fy26_fy27.json (premiums by tier and plan, deductibles, fund results, OPEB). - data/elected_officials_salaries_fy26_fy27.csv (Vol. I v3 Appendix D and news reports for back pay), data/appointed_department_head_parity_fy27.csv, data/coh_vs_county_hand_matched.csv (34 City-County job pairs with the ranges and medians from the parsed City and county files). - The report's tables and prose figures, which were taken from the JSON and CSVs above or typed directly with a page citation in the caption or sentence.

6.5 Charts

scripts/make_charts.py reads summary_metrics.json, health_benefits_fy26_fy27.json, appendix_a_fy27_book.csv, fy26_gf_budget_status_june2026.csv and coh_vs_county_hand_matched.csv. Chart c11 (sworn pay ladders) holds its data inline in the script (City and county step values, copied from the HPD scale and the county step plan). Each chart carries a source line. Layouts were checked by rendering and viewing each image; eleven charts (c1, c2, c3, c5, c6, c8, c9, c10, c11, c12 and the KPI row) were adjusted for overlapping labels, legends or captions.

6.6 Report assembly

scripts/build_report.py holds the entire text of the report and its tables as Python strings and assembles the PDF with reportlab. Sections 6A, 6B and 6C were inserted by patching this file in the session (the patches are in the command log). The report was rebuilt after each request and pages were rendered to PNG and viewed to check layout.

7. Key figures and their sources

Figure in the report Value Source document and page Where it sits in data/
FY27 General Fund departmental appropriations $3,095,400,000 FY27 Vol. I v3, Appendix A, printed pp. 103-105 (text pp. 117-119) appendix_a_fy27_book.csv (column sum); summary_metrics.json general_fund_departmental_budget
FY26 adopted departmental appropriations $2,769,425,324 Same table; and FY26 Vol. I Appendix A pp. 95-97 both Appendix A CSVs
FY25 actual $2,632,527,626 (printed) FY27 Vol. I v3 Appendix A appendix_a_fy27_book.csv (lines sum to $2,632,527,628)
FY26 actual spending, nine months to 6/30/2026 $2,048.3M spent; $667.0M encumbered Auditor Monthly Financial Report June 30 2026, pp. ii and v (General Fund totals) summary_metrics.json general_fund_departmental_budget; by-department lines in fy26_gf_budget_status_june2026.csv
FY26 projected full-year spending and revenue $2,772.2M and $2,754.7M Same report, cash-flow projection summary_metrics.json
Total appropriation authority (FEAR total available resources) FY26 $3,114,477,211; FY27 $3,351,376,287 FY27 Budget and Tax Rate Information (Tax Code 26.18 posting); Auditor FEAR FY2026; FY27 FEAR letter (Vol. I v3 PDF p. 150) summary_metrics.json fear_total_available_resources, fy27_fear_auditor_2026-09-17
Working capital and Commissioners Court 75% rollover FY27 $255,976,287 and $93,423,228 FY27 Vol. I v3 pp. 74 and 105; FY26 Vol. I p. 69 summary_metrics.json fear_total_available_resources
Deficit forecasts $129M (May 2026: CLS/S $3,056M vs revenue at the voter-approval rate $2,927M); $181M after the July healthcare re-estimate (+$51M) and jail-savings reduction (+$1M) FY27 Vol. I v3 pp. 15 and 27; Town Hall slides (June 2026) slide 10; Community Impact 2026-05-14 summary_metrics.json deficit_forecasts
Adopted FY27 revenue and expenditure $3,079M and $3,095M FY27 Vol. I v3 p. 27 summary_metrics.json deficit_forecasts
One-time revenues and new recurring revenues in FY27 $82.9M and $19.7M FY27 Vol. I v3 pp. 40-44 summary_metrics.json general_fund_revenue
County tax rate 2025 and 2026; no-new-revenue, voter-approval and de minimis rates 0.38096 to 0.41750; NNR 0.38667; VAR 0.41750; de minimis 0.40527 (per $100) Tax Office Form 50-856, Jur040_2026.pdf: line 4 (2025 rate), line 27 (no-new-revenue), line 69 (voter-approval), line 74 (de minimis), line 49 (debt rate) tax_rate_worksheets_2026_summary.txt; summary_metrics.json tax_rate_worksheets_2026
Flood Control, Port, Hospital District rates and maxima 0.05266 (=VAR), 0.00603 (=VAR), 0.19528 (VAR 0.23917) Jur041-043_2026.pdf same
Combined county-entity rate 0.62413 to 0.67147 Vol. I v3 p. 14; worksheets summary_metrics.json tax_rates_per_100
Property-tax revenue budgeted M&O $2,223.4M to $2,423.0M; debt $312.7M to $359.5M; increase $210.7M (8.1%), $54.4M of it from new property FY27 Budget and Tax Rate Information posting summary_metrics.json property_tax_revenue
Average homestead county bill $1,202 to $1,344 Vol. I v3 pp. 11-13; Houston Public Media 2026-09-17 (all-entity +$193) summary_metrics.json property_tax_revenue
Healthcare County contribution +$100M all funds (+$89M GF); cost per employee $20,228 to $25,342 (+25%); 2027 employee premiums and deductibles unchanged FY27 Vol. I v3 pp. 2, 16-18, Appendix E; v1 p. 17 (original proposal); Aug. 17 agenda item 4; 2026 Employee Guide p. 13 summary_metrics.json healthcare; health_benefits_fy26_fy27.json
Law-enforcement pay parity Vote May 22 2025, 3-2; year-1 $142M; year-2 $44,577,775 in department change lines (13 departments; confirmed by the review) FY26 Vol. I p. 16; Vol. II department change tables; HPM 2025-05-23 vol2_change_items_aggregated.csv; summary_metrics.json law_enforcement_pay_parity
Pay-equity study $73M/yr; FY27: $60.8M distributed to department lines, the same $60.8M removed from General Administration, $30.0M "Compensation Study Increases" added, $21.4M pool balance remains (net new $30.0M) Vol. II department change tables (Dept. 202 at PDF p. 178); Vol. I v3 p. 76; The Texan summary_metrics.json vol2_change_items_fy27, pay_equity
Group health lines in Vol. II $81,501,818 in the 81 General Fund departments; $87,536,338 in all 83 tables (OMB narrative: +$89M GF, +$100M all funds; not bridged in the book) Vol. II department change tables vol2_change_items_aggregated.csv
Elected officials Constables $260,000 to $305,000; DA, County Attorney, District Clerk, Tax Assessor to $305,000; County Clerk and Treasurer unchanged; total base increase $786,188 Vol. I v3 Appendix D p. 124; HPM 2026-08-07; KPRC 2026-08-20 elected_officials_salaries_fy26_fy27.csv
Constable back pay $45,000 each plus $48,390 (Fire Marshal), $408,390 total, Aug. 6 2026 ABC13 2026-09-05 (not in the budget book) summary_metrics.json overtime
Overtime GF overtime budget FY25 $68.5M, actual $51.1M; FY26 adjusted $69.2M, nine-month $33.5M; Sheriff FY25 $40.4M; policy: 1.5x over 40 hours, lieutenant and above exempt, comp-time cap 240 hours Auditor monthly reports p. iii; HCSO policies 216-218, 244 summary_metrics.json overtime
Headcount FTE by function 2017-2025 ACFR FY2025 Table 19 p. 257 summary_metrics.json headcount_fte_acfr_table19
City vs county (revision 2) 34 job-content pairs: county range minimum higher in 34 of 34 (median +26.3%), county maximum higher in 18 (median +1.4%); 69 exact titles: minimum higher in 61 (median +22.6%), maximum higher in 36 (median +1.6%); sworn ranks within about 2%; HPD cadet $52,000 published vs county $52,291 City civilian pay structure effective 2026-07-04; City classification list (title to grade); City payroll 2026; HPD careers page; county new plan and FY26 step plan coh_vs_county_hand_matched.csv, coh_vs_county_matched_titles.csv (classification-list ranges kept in *_classlist columns); scripts/city_comparison_date_align.py
Votes Budget 3-2 (Sept. 17 2026); county rate 3-1; proposed rates 3-2 (Sept. 8) Houston Public Media and Community Impact 2026-09-17; county release 2026-09-18 summary_metrics.json votes

A retained but unused figure: summary_metrics.json tax_rates_per_100.county_2026_VAR holds 0.41934, an estimate published by Texans for Fiscal Responsibility on Aug. 28 2026 before the Tax Office worksheet was available. The report's Table 3 and Figure 5 use the worksheet value 0.41750, and the Table 3 caption explains the earlier figure. The earlier estimate was left in the file for provenance.

8. Derived figures: the arithmetic

These numbers are the assistant's computations, not figures printed by the county.

  • Budget growth. FY27 vs FY26 adopted: 3,095,400,000 - 2,769,425,324 = +326.0M (+11.8%). FY27 vs FY25 actual: +17.6%. FY27 vs the Auditor's FY26 projection: +11.7%. FEAR total: 3,351.4M vs 3,114.5M = +7.6%.
  • Gap-closure bridge (report Figure 4). Gap $181M = adopted revenue increase over the May forecast (3,079 - 2,927 = 152) + spending trimmed from the July cost estimate (3,108 - 3,095 = 13) + surplus drawdown (3,095 - 3,079 = 16). The $152M revenue increase = $82.9M one-time items + $19.7M new recurring fees + $49.4M "other re-estimates" (residual). The $13M and $49.4M are residuals; OMB publishes no reconciliation, and the report says so. Share of the closure that is non-recurring: (82.9 + 16) / 181 = 55%.
  • Tax-rate change. County 0.41750 / 0.38096 - 1 = +9.6% (M&O component +8.0%, debt component +21.7%); combined 0.67147 / 0.62413 - 1 = +7.6%. The "about $128M" of revenue from adopting the voter-approval rate rather than the no-new-revenue rate is OMB's May 2026 scenario difference ($2,927M - $2,799M, Vol. I v3 p. 15); the first edition of this summary wrongly said it came from the worksheet, whose taxable value times the rate difference gives a different quantity ($671.6B x 0.03083 / 100 = $207.1M, a gross-levy comparison). The statutory tax posting's M&O and debt tables imply a $246.5M revenue increase against the $210.7M stated in the notice, a $35.8M difference the document does not explain.
  • Per-department changes (Appendix A, Figure 3). Straight differences and percentages of the two Appendix A columns.
  • Salary comparisons. Hourly plan rates x 2,080 = annual; percentage changes between the FY26 plan range and the new plan range for the same title; City biweekly x 26 = annual.
  • City payroll medians. Median of annual base pay by pay grade for full-time employees in the 2026 payroll file.

9. Judgment calls and assumptions

  1. "The budget" means General Fund departmental appropriations (the county's Appendix A total), which is the figure the county itself headlines ($3.095B). The larger FEAR-based total ($3.351B), which adds unallocated working capital, is shown alongside and explained. Flood Control, the Toll Road, the Hospital District and grant funds are outside "the budget" except where named.
  2. "FY2026 actual spending" is the Auditor's unaudited nine-month actuals and full-year cash-flow projection, because FY26 does not end until 2026-09-30. The FY25 audited ACFR figures are used as the last full audited year.
  3. The "$186 million" in the request appears in no county document or news item found. The report treats it as the official $181M gap and lists the official sequence ($129M May, $178M Aug. 14, $181M Aug. 17 and adopted; $189M in the County Judge's newsletter). This is stated in the report's summary.
  4. Gap bridge residuals are the assistant's arithmetic (Section 8) and are labelled as residuals in the figure and text.
  5. Vol. II change-table sums are all-funds and de-duplicated; they are used for distribution, not for headline totals.
  6. Salary comparison basis. The county publishes pay-plan ranges and step tables, not actual pay by title, so FY26-to-FY27 comparisons are range-to-range. Elected officials' figures are actual salaries from Appendix D. The new plan's 20-grade table was rebuilt from the pay plan: one row with an evident typo ($424.46/hr) was dropped and two rows with rates of $42.26 and $42.46 were treated as one grade, giving the 20 grades the county's compensation-project pages describe.
  7. City vs county pairing. The City payroll file carries pay grade but no title, so City "actual" pay is the median for everyone in a classification's grade. Pairings of differently named titles (34 pairs) are the assistant's judgment of job content; each pairing is listed with both titles so it can be disputed. The 69 exact-title matches are in a separate file.
  8. Health benefits. "Who pays" is taken from the 2026 premium schedule and guide; Commissioners Court left 2027 employee rates and plan design unchanged (Aug. 17 agenda item, Sept. 8 amendment removing OMB's proposed increases), so 2026 rates are presented as the FY27 position.
  9. News sources are used for events, votes, quotations and for figures that no primary document contains (the constable back-pay agreement, the top overtime earners, the Judge's $189M). Where a primary document has the figure, the primary figure is used even when a news report differs.
  10. The transparency verdict ("disclosed but dispersed") is an opinion. Each item behind it is cited to a public document, and the report states that every item is public.
  11. Mirrored documents (Section 5.4) were accepted as authentic county documents because their content matches the county's own later publications; a reviewer who needs certainty should obtain them from the county.
  12. Rounding. Dollar figures in prose are rounded to $0.1M; tables carry the printed figures.

10. Cross-checks performed

  • Parsed department tables sum to the printed totals (Section 6.2); the FY27 and FY26 books agree with each other on the shared columns.
  • FEAR totals in the Tax Code 26.18 posting agree with the Auditor's FEAR letters ($3,114,477,211 FY26; $3,351,376,287 FY27) and with the sum of departmental appropriations plus working capital in the budget book.
  • Adopted rates equal the voter-approval rates on the worksheets for the County, Flood Control and Port, and are below it for the Hospital District; the county rate history on Vol. I v3 p. 14 matches the worksheets' prior-year rates.
  • The three versions of Volume I (Aug. 17, Sept. 2, Sept. 17) were compared for the change lists, the healthcare recommendation and the appropriations total.
  • Health Insurance Fund figures were reconciled across the budget-book charts, the ACFR internal-service-fund statements and the June 2026 monthly report.
  • FY26 revenue and spending figures in the budget book were checked against the Auditor's reports.
  • Every chart and every page of the report was rendered to an image and inspected.
  • Statistics in notes/city_vs_county_pay_comparison.md were recomputed from the final 34-pair file after the pairing table was revised.
  • On 2026-09-21 at 22:37 CDT, parse_tables.py and parse_vol2_changes.py were re-run and compared byte for byte with the report-era CSVs (identical). Byte-identical reproduction did not, however, prove the parsers were right (see Section 14).
  • Revision 2 (2026-09-23): the 83 Volume II department change tables each reconcile opening + changes = closing; the 81 county departments' changes tie to Appendix A to the dollar; the two Auditor department tables tie to their printed totals; the revised category totals and City statistics equal the independent reviewer's figures (independent_review_2026-09-23/recalculated_results.json).

11. Defects found and how they were handled

During the work (all corrected before the report was delivered): - Appendix A parser double-counted rows because goal-area overview pages in the FY26 book repeat the table header; fixed by addressing the appendix pages explicitly and stopping at the "Working Capital" line. - The Auditor by-department parse ran on into other funds; fixed with the same stop lines. - Vol. II change lines were duplicated when a department's table spanned two pages; fixed by de-duplicating on (department, item, amount); lines whose label was on the preceding line were re-labelled. - The new-plan grade table first came out with 22 grades (Section 9, item 6). - The first tax-worksheet fetched (Jur669) was an emergency-services district; the four county jurisdictions were then identified from the Tax Office's jurisdiction page. The first text cut of the worksheets truncated the numeric columns; re-extracted. - Two truncated downloads were resumed and verified; error pages saved by blocked sites were deleted. - Report text: a claim that FY27 was the "largest increase" was removed after the FY24 actual (+12.1%) proved larger; a mixed-base "$2.78B" property-tax total was removed; the caveat about the FY27 FEAR was corrected to say it is bound into Vol. I v3. - Chart layout defects (overlapping labels, legends, captions) on eleven charts; a formatting error in a statistics print-out.

Found while preparing this summary (2026-09-21, from 22:31 CDT): - Unsaved parser fixes. The fixes to parse_tables.py (17:20) and parse_vol2_changes.py (17:33) had been applied by inline commands and never written back into the script files. The CSVs delivered with the report came from the corrected inline runs and are right, but the saved scripts could not reproduce them: a re-run at 22:33 regenerated five of the seven CSVs with the original defects (for example FY26-book column sums of $3.33B and $3.45B instead of $2.67B and $2.77B), overwriting the good files. The good files were restored at 22:36 from a copy taken before the re-run; at 22:37 both scripts were rewritten with the inline logic recovered verbatim from the session transcript, re-run, and all seven CSVs compared byte for byte with the restored files (identical). No figure in the report was affected at any point. The buggy interval is visible in the command log. - Mis-saved 404 pages. The bulk fetch of the City's job-description PDFs saved 24 HTTP 404 pages (196 bytes each, identical) under .pdf names. They were removed; the list with hashes is in notes/removed_404_pages_classifications.txt. - Unused bulk download. The same fetch left 756 genuine City job-description PDFs and one HR form (reqview.pdf) in sources/city_of_houston/classifications/. None was used for a figure; they are retained and described in REFERENCES.md C5 because they are the City's own descriptions of the jobs paired in the comparison. - Empty log. notes/download_log_coh_payroll.txt is empty; the payroll CSVs were fetched by a direct command whose output went to the console (the command is in the command log). The CKAN package metadata (coh_payroll_package.json) records the resource URLs, and the manifest records the sizes and hashes of the saved CSVs. - README.md described the report as 20 pages (its length after request 1); corrected to 29.

Found by the independent review of 2026-09-23 and corrected in revision 2 (details in Section 14): - Volume II parser combined department-level and program-level change tables (double counting). - Auditor June 2026 department parser dropped three departments. - The working-capital decline was described as planned consumption of reserves. - The $128M tax-rate effect was misattributed in this summary; the $35.8M inconsistency inside the tax posting was not disclosed; "highest since 2018" and "general-fund rate" were inaccurate. - The City comparison used the older classification-list ranges although the July 2026 pay structure was already saved; the HPD cadet figure was a payroll median, not the published base; the report predicted FY27 county sworn rates without a source. - The $92M health-fund shortfall read as an extra deficit; the 14.5% employer contribution was called a "match". - Contract patrol's $90.8M was presented as one subsidy figure; the ACFR control findings and the Volume II General Administration base discrepancy were not mentioned.

12. Limitations

  • The report is an analysis of public records by an AI system, delivered without human review. Its prose was generated from the data files and documents listed here; the assistant can misread a table or a sentence, and the hand-transcribed figures (Section 6.4) are the most exposed to that risk.
  • FY26 results are unaudited nine-month figures and a projection; FY27 figures are adopted-budget figures, not outcomes.
  • The county does not publish actual pay by job title, overtime by individual, or a reconciliation of the deficit to the adopted plan; conclusions in those areas rest on ranges, aggregates and residual arithmetic.
  • City-county job pairings are judgment calls (Section 9, item 7).
  • Text extraction from PDF can mis-order columns; the parsers' sum checks catch this for the department tables, but not for figures typed by hand from other pages.
  • Three county documents came from mirrors (Section 5.4); Chronicle articles from syndicated copies (Section 5.3).
  • The work was done in one day; documents posted after 2026-09-21 20:47 CDT are not reflected.

13. How to re-verify

  1. Integrity. From this folder run sha256sum -c MANIFEST_SHA256.txt. Every file except the manifest itself is listed.
  2. Sources. Re-download any document from the URL in REFERENCES.md and compare its hash with the manifest. A mismatch on a county file most likely means the county re-posted the document (versions of Volume I changed three times in September 2026); compare page count and content before concluding anything else.
  3. Text extraction. pdftotext -layout <pdf> - | diff - data/text/<name>.txt should be empty for any PDF.
  4. Parsers. In the nix-shell (Section 4) run python3 scripts/parse_tables.py and python3 scripts/parse_vol2_changes.py; the printed column sums must match Section 6.2 and the CSVs must be unchanged (git diff or cmp against copies).
  5. Hand-transcribed figures. Open each source at the page cited in summary_metrics.json (every block has a sources entry) and in Section 7 above, and compare. Suggested first checks: Vol. I v3 p. 27 (adopted revenue and expenditure), p. 14 (rate history), pp. 16-18 (healthcare), p. 76 (Dept. 202 lines), Appendix D p. 124 (elected salaries); Jur040_2026.pdf lines 27, 69 and 74; the June 2026 monthly report pp. ii, iii, v; the Tax Code 26.18 posting (all figures on its three pages).
  6. Derived figures. Recompute Section 8 from the figures in summary_metrics.json.
  7. Charts and report. python3 scripts/make_charts.py then python3 scripts/build_report.py. Output content is identical; bytes differ (renderer metadata).
  8. Everything else. notes/session_command_log.md lists every command in order; notes/data_file_provenance.md maps each file to the commands that produced it. Anything not covered by steps 3-7 can be traced there.

14. Independent review (2026-09-23) and revision 2

An independent review of the first edition was placed in independent_review_2026-09-23/ (summary, findings and method, a recalculation script with its outputs, and an evidence folder with fresh downloads and hashes). Its findings were checked against the sources and the scripts here before anything was changed; all material findings were confirmed and adopted.

Confirmed and adopted: 1. Volume II double counting. 817 of the 1,433 lines in the revision-1 parse came from "Program Change Table" pages; the District Clerk example in the review (five program lines summing exactly to the $7,944,892 department line) reproduces from data/text/. The parser was rewritten (Section 6.2); the new category totals equal the reviewer's to the dollar. Report Sections 1, 3, 6, 6A and 6B and the notes were corrected; Table 2b (additive reconciliation to the $326.0M increase) was added. 2. Three departments missing from the June 2026 table. Confirmed in data/text/_June_2026_Monthly_.txt lines 3312, 3372 and 3390. parse_tables.py now handles currency markers and footnoted negatives, asserts 81 rows and the printed totals; Appendix A of the report regenerates with all 81 departments. 3. Reserve inference. The sentence inferring an $89M planned consumption of balances was replaced with the certified-resources comparison (OMB forecast $3,079.4M vs certified revenue $2,964.3M, +$115.1M; appropriations vs certified revenue, +$131.1M). 4. Tax narrative. Rate described as total (M&O plus debt); $128M attributed to OMB's May scenarios; the $246.5M vs $210.7M difference disclosed; "highest since 2018" replaced by "highest in the ten-year series published". 5. FEAR statement. Section 7 no longer says the FY27 FEAR was unavailable; it says the certification is bound into the "Proposed" v3 book and that neither book reconciles OMB's forecast to it. 6. City comparison. Re-based on the City pay structure effective 2026-07-04 with scripts/city_comparison_date_align.py (pairings unchanged); statistics, Table 12, Figure 11 and the notes updated; HPD cadet base changed to the published $52,000 with the payroll median noted; the prediction about FY27 county sworn rates removed; the restricted City grade 3 and the 225% TCDRS match clarified. 7. Health, contract patrol, elected pay, audit findings. The $92M shortfall is described as what the $100M contribution answers; the $90.8M contract-patrol figure is split as the book splits it ($51.0M / $39.8M); the $786,188 elected-pay increase is put in proportion (0.24% of the increase); the four FY2025 ACFR control findings and the Volume II General Administration base discrepancy ($338.6M vs $193.9M) are added to Section 7.

Not adopted, or adopted only in part: - The review's list of records to request from the county (Section 12 of its findings) is outside what a public-records desk review can supply; it is referenced, not actioned. - The 55% non-recurring ratio is kept, with the qualification the review asked for. - The review's growth reconciliation excludes the Toll Road and Flood Control by department name; this revision does the same and additionally reports the $3.7M of county-department lines that sit on funds other than the General Fund. - The review's date-aligned director pairing maps the City side to grade 39; the same convention is used here and stated in the Table 12 caption.

Files changed in revision 2: scripts/parse_tables.py, scripts/parse_vol2_changes.py, scripts/city_comparison_date_align.py (new), scripts/make_charts.py, scripts/build_report.py, data/fy26_gf_budget_status_june2026.csv, data/fy25_gf_budget_status_sept2025.csv, data/fy27_vs_fy26_by_department.csv, data/vol2_change_items_by_department.csv, data/vol2_change_items_aggregated.csv, data/vol2_change_table_reconciliation.csv (new), data/coh_vs_county_hand_matched.csv, data/coh_vs_county_matched_titles.csv, data/summary_metrics.json, charts/c11_sworn_ladder.png, charts/c12_civilian_ranges.png (and every chart re-rendered), report/Harris_County_FY2027_Budget_Investigation.pdf, notes/city_vs_county_pay_comparison.md, notes/healthcare_benefits_investigation.md, README.md, REFERENCES.md, this file, and MANIFEST_SHA256.txt. Revision-1 values that were superseded are retained in summary_metrics.json under revision1_values_superseded and in the *_classlist columns of the City comparison files. The revision-1 report is recoverable from the git history of the Texas repository (commit df042c3).

Lesson recorded: byte-identical reproduction of a data file shows the script and the file agree; it does not show the script is right. Revision 1's checks compared parsed sums to printed totals for the Appendix A tables but had no such check for the Volume II aggregation or for the row count of the Auditor tables. Revision 2 adds both.

15. Folder inventory

Folder Files Size Content
report/ 1 2.1M the report (revision 2, 31 pages)
charts/ 13 2.2M figures
data/ 57 15M data files and text extractions
sources/ 889 240M official 47 (incl. sub-folders), analysis 1, news 68, City of Houston 14 + 759 in classifications/
notes/ 16 928K write-ups, extracts, logs, command log, provenance map
scripts/ 7 148K generators (7 in revision 2)
independent_review_2026-09-23/ 45 35M the independent review package (its own manifest inside)
root 4 README.md, REFERENCES.md, AUDIT_SUMMARY.md, MANIFEST_SHA256.txt

Total after revision 2: 1032 files including the manifest, about 295M. The manifest is the authoritative list; the review package is included in it unchanged.

16. Public edition (govspends repository)

This folder is the public edition of the working archive, published in the repository https://github.com/govspends/us-tx-counties-harris (path investigations/fy2027-budget/) and rendered by the govspends hub at https://govspends.github.io/govspends/us/tx/counties/harris/fy2027-budget/. Differences from the private archive described above: sources/news/ (68 saved news pages) and sources/analysis/ (the Baker Institute page) are omitted for copyright reasons and cited by URL instead; the scripts use paths relative to this folder instead of the private absolute path; MANIFEST_SHA256.txt was regenerated for the public file set. The report text is maintained as Markdown pages under docs/fy2027-budget/ in the repository root; the reportlab PDF in report/ is the archival revision 2, and the PDF published with the website is rebuilt from the pages on every change.