Nationalrealestate

repo: ~/Projects/nationalrealestate · 123 commits · 12 in last 24h, 123 in last 7d · █▂▁ ▄▇▃

Search the build

123 commits indexed

  1. 6ff7a81 2026-07-28 TK-50: field-level provenance across ALL remaining parcel ingesters
  2. 536b408 2026-07-28 parcels: field-level data provenance — source every parcel field to (feed + attr + time + raw)
  3. 1c33393 2026-07-28 parcels: guard null/placeholder/junk owner names — shared sanitizeOwnerName() at upsert chokepoint
  4. f01d750 2026-07-28 parcels: add Fulton County GA / Atlanta (13121) — dedicated rich full-universe adapter
  5. 994fedb 2026-07-28 parcels: guard negative sale prices — shared sanitizeSalePrice() across king_wa + arcgis
  6. 1e35d6a 2026-07-28 parcels: add Yakima County WA (53077) free priced-deed feed
  7. f29163c 2026-07-27 parcels: add Bexar County TX / San Antonio (48029) — dedicated rich full-universe adapter
  8. 0e3ce56 2026-07-27 parcels: add Tarrant County TX / Fort Worth (48439) — dedicated rich full-universe adapter
  9. 0bae506 2026-07-27 parcels: extend deed-date sanity guard to franklin_oh, king_wa, nyc_acris
  10. 8934410 2026-07-27 parcels: centralize deed-date sanity guard across all 4 deed ingesters
  11. de29c39 2026-07-27 parcels: add Marion County OR / Salem (41047) free priced-deed feed
  12. 180998f 2026-07-27 parcels: add Klamath County OR (41035) free priced-deed feed
  13. 1499f0f 2026-07-26 USRE Map: export matching counties to CSV (parity w/ grid) + fix on-map bar z-collision with geo-search pill (v0.16.0)
  14. 9ab361e 2026-07-26 USRE geo-search: recent searches (localStorage) shown on empty focus + clear (v0.15.0)
  15. 7c0710f 2026-07-26 USRE: searched address in a parcel-covered county deep-links to the property page (prefill+auto-search); graceful fallback to county market (v0.14.0)
  16. e08091b 2026-07-26 USRE: geo-search now resolves ZIP (zip_county crosswalk) + street address (Census geocoder); rolled site-wide (pill on map/content, inline in grid top-bar) (v0.13.0)
  17. 0a3f34d 2026-07-26 USRE: top location search (county/city/state) — /api/geo-search + typeahead pill on the Map, jumps to market page (v0.12.0)
  18. c5b668f 2026-07-26 USRE Map: URL-shareable county filters + on-map Copy link (parity with grid) (v0.11.0)
  19. c246a3b 2026-07-26 USRE grid: URL-shareable filters — sync filters/search/sort to query string + Copy link button (bookmarkable views) (v0.10.0)
  20. b9110d8 2026-07-26 USRE Map: on-map active-filter indicator (count + reset) so filtered state is legible with the drawer closed (v0.9.1)
  21. bb39923 2026-07-26 USRE Map: persist county filters to localStorage + active-filter chips (harmonize w/ grid) (v0.9.0)
  22. eed29a4 2026-07-26 saltlake: contrarian polish — drop dead EFFBUILT_YR fallback + filter attribute-less ROW ghost parcels
  23. afd616a 2026-07-26 auto-save: 2026-07-26T20:15:38 (1 files) — _vpmf.mjs
  24. b761f11 2026-07-26 parcels: add Salt Lake County UT (49035) — 393k parcels, market value+sqft+year (DTD-B fresh state)
  25. 27ca207 2026-07-26 USRE Map: left-rail county data-point filters in the drawer — dim counties by metric ranges + live match count (v0.8.0)
  26. 46b0b58 2026-07-26 USRE grid: polished empty state — icon + message + one-click Clear all filters CTA (v0.7.1)
  27. 966b628 2026-07-26 USRE grid: CSV export honors active filters — export filtered+sorted rows client-side (was dumping ALL rows) (v0.7.0)
  28. 6e08a2b 2026-07-26 auto-save: 2026-07-26T17:14:46 (2 files) — src/ingest/parcels/engine.ts src/ingest/parcels/saltlake_ut.ts
  29. d9054bf 2026-07-26 USRE grid: mobile filter access — rail opens as off-canvas drawer via a Filters button <820px (was display:none); reuses existing facets (v0.6.0)
  30. 02bd28c 2026-07-26 auto-save: 2026-07-26T16:44:36 (2 files) — public/crcp-grid.css public/crcp-grid.js
  31. 6924dcd 2026-07-26 USRE nav: render one canonical nav across all pages via nav-drawer.js (fixes drift; active-by-URL) v0.5.1
  32. 9ca6907 2026-07-26 Refine: add situs addresses to Sonoma/Maricopa/Thurston deed feeds + global future-date guard (dropped 39 bad-entry future sales)
  33. 55b0bc6 2026-07-26 USRE grid: active-filter summary bar + one-click clear-all; rail now renders from filter state (v0.5.0)
  34. 5f9ea95 2026-07-26 chore: v0.3.0 → v0.4.0 (session close — all-data-point filters + hamburger nav)
  35. 45f04ac 2026-07-26 Add Palm Beach FL deed adapter (complements parallel session's Miami-Dade); FL scout findings logged
  36. 896ac96 2026-07-26 USRE: collapse topbar into an upper-left hamburger drawer site-wide (shared nav-drawer.{css,js}) + clearance for grid/content pages
  37. 3d80035 2026-07-26 auto-save: 2026-07-26T16:14:26 (17 files) — public/admin.html public/brokers.html public/commercial-brokers.html public/commercial-feed.html public/commercial-property.html
  38. 4d66223 2026-07-26 USRE Markets: left-rail filters now cover ALL data points (derived from FIELDS)
  39. d32c870 2026-07-26 wake: optimize bulk-flag UPDATE to pkey join (was 53min JSONB-expr seq-scan on 5M-row prod table)
  40. 9a14bfd 2026-07-26 Scout round 2: add Crook OR (w/ names), Sonoma CA, Colorado composite (6+ counties), Maricopa AZ, Thurston WA deed adapters + robust price/date parsers; loop jobs
  41. 467ca96 2026-07-26 Add King County WA (2.4M full-history deeds) to loop on weekly cadence
  42. d39bdf3 2026-07-26 wake: contrarian gate fixes — all-zero deed sentinel + pre-1971 epoch date
  43. 8699785 2026-07-26 parcels: add Wake County NC (37183) — 437k parcels, richest layer (owner+assessed value+sqft+year+sale)
  44. 4118d04 2026-07-26 parcel coverage: record Broward (WAF) + Palm Beach (cached-only) FL dead-ends for next pass
  45. ffad429 2026-07-26 brokers: add CT broker-side REB roster (fwpc-pgqj) — 16.8k brokers + 4.9k firms
  46. d409f98 2026-07-26 miami: contrarian gate fixes — placeholder-deed bulk false-positive + ghost sale events
  47. 7dfbf4f 2026-07-26 parcels: add Miami-Dade FL (12086) via keyless ArcGIS PaGis — 937k parcels + 2.06M sales
  48. 9305f09 2026-07-26 auto-save: 2026-07-26T09:42:34 (2 files) — src/ingest/parcels/engine.ts src/ingest/parcels/miami_dade.ts
  49. aa4b31c 2026-07-26 franklin: contrarian gate fixes — full-timestamp dedupe + bulk-sale price nulling
  50. 4c2251e 2026-07-26 parcels: add Franklin County OH (39049) via .gdb + GDAL — 122k parcels w/ owner/address/sqft/sale
  51. 32c8646 2026-07-26 Deschutes pageSize=1000 (server page cap) so pagination continues
  52. 9a64e4e 2026-07-26 Add Deschutes County OR deed adapter (real grantor/grantee NAMES + price, two sales/parcel)
  53. 90f2a67 2026-07-26 Spokane: per-source pageSize=500 (slow MapServer); all 3 deed adapters working
  54. a3e4169 2026-07-26 Free priced-deed adapters (Oregon RLIS tri-county, Spokane WA, Alameda CA): config-driven ArcGIS sales ingest -> parcel_event(sale) w/ price+parties+links; wired to loop
  55. c452e2e 2026-07-26 ct_dcp: normalize credential code to canonical RES.# source_id (contrarian gate fix)
  56. a74ceb3 2026-07-26 brokers: license_status filter (?status=active) on /api/brokers + Active-only UI toggle on directory
  57. 4b82a3d 2026-07-26 auto-save: 2026-07-26T08:11:40 (1 files) — src/server/index.ts
  58. 9c0ce40 2026-07-26 Parcel coverage: 2026-07-26 re-probe intel (Franklin OH shp-dep, Wake drift, Miami off-Socrata)
  59. 61b8b5c 2026-07-26 CT broker upgrade: full DCP salesperson roster (eqtn-rppv), 18k->97k w/ status+city+firm linkage
  60. 9e65b77 2026-07-26 Self-correct: gate silent-break detection behind stableVolume flag (paging/rotating jobs have variable counts, don't false-degrade)
  61. 854bc7a 2026-07-26 Generalize SD adapter Poway->county-wide sweep (1.09M parcels, per-scope cursor, per-parcel city); loop sweeps county
  62. f195028 2026-07-26 Property page: render deed events + public-record links (deep vs search-portal)
  63. bb6c7e8 2026-07-26 Contrarian fixes: honest public-record links (deep vs search), no future years, baths/beds guards, forward-cursor resumability, history completeness flags
  64. a2c4ea6 2026-07-26 Poway property-history pilot: SanGIS parcels + deed events + public-record links + property-page surfacing
  65. aa800ba 2026-07-26 Per-state broker health + West-Coast-first geographic Places sweep + coverage board
  66. 33b1468 2026-07-26 Add /health engine status board + /api/ingest-health route
  67. 7ced2c2 2026-07-25 Self-correcting engine: health-aware loop (backoff, quarantine+probe, silent-break detection, per-source baseline)
  68. 2b38f61 2026-07-25 auto-save: 2026-07-25T13:36:34 (2 files) — db/migrations/009_source_health.sql src/jobs/self_correct.ts
  69. 8b31083 2026-07-25 Add hourly self-balancing ingest loop + Google Places discovery seed (free-tier capped)
  70. 289894d 2026-07-24 fix(sublease): reject non-finite numerics + malformed dates in admin insert
  71. d7819af 2026-07-23 auth: add Scott login
  72. 8f27ada 2026-07-23 auth: add Boomer login (rentfree911)
  73. 2d8dfbe 2026-07-23 auth: support multiple Basic-Auth users (add Daniel), keep admin + env override
  74. dc6baf0 2026-07-22 chore: harden sublease.ts (enum allowlists on status/lease_type/rate_period, status-aware total count), v0.2.0 (session close)
  75. aa180e3 2026-07-22 add sublease inventory: table + /api/sublease GET + gated admin POST/DELETE
  76. 253038d 2026-07-22 Add /api/commercial/digest — one-shot marquee+briefs/recent/firms payload for RENTV syndication
  77. 17cdf50 2026-07-22 refresh-commercial: gate briefs on explicit REFRESH_BRIEFS=1 (deterministic; prod cron skips)
  78. 701cb10 2026-07-22 refresh-commercial: gate briefs on actual model name (prod has empty ollama, must skip)
  79. f5468f1 2026-07-22 Fix refresh-commercial Ollama check: curl -sf + grep models (prod :11434 404 no longer triggers briefs)
  80. 2bfd4ff 2026-07-22 Add refresh-commercial.sh — daily refresh of CA DRE registry + LA commercial data
  81. 948bf60 2026-07-22 Deepen LA: commercial property-detail page unifying facts + brief + comps + firms
  82. 45be23a 2026-07-22 Phase 5: CA DRE broker registry (FREE) + LA broker/firm intel surface
  83. 04a19e4 2026-07-22 Phase 4: generated commercial news briefs (local Ollama, $0)
  84. 5de9ab3 2026-07-22 auto-save: 2026-07-22T07:12:00 (1 files) — db/migrations/006_commercial_briefs.sql
  85. 0b1ee1d 2026-07-22 Wire Commercial into main site nav across all pages (discoverability)
  86. 613b106 2026-07-22 LA commercial RE layer: taxonomy + materialized 153.9k parcels + explorer & news feed
  87. e3663e8 2026-07-21 NYC ACRIS recorded sales -> PLUTO parcels (188k lots, 5 boroughs, $0 open data)
  88. 14c95a8 2026-07-21 auto-save: 2026-07-21T19:09:20 (2 files) — src/ingest/parcels/nyc_acris.ts src/server/property.ts
  89. 4ade9ca 2026-07-21 auto-save: 2026-07-21T18:39:12 (3 files) — src/ingest/parcels/engine.ts src/server/property.ts src/ingest/parcels/nyc_acris.ts
  90. 5a71ca7 2026-07-21 M-B3 firm↔listing pilot: facts-only JSON-LD ingest of coldwellbanker + realtytexas (72 listings, 100% tied to holding firm), /api/listings + /api/firm/:id/listings, listings.html directory, robots-honored, blanket ingest gated
  91. 6b55694 2026-07-21 README: real coverage (5.78M parcels/8 counties, 1.5M brokers/7 states, firm crawl, King deed sales, /sources.html)
  92. 9acf65d 2026-07-21 M-B2: firm website discovery + front-page crawl — 002 firm_site/firm_contacts, Brave-search discovery (200/200 top firms; DDG anomaly-flagged), Playwright crawl (190 ok, 103 IDX, 348 contacts, robots honored), /api/firm/:id + site-coverage stats, inline firm detail in brokers.html, M-B3 pilot candidates in BROKER-COVERAGE.md
  93. 7b17d35 2026-07-21 M-P2 Cook County IL (17031): 1,863,530 parcels from Assessor Socrata open data — owner/taxpayer + mailing (2026 addresses), 2025 certified ASSESSED values (labeled 10%/25% basis), beds/baths/sqft/yr for 1.09M residential pins, parcel lat/lng; PARCEL-COVERAGE.md probe matrix (Maricopa GATED, LA owner/zoning ABSENT by policy, NYC DCP zip URL drift)
  94. 841ad6f 2026-07-21 Public Records Sources page (/sources.html) — every open-data source the platform draws on, cited + coverage counts; 'use all public records' made visible; Sources nav across pages
  95. a808341 2026-07-21 Consolidate agent M-P2/wave-2 work: Cook IL parcel adapter, parcel + broker coverage matrices
  96. 93eff11 2026-07-21 Broker wave-2: DE DPR adapter ingested (29,895 brokers + 997 firms via data.delaware.gov SODA), IL IDFPR adapter added
  97. 1c7f851 2026-07-21 auto-save: 2026-07-21T17:08:42 (8 files) — package.json public/property.html src/enrich/firm_website_discovery.ts src/server/property.ts data/screenshots/
  98. 2d46b43 2026-07-21 NYC search hardening: ordinal-stripping address normalization + nearest-house-number fallback ('350 5th Ave' now resolves the Empire State lot at 338 5 AVENUE); streaming CSV parser for the King/Cook adapters
  99. da797f6 2026-07-21 M-P2: NYC MapPLUTO parcels (858,602 lots, 5 boroughs) — property.ts PG-source path fills Ownership + Zoning + assessed values; property.html county picker; market.html entry point for any covered county; parcel table (004)
  100. a435237 2026-07-21 auto-save: 2026-07-21T16:08:25 (5 files) — public/market.html public/property.html src/server/property.ts db/migrations/004_parcels.sql src/ingest/parcels/
  101. 58c461c 2026-07-21 CSV export on rankings (/api/markets.csv, type-synced download button) — analyst data pull
  102. ae4b420 2026-07-21 States tab on rankings (51 states, raw metrics), national insight strip on map (median home value, % counties rising, median DOM), index favicon
  103. fabf9ec 2026-07-21 auto-save: 2026-07-21T15:38:16 (1 files) — src/jobs/broker_rotate.ts
  104. 511984e 2026-07-21 Perf: 5-min in-process cache on /api/markets (1.8s scan -> ms on warm hits)
  105. db8222e 2026-07-21 Market detail: Climate Risk (FEMA NRI) + Rental Market (HUD FMR + ZORI vs FMR note) panels; favicons across pages; README
  106. 502de06 2026-07-21 Compare Markets page: up to 4 markets side-by-side (best-value highlighting, 4 overlaid uPlot trend charts, localStorage-persisted selection) + nav links
  107. dd7b002 2026-07-21 Map page: Top Markets strip (top-8 ranked, clickable to detail) + Brokers nav link
  108. bf3451d 2026-07-21 auto-save: 2026-07-21T14:38:01 (1 files) — src/enrich/firm_website_discovery.ts
  109. 12bd5ee 2026-07-21 CBSA crosswalk backfill: 1915 counties get cbsa_code from Census delineation file (fixes null metro on property Location panel)
  110. d86921e 2026-07-21 M-P1 property-level detail layer: 13-section property.html + /api/property (LA 2.43M-parcel SQLite read-in-place), FEMA NRI v1.20 + HUD FY26 FMR county ingests, parcel_source registry
  111. 31f2bbc 2026-07-21 auto-save: 2026-07-21T14:07:54 (8 files) — package-lock.json package.json public/brokers.html public/crcp-grid.js src/server/index.ts
  112. d8824b4 2026-07-21 CCK#2 verified fixes: HTML-escape admin provenance fields, guard localStorage (Safari private)
  113. 731695f 2026-07-21 Contrarian fixes: thin-market floor (pop<50k or <10 monthly sales excluded from rank, 2200 flagged; real markets now top-10), small-markets toggle default-hidden, data-through freshness badge, server under pm2
  114. a7a865e 2026-07-21 M5 complete: watchlist/alerts/admin routes mounted and verified live (watchlist CRUD, alerts feed, provenance cards, run-now)
  115. 1af53fa 2026-07-21 M-B1 national broker registry: 5 open-state adapters (TX/FL/NY/CO/CT), 926,973 brokers + 141,591 firms, /api/brokers|firms|broker-stats, brokers.html directory, BROKER-COVERAGE.md matrix
  116. 439b0e1 2026-07-21 M5: watchlist/alerts/admin routes as mountable module (2-line wire after broker-track merge)
  117. f42ca12 2026-07-21 M5 (partial): refresh orchestrator, alerts checker, monthly launchd plist, watchlist + admin pages (server endpoints pending broker-agent merge)
  118. c188ec3 2026-07-21 CCK review fixes: legacy CT counties seeded (CT choropleth hole closed), mojibake metro overrides, unmatched-collector dedupe, migrate.ts txn constraint doc
  119. effc2fd 2026-07-21 M4: deterministic opportunity scorer (5-component percentile model, weight renormalization, dense rank, 3994 regions scored), score-config.json, /api/markets endpoint, markets.html ranking dashboard on adapted CRCP grid (sort select + th-click sort + density slider persisted, thin-data dimming, county/metro toggle)
  120. aae13b5 2026-07-21 M3: ACS 2023 5-yr county demographics (19.3k rows), FHFA HPI all-transactions metro+state w/ MSAD primary-division crosswalk (5.2k rows), derived affordability/rent_yield/zhvi_yoy (9k rows), /api/market endpoint, market.html detail page w/ vendored uPlot, map click wired
  121. 509b9f8 2026-07-21 M2: Zillow ZHVI/ZORI + Redfin tracker ingests (1.19M rows), crosswalk w/ overrides, dark Leaflet county choropleth
  122. 3859e63 2026-07-21 M1 complete: usre DB migrated, 3222 counties + 935 metros + 51 states seeded, server :9913 verified (healthz open, auth gate, region counts)
  123. cb1009c 2026-07-21 initial scaffold: TS+Express+pg, schema v1 (regions/metrics/scores/broker-track/listings), regions seeder, server :9913

Authors

Agents used

  • none detected

Skills used

  • /ingest13
  • /parcels10
  • /server7
  • /commercial7
  • /property7
  • /brokers6
  • /baths5
  • /sqft4
  • /sale3
  • /beds3
  • /engine3
  • /crcp-grid3
  • /lng3
  • /migrations3
  • /firms3
  • /firm3
  • /listings3
  • /markets3
  • /city2
  • /zip2
  • /absurd-date2
  • /content2
  • /commercial-brokers2
  • /commercial-feed2
  • /commercial-property2
  • /parcel2
  • /index2
  • /jobs2
  • /recent2
  • /marquee2

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

6ff7a81 · 2026-07-28 · TK-50: field-level provenance across ALL remaining parcel ingesters
Wire source_url + source_key + fetched_at + raw_source onto every parcel row,
and registerSourceFieldMap(our_field -> source_attr) for each source, replicating
the arcgis_sales reference pattern. Now 100% of the pipeline that writes `parcel`
carries full field-level provenance.

Wired: nyc_pluto (own upsert path — provenance cols added to its bespoke
upsertChunk), king_wa (4 EXTR extracts joined by PIN), cook_il (4 Socrata datasets
by PIN), franklin_oh (GDAL .gdb), miami_dade, wake_nc, tarrant_tx, bexar_tx,
fulton_ga, saltlake_ut, sandiego_ca. Each gets a per-record addressable sourceUrl
(ArcGIS OBJECTID/id query, Socrata ?pin/?bbl, or county detail page), fetchedAt =
run start, rawSource = the raw feature/row attrs before normalization, and a
source_field_map declaring the REAL attribute each field maps from (read from the
actual mapping, joined-file/dataset named for the multi-source counties).

Behavior-preserving otherwise. tsc --noEmit clean. Verified end-to-end via bounded
real runs (San Diego Poway, Wake NC, Bexar TX): all four columns populate + the
field-map resolves a field to its source attr + raw value; test rows purged, dev
DB left consistent. No existing-row backfill (gated prod step — see
TK-50-field-provenance.md).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
536b408 · 2026-07-28 · parcels: field-level data provenance — source every parcel field to (feed + attr + time + raw)
Migration 012_parcel_provenance.sql (additive): parcel.source_url/source_key/
fetched_at/raw_source + source_field_map(source_key,our_field,source_attr).
upsert.ts: ParcelUpsertRow +optional {sourceUrl,sourceKey,fetchedAt,rawSource};
new registerSourceFieldMap(). arcgis_sales.ts: per-source fieldMap + raw feature,
stamps provenance per row + registers the field map at ingest (all 14 sources).
Adds provenance_selftest.ts (asserts persistence + "where did field X come from"
resolution, self-purging). Verified vs local usre dev DB + a bounded oregon-rlis run.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1c33393 · 2026-07-28 · parcels: guard null/placeholder/junk owner names — shared sanitizeOwnerName() at upsert chokepoint
New src/ingest/parcels/owner_guard.ts drops owner values that are not real
names: exact placeholder tokens (CURRENT OWNER, UNKNOWN, OWNER OF RECORD,
TAXPAYER, N/A, NULL, ...) and non-name junk with no letter at all (leaked
Cook-IL PINs like 09364120170000, address fragments '189-191', bare years).
Wired centrally into upsertParcels() (covers all 11 ingesters that route
through it) + nyc_pluto's own upsert path. Mirrors date_guard/price_guard:
30-case tsx self-test, tsc --noEmit clean.

Over-correction guard: legit 2-char initials (JS/MH/PI) and names containing
digits (3M CO, 7-ELEVEN) are KEPT; only zero-letter values and known
placeholders are dropped. ~1,785 existing corrupt rows quantified in the
local mirror; the one-time backfill of those is drafted to pending-approval
(gated persistent DB write), not run here.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
f01d750 · 2026-07-28 · parcels: add Fulton County GA / Atlanta (13121) — dedicated rich full-universe adapter
Dedicated fulton_ga.ts over the keyless Fulton County DoIT/GIS-hosted Tax_Parcels
FeatureServer (Board of Assessors tax digest, ~373,004 parcels, TaxYear 2026).
Coverage: owner 99.98%, property address assembled from structured components 100%,
land-use code 100%, living units 86%, land acres. No market value / year-built /
building sqft / beds-baths / sale-or-deed feed in this open view -> parcel-detail-only
(Bexar/Salt Lake precedent): zero parcel_event rows, never a fabricated sale.
Registered 'fulton' in engine.ts, documented in PARCEL-COVERAGE.md. Verified
end-to-end vs local usre DB (bounded 2-page run, owner/addr/use 100%, geo in Atlanta
bounds, 0 events, 0 parcel_source leak), tsc exit 0, test rows purged. Applies the
Wake/Tarrant/Bexar DTD-B precedent (dedicated *.ts, no re-panel). Full 373k backfill +
Kamatera prod deploy remain Steve-gated and NOT executed this pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
994fedb · 2026-07-28 · parcels: guard negative sale prices — shared sanitizeSalePrice() across king_wa + arcgis
King County WA's EXTR_RPSale.csv carries occasional negative saleprice values
(source data-entry artifacts, -400..-100) that king_wa's num() let through
(it rejected only 0), landing 72 impossible negative prices in
parcel.last_sale_price. New shared src/ingest/parcels/price_guard.ts
sanitizeSalePrice() rejects negative/zero/non-finite amounts (strips currency,
NO upper cap — real >$1B tower sales are legit), wired into king_wa and
arcgis anyPrice (also fixes a latent bug where anyPrice stripped the minus
sign, turning -400 into 400). 18-case self-test passes; tsc clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1e35d6a · 2026-07-28 · parcels: add Yakima County WA (53077) free priced-deed feed
56,030 priced sales from the Yakima County Assessor ArcGIS MapServer
(gis.yakimawa.gov). SQL-Server-backed layer returns fully-qualified
DBO.Parcels.* attribute keys, so outFields/toRecords/orderBy all use the
qualified names. Maps GROSS_SALE_PRICE + SALE_DATE (M/D/YYYY) + EXCISE_NUMBER
+ GRANTOR_NAME + owner (ORG or FIRST/LAST) + situs + use + yrblt + sqft +
beds/baths + summed market land/impvt -> total_value. Verified end-to-end vs
local usre DB (1921 parcels + 1938 sale events w/ doc+grantor+grantee+GIS
deep-links, dates 2005-2026, source registered). tsc clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
f29163c · 2026-07-27 · parcels: add Bexar County TX / San Antonio (48029) — dedicated rich full-universe adapter
BCAD appraisal roll via City-of-San-Antonio open-data BCAD_Parcels FeatureServer
(keyless ArcGIS, PropID>0, outSR=4326 server-side reproject). ~721k parcels:
owner 99%, situs property address parsed to street+city+zip 99%, living-area
sqft 87%, land sqft, state use code, legal acreage. Parcel-detail-only (no
appraised value/year-built/beds-baths/sale feed here) so zero parcel_event rows
- never a fabricated sale. Applies the Wake/Tarrant DTD-B precedent (rich
full-universe ArcGIS -> dedicated *.ts). Registered in engine.ts, documented in
PARCEL-COVERAGE.md. Verified end-to-end vs local usre DB (2-page bounded run:
3996 parcels, owner/city/zip/latlng 100%, sqft populated, 0 events, real SA
centroids, 4 stubs skipped); tsc exit 0; test rows purged. Full 721k backfill +
Kamatera deploy remain Steve-gated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0e3ce56 · 2026-07-27 · parcels: add Tarrant County TX / Fort Worth (48439) — dedicated rich full-universe adapter
715k parcels via City-of-Fort-Worth hosted TAD Parcels_Public_Vview FeatureServer
(keyless ArcGIS, COUNTYNAME='Tarrant' filter). Owner 100%, TRUE market value 99%,
sqft 89%, year-built 90%, deed date 98%. No beds/baths or sale price in the feed —
deed events recorded as event_type='deed' with amount NULL (honest, no fabricated
price). Drops the 12-31-1900 'no deed on record' sentinel (~18k rows). Applies the
Wake/Miami DTD-B precedent (rich full-universe ArcGIS → dedicated *.ts adapter).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0bae506 · 2026-07-27 · parcels: extend deed-date sanity guard to franklin_oh, king_wa, nyc_acris
Prior pass centralized sanitizeEventDate() into the 4 parcel_event deed
ingesters (arcgis_sales, miami_dade, wake_nc, sandiego_ca). But three more
parcel ingesters — franklin_oh, king_wa, nyc_acris — also emit a bare
YYYY-MM-DD sale date into parcel.last_sale_date (and the sales JSON detail)
with no future/absurd-date guard. Route each ingester's single date-parse
helper (toIsoDate/isoDate) through the shared sanitizeEventDate() so a
future/typo/sub-1900 date is dropped before it lands on the parcel row.
Same defect class the arcgis guard was added to stop, closed on the
parcel table for the last three date-bearing ingesters.

cook_il + saltlake_ut set last_sale_date:null (no dates) — safe, untouched.
DB verified clean (0 future, 0 ancient) for these counties: preventive.
tsc --noEmit clean; date_guard 19-case self-test passes. $0 (local).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8934410 · 2026-07-27 · parcels: centralize deed-date sanity guard across all 4 deed ingesters
The future-date guard was a one-off inline check in arcgis_sales.ts; wake_nc
had only a 1971 lower bound and miami_dade/sandiego had no future/absurd-date
guard at all — so a bad-data run against those feeds could re-introduce
impossible parcel_event dates. Add a shared, self-tested sanitizeEventDate()
(rejects future dates, sub-1900, and non-calendar dates like Feb 30) and wire
it into all four deed ingesters at the date-normalization point. Ships a
19-case tsx self-test (no test framework in repo).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
de29c39 · 2026-07-27 · parcels: add Marion County OR / Salem (41047) free priced-deed feed
96,115 priced sales from the Marion County official ArcGIS org
(TaxParcel_Assessment/0): SALEPRICE + INSTDATE deed date + INSTNUM/INSTTYPE
doc metadata + OWNERNAME + SITUS + LIVINGAREA + YEARBUILT + RMVTOTAL.
Config in arcgis_sales.ts, adapter in engine.ts (appended), hourly-loop
job deeds-marion, docs in SOURCES.md. Verified end-to-end against local
usre DB (2000 parcels + 2000 sale events + source registration for 41047);
tsc clean. Local only; prod deploy + full backfill to Kamatera are Steve-gated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
180998f · 2026-07-27 · parcels: add Klamath County OR (41035) free priced-deed feed
New ArcGIS priced-deed source in arcgis_sales.ts + engine.ts adapter +
hourly-loop job (deeds-klam). KC_ParcelSales FeatureServer, 38,796 priced
sales with owner/situs/sqft/beds/baths/yrblt/total-appraised/doc. Verified
end-to-end against local usre DB (1k parcels + 1k sale events + links +
source registration). SOURCES.md documents the feed + the arcgis_sales
config family. TK-16.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
eed29a4 · 2026-07-26 · saltlake: contrarian polish — drop dead EFFBUILT_YR fallback + filter attribute-less ROW ghost parcels
Contrarian gate = SHIP IT (5/5, no data bug). Two latent-risk fixes: (1) year_built now strictly BUILT_YR (eff year stays in extra.eff_year_built) — the ?? EFFBUILT fallback was dead code that would silently mislabel renovation year as built year if it ever fired; (2) skip the ~3,542 attribute-less ROW/easement ghost features (null value+addr+sqft+use) + purged the prior run's ghosts. Rejected the suggested shared upsert.ts value-guard (would break legit value-decrease re-runs). TK-00026.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
b761f11 · 2026-07-26 · parcels: add Salt Lake County UT (49035) — 393k parcels, market value+sqft+year (DTD-B fresh state)
DTD verdict B (broaden hunt after NC/FL dead-ends) -> Utah LIR standardized FeatureServer. 393,521 parcels: 99% MARKET total+land value, 88% sqft, 88% year-built, use/floors/acres/material, 99% address, 100% in-bbox. No owner/sale (UT withholds owner from public LIR). Per-page dedup by source_id (PARCEL_ID non-unique across multi-part polygons). Ticket TK-00026.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d32c870 · 2026-07-26 · wake: optimize bulk-flag UPDATE to pkey join (was 53min JSONB-expr seq-scan on 5M-row prod table)
The bulk-flag UPDATE joined on extra->>'latest_deed' (JSONB, unindexable) — fine locally, but seq-scanned for ~53min on the remote 5M-row parcel table. Now: materialized CTE resolves bulk parcels to source_id, UPDATE joins on the PKEY (county_fips,source_id). Same pattern in miami/franklin adapters is a latent perf risk (deployed OK when table was smaller). TK-00026.
d39bdf3 · 2026-07-26 · wake: contrarian gate fixes — all-zero deed sentinel + pre-1971 epoch date
(1) '000000-00000' null-deed sentinel (govt/ROW parcels, no deed on record) was bulk-flagging 429 parcels + creating 37 junk parcel_event doc_numbers — the in-memory guard caught '-' but not the all-zero form (same class as Miami's placeholder). Both deed guards now use ^[-0]*$ (memory + SQL + event doc_number). (2) epochToISO now rejects sub-1971 near-epoch artifacts. Verified: sentinel 0, junk events 0, bulk 62147->61718. Ticket TK-5.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8699785 · 2026-07-26 · parcels: add Wake County NC (37183) — 437k parcels, richest layer (owner+assessed value+sqft+year+sale)
Authoritative Wake Assessor ArcGIS MapServer (the www data page 404s but the REST service is live+paginated). Dedicated streaming adapter (Miami DTD-B precedent). 437,112 parcels: 100% owner, 96% assessed LAND+BLDG+TOTAL value, 86% sqft, 87% year-built, 78% sale price -> 355k parcel_event rows current to 2024+. First county with assessed value+sqft+year populated. Deed-based in-DB bulk guard: 62,147 assemblage sales flagged. Ticket TK-5.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ffad429 · 2026-07-26 · brokers: add CT broker-side REB roster (fwpc-pgqj) — 16.8k brokers + 4.9k firms
Completes the CT broker thread: ct_dcp had salespersons only (RES). New ct_dcp_reb adapter ingests the Real Estate Broker Licenses roster (21,754 REB credentials) — 16,833 individual brokers + 4,920 brokerage firms (type INDIVIDUAL vs LLC/CORP/PARTNERSHIP split), all with status+city. Separate source so REB.# never collides with RES.#; same canonical-code normalization. $0 SODA CSV.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d409f98 · 2026-07-26 · miami: contrarian gate fixes — placeholder-deed bulk false-positive + ghost sale events
(1) The PA's all-zero '00000-00000' 'no deed on record' placeholder was grouping 12,285 un-recorded parcels into a fake assemblage and bulk-flagging them. Now excluded from latest_deed + bulk SQL (regex ^0+-0+$). Bulk flags 62,745->50,447 (all now real multi-folio deeds). (2) $0 non-arms-length transfers set last_sale_date but were filtered out of parcel_event -> 70,594 parcels with a last_sale_date pointing to a missing event. Now every dated transfer gets an event with doc_type Qualified/Unqualified/Non-Arms-Length (+297,491 events). Ghost rows 70,594->0. (3) Deterministic same-date sort tiebreak by slot. Verified.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7dfbf4f · 2026-07-26 · parcels: add Miami-Dade FL (12086) via keyless ArcGIS PaGis — 937k parcels + 2.06M sales
DTD verdict B (unanimous 5/5): dedicated full-universe adapter over extending the generic sale-cursor one. Streams the Property Appraiser MDC.PaGis layer (memory-safe batch upsert after a first attempt OOM'd holding 943k in RAM). 937,182 parcels: current owner (99.9%), address (95%), zoning (100%), use; up to 3 recorded sales each -> 2,064,976 parcel_event rows w/ price+grantor+grantee+deed+qualified flag, dates current to 2025. Bulk guard: 62,745 multi-folio-deed assemblages detected in-DB -> price nulled + flagged (no ParcelCount field, so deed-spans-multiple-folios is the signal). Top prices verified as real landmark commercial sales (Ponte Gadea, Brickell towers). No assessed value/beds/baths/sqft/year in the public layer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
aa4b31c · 2026-07-26 · franklin: contrarian gate fixes — full-timestamp dedupe + bulk-sale price nulling
(1) Same-date sales: date-only dedupe let a $0 grantor-side transfer (recorded at HH:00:00) beat the real arms-length sale one second later (HH:00:01), yielding wrong owner + null price on ~1289 parcels. Now rank by FULL timestamp, price-desc as secondary tiebreak. Verified 010-001903: FOX/null -> WILLIAMS/$206k. (2) Bulk sales (ParcelCount>1) stamped the full portfolio total on each parcel (1100 impossible >$10M, max $120M). Now null the unallocatable price + flag bulk_sale/bulk_parcel_count in extra (24,116 flagged); 72 legit large-commercial singles retained.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4c2251e · 2026-07-26 · parcels: add Franklin County OH (39049) via .gdb + GDAL — 122k parcels w/ owner/address/sqft/sale
DTD verdict B: rich CAMA lives only in the auditor's 603MB monthly FileGeoDatabase (GDAL-only); polygon shapefile is geometry-only, www data pages WAF-walled. Adapter extracts the TaxParcelSale point layer (dedupe to latest sale/parcel) -> 122,047 parcels: site address (98%), owner=latest grantee (100%), use class, res sqft (85%), last sale date+price (66% arms-length), lat/lng (100% in-county). Honest sale-window label 2020-01..2023-05 in parcel_source. Documented GDAL exception + deploy path in FRANKLIN-RUNBOOK.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c452e2e · 2026-07-26 · ct_dcp: normalize credential code to canonical RES.# source_id (contrarian gate fix)
218 rows carried a legacy Socrata suffix (RES.#.INACTIVE) + 1 digitless RES stub — malformed upsert keys that would silently duplicate if upstream cleaned the field. Strip the suffix at parse, require a digit, delete+reingest. Verified: 96,988 CT rows now 100% canonical shape, 0 collisions with distinct persons.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a74ceb3 · 2026-07-26 · brokers: license_status filter (?status=active) on /api/brokers + Active-only UI toggle on directory
Leverages the CT full-roster upgrade (status now populated on 97k CT + FL/DE/IL brokers) so the directory can show active licensees only. localStorage-persisted, matches existing srvbar controls.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
289894d · 2026-07-24 · fix(sublease): reject non-finite numerics + malformed dates in admin insert
Bad numeric input reached Postgres verbatim: Number('abc')=NaN → term_months (integer) 500s
('invalid input syntax for type integer: NaN'), and sqft/asking_rate/lat/lng (numeric/double)
silently stored literal NaN, poisoning sorts + the map. available_date took any string → date
column 500 on a bad value. Now coerced to null (num/int/isoDate helpers) so bad input degrades
to unset instead of a 500 or a NaN row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
948bf60 · 2026-07-22 · Deepen LA: commercial property-detail page unifying facts + brief + comps + firms
- public/commercial-property.html: click any commercial asset -> full detail page with
  the generated news brief as lede, assessed value breakdown (total/land/improvements),
  building details, last-recorded date, comparable same-type assets in the same city,
  and local LA real-estate firms (from the CA DRE registry). Ties together every layer
  built this session (parcels + briefs + comps + broker intel) into one 'property page'.
- Wired card/marquee/feed/story clicks across the explorer + feed to open it.
- Verified headless: Beverly Center detail renders lede + 6 stats + 12 comps/firms, 0 errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
45be23a · 2026-07-22 · Phase 5: CA DRE broker registry (FREE) + LA broker/firm intel surface
- CA DRE turned out to be FREE (secure.dre.ca.gov/datafile/CurrList.zip, refreshed
  daily) — no purchase needed. New src/ingest/brokers/ca_dre.ts adapter (unzip + CSV,
  Corporation->firm, Broker/Salesperson->broker w/ employing-firm linkage).
  Loaded 382,944 brokers + 34,727 firms in 17s.
- index.ts: added city filter to /api/brokers + /api/firms (LA scoping).
- public/commercial-brokers.html: LA firms ranked by agent count (surfaces CBRE 1,213,
  Newmark, etc. — the major commercial houses), click-to-expand roster, broker search.
  Wired into commercial nav. Verified headless: 200 firms + roster + broker tab, 0 errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
04a19e4 · 2026-07-22 · Phase 4: generated commercial news briefs (local Ollama, $0)
- 006_commercial_briefs.sql + src/ingest/commercial/briefs.ts: local-LLM (qwen2.5)
  generates one factual news-wire sentence per top/recent asset from assessor facts
  only — strict guardrails against invented prices/owners/tenants ('assessed value'
  never called a sale). 220 briefs generated, 0 failed.
- commercial.ts: LEFT JOIN briefs into /marquee + /feed; new /api/commercial/brief/:ain.
- Feed page gains a Featured-Assets story grid + inline briefs on activity items;
  explorer marquee tiles show briefs. Verified headless: 9 stories + 79 item-briefs, 0 errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
613b106 · 2026-07-22 · LA commercial RE layer: taxonomy + materialized 153.9k parcels + explorer & news feed
Repositions the platform toward local commercial real estate news, LA first.
- src/lib/commercial_types.ts: use_desc2 -> canonical taxonomy (office/retail/
  industrial/hospitality/studio/parking/other); Studio broken out for LA media assets.
- 005_commercial.sql + src/ingest/commercial/la_assessor.ts: materialize the LA
  assessor sqlite's 153,923 commercial+industrial parcels into pg commercial_parcel
  (classified, city/zip parsed, indexed; multi-county-ready). LA has assessed value +
  recording date, NO sale price/owner (roll limit) — never fabricated.
- src/server/commercial.ts: /api/commercial/{types,cities,search,feed,marquee,property}.
- public/commercial.html (explorer: marquee + filters + sort + density) and
  public/commercial-feed.html (recent recorded activity, the local news feed).
- Verified headless: 120 cards + 6 marquee + 8 filters / 80 feed items, 0 console errors.
  Marquee surfaces real trophy assets (Beverly Center $995M, Bunker Hill towers).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e3663e8 · 2026-07-21 · NYC ACRIS recorded sales -> PLUTO parcels (188k lots, 5 boroughs, $0 open data)
Extends King-depth recorded sale prices to NYC, the platform's #1 metro — the
'Sale/deed chain from ACRIS pending' gap on all five boroughs is now filled.

- Keyset-streams ACRIS Master (priced deed-family + RPTT transfer docs) and Legals
  (->BBL), joins in memory, single set-based UPDATE onto existing PLUTO lots.
- Single-lot price attribution: document_amt is per-DOCUMENT, so multi-lot/portfolio
  deeds are dropped (killed the $1.5B-on-a-house artifacts); trophy single-lot sales
  (245 Park $1.77B, 424 5th/Amazon $978M) verified real.
- Broad sale doc_type set (DEED family + RPTT&RET/RPTT) fixed Staten Island 1 -> 35,725.
- Idempotent clear-then-apply (no residue across re-runs); retry-hardened SODA client
  (429/5xx + network-timeout backoff, bounded per-request).
- Result: 188,046 lots with recorded sales to 2026-06, 95% clean sale history.
  Condo-unit deeds + buyer/seller (ACRIS Parties) noted as follow-up.

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

File tree

124 files tracked. Click any to browse the source at HEAD.

Other build journals

← Nas Setup  ·  all 4 projects  ·  Naturaltextilewallpaper →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 1ms