Skip to content

v0.4.1

Choose a tag to compare

@github-actions github-actions released this 02 Sep 17:56
Immutable release. Only release title and notes can be modified.
8a0c129

0.4.1 (2026-09-02)

Added

  • add BLS QCEW county-level employment for GACS (GACS-QCEW-1) (#277) (f169ea5)
  • add branch name to footer — identify which code built the image (a593cb7)
  • add county_fips to GrowthArea + county FIPS map (GACS-QCEW-0) (#276) (a567c1c)
  • add Docker workflow Makefile targets; local build_date fallback (61b3b44)
  • add GACS v2 county employment, school quality, updated weights (#265) (972d83f)
  • add GACS v2 rebalance — rent growth 15%, adjusted weights (GACS-SCORE-1) (#279) (ecbf6be)
  • add HUD FMR rent benchmark adapter for GACS (GACS-FMR-1) (#278) (ddf3233)
  • add HUD FMR rent estimates and BLS LAUS county unemployment adapters (#261) (820ecc2)
  • add HUD Income Limits API adapter (c22929a)
  • add pipeline kanban backend + data health dashboard + screening UX (#357) (fdc1e48)
  • analysis: add CapEx reserve schedule with defaults (#381) (467cdf0)
  • analysis: add exit strategy and fix sensitivity rate axis (#380) (98d0eab)
  • analysis: add financing scenario comparison — conventional vs DSCR vs seller financing (#382) (0897277)
  • build: add build_date to version display; fix pre-commit inline styles (ca61638)
  • ci: add GitOps deploy gates, live acceptance tests, rollback + test coverage (#301) (789313c)
  • ci: add opencode GitHub Action, ported from fawkes (232ba56)
  • ci: Phase 3 — post-deployment acceptance pipeline with content-aware tests (b039c9c)
  • ci: phase A — CI guard, Pydantic validators, 22 acceptance tests (#303) (54f4132)
  • ci: phase C — authenticated ZAP scan + flaky test quarantine (#325) (67a2de8)
  • ci: phase C — flaky test detection, ZAP full scan, SLO dashboard (#305) (9e62f4b)
  • ci: Phase D — structured logging, request timing, alerting, API surface validation (#306) (966af39)
  • ci: replace python-semantic-release with release-please (#405) (c9eec56)
  • ci: run 19 BDD acceptance tests against live container after smoke tests (b424a6a)
  • county: wire all 11 TX county foreclosure scrapers into system page (8a2d0d6)
  • data: add Rentometer API adapter for real rent comps (#376) (8849d12)
  • data: comprehensive US city→county lookup (29,727 cities) (9e1e9bc)
  • data: reso web api + tax strategy + saved searches notifications (#360, #373, #374) (#385) (1c244a8)
  • data: unified US lookup replaces hardcoded county FIPS map (7f1ce2d)
  • discovery: auto-trigger HUD/USDA ingestion when data is missing (d022739)
  • discovery: rebuild discovery page and add pipeline screener (VIEW-DISCOVERY-1, VIEW-SCREENER-1) (#283) (1944ccf)
  • discovery: show in-page results instead of redirecting to screener (ba8a301)
  • gitops: phase 1 — deployment manifests with CI-driven image digest updates (d848299)
  • gitops: phase 3 — environments, image signatures, drift detection (aed6e50)
  • gitops: phase 3 — environments, image signatures, drift detection (#308) (a6f6c76)
  • implement Phase A of TOP_01_PLAN — CI/test quality gaps (#323) (e2bbf47)
  • implement Phase B of TOP_01_PLAN — financial math verification (#324) (642321a)
  • ingestion: wire full USDA TXT parser into ingestion service (1b98376)
  • leasing: kanban board for leasing pipeline with drag-and-drop (#292) (d553c9b)
  • leasing: kanban board for leasing pipeline with drag-and-drop (#292) (#293) (262ecde)
  • make: add Docker workflow targets — build, up, down, restart, logs, clean (be9e172)
  • make: add test-live target for live acceptance testing (3ecadb5)
  • math: phase B — financial math verification with 58 edge-case tests (#304) (30fd355)
  • mobile: pwa support — responsive templates, service worker, offline caching (#384) (54260bd)
  • p0: crm kanban board + data source health dashboard (#309) (3da9055)
  • pipeline: add location fields to PipelineProperty model (MODEL-PP-1) (#282) (273ab75)
  • pipeline: kanban CRM board with drag-and-drop stage advancement (#290) (b1aa5eb)
  • portfolio: add market cycle indicators dashboard (#383) (6a45dbd)
  • screening: range sliders for screening criteria; update Kanban spec (#291) (be1458f)
  • sources: sheriff sale scrapers for 5 TX counties + HUD dollar homes (00da486)
  • sources: wire tarrant county source and fix hud fmr token selection (#332) (3446ebe)
  • system: add 'Analyze Growth Areas' button to system page (4413b27)
  • ui: system status page — data inventory + operations, no CLI needed (442f867)
  • ux: add 'This month' filter to pipeline list (PIPE-UX-3) (#253) (cfd323b)
  • ux: add composite score breakdown rows to growth area lists (GA-UX-2) (#258) (e63cfb7)
  • ux: add experimental score disclaimer banner to growth areas (GA-UX-1) (#257) (10ec508)
  • ux: add pipeline review queue view (PIPE-UX-1) (#251) (d9136a4)
  • ux: add pipeline review queue view (PIPE-UX-1) (#252) (6383da9)
  • ux: add supply_constraint_index column with ACS-derived badge (GA-DATA-2) (#256) (b963791)
  • ux: growth areas dashboard + BRRRR timeline (#311) (ee0f6af)
  • ux: growth explorer redesign — no clutter, tier filter, multi-state ready (#315) (2aa23db)
  • ux: mao visualization, equity kpi, growth areas seed (#313) (a8ef165)
  • ux: move KPI cards to top with IDs, add live JS GRM recalc (PIPE-UX-4) (#254) (5b356b5)
  • wire ATTOM to discovery, add county pipeline support, add data confidence (next wave) (#260) (d8188ef)
  • wire HUD FMR into screening, add 10 TX county scrapers (#262) (5f14ecc)

Fixed

  • add ATTOM_API_KEY to settings; suppress FMR ZIP-level log spam (3852b1c)
  • add confidence column to growth area tables (GA-UX-1) (#275) (a552bcf)
  • add structlog to mypy.ini, format settings.py (#310) (3f8ab32)
  • address review findings from #384/#382/#381 (closes #393, #394, #395) (#397) (f89dbe2)
  • audit findings — DRF permissions, password validators, pipeline/portfolio tests, SECURITY.md update (#280) (68932b8)
  • ci: add --check-untyped-defs to mypy and fix test typing (#337) (3ff4daf)
  • ci: add explicit markers to BDD and post-deploy pytest runs (#334) (7982e2a)
  • ci: add source checkout to live-test job for BDD test files (800aae7)
  • ci: build single platform (amd64) to halve Docker build time (77f7927)
  • ci: exclude acceptance tests from unit test run (fc3366d)
  • ci: fix live-test container crash from SQLite database path parsing (954d6db)
  • ci: remove --noinput flag from seed_data command (79373aa)
  • ci: remove duplicate run key from lint job (412942f)
  • ci: replace broken bandit security lint with ruff S rules (#322) (7327569)
  • ci: resolve Trivy HIGH CVEs blocking Tier 2 Governance on main (#377) (5dc66b9)
  • ci: run apt-get update before installing libcairo2-dev (#406) (9229e39)
  • ci: show container logs on live-test failure (1d6bf79)
  • ci: simplify workflow name and needs format for GitHub Actions parser (ed1ffa4)
  • ci: speed up Docker build and fix live-test container startup (b4aeab6)
  • city name matching for discovery; remove old Foreclosures link; UX picker (c274f1b)
  • clarify HUD FMR 403 error — key needs separate FMR dataset registration (70f4216)
  • config: add FRED_API_KEY to .env.example and settings.py (GA-FIX-1) (#259) (a4882de)
  • db: enable SQLite WAL mode to prevent background thread lock errors (a2337f2)
  • deps: bump opentelemetry-sdk and exporter-otlp alongside api to 1.44.0 (e8009ff)
  • deps: pin structlog directly and guard middleware import (#333) (c27ea5c)
  • devcontainer: add Python feature and use python -m pip (23be4b0)
  • devcontainer: sync PYTHON_VERSION in docker-compose.yml with Dockerfile (1ce4ed5)
  • devcontainer: use latest Python feature image (3.14 not published yet) (d984efa)
  • discovery: auto-scrape VRM for state when data is missing (159dde2)
  • discovery: run HUD/USDA ingestion synchronously on first request (9444e0a)
  • discovery: run VRM scrape in background thread; replace View Foreclosures (6887535)
  • discovery: wire landlord tier filter and convert discovery flow to AJAX (825b4c3)
  • exempt health check from DRF rate limiting (e75daab)
  • growth: expand county FIPS map to 87 cities; fix template weights (006da76)
  • growth: expand county_fips_map to 97 entries; backfill all cities (780624c)
  • growth: reduce QCEW timeout to 5s; wrap in try/except (659080a)
  • growth: remove QCEW and FMR HTTP calls from web view (worker timeout) (b48f0ab)
  • growth: try QCEW county-level employment on first explorer run (381850c)
  • growth: wire unified us_lookup into populate_growth_areas QCEW/FMR paths (898fd03)
  • HUD FMR 403 — token likely created before selecting FMR dataset (ba1afe8)
  • improve HUD FMR API error diagnostics on 403 (22b63de)
  • infra: increase gunicorn worker timeout 30→120s (ca87f1a)
  • nav: change Rehab & Lease link from pipeline_list to leasing_list (#250) (f07b436)
  • ops: DB-aware health check + rate limit on paid API fan-out views (#379) (bf2b802)
  • populate net_migration_rate in both ingestion paths (GA-DATA-1) (#274) (dbb8a48)
  • populate rent/school/migration in GACS; scale composite_score to 0-100 (#289) (0099501)
  • remove dead school_score lookup in growth_explorer (GA-BUG-3) (#270) (b623533)
  • remove Jinja2 whitespace-trim syntax from branch/built_date tags (04ad0fa)
  • remove Jinja2 whitespace-trim syntax from Django template (a4caeeb)
  • resolve 5 MEDIUM audit findings (save perf, data_confidence, index, imports) (#288) (af87106)
  • resolve 6 BLOCKER audit findings (supply, pipeline, syntax, templates) (#286) (c145378)
  • resolve 8 HIGH audit findings (indexes, double-screening, aggregation, auth) (#287) (e18a296)
  • resolve CI failures on PR #288 — Makefile test + PDF exclusion (39f9193)
  • ruff format (#255) (8694fb8)
  • score breakdown matches actual GACS v2 weights (GA-BUG-1) (#269) (719c646)
  • screening: address code-review findings on Rentometer fallback chain (#378) (903b567)
  • screening: slider names must match updateLabel fieldName pattern (e7f1971)
  • security: add @login_required to 5 unprotected views (ad49c5b)
  • security: stop logging ZIP code in VRM source fetch (2c42597)
  • set metro_area to blank instead of city_name (GA-DATA-3) (#272) (7f3ed9e)
  • stop FMR warning spam per state (3f3a38f)
  • tests: update container startup tests for preiweb service rename (#351) (2ca1bc0)
  • ux: redesign discovery page — remove redundant empty states, cleaner layout (992c6d8)
  • ux: redesign growth explorer — less clutter, tier filter, multi-state ready (9b120ea)
  • workflow: resolve docker-publish.yml syntax errors from PR #301 (ff5f4d7)

Docs

  • add branch discipline to GitOps principles (AGENTS.md) (99c5903)
  • add GitOps principles, context files, and CONVENTIONS link to AGENTS.md (f2cb6ed)
  • add investor workflow guides for growth, discovery, screening, underwriting (#336) (ff42608)
  • add LIMIT-18 for FRED state-level employment coarseness (#271) (1e3ec29)
  • add product-level discovery brief and feature spec writing guide (8260512)
  • audit docs, organize directory structure, add AGENTS.md guidance (6b13ea0)
  • comprehensive plan to reach top 0.1% quality (31f0a06)
  • document never-swallow-exceptions principle in Never Do list (#345) (ef0fc04)
  • document orphaned rent_growth_rate field (GA-DATA-2) (#273) (acc5ef0)
  • fix stale Django 5.2→6.0, copyright 2024→2026, devcontainer Python 3.14→3.13 (3443f0e)
  • gitops: phase 2 — uFawkesObs integration guide, webhook, DORA metrics (#307) (575f7d8)
  • honest product maturity audit — replace outdated strategy with real statuses (1ae6763)
  • local dev environment setup + prioritized P0-P2 plan (ce1c8b8)
  • move LIMIT-04 to resolved (composite_score is now a persisted DecimalField) (#268) (51120b3)
  • revise discovery brief to cover full investor lifecycle (fd346c1)
  • sync API_SURFACE, ARCHITECTURE, and add app review findings (a32bef5)

Changed

  • ci: parallel test jobs, post-deploy smoke, local/devcontainer deploy targets (#285) (7888e1f)
  • finance: split finance utils into focused modules (#331) (d70e70f)

Chores

  • audit medium batch — pin deps, session security, CORS docs, severity labels, new validator/scoring tests (#281) (a425d15)
  • audit quick wins — ruff target, search, CSV export, README (1ccbe32)
  • ci: rename live acceptance tests to smoke tests; add test pyramid plan (256f3b9)
  • deps: bump actions/cache from 4 to 6 (#392) (a3dd162)
  • deps: bump actions/download-artifact from 5 to 8 (ed56885)
  • deps: bump actions/setup-python from 6 to 7 (#316) (eede239)
  • deps: bump actions/upload-artifact from 5 to 7 (3ca8080)
  • deps: bump aiohttp from 3.14.1 to 3.14.3 (#343) (ade42b5)
  • deps: bump aiohttp in the uv group across 1 directory (#338) (e245397)
  • deps: bump anomalyco/opencode/github from 1.18.18 to 1.18.21 (#391) (ac34fea)
  • deps: bump anomalyco/opencode/github from 1.18.21 to 1.18.25 (#404) (56294a9)
  • deps: bump commitizen from 4.16.4 to 4.16.5 (#318) (6f30e49)
  • deps: bump commitizen from 4.16.5 to 4.17.0 (#342) (c8cb537)
  • deps: bump coverage from 7.15.0 to 7.15.1 (022317b)
  • deps: bump coverage from 7.15.1 to 7.15.2 (#330) (7cdfbff)
  • deps: bump coverage from 7.15.2 to 7.15.4 (#349) (d087dc6)
  • deps: bump coverage from 7.15.4 to 7.16.0 (#400) (481698a)
  • deps: bump cryptography from 49.0.0 to 50.0.0 (#341) (d43f77a)
  • deps: bump django-structlog from 9.0.0 to 10.1.0 (#403) (2dea6c5)
  • deps: bump django-stubs from 6.0.6 to 6.0.7 (4b2fc39)
  • deps: bump djangorestframework from 3.17.1 to 3.18.0 (#386) (1f87ae8)
  • deps: bump djlint from 1.40.3 to 1.42.1 (#317) (1282528)
  • deps: bump fastapi from 0.139.0 to 0.139.2 (#321) (e1d15c1)
  • deps: bump matplotlib from 3.11.0 to 3.11.1 (#320) (2ceaf41)
  • deps: bump mypy from 2.2.0 to 2.3.0 (#326) (faac958)
  • deps: bump mypy from 2.3.0 to 2.3.1 (#401) (afaaaa8)
  • deps: bump opentelemetry-api from 1.32.1 to 1.44.0 (6267be1)
  • deps: bump playwright from 1.61.0 to 1.62.0 (#340) (2219f49)
  • deps: bump pymdown-extensions from 11.0.1 to 11.0.2 (#390) (d736ad1)
  • deps: bump pypdf in the uv group across 1 directory (#398) (c104a16)
  • deps: bump pytest-rerunfailures from 16.1 to 16.5 (#348) (1b5bd30)
  • deps: bump python-json-logger from 3.3.0 to 4.1.0 (#329) (fb0255c)
  • deps: bump python-json-logger from 4.1.0 to 4.2.0 (#387) (029b5db)
  • deps: bump reportlab from 5.0.0 to 5.0.1 (#388) (ae8ede1)
  • deps: bump ruff from 0.15.20 to 0.15.21 (79b217b)
  • deps: bump ruff from 0.15.21 to 0.15.22 (#319) (61773b9)
  • deps: bump ruff from 0.15.22 to 0.16.0 (#327) (8a8b347)
  • deps: bump ruff from 0.16.0 to 0.16.5 (#399) (82ffd51)
  • deps: bump svglib from 2.0.2 to 2.2.0 (#389) (70404e7)
  • deps: bump types-psycopg2 from 2.9.21.20260518 to 2.9.21.20260712 (04f2503)
  • deps: bump types-psycopg2 from 2.9.21.20260712 to 2.9.21.20260724 (#402) (e73ea96)
  • deps: bump types-reportlab from 4.5.1.20260521 to 4.5.1.20260712 (c8296ae)
  • deps: bump types-reportlab from 4.5.1.20260712 to 4.5.1.20260728 (#328) (9f827eb)
  • ignore .omo/ artifacts, commit Serena config migration (5136735)
  • major refactor - models package, notifications, portfolio dashboard (#267) (679228b)
  • pin all dependencies for deterministic, reproducible builds (#284) (b70c637)
  • pre-release cleanup — remove orphaned files, consolidate docs, fix Trivy CVEs (#358) (5798467)
  • rename compose service web to preiweb for observability clarity (#344) (7253ef4)