Nationalrealestate
Search the build
-
d7eb08c2026-09-25 auto-data-snapshot: 2026-09-25T03:37:11 (1 data files) — data/firm-phone-coverage.json -
e5593f02026-09-24 auto-data-snapshot: 2026-09-24T16:55:40 (1 data files) — data/firm-phone-coverage.json -
111bd3c2026-09-24 auto-data-snapshot: 2026-09-24T04:59:33 (1 data files) — data/firm-phone-coverage.json -
cfe50952026-09-23 auto-data-snapshot: 2026-09-23T16:56:06 (1 data files) — data/firm-phone-coverage.json -
1bbf0dc2026-09-23 auto-data-snapshot: 2026-09-23T04:47:26 (1 data files) — data/firm-phone-coverage.json -
7504ccc2026-09-22 auto-data-snapshot: 2026-09-22T16:42:26 (1 data files) — data/firm-phone-coverage.json -
bbefb9b2026-09-20 auto-data-snapshot: 2026-09-20T03:19:32 (1 data files) — data/firm-phone-coverage.json -
40b0f9a2026-09-19 auto-data-snapshot: 2026-09-19T15:17:08 (1 data files) — data/firm-phone-coverage.json -
d439ad52026-09-19 auto-data-snapshot: 2026-09-19T03:36:55 (1 data files) — data/firm-phone-coverage.json -
f03419d2026-09-18 auto-data-snapshot: 2026-09-18T16:30:11 (1 data files) — data/firm-phone-coverage.json -
70739fd2026-09-18 auto-data-snapshot: 2026-09-18T03:33:53 (1 data files) — data/firm-phone-coverage.json -
3f8f2942026-09-17 auto-data-snapshot: 2026-09-17T15:48:34 (1 data files) — data/firm-phone-coverage.json -
53f1bbc2026-09-17 auto-data-snapshot: 2026-09-17T03:58:38 (1 data files) — data/firm-phone-coverage.json -
b8dd1f72026-09-16 auto-data-snapshot: 2026-09-16T15:43:40 (1 data files) — data/firm-phone-coverage.json -
86ffed02026-09-16 auto-data-snapshot: 2026-09-16T04:07:45 (1 data files) — data/firm-phone-coverage.json -
72f804e2026-09-15 auto-data-snapshot: 2026-09-15T15:48:53 (1 data files) — data/firm-phone-coverage.json -
f411de82026-09-15 auto-data-snapshot: 2026-09-15T03:56:10 (1 data files) — data/firm-phone-coverage.json -
f721e7f2026-09-14 auto-data-snapshot: 2026-09-14T15:41:36 (1 data files) — data/firm-phone-coverage.json -
47bd9ea2026-09-14 auto-data-snapshot: 2026-09-14T03:34:24 (1 data files) — data/firm-phone-coverage.json -
7cd663d2026-09-13 auto-data-snapshot: 2026-09-13T15:25:19 (1 data files) — data/firm-phone-coverage.json -
84ec1d42026-09-13 auto-data-snapshot: 2026-09-13T03:42:21 (1 data files) — data/firm-phone-coverage.json -
fa65e362026-09-12 auto-data-snapshot: 2026-09-12T15:35:41 (1 data files) — data/firm-phone-coverage.json -
3164d962026-09-12 auto-data-snapshot: 2026-09-12T03:53:49 (1 data files) — data/firm-phone-coverage.json -
798d97c2026-09-11 auto-data-snapshot: 2026-09-11T16:23:14 (1 data files) — data/firm-phone-coverage.json -
c66a86f2026-09-11 auto-data-snapshot: 2026-09-11T03:51:39 (1 data files) — data/firm-phone-coverage.json -
ff9c32c2026-09-10 auto-data-snapshot: 2026-09-10T15:54:39 (1 data files) — data/firm-phone-coverage.json -
644425d2026-09-10 auto-data-snapshot: 2026-09-10T03:43:17 (1 data files) — data/firm-phone-coverage.json -
bc29ad52026-09-09 auto-data-snapshot: 2026-09-09T15:36:04 (1 data files) — data/firm-phone-coverage.json -
f6c0c022026-09-09 auto-data-snapshot: 2026-09-09T03:37:19 (1 data files) — data/firm-phone-coverage.json -
97d4b542026-09-08 auto-data-snapshot: 2026-09-08T15:35:04 (1 data files) — data/firm-phone-coverage.json -
b3669a82026-09-08 auto-data-snapshot: 2026-09-08T05:12:15 (1 data files) — data/firm-phone-coverage.json -
852add62026-09-06 auto-data-snapshot: 2026-09-06T03:18:08 (1 data files) — data/firm-phone-coverage.json -
602b2c72026-09-05 auto-data-snapshot: 2026-09-05T15:48:21 (1 data files) — data/firm-phone-coverage.json -
e7a22232026-09-05 auto-data-snapshot: 2026-09-05T03:39:28 (1 data files) — data/firm-phone-coverage.json -
a94d5ce2026-09-04 auto-data-snapshot: 2026-09-04T15:31:50 (1 data files) — data/firm-phone-coverage.json -
53bc05a2026-09-04 auto-data-snapshot: 2026-09-04T03:52:16 (1 data files) — data/firm-phone-coverage.json -
b6424c82026-09-03 auto-data-snapshot: 2026-09-03T15:07:41 (1 data files) — data/firm-phone-coverage.json -
611a2ae2026-09-03 auto-data-snapshot: 2026-09-03T03:29:44 (1 data files) — data/firm-phone-coverage.json -
0aa41a02026-09-02 auto-data-snapshot: 2026-09-02T15:21:07 (1 data files) — data/firm-phone-coverage.json -
091b8ca2026-09-02 auto-data-snapshot: 2026-09-02T03:24:05 (1 data files) — data/firm-phone-coverage.json -
d4a54dd2026-09-01 auto-data-snapshot: 2026-09-01T15:29:45 (1 data files) — data/firm-phone-coverage.json -
80c020f2026-09-01 auto-data-snapshot: 2026-09-01T03:29:10 (1 data files) — data/firm-phone-coverage.json -
2eba1982026-08-31 auto-data-snapshot: 2026-08-31T15:44:48 (1 data files) — data/firm-phone-coverage.json -
8e929e22026-08-31 record TK-10155 production lifecycle proof -
f8df3cd2026-08-31 auto-data-snapshot: 2026-08-31T10:06:07 (1 data files) — data/firm-phone-coverage.json -
130e6b02026-08-30 auto-data-snapshot: 2026-08-30T03:31:23 (1 data files) — data/firm-phone-coverage.json -
d66d8512026-08-29 auto-data-snapshot: 2026-08-29T15:15:52 (1 data files) — data/firm-phone-coverage.json -
5aa54402026-08-29 auto-data-snapshot: 2026-08-29T03:31:35 (1 data files) — data/firm-phone-coverage.json -
23dd8ae2026-08-28 auto-data-snapshot: 2026-08-28T15:48:59 (1 data files) — data/firm-phone-coverage.json -
cd5b8b32026-08-28 auto-data-snapshot: 2026-08-28T03:24:48 (1 data files) — data/firm-phone-coverage.json -
d14f65e2026-08-27 auto-data-snapshot: 2026-08-27T15:43:16 (1 data files) — data/firm-phone-coverage.json -
789aa2f2026-08-27 auto-data-snapshot: 2026-08-27T03:25:19 (1 data files) — data/firm-phone-coverage.json -
357d2002026-08-26 auto-data-snapshot: 2026-08-26T15:16:03 (1 data files) — data/firm-phone-coverage.json -
28f9c562026-08-26 auto-data-snapshot: 2026-08-26T03:25:32 (1 data files) — data/firm-phone-coverage.json -
8f5e0da2026-08-25 auto-data-snapshot: 2026-08-25T15:49:32 (1 data files) — data/firm-phone-coverage.json -
b408a562026-08-25 auto-data-snapshot: 2026-08-25T03:23:00 (1 data files) — data/firm-phone-coverage.json -
ae4eb112026-08-24 TK-10155 (Cody FIX-FIRST): guarantee every listing has >=1 preserved snapshot -
83c8fb22026-08-24 TK-10155: lifecycle self-tests + fix withdrawal-snapshot FK to survive listing deletion -
958bcb32026-08-24 auto-data-snapshot: 2026-08-24T15:30:55 (1 data files) — data/firm-phone-coverage.json -
4572db92026-08-24 chore: v0.22.1 — Snohomish WA (53061) priced-deed feed (session close) -
b4a62452026-08-24 auto-data-snapshot: 2026-08-24T11:12:29 (1 data files) — package-lock.json -
122ebb12026-08-24 chore: v0.22.0 (session close — 3 west-coast priced-deed feeds: josephine 41033, whatcom 53073, snohomish 53061) -
86cb1902026-08-24 Snohomish County WA (53061): add free priced-deed feed (arcgis_sales) — TK-16 -
d7d2c152026-08-24 TK-16: add Josephine County OR (41033) free priced-deed feed -
1326a542026-08-24 Whatcom WA: add situs/owner join + SWDSales2020/2021 history layers (TK-10777) -
17bb4412026-08-24 auto-data-snapshot: 2026-08-24T03:41:17 (1 data files) — data/firm-phone-coverage.json -
01954112026-08-23 auto-data-snapshot: 2026-08-23T15:28:58 (1 data files) — data/firm-phone-coverage.json -
f7944582026-08-23 TK-10687: add DRE enrichment strategy memo -
05583db2026-08-23 TK-10681: add enrich-firms-serp.js — SERP-only residential firm enrichment (no Ollama, JSONL output) -
cd32cb62026-08-23 auto-data-snapshot: 2026-08-23T03:15:26 (1 data files) — data/firm-phone-coverage.json -
8c9721a2026-08-22 auto-data-snapshot: 2026-08-22T15:34:47 (1 data files) — data/firm-phone-coverage.json -
9a3b0b12026-08-22 auto-data-snapshot: 2026-08-22T03:19:29 (1 data files) — data/firm-phone-coverage.json -
b77e37b2026-08-21 auto-data-snapshot: 2026-08-21T15:40:21 (1 data files) — data/firm-phone-coverage.json -
7e7a8032026-08-21 chore: v0.21.0 (session close — Whatcom feed + tsc fix) -
db793c92026-08-21 fix(tsc): broker_website_discovery — verifyAgentSite param license_state (unbreaks repo-wide tsc) -
58652bd2026-08-21 auto-data-snapshot: 2026-08-21T03:25:40 (1 data files) — data/firm-phone-coverage.json -
6c891d02026-08-20 TK-16 pass4: add Whatcom County WA (53073) priced-deed ArcGIS feed (5189 sales) -
e41fdd72026-08-20 auto-data-snapshot: 2026-08-20T15:11:42 (1 data files) — data/firm-phone-coverage.json -
438160a2026-08-20 nav-agent: sync v1.3 (host left-sidebar collapse on load) -
912ab652026-08-20 auto-data-snapshot: 2026-08-20T03:38:46 (1 data files) — data/firm-phone-coverage.json -
fd80fc12026-08-19 auto-data-snapshot: 2026-08-19T15:40:38 (1 data files) — data/firm-phone-coverage.json -
2f184d32026-08-19 nav-agent: List data full-width tight columns (grid) — layout fix -
ab4fd592026-08-19 Refresh nav-agent to v1.2 (adds kv-list compact List view, default-off) -
b4ad42f2026-08-19 chore: v0.20.1 (session close — watchlist toFixed crash fix; lint ✓) -
63d794e2026-08-19 Fix watchlist.html crash: v.toFixed on string values -
95e9e652026-08-19 auto-data-snapshot: 2026-08-19T03:46:07 (1 data files) — data/firm-phone-coverage.json -
3f59bcb2026-08-18 auto-data-snapshot: 2026-08-18T15:36:46 (1 data files) — data/firm-phone-coverage.json -
36ef14f2026-08-18 auto-data-snapshot: 2026-08-18T14:00:27 (1 data files) — data/firm-phone-coverage.json -
48550432026-08-18 usre: CA-area-code guard on firm-phone enrichment (TK-10687) -
88312fc2026-08-18 usre: Tier-1 accurate firm-phone backfill from cre office lines (TK-10687) -
e72841d2026-08-18 usre: harden firm-phone enrichment for accuracy (name-match gate, Bing, dedup) (TK-10687) -
b3eef682026-08-18 auto-data-snapshot: 2026-08-18T13:28:17 (1 data files) — data/firm-phone-coverage.json -
a05bd0f2026-08-18 usre: firm-phone coverage canary + incremental enrichment cron (TK-10687) -
4cd353f2026-08-18 usre: firm-phone-first contact enrichment driver (agents+local model, $0) (TK-10687) -
7d880942026-08-18 usre: resolved broker phone + firm-fallback tier + email/address on the desk (TK-10687) -
24926892026-08-18 chore: v0.20.0 (session close — DRE firm contact card shipped live; refactor deferred, enrich files in-flight) -
65cab772026-08-18 residential enrichment: --asset scoping on free SERP discovery + email crawl reads firm_site.url (chains discovery→email); order both by agent_count DESC for max broker-card leverage (TK-10669) -
de5e83f2026-08-18 firm email crawl: survive stray HTTP/2 session errors (uncaughtException guard) so one remote GOAWAY can't kill the background run (TK-10669) -
5a7ce2a2026-08-18 firm email collection: crawl public contact emails off firm sites into firm_contacts (collect-only, no sending); surface primary email on the card + /api/firms; guard malformed-mailto crash (TK-10669) -
d1ab9822026-08-18 firm API: surface phone/website/street_address in /api/brokers + /api/firms + /api/firm/:id so RENTV/CRCP proxies render the full contact card (TK-10669) -
771e7f82026-08-18 firm directory: capture + surface street address via Places formattedAddress (lever #3, TK-10669) -
d1169172026-08-18 firm directory: capture phone via Places resolve (commercial-scoped) + surface registry phone/website on firm card (TK-10669) -
bdc39ea2026-08-17 snapshot before restart: preserve in-flight work (auto-saved by /restart pre-reboot) -
308483c2026-08-15 auto-data-snapshot: 2026-08-15T15:50:00 (1 data files) — package-lock.json -
33399fa2026-08-15 chore: v0.19.0 (session close — residential desk + server-side sort) -
14507af2026-08-15 usre: safe scoped deploy script (backup+smoke+auto-rollback, no rsync --delete) -
ce733252026-08-15 usre: true server-side sort on /api/brokers + /api/firms (whitelisted ORDER BY name/firm/agents/city, covers ALL rows) + wire desk sort to it (drop client page-sort, reset to page 1 on sort) — TK-10590 cycle 3 -
53f52a82026-08-15 usreal broker desk: honest page-scoped sort labels + roster shows 'first N of TOTAL' + extract shared broker-desk.css (finish the dedupe) — Cody cycle-2 gate fixes (TK-10590) -
e61c69f2026-08-15 usreal: dedupe residential+commercial broker desks into shared broker-desk.js (mode param) + add SORT + DENSITY + real Prev/Next pagination (standing grid rule + Cody gate). commercial-brokers now truly commercial-only (was mislabeled all) (TK-10590 cycle 2) -
5a16e242026-08-15 usreal brokers: honest count (show 'first 200 of N' not full total next to a truncated grid) on residential+commercial desks + firm-detail honors active asset_class filter (Cody gate fixes, TK-10590) -
6e7676c2026-08-15 usreal: surface residential brokers — dedicated /residential-brokers.html desk (forces asset_class=residential) + asset_class filter on brokers.html + nav links (TK-10590, residential-IN counterpart to RENTV commercial-OUT) -
fd663102026-08-14 auto-data-snapshot: 2026-08-14T12:24:03 (2 data files) — data/asc/prod-load-appraisers.sql data/asc/prod-load-appraisers.sql.gz -
fbacac82026-08-14 auto-data-snapshot: 2026-08-14T10:52:23 (1 data files) — data/asc/appraisers_socal.jsonl -
2e5a7a12026-08-14 auto-data-snapshot: 2026-08-14T09:51:27 (4 data files) — data/asc/appraisers_socal.jsonl data/socal_city_market.psv data/socal_zip_market.psv scripts/__pycache__/scrape-asc-appraisers.cpython-314.pyc -
11157a82026-08-14 usre: pull non-concurrent idx_broker_website_todo out of migration 017 into out-of-band CONCURRENTLY build + gate code restart on asset_class column existence (Cody gate, TK-10535) -
3e868e02026-08-13 nav-agent: opt-out listings.html — VERIFIED (Cycle 4) CrcpGrid already provides all grid controls + rebuilds .cg-grid via wholesale innerHTML; nav-agent redundant AND its MutationObserver would fight CrcpGrid re-render. Real reason, not a deferral. TK-10525 -
c232f5f2026-08-13 nav-agent: listings.html is a REAL grid (#cgMain CrcpGrid) — revert opt-out to plain <body> so it reads as tracked NEEDS, not hidden OFF (Cody gate, TK-10525); augment via data-nav-grid after live-data QA in a dedicated cycle -
e48c9352026-08-13 nav-agent: opt-out market.html (charts detail) + listings.html (has own filters) from grid-controls (data-nav-agent=off, TK-10525) — resolves findTarget-miss; listings flagged for deliberate augmentation QA later -
c428bcd2026-08-13 usre: contrarian fixes — brand/keyword/non-broker classifier (Berkadia stays commercial, lenders excluded), runner-safe migration (no BEGIN/COMMIT; indexes+backfill out-of-band), class-gated /api/firm/:id 404, deploy runbook (TK-10535) -
a522adb2026-08-13 usre: add commercial/residential asset_class tag on firm+broker + ?asset_class= API filter (Node A of RENTV-commercial-only, TK-10535) -
5a2f6242026-08-13 chore: gitignore *.bak (prevent tooling backup cruft) [TK-10526] -
e36e0ec2026-08-13 deals/contractors/feed: make every displayed table column sortable -
27b936f2026-08-13 nav-agent: v1.1 merge-mode asset refresh -
7b501532026-08-13 usre: commercial-feed.html Recorded Activity gets grid/list/table views + all-column click-to-sort via ?sort=&order= + full Sort select (view+sort persisted; featured/marquee editorial section unchanged) -
1227b5c2026-08-13 usre: deals.html gets grid/list/table view toggle + every table header click-to-sort via ?sort=&order= + full Sort select (view+sort persisted, drill hrefs preserved) -
cf1e3b22026-08-13 usre: contractors.html gets grid/list/table views + all-column server-side sort (clickable table headers + full Sort select, view+sort persisted) -
846689f2026-08-13 nav-agent: add universal grid-controls drop-in (field-toggle panel + sort/group/density + movable/removable/expandable panels) to all internal grid pages -
16ce66f2026-08-13 usre: add ?sort=&order= column whitelist to /api/deals, /api/commercial/search+feed, /api/contractors (SQL-injection-safe, defaults preserved) -
f8207802026-08-12 auto-data-snapshot: 2026-08-12T15:01:25 (1 data files) — package-lock.json -
41dc5ca2026-08-12 chore: usre deploy-script fixes + v0.18.1 (session close, TK-10488) -
986b8c82026-08-12 usre /api/brokers: return broker_email + firm-level phone/email (firm_contacts fallback) -
5ddf9202026-08-12 usre /api/brokers: default to affiliated-only (agent must have a firm/broker); ?unaffiliated=1 opts into full registry -
be069fc2026-08-12 usre: pm2 ecosystem runs 'node --import tsx' directly (orphan-proof) -
095c0c22026-08-12 scripts: safe usre contractor code deploy (backup+smoke+rollback; scoped cred via runtime env) (TK-10488) -
ac613832026-08-12 usre: scoped Basic-auth credential for the shareable Contractors browse page -
ca8f5562026-08-12 ca_contractors: recon script + v0.18.0 (session close, TK-10488) -
6d30f1f2026-08-12 scripts: Kamatera contractor data-load + deploy runbook (TK-10488) — transfer/migrate/load/verify + phase-2 deploy guards -
2f6c9cd2026-08-12 contractors API: default license_status filter to CLEAR (CSLB good-standing) -
0ef7a6b2026-08-12 ca_contractors: date-everything provenance (source_as_of, cslb_last_update) + auto updated_at trigger (TK-10488) -
c9daafc2026-08-12 usre: shared CSLB contractor API (search/detail/match) + internal browse surface -
1bdb0d92026-08-12 ca_contractors: CSLB licensed-contractor registry schema (TK-10488) — shared coordination layer for the RE builds -
504ae662026-08-12 usre deals: facet deselect uses undefined (not null) to match go()/rm/clear — one unset sentinel, refactor-safe (TK-10482 SHOULD-FIX) -
26fa1e52026-08-12 usre: deals.html feed grid with full href-drill + /deal/:id clean route + fleet nav (TK-10482) -
41cb3602026-08-12 usre: add commercial deals feed + per-deal detail API over recent_commercial_deals view (TK-10482) -
fcf4fb92026-08-11 TK-5: fix Hennepin assemblage guard to be prod-scale safe (ANALYZE + PK-driven) -
c112f072026-08-11 TK-5: add 2 metro parcel adapters — Hennepin MN (Minneapolis), Detroit MI -
709c1822026-08-10 TK-5: add 4 metro parcel adapters — Dallas TX, Harris TX, Clark NV, Philadelphia PA -
9a7dd5f2026-08-10 auto-data-snapshot: 2026-08-10T21:49:05 (1 data files) — PARCEL-COVERAGE.md -
cd7be342026-08-10 auto-data-snapshot: 2026-08-10T21:18:09 (1 data files) — package-lock.json -
956d7192026-08-10 feat: Parcel Explorer national coverage overview map + lint/refactor, v0.17.0 (session close) -
d6f64ff2026-08-10 TK-16: add Parcel Explorer web viewer (/parcels.html + /api/parcels) -
834684a2026-08-10 TK-16: add CA Ring 5 — Napa + Contra Costa + El Dorado + Nevada + Tulare — pass 11 -
dcae6a52026-08-10 TK-16: add CA Ring 4 — Solano (06095) + Butte (06007) + Sacramento (06067) + Stanislaus (06099) — pass 10 -
d5492812026-08-10 TK-16: add CA Ring 3 — San Joaquin (06077) + Fresno (06019) + Monterey (06053) — pass 9 -
abd259f2026-08-10 auto-data-snapshot: 2026-08-10T16:09:17 (1 data files) — SOURCES.md -
25d85092026-08-10 TK-16: add next CA ring — Santa Barbara (06083) + Imperial (06025) + San Bernardino (06071) — pass 8 -
0386ff52026-08-10 TK-16: add Ventura County CA (06111) situs-address coverage — pass 7, completes LA-adjacent ring -
9af39112026-08-10 TK-16: add Orange County CA (06059) parcel coverage + centroid lat/lng flag — pass 6, CA sweep begins -
04c5f482026-08-10 TK-16: add Jackson County OR (41029) priced-deed feed + curl fetch fallback — 5th arcgis_sales pass -
d503d962026-08-10 TK-16: add Lane County OR (41039) free priced-deed feed — 4th arcgis_sales pass -
f1b35402026-08-06 usre render: every agent shows firm tie + phone/firm-site/agent-own-site (or $0 on-demand find); /api/brokers returns contact fields; POST /api/broker/:id/discover lazy path; firm-less agents now expand -
52035aa2026-08-06 usre: on-demand discoverOne returns graceful throttled status, never records false no_url on cooldown -
cacffea2026-08-06 usre: agent(broker) own-site discovery — $0 free-SERP + local qwen3:14b identity gate, priority batch + on-demand single-agent mode (broker.website cols, migration 017) -
aeba0052026-08-03 usre: loud+identifiable log on first-see lifecycle failure (explains ingest listing_count vs new-event off-by-one; sweep is the safety net) (TK-10155) -
3709d7d2026-08-03 usre: coverage-gate the full-rescan marker — downgrade to 'partial' when a 'full' adapter covers <50% of known listings, so a truncated rescan can't fabricate withdrawals (Cody Cycle-2 gate) (TK-10155) -
37575d82026-08-02 TK-10155 fix4: backfill writes ONE snapshot per listing (baseline only) — add recordLifecycle suppressSnapshot opt, de-dup the 427 duplicate 'new' backfill snapshots (1026 to 599), respect fix-1 rescan guard in backfill -
d8955b62026-08-02 TK-10155 fix2: wire listings ingest + lifecycle sweep into existing refresh_all.ts cadence (monthly, non-fatal, guarded) — no new launchd job (daily upgrade drafted separately) -
fdb639e2026-08-02 TK-10155 fix1: guard gone-from-feed withdrawal behind a per-source full-rescan signal (migration 015 source_ingest_run) — incremental-only sources (ColdwellBanker new-day sitemap) no longer fabricate withdrawals for live listings -
6193a682026-08-02 TK-10155: listings.html — color-coded lifecycle state chip + state filter/facet + withdrawn (preserved) snapshot view -
a7cc0b62026-08-02 TK-10155: listing lifecycle detector + sweep + backfill + ingest first-see hook + lifecycle/withdrawn API (migration 014) -
39e9dbe2026-08-02 TK-10139: canonical address_key normalizer (strip trailing state/zip), honest commercial BOR empty-state -
53836d22026-08-02 TK-10139: fix recorder change-detection — pg returns BIGINT ids as strings; compare id fields as strings so unchanged broker/firm no-ops instead of re-inserting -
e24220d2026-08-02 TK-10139: surface Last Broker/Firm of Record — card on commercial-property.html + optional columns/facet on listings.html -
90264712026-08-02 TK-10139: expose last_broker_of_record + last_firm_of_record (+observed_at) on /api/commercial/property/:ain and /api/listings -
cd763bf2026-08-02 TK-10139: broker-of-record history — append-only table + last_broker_of_record view + recorder + listing-ingest hook + backfill (584 rows seeded) -
49158f62026-08-01 TK-5: add san-diego-sandag and santa-clara to hourly loop rotation — both were in engine but not scheduled -
b435d6d2026-08-01 TK-16: add CENTER_LAT/CENTER_LON to la-county adapter — fills lat/lng for 2.37M parcels -
498df4a2026-07-31 listings.html: load col-resize.js for parity with markets/brokers -
3dfd37e2026-07-31 Fix column resize on markets/brokers grids (adjust column not working) -
06c2d3a2026-07-31 Add recent_commercial_deals view — closed commercial deals feed (classified commercial parcels x sale events, >250k, 18mo) for the RENTV news pipeline. Surfaces $100M+ deals (Brickell offices, Collins Ave hotels) -
ed1e6972026-07-31 Add Alameda CA/Oakland (1460, descriptive) + Oregon counties (1273, COM/IND codes) commercial. Commercial now 20 counties/510145. Free-from-loaded-parcels coverage largely exhausted -
0cfcfdb2026-07-31 Add Fulton GA/Atlanta commercial (15178) via authoritative Fulton Assessor LUC code->label map (231 codes, data/fulton-luc.json) + classifyCommercialByDesc. Full subtype split verified plausible -
8a5be2f2026-07-31 Add Miami-Dade FL (60721) + Franklin OH (5665) commercial via from_parcel — both descriptive use_desc with rich subtypes (office/retail/industrial/hospitality/parking). Verified plausible metro splits -
2ebcbf42026-07-31 Add Texas (Bexar+Tarrant, 49768) via authoritative Comptroller F1=commercial/F2=industrial + re-enable Cook (Chicago, 95892) now that classifier handles 'Commercial — Class NNN' descriptive prefix (plausible split, resolved the old 100%-industrial skew) -
92af9db2026-07-31 Extend NYC commercial to all 5 boroughs (41511 total: Manhattan/Brooklyn/Queens/Bronx/SI) via the authoritative building-class map — plausible citywide retail/industrial/office split -
b53f2312026-07-31 Add NYC Manhattan commercial (6131) via authoritative NYC DOF building-class letter map (O=office,K=retail,E/F=industrial,H=hotel) + reusable ingestCommercialFromParcelCoded for coded counties. Verified: office+retail heavy split matches real Manhattan. 6th commercial county -
275ff1e2026-07-30 Add Wake County NC commercial (3764, Raleigh) via safe word-boundary abbreviation patterns (OFC->office, WHSE/WAREHSE->industrial) + from_parcel keyword extension. Verified plausible office-heavy split. 5th commercial county -
36c7c422026-07-30 Add Maricopa (Phoenix) bulk loader — free assessor st42060 fixed-width extract carries PROPERTY USE CODE (public ArcGIS had none). Maps authoritative PUC 2-digit prefix->descriptive label (PUC manual) so from_parcel classifies. Proven on sample (PUC 01->Single Family Residential); unknown prefixes safely skipped -
6ad5d702026-07-30 Add San Diego full (SANDAG 1.09M): authoritative ASR_ZONE->label map (data dictionary) makes coded use descriptive -> from_parcel classifies. SD commercial verified plausible (commercial+industrial mix, not Cook-skew). +commercial keyword in from_parcel pre-filter -
b3ca8a12026-07-30 Commercial from_parcel: add bare-'Commercial' fallback classifier + Salt Lake County (13199 commercial, plausible office/industrial/retail split). Verified+rejected Cook/NY/TX (class-code use_desc, not descriptive — needs code-map; Cook came back 100%% industrial) -
d55600a2026-07-30 Add classifyCommercialByDesc + from_parcel materializer: extract commercial_parcel from ALREADY-LOADED parcels (descriptive use_desc) — $0, no new source. King County Seattle: 18352 commercial parcels. Pattern extends to Cook/NY/Wake/etc -
1c2a95f2026-07-30 Add Santa Clara County CA parcel source (493k, San Jose) — 2nd West Coast county via config-only extension. Public layer is address+APN only (no value/use — most CA counties expose only this; LA's full roll is an outlier) -
92ca7422026-07-30 Generalize commercial ETL for multi-county (Cody prereq): per-config mapRow/where/outFields, case-insensitive UseType normalization + optional useTypeMap, digits-only ain, pageSize<=maxRecordCount baked in. LA unregressed -
ba1528f2026-07-30 Fix commercial ETL APN normalization: strip non-digits so ArcGIS '2005-002-016' matches sqlite key '2005002016' — was duplicating every LA commercial parcel (153923->306830). Cleaned dashed dupes -
0b136602026-07-30 Add live ArcGIS commercial ETL (arcgis_commercial la-arcgis) — West-Coast successor to stale LA sqlite; UseType-gated, classifyCommercial-typed, cursor-resumable, reusable per county. LA 152910 commercial parcels -
a77a6872026-07-30 auto-save: 2026-07-30T19:50:45 (2 files) — src/ingest/parcels/arcgis_sales.ts src/jobs/hourly_loop.ts -
a5c9eb52026-07-30 Add LA County CA parcel source (arcgis_sales la-county, 2.37M parcels — largest US county, West Coast); cursor-paginating. Residential coverage: CA 3->4 counties incl LA -
77583bc2026-07-30 Fix parcel upsert crash on within-batch duplicate (county_fips,source_id) — dedup last-wins before INSERT ON CONFLICT; unblocks bexar/tarrant/fulton (was zero TX/GA coverage). Bexar: 0->302k parcels -
1bf4cc42026-07-30 Add Weichert listings adapter (3rd homes source) + fix extractJsonLd for unquoted ld+json (helps all adapters) + resolveRegionByZip fallback so geo-less listings get county-attributed via postalCode -
7241fde2026-07-30 resolver: confidence-tier matches — only set firm.website when host echoes the name; loose matches recorded as low_confidence leads (audited ~30% loose), don't overwrite website with a maybe-wrong site -
08465412026-07-30 Add Places-API firm->website resolver (resolve:firms): reliable structured alternative to anti-bot-blocked discover; agent_count-prioritized, quota-capped, resumable over all 90k firms, fail-soft. Live-proven 90/100 resolved $0 -
b5698552026-07-30 discover: mark run 'failed' when every firm errored (ok iff queried >=1) so assess() quarantines a truly-blocked job instead of masking it as ok -
03215462026-07-30 discover: fail-soft run recording (try/catch closeRun) so search-anti-bot errors don't leave zombie 'running' rows that hog the consumer slot -
908d6032026-07-30 Loop: reserve >=1 slot/tick for fast-consumer streams (homes/businesses/firm) so parcel backfills stop starving them (USRE_CONSUMER_SLOTS, default 1) -
82774fe2026-07-30 Make listings CAP env-tunable (USRE_LISTINGS_CAP, default 100) to grow homes from compliant adapters -
153944d2026-07-30 Fix places-seed pickMetro CTE scope bug (r.name->name); unblocks 106-failure loop stall -
1dbfb572026-07-30 auto-save: 2026-07-30T09:16:33 (3 files) — cap_viewport.cjs herocap.cjs livetest.cjs -
e0d59e02026-07-30 auto-save: 2026-07-30T08:16:08 (4 files) — cap_mobile.cjs cap_search2.cjs cap_search3.cjs cap_webkit.cjs -
a4533732026-07-30 auto-save: 2026-07-30T07:45:45 (1 files) — cap_search.cjs -
6ba57b92026-07-29 docs: update PARCEL-COVERAGE.md — 28 counties / 6.6M parcels, 11 states, west-coast pipeline (TK-5/TK-16) -
c7831952026-07-28 chore: version bump v0.16.1 (session close — nyc_pluto 08P01 fix) -
f6fb5272026-07-28 parcels: fix nyc_pluto 08P01 — provenance added 4 cols (19→23), drop chunk 3000→2500 to stay under PG 65535 bind-param cap -
23c88a62026-07-28 feat: RENTV data feed over usre DB (:9796) — brokers/firms/commercial parcels/subleases/regions -
6ff7a812026-07-28 TK-50: field-level provenance across ALL remaining parcel ingesters -
536b4082026-07-28 parcels: field-level data provenance — source every parcel field to (feed + attr + time + raw) -
1c333932026-07-28 parcels: guard null/placeholder/junk owner names — shared sanitizeOwnerName() at upsert chokepoint -
f01d7502026-07-28 parcels: add Fulton County GA / Atlanta (13121) — dedicated rich full-universe adapter -
994fedb2026-07-28 parcels: guard negative sale prices — shared sanitizeSalePrice() across king_wa + arcgis -
1e35d6a2026-07-28 parcels: add Yakima County WA (53077) free priced-deed feed -
f29163c2026-07-27 parcels: add Bexar County TX / San Antonio (48029) — dedicated rich full-universe adapter -
0e3ce562026-07-27 parcels: add Tarrant County TX / Fort Worth (48439) — dedicated rich full-universe adapter -
0bae5062026-07-27 parcels: extend deed-date sanity guard to franklin_oh, king_wa, nyc_acris -
89344102026-07-27 parcels: centralize deed-date sanity guard across all 4 deed ingesters -
de29c392026-07-27 parcels: add Marion County OR / Salem (41047) free priced-deed feed -
180998f2026-07-27 parcels: add Klamath County OR (41035) free priced-deed feed -
1499f0f2026-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) -
9ab361e2026-07-26 USRE geo-search: recent searches (localStorage) shown on empty focus + clear (v0.15.0) -
7c0710f2026-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) -
e08091b2026-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) -
0a3f34d2026-07-26 USRE: top location search (county/city/state) — /api/geo-search + typeahead pill on the Map, jumps to market page (v0.12.0) -
c5b668f2026-07-26 USRE Map: URL-shareable county filters + on-map Copy link (parity with grid) (v0.11.0) -
c246a3b2026-07-26 USRE grid: URL-shareable filters — sync filters/search/sort to query string + Copy link button (bookmarkable views) (v0.10.0) -
b9110d82026-07-26 USRE Map: on-map active-filter indicator (count + reset) so filtered state is legible with the drawer closed (v0.9.1) -
bb399232026-07-26 USRE Map: persist county filters to localStorage + active-filter chips (harmonize w/ grid) (v0.9.0) -
eed29a42026-07-26 saltlake: contrarian polish — drop dead EFFBUILT_YR fallback + filter attribute-less ROW ghost parcels -
afd616a2026-07-26 auto-save: 2026-07-26T20:15:38 (1 files) — _vpmf.mjs -
b761f112026-07-26 parcels: add Salt Lake County UT (49035) — 393k parcels, market value+sqft+year (DTD-B fresh state) -
27ca2072026-07-26 USRE Map: left-rail county data-point filters in the drawer — dim counties by metric ranges + live match count (v0.8.0) -
46b0b582026-07-26 USRE grid: polished empty state — icon + message + one-click Clear all filters CTA (v0.7.1) -
966b6282026-07-26 USRE grid: CSV export honors active filters — export filtered+sorted rows client-side (was dumping ALL rows) (v0.7.0) -
6e08a2b2026-07-26 auto-save: 2026-07-26T17:14:46 (2 files) — src/ingest/parcels/engine.ts src/ingest/parcels/saltlake_ut.ts -
d9054bf2026-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) -
02bd28c2026-07-26 auto-save: 2026-07-26T16:44:36 (2 files) — public/crcp-grid.css public/crcp-grid.js -
6924dcd2026-07-26 USRE nav: render one canonical nav across all pages via nav-drawer.js (fixes drift; active-by-URL) v0.5.1 -
9ca69072026-07-26 Refine: add situs addresses to Sonoma/Maricopa/Thurston deed feeds + global future-date guard (dropped 39 bad-entry future sales) -
55b0bc62026-07-26 USRE grid: active-filter summary bar + one-click clear-all; rail now renders from filter state (v0.5.0) -
5f9ea952026-07-26 chore: v0.3.0 → v0.4.0 (session close — all-data-point filters + hamburger nav) -
45f04ac2026-07-26 Add Palm Beach FL deed adapter (complements parallel session's Miami-Dade); FL scout findings logged -
896ac962026-07-26 USRE: collapse topbar into an upper-left hamburger drawer site-wide (shared nav-drawer.{css,js}) + clearance for grid/content pages -
3d800352026-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 -
4d662232026-07-26 USRE Markets: left-rail filters now cover ALL data points (derived from FIELDS) -
d32c8702026-07-26 wake: optimize bulk-flag UPDATE to pkey join (was 53min JSONB-expr seq-scan on 5M-row prod table) -
9a14bfd2026-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 -
467ca962026-07-26 Add King County WA (2.4M full-history deeds) to loop on weekly cadence -
d39bdf32026-07-26 wake: contrarian gate fixes — all-zero deed sentinel + pre-1971 epoch date -
86997852026-07-26 parcels: add Wake County NC (37183) — 437k parcels, richest layer (owner+assessed value+sqft+year+sale) -
4118d042026-07-26 parcel coverage: record Broward (WAF) + Palm Beach (cached-only) FL dead-ends for next pass -
ffad4292026-07-26 brokers: add CT broker-side REB roster (fwpc-pgqj) — 16.8k brokers + 4.9k firms -
d409f982026-07-26 miami: contrarian gate fixes — placeholder-deed bulk false-positive + ghost sale events -
7dfbf4f2026-07-26 parcels: add Miami-Dade FL (12086) via keyless ArcGIS PaGis — 937k parcels + 2.06M sales -
9305f092026-07-26 auto-save: 2026-07-26T09:42:34 (2 files) — src/ingest/parcels/engine.ts src/ingest/parcels/miami_dade.ts -
aa4b31c2026-07-26 franklin: contrarian gate fixes — full-timestamp dedupe + bulk-sale price nulling -
4c2251e2026-07-26 parcels: add Franklin County OH (39049) via .gdb + GDAL — 122k parcels w/ owner/address/sqft/sale -
32c86462026-07-26 Deschutes pageSize=1000 (server page cap) so pagination continues -
9a64e4e2026-07-26 Add Deschutes County OR deed adapter (real grantor/grantee NAMES + price, two sales/parcel) -
90f2a672026-07-26 Spokane: per-source pageSize=500 (slow MapServer); all 3 deed adapters working -
a3e41692026-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 -
c452e2e2026-07-26 ct_dcp: normalize credential code to canonical RES.# source_id (contrarian gate fix) -
a74ceb32026-07-26 brokers: license_status filter (?status=active) on /api/brokers + Active-only UI toggle on directory -
4b82a3d2026-07-26 auto-save: 2026-07-26T08:11:40 (1 files) — src/server/index.ts -
9c0ce402026-07-26 Parcel coverage: 2026-07-26 re-probe intel (Franklin OH shp-dep, Wake drift, Miami off-Socrata) -
61b8b5c2026-07-26 CT broker upgrade: full DCP salesperson roster (eqtn-rppv), 18k->97k w/ status+city+firm linkage -
9e65b772026-07-26 Self-correct: gate silent-break detection behind stableVolume flag (paging/rotating jobs have variable counts, don't false-degrade) -
854bc7a2026-07-26 Generalize SD adapter Poway->county-wide sweep (1.09M parcels, per-scope cursor, per-parcel city); loop sweeps county -
f1950282026-07-26 Property page: render deed events + public-record links (deep vs search-portal) -
bb6c7e82026-07-26 Contrarian fixes: honest public-record links (deep vs search), no future years, baths/beds guards, forward-cursor resumability, history completeness flags -
a2c4ea62026-07-26 Poway property-history pilot: SanGIS parcels + deed events + public-record links + property-page surfacing -
aa800ba2026-07-26 Per-state broker health + West-Coast-first geographic Places sweep + coverage board -
33b14682026-07-26 Add /health engine status board + /api/ingest-health route -
7ced2c22026-07-25 Self-correcting engine: health-aware loop (backoff, quarantine+probe, silent-break detection, per-source baseline) -
2b38f612026-07-25 auto-save: 2026-07-25T13:36:34 (2 files) — db/migrations/009_source_health.sql src/jobs/self_correct.ts -
8b310832026-07-25 Add hourly self-balancing ingest loop + Google Places discovery seed (free-tier capped) -
289894d2026-07-24 fix(sublease): reject non-finite numerics + malformed dates in admin insert -
d7819af2026-07-23 auth: add Scott login -
8f27ada2026-07-23 auth: add Boomer login (rentfree911) -
2d8dfbe2026-07-23 auth: support multiple Basic-Auth users (add Daniel), keep admin + env override -
dc6baf02026-07-22 chore: harden sublease.ts (enum allowlists on status/lease_type/rate_period, status-aware total count), v0.2.0 (session close) -
aa180e32026-07-22 add sublease inventory: table + /api/sublease GET + gated admin POST/DELETE -
253038d2026-07-22 Add /api/commercial/digest — one-shot marquee+briefs/recent/firms payload for RENTV syndication -
17cdf502026-07-22 refresh-commercial: gate briefs on explicit REFRESH_BRIEFS=1 (deterministic; prod cron skips) -
701cb102026-07-22 refresh-commercial: gate briefs on actual model name (prod has empty ollama, must skip) -
f5468f12026-07-22 Fix refresh-commercial Ollama check: curl -sf + grep models (prod :11434 404 no longer triggers briefs) -
2bfd4ff2026-07-22 Add refresh-commercial.sh — daily refresh of CA DRE registry + LA commercial data -
948bf602026-07-22 Deepen LA: commercial property-detail page unifying facts + brief + comps + firms -
45be23a2026-07-22 Phase 5: CA DRE broker registry (FREE) + LA broker/firm intel surface -
04a19e42026-07-22 Phase 4: generated commercial news briefs (local Ollama, $0) -
5de9ab32026-07-22 auto-save: 2026-07-22T07:12:00 (1 files) — db/migrations/006_commercial_briefs.sql -
0b1ee1d2026-07-22 Wire Commercial into main site nav across all pages (discoverability) -
613b1062026-07-22 LA commercial RE layer: taxonomy + materialized 153.9k parcels + explorer & news feed -
e3663e82026-07-21 NYC ACRIS recorded sales -> PLUTO parcels (188k lots, 5 boroughs, $0 open data) -
14c95a82026-07-21 auto-save: 2026-07-21T19:09:20 (2 files) — src/ingest/parcels/nyc_acris.ts src/server/property.ts -
4ade9ca2026-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 -
5a71ca72026-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 -
6b556942026-07-21 README: real coverage (5.78M parcels/8 counties, 1.5M brokers/7 states, firm crawl, King deed sales, /sources.html) -
9acf65d2026-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 -
7b17d352026-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) -
841ad6f2026-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 -
a8083412026-07-21 Consolidate agent M-P2/wave-2 work: Cook IL parcel adapter, parcel + broker coverage matrices -
93eff112026-07-21 Broker wave-2: DE DPR adapter ingested (29,895 brokers + 997 firms via data.delaware.gov SODA), IL IDFPR adapter added -
1c7f8512026-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/ -
2d46b432026-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 -
da797f62026-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) -
a4352372026-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/ -
58c461c2026-07-21 CSV export on rankings (/api/markets.csv, type-synced download button) — analyst data pull -
ae4b4202026-07-21 States tab on rankings (51 states, raw metrics), national insight strip on map (median home value, % counties rising, median DOM), index favicon -
fabf9ec2026-07-21 auto-save: 2026-07-21T15:38:16 (1 files) — src/jobs/broker_rotate.ts -
511984e2026-07-21 Perf: 5-min in-process cache on /api/markets (1.8s scan -> ms on warm hits) -
db8222e2026-07-21 Market detail: Climate Risk (FEMA NRI) + Rental Market (HUD FMR + ZORI vs FMR note) panels; favicons across pages; README -
502de062026-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 -
dd7b0022026-07-21 Map page: Top Markets strip (top-8 ranked, clickable to detail) + Brokers nav link -
bf3451d2026-07-21 auto-save: 2026-07-21T14:38:01 (1 files) — src/enrich/firm_website_discovery.ts -
12bd5ee2026-07-21 CBSA crosswalk backfill: 1915 counties get cbsa_code from Census delineation file (fixes null metro on property Location panel) -
d86921e2026-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 -
31f2bbc2026-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 -
d8824b42026-07-21 CCK#2 verified fixes: HTML-escape admin provenance fields, guard localStorage (Safari private) -
731695f2026-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 -
a7a865e2026-07-21 M5 complete: watchlist/alerts/admin routes mounted and verified live (watchlist CRUD, alerts feed, provenance cards, run-now) -
1af53fa2026-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 -
439b0e12026-07-21 M5: watchlist/alerts/admin routes as mountable module (2-line wire after broker-track merge) -
f42ca122026-07-21 M5 (partial): refresh orchestrator, alerts checker, monthly launchd plist, watchlist + admin pages (server endpoints pending broker-agent merge) -
c188ec32026-07-21 CCK review fixes: legacy CT counties seeded (CT choropleth hole closed), mojibake metro overrides, unmatched-collector dedupe, migrate.ts txn constraint doc -
effc2fd2026-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) -
aae13b52026-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 -
509b9f82026-07-21 M2: Zillow ZHVI/ZORI + Redfin tracker ingests (1.19M rows), crosswalk w/ overrides, dark Leaflet county choropleth -
3859e632026-07-21 M1 complete: usre DB migrated, 3222 counties + 935 metros + 51 states seeded, server :9913 verified (healthz open, auth gate, region counts) -
cb1009c2026-07-21 initial scaffold: TS+Express+pg, schema v1 (regions/metrics/scores/broker-track/listings), regions seeder, server :9913
Authors
- Steve248
- auto-commit-fleet79
- steve9
Agents used
Skills used
- /firm-phone-coverage71
- /parcels23
- /ingest17
- /brokers15
- /lng13
- /server11
- /contractors11
- /commercial11
- /firm9
- /feed9
- /firms8
- /property8
- /baths7
- /city6
- /sqft6
- /engine4
- /jobs4
- /index4
- /asc4
- /markets4
- /sale4
- /zip4
- /beds4
- /listings4
- /snapshot3
- /owner3
- /address3
- /list3
- /table3
- /marquee3
Creative ideas + design notes
ae4eb11 · 2026-08-24 · TK-10155 (Cody FIX-FIRST): guarantee every listing has >=1 preserved snapshot
Cody's contrarian panel returned FIX FIRST on the top surviving hole: a listing whose first-see snapshot hook FAILED (caught+logged) and that then derives straight to 'active' (first_seen already > NEW_DAYS, so it skips 'new') sits in the table with NO snapshot at all. 'active' is deliberately not a SNAPSHOT_STATE, so recordLifecycle never captures one. The 'data survives after the listing vanishes' promise then rested on 'nothing ever deletes a listing' (true today — no DELETE FROM listing exists in the pipeline) rather than on the design. The day a prune job lands, that listing's data would be lost (ON DELETE SET NULL just nulls an event row pointing at nothing). Fix — make preservation a design property: - export ensureBaselineSnapshot(db, listing): cheap NOT-EXISTS guard that captures ONE 'baseline' snapshot iff the listing has zero snapshots; idempotent, append-only, no-op otherwise. - sweep calls it for every listing → every listing is guaranteed >=1 snapshot before it can ever leave the table; reports 'baseline snapshots backfilled' count. - dbtest: reproduce the exact gap (active listing, event but no snapshot) and assert ensureBaselineSnapshot rescues it + is idempotent. Verified on live local usre: 796 listings / 796 distinct snapshotted / 0 without a snapshot; sweep backfilled 0 (steady-state no-op). tsc clean, both self-tests PASS. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
83c8fb2 · 2026-08-24 · TK-10155: lifecycle self-tests + fix withdrawal-snapshot FK to survive listing deletion
- add src/server/listing-lifecycle.selftest.ts: pure DB-free unit test of classifyState (every state branch, the fix-1 false-withdrawal guard, status-string precedence) + recordLifecycle transitions/snapshot logic driven by an in-memory fake db. npm run test:lifecycle. - add src/server/listing-lifecycle.dbtest.ts: end-to-end withdrawal-snapshot self-test on the real schema (house provenance-selftest pattern: synthetic source, assert, purge). Proves a withdrawn listing preserves a full snapshot AND that the snapshot still reconstructs the listing after the listing row is DELETED. npm run test:lifecycle:db. - migration 023: change listing_lifecycle_event/listing_snapshot listing_id FKs from the shipped NO ACTION to ON DELETE SET NULL. Migration 014 called these columns 'nullable: a listing may vanish/be deleted' but the FKs BLOCKED that delete (error 23503) — so the 'data survives after the listing vanishes' promise could not hold. SET NULL keeps every event/snapshot (source/source_id/address_key/snapshot JSONB intact), only nulling listing_id. - applied 023 to the LOCAL usre dev DB (reversible: re-add FK as NO ACTION). Kamatera-canonical prod apply is drafted to pending-approval, NOT run here. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86cb190 · 2026-08-24 · Snohomish County WA (53061): add free priced-deed feed (arcgis_sales) — TK-16
ArcGIS Online Recent_Property_Sales FeatureServer (keyless). 17,171 priced sales of 21,734. Mon-YYYY date parse via local snoDate() (shared anyDate untouched); comma-string SALE_PRICE via anyPrice; polygon->centroid latlng. OBJECTID in outFields for stable resultOffset paging (contrarian-flagged). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d7d2c15 · 2026-08-24 · TK-16: add Josephine County OR (41033) free priced-deed feed
Rich clean-key ArcGIS Assessor_Taxlots feed: 30,140 priced sales w/ SALE_PRICE +SALE_DATE+DEED_TYPE+INST_NO(doc)+situs+owner+RMV value+YR_BLT/SQ_FT/BEDRMS+ explicit Latitude/Longitude (no geometry download). Config in arcgis_sales.ts, adapter appended in engine.ts, deeds-josephine loop job (3h), SOURCES.md. Verified local usre: 5,997 parcels/5,993 events (all doc#, 19 deed types, 1970-2026, $1.5k-$46.9M). tsc 0 errors. Prod deploy + backfill Steve-gated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1326a54 · 2026-08-24 · Whatcom WA: add situs/owner join + SWDSales2020/2021 history layers (TK-10777)
- scripts/enrich-whatcom-situs.mjs: batch POSTs to WhatcomCo_Property (geo_id join), fills address/city/owner_name/use_desc for all 5157 Whatcom parcels (4480 enriched) - src/ingest/parcels/arcgis_sales.ts: add whatcom-2021 (layer /1) + whatcom-2020 (layer /0) history source configs with history:true flag; add upsertParcelHistory import - src/ingest/parcels/upsert.ts: add upsertParcelHistory() — COALESCE fill + date-guard on last_sale_date/price (never regresses a newer sale with an older history record) - src/ingest/parcels/engine.ts: route whatcom-2020 / whatcom-2021 adapters - src/jobs/hourly_loop.ts: schedule deeds-whatcom-2021/2020 at 168h (weekly, historical) Cost: $0 (ArcGIS REST is free)
f794458 · 2026-08-23 · TK-10687: add DRE enrichment strategy memo
Documents current state (385k CA DRE licensees, 0.09% phone coverage), what DRE public data actually provides (address but NOT phone/email), and the 3-tier $0 enrichment path: DRE address lookup → address-qualified SERP → DBA name search. Identifies 5 large high-value firms (19k+ brokers between them) with found-but-unwritten phones as the fastest quick win. Recommends resorting enrichment by active_broker_count DESC rather than firm ID to maximize early yield. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
05583db · 2026-08-23 · TK-10681: add enrich-firms-serp.js — SERP-only residential firm enrichment (no Ollama, JSONL output)
Lighter SERP enrichment path alongside the existing enrich-firm-contacts.mjs (which requires Ollama). This variant uses pure regex phone/email extraction from Bing + DDG HTML search results, outputs a JSONL file instead of writing to the DB, and caps at 200 firms/run with 1 req/2s rate limiting. 20-firm pilot: 0/20 actionable finds on the oldest license-number cohort (likely defunct firms); false-positive rate on that cohort is high without Ollama validation. Complement the existing enrichment run rather than replace it. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
db793c9 · 2026-08-21 · fix(tsc): broker_website_discovery — verifyAgentSite param license_state (unbreaks repo-wide tsc)
Pre-existing TS2345 at lines 183/259: BrokerRow has license_state but verifyAgentSite required 'state'. Renamed the param + prompt usage to license_state. Repo-wide tsc now 0 errors. Found + fixed under /yoloforever cycle 2 (Cody hole #3). Local only, no push. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
63d794e · 2026-08-19 · Fix watchlist.html crash: v.toFixed on string values
The API returns score/pct/usd as strings, but the fmt formatters called v.toFixed()/Math.round(v) directly — 'v.toFixed is not a function' broke the page render. Coerce with +v and NaN-guard all three. Found via the RE-fleet crash smoke. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4855043 · 2026-08-18 · usre: CA-area-code guard on firm-phone enrichment (TK-10687)
Domain-token matching alone still false-matched shared surnames onto wrong businesses (payneglasses.com, douglascuddletoy.com TOYS, jacuzzi.com hot-tubs, baileyhats.com, grandviewhealth.com). Since every firm in scope is CA-licensed, the office line is a CA area code — require one. Kills the out-of-state wrong-business matches at ~zero cost. Cleaned 16 non-CA false writes. Precision-first: better no number than a wrong one for a directory Frank calls. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
88312fc · 2026-08-18 · usre: Tier-1 accurate firm-phone backfill from cre office lines (TK-10687)
Promotes the SHARED office switchboard (a canonical phone 2+ brokers at a firm use, per the vetted cre.broker/Crexi data) into usre.firm — no web, instant, high accuracy. Guards: canonicalize phones before counting (format variants fragmented the share count), skip toll-free + mega-brokerages (their corporate line must come from their own site, not one agent's record). 16 verified LA office lines matched (Major Properties 8-broker line, Lee & Associates 5, Oppenheim Group 3). COALESCE-only, provenance 'cre-backfill'. $0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e72841d · 2026-08-18 · usre: harden firm-phone enrichment for accuracy (name-match gate, Bing, dedup) (TK-10687)
A call directory must not guess — a wrong number wastes Frank's time. Hardening: - NAME-MATCH GATE: trust a discovered phone ONLY from the firm's own known site or a DOMAIN carrying the firm's distinctive name token (serhant.com, colliers.com, axencareers.com). Kills the Bing false matches (baseball-reference / cabq.gov / southpointcasino / visitpasadena) that common-word firm names pulled in. - Expanded stop-list (geo/directional/generic words) + NONBIZ blocklist (tourism/gov/ wiki/social) so place-named firms don't match a city tourism site. - Prefer OWN domain over aggregators; drop aggregator TOLL-FREE lead-lines; confidence tag in phone_source (web-own / web-agg). - DEDUP: never stamp a phone already assigned to a different firm (shared switchboard). - Bing primary discovery (DuckDuckGo rate-limited the IP) + DDG fallback; plausible- area-code filter. Precision-first: generic-named firms stay 'unverified' (honest) rather than get a wrong number. $0 (local model + local fetch + free search). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a05bd0f · 2026-08-18 · usre: firm-phone coverage canary + incremental enrichment cron (TK-10687)
firm-phone-coverage.mjs (READ-ONLY): tracks 'every firm has a phone / every broker callable' — % of CA active-broker firms with a phone + % of active brokers with a resolvable phone (own/firm/firm_contacts fallback); emits PASS/WARN/FAIL + writes data/firm-phone-coverage.json. Baseline: brokers 20.1% callable, 21,720 firms phoneless. Cron (com.steve.firm-phone-enrich, 02:30/14:30, limit 400/run, $0 local, skips if Ollama down) chips the queue highest-leverage-first + logs coverage each run. Local usre writes only; Kamatera sync stays gated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4cd353f · 2026-08-18 · usre: firm-phone-first contact enrichment driver (agents+local model, $0) (TK-10687)
Steve: 'every firm business must have a phone' + 'every broker callable'. Resumable, idempotent, cron-friendly driver over the ~21.7k CA firms that have an active broker but no phone (ordered by active-broker count desc = biggest leverage first). Per firm: Tier A known website + /contact + /about, Tier B free DuckDuckGo discovery; fetch = plain HTTP -> local headless Chrome fallback for anti-bot; extraction = regex candidates + LOCAL Ollama qwen3:14b picking the business's main phone/email/address (never trusts a phone outside the candidate list). Writes firm.phone/email/ street_address + *_source + firm_contacts + phone_status (COALESCE-only, provenance tagged, --apply gated; dry-run default). $0 (local model + local fetch + free search). Proven: top-3 firms (eXp 4971, Real 4955, Compass 3683 active brokers) all got phones -> ~13.6k broker cards callable via the firm fallback. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7d88094 · 2026-08-18 · usre: resolved broker phone + firm-fallback tier + email/address on the desk (TK-10687)
Every broker must be callable (Steve). /api/brokers now returns a single resolved phone = broker.phone || firm.phone || firm_contacts.phone, plus phone_tier (direct|firm) so the UI can badge the firm fallback; also resolved email + address. broker-desk.js renders a contact row (tel:/mailto: + tier badge + 'phone pending' when none). Migration 022 adds firm contact-enrichment columns (phone_source, email, email_source, contact_enriched_at, contact_attempts, phone_status) + a missing-phone work-queue index. Verified live: a direct-line-less broker now shows the firm phone tagged 'firm'. Local only; Kamatera migration + deploy stay gated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
14507af · 2026-08-15 · usre: safe scoped deploy script (backup+smoke+auto-rollback, no rsync --delete)
Closes the TK-10526 gap: usre has no .deploy.conf, so the shared deploy.sh full-repo rsync --delete would delete real prod source (property.html, src/index.ts, src/zip_county.ts). This deploys ONLY named files, backs each up, restarts, smoke-tests /healthz + shipped static pages, and auto-rolls-back on failure. Dry-run by default (APPLY=1 to fire). Verified in dry-run: all 7 TK-10526 files currently match prod -> clean no-op exit. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e36e0ec · 2026-08-13 · deals/contractors/feed: make every displayed table column sortable
deals.html: surface doc_number as a Table column + sort-select options (doc_number:asc/desc) + click-to-sort header; server whitelist already had pe.doc_number (injection-safe fixed ORDER BY fragment). contractors.html: Phone was a displayed-but-unsortable column (bare <th> with no data-k/indicator). Added phone to server SORT_COLS (c.phone), moved Phone into TBL_COLS so its header is click-sortable + arrow-indicated, and added Phone sort-select options. commercial-feed.html: use_desc (Use) column was click-sortable but missing from the sort <select> — added Use A→Z option (server SORT_COLS already had it). Every column rendered in each Table view is now sortable (select + click) or, for the action-only detail/open cell, correctly carries no sort affordance. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
986b8c8 · 2026-08-12 · usre /api/brokers: return broker_email + firm-level phone/email (firm_contacts fallback)
Individual DRE agents have no contact data; surface the firm's crawled phone/email so ~37,720 affiliated CA brokers get a reachable number/inbox on the RENTV desk. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5ddf920 · 2026-08-12 · usre /api/brokers: default to affiliated-only (agent must have a firm/broker); ?unaffiliated=1 opts into full registry
Drops ~174k standalone/NBA CA licensees so the RENTV desk + directory show real practicing brokers, not the full DRE list. Filters at SQL source so total/paging/counts self-correct. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
be069fc · 2026-08-12 · usre: pm2 ecosystem runs 'node --import tsx' directly (orphan-proof)
Replaces the 'bash -c npx tsx' start command whose detached node grandchild held :9913 across restarts -> EADDRINUSE crash-loop (186519 restarts, TK-10496). pm2 now supervises the actual node PID. max_restarts:10 + min_uptime:15s so a future crash fails loud instead of churning. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ac61383 · 2026-08-12 · usre: scoped Basic-auth credential for the shareable Contractors browse page
CONTRACTORS_USER/CONTRACTORS_PASS (.env) grants access to /contractors* + /api/contractors + shared nav chrome ONLY — never usre admin (deals/parcels/ listings/markets). Env-driven (no secret in source); no-op if unset. Verified locally: admin=all-access, cx-cred=200 on contractors + 401 on /deals.html, no-auth=401. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2f6c9cd · 2026-08-12 · contractors API: default license_status filter to CLEAR (CSLB good-standing)
CSLB MasterLicenseData has no 'Active' status value — good standing is 'CLEAR'. Change the /api/contractors default status (buildFilter) and the /api/contractors/match endpoint's hardcoded status from 'Active' to 'CLEAR'. status=all still drops the filter. Backs the 230,964-row CSLB master load into ca_contractors (220,108 CLEAR). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c9daafc · 2026-08-12 · usre: shared CSLB contractor API (search/detail/match) + internal browse surface
- src/server/contractors.ts: GET /api/contractors (search), /api/contractors/match (mode=home|deal, grouped nearest-first, capped), /api/contractors/:license_no. Empty-table-safe; verified via isolated harness on seeded rows then torn down. - src/server/index.ts: mount contractors (behind existing whole-site Basic Auth). - public/contractors.html: card grid w/ sort + density slider + per-field toggles (all localStorage-persisted) + in-page county/city/trade facets. Internal only. - public/nav-drawer.js: add Contractors to canonical fleet nav. TK-10488. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fcf4fb9 · 2026-08-11 · TK-5: fix Hennepin assemblage guard to be prod-scale safe (ANALYZE + PK-driven)
The bulk-guard UPDATE hung ~4h on the 15M-row prod parcel table: after bulk-loading 447k rows, stale planner stats made the county_fips filter seq-scan the whole table (same hazard wake_nc.ts documents). Fix: ANALYZE parcel before the guard so the (county_fips,source_id) PK index range-scans just the county's rows, and drop the intermediate MATERIALIZED CTE (removes a second full scan). Verified fast locally; re-applying to prod Hennepin (parcels+events already loaded). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c112f07 · 2026-08-11 · TK-5: add 2 metro parcel adapters — Hennepin MN (Minneapolis), Detroit MI
Dedicated full-universe adapters (Wake/Tarrant DTD-B precedent), keyless $0, verified end-to-end vs local usre DB (real fetch->map->upsert->event path, bounded, test rows purged). +2 new states (MN, MI). Full backfill + Kamatera deploy Steve-gated. - hennepin_mn.ts (27053, ~447k): MN Met Council 7-county aggregate (CO_NAME='HENNEPIN'), owner 100% + EMV market value 96% + PRICED sale (SALE_VALUE/SALE_DATE) 88% + year 95%. sqft NULL (FIN_SQ_FT empty for Hennepin, not fabricated). Assemblage guard: multi-parcel sales sharing exact (date,price) flagged bulk + price nulled (verified real: 25 PINs/one $2.3M sale). - detroit_mi.ts (26163, ~379k, Detroit-city subset of Wayne): Detroit_MP_Parcel_Authoritative, owner (taxpayer_1) 100% + assessed value (MI SEV ~50% market) 74% + PRICED sale 75% + year 61% + building sqft (total_floor_area) 61% + zoning. lot sqft kept in extra. Contrarian-gated (FIX FIRST): fixed Detroit sqft (was lot total_square_footage -> building total_floor_area), Detroit event source_url (dead detroitparcels.com -> ArcGIS query URL), added Hennepin assemblage guard, documented both in PARCEL-COVERAGE.md. engine.ts registers hennepin/detroit. Fixed a premature comment-close (*/ inside a comment) caught by tsc. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
709c182 · 2026-08-10 · TK-5: add 4 metro parcel adapters — Dallas TX, Harris TX, Clark NV, Philadelphia PA
Dedicated full-universe adapters (Wake/Tarrant DTD-B precedent), all keyless $0, verified end-to-end vs local usre DB (real fetch->map->upsert->event path, bounded, test rows purged). Full backfill + Kamatera deploy remain Steve-gated. - dallas_tx.ts (48113, ~549k): DCAD City-mirror Tax Account Points, owner ~95% + TRUE market value ~93%, POINT geom; no sqft/year/sale -> 0 events (Bexar+value). - harris_tx.ts (48201, ~1.55M, largest in system): HCAD MapServer, owner ~98% + market value ~98% + lot sqft + deed date (new_owner_date) -> deed events amount NULL. - clark_nv.ts (32003, ~840k): CC_PARCELS_SHP layer 1, owner ~90% + PRICED sale (SALEPRICE+SALEDATE+DOCNO ~81%) + year built ~82%; assessed value absent (left NULL, not fabricated). orderBy OBJECTID_1 (true system id); zip=ZIPMAIN (not packed ZIPCODE). - philadelphia_pa.ts (42101, ~584k): first Carto SQL adapter, owner ~100% + market value ~100% + PRICED sale ~99% + year ~92% + sqft ~92% + BEDS/BATHS (first full-universe county w/ beds/baths) + zoning. Nominal $1 transfers kept per shared price guard. +2 new states (NV, PA). engine.ts registers dallas/harris/clark/philadelphia. Contrarian-gated: caught + fixed Clark ZIPCODE->ZIPMAIN packed-9-digit bug. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
956d719 · 2026-08-10 · feat: Parcel Explorer national coverage overview map + lint/refactor, v0.17.0 (session close)
- overview map: /api/parcels/coverage now returns per-county AVG centroid (clat/clng); parcels.html plots a marker per covered county (sized by count, gold-ringed=priced), click to drill in + '‹ All counties' back button. - security hardening (lint): safeHref() strips javascript:/data: URIs on DB-sourced hrefs; client-side validFips()/sid guards on deep-links. - refactor: renamed shadowed 'map' var in headerSort; split jammed const decl. tsc clean, JS syntax clean, verified render (32 counties mapped). Local pm2 restarted. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d6f64ff · 2026-08-10 · TK-16: add Parcel Explorer web viewer (/parcels.html + /api/parcels)
Unified map+table viewer over the parcel/parcel_event tables the county ingesters fill. - mountParcels API: /api/parcels/coverage (county facets+counts, cached), /api/parcels (county-scoped filtered/sorted/paged grid off the pkey), /api/parcels/map (capped lat/lng points), /api/parcels/:fips/:sid (detail + recorded-deed history from parcel_event). - public/parcels.html: dark/gold house theme, Leaflet dark map (points colored by value, gold=priced), county facet sidebar w/ totals, search (addr/APN/city/owner), sort dropdown + density slider + resizable/toggleable columns (col-resize.js, persisted) per house rules, drill-down detail drawer w/ deed history (OR) or 'coverage-only AB-1785' note (CA), deep-link ?county=&sid=. Every datum drills to detail. Verified vs local usre (11.5M parcels/51 counties/3.28M priced): all 4 endpoints return real data, page 200, inline JS node --check clean. tsc clean. Local pm2 restarted. NOT pushed to prod. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
834684a · 2026-08-10 · TK-16: add CA Ring 5 — Napa + Contra Costa + El Dorado + Nevada + Tulare — pass 11
All COVERAGE-only (AB-1785, priced=0): - Napa 06055: 51,238, richest (value+situs+characteristics), layer /1 not /0, geometry centroid. - Contra Costa 06013: 387,862 (largest Ring-5), MapServer, NO ADDRESS->null, geometry centroid. - El Dorado 06017: 115,731, explicit LAT_Y/LONG_X + owner. - Nevada 06057: 68,095, MapServer situs+value, geometry centroid. - Tulare 06107: 159,318, value-only (APN_TXT not numeric APN), geometry centroid. Verified e2e local (2000 each): 100% latlng all five, values populated. tsc clean. FAILED/skip: Marin/San Mateo/SF(Socrata not ArcGIS)/Placer/Yolo/Humboldt/Kings — no usable keyless REST. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
dcae6a5 · 2026-08-10 · TK-16: add CA Ring 4 — Solano (06095) + Butte (06007) + Sacramento (06067) + Stanislaus (06099) — pass 10
All COVERAGE-only (AB-1785, priced=0): - Solano 06095: ~139,708 addressed, richest (value+situs+characteristics), explicit xcentroid/ycentroid. - Butte 06007: ~190k, SITUS one-line addr (No Address Available->null), explicit Latitude/Longitude, OID=FID. - Sacramento 06067: 502,081 (biggest Ring-4), street parts+city+zip, centroid latlng. - Stanislaus 06099: 168,709, situs+zoning, Situs_City 'City ST ZIP' trimmed, centroid latlng. Verified e2e local (2000 each): 100% latlng all four, addresses populated, Solano valued. tsc clean. Local master, NOT pushed. FAILED/skip: Kern/Merced/Madera/Shasta (geometry-only or token-gated). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d549281 · 2026-08-10 · TK-16: add CA Ring 3 — San Joaquin (06077) + Fresno (06019) + Monterey (06053) — pass 9
Further out from LA. All COVERAGE-only (AB-1785, priced=0): - San Joaquin 06077: 252,719, richest (FULL_ADDRESS + use + string value + characteristics), centroid latlng. - Fresno 06019: ~412k real-APN (largest; enterprise SDE MapServer, SITEADDRESS2 city/zip parsed, NAME1 owner, geometry+centroid latlng). - Monterey 06053: 122,448, value+use (no situs), centroid latlng, City 'None'->null. Verified e2e vs local usre (2000 each): 100% latlng all three; SJ 100% addr, Fresno owner+value+partial situs, Monterey value-only as designed. tsc clean (my files). Local master, NOT pushed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
25d8509 · 2026-08-10 · TK-16: add next CA ring — Santa Barbara (06083) + Imperial (06025) + San Bernardino (06071) — pass 8
Radiating out from LA. All COVERAGE-only (AB-1785, priced=0): - Santa Barbara 06083: 132,504 parcels, richest roll (situs+use text+value+yr/sqft/beds/baths+owner), lat/lng via geometry+centroid, OID=OBJECTID_1, maxRC 1000. - Imperial 06025: 88,170, explicit Longitude/Latitude, situs+use code+Land/Imp (string) value, OID=FID. - San Bernardino 06071: ~839,795 (largest CA county), no situs, comma-string values (anyPrice strips), owner redacted->null, lat/lng via centroid, maxRC 1000. Verified e2e vs local usre (2000 each): 100% lat/lng all three, values/owners populated as designed (06071 owners all redacted->0 by filter; comma-values parsed), priced=0. tsc clean (my files). Local master, NOT pushed; ring deploy is batched per cadence. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0386ff5 · 2026-08-10 · TK-16: add Ventura County CA (06111) situs-address coverage — pass 7, completes LA-adjacent ring
Ventura DataDownloads/Address layer, 299,739 rows, 100% apn. COVERAGE-ONLY (AB-1785 + no value/characteristics in public REST) = situs address + city + zip, like santa-clara. lat/lng is on a separate apn-keyed layer (CommonData/2) = future join enhancement. Verified e2e vs local usre: 3708 parcels, 100% addressed, priced=0 expected, parcel_source(06111). tsc clean (my files). Local master, NOT pushed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9af3911 · 2026-08-10 · TK-16: add Orange County CA (06059) parcel coverage + centroid lat/lng flag — pass 6, CA sweep begins
First of the 'all California, radiating from LA' sweep. OC Public Works legal-lots layer, ~982,299 parcels. COVERAGE-ONLY (CA AB-1785 suppresses sale price → priced=0, no events) like la-county/san-diego: address + assessed value + centroid lat/lng. New general Source flag centroid:true → returnCentroid+outSR=4326 = lightweight lat/lng from f.centroid without downloading ~982k polygons. AssessmentNo is the parcel key (LegalLotID repeats across condo units); value fields are string-typed (num parses); total_value = AssdAmt || LandVal+ImprovedVal. pageSize=2000 matches maxRecordCount. Verified e2e vs local usre: 3993 parcels all w/ lat/lng, real address/value, priced=0 as expected, parcel_source(06059). tsc clean (my files). Local master, NOT pushed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
04c5f48 · 2026-08-10 · TK-16: add Jackson County OR (41029) priced-deed feed + curl fetch fallback — 5th arcgis_sales pass
Jackson County Assessment LatestSales layer (58,400 priced deeds w/ grantor+grantee names, doc no/type, situs, use, yr/sqft). Rich clean-key feed. Also hardens the arcgis_sales fetcher: spatial.jacksoncountyor.gov emits a non-RFC response header that undici (fetch) AND Node's http parser (even insecureHTTPParser) reject; added a curl fallback (single-argv, no shell; --compressed) triggered only on that specific 'Invalid header token' error — benefits any future non-compliant county server. pageSize=1000 to match server maxRecordCount (avoids the la-county early-break). Verified e2e vs local usre DB: 4000 parcels + 3997 sale events (paged past 1000, cursor advancing), 8 deed types, parcel_source(41029) registered. tsc clean (my files). Local master, NOT pushed; prod deploy + full backfill stay Steve-gated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d503d96 · 2026-08-10 · TK-16: add Lane County OR (41039) free priced-deed feed — 4th arcgis_sales pass
Lane County AddressParcelSales MapServer 'Sales (last 3 years)' layer (~6.7k priced deeds w/ deed no/type + situs + rolling window). Join-layer prefixed keys (SalesLayerCityJoin_SalesforGISLayerAll_) handled like Yakima's qualified keys. Verified e2e vs local usre DB: 1833 parcels + 1958 sale events + 1833 GIS links + parcel_source(41039). tsc clean (my files). Local master, NOT pushed; prod deploy + full backfill to Kamatera stay Steve-gated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
39e9dbe · 2026-08-02 · TK-10139: canonical address_key normalizer (strip trailing state/zip), honest commercial BOR empty-state
- computeAddressKey now strips trailing ", ST", " ZIP" tokens so a listing's full "street, city, ST, ZIP" and a parcel's (address, city) fields reduce to the same key. - new addressKeySql() shared SQL builder mirrors it exactly; imported by commercial.ts, listings.ts, and the backfill so the join keys can never drift. - commercial-property.html BOR card: null both -> explicit muted note instead of bare '—'. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
498df4a · 2026-07-31 · listings.html: load col-resize.js for parity with markets/brokers
Cody-gate caught listings.html loading crcp-grid.js without col-resize.js. Verified: listings' list view renders a SINGLE-column table (1 header cell), which col-resize correctly declines to enhance (nothing to resize) — so there was no functional resize bug, but loading the script gives parity + future- proofs if listings ever becomes multi-column. Harmless, 0 errors. yoloforever c2. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3dfd37e · 2026-07-31 · Fix column resize on markets/brokers grids (adjust column not working)
Propagate the fixed col-resize.js from CRCP (was the old pre-fix drop-in with none of the width-application / hidden-table / handle-position / draggable-guard fixes) AND add the missing per-engine wiring in crcp-grid.js: - col-resize.js: full parity with commercialrealestate's fixed copy (syncTableWidth pins table width so fixed-layout honors <col> widths, hidden- table bail, reattach, handle right:0, draggable guard, startW-from-style). - crcp-grid.js render(): deterministic ColResize.refresh() after the innerHTML table rebuild instead of racing the async MutationObserver. - crcp-grid.js sort handler: ignore clicks on .cr-handle / during cr-dragging, so grabbing the resize handle no longer fires a sort + full re-render mid-drag (that was collapsing resize to a single 14px step / 0). Verified real-mouse (Playwright) on the running :9913 app: markets 59->179, brokers 112->232 (was 59->59 / 112->112 broken); sort still works; 0 errors. Local only — Kamatera deploy is gated. yoloforever cycle 2. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23c88a6 · 2026-07-28 · feat: RENTV data feed over usre DB (:9796) — brokers/firms/commercial parcels/subleases/regions
Read-only CORS JSON feed sharing the national CRE datasets with RENTV: /feed/brokers (~2M), /feed/firms (~214k), /feed/commercial (~154k parcels w/ assessed values), /feed/subleases, /feed/regions, /feed/summary. Tailnet-reachable, pm2-managed.
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>
File tree
- .gitignore
- BROKER-COVERAGE-WAVE2.md
- BROKER-COVERAGE.md
- FRANKLIN-RUNBOOK.md
- LISTING-COVERAGE.md
- PARCEL-COVERAGE.md
- README.md
- SOURCES.md
- TK-50-field-provenance.md
- cap_mobile.cjs
- cap_search.cjs
- cap_search2.cjs
- cap_search3.cjs
- cap_viewport.cjs
- cap_webkit.cjs
- data/asc/appraisers_socal.jsonl
- data/asc/prod-load-appraisers.sql
- data/asc/prod-load-appraisers.sql.gz
- data/crosswalk-overrides.json
- data/crosswalk-unmatched.json
- data/firm-phone-coverage.json
- data/fulton-luc.json
- data/serp-enrich-2026-08-23T11-14-17.jsonl
- data/socal_city_market.psv
- data/socal_zip_market.psv
- db/backfill-broker-of-record.ts
- db/backfill-listing-lifecycle.ts
- db/migrate.ts
- db/migrations/001_init.sql
- db/migrations/002_firm_site.sql
- db/migrations/003_property.sql
- db/migrations/004_parcels.sql
- db/migrations/005_commercial.sql
- db/migrations/006_commercial_briefs.sql
- db/migrations/007_sublease.sql
- db/migrations/008_places_seed.sql
- db/migrations/009_source_health.sql
- db/migrations/010_parcel_event.sql
- db/migrations/011_ingest_cursor.sql
- db/migrations/012_parcel_provenance.sql
- db/migrations/013_broker_of_record_history.sql
- db/migrations/014_listing_lifecycle.sql
- db/migrations/015_source_ingest_run.sql
- db/migrations/016_source_ingest_run_partial.sql
- db/migrations/017_broker_website.sql
- db/migrations/018_ca_contractors.sql
- db/migrations/019_ca_contractors_dating.sql
- db/migrations/020_broker_firm_asset_class.sql
- db/migrations/021_firm_street_address.sql
- db/migrations/022_firm_contact_enrich.sql
- db/migrations/023_lifecycle_fk_on_delete.sql
- db/pool.ts
- db/views/last_broker_of_record.sql
- db/views/recent_commercial_deals.sql
- deploy/launchd/com.steve.firm-phone-enrich.plist
- docs/deploy-asset-class.md
- docs/dre-enrichment-strategy-TK10687.md
- ecosystem.config.cjs
- herocap.cjs
- launchd/com.steve.usre-refresh.plist
- livetest.cjs
- package-lock.json
- package.json
- public/admin.html
- public/broker-desk.css
- public/broker-desk.js
- public/brokers.html
- public/col-resize.js
- public/commercial-brokers.html
- public/commercial-feed.html
- public/commercial-property.html
- public/commercial.html
- public/compare.html
- public/contractors.html
- public/crcp-grid.css
- public/crcp-grid.js
- public/data/counties.geojson
- public/deals.html
- public/geo-search.css
- public/geo-search.js
- public/health.html
- public/index.html
- public/listings.html
- public/market.html
- public/markets.html
- public/nav-agent/nav-agent.css
- public/nav-agent/nav-agent.js
- public/nav-drawer.css
- public/nav-drawer.js
- public/parcels.html
- public/property.html
- public/residential-brokers.html
- public/sources.html
- public/vendor/uPlot.iife.min.js
- public/vendor/uPlot.min.css
- public/watchlist.html
- score-config.json
- scripts/__pycache__/scrape-asc-appraisers.cpython-314.pyc
- scripts/backfill-firm-phones-from-cre.mjs
- scripts/classify-asset-class.sql
- scripts/deploy-contractors-to-kamatera.sh
- scripts/deploy-usre-code-to-kamatera.sh
- scripts/deploy-usre-scoped.sh
- scripts/enrich-firm-contacts.mjs
- scripts/enrich-firms-serp.js
- scripts/enrich-whatcom-situs.mjs
- scripts/firm-phone-coverage.mjs
- scripts/load-asc-appraisers.sh
- scripts/recon-kamatera-usre.sh
- scripts/refresh-commercial.sh
- scripts/rentv-feed.mjs
- scripts/run-firm-enrich.sh
- scripts/scrape-asc-appraisers.py
- src/crawl/firm_front_page.ts
- src/enrich/broker_website_discovery.ts
- src/enrich/firm_email_crawl.ts
- src/enrich/firm_website_discovery.ts
- src/enrich/firm_website_resolve.ts
- src/ingest/brokers/ca_dre.ts
- src/ingest/brokers/co_dre.ts
- src/ingest/brokers/csv.ts
- src/ingest/brokers/ct_dcp.ts
- src/ingest/brokers/ct_dcp_reb.ts
- src/ingest/brokers/de_dpr.ts
- src/ingest/brokers/engine.ts
- src/ingest/brokers/fl_dbpr.ts
- src/ingest/brokers/il_idfpr.ts
- src/ingest/brokers/ny_dos.ts
- src/ingest/brokers/tx_trec.ts
- src/ingest/brokers/types.ts
- src/ingest/cbsa_crosswalk.ts
- src/ingest/census_acs.ts
- src/ingest/commercial/arcgis_commercial.ts
- src/ingest/commercial/briefs.ts
- src/ingest/commercial/engine.ts
- src/ingest/commercial/from_parcel.ts
- src/ingest/commercial/la_assessor.ts
- src/ingest/crosswalk.ts
- src/ingest/derive_metrics.ts
- src/ingest/fema_nri.ts
- src/ingest/fhfa_hpi.ts
- src/ingest/hud_fmr.ts
- src/ingest/listings/coldwellbanker.ts
- src/ingest/listings/engine.ts
- src/ingest/listings/realtytexas.ts
- src/ingest/listings/shared.ts
- src/ingest/listings/types.ts
- src/ingest/listings/weichert.ts
- src/ingest/parcels/arcgis_sales.ts
- src/ingest/parcels/bexar_tx.ts
- src/ingest/parcels/clark_nv.ts
- src/ingest/parcels/cook_il.ts
- src/ingest/parcels/csv.ts
- src/ingest/parcels/dallas_tx.ts
- src/ingest/parcels/date_guard.ts
- src/ingest/parcels/detroit_mi.ts
- src/ingest/parcels/engine.ts
- src/ingest/parcels/franklin_oh.ts
- src/ingest/parcels/fulton_ga.ts
- src/ingest/parcels/harris_tx.ts
- src/ingest/parcels/hennepin_mn.ts
- src/ingest/parcels/king_wa.ts
- src/ingest/parcels/maricopa_bulk.ts
- src/ingest/parcels/miami_dade.ts
- src/ingest/parcels/nyc_acris.ts
- src/ingest/parcels/nyc_pluto.ts
- src/ingest/parcels/owner_guard.ts
- src/ingest/parcels/philadelphia_pa.ts
- src/ingest/parcels/price_guard.ts
- src/ingest/parcels/provenance_selftest.ts
- src/ingest/parcels/saltlake_ut.ts
- src/ingest/parcels/sandiego_ca.ts
- src/ingest/parcels/tarrant_tx.ts
- src/ingest/parcels/upsert.ts
- src/ingest/parcels/wake_nc.ts
- src/ingest/places/seed.ts
- src/ingest/redfin_tracker.ts
- src/ingest/regions_seed.ts
- src/ingest/run.ts
- src/ingest/zillow_research.ts
- src/ingest/zip_county.ts
- src/jobs/alerts_check.ts
- src/jobs/broker_rotate.ts
- src/jobs/hourly_loop.ts
- src/jobs/listing-lifecycle-sweep.ts
- src/jobs/refresh_all.ts
- src/jobs/self_correct.ts
- src/lib/commercial_types.ts
- src/score/opportunity.ts
- src/server/broker-of-record.ts
- src/server/commercial.ts
- src/server/contractors.ts
- src/server/deals.ts
- src/server/index.ts
- src/server/listing-lifecycle.dbtest.ts
- src/server/listing-lifecycle.selftest.ts
- src/server/listing-lifecycle.ts
- src/server/listings.ts
- src/server/parcels.ts
- src/server/property.ts
- src/server/sublease.ts
- src/server/watchlist_admin.ts
- tsconfig.json
- verification/e2e-proof.json