Nationalrealestate

repo: ~/Projects/nationalrealestate · 336 commits · 0 in last 24h, 7 in last 7d · ▄ ▄██▄

Search the build

336 commits indexed

  1. d7eb08c 2026-09-25 auto-data-snapshot: 2026-09-25T03:37:11 (1 data files) — data/firm-phone-coverage.json
  2. e5593f0 2026-09-24 auto-data-snapshot: 2026-09-24T16:55:40 (1 data files) — data/firm-phone-coverage.json
  3. 111bd3c 2026-09-24 auto-data-snapshot: 2026-09-24T04:59:33 (1 data files) — data/firm-phone-coverage.json
  4. cfe5095 2026-09-23 auto-data-snapshot: 2026-09-23T16:56:06 (1 data files) — data/firm-phone-coverage.json
  5. 1bbf0dc 2026-09-23 auto-data-snapshot: 2026-09-23T04:47:26 (1 data files) — data/firm-phone-coverage.json
  6. 7504ccc 2026-09-22 auto-data-snapshot: 2026-09-22T16:42:26 (1 data files) — data/firm-phone-coverage.json
  7. bbefb9b 2026-09-20 auto-data-snapshot: 2026-09-20T03:19:32 (1 data files) — data/firm-phone-coverage.json
  8. 40b0f9a 2026-09-19 auto-data-snapshot: 2026-09-19T15:17:08 (1 data files) — data/firm-phone-coverage.json
  9. d439ad5 2026-09-19 auto-data-snapshot: 2026-09-19T03:36:55 (1 data files) — data/firm-phone-coverage.json
  10. f03419d 2026-09-18 auto-data-snapshot: 2026-09-18T16:30:11 (1 data files) — data/firm-phone-coverage.json
  11. 70739fd 2026-09-18 auto-data-snapshot: 2026-09-18T03:33:53 (1 data files) — data/firm-phone-coverage.json
  12. 3f8f294 2026-09-17 auto-data-snapshot: 2026-09-17T15:48:34 (1 data files) — data/firm-phone-coverage.json
  13. 53f1bbc 2026-09-17 auto-data-snapshot: 2026-09-17T03:58:38 (1 data files) — data/firm-phone-coverage.json
  14. b8dd1f7 2026-09-16 auto-data-snapshot: 2026-09-16T15:43:40 (1 data files) — data/firm-phone-coverage.json
  15. 86ffed0 2026-09-16 auto-data-snapshot: 2026-09-16T04:07:45 (1 data files) — data/firm-phone-coverage.json
  16. 72f804e 2026-09-15 auto-data-snapshot: 2026-09-15T15:48:53 (1 data files) — data/firm-phone-coverage.json
  17. f411de8 2026-09-15 auto-data-snapshot: 2026-09-15T03:56:10 (1 data files) — data/firm-phone-coverage.json
  18. f721e7f 2026-09-14 auto-data-snapshot: 2026-09-14T15:41:36 (1 data files) — data/firm-phone-coverage.json
  19. 47bd9ea 2026-09-14 auto-data-snapshot: 2026-09-14T03:34:24 (1 data files) — data/firm-phone-coverage.json
  20. 7cd663d 2026-09-13 auto-data-snapshot: 2026-09-13T15:25:19 (1 data files) — data/firm-phone-coverage.json
  21. 84ec1d4 2026-09-13 auto-data-snapshot: 2026-09-13T03:42:21 (1 data files) — data/firm-phone-coverage.json
  22. fa65e36 2026-09-12 auto-data-snapshot: 2026-09-12T15:35:41 (1 data files) — data/firm-phone-coverage.json
  23. 3164d96 2026-09-12 auto-data-snapshot: 2026-09-12T03:53:49 (1 data files) — data/firm-phone-coverage.json
  24. 798d97c 2026-09-11 auto-data-snapshot: 2026-09-11T16:23:14 (1 data files) — data/firm-phone-coverage.json
  25. c66a86f 2026-09-11 auto-data-snapshot: 2026-09-11T03:51:39 (1 data files) — data/firm-phone-coverage.json
  26. ff9c32c 2026-09-10 auto-data-snapshot: 2026-09-10T15:54:39 (1 data files) — data/firm-phone-coverage.json
  27. 644425d 2026-09-10 auto-data-snapshot: 2026-09-10T03:43:17 (1 data files) — data/firm-phone-coverage.json
  28. bc29ad5 2026-09-09 auto-data-snapshot: 2026-09-09T15:36:04 (1 data files) — data/firm-phone-coverage.json
  29. f6c0c02 2026-09-09 auto-data-snapshot: 2026-09-09T03:37:19 (1 data files) — data/firm-phone-coverage.json
  30. 97d4b54 2026-09-08 auto-data-snapshot: 2026-09-08T15:35:04 (1 data files) — data/firm-phone-coverage.json
  31. b3669a8 2026-09-08 auto-data-snapshot: 2026-09-08T05:12:15 (1 data files) — data/firm-phone-coverage.json
  32. 852add6 2026-09-06 auto-data-snapshot: 2026-09-06T03:18:08 (1 data files) — data/firm-phone-coverage.json
  33. 602b2c7 2026-09-05 auto-data-snapshot: 2026-09-05T15:48:21 (1 data files) — data/firm-phone-coverage.json
  34. e7a2223 2026-09-05 auto-data-snapshot: 2026-09-05T03:39:28 (1 data files) — data/firm-phone-coverage.json
  35. a94d5ce 2026-09-04 auto-data-snapshot: 2026-09-04T15:31:50 (1 data files) — data/firm-phone-coverage.json
  36. 53bc05a 2026-09-04 auto-data-snapshot: 2026-09-04T03:52:16 (1 data files) — data/firm-phone-coverage.json
  37. b6424c8 2026-09-03 auto-data-snapshot: 2026-09-03T15:07:41 (1 data files) — data/firm-phone-coverage.json
  38. 611a2ae 2026-09-03 auto-data-snapshot: 2026-09-03T03:29:44 (1 data files) — data/firm-phone-coverage.json
  39. 0aa41a0 2026-09-02 auto-data-snapshot: 2026-09-02T15:21:07 (1 data files) — data/firm-phone-coverage.json
  40. 091b8ca 2026-09-02 auto-data-snapshot: 2026-09-02T03:24:05 (1 data files) — data/firm-phone-coverage.json
  41. d4a54dd 2026-09-01 auto-data-snapshot: 2026-09-01T15:29:45 (1 data files) — data/firm-phone-coverage.json
  42. 80c020f 2026-09-01 auto-data-snapshot: 2026-09-01T03:29:10 (1 data files) — data/firm-phone-coverage.json
  43. 2eba198 2026-08-31 auto-data-snapshot: 2026-08-31T15:44:48 (1 data files) — data/firm-phone-coverage.json
  44. 8e929e2 2026-08-31 record TK-10155 production lifecycle proof
  45. f8df3cd 2026-08-31 auto-data-snapshot: 2026-08-31T10:06:07 (1 data files) — data/firm-phone-coverage.json
  46. 130e6b0 2026-08-30 auto-data-snapshot: 2026-08-30T03:31:23 (1 data files) — data/firm-phone-coverage.json
  47. d66d851 2026-08-29 auto-data-snapshot: 2026-08-29T15:15:52 (1 data files) — data/firm-phone-coverage.json
  48. 5aa5440 2026-08-29 auto-data-snapshot: 2026-08-29T03:31:35 (1 data files) — data/firm-phone-coverage.json
  49. 23dd8ae 2026-08-28 auto-data-snapshot: 2026-08-28T15:48:59 (1 data files) — data/firm-phone-coverage.json
  50. cd5b8b3 2026-08-28 auto-data-snapshot: 2026-08-28T03:24:48 (1 data files) — data/firm-phone-coverage.json
  51. d14f65e 2026-08-27 auto-data-snapshot: 2026-08-27T15:43:16 (1 data files) — data/firm-phone-coverage.json
  52. 789aa2f 2026-08-27 auto-data-snapshot: 2026-08-27T03:25:19 (1 data files) — data/firm-phone-coverage.json
  53. 357d200 2026-08-26 auto-data-snapshot: 2026-08-26T15:16:03 (1 data files) — data/firm-phone-coverage.json
  54. 28f9c56 2026-08-26 auto-data-snapshot: 2026-08-26T03:25:32 (1 data files) — data/firm-phone-coverage.json
  55. 8f5e0da 2026-08-25 auto-data-snapshot: 2026-08-25T15:49:32 (1 data files) — data/firm-phone-coverage.json
  56. b408a56 2026-08-25 auto-data-snapshot: 2026-08-25T03:23:00 (1 data files) — data/firm-phone-coverage.json
  57. ae4eb11 2026-08-24 TK-10155 (Cody FIX-FIRST): guarantee every listing has >=1 preserved snapshot
  58. 83c8fb2 2026-08-24 TK-10155: lifecycle self-tests + fix withdrawal-snapshot FK to survive listing deletion
  59. 958bcb3 2026-08-24 auto-data-snapshot: 2026-08-24T15:30:55 (1 data files) — data/firm-phone-coverage.json
  60. 4572db9 2026-08-24 chore: v0.22.1 — Snohomish WA (53061) priced-deed feed (session close)
  61. b4a6245 2026-08-24 auto-data-snapshot: 2026-08-24T11:12:29 (1 data files) — package-lock.json
  62. 122ebb1 2026-08-24 chore: v0.22.0 (session close — 3 west-coast priced-deed feeds: josephine 41033, whatcom 53073, snohomish 53061)
  63. 86cb190 2026-08-24 Snohomish County WA (53061): add free priced-deed feed (arcgis_sales) — TK-16
  64. d7d2c15 2026-08-24 TK-16: add Josephine County OR (41033) free priced-deed feed
  65. 1326a54 2026-08-24 Whatcom WA: add situs/owner join + SWDSales2020/2021 history layers (TK-10777)
  66. 17bb441 2026-08-24 auto-data-snapshot: 2026-08-24T03:41:17 (1 data files) — data/firm-phone-coverage.json
  67. 0195411 2026-08-23 auto-data-snapshot: 2026-08-23T15:28:58 (1 data files) — data/firm-phone-coverage.json
  68. f794458 2026-08-23 TK-10687: add DRE enrichment strategy memo
  69. 05583db 2026-08-23 TK-10681: add enrich-firms-serp.js — SERP-only residential firm enrichment (no Ollama, JSONL output)
  70. cd32cb6 2026-08-23 auto-data-snapshot: 2026-08-23T03:15:26 (1 data files) — data/firm-phone-coverage.json
  71. 8c9721a 2026-08-22 auto-data-snapshot: 2026-08-22T15:34:47 (1 data files) — data/firm-phone-coverage.json
  72. 9a3b0b1 2026-08-22 auto-data-snapshot: 2026-08-22T03:19:29 (1 data files) — data/firm-phone-coverage.json
  73. b77e37b 2026-08-21 auto-data-snapshot: 2026-08-21T15:40:21 (1 data files) — data/firm-phone-coverage.json
  74. 7e7a803 2026-08-21 chore: v0.21.0 (session close — Whatcom feed + tsc fix)
  75. db793c9 2026-08-21 fix(tsc): broker_website_discovery — verifyAgentSite param license_state (unbreaks repo-wide tsc)
  76. 58652bd 2026-08-21 auto-data-snapshot: 2026-08-21T03:25:40 (1 data files) — data/firm-phone-coverage.json
  77. 6c891d0 2026-08-20 TK-16 pass4: add Whatcom County WA (53073) priced-deed ArcGIS feed (5189 sales)
  78. e41fdd7 2026-08-20 auto-data-snapshot: 2026-08-20T15:11:42 (1 data files) — data/firm-phone-coverage.json
  79. 438160a 2026-08-20 nav-agent: sync v1.3 (host left-sidebar collapse on load)
  80. 912ab65 2026-08-20 auto-data-snapshot: 2026-08-20T03:38:46 (1 data files) — data/firm-phone-coverage.json
  81. fd80fc1 2026-08-19 auto-data-snapshot: 2026-08-19T15:40:38 (1 data files) — data/firm-phone-coverage.json
  82. 2f184d3 2026-08-19 nav-agent: List data full-width tight columns (grid) — layout fix
  83. ab4fd59 2026-08-19 Refresh nav-agent to v1.2 (adds kv-list compact List view, default-off)
  84. b4ad42f 2026-08-19 chore: v0.20.1 (session close — watchlist toFixed crash fix; lint ✓)
  85. 63d794e 2026-08-19 Fix watchlist.html crash: v.toFixed on string values
  86. 95e9e65 2026-08-19 auto-data-snapshot: 2026-08-19T03:46:07 (1 data files) — data/firm-phone-coverage.json
  87. 3f59bcb 2026-08-18 auto-data-snapshot: 2026-08-18T15:36:46 (1 data files) — data/firm-phone-coverage.json
  88. 36ef14f 2026-08-18 auto-data-snapshot: 2026-08-18T14:00:27 (1 data files) — data/firm-phone-coverage.json
  89. 4855043 2026-08-18 usre: CA-area-code guard on firm-phone enrichment (TK-10687)
  90. 88312fc 2026-08-18 usre: Tier-1 accurate firm-phone backfill from cre office lines (TK-10687)
  91. e72841d 2026-08-18 usre: harden firm-phone enrichment for accuracy (name-match gate, Bing, dedup) (TK-10687)
  92. b3eef68 2026-08-18 auto-data-snapshot: 2026-08-18T13:28:17 (1 data files) — data/firm-phone-coverage.json
  93. a05bd0f 2026-08-18 usre: firm-phone coverage canary + incremental enrichment cron (TK-10687)
  94. 4cd353f 2026-08-18 usre: firm-phone-first contact enrichment driver (agents+local model, $0) (TK-10687)
  95. 7d88094 2026-08-18 usre: resolved broker phone + firm-fallback tier + email/address on the desk (TK-10687)
  96. 2492689 2026-08-18 chore: v0.20.0 (session close — DRE firm contact card shipped live; refactor deferred, enrich files in-flight)
  97. 65cab77 2026-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)
  98. de5e83f 2026-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)
  99. 5a7ce2a 2026-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)
  100. d1ab982 2026-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)
  101. 771e7f8 2026-08-18 firm directory: capture + surface street address via Places formattedAddress (lever #3, TK-10669)
  102. d116917 2026-08-18 firm directory: capture phone via Places resolve (commercial-scoped) + surface registry phone/website on firm card (TK-10669)
  103. bdc39ea 2026-08-17 snapshot before restart: preserve in-flight work (auto-saved by /restart pre-reboot)
  104. 308483c 2026-08-15 auto-data-snapshot: 2026-08-15T15:50:00 (1 data files) — package-lock.json
  105. 33399fa 2026-08-15 chore: v0.19.0 (session close — residential desk + server-side sort)
  106. 14507af 2026-08-15 usre: safe scoped deploy script (backup+smoke+auto-rollback, no rsync --delete)
  107. ce73325 2026-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
  108. 53f52a8 2026-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)
  109. e61c69f 2026-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)
  110. 5a16e24 2026-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)
  111. 6e7676c 2026-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)
  112. fd66310 2026-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
  113. fbacac8 2026-08-14 auto-data-snapshot: 2026-08-14T10:52:23 (1 data files) — data/asc/appraisers_socal.jsonl
  114. 2e5a7a1 2026-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
  115. 11157a8 2026-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)
  116. 3e868e0 2026-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
  117. c232f5f 2026-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
  118. e48c935 2026-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
  119. c428bcd 2026-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)
  120. a522adb 2026-08-13 usre: add commercial/residential asset_class tag on firm+broker + ?asset_class= API filter (Node A of RENTV-commercial-only, TK-10535)
  121. 5a2f624 2026-08-13 chore: gitignore *.bak (prevent tooling backup cruft) [TK-10526]
  122. e36e0ec 2026-08-13 deals/contractors/feed: make every displayed table column sortable
  123. 27b936f 2026-08-13 nav-agent: v1.1 merge-mode asset refresh
  124. 7b50153 2026-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)
  125. 1227b5c 2026-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)
  126. cf1e3b2 2026-08-13 usre: contractors.html gets grid/list/table views + all-column server-side sort (clickable table headers + full Sort select, view+sort persisted)
  127. 846689f 2026-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
  128. 16ce66f 2026-08-13 usre: add ?sort=&order= column whitelist to /api/deals, /api/commercial/search+feed, /api/contractors (SQL-injection-safe, defaults preserved)
  129. f820780 2026-08-12 auto-data-snapshot: 2026-08-12T15:01:25 (1 data files) — package-lock.json
  130. 41dc5ca 2026-08-12 chore: usre deploy-script fixes + v0.18.1 (session close, TK-10488)
  131. 986b8c8 2026-08-12 usre /api/brokers: return broker_email + firm-level phone/email (firm_contacts fallback)
  132. 5ddf920 2026-08-12 usre /api/brokers: default to affiliated-only (agent must have a firm/broker); ?unaffiliated=1 opts into full registry
  133. be069fc 2026-08-12 usre: pm2 ecosystem runs 'node --import tsx' directly (orphan-proof)
  134. 095c0c2 2026-08-12 scripts: safe usre contractor code deploy (backup+smoke+rollback; scoped cred via runtime env) (TK-10488)
  135. ac61383 2026-08-12 usre: scoped Basic-auth credential for the shareable Contractors browse page
  136. ca8f556 2026-08-12 ca_contractors: recon script + v0.18.0 (session close, TK-10488)
  137. 6d30f1f 2026-08-12 scripts: Kamatera contractor data-load + deploy runbook (TK-10488) — transfer/migrate/load/verify + phase-2 deploy guards
  138. 2f6c9cd 2026-08-12 contractors API: default license_status filter to CLEAR (CSLB good-standing)
  139. 0ef7a6b 2026-08-12 ca_contractors: date-everything provenance (source_as_of, cslb_last_update) + auto updated_at trigger (TK-10488)
  140. c9daafc 2026-08-12 usre: shared CSLB contractor API (search/detail/match) + internal browse surface
  141. 1bdb0d9 2026-08-12 ca_contractors: CSLB licensed-contractor registry schema (TK-10488) — shared coordination layer for the RE builds
  142. 504ae66 2026-08-12 usre deals: facet deselect uses undefined (not null) to match go()/rm/clear — one unset sentinel, refactor-safe (TK-10482 SHOULD-FIX)
  143. 26fa1e5 2026-08-12 usre: deals.html feed grid with full href-drill + /deal/:id clean route + fleet nav (TK-10482)
  144. 41cb360 2026-08-12 usre: add commercial deals feed + per-deal detail API over recent_commercial_deals view (TK-10482)
  145. fcf4fb9 2026-08-11 TK-5: fix Hennepin assemblage guard to be prod-scale safe (ANALYZE + PK-driven)
  146. c112f07 2026-08-11 TK-5: add 2 metro parcel adapters — Hennepin MN (Minneapolis), Detroit MI
  147. 709c182 2026-08-10 TK-5: add 4 metro parcel adapters — Dallas TX, Harris TX, Clark NV, Philadelphia PA
  148. 9a7dd5f 2026-08-10 auto-data-snapshot: 2026-08-10T21:49:05 (1 data files) — PARCEL-COVERAGE.md
  149. cd7be34 2026-08-10 auto-data-snapshot: 2026-08-10T21:18:09 (1 data files) — package-lock.json
  150. 956d719 2026-08-10 feat: Parcel Explorer national coverage overview map + lint/refactor, v0.17.0 (session close)
  151. d6f64ff 2026-08-10 TK-16: add Parcel Explorer web viewer (/parcels.html + /api/parcels)
  152. 834684a 2026-08-10 TK-16: add CA Ring 5 — Napa + Contra Costa + El Dorado + Nevada + Tulare — pass 11
  153. dcae6a5 2026-08-10 TK-16: add CA Ring 4 — Solano (06095) + Butte (06007) + Sacramento (06067) + Stanislaus (06099) — pass 10
  154. d549281 2026-08-10 TK-16: add CA Ring 3 — San Joaquin (06077) + Fresno (06019) + Monterey (06053) — pass 9
  155. abd259f 2026-08-10 auto-data-snapshot: 2026-08-10T16:09:17 (1 data files) — SOURCES.md
  156. 25d8509 2026-08-10 TK-16: add next CA ring — Santa Barbara (06083) + Imperial (06025) + San Bernardino (06071) — pass 8
  157. 0386ff5 2026-08-10 TK-16: add Ventura County CA (06111) situs-address coverage — pass 7, completes LA-adjacent ring
  158. 9af3911 2026-08-10 TK-16: add Orange County CA (06059) parcel coverage + centroid lat/lng flag — pass 6, CA sweep begins
  159. 04c5f48 2026-08-10 TK-16: add Jackson County OR (41029) priced-deed feed + curl fetch fallback — 5th arcgis_sales pass
  160. d503d96 2026-08-10 TK-16: add Lane County OR (41039) free priced-deed feed — 4th arcgis_sales pass
  161. f1b3540 2026-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
  162. 52035aa 2026-08-06 usre: on-demand discoverOne returns graceful throttled status, never records false no_url on cooldown
  163. cacffea 2026-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)
  164. aeba005 2026-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)
  165. 3709d7d 2026-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)
  166. 37575d8 2026-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
  167. d8955b6 2026-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)
  168. fdb639e 2026-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
  169. 6193a68 2026-08-02 TK-10155: listings.html — color-coded lifecycle state chip + state filter/facet + withdrawn (preserved) snapshot view
  170. a7cc0b6 2026-08-02 TK-10155: listing lifecycle detector + sweep + backfill + ingest first-see hook + lifecycle/withdrawn API (migration 014)
  171. 39e9dbe 2026-08-02 TK-10139: canonical address_key normalizer (strip trailing state/zip), honest commercial BOR empty-state
  172. 53836d2 2026-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
  173. e24220d 2026-08-02 TK-10139: surface Last Broker/Firm of Record — card on commercial-property.html + optional columns/facet on listings.html
  174. 9026471 2026-08-02 TK-10139: expose last_broker_of_record + last_firm_of_record (+observed_at) on /api/commercial/property/:ain and /api/listings
  175. cd763bf 2026-08-02 TK-10139: broker-of-record history — append-only table + last_broker_of_record view + recorder + listing-ingest hook + backfill (584 rows seeded)
  176. 49158f6 2026-08-01 TK-5: add san-diego-sandag and santa-clara to hourly loop rotation — both were in engine but not scheduled
  177. b435d6d 2026-08-01 TK-16: add CENTER_LAT/CENTER_LON to la-county adapter — fills lat/lng for 2.37M parcels
  178. 498df4a 2026-07-31 listings.html: load col-resize.js for parity with markets/brokers
  179. 3dfd37e 2026-07-31 Fix column resize on markets/brokers grids (adjust column not working)
  180. 06c2d3a 2026-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)
  181. ed1e697 2026-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
  182. 0cfcfdb 2026-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
  183. 8a5be2f 2026-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
  184. 2ebcbf4 2026-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)
  185. 92af9db 2026-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
  186. b53f231 2026-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
  187. 275ff1e 2026-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
  188. 36c7c42 2026-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
  189. 6ad5d70 2026-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
  190. b3ca8a1 2026-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)
  191. d55600a 2026-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
  192. 1c2a95f 2026-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)
  193. 92ca742 2026-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
  194. ba1528f 2026-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
  195. 0b13660 2026-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
  196. a77a687 2026-07-30 auto-save: 2026-07-30T19:50:45 (2 files) — src/ingest/parcels/arcgis_sales.ts src/jobs/hourly_loop.ts
  197. a5c9eb5 2026-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
  198. 77583bc 2026-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
  199. 1bf4cc4 2026-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
  200. 7241fde 2026-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
  201. 0846541 2026-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
  202. b569855 2026-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
  203. 0321546 2026-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
  204. 908d603 2026-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)
  205. 82774fe 2026-07-30 Make listings CAP env-tunable (USRE_LISTINGS_CAP, default 100) to grow homes from compliant adapters
  206. 153944d 2026-07-30 Fix places-seed pickMetro CTE scope bug (r.name->name); unblocks 106-failure loop stall
  207. 1dbfb57 2026-07-30 auto-save: 2026-07-30T09:16:33 (3 files) — cap_viewport.cjs herocap.cjs livetest.cjs
  208. e0d59e0 2026-07-30 auto-save: 2026-07-30T08:16:08 (4 files) — cap_mobile.cjs cap_search2.cjs cap_search3.cjs cap_webkit.cjs
  209. a453373 2026-07-30 auto-save: 2026-07-30T07:45:45 (1 files) — cap_search.cjs
  210. 6ba57b9 2026-07-29 docs: update PARCEL-COVERAGE.md — 28 counties / 6.6M parcels, 11 states, west-coast pipeline (TK-5/TK-16)
  211. c783195 2026-07-28 chore: version bump v0.16.1 (session close — nyc_pluto 08P01 fix)
  212. f6fb527 2026-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
  213. 23c88a6 2026-07-28 feat: RENTV data feed over usre DB (:9796) — brokers/firms/commercial parcels/subleases/regions
  214. 6ff7a81 2026-07-28 TK-50: field-level provenance across ALL remaining parcel ingesters
  215. 536b408 2026-07-28 parcels: field-level data provenance — source every parcel field to (feed + attr + time + raw)
  216. 1c33393 2026-07-28 parcels: guard null/placeholder/junk owner names — shared sanitizeOwnerName() at upsert chokepoint
  217. f01d750 2026-07-28 parcels: add Fulton County GA / Atlanta (13121) — dedicated rich full-universe adapter
  218. 994fedb 2026-07-28 parcels: guard negative sale prices — shared sanitizeSalePrice() across king_wa + arcgis
  219. 1e35d6a 2026-07-28 parcels: add Yakima County WA (53077) free priced-deed feed
  220. f29163c 2026-07-27 parcels: add Bexar County TX / San Antonio (48029) — dedicated rich full-universe adapter
  221. 0e3ce56 2026-07-27 parcels: add Tarrant County TX / Fort Worth (48439) — dedicated rich full-universe adapter
  222. 0bae506 2026-07-27 parcels: extend deed-date sanity guard to franklin_oh, king_wa, nyc_acris
  223. 8934410 2026-07-27 parcels: centralize deed-date sanity guard across all 4 deed ingesters
  224. de29c39 2026-07-27 parcels: add Marion County OR / Salem (41047) free priced-deed feed
  225. 180998f 2026-07-27 parcels: add Klamath County OR (41035) free priced-deed feed
  226. 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)
  227. 9ab361e 2026-07-26 USRE geo-search: recent searches (localStorage) shown on empty focus + clear (v0.15.0)
  228. 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)
  229. 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)
  230. 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)
  231. c5b668f 2026-07-26 USRE Map: URL-shareable county filters + on-map Copy link (parity with grid) (v0.11.0)
  232. c246a3b 2026-07-26 USRE grid: URL-shareable filters — sync filters/search/sort to query string + Copy link button (bookmarkable views) (v0.10.0)
  233. 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)
  234. bb39923 2026-07-26 USRE Map: persist county filters to localStorage + active-filter chips (harmonize w/ grid) (v0.9.0)
  235. eed29a4 2026-07-26 saltlake: contrarian polish — drop dead EFFBUILT_YR fallback + filter attribute-less ROW ghost parcels
  236. afd616a 2026-07-26 auto-save: 2026-07-26T20:15:38 (1 files) — _vpmf.mjs
  237. b761f11 2026-07-26 parcels: add Salt Lake County UT (49035) — 393k parcels, market value+sqft+year (DTD-B fresh state)
  238. 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)
  239. 46b0b58 2026-07-26 USRE grid: polished empty state — icon + message + one-click Clear all filters CTA (v0.7.1)
  240. 966b628 2026-07-26 USRE grid: CSV export honors active filters — export filtered+sorted rows client-side (was dumping ALL rows) (v0.7.0)
  241. 6e08a2b 2026-07-26 auto-save: 2026-07-26T17:14:46 (2 files) — src/ingest/parcels/engine.ts src/ingest/parcels/saltlake_ut.ts
  242. 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)
  243. 02bd28c 2026-07-26 auto-save: 2026-07-26T16:44:36 (2 files) — public/crcp-grid.css public/crcp-grid.js
  244. 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
  245. 9ca6907 2026-07-26 Refine: add situs addresses to Sonoma/Maricopa/Thurston deed feeds + global future-date guard (dropped 39 bad-entry future sales)
  246. 55b0bc6 2026-07-26 USRE grid: active-filter summary bar + one-click clear-all; rail now renders from filter state (v0.5.0)
  247. 5f9ea95 2026-07-26 chore: v0.3.0 → v0.4.0 (session close — all-data-point filters + hamburger nav)
  248. 45f04ac 2026-07-26 Add Palm Beach FL deed adapter (complements parallel session's Miami-Dade); FL scout findings logged
  249. 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
  250. 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
  251. 4d66223 2026-07-26 USRE Markets: left-rail filters now cover ALL data points (derived from FIELDS)
  252. d32c870 2026-07-26 wake: optimize bulk-flag UPDATE to pkey join (was 53min JSONB-expr seq-scan on 5M-row prod table)
  253. 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
  254. 467ca96 2026-07-26 Add King County WA (2.4M full-history deeds) to loop on weekly cadence
  255. d39bdf3 2026-07-26 wake: contrarian gate fixes — all-zero deed sentinel + pre-1971 epoch date
  256. 8699785 2026-07-26 parcels: add Wake County NC (37183) — 437k parcels, richest layer (owner+assessed value+sqft+year+sale)
  257. 4118d04 2026-07-26 parcel coverage: record Broward (WAF) + Palm Beach (cached-only) FL dead-ends for next pass
  258. ffad429 2026-07-26 brokers: add CT broker-side REB roster (fwpc-pgqj) — 16.8k brokers + 4.9k firms
  259. d409f98 2026-07-26 miami: contrarian gate fixes — placeholder-deed bulk false-positive + ghost sale events
  260. 7dfbf4f 2026-07-26 parcels: add Miami-Dade FL (12086) via keyless ArcGIS PaGis — 937k parcels + 2.06M sales
  261. 9305f09 2026-07-26 auto-save: 2026-07-26T09:42:34 (2 files) — src/ingest/parcels/engine.ts src/ingest/parcels/miami_dade.ts
  262. aa4b31c 2026-07-26 franklin: contrarian gate fixes — full-timestamp dedupe + bulk-sale price nulling
  263. 4c2251e 2026-07-26 parcels: add Franklin County OH (39049) via .gdb + GDAL — 122k parcels w/ owner/address/sqft/sale
  264. 32c8646 2026-07-26 Deschutes pageSize=1000 (server page cap) so pagination continues
  265. 9a64e4e 2026-07-26 Add Deschutes County OR deed adapter (real grantor/grantee NAMES + price, two sales/parcel)
  266. 90f2a67 2026-07-26 Spokane: per-source pageSize=500 (slow MapServer); all 3 deed adapters working
  267. 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
  268. c452e2e 2026-07-26 ct_dcp: normalize credential code to canonical RES.# source_id (contrarian gate fix)
  269. a74ceb3 2026-07-26 brokers: license_status filter (?status=active) on /api/brokers + Active-only UI toggle on directory
  270. 4b82a3d 2026-07-26 auto-save: 2026-07-26T08:11:40 (1 files) — src/server/index.ts
  271. 9c0ce40 2026-07-26 Parcel coverage: 2026-07-26 re-probe intel (Franklin OH shp-dep, Wake drift, Miami off-Socrata)
  272. 61b8b5c 2026-07-26 CT broker upgrade: full DCP salesperson roster (eqtn-rppv), 18k->97k w/ status+city+firm linkage
  273. 9e65b77 2026-07-26 Self-correct: gate silent-break detection behind stableVolume flag (paging/rotating jobs have variable counts, don't false-degrade)
  274. 854bc7a 2026-07-26 Generalize SD adapter Poway->county-wide sweep (1.09M parcels, per-scope cursor, per-parcel city); loop sweeps county
  275. f195028 2026-07-26 Property page: render deed events + public-record links (deep vs search-portal)
  276. 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
  277. a2c4ea6 2026-07-26 Poway property-history pilot: SanGIS parcels + deed events + public-record links + property-page surfacing
  278. aa800ba 2026-07-26 Per-state broker health + West-Coast-first geographic Places sweep + coverage board
  279. 33b1468 2026-07-26 Add /health engine status board + /api/ingest-health route
  280. 7ced2c2 2026-07-25 Self-correcting engine: health-aware loop (backoff, quarantine+probe, silent-break detection, per-source baseline)
  281. 2b38f61 2026-07-25 auto-save: 2026-07-25T13:36:34 (2 files) — db/migrations/009_source_health.sql src/jobs/self_correct.ts
  282. 8b31083 2026-07-25 Add hourly self-balancing ingest loop + Google Places discovery seed (free-tier capped)
  283. 289894d 2026-07-24 fix(sublease): reject non-finite numerics + malformed dates in admin insert
  284. d7819af 2026-07-23 auth: add Scott login
  285. 8f27ada 2026-07-23 auth: add Boomer login (rentfree911)
  286. 2d8dfbe 2026-07-23 auth: support multiple Basic-Auth users (add Daniel), keep admin + env override
  287. 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)
  288. aa180e3 2026-07-22 add sublease inventory: table + /api/sublease GET + gated admin POST/DELETE
  289. 253038d 2026-07-22 Add /api/commercial/digest — one-shot marquee+briefs/recent/firms payload for RENTV syndication
  290. 17cdf50 2026-07-22 refresh-commercial: gate briefs on explicit REFRESH_BRIEFS=1 (deterministic; prod cron skips)
  291. 701cb10 2026-07-22 refresh-commercial: gate briefs on actual model name (prod has empty ollama, must skip)
  292. f5468f1 2026-07-22 Fix refresh-commercial Ollama check: curl -sf + grep models (prod :11434 404 no longer triggers briefs)
  293. 2bfd4ff 2026-07-22 Add refresh-commercial.sh — daily refresh of CA DRE registry + LA commercial data
  294. 948bf60 2026-07-22 Deepen LA: commercial property-detail page unifying facts + brief + comps + firms
  295. 45be23a 2026-07-22 Phase 5: CA DRE broker registry (FREE) + LA broker/firm intel surface
  296. 04a19e4 2026-07-22 Phase 4: generated commercial news briefs (local Ollama, $0)
  297. 5de9ab3 2026-07-22 auto-save: 2026-07-22T07:12:00 (1 files) — db/migrations/006_commercial_briefs.sql
  298. 0b1ee1d 2026-07-22 Wire Commercial into main site nav across all pages (discoverability)
  299. 613b106 2026-07-22 LA commercial RE layer: taxonomy + materialized 153.9k parcels + explorer & news feed
  300. e3663e8 2026-07-21 NYC ACRIS recorded sales -> PLUTO parcels (188k lots, 5 boroughs, $0 open data)
  301. 14c95a8 2026-07-21 auto-save: 2026-07-21T19:09:20 (2 files) — src/ingest/parcels/nyc_acris.ts src/server/property.ts
  302. 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
  303. 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
  304. 6b55694 2026-07-21 README: real coverage (5.78M parcels/8 counties, 1.5M brokers/7 states, firm crawl, King deed sales, /sources.html)
  305. 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
  306. 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)
  307. 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
  308. a808341 2026-07-21 Consolidate agent M-P2/wave-2 work: Cook IL parcel adapter, parcel + broker coverage matrices
  309. 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
  310. 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/
  311. 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
  312. 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)
  313. 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/
  314. 58c461c 2026-07-21 CSV export on rankings (/api/markets.csv, type-synced download button) — analyst data pull
  315. 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
  316. fabf9ec 2026-07-21 auto-save: 2026-07-21T15:38:16 (1 files) — src/jobs/broker_rotate.ts
  317. 511984e 2026-07-21 Perf: 5-min in-process cache on /api/markets (1.8s scan -> ms on warm hits)
  318. db8222e 2026-07-21 Market detail: Climate Risk (FEMA NRI) + Rental Market (HUD FMR + ZORI vs FMR note) panels; favicons across pages; README
  319. 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
  320. dd7b002 2026-07-21 Map page: Top Markets strip (top-8 ranked, clickable to detail) + Brokers nav link
  321. bf3451d 2026-07-21 auto-save: 2026-07-21T14:38:01 (1 files) — src/enrich/firm_website_discovery.ts
  322. 12bd5ee 2026-07-21 CBSA crosswalk backfill: 1915 counties get cbsa_code from Census delineation file (fixes null metro on property Location panel)
  323. 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
  324. 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
  325. d8824b4 2026-07-21 CCK#2 verified fixes: HTML-escape admin provenance fields, guard localStorage (Safari private)
  326. 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
  327. a7a865e 2026-07-21 M5 complete: watchlist/alerts/admin routes mounted and verified live (watchlist CRUD, alerts feed, provenance cards, run-now)
  328. 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
  329. 439b0e1 2026-07-21 M5: watchlist/alerts/admin routes as mountable module (2-line wire after broker-track merge)
  330. f42ca12 2026-07-21 M5 (partial): refresh orchestrator, alerts checker, monthly launchd plist, watchlist + admin pages (server endpoints pending broker-agent merge)
  331. 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
  332. 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)
  333. 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
  334. 509b9f8 2026-07-21 M2: Zillow ZHVI/ZORI + Redfin tracker ingests (1.19M rows), crosswalk w/ overrides, dark Leaflet county choropleth
  335. 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)
  336. 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

  • /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

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

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

204 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 68ms