Repository navigation
v0.4.1
Immutable
release. Only release title and notes can be modified.
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)