Commercialrealestate

repo: ~/Projects/commercialrealestate · 535 commits · 15 in last 24h, 107 in last 7d · ▅▆█▆▇▆▆

Search the build

535 commits indexed

  1. 133d016 2026-07-28 auto-save: 2026-07-28T07:28:16 (1 files) — data/alerts-state.json
  2. c6d781a 2026-07-28 auto-save: 2026-07-28T06:58:06 (1 files) — data/residential-report.html
  3. 824f263 2026-07-28 auto-save: 2026-07-28T06:27:56 (5 files) — data/condos-redfin.json data/map-points.json data/qwen-cache.json data/ranked.json data/sfr-redfin.json
  4. 05120b1 2026-07-28 auto-save: 2026-07-28T05:57:47 (3 files) — data/crcp-drift-state.json data/latest.json data/listings.json
  5. 4de4dbc 2026-07-28 auto-save: 2026-07-28T04:27:17 (1 files) — data/brokers-snapshot.json
  6. e2a4ff3 2026-07-28 auto-save: 2026-07-28T00:56:07 (1 files) — data/residential-report.html
  7. b176287 2026-07-28 auto-save: 2026-07-28T00:25:56 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  8. c091e8e 2026-07-27 auto-save: 2026-07-27T23:55:46 (2 files) — data/crcp-drift-state.json data/latest.json
  9. d1fae03 2026-07-27 auto-save: 2026-07-27T18:53:10 (1 files) — data/residential-report.html
  10. 0fb1844 2026-07-27 auto-save: 2026-07-27T18:22:43 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  11. 1410e3f 2026-07-27 auto-save: 2026-07-27T17:52:34 (2 files) — data/crcp-drift-state.json data/latest.json
  12. 2845c45 2026-07-27 afternoon CRE update 2026-07-27
  13. e360947 2026-07-27 auto-save: 2026-07-27T12:50:40 (1 files) — data/residential-report.html
  14. cb49ede 2026-07-27 auto-save: 2026-07-27T12:20:30 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  15. d9221ee 2026-07-27 auto-save: 2026-07-27T11:50:21 (2 files) — data/crcp-drift-state.json data/latest.json
  16. c4e95ba 2026-07-27 auto-save: 2026-07-27T07:18:47 (1 files) — data/alerts-state.json
  17. 16a192f 2026-07-27 weekly unwarrantable-condos report 2026-07-27
  18. d9400f1 2026-07-27 auto-save: 2026-07-27T06:18:28 (5 files) — data/condos-redfin.json data/map-points.json data/qwen-cache.json data/ranked.json data/sfr-redfin.json
  19. bf29804 2026-07-27 auto-save: 2026-07-27T05:48:20 (3 files) — data/crcp-drift-state.json data/latest.json data/listings.json
  20. c793907 2026-07-27 weekly Crexi refresh 2026-07-27
  21. 1b76b6d 2026-07-27 auto-save: 2026-07-27T04:17:53 (1 files) — data/brokers-snapshot.json
  22. 11e408e 2026-07-27 auto-save: 2026-07-27T00:46:55 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  23. 11abb76 2026-07-27 auto-save: 2026-07-27T00:16:47 (1 files) — data/condos-redfin.json
  24. 61969cf 2026-07-26 auto-save: 2026-07-26T23:46:40 (2 files) — data/crcp-drift-state.json data/latest.json
  25. 2d4c80b 2026-07-26 auto-save: 2026-07-26T18:45:13 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  26. 3a4b400 2026-07-26 auto-save: 2026-07-26T18:15:03 (1 files) — data/condos-redfin.json
  27. 8a68ec4 2026-07-26 auto-save: 2026-07-26T17:44:55 (2 files) — data/crcp-drift-state.json data/latest.json
  28. c547420 2026-07-26 afternoon CRE update 2026-07-26
  29. 6bd7f50 2026-07-26 auto-save: 2026-07-26T12:43:27 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  30. 110ac64 2026-07-26 auto-save: 2026-07-26T12:13:19 (3 files) — data/condos-redfin.json data/crcp-drift-state.json data/latest.json
  31. b74cbab 2026-07-26 auto-save: 2026-07-26T07:11:20 (1 files) — data/alerts-state.json
  32. 12bb971 2026-07-26 auto-save: 2026-07-26T06:41:11 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  33. 03edf25 2026-07-26 auto-save: 2026-07-26T06:11:02 (5 files) — data/condos-redfin.json data/crcp-drift-state.json data/latest.json data/qwen-cache.json data/ranked.json
  34. 59eaec2 2026-07-26 auto-save: 2026-07-26T05:40:54 (1 files) — data/listings.json
  35. 6fe0d5f 2026-07-26 auto-save: 2026-07-26T04:40:35 (1 files) — data/brokers-snapshot.json
  36. e17a200 2026-07-26 auto-save: 2026-07-26T00:39:31 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  37. 56eda3b 2026-07-26 auto-save: 2026-07-26T00:09:22 (3 files) — data/condos-redfin.json data/crcp-drift-state.json data/latest.json
  38. e78904b 2026-07-25 auto-save: 2026-07-25T18:37:55 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  39. 47170fd 2026-07-25 auto-save: 2026-07-25T18:07:45 (2 files) — data/crcp-drift-state.json data/latest.json
  40. 4440d47 2026-07-25 afternoon CRE update 2026-07-25
  41. 4fabfad 2026-07-25 auto-save: 2026-07-25T12:36:15 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  42. 27e17b2 2026-07-25 auto-save: 2026-07-25T12:06:06 (2 files) — data/crcp-drift-state.json data/latest.json
  43. 379ab20 2026-07-25 CRCP: harden serve.js — atomic brokers-snapshot write (H3) + clip /api/comps inputs before child-process env (H2)
  44. aeb0028 2026-07-25 CRCP: graceful-degrade /api/brokers/linkedin + /api/segments to 200+unavailable on DB error (match /api/leads/top; clean prod console)
  45. 44f86d6 2026-07-25 CRCP: scrub persona flag_reason twin in broker-history-pilot.json (agent-caught residual)
  46. 1c035bb 2026-07-25 CRCP: remove verified Frank residuals — served flag_reason string + linkedin localStorage key (contrarian-caught)
  47. 14f019d 2026-07-25 CRCP: drop Frank signature from agentDraft signoff (parity with live)
  48. 1ba902c 2026-07-25 auto-save: 2026-07-25T07:04:29 (1 files) — data/alerts-state.json
  49. 5d4b7cf 2026-07-25 auto-save: 2026-07-25T06:34:19 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  50. f96d44b 2026-07-25 auto-save: 2026-07-25T06:04:08 (4 files) — data/crcp-drift-state.json data/latest.json data/qwen-cache.json data/ranked.json
  51. e8eef16 2026-07-25 auto-save: 2026-07-25T05:33:58 (1 files) — data/listings.json
  52. 0673a1d 2026-07-25 auto-save: 2026-07-25T04:33:37 (1 files) — data/brokers-snapshot.json
  53. 0a1a3b8 2026-07-25 auto-save: 2026-07-25T00:32:03 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  54. a6b4cb3 2026-07-25 auto-save: 2026-07-25T00:01:48 (2 files) — data/crcp-drift-state.json data/latest.json
  55. aa4300a 2026-07-24 auto-save: 2026-07-24T18:59:11 (1 files) — data/residential-report.html
  56. 8df63a0 2026-07-24 auto-save: 2026-07-24T18:29:03 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  57. c617b9e 2026-07-24 auto-save: 2026-07-24T17:58:56 (2 files) — data/crcp-drift-state.json data/latest.json
  58. 9989efc 2026-07-24 auto-save: 2026-07-24T13:58:01 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  59. 817e696 2026-07-24 auto-save: 2026-07-24T13:27:55 (1 files) — data/condos-redfin.json
  60. 692b573 2026-07-24 afternoon CRE update 2026-07-24
  61. 12891e3 2026-07-24 auto-save: 2026-07-24T12:57:48 (1 files) — data/residential-report.html
  62. faa7715 2026-07-24 auto-save: 2026-07-24T11:57:36 (1 files) — data/latest.json
  63. 0a55b7c 2026-07-24 serve.js: handle EADDRINUSE gracefully to stop launchd crash-restart storm
  64. 5cfe1b7 2026-07-24 auto-save: 2026-07-24T07:26:03 (1 files) — data/alerts-state.json
  65. 848c833 2026-07-24 auto-save: 2026-07-24T06:55:55 (1 files) — data/residential-report.html
  66. 35f50c4 2026-07-24 auto-save: 2026-07-24T06:25:47 (5 files) — data/condos-redfin.json data/map-points.json data/qwen-cache.json data/ranked.json data/sfr-redfin.json
  67. 9e485a8 2026-07-24 auto-save: 2026-07-24T05:55:40 (3 files) — data/crcp-drift-state.json data/latest.json data/listings.json
  68. 562c550 2026-07-24 auto-save: 2026-07-24T04:25:19 (1 files) — data/brokers-snapshot.json
  69. 549bd00 2026-07-24 auto-save: 2026-07-24T00:54:30 (1 files) — data/residential-report.html
  70. b719f7f 2026-07-24 auto-save: 2026-07-24T00:24:22 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  71. 89a78b8 2026-07-23 auto-save: 2026-07-23T23:54:14 (2 files) — data/crcp-drift-state.json data/latest.json
  72. 72b1f15 2026-07-23 auto-save: 2026-07-23T18:53:06 (1 files) — data/residential-report.html
  73. 3ca9941 2026-07-23 auto-save: 2026-07-23T18:22:59 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  74. cc32513 2026-07-23 auto-save: 2026-07-23T17:52:50 (2 files) — data/crcp-drift-state.json data/latest.json
  75. 9ce5a12 2026-07-23 Remove Frank + Arcstone from CRCP entirely
  76. 6ad26c3 2026-07-23 auto-save: 2026-07-23T14:52:02 (1 files) — scripts/serve.js
  77. 2dd4383 2026-07-23 afternoon CRE update 2026-07-23
  78. f5983b7 2026-07-23 auto-save: 2026-07-23T12:51:13 (1 files) — data/residential-report.html
  79. 79a87bf 2026-07-23 auto-save: 2026-07-23T12:20:57 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  80. 1e1b5d4 2026-07-23 auto-save: 2026-07-23T11:50:46 (2 files) — data/crcp-drift-state.json data/latest.json
  81. ef98b50 2026-07-23 auto-save: 2026-07-23T07:19:17 (1 files) — data/alerts-state.json
  82. 47d0402 2026-07-23 auto-save: 2026-07-23T06:49:07 (1 files) — data/residential-report.html
  83. 8989a9a 2026-07-23 auto-save: 2026-07-23T06:19:01 (5 files) — data/condos-redfin.json data/map-points.json data/qwen-cache.json data/ranked.json data/sfr-redfin.json
  84. 626986c 2026-07-23 auto-save: 2026-07-23T05:48:54 (3 files) — data/crcp-drift-state.json data/latest.json data/listings.json
  85. ad5f786 2026-07-23 auto-save: 2026-07-23T04:18:33 (1 files) — data/brokers-snapshot.json
  86. 00fe392 2026-07-23 auto-save: 2026-07-23T00:47:42 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  87. 1a365cb 2026-07-23 auto-save: 2026-07-23T00:17:34 (1 files) — data/condos-redfin.json
  88. 1ff3327 2026-07-22 auto-save: 2026-07-22T23:47:26 (2 files) — data/crcp-drift-state.json data/latest.json
  89. 4fc1648 2026-07-22 auto-save: 2026-07-22T18:46:04 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  90. ef7ac33 2026-07-22 auto-save: 2026-07-22T18:15:55 (1 files) — data/condos-redfin.json
  91. 94e297a 2026-07-22 auto-save: 2026-07-22T17:45:47 (2 files) — data/crcp-drift-state.json data/latest.json
  92. b26c96e 2026-07-22 afternoon CRE update 2026-07-22
  93. d6344aa 2026-07-22 auto-save: 2026-07-22T12:44:11 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  94. ff42194 2026-07-22 auto-save: 2026-07-22T12:13:58 (1 files) — data/condos-redfin.json
  95. a48bdc9 2026-07-22 auto-save: 2026-07-22T11:43:42 (2 files) — data/crcp-drift-state.json data/latest.json
  96. 96016d6 2026-07-22 auto-save: 2026-07-22T07:12:00 (1 files) — data/alerts-state.json
  97. bd69f71 2026-07-22 auto-save: 2026-07-22T06:41:50 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  98. 70f8f73 2026-07-22 auto-save: 2026-07-22T06:11:42 (5 files) — data/condos-redfin.json data/crcp-drift-state.json data/latest.json data/qwen-cache.json data/ranked.json
  99. c07f881 2026-07-22 auto-save: 2026-07-22T05:41:36 (1 files) — data/listings.json
  100. 020a326 2026-07-22 auto-save: 2026-07-22T04:41:22 (1 files) — data/brokers-snapshot.json
  101. 5c012e5 2026-07-22 auto-save: 2026-07-22T00:40:31 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  102. 1efb63e 2026-07-22 auto-save: 2026-07-22T00:10:24 (3 files) — data/condos-redfin.json data/crcp-drift-state.json data/latest.json
  103. 40f7d2c 2026-07-21 auto-save: 2026-07-21T18:39:12 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  104. 09719d7 2026-07-21 auto-save: 2026-07-21T18:09:04 (3 files) — data/condos-redfin.json data/crcp-drift-state.json data/latest.json
  105. 5031cac 2026-07-21 afternoon CRE update 2026-07-21
  106. b79b5cc 2026-07-21 auto-save: 2026-07-21T12:37:29 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  107. 5e32693 2026-07-21 auto-save: 2026-07-21T12:07:22 (2 files) — data/crcp-drift-state.json data/latest.json
  108. e2798c8 2026-07-21 auto-save: 2026-07-21T07:06:14 (1 files) — data/alerts-state.json
  109. 9c375cc 2026-07-21 auto-save: 2026-07-21T06:36:08 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  110. 427fad1 2026-07-21 auto-save: 2026-07-21T06:06:01 (4 files) — data/crcp-drift-state.json data/latest.json data/qwen-cache.json data/ranked.json
  111. e29def0 2026-07-21 auto-save: 2026-07-21T05:35:54 (1 files) — data/listings.json
  112. adc59c0 2026-07-21 auto-save: 2026-07-21T04:35:41 (1 files) — data/brokers-snapshot.json
  113. 22589dc 2026-07-21 auto-save: 2026-07-21T00:34:53 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  114. 610e16d 2026-07-21 auto-save: 2026-07-21T00:04:47 (2 files) — data/crcp-drift-state.json data/latest.json
  115. 139682b 2026-07-20 auto-save: 2026-07-20T18:33:36 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  116. cabc6de 2026-07-20 auto-save: 2026-07-20T18:03:31 (2 files) — data/crcp-drift-state.json data/latest.json
  117. 3c101f7 2026-07-20 afternoon CRE update 2026-07-20
  118. 426f721 2026-07-20 auto-save: 2026-07-20T13:02:15 (1 files) — data/.pre-afternoon-ids.json
  119. 5afbd03 2026-07-20 auto-save: 2026-07-20T12:32:08 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  120. 6ab6fe8 2026-07-20 auto-save: 2026-07-20T12:02:00 (2 files) — data/crcp-drift-state.json data/latest.json
  121. f679987 2026-07-20 weekly unwarrantable-condos report 2026-07-20
  122. 7fa0b2d 2026-07-20 auto-save: 2026-07-20T06:30:25 (6 files) — data/condos-redfin.json data/map-points.json data/qwen-cache.json data/ranked.json data/residential-report.html
  123. fa00934 2026-07-20 auto-save: 2026-07-20T06:00:16 (3 files) — data/crcp-drift-state.json data/latest.json data/listings.json
  124. e5bde07 2026-07-20 weekly Crexi refresh 2026-07-20
  125. a8e1e5d 2026-07-20 auto-save: 2026-07-20T04:29:52 (1 files) — data/brokers-snapshot.json
  126. 6d0e97d 2026-07-20 auto-save: 2026-07-20T00:59:05 (1 files) — data/residential-report.html
  127. 42378f4 2026-07-20 auto-save: 2026-07-20T00:28:58 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  128. b8be3a9 2026-07-19 auto-save: 2026-07-19T23:58:51 (2 files) — data/crcp-drift-state.json data/latest.json
  129. 6f5842c 2026-07-19 auto-save: 2026-07-19T18:57:38 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  130. 1c26b57 2026-07-19 auto-save: 2026-07-19T18:27:32 (1 files) — data/condos-redfin.json
  131. 9e13347 2026-07-19 auto-save: 2026-07-19T17:57:26 (2 files) — data/crcp-drift-state.json data/latest.json
  132. a011bd5 2026-07-19 afternoon CRE update 2026-07-19
  133. deb74cc 2026-07-19 auto-save: 2026-07-19T12:56:25 (1 files) — data/residential-report.html
  134. 8e30689 2026-07-19 auto-save: 2026-07-19T12:26:19 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  135. f8f067d 2026-07-19 auto-save: 2026-07-19T11:56:13 (2 files) — data/crcp-drift-state.json data/latest.json
  136. 8689c73 2026-07-19 auto-save: 2026-07-19T07:25:16 (1 files) — data/alerts-state.json
  137. 9fcbcf2 2026-07-19 auto-save: 2026-07-19T06:55:10 (1 files) — data/residential-report.html
  138. a167174 2026-07-19 auto-save: 2026-07-19T06:25:04 (5 files) — data/condos-redfin.json data/map-points.json data/qwen-cache.json data/ranked.json data/sfr-redfin.json
  139. c7c4d5f 2026-07-19 auto-save: 2026-07-19T05:54:59 (3 files) — data/crcp-drift-state.json data/latest.json data/listings.json
  140. 8a2a3cb 2026-07-19 auto-save: 2026-07-19T04:24:38 (1 files) — data/brokers-snapshot.json
  141. 19f69e7 2026-07-19 auto-save: 2026-07-19T00:53:53 (1 files) — data/residential-report.html
  142. 29b4556 2026-07-19 auto-save: 2026-07-19T00:23:46 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  143. 1e6f278 2026-07-18 auto-save: 2026-07-18T23:53:39 (2 files) — data/crcp-drift-state.json data/latest.json
  144. 0884164 2026-07-18 auto-save: 2026-07-18T18:52:32 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  145. 3741ee3 2026-07-18 auto-save: 2026-07-18T18:22:25 (1 files) — data/condos-redfin.json
  146. 6577927 2026-07-18 auto-save: 2026-07-18T17:52:20 (2 files) — data/crcp-drift-state.json data/latest.json
  147. 619a1c4 2026-07-18 afternoon CRE update 2026-07-18
  148. aa05013 2026-07-18 auto-save: 2026-07-18T12:51:21 (1 files) — data/residential-report.html
  149. 999a61b 2026-07-18 auto-save: 2026-07-18T12:21:15 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  150. 8af7429 2026-07-18 auto-save: 2026-07-18T11:51:10 (2 files) — data/crcp-drift-state.json data/latest.json
  151. 6dd4f8c 2026-07-18 auto-save: 2026-07-18T07:20:11 (1 files) — data/alerts-state.json
  152. b1a6612 2026-07-18 auto-save: 2026-07-18T06:50:05 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  153. 08fa5ae 2026-07-18 auto-save: 2026-07-18T06:19:57 (3 files) — data/condos-redfin.json data/qwen-cache.json data/ranked.json
  154. 95c2d5a 2026-07-18 auto-save: 2026-07-18T05:49:50 (3 files) — data/crcp-drift-state.json data/latest.json data/listings.json
  155. 037a998 2026-07-18 auto-save: 2026-07-18T04:19:30 (1 files) — data/brokers-snapshot.json
  156. 253c0ef 2026-07-18 auto-save: 2026-07-18T00:48:43 (1 files) — data/residential-report.html
  157. 580d911 2026-07-18 auto-save: 2026-07-18T00:18:37 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  158. 406b25d 2026-07-17 auto-save: 2026-07-17T23:48:30 (2 files) — data/crcp-drift-state.json data/latest.json
  159. 6965193 2026-07-17 auto-save: 2026-07-17T19:47:29 (6 files) — data/condos-redfin.json data/crcp-drift-state.json data/latest.json data/map-points.json data/residential-report.html
  160. 99ea9db 2026-07-17 afternoon CRE update 2026-07-17
  161. f8421a4 2026-07-17 chore: lint (fix shadowed var), v0.11.0 (session close)
  162. d438cb4 2026-07-17 CRCP License Directory: agents/firms/title/escrow from cre license DB (4615 agents, 707 firms) as contactable cards w/ firm-IG inline, sort+density; export script; +title/escrow IG handles
  163. 50009ed 2026-07-17 CRCP firm-IG: render inline & LINK-FREE under agent-contact cards (honor no-outside-links); unify leads strip to same global renderer
  164. 3db44ca 2026-07-17 chore: refactor (drop dead toggleExpand), lint pass, v0.10.0 (session close)
  165. 4211af8 2026-07-17 CRCP firm-IG: cache thumbnails locally (fix IG hotlink block), +7 firms (CBRE/JLL/Cushman/Newmark/Elliman/BHHS-CA), short-alias matching
  166. 79bc0cf 2026-07-17 Consolidate everything into ONE tabbed Agent window (links OK again)
  167. 4d0bb9f 2026-07-17 Agent CRM: all-inline (no outside links) + inline Notes field
  168. ed5770b 2026-07-17 Harden agent-contact CRM (contrarian gate): serialize writes, stable letter ids, XSS guards
  169. 5a19595 2026-07-17 serve.js: load project .env via native process.loadEnvFile (enables GEORGE_AUTH/GMAIL_BASIC_AUTH_B64 + fixes CENSUS_API_KEY loading)
  170. c164c3f 2026-07-17 Add gated Send-via-George button — creates a Gmail DRAFT (never sends)
  171. f503eb1 2026-07-17 Agent-contact CRM now on EVERY listing + card view (one modal everywhere)
  172. 123b0e3 2026-07-17 CRCP list view: sortable + fully hrefd rows, inline row expansion, and an Agent·contact column with save-date + saved-letter CRM
  173. cb778e7 2026-07-16 graceful-degrade /api/leads/frank + /api/broker (502 -> 200 when cre DB absent)
  174. b4b3c10 2026-07-16 add CRCP origin-vs-live drift canary (DTD verdict D)
  175. a8e4386 2026-07-16 add on-demand CRCP front-end deploy script (mac3->Kamatera)
  176. 0f635d9 2026-07-16 iPad fix sweep: crcp.html nav breakpoint 760->1024, licensed-agents badge width cap
  177. b59aea1 2026-07-16 afternoon CRE update 2026-07-16
  178. 1cdd91f 2026-07-16 iPad fix: header nav becomes swipeable strip + grid minmax, no horizontal overflow on tablet
  179. 30822fa 2026-07-16 auto-save: 2026-07-16T07:11:48 (1 files) — data/alerts-state.json
  180. 8f11f32 2026-07-16 auto-save: 2026-07-16T06:41:42 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  181. d1ce836 2026-07-16 auto-save: 2026-07-16T06:11:35 (3 files) — data/condos-redfin.json data/qwen-cache.json data/ranked.json
  182. e2e2609 2026-07-16 auto-save: 2026-07-16T05:41:28 (1 files) — data/listings.json
  183. e4a922a 2026-07-16 auto-save: 2026-07-16T04:41:14 (1 files) — data/brokers-snapshot.json
  184. 3aa29ff 2026-07-16 auto-save: 2026-07-16T00:40:23 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  185. 2679e35 2026-07-16 auto-save: 2026-07-16T00:10:17 (1 files) — data/condos-redfin.json
  186. d8dc685 2026-07-15 auto-save: 2026-07-15T18:39:06 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  187. c79df34 2026-07-15 afternoon CRE update 2026-07-15
  188. 259e52d 2026-07-15 auto-save: 2026-07-15T12:36:34 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  189. 0c5c19e 2026-07-15 auto-save: 2026-07-15T07:05:05 (1 files) — data/alerts-state.json
  190. 8b87f81 2026-07-15 auto-save: 2026-07-15T06:34:59 (6 files) — data/condos-redfin.json data/map-points.json data/qwen-cache.json data/ranked.json data/residential-report.html
  191. acc2464 2026-07-15 auto-save: 2026-07-15T05:34:45 (1 files) — data/listings.json
  192. 5a9fe71 2026-07-15 auto-save: 2026-07-15T04:34:32 (1 files) — data/brokers-snapshot.json
  193. b7d2707 2026-07-15 auto-save: 2026-07-15T00:33:42 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  194. 0ca3244 2026-07-14 auto-save: 2026-07-14T18:32:24 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  195. d3c8b8e 2026-07-14 afternoon CRE update 2026-07-14
  196. 136ce9d 2026-07-14 auto-save: 2026-07-14T13:01:14 (1 files) — data/.pre-afternoon-ids.json
  197. 8fcd14e 2026-07-14 auto-save: 2026-07-14T12:31:06 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  198. 5bdd0af 2026-07-14 auto-save: 2026-07-14T07:29:44 (1 files) — data/alerts-state.json
  199. 8ef3358 2026-07-14 auto-save: 2026-07-14T06:59:38 (1 files) — data/residential-report.html
  200. a374bb9 2026-07-14 auto-save: 2026-07-14T06:29:31 (5 files) — data/condos-redfin.json data/map-points.json data/qwen-cache.json data/ranked.json data/sfr-redfin.json
  201. e4a82c5 2026-07-14 auto-save: 2026-07-14T05:59:19 (1 files) — data/listings.json
  202. 384bd60 2026-07-14 auto-save: 2026-07-14T04:28:59 (1 files) — data/brokers-snapshot.json
  203. d5296c2 2026-07-14 auto-save: 2026-07-14T00:58:14 (1 files) — data/residential-report.html
  204. c0b3062 2026-07-14 auto-save: 2026-07-14T00:28:06 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  205. 92c3968 2026-07-13 auto-save: 2026-07-13T18:56:46 (1 files) — data/residential-report.html
  206. e87e3da 2026-07-13 auto-save: 2026-07-13T18:26:38 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  207. 34ace81 2026-07-13 afternoon CRE update 2026-07-13
  208. eee3d97 2026-07-13 auto-save: 2026-07-13T12:55:05 (1 files) — data/residential-report.html
  209. 779f41b 2026-07-13 auto-save: 2026-07-13T12:24:56 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  210. 2f57420 2026-07-13 auto-save: 2026-07-13T11:24:39 (1 files) — package-lock.json
  211. 471ec09 2026-07-13 chore: v0.9.1 — launchd bare-node PATH fix (session close)
  212. d16f1a4 2026-07-13 auto-save: 2026-07-13T10:54:28 (1 files) — data/brokers-snapshot.json
  213. 71b7a18 2026-07-13 fix: pin Homebrew PATH in refresh-broker-snapshot.sh (launchd bare-node bug)
  214. 8a22cdc 2026-07-13 auto-save: 2026-07-13T10:24:15 (1 files) — package-lock.json
  215. 701f6cd 2026-07-13 data: CRCP listings sweep +2 (palm-beach) from launchd kickstart verify
  216. 87cbbde 2026-07-13 chore: lint, refactor, v0.9.0 (session close)
  217. 96492dc 2026-07-13 auto-save: 2026-07-13T09:54:06 (1 files) — data/alerts-state.json
  218. d6c8616 2026-07-13 fix(launchd): pin PATH so node resolves — both CRCP jobs were failing (email exit127, listings N=0/node-not-found); contrarian caught it, kickstart-verified email now sends end-to-end
  219. 00b7b5b 2026-07-13 5x re-verify: homepage core 6/6 green, 0 JS errors; Jul-10 fixes held; 6 clickthrough fails = same triaged harness artifact
  220. 9ea52c8 2026-07-13 weekly unwarrantable-condos report 2026-07-13
  221. 448406f 2026-07-13 auto-save: 2026-07-13T06:23:11 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  222. 398ad29 2026-07-13 weekly Crexi refresh 2026-07-13
  223. 51399ad 2026-07-13 prod CRCP: snapshot fallback for stats top-brokers + id/website in snapshot top rows
  224. 47b4662 2026-07-13 find-email button: on-demand broker email hunt from their website (CRCP + broker grid)
  225. eec551f 2026-07-13 auto-save: 2026-07-13T00:51:43 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  226. dee1dce 2026-07-13 auto-save: 2026-07-13T00:21:34 (1 files) — data/condos-redfin.json
  227. cad0dba 2026-07-12 auto-save: 2026-07-12T22:51:02 (1 files) — scripts/install-alerts-launchd.sh
  228. 7bb0440 2026-07-12 auto-save: 2026-07-12T18:49:42 (1 files) — data/residential-report.html
  229. b699cec 2026-07-12 auto-save: 2026-07-12T18:19:36 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  230. 8d3a401 2026-07-12 afternoon CRE update 2026-07-12
  231. d5ea8e2 2026-07-12 auto-save: 2026-07-12T13:18:21 (2 files) — data/.pre-afternoon-ids.json data/last-refresh.json
  232. 5e73b20 2026-07-12 auto-save: 2026-07-12T12:48:16 (1 files) — data/residential-report.html
  233. f83266a 2026-07-12 auto-save: 2026-07-12T12:18:09 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  234. 24bc8a1 2026-07-12 CRCP alerts FIX-THEN-SHIP (contrarian+DTD-B): enforce per-subscriber cadence + watermarks, log untagged listings, gov seen-state sidecar (no main-state bloat), Browserbase cost logging
  235. 06ae110 2026-07-12 CRCP listings: all-metro Crexi sweep complete — 2,791 listings, 1,177 metro-tagged across 17 markets (+1,177 from baseline)
  236. cd428e0 2026-07-12 CRCP listings: daily rotating refresh (DTD verdict C) — ~3 metros/day, timeout-safe; launchd+recurring-spend gated
  237. 0a6e0fc 2026-07-12 CRCP email-alerts: opt-in gov-agent segment (DTD verdict C) — per-metro new-licensee diff, default stays low-noise
  238. 9500317 2026-07-12 broker-email: contrarian-driven hardening — exact last-name-token name-match, cross-domain block, vendor blocklist, shared-inbox dedup, colleague-sole-email guard
  239. 310925d 2026-07-12 auto-save: 2026-07-12T11:48:02 (2 files) — data/listings.json scripts/sweep-remaining-metros.sh
  240. beb4036 2026-07-12 broker-email: poison-guard sole-email on corporate megasite/office pages (mis-assigns stranger emails) + log-parse committer with rollback
  241. f93ac06 2026-07-12 broker-email-finder: hard per-broker timeout so a single hung site can't wedge the batch
  242. db7a5da 2026-07-12 Serve col-resize.js via dedicated no-cache route (revalidate-every-load) ahead of static mount
  243. c102c07 2026-07-12 auto-save: 2026-07-12T11:17:54 (2 files) — data/alerts-state.json data/listings.json
  244. 7d99a28 2026-07-12 CRCP email-alerts: George Basic Auth header + don't advance state on send failure (news-loss guard)
  245. 035640a 2026-07-12 CRCP email-alerts: fix George send (/api/send + body field) + wire token from george-gmail/.env
  246. d433ef8 2026-07-12 col-resize: add click-to-sort headers (asc/desc/reset, numeric-aware, blanks last)
  247. dd4abf6 2026-07-12 Add spreadsheet-style draggable column resizing (col-resize.js) to all table pages
  248. 367513f 2026-07-12 CRCP multi-metro listings sweep: generalize SFV Crexi scrape to all 21 metros + per-metro config; paid run gated
  249. 91621f0 2026-07-12 CRCP email-alerts: snapshot-diff engine + George send wiring (DTD verdict A), dry-run proven, launchd+send gated
  250. 52b71e1 2026-07-12 broker-email-finder: --browser tier (real system Chrome) recovers 403/anti-bot + JS-rendered sites; name-match disambiguates multi-agent firm pages
  251. 8861282 2026-07-12 CRCP gov data: regenerate snapshot with all 21 metros (top-expensive-cities) — prior export was in a blocked bash call and never ran
  252. 561fd54 2026-07-12 CRCP gov data: CT Greenwich (648, DCP eLicense API). Top-expensive-cities expansion: 19/20 loaded; WY Jackson walled (portal, no bulk)
  253. 86793a4 2026-07-12 CRCP gov data: CO Aspen/Telluride/Vail (777, DORA API) + FL luxury cities Palm Beach/Naples/Miami Beach (DBPR)
  254. 988e989 2026-07-12 CRCP gov data: CA luxury cities (Atherton/Beverly Hills/Malibu/Newport Beach/Montecito/Hillsborough/Woodside) city-level from DRE CurrList
  255. 32e449e 2026-07-12 CRCP gov data: 7 metros / 337,725 agents live-ready (add CA SF+Silicon Valley + TX statewide); cache gov metro snapshot reads (TX 40MB read once)
  256. a3f111a 2026-07-12 CRCP gov data: CA SF+Silicon Valley (13,714 from DRE bulk CurrList) + TX statewide (188,932 active, SB510 no-geo). 7 metros now
  257. 715d28a 2026-07-12 CRCP brokers: nightly snapshot refresh (launchd com.steve.crcp-broker-snapshot, sanity-gated, no-restart) + harden brokers-db PG user so it never silently defaults to root on prod
  258. 3141270 2026-07-12 CRCP: snapshot fallback for ALL broker endpoints (graph/top/enrich-stats/contact) via cached readBrokerSnap; broker snapshot now carries graph+top+enrichStats so brokers.html mind-map works on prod too
  259. c1d6709 2026-07-12 auto-save: 2026-07-12T08:17:05 (7 files) — data/brokers-snapshot.json public/broker-grid.html scripts/export-brokers-snapshot.js scripts/serve.js data/gov/
  260. 7b4fce3 2026-07-12 CRCP gov data: Las Vegas loaded (18,023 Clark-county licensees from NV Real Estate Division xlsx); 4 metros / 135,079 gov-licensed agents total
  261. 235cba4 2026-07-12 CRCP: fix empty prod broker-grid — snapshot fallback for /api/brokers/all (prod has no Postgres → was erroring 'role root does not exist'); export-brokers-snapshot.js + data/brokers-snapshot.json (2,537 w/ geo labels)
  262. 3d61200 2026-07-12 CRCP: FL DBPR CSV adapter — Miami (Dade county) 67,776 licensees loaded (brokers+salespersons, active); streaming quoted-CSV parser + batched upsert
  263. 7fe7597 2026-07-12 CRCP: NY metros loaded from gov data — NYC 47,019 + Hamptons 2,261 licensees (brokers+salespersons); batched upsert + office/branch filter
  264. cdf2871 2026-07-12 CRCP: multi-metro gov-license ingest — gov_licensed_agent table + NY DOS SODA API adapter; loaded Hamptons (2,617 licensees, $0, authoritative govt data)
  265. 068be0a 2026-07-12 CRCP broker grid: organize all fields into categories (Identity/Geography/Activity/Contact/Details) + grouped sort menu with optgroups; surface State + CA-Confidence as badged sortable columns; every field sortable
  266. 9939cbd 2026-07-12 CRCP: default broker view lists ALL brokers again (Steve: ok if not CA); ?scope=ca keeps the California-only cut
  267. bce9ae6 2026-07-12 auto-save: 2026-07-12T06:46:47 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  268. 4145664 2026-07-12 auto-save: 2026-07-12T06:16:42 (3 files) — data/condos-redfin.json data/qwen-cache.json data/ranked.json
  269. 7cc109c 2026-07-12 auto-save: 2026-07-12T00:45:38 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  270. fce8c2b 2026-07-12 auto-save: 2026-07-12T00:15:33 (1 files) — data/condos-redfin.json
  271. 7d08d22 2026-07-11 CRCP: pass-3 broker CA recovery — city-disambiguation (marginal) + listing-activity confirmation (234 brokers CA by operation of law); DB now 93.7% confirmed-California
  272. b1e900b 2026-07-11 CRCP: pass-2 fuzzy broker CA-DRE recovery (nickname+prefix, surname-search, single-person guard); fix norm-strips-comma parse bug
  273. f9af543 2026-07-11 auto-save: 2026-07-11T18:44:33 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  274. 801a86a 2026-07-11 auto-save: 2026-07-11T18:14:27 (1 files) — data/condos-redfin.json
  275. 894dfe0 2026-07-11 afternoon CRE update 2026-07-11
  276. 51162a1 2026-07-11 auto-save: 2026-07-11T12:43:24 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  277. f898564 2026-07-11 auto-save: 2026-07-11T12:13:17 (1 files) — data/condos-redfin.json
  278. de954cf 2026-07-11 CRCP: California-scope the broker DB — /api/brokers/all defaults to CA + unknown (hides 22 confirmed out-of-state; ?scope=all override). Backed by DRE cross-ref: 2,075/2,537 now confirmed CA
  279. 482a169 2026-07-11 CRCP: confirm unknown-geography brokers as CA via CA-DRE cross-ref (bridges cre.broker ↔ licensed-agents; $0 local, resumable)
  280. abbed74 2026-07-11 auto-save: 2026-07-11T06:42:06 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  281. 5ad18e1 2026-07-11 auto-save: 2026-07-11T06:12:00 (3 files) — data/condos-redfin.json data/qwen-cache.json data/ranked.json
  282. 7de1a84 2026-07-11 auto-save: 2026-07-11T00:41:01 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  283. 2bb63e5 2026-07-11 auto-save: 2026-07-11T00:10:56 (1 files) — data/condos-redfin.json
  284. 71cc617 2026-07-10 CRCP: contrarian fixes on broker rollup — disclose 123 broker-licensed non-supervisors, persist broker sort, guard agent re-fetch, reorder cleanBrokerName address-strip
  285. 93c2642 2026-07-10 CRCP: broker-level rollup view — /api/brokers/licensed + Agents⇄Brokers toggle (131 brokers from DRE responsible-broker field, $0)
  286. aa5fee6 2026-07-10 CRCP: full 556-agent DRE license snapshot (162 verified / 262 probable / 132 unmatched, 0 errors)
  287. b6bd885 2026-07-10 chore: v0.5.0 — DRE-licensed agents feature (session close)
  288. 1e4b467 2026-07-10 auto-save: 2026-07-10T18:39:55 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  289. 4c1be11 2026-07-10 auto-save: 2026-07-10T18:09:50 (1 files) — data/condos-redfin.json
  290. 6abac2e 2026-07-10 CRCP DRE: contrarian fixes — verified only on exact match, drop dead DB branch
  291. e914e06 2026-07-10 CRCP: DRE-licensed agents/brokers DB from CA public govt data
  292. a3bff78 2026-07-10 afternoon CRE update 2026-07-10
  293. 06a035c 2026-07-10 auto-save: 2026-07-10T12:38:21 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  294. 65dbb60 2026-07-10 5x: correct report scope note — verified deals/fha/rent-rolls are dashboards not catalogs
  295. a19ee81 2026-07-10 5x sweep 4 (contrarian follow-up): sort+density on broker-grid + condos grids; fix pre-existing favicon 404 on condos+graphics
  296. 9e62037 2026-07-10 5x: sweeps 2-3 clean + REPORT (clean twice, done)
  297. bb93e9c 2026-07-10 5x sweep 1: add sort select + density slider to mls.html grid (Steve grid rule); persisted, 0 JS errors
  298. 69e2760 2026-07-10 5x sweep 1: triage — clickthrough FAILs are phantom (wrong-app vocabulary), not defects
  299. 5aaf9b2 2026-07-10 auto-save: 2026-07-10T08:44:50 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  300. c71fc8d 2026-07-10 map: popup shows residential lifecycle — status (Active/In Escrow/Sold/Withdrawn) + days-on-market tags
  301. a8e7f8a 2026-07-10 auto-save: 2026-07-10T08:14:41 (1 files) — data/condos-redfin.json
  302. 92df973 2026-07-10 scrapers: capture LATITUDE/LONGITUDE from gis-csv -> lat/lng (was discarded)
  303. b11c287 2026-07-10 auto-save: 2026-07-10T06:44:22 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  304. a568ac4 2026-07-10 auto-save: 2026-07-10T06:14:15 (3 files) — data/condos-redfin.json data/qwen-cache.json data/ranked.json
  305. 4a6713e 2026-07-10 auto-save: 2026-07-10T00:43:01 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  306. df74842 2026-07-10 auto-save: 2026-07-10T00:12:54 (1 files) — data/condos-redfin.json
  307. 44256f4 2026-07-09 auto-save: 2026-07-09T18:41:42 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  308. 8cadaa2 2026-07-09 auto-save: 2026-07-09T18:11:36 (1 files) — data/condos-redfin.json
  309. f8b28f8 2026-07-09 afternoon CRE update 2026-07-09
  310. 6cc6166 2026-07-09 auto-save: 2026-07-09T12:40:29 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  311. e52657d 2026-07-09 auto-save: 2026-07-09T12:10:23 (1 files) — data/condos-redfin.json
  312. b2bccff 2026-07-09 auto-save: 2026-07-09T06:39:18 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  313. a64f26b 2026-07-09 auto-save: 2026-07-09T06:09:13 (3 files) — data/condos-redfin.json data/qwen-cache.json data/ranked.json
  314. f3ed4b0 2026-07-09 auto-save: 2026-07-09T00:38:11 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  315. 1b9dcd3 2026-07-08 auto-save: 2026-07-08T18:37:07 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  316. 14d68e4 2026-07-08 afternoon CRE update 2026-07-08
  317. 1258f68 2026-07-08 auto-save: 2026-07-08T12:35:41 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  318. 4fa17ee 2026-07-08 auto-save: 2026-07-08T06:34:26 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  319. bea08ab 2026-07-08 chore: version bump v0.4.1 (session close — auth gate)
  320. 6676926 2026-07-08 Gate crcp.agentabrams.com behind Basic Auth (admin/DW2024!); open /healthz for smoke test
  321. 08981d0 2026-07-08 auto-save: 2026-07-08T06:04:21 (2 files) — data/qwen-cache.json data/ranked.json
  322. eb10431 2026-07-08 auto-save: 2026-07-08T00:33:23 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  323. 5778fde 2026-07-07 auto-save: 2026-07-07T18:32:03 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  324. b7ae291 2026-07-07 chore: lint (syntax-check ✓), v0.3.1 → v0.4.0 (session close)
  325. 0ab08f2 2026-07-07 add fix-workspace-trust.js — restores hasTrustDialogAccepted after mac3 migration
  326. f81d920 2026-07-07 afternoon CRE update 2026-07-07
  327. 18f673e 2026-07-07 auto-save: 2026-07-07T13:30:45 (1 files) — data/last-refresh.json
  328. 7ffa8da 2026-07-07 crcp: auto-rebuild assessor SQLite on ingest + refresh/push wrapper
  329. df42174 2026-07-07 chore: v0.3.1 (session close)
  330. 13a73ac 2026-07-07 crcp: bridge 2.43M assessor roll to DB-less prod via read-only SQLite + honest miss copy
  331. f572b74 2026-07-07 auto-save: 2026-07-07T13:00:27 (1 files) — data/.pre-afternoon-ids.json
  332. 945fe2b 2026-07-07 auto-save: 2026-07-07T12:30:21 (4 files) — data/condos-redfin.json data/map-points.json data/residential-report.html data/sfr-redfin.json
  333. 7abb102 2026-07-07 auto-save: 2026-07-07T09:59:53 (3 files) — data/condos-redfin.json data/map-points.json data/sfr-redfin.json
  334. 0ddd365 2026-07-07 explorer: Fields section starts expanded (toggle cards visible on load); other left-panel sections stay collapsed
  335. bb11697 2026-07-07 explorer: density slider 1-10 (was 1-20, clamps saved values) + field toggles restyled as click-on/off cards (:has() keeps existing wiring)
  336. 79fb395 2026-07-07 auto-save: 2026-07-07T09:29:44 (1 files) — data/condos-redfin.json
  337. c37e141 2026-07-07 fix: export PATH in run-residential-refresh.sh — launchd's minimal PATH lacked /opt/homebrew/bin so node was not found; the scheduled 4x/day refresh would have silently failed every run
  338. 67dff5f 2026-07-07 map: residential on the map colored by status (Active/In Escrow/Sold/Withdrawn)
  339. d8dc3ea 2026-07-07 residential: price-drop tracking — 💸 Price Cut chip + report section
  340. 809771f 2026-07-07 auto-save: 2026-07-07T08:59:49 (2 files) — scripts/export-residential-snapshots.js scripts/serve.js
  341. 18bf3fc 2026-07-07 auto-save: 2026-07-07T08:59:35 (4 files) — scripts/export-residential-snapshots.js scripts/fetch-condos-redfin.js scripts/fetch-sfr-redfin.js scripts/db/price-drop-migration.sql
  342. bf516b7 2026-07-07 reports: refresh generated HTML (morning/afternoon/condos/residential pulse)
  343. eb0c10c 2026-07-07 residential report: LA Residential Pulse (SFR+condo) email — just listed / in escrow / just sold / fell out
  344. 8488362 2026-07-07 fix: raise /api/residential cap 12k->25k — SFR active grew past 12k, truncating off-market/sold rows off prod
  345. 27c5ece 2026-07-07 snapshots: escrow + DOM coverage (sfr 3860 escrow/13079 dom, condo 380 escrow/1578 dom)
  346. eb3ad19 2026-07-07 fix: condo fetchStatus referenced loop-scoped reg from outer closure -> captured 0; pass reg as param (matches SFR fetchRegion pattern)
  347. a31904e 2026-07-07 listings: real DAYS ON MARKET (gap-immune Just Listed) + In Escrow / Fell Out tabs
  348. fae3225 2026-07-07 mls: Just Listed + Just Sold quick-filter chips with adjustable day window (persisted)
  349. 018ff11 2026-07-07 off-market: re-check withdrawn rows for later-recorded sales (escrow lag) + fresh snapshots w/ 1,647 pulled listings
  350. 6061349 2026-07-07 CRE: migrate condos-report from mac2 (node path + Max-plan claude strip); harden morning/condos claude calls to Max plan
  351. 2d64c25 2026-07-07 residential: off-market tracking — see pulled listings, labeled SOLD vs WITHDRAWN
  352. ce1d6f2 2026-07-07 refresh: email steve-office (George) on sanity-gate abort or rsync failure
  353. 843d559 2026-07-06 mls: rename browser title -> 'LA County MLS — Residential + CRE'
  354. dcf9b4d 2026-07-06 refresh: set CC_FRESH=1 so SFR re-sweeps every run (ledger was skipping all regions -> no-op)
  355. 4a6fac7 2026-07-06 residential refresh: CC_LOCAL=1 mode ($0 local Chrome, no Browserbase) + 4x/day launchd
  356. 9a70d22 2026-07-06 residential: fresh Redfin scrape snapshots (10.6k SFR + 1.29k condos) + lift condo cap 1000->5000
  357. 0dae177 2026-07-06 mls: add residential inventory (9.6k SFR + condos) alongside CRE + Census rent averages
  358. 6e2d2bf 2026-07-04 closed-sales: snapshot fallback so sales.html has data on prod (no cre DB on Kamatera)
  359. d7077f3 2026-07-04 fix: guard brokers.map in graphics.html against non-array payload
  360. adc85c1 2026-07-04 sales: Amazon rail + field toggles + grid/list via crcp-grid engine; add ?limit to closed-sales; engine link+cap support
  361. 1117168 2026-07-04 fha-loans: Amazon left-rail + field toggles + grid/list via shared crcp-grid engine
  362. 10edd44 2026-07-04 condos api: explicit column projection (drop SELECT *, satisfies pre-deploy PII lint)
  363. a665e5c 2026-07-04 condos: Amazon-rail UI live + /api/condos snapshot fallback for prod (no cre DB on Kamatera)
  364. 883f96e 2026-07-03 chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)
  365. 253a437 2026-07-02 auto-save: 2026-07-02T17:51:29 (1 files) — public/broker-grid.html
  366. 8ceee47 2026-07-02 perf(mls): paginated table (DTD verdict B, UNANIMOUS 3/3 Codex+Qwen+Claude) — 200 rows / 60 grid cards per page with 'Show N more'; count + stats strip computed over the FULL filtered set, only the DOM windowed. Cuts a 1823-row MLS render to 200. Pass-20 milestone: all 4 surfaces smoke-clean (0 console errors, no regressions from 19 passes). Contrarian-gated.
  367. 9b10d00 2026-07-02 feat(mls): heat cues + copy summary parity (DTD verdict D, UNANIMOUS 3/3 Codex+Qwen+Claude) — color-by-metric Heat (Cap rate / Score) tints table rows red->green over the filtered set (only real values), legend; per-row 📋 Copy summary (address/type/units/price/cap/$-unit/$-SF/year/beds-baths/warrantability/URL) to clipboard. Closes the index<->mls consistency gap. Contrarian-gated, 0 errors.
  368. a8fedb1 2026-07-02 feat(index): per-card 📋 Copy summary (DTD verdict C, UNANIMOUS 3/3 Codex+Qwen+Claude) — copies a clean multi-line text block (address, type/units/price, cap/$-unit/$-SF, DSCR/CoC/cash needed/cash flow, est rent/deal score/warrantability, listing URL) to the clipboard for email/CRM; honest fields only (omits missing values); ✓ confirmation. Contrarian-gated, 0 errors.
  369. 45fe54b 2026-07-02 feat(index): saved searches (DTD verdict D, 2/3 Codex+Claude; Qwen dissent C=$/SF-vs-submarket OVERRIDDEN on honest-data grounds — comps.json submarket benchmarks are prose cap ranges, no joinable $/SF/median) — name + save the current filter/sort/view/heat state (reuses the shareable-URL serialization) into a rail 'Saved searches' list; one-click restore (full-URL, bulletproof) + ✕ delete; localStorage-persisted. Contrarian-gated, 0 errors.
  370. 6c08b42 2026-07-02 feat(index): Compare -> deliverable (DTD verdict A, 2/3 Codex+Claude; Qwen dissent C=similar-in-city) — ⬇ CSV export of the compared listings (one row per listing x 17 metric columns, entity-decoded) + 🖨 Print with a scoped @media print stylesheet (body.printing-compare) that prints only the side-by-side clean black-on-white for deal memos, without breaking normal Cmd+P. Contrarian-gated, 0 errors.
  371. 6d8e182 2026-07-02 feat(condos): surface parity (DTD verdict C, 2/3 Codex+Claude; Qwen dissent B=export-compare) — collapsible rail tabs (all collapsed on load) + aggregate stats strip (count/median price/$-SF/HOA/year) + ⭐shortlist stars sharing the SAME cre_shortlist key/ids as Explorer+MLS (shortlist now unified across ALL 4 surfaces) + a11y focus-visible/reduced-motion. Contrarian-gated, 0 errors.
  372. 589fdb5 2026-07-02 a11y(index): accessibility pass (DTD verdict A, 2/3 Codex+Claude; Qwen dissent C=export-compare) — aria-label + aria-pressed on ★ shortlist buttons, scope=col on list + compare table headers, :focus-visible keyboard focus rings, @media prefers-reduced-motion, and Escape-to-close on the compare + broker/property-history modals. Contrarian-gated, 0 errors.
  373. ac724c3 2026-07-02 feat(index): empty-state quick-start chips (DTD verdict D, 2/3 Qwen+Claude; Codex dissent B=a11y, queued next) — the wait-for-selection screen now offers one-click starters (Condos · Multifamily · ◆Non-QM · ⚑Unwarrantable · ✓In budget · ⭐My shortlist when non-empty) that apply a filter instantly, fixing the collapsed-tabs first-action dead-end. Contrarian-gated, 0 errors.
  374. 793d08b 2026-07-02 perf(index): paginated DOM rendering (DTD verdict D, UNANIMOUS 3/3 Codex+Qwen+Claude) — grid renders 60 cards / list 200 rows per page with a 'Show N more' button; count + stats strip + facet counts still computed over the FULL filtered set (only the DOM is windowed). Cuts a 1823-card Non-QM render to 60. Contrarian-gated, 0 errors.
  375. bf0b600 2026-07-02 afternoon CRE update 2026-07-02
  376. 7e7b8f4 2026-07-02 feat(mls): feature parity (DTD verdict B, 2/3 Codex+Claude; Qwen dissent D=export-compare) — port ⭐shortlist + aggregate stats strip to the MLS table; shortlist shares the SAME cre_shortlist localStorage key + listing ids as the Explorer, so starring is UNIFIED across index<->mls. Stats: count/median price/$-unit/$-SF/avg cap/median year over the filtered set. Star column + grid-card stars, shortlist toggle filters. Contrarian-gated, 0 errors.
  377. 681a9b8 2026-07-02 feat(index): color-by-metric heat cues (DTD verdict D, 2/3 Qwen+Claude; Codex dissent C=rent-control OVERRIDDEN on honest-data grounds — rent_control is 98% 'verify' placeholder, real RSO needs a classification-data task) — Heat select (Deal score / Cap rate / Cash-on-cash) tints each card left-border / list row red→green over the filtered set's min-max; only real values colored; gradient legend; persisted + in shareable URL (?ht=). Contrarian-gated, 0 errors.
  378. b5a7c9f 2026-07-02 feat(index): live facet counts (DTD verdict A, 2/3 Codex+Claude; Qwen dissent=saved-searches) — Asset-type/Firm/City chip counts update to reflect matches given the OTHER active filters (skip own dimension, Amazon-style narrowing); zero-match chips dimmed. Contrarian-gated, 0 errors.
  379. 14963d5 2026-07-02 feat(index): side-by-side Compare modal for shortlisted listings — 17 aligned metric rows (price, $/unit, $/SF, cap, DSCR, CoC, cash needed/flow, rent, beds/baths/sqft, year, warrantability, scores), sticky label col + header, star-2-first hint. Contrarian-gated, 0 errors.
  380. d9c099f 2026-07-02 feat(index): aggregate stats strip — median price / $-per-unit / $-per-SF / avg cap (disclosed) / median est. rent / in-budget count computed over the current filtered slice; hidden on the wait-for-selection state. Contrarian-gated, 0 errors.
  381. 8b66d89 2026-07-02 feat(index): shortlist — ⭐ star any listing (grid + list), device-local persisted set, '⭐ Shortlist (N)' toggle filters to starred only, removable active-filter chip. Contrarian-gated, 0 errors.
  382. c919ae1 2026-07-02 feat(index): ⬇ CSV export of the current filtered+sorted view (visible columns, proper escaping) + column-sort persisted in the shareable URL (?cs=key:a|d restores click-to-sort). Contrarian-gated, 0 errors.
  383. acf3768 2026-07-02 feat(mls+broker-grid): fleet consistency (DTD Option D) — collapsible rail tabs (all collapsed on load) on both; mls gains wait-for-selection empty state + ◆ Non-QM in-grid filter (unwarrantable condos + small multifamily 1-9u + mixed-use = 1823). broker-grid keeps its browsable ranked default (people directory, not filter-first). Contrarian-gated, 0 errors.
  384. 12bcd30 2026-07-02 feat(index): click-to-sort on List column headers (Option C) — sort by ANY visible data point (price, $/SF, beds, sqft, HOA, year, assessed-derived, etc.) asc/desc with ▲▼ indicators; generic fieldVal resolver; sort dropdown clears column-sort. Contrarian-gated (grid clicks unaffected; colSort scoped to .listtbl th).
  385. d036a01 2026-07-02 auto-save: 2026-07-02T10:47:21 (1 files) — public/index.html
  386. 2414c9b 2026-07-02 feat(index): shareable URL state (DTD dissent B / Codex) — every filter/sort/view/scenario ↔ query string via replaceState; deep-links restore the exact view and override wait-for-selection; 🔗 Copy-link button. Contrarian gate caught + fixed a real bug: local 'history' array shadowed window.history, silently no-op'ing replaceState.
  387. 9dc699f 2026-07-02 feat(index): active-filter summary bar — removable chips for every applied filter + one-click Reset all above the grid (DTD verdict A, 2/3: Claude+Qwen; Codex dissent=URL-share). Closes the 'what's filtering this?' gap from the collapsed-tabs/wait-for-selection UX; empty-state now guides expanding a tab. Contrarian-gated.
  388. e9d13a8 2026-07-02 feat(index): collapsible filter tabs (all collapsed on load) + wait-for-selection empty state (no 2134-card dump on load) + ◆ Non-QM in-grid filter (unwarrantable condos + small multifamily 1-9u + mixed-use) + lazy assessor data points (assessed value / land-imp split / use-code / prior sale via /api/property-history, IntersectionObserver + eager first batch, concurrency-capped, cached)
  389. 44c3be8 2026-07-02 feat(index+mls): merge condos IN-GRID as a real 'Condo' asset type (727 rows → 2134 total) — filters in place like any asset class; ⚑ Unwarrantable in-grid filter (713); +6 condo data points (beds/baths/sqft/HOA/warrantability/broker) as toggles on index, auto-discovered as columns on mls; $/unit suppressed for 1-unit condos
  390. ad43c25 2026-07-02 auto-save: 2026-07-02T10:17:10 (1 files) — public/index.html
  391. 58cbced 2026-07-02 fix(index): surface Condos + Unwarrantable as the FIRST chips inside the Asset type facet (were separate links below, easy to miss); nav-chips deep-link to the condos page
  392. a33bd46 2026-07-02 feat(condos): full Amazon left-rail drill-down — warrantability (incl. Unwarrantable) + city(20) + firm(14) + beds/baths mins + price/HOA/sqft/$-per-sqft/year ranges + 17 per-field show/hide toggles (computed $/sqft, $/bed, age); list/grid both field-driven; ?status deep-link
  393. a2c781e 2026-07-02 feat(condos): add Unwarrantable (non-FHA-approved) filter — 713 condos, Arcstone non-QM target; deep-link ?status=unwarrantable; red Unwarrantable chips in index+mls asset-class rails
  394. f571111 2026-07-02 feat(broker-grid+index): Amazon left rail on broker-grid (agent-type/Arcstone/firm facets + per-column show/hide, auto-discovers every scalar field driving table+grid+CSV); Condos added as an asset class in the index left rail
  395. d74ce02 2026-07-02 auto-save: 2026-07-02T09:46:55 (1 files) — public/mls.html
  396. 5a3ee55 2026-07-02 feat(condos): List/Grid toggle (both DB-listing & FHA-directory schemas) + density max to 20
  397. c02f5b2 2026-07-02 feat(index): Amazon-style docked left filter rail + List/Grid toggle + per-field show/hide (34 fields) + density to 20 + new data points (price/unit, price/SF, GRM, year built, days-on-market, ZIP)
  398. 177e1b0 2026-07-02 style: roomier collection grids — bigger card+container padding, 2px white stroke on cards/tiles across index/condos/mls/broker-grid/graphics/deals/fha-loans
  399. c5796c2 2026-07-01 afternoon CRE update 2026-07-01
  400. 8edbdfd 2026-07-01 feat: CRE deeds part (b) — current_broker for FREE-fetchable listings (compass/coldwell/myelisting/M&M) via verified WebFetch; crexi 98% deferred (anti-bot, needs Browserbase)
  401. 6be26bf 2026-07-01 chore: lint ✓ (clean, no linter) · refactor ✓ (no change) · v0.3.0 (session close)
  402. 7f658fc 2026-07-01 feat: clean extension-less URLs (/mls, /brokers, /map, etc.) alongside .html links
  403. b40a08b 2026-07-01 ops: launchd LaunchAgent for cre-viewer reboot persistence (KeepAlive, no pm2)
  404. 07e0977 2026-07-01 feat: deeds FREE-PASS part (a) — extend broker-history to all 1,407 listings
  405. 6ee845c 2026-07-01 chore: v0.2.0 (session close — broker contacts/MLS+broker grids/property-history/CSV/assessor 2.43M/tailscale)
  406. 192e889 2026-06-30 feat: broker-history pilot — transaction history + listing-agent enrichment on property cards
  407. 584c409 2026-06-30 auto-save: 2026-06-30T19:42:55 (3 files) — public/index.html scripts/serve.js data/broker-history-pilot.json
  408. d96d283 2026-06-30 auto-save: 2026-06-30T18:12:29 (1 files) — package-lock.json
  409. ddb1e4d 2026-06-30 chore: lint ✓, v0.1.1 (session close — condos render fix)
  410. ac6be59 2026-06-30 Map markers → 100-yr property-history popup (📜 History link in every marker popup)
  411. 1760f5c 2026-06-30 assessor keyset: stream line-count (1.3GB file exceeds V8 max string; readFileSync failed)
  412. 1634e83 2026-06-30 assessor: key-set pagination completion (AIN>cursor) to finish the roll past the resultOffset false-stop at 1.884M
  413. ad0fbf9 2026-06-30 Arcstone prior-relationship flag (chip on grid card + list + firm roster + modal) + always show email/phone/website on broker modals
  414. 8d4f2eb 2026-06-30 Add .deploy.conf for Kamatera prod deploy (CRCP + FHA loans feature)
  415. c469c56 2026-06-30 Add CSV export to MLS + broker grids (exports current filtered/sorted rows)
  416. 5a26b03 2026-06-30 Make the grids actionable: MLS row → 100-yr property history popup; broker-grid row → full contact/listings/pitch modal
  417. ddcd86b 2026-06-30 Broker grid+list view — all 2,537 brokers, every field sortable & searchable
  418. 4191307 2026-06-30 FHA loans: add /fha-loans route + /api/fha-loans JSON endpoint to serve.js
  419. 06ad891 2026-06-30 auto-save: 2026-06-30T16:41:53 (10 files) — public/condos.html public/crcp.html public/deals.html public/index.html public/map.html
  420. 03d9129 2026-06-30 Broker card: current+expired+sales with dates/MLS#/url across both modals
  421. 9c3c4e8 2026-06-30 Add MLS spreadsheet + grid view (sortable & searchable, all property data)
  422. 22644c3 2026-06-30 fix(condos): render listings — warrant_signals is an object, .map threw and stuck grid on loading
  423. bfc32f8 2026-06-30 fix(assessor): stop on exceededTransferLimit, not short page (was truncating at 294k/2.43M) + CC_START_OFFSET resume
  424. 531f7e7 2026-06-30 Add DW-Wins-Dashboard.png — CRE build wins dashboard (emailed to steve-office)
  425. 69ac4d3 2026-06-30 CRE :9911 — 'Best leads for Frank' ranked list: expandable MLS-style current listings + Sold button + 100-yr address-only property history
  426. 6d18e70 2026-06-30 auto-save: 2026-06-30T13:40:46 (1 files) — scripts/seed-frank-arcstone.js
  427. ee71adf 2026-06-30 CRE :9911 — front-page broker contacts (name/company/phone/email) + ready-pitch popup, Frank Arcstone demo, LinkedIn follow-tab
  428. aafcd09 2026-06-30 Assessor parcel roll: streaming Socrata/eGIS fetcher + cre.assessor_parcel schema + NDJSON ingest (2025 roll, all parcels, disk-aware capped to current snapshot)
  429. a45ddb9 2026-06-30 afternoon CRE update 2026-06-30
  430. e2e6fb4 2026-06-29 afternoon CRE update 2026-06-29
  431. 311558a 2026-06-29 auto-save: 2026-06-29T07:19:26 (7 files) — 5x/deals-assert.js 5x/index-assert.js 5x/map-assert.js public/deals.html public/index.html
  432. d10cdb4 2026-06-29 officer-yolo: DTD verdict A (Unified Deal Score) 3-0 for next build
  433. a8e2d74 2026-06-29 Map: marker clustering (Leaflet.markercluster — per-type colored cluster bubbles w/ counts at low zoom, individual dots past z16) + 'Color by: Type | Price' mode (5-tier price coloring + price-key legend, recolors all 10,876 markers). Updated cluster-aware strong gate (zoom-to-uncluster popup + price-toggle assertion) — PASS. Closes deferred item 7
  434. 22f626a 2026-06-29 Surface assumable-FHA/VA heuristic on the map: bake assumable likelihood+rate into map-points export (4,239 condo/SFR points, medium/high only) + 🔑 badge in popups (est rate when known, clearly labeled heuristic-not-title-verified). Closes the assumable UI gap (task 13). Map gate still PASS
  435. 157d835 2026-06-29 Build rent-roll → DSCR underwriting: /api/rent-rolls endpoint + rent-rolls.html viewer (unit table + underwriting tiles + live DSCR calculator: NOI/debt-service, verdict vs target, max-loan-at-target). Parser fix: money-formatted-rent only (no phantom unit from street#/zip). Strong gate (PASS) + health-check + nav links. Labeled DEMO rent roll included
  436. ec34869 2026-06-29 weekly Crexi refresh 2026-06-29
  437. 119516b 2026-06-29 5x: OVERNIGHT-REPORT.md (final) — all 6 pages gated + PASS; loop substantive work complete; items 4+7 deferred for Steve
  438. 9c2a5fc 2026-06-29 5x: index.html strong gate (index-assert.js — 1407 cards/no-NaN/loopnet+rent links/sort-reorders/filter-narrows/empty-degrades, PASS). No defect; all 6 pages now gated. Added index to health-check.sh
  439. 9455571 2026-06-29 5x: health-check.sh (server + all 5 strong gates) + night-log final state (primary queue complete; index gate is the one remaining candidate)
  440. bae2d75 2026-06-29 5x night option A: gate sales.html + brokers.html. Real fix: favicon 404 (1 JS err each) → inline favicon → both 6/6. New strong gates sales-assert.js + brokers-assert.js (PASS). Caught 2 bugs in my OWN verifiers first (sales #city=input not select; brokers row-click highlights graph, node-click opens detail)
  441. ec4d78b 2026-06-29 5x night-log: item 8 done; primary queue essentially complete (items 4,7 deferred to do with Steve); next-wake options + anti-churn note
  442. 7f52ab6 2026-06-29 5x night item 8: mobile/a11y pass — fix real 390px overflow (crcp nav-wrap, map topbar-wrap, index scenario-seg wrap; map/index overflow-x guard); prefers-reduced-motion on deals gradient anim; aria-labels on density slider + modal close. All 3 strong gates still PASS (no desktop regression)
  443. e121e47 2026-06-28 auto-save: 2026-06-28T23:47:35 (1 files) — data/map-points.json
  444. 28c0b79 2026-06-28 5x night-log: items 2+5 done; item 4 deferred (do with Steve); next = price-band chart + map clustering
  445. ad89b92 2026-06-28 5x night item 5: harden geocoder — strip unit designators (#4/Apt/Ste) + skip un-geocodable junk (Call Broker/Plan N); recovered +1 retroactively. Honest: remaining ~769 un-placed are Census TIGER gaps (new-build streets), not fixable free — durable value is correct geocoding of future unit-suffixed imports
  446. 928c43f 2026-06-28 5x night item 2: crcp.html strong gate (crcp-assert.js — tiles/segments/expand/modal/sort/empty all PASS); six-way 6/6 with correct visible selector. No crcp defect — M3 FAIL was collapse-default vs visibility-selector mismatch, not a bug
  447. cdaa2b4 2026-06-28 5x night-log: items 1+3 done; queue + method note for next wake
  448. b6a5bdd 2026-06-28 5x night item 3: wire nonqm segment agent count (union of non-FHA condo agents + 1-9-unit/mixed listing agents) — was unwired/0, now 1696
  449. f98b8af 2026-06-28 5x night item 1: map.html — aerial-img onerror graceful fallback + strong map-assert.js gate (markers/toggles/popup-decode/empty-data); map verified 6/6 + strong PASS
  450. 14b36ac 2026-06-28 5x: overnight refinement night-log + queue
  451. 2f5592e 2026-06-28 5x: final REPORT — clean twice (sweeps 4-5) with strengthened gate after contrarian caught 3 real defects in sweep 3
  452. 292b7fb 2026-06-28 5x sweep 3 (contrarian-gated): fix medAll ÷0 → $NaN tile; guard F.money/F.num/countUp + grad() undefined-color crash (was swallowed on empty data); make Refresh/toggle verifier-discoverable; add strong deals-assert.js (charts-drew-data + empty-data + no-NaN gate)
  453. 022582f 2026-06-28 5x: sweep logs + REPORT (deals.html clean twice; clickthrough false-negatives escalated)
  454. 7a4f457 2026-06-28 5x sweep 1: add live Refresh + pipeline metric toggle (Deals/Median $) to deals.html — refactor to pull()/draw() with chart-destroy guards (no double-init); real interactive controls
  455. d5d29c9 2026-06-28 Deal Intelligence dashboard: 2026 liquid-glass UI (animated gradient mesh + frosted panels) with 6 dynamic Chart.js charts bound to live deal data; nav links across pages
  456. f4cd532 2026-06-28 Property map: all 10,875 geocoded properties on Leaflet, colored overlays per type, free Esri aerial photo per property; free Census batch geocoder (scripts/geocode-census.js); nav links from index+crcp
  457. 9e99f28 2026-06-28 LoopNet for all listings (free deep-links on every card + gated CoStar adapter) + local rent-roll PDF ingester + feasibility doc
  458. 3054e11 2026-06-28 CRCP: collapse-all-until-activated panels + chip density slider + building prices; dedupe caret CSS, inline favicon
  459. 495d8d6 2026-06-28 auto-save: 2026-06-28T17:15:46 (1 files) — public/crcp.html
  460. b0cabb2 2026-06-28 CRCP: building prices on Call Segments (med + p10–p90 band) and per-agent avg/top price in call list; chip density slider + collapse-all-until-activated panels (persisted)
  461. 80c2838 2026-06-28 additive: Assumable FHA/VA call segment + read-only /api/assumable endpoint
  462. 5f05fc1 2026-06-28 assumable-loan heuristic + estimate model + credentialed source adapters + integration plan
  463. 50e36fe 2026-06-28 CRE: transaction-party entity model — title/escrow/insurance/lender companies + per-property edges (transaction_company + transaction_party), seeded major LA players; populated from title-records adapter once Steve's login lands
  464. 5aaf087 2026-06-28 CRE viewer: neighborhood rent estimate (std + proforma from Census median gross rent × units) per card + Pro-forma Rent ROI sort, with implausible-yield (>18%) guard flagging bad unit counts
  465. 9f0bd7e 2026-06-28 Wire sfr-bankstmt segment to cre.sfr + add fetch-sfr-agents.js (broker_sfr edge)
  466. 9a5c260 2026-06-28 Add fetch-sfr-redfin.js — feed-first uipt=1 SFR sweep w/ price-banding + swept_region_sfr ledger
  467. e39860e 2026-06-28 CRCP: SFR/non-QM segments open the lead-source playbook even at 0 listings (compliant social/referral channels)
  468. dfbb2c5 2026-06-28 CRCP: compliant lead-source playbook on SFR/non-QM segments (referral partners + Special-Ad-Category social marketing, NOT scraped consumers)
  469. 44fe3fb 2026-06-28 Add cre.sfr table + broker_sfr edge (mirror condo/broker_condo for SFR for-sale)
  470. f51be7b 2026-06-28 CRCP: Call Segments panel (Arcstone loan products) — mixed-use / non-warrantable condos / standard condos (FNMA CPM offer) / DSCR 1-4 / DSCR 5-9 / SFR bank-stmt / non-QM; click a segment → agents-to-call list → segment-tailored pitch
  471. 99ec9a7 2026-06-28 CRE: local XLSX exporter (no Drive API) — 5-tab workbook of all brokers/agents/firms/condos/sales for Drive upload
  472. 2b99293 2026-06-28 CRE: comprehensive 5-tab Google Sheet exporter (commercial brokers + residential agents + firms + warrantable condos + 17k closed sales), shares to steve@ as writer
  473. a880a29 2026-06-28 afternoon CRE update 2026-06-28
  474. 4d1c2a9 2026-06-28 CRE: sortable columns on /sales.html comps table (address/city/price/date, click to rank ▲▼)
  475. cc6c1a9 2026-06-28 closed-sales: full LA County coverage — 228 resolved regions, price-banding past the 350 cap, resume ledger, honest ~5yr depth note (6,391 -> 17,023 rows)
  476. 5287876 2026-06-28 CRCP: sortable columns on broker + firm tables (click any header to rank asc/desc, ▲▼ indicator)
  477. 56c1898 2026-06-28 auto-save: 2026-06-28T10:14:06 (2 files) — scripts/serve.js public/sales.html
  478. ed38493 2026-06-28 CRE residential agents: final capture artifact — 637 agents across 19 Browserbase sessions ($0.76), 104 phone / 102 email / 636 license; 74 honestly labeled no-public-agent (Redfin-suppressed)
  479. 43075b0 2026-06-28 auto-save: 2026-06-28T08:43:43 (2 files) — public/crcp.html scripts/serve.js
  480. 8e18085 2026-06-28 auto-save: 2026-06-28T08:13:35 (2 files) — scripts/fetch-closed-sales.js data/redfin-agents.json
  481. 3fb9caa 2026-06-28 CRE residential agents: integrate into CRCP — fetch-redfin-agents.js capture, agent_type+license through /api/crcp/stats topBrokers + /api/broker (id-safe lookup, condos as listings) + /api/broker/pitch (condo refs for residential) + mind-map graph()/contact card; CRCP residential/commercial badge + Agents tile + agent counts in /api/condos/stats
  482. a686d47 2026-06-28 CRE: closed-sales scraper (Redfin gis-csv sold feed, 10yr) → closed_sale market-comps table; per-agent attribution follows agent resolution
  483. 2d837a2 2026-06-28 CRE residential agents: feasibility probe (mainHouseInfo endpoint confirms agent name+brokerage+phone/email/license) + residential schema (broker.agent_type/license, broker_condo edge, extended broker_node view)
  484. 44b6973 2026-06-28 auto-save: 2026-06-28T07:43:27 (2 files) — public/brokers.html scripts/db/brokers-db.js
  485. d7ca649 2026-06-28 CRCP: broker contact columns (phone/email/web) + click-through contact modal (full business contact + current/closed listings) + Frank user (admin) + Arcstone Financial resources + non-warrantable-condo pitch generator (email/call-script DRAFTS, send stays George-gated)
  486. c5507a7 2026-06-28 CRE Job B Tier 3: filter data-aggregator emails (signalhire/rocketreach/zoominfo/apollo/etc) — keep only real broker/firm contacts; scrub 1 false-positive
  487. 63ed0e2 2026-06-28 CRE Job B Tier 3: Brave-search enrichment (~$0.004/q) for brokers-with-listings missing email — top-result fetch+harvest, last-name email attribution, firm/linkedin/crexi result ranking, $10 global cap + running spend surfaced
  488. 22629f0 2026-06-28 CRCP: live Commercial Real Estate Control Panel (CNCP-styled) — /crcp.html + /api/crcp/stats, auto-polls every 3s showing listings/brokers/firms/condos + live broker-enrichment progress bars
  489. 88d26a3 2026-06-28 CRE Job B Tier 2: firm-website team-page crawler ($0 local HTTPS) — mailto/tel + regex harvest, firm-domain email preference, office-level fallback assignment w/ provenance
  490. 8378bf7 2026-06-28 CRE Job B: enrichment schema (website/linkedin/specialties/office_addr cols + broker_field_source provenance + broker_other_listing) + Tier 1 Crexi re-fetch (office addr/website/title/phone + book sizes)
  491. fc5b4d4 2026-06-28 auto-save: 2026-06-28T07:13:19 (1 files) — scripts/db/broker-enrich-schema.sql
  492. 8bfec9f 2026-06-28 CRE Job A: graphics reflect REAL scraped condos — /api/condos/stats (warrantable-vs-unwarranted + by-city + avg price over cre.condo), 2 new charts + stats; condos API serves all 1000
  493. e64aea1 2026-06-28 CRE Job A: Redfin feed-first condo scraper (gis-csv) — region resolvers (city+neighborhood region_ids) + capped sweep w/ FHA warrantability classify + cre.condo upsert; probes confirm gis-csv feed (~350 condos/region)
  494. d9dfc39 2026-06-28 CRE: 5-broker enrichment PoC (~$0.04) — public Crexi broker-profile API exposes no contact fields via /brokers/<id> or /profile/<id>; full harvest needs source-discovery, documented for gated memo
  495. 09e1ede 2026-06-28 CRE: 1-session Browserbase condo-sample pipeline (capture->classify->DB, ~$0.04) — proves end-to-end flow; Crexi /condo found to be national commercial inventory not LA residential condos (purged from DB), residential source (Zillow/Redfin) is the gated full-scale path
  496. 37b95ec 2026-06-28 CRE: graphics page (broker leaderboard, firm market-share, FHA warrantability breakdown + by-city + expiring-soon charts via Chart.js) + condos warrantability view + /api/firms/share /api/warrantability /api/condos /api/fha-condos endpoints; link from index
  497. b27a82b 2026-06-28 CRE: warrantability classifier — FHA-list match (name + street/zip) primary, heuristic text flags (condotel/cash-only/litigation/investor/mixed-use/new-construction) secondary; honest proxy labeling
  498. 848cc19 2026-06-28 CRE: add condo + warrantability schema (fha_condo ref table, condo table w/ broker linkage, warrant_status enum, fha_match fn); load 2,661 FHA rows
  499. f67266d 2026-06-28 CRE: ingest HUD FHA-approved condo list for LA County (2,661 records: 358 approved / 2,303 expired) — warrantability proxy source
  500. a9547bc 2026-06-28 auto-save: 2026-06-28T06:13:03 (2 files) — data/fha-approved-condos.json scripts/fetch-fha-condos.js
  501. 298a0a4 2026-06-27 CRE: AI narratives backfilled for all 1407 properties
  502. 45d44d0 2026-06-27 CRE: extend Crexi sweep to 30 more LA County cities (1028→1407 properties); fetch-brokers incremental skip of already-captured listings
  503. 08e290a 2026-06-27 CRE: broker/agent relationship graph — cre Postgres DB (firm/broker/listing + co-list edges), Crexi /assets/<id>/brokers capture, /api/graph, vis-network mind-map at /brokers.html (verified: 68 brokers/52 firms/16 co-list edges from 60-listing sample)
  504. 216da73 2026-06-27 afternoon CRE update 2026-06-27
  505. c70d4a6 2026-06-27 CRE: case-insensitive generic sniffer (handles M&M/.NET capitalized Results+fields); record firm discovery — M&M has /api/contentsearch/properties (needs POST payload), LoopNet anti-bot dead-end
  506. e133dd4 2026-06-27 auto-save: 2026-06-27T05:37:39 (1 files) — scripts/sources/firms.js
  507. 6594d54 2026-06-27 CRE: qwen narratives backfilled for all 1028 properties (thesis + recommendation)
  508. b6964fd 2026-06-27 CRE: live Census ACS demographics for 73 LA submarkets (keyless Census Reporter) — renter%, med rent, income, pop, home value, rent burden on every card
  509. baf6f58 2026-06-27 CRE: add Census ACS demographics fetcher (70 LA submarkets) + per-card 📊 demographics line; npm run demographics
  510. 46ede35 2026-06-27 CRE data: Crexi LA County sweep — 104→1028 properties (all asset types, wide band), re-ranked for viewer
  511. 741304a 2026-06-27 CRE viewer rebuilt like-new: left filter drawer behind hamburger (collapsed) with rich facets (asset type/firm/submarket/price/cap/units/year/status/budget); capture band widened to all properties + all asset classes
  512. ddd052e 2026-06-27 CRE: add chunked full-firm LA County sweep runner (run-sweep.sh)
  513. 690567b 2026-06-27 CRE: wire read-only WhoLivedThere/pastdoor archive (assessor parcel + permits + film history) into viewer via /api/history
  514. 2674ef8 2026-06-26 CRE: expand geographic scope to all of LA County (88 cities + neighborhoods + unincorporated)
  515. 9c2ab88 2026-06-26 auto-save: 2026-06-26T23:36:14 (2 files) — scripts/refresh-all.js scripts/sources/firms.js
  516. 9c8ad7b 2026-06-26 CRE: multi-firm listing-source framework + firm badges in viewer
  517. aa88a98 2026-06-26 CRE reports: add score bar-chart, rich table-of-info ($/unit, $/sqft, GRM), and suggested Zillow data points (per Steve's 1pm reply)
  518. 8101926 2026-06-26 afternoon CRE update 2026-06-26
  519. b6dbc62 2026-06-26 afternoon CRE update 2026-06-26
  520. 133b583 2026-06-26 morning CRE report: add steve-personal as second recipient
  521. 99d728a 2026-06-26 add 1pm afternoon CRE report: new-listings diff + red-hot deals, launchd 13:00 PT
  522. 42bff37 2026-06-22 weekly Crexi refresh 2026-06-22
  523. a3711a1 2026-06-22 weekly Crexi refresh 2026-06-22
  524. 39b655c 2026-06-21 Add rent-yield (rent÷price) metric + broader SFV sweep (81 listings)
  525. f205d2c 2026-06-21 Verify Granada Hills #1 (pro-forma 6.66%, lease-up risk) + detailed per-property recap in daily email
  526. fc9d273 2026-06-21 Weekly Crexi refresh job + 38 new SFV listings (62 total)
  527. c09a426 2026-06-21 Daily 6am top-10 report -> steve-office via George (launchd)
  528. de42fa5 2026-06-21 Add daily morning-report generator (top 10 SFV CRE opportunities -> HTML email body)
  529. 5b97a77 2026-06-21 Tighten live-comps units parse
  530. 89f1ab2 2026-06-21 Live comps -> Browserbase/Crexi (drop Exa dependency)
  531. 1351a12 2026-06-21 Expand listing set (+5) + gated live-comps route
  532. a22e0f0 2026-06-21 Chat: add per-unit rent rolls + real SFV sale comps to grounding context
  533. 0feadae 2026-06-21 Ranking integrity: verify top picks vs MLS + unverified-NOI penalty
  534. e27dd0a 2026-06-21 SFV CRE viewer + grounded control-chat
  535. 33e1972 2026-06-21 initial scaffold: SFV CRE investment ranker

Authors

Agents used

  • vp-engineering20
  • code-reviewer1

Skills used

  • /condos-redfin113
  • /map-points83
  • /sfr-redfin79
  • /residential-report77
  • /latest43
  • /crcp-drift-state42
  • /qwen-cache19
  • /ranked19
  • /listings18
  • /brokers-snapshot17
  • /alerts-state15
  • /brokers13
  • /phone13
  • /condos11
  • /firm8
  • /units8
  • /serve7
  • /firms7
  • /agent7
  • /broker7
  • /crcp7
  • /property-history7
  • /unit7
  • /sqft7
  • /index7
  • /residential6
  • /type6
  • /price6
  • /cap6
  • /linkedin5

Creative ideas + design notes

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

379ab20 · 2026-07-25 · CRCP: harden serve.js — atomic brokers-snapshot write (H3) + clip /api/comps inputs before child-process env (H2)
From a code-reviewer sweep; both verified against source. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0a55b7c · 2026-07-24 · serve.js: handle EADDRINUSE gracefully to stop launchd crash-restart storm
An unhandled listen EADDRINUSE threw a full stack trace and instantly
respawned under KeepAlive, writing a 1.18M-line / 36.8MB error log when
two instances raced for port 9911. Now log one line and exit cleanly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9ce5a12 · 2026-07-23 · Remove Frank + Arcstone from CRCP entirely
Purged the synthetic 'Frank Arcstone' demo broker, the Arcstone Financial
lender persona, the 'frank' app user, and the real 'ArcStone Financial Inc'
license entry from all layers:
- DB: dropped broker_pitch/arcstone_resource/app_user, deleted demo broker/firm/
  listings and the gov license row (real Frank brokers untouched)
- serve.js: removed the pitch generator + Arcstone-financeability lead scoring,
  renamed /api/leads/frank -> /api/leads/top, dropped arcstone_flag column,
  genericized Call Segments (now generic broker/prospect explorer)
- 7 public HTML pages: removed pitch UI, Arcstone badges, Frank labels
- data: regenerated brokers-snapshot.json, scrubbed license-directory.json +
  gov/newport-beach.json, deleted seed-frank-arcstone.js

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
79bc0cf · 2026-07-17 · Consolidate everything into ONE tabbed Agent window (links OK again)
Per Steve: link-out is fine, but put it all in one window with tabs. So the agent modal is now
a single per-listing window with 5 tabs:
- Agent   — editable name/phone/email (tel:/mailto: restored), Notes, Mark contacted
- Letters — compose + Save letter + Send via George (Gmail draft) + letter log
- Find    — all external lookups in one place: firm/agent Google + LinkedIn, DRE, View source
            listing, LoopNet (target=_blank, link-out OK); plus in-app 'More from this firm'
- Comps   — inline Live comps
- History — inline Property history

- Row-click (and the ⧉ cell icon / ✎ Open buttons) now open this ONE window instead of a separate
  inline row panel — dropped the .lexp expansion entirely.
- Moved Live comps / Property history out of the card into the window (kills duplicate #lc-/#hist-
  ids). repaintModal preserves the active tab across mark/letter/send saves.

Verified headless: row->tabbed window, 5 tabs switch, Save-info stays on Agent, Save-letter keeps
Letters tab + shows the letter, Find has 8 external links, 0 errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4d0bb9f · 2026-07-17 · Agent CRM: all-inline (no outside links) + inline Notes field
- Removed every external link from the listing/agent surfaces: address no longer links to source;
  dropped firm/agent Google + LinkedIn + DRE searches, LoopNet, and 'View listing'. No target=_blank.
- Firm cell is now an in-app filter (click = show only that firm) instead of a Google link.
- Phone/email are inline display + copy (⧉) buttons, not tel:/mailto: that launch other apps.
  Source listing URL + live-comp URLs are copy-buttons too, so nothing auto-opens a tab.
- Contact modal is now the inline 'Agent window' with a persisted Notes field (saved with Save info);
  notes surface as a 🗒 chip on the row/card and render inline in the row panel.
- Kept the genuinely-inline panels (Live comps, Property history render in-place).

Verified headless: 0 external/tel/mailto links in table + modal, firm filters inline, notes save->chip->inline render, 0 errors. (Separate 'Best Leads for Frank' broker panel still has its own external contact links — left untouched.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ed5770b · 2026-07-17 · Harden agent-contact CRM (contrarian gate): serialize writes, stable letter ids, XSS guards
- Concurrency (HIGH #1): every read-modify-write of agent-contacts.json now runs through a
  promise-chain lock (withContacts) so interleaved requests cant last-writer-win and drop data.
  Verified: 8 parallel saves -> all 8 persisted.
- Stable letter ids (HIGH #2): each letter gets a monotonic id at creation; delete addresses by
  id (index fallback for legacy), and send-draft records its own id-stamped letter instead of the
  fragile match-by-20k-char-body that could push a ghost + shift indices. Verified delete-by-id.
- XSS: safeUrl() blocks javascript:/data: URLs in p.source hrefs; esc() applied to qwen.thesis,
  qwen.risks[], and upside_note (were raw innerHTML).

Verified headless: parallel-save no-loss, delete-by-id, UI 2->1 delete, 0 errors, still fail-closed.
c164c3f · 2026-07-17 · Add gated Send-via-George button — creates a Gmail DRAFT (never sends)
- Modal gets a 📤 Send via George button beside Save letter. Confirm gate, then
  POSTs /api/contacts/:key/send-draft which proxies to the George gmail-agent on the
  same box (127.0.0.1:9850 /api/drafts) creating a Gmail DRAFT from steve-office to
  the agent — it is NOT sent (never calls /api/send). Letter log shows a 📤 drafted badge.
- GATED THREE WAYS: draft-only (nothing leaves until Steve reviews+sends in Gmail);
  FAIL-CLOSED (no GEORGE_AUTH in CRCP env -> 503 george_not_configured, does nothing);
  never touches George's live-send route. Browser never holds George creds (server proxies).
- Validates recipient email at click time (repaint-proof); graceful alert on fail-closed.

Verified headless: button renders, no-email click validates, confirm gate fires, fail-closed
path handled gracefully. Inert until GEORGE_AUTH is set in the CRCP env.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
f503eb1 · 2026-07-17 · Agent-contact CRM now on EVERY listing + card view (one modal everywhere)
- Card view: every card (all asset types) gets a cardAgentBlock — name/phone/email +
  contacted/letters chips + Contact and Mark-contacted buttons.
- Promoted the compose popup into one full per-listing contact modal (openContact):
  editable name/phone/email, mark-contacted, compose + save letter, saved-letter log
  with delete. Opens from list cell, list-row expansion, AND cards.
- refreshContactUI() repaints whichever surfaces are visible (list agent cell, open
  expansion, card block) + repaintModal() keeps the open modal fresh — no full re-render.
- List-row expansion CRM simplified to a summary + Contact/Mark buttons (no duplicate form).

Verified headless: Multifamily (non-condo) list + card, modal save-info/letter/mark all
persist and refresh in place across surfaces; 60 cards each carry the block; 0 errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
123b0e3 · 2026-07-17 · CRCP list view: sortable + fully hrefd rows, inline row expansion, and an Agent·contact column with save-date + saved-letter CRM
- Agent · contact column inserted right after Deal score: name/phone/email with
  tap-to-call (tel:) + email (mailto:), Contact and Mark-contacted buttons, plus
  contacted-date and saved-letter chips.
- Every list field now hrefd (never un-hrefd): listing firm + broker + current-broker
  cells link to scoped agent/firm web searches; columns already sortable.
- Clicking a row opens an inline panel below it: deep searches (LoopNet, live comps,
  property history, firm/agent web+LinkedIn+DRE, More-from-this-firm filter) + the
  agent CRM (editable name/phone/email, mark-contacted, compose+save letter, letter log).
- New durable CRM store: data/agent-contacts.json + /api/contacts endpoints
  (info / contacted / letter / letter delete). Letters are SAVED, never sent
  (sending stays Steve-gated via George). gitignored + rsync-excluded so a deploy
  can't overwrite the live contact log.

Verified headless (Chrome/Playwright): column order correct, 200 rows render, expansion
+ CRM controls work, mark-contacted + compose-save persist to disk, 0 console errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
cb778e7 · 2026-07-16 · graceful-degrade /api/leads/frank + /api/broker (502 -> 200 when cre DB absent)
On prod (Kamatera) the broker DB module loads but there's no 'cre' Postgres,
so pool.query throws and both endpoints hard-502'd -> red console errors on
every internal page load. Return the front-end-safe shapes at 200 instead:
leads:[]+unavailable (panel already shows 'no leads (broker DB unavailable)'),
and the same {error} body (modal handles d.error; featured card guards !d.broker).
Verified by reproducing the prod condition (brokerdb loaded, DB unreachable):
both now 200; working-DB success path untouched.
b4b3c10 · 2026-07-16 · add CRCP origin-vs-live drift canary (DTD verdict D)
Read-only sha256 compare of front-end assets origin(mac3) vs live(Kamatera);
worsening-only CNCP+email alert when live falls behind. Fixes the actual
9-day-silent-rot failure (invisibility) without an auto-push foot-gun.
Verified: baseline-silent, catches injected drift as WORSENING, recovery silent.
Scheduling (launchd, 6h) is a Steve-paste.
a8e4386 · 2026-07-16 · add on-demand CRCP front-end deploy script (mac3->Kamatera)
Root-cause tooling for the 9-day stale-deploy: crcp.agentabrams.com is a
Kamatera-local rsync copy with no code-sync. This gives it a reviewable,
backup-first, html/js/css-only, no---delete, NOT-scheduled deploy path.
Scheduling it is intentionally left out (a cron would push uncommitted local
edits to prod).
0f635d9 · 2026-07-16 · iPad fix sweep: crcp.html nav breakpoint 760->1024, licensed-agents badge width cap
- crcp.html: nav-wrap media query was max-width:760px, missed iPad portrait
  (768px) by 8px -> raised to 1024 + overflow-x:hidden guard.
- licensed-agents.html: a stray long a.status value made a nowrap .badge
  balloon to 1512px and spill 1216px off-screen; capped max-width:60% +
  min-width:0 + ellipsis so any status text stays contained.
- Verified: all 15 CRCP pages now zero horizontal overflow at 768 & 1024
  both orientations (WebKit/iPad engine). Other 13 pages were already clean.
1cdd91f · 2026-07-16 · iPad fix: header nav becomes swipeable strip + grid minmax, no horizontal overflow on tablet
- Wrap header nav links + scenario seg in .topnav; on <=1024px it's a
  swipeable horizontal strip (fixed 1-row header preserves sticky offsets)
  instead of clipping off-screen.
- grid tracks -> minmax(0,1fr) + 2 cols through the docked-drawer band so
  cards aren't crushed on iPad landscape.
- html+body overflow-x:hidden, title/sub ellipsis, un-stick .bar on tablet.
- Verified in WebKit (iPad Safari engine) at 768/820/1024 both orientations:
  zero horizontal scroll, drawer + nav touch work, no JS errors.
71b7a18 · 2026-07-13 · fix: pin Homebrew PATH in refresh-broker-snapshot.sh (launchd bare-node bug)
The 04:15 launchd run died 'node: command not found', leaving prod brokers
frozen. Same fix as sibling CRCP runners. Verified node resolves under a
launchd-minimal PATH.
87cbbde · 2026-07-13 · chore: lint, refactor, v0.9.0 (session close)
- email-hunt.js: rename blockedOrEmpty→shouldEscalate + clearer comment (no behavior change)
- serve.js: find-email timeout message now reflects the real cap (45s/75s) instead of hardcoded 45s
- crcp.html: add esc() helper + apply in webLink() (XSS-harden the site-name link)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
51399ad · 2026-07-13 · prod CRCP: snapshot fallback for stats top-brokers + id/website in snapshot top rows
- serve.js /api/crcp/stats: fill brokers/topBrokers/topFirms/enrich counts from
  brokers-snapshot.json when the cre DB is absent (Kamatera) — panel was empty on prod
- find-email route: DB errors fall through to snapshot resolve/save (prod landmine:
  brokerdb requires fine but every query fails there)
- brokers-db topBrokers(): + id, website so the snapshot rows can drive the contact
  card and the ✉ find-email button on prod
- snapshot regenerated + pushed (2,537 brokers)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47b4662 · 2026-07-13 · find-email button: on-demand broker email hunt from their website (CRCP + broker grid)
- lib/email-hunt.js: engine extracted from broker-email-finder.js (shared guards:
  name-match wins, refuse shared corporate pages, junk/TLD filter) + lenient-TLS
  fallback for expired-cert broker sites (mdrealtycorp.com)
- lib/email-hunt-browser.js: headless-Chrome tier (ignoreHTTPSErrors) shared by CLI+server
- serve.js: POST /api/broker/find-email — hunts the broker's own site, saves to
  broker.email (PG) or brokers-snapshot.json (DB-less prod)
- crcp.html + broker-grid.html: website links now show the SITE NAME (domain) instead
  of bare 'site↗'; '✉ find email' button where email is missing; modal variant too

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
b6bd885 · 2026-07-10 · chore: v0.5.0 — DRE-licensed agents feature (session close)
Contrarian pass served as the quality gate this session (3 bugs fixed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6abac2e · 2026-07-10 · CRCP DRE: contrarian fixes — verified only on exact match, drop dead DB branch
- pick(): surname-only match REMOVED (wrong-person risk). Now dre_verified=true
  ONLY for a single exact full-name match; >1 exact or first+last -> 'probable'
  (license shown, never badged verified). Invariant: no probable is dre_verified.
- serve.js: removed the broken DB-first branch (broker table has no license_type/
  license_status/license_expiration/firm_name cols; it always threw + was swallowed).
  Snapshot is the canonical DRE store (prod has no Postgres).
- viewer: 'probable' badge/pill/filter, is_proof_run coverage banner, unmatched=no-license.
- Regen 25-agent proof: 10 verified, 9 probable, 6 unmatched, 0 errors. Rendered
  headless (cards/badges verified). $0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e914e06 · 2026-07-10 · CRCP: DRE-licensed agents/brokers DB from CA public govt data
- scripts/fetch-dre-licenses.js: name->License ID->detail against the CA DRE
  public lookup (www2.dre.ca.gov), $0 local curl, resumable, honest labeling
- /api/agents/licensed route (DB->snapshot fallback, same idiom as /api/residential)
- public/licensed-agents.html viewer: search + sort + density, per-agent DRE
  verification (license #, type Salesperson/Broker, status, expiration, resp. broker)
- mls.html nav link; bounded 25-agent proof run (19 verified, 0 errors, $0)
- full 637 run + launchd + prod deploy drafted to pending-approval (Steve-gated)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
92df973 · 2026-07-10 · scrapers: capture LATITUDE/LONGITUDE from gis-csv -> lat/lng (was discarded)
~6,100 active residential listings (5,081 SFR + 1,031 condo) were invisible on the map for lack of
coordinates. The feed carries LATITUDE/LONGITUDE; now parsed + upserted (COALESCE so an existing
geocode is never nulled). Map coverage climbs to ~100% as sweeps run. Verified: SFR 215/215,
condo 68/68 on freshly-swept regions.
b7ae291 · 2026-07-07 · chore: lint (syntax-check ✓), v0.3.1 → v0.4.0 (session close)
Refactor pass intentionally skipped: session code is already deployed + live-verified
on prod; refactoring now would create local↔prod drift with no redeploy at close.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0ab08f2 · 2026-07-07 · add fix-workspace-trust.js — restores hasTrustDialogAccepted after mac3 migration
The Jul 2 Claude update + mac3 migration reset ~/.claude.json workspace trust to
false, silently breaking every headless 'claude -p' launchd job (Unknown command
on slash-command jobs; ignored permissions on plain-prompt jobs). This one-shot
restores it with a backup. Paste-safe alternative to a long node -e one-liner.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7ffa8da · 2026-07-07 · crcp: auto-rebuild assessor SQLite on ingest + refresh/push wrapper
- ingest-assessor.js now rebuilds data/assessor.sqlite at the end of every ingest
  (event-driven, non-fatal) so the prod file can never drift from the DB
- run-assessor-refresh.sh: rebuild-from-DB -> sanity floor (>=2M rows) -> md5
  skip-if-unchanged -> data-only rsync to prod, George alert on failure (mirrors
  run-residential-refresh.sh)
- com.steve.crcp-assessor-refresh.plist: weekly (Sun 03:00) schedule, NOT loaded
  (auto-pushes to prod = Steve-gated); checksum guard makes an unchanged week a no-op

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
13a73ac · 2026-07-07 · crcp: bridge 2.43M assessor roll to DB-less prod via read-only SQLite + honest miss copy
- export-assessor-sqlite.js builds data/assessor.sqlite (449MB, indexed on
  situs_house_no+situs_street) from cre.assessor_parcel; keyset-paginated, DELETE
  journal mode so it's a single self-contained read-only file (no WAL sidecars)
- serve.js /api/property-history: SQLite fallback when Postgres is absent (prod),
  DB-first preserved; better-sqlite3 added as dep (npm ci rebuilds it on Linux)
- index.html/mls.html: replace false 'still ingesting' banner (roll landed
  2026-06-30) with honest 'no assessor record matched' miss message
- gitignore the 449MB file (ships via rsync, not git)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
67dff5f · 2026-07-07 · map: residential on the map colored by status (Active/In Escrow/Sold/Withdrawn)
- build-map-points.js rebuilds data/map-points.json from the DB: keeps commercial points, refreshes
  9.6k geocoded residential (SFR+condo) with an rstatus lifecycle field.
- map.html: new 'Color: Status' mode + residential-status legend key. Fixed the {points:[...]} shape.
- refresh pipeline rebuilds + rsyncs map-points.json each sweep so the map tracks fresh status.
d8dc3ea · 2026-07-07 · residential: price-drop tracking — 💸 Price Cut chip + report section
- schema: prev_price + price_changed_at on sfr/condo (condo_card recreated, +lat/lng).
- scrapers set prev_price=old price + price_changed_at=now() only when price actually changes.
- Price Cut chip = price < prev_price within N days; Prev $ column; report tile + Price Cuts table.
- Verified via simulated prior price (1.5M->750k captured); reset the test row so no fake cut ships.
eb0c10c · 2026-07-07 · residential report: LA Residential Pulse (SFR+condo) email — just listed / in escrow / just sold / fell out
- residential-report.js builds the HTML market-pulse from the cre DB ($0 local): 5 headline tiles +
  Just Listed / Just Sold / Fell Out tables + In-Escrow-by-city.
- run-residential-report.sh sends via george-send rawfile pattern (size-safe) to steve-office +
  steve-personal, with a build-size sanity gate.
- launchd com.steve.crcp-residential-report fires 06:30/12:30/18:30/00:30 — :30 past so it runs
  AFTER the :00 residential refresh sweep lands. $0/run.
a31904e · 2026-07-07 · listings: real DAYS ON MARKET (gap-immune Just Listed) + In Escrow / Fell Out tabs
- Capture Redfin DAYS ON MARKET + STATUS (was discarding both); derive listed_date. Just Listed now
  keys on days_on_market (real list age) not our first-seen date — fixes the scrape-gap artifact.
- Scrapers now also sweep status=130 (pending/contingent) so in-escrow homes are captured; track
  prev_market_status for fell-out-of-escrow detection.
- New chips: 🤝 In Escrow (pending/contingent), ↩️ Fell Out of Escrow (was pending, now active).
  Just Sold = closed escrow. Status shows In Escrow; new Market + Days on Mkt columns.
- FIX: cast $N::int in the upsert — a bound param used only inside CURRENT_DATE-($N)::int failed
  Postgres type inference (masked by .catch(()=>null)). schema: days_on_market/listed_date/
  market_status/prev_market_status on sfr+condo; condo_card recreated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fae3225 · 2026-07-07 · mls: Just Listed + Just Sold quick-filter chips with adjustable day window (persisted)
- 🆕 Just Listed = active & first_seen within N days; ✅ Just Sold = disposition sold & left market
  (off_market_at) within N days. Mutually exclusive; 'within N days' input (default 7, localStorage).
- created_at flows through /api/residential + mappers as first_seen.
2d64c25 · 2026-07-07 · residential: off-market tracking — see pulled listings, labeled SOLD vs WITHDRAWN
- schema: sfr/condo gain last_seen/status/off_market_at/disposition/sold_price/sold_date;
  condo_card view recreated to expose them.
- scrapers stamp last_seen=now() on every seen listing + reset a re-listed home to active.
- mark-off-market.js: after a FULL sweep, flag listings that stopped appearing (last_seen<sweep
  start) as off_market, then cross-ref closed_sale (normalized addr key) -> disposition sold
  (+price/date) vs withdrawn. >40%-would-flag safety abort guards partial/throttled sweeps.
- export-residential-snapshots.js: dumps BOTH snapshots post-mark w/ lifecycle fields (active +
  off-market within 180d). Supersedes export-sfr-snapshot.js in the refresh flow.
- /api/residential + /api/condos return lifecycle fields, active-first.
- mls.html: Status now Active/Sold/Withdrawn + Pulled/Sold$/Sold-date columns; Status facet
  buckets Active vs Off-market.
- refresh.sh: capture MARK_SINCE pre-sweep -> mark -> combined export.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ce1d6f2 · 2026-07-07 · refresh: email steve-office (George) on sanity-gate abort or rsync failure
Silent-failure alerting for the 4x/day residential refresh — reuses the fleet's
canonical _shared/george-send.sh. Fires only on abort (bad scrape blocked) or
rsync-to-prod failure; clean runs stay silent. Recipient overridable via
RESIDENTIAL_REFRESH_TO. Verified via test send (success:true).
4a6fac7 · 2026-07-06 · residential refresh: CC_LOCAL=1 mode ($0 local Chrome, no Browserbase) + 4x/day launchd
- Both Redfin scrapers gain a CC_LOCAL branch: launch local Chrome (residential IP clears
  Redfin's bot wall) instead of a paid Browserbase session. Cloud path untouched (default).
- run-residential-refresh.sh: local scrape both -> export SFR snapshot -> sanity-gate ->
  rsync data-only (2 JSON snapshots) to prod. No code deploy, no pm2 reload (snapshot
  fallbacks readFileSync per request). $0/run.
- launchd com.steve.crcp-residential-refresh fires 06:00/12:00/18:00/00:00.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9a70d22 · 2026-07-06 · residential: fresh Redfin scrape snapshots (10.6k SFR + 1.29k condos) + lift condo cap 1000->5000
Scrape 2026-07-06: SFR 9665->10617 (+952), condos 727->1290. Snapshots regenerated
for prod (no-DB) fallback. $3.20 Browserbase.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0dae177 · 2026-07-06 · mls: add residential inventory (9.6k SFR + condos) alongside CRE + Census rent averages
- /api/residential endpoint (DB-first, sfr-redfin.json snapshot fallback for prod)
- export-sfr-snapshot.js: dump public.sfr -> data/sfr-redfin.json (prod has no PG)
- mls.html: mapSfr() + fetch residential; Single-Family/Condo asset-class chips auto-build
- Census median gross rent join by city -> Area Rent/mo + Area GRY% cols + stat pills (area proxy, honestly labeled)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c02f5b2 · 2026-07-02 · feat(index): Amazon-style docked left filter rail + List/Grid toggle + per-field show/hide (34 fields) + density to 20 + new data points (price/unit, price/SF, GRM, year built, days-on-market, ZIP)
- Left filter drawer now docks as a persistent Amazon-style rail on desktop (>=901px); stays off-canvas burger on mobile
- Grid/List segmented toggle in results bar; List renders a sortable columnar table (sticky Property column), columns driven by field toggles
- Fields show/hide panel: every card field + several list-only columns, All/None/Default, persisted to localStorage
- Density slider max 6 -> 20 cards per row
- New computed data points: price/unit, price/SF, GRM, year built, days-on-market, ZIP

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
07e0977 · 2026-07-01 · feat: deeds FREE-PASS part (a) — extend broker-history to all 1,407 listings
Free LA County assessor roll (assessor_parcel) attaches last deed date +
AIN + year-built to every ranked listing via the same address match
/api/property-history uses. 1,188/1,407 matched (84%); the 11 broker-enriched
pilot records are merge-preserved. /api/broker-history now prefers the full
set, pilot as fallback. Broker (part b) stays gated (deeds carry no agent name).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
192e889 · 2026-06-30 · feat: broker-history pilot — transaction history + listing-agent enrichment on property cards
- data/broker-history-pilot.json: pilot dataset covering top 13 of the 30 sampled ranked
  properties. Each entry has: LA County Assessor AIN + recording_date (last deed, Tier A),
  sale-price history where findable from public MLS search results (Tier B), and the
  current listing agent name/DRE/firm/phone from Redfin/Zillow/Compass/LoopNet results.
  12/13 properties have a named broker or firm (92% coverage in pilot).

- scripts/serve.js: adds GET /api/broker-history endpoint serving the pilot JSON. Indexed
  by listing id and lowercase address for fast O(1) card-level lookup. Graceful 503 if
  file absent; full set returned when no query params (for bulk UI hydration).

- public/index.html:
  - CSS: .brokerflag (amber "Prior broker on file" badge), .txhist (deed + sale date
    rows with Tier A/B color coding), .brokerline (agent name/DRE/phone chip).
  - JS: loads /api/broker-history at boot into window.BROKER_HIST (by id) +
    window.BROKER_HIST_ADDR (by address); re-renders when DATA is ready.
  - card(): injects brokerFlagBadge, txHistHTML(), brokerLineHTML() per property using
    the pilot index — degrades gracefully (empty string) when property not in pilot set.

Coverage findings (pilot sample of 30):
  - Assessor parcel hit: 27/30 (90%). Three misses: Granada Hills (long address), Reseda
    (dual-number parcel 7302-7304), Tujunga (Foothill address variant).
  - closed_sale DB: 0/30 matches. The 17k rows are residential SFR/condo (Redfin
    gis-csv); none are commercial multifamily — not a useful source for these properties.
  - Broker/agent found (current listing): 12/13 enriched (92%). 1 miss (553 Stanford Ave
    — broker not surfaced in public search results).
  - Historical sale price found: 5/13 (38%). Sources: Redfin search snippets, Zillow.
  - Historical BROKER on a PAST sale: 2/13 (15%) — 9350 Tampa 2022 listing (Stephanie
    Vitacco/Equity Union) and 8022 Felix 2025 sale (Brandon Hauer). Past-sale brokers are
    NOT in any free public record (deed carries no agent name; confirmed against RR/CC FAQ).

Equity Union finding: appears on 4 of the top 10 ranked properties (ranks 2, 4, 6, 10).
Marcus & Millichap on rank 23 (383 W 14th St San Pedro).
Lyon Stahl/Cameron Samimi on rank 8 (10370 Ashton).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ac6be59 · 2026-06-30 · Map markers → 100-yr property-history popup (📜 History link in every marker popup)
Adds a '📜 History' link to each Leaflet marker popup opening the address-only property-history modal
(assessor parcel + sold history + permits) via /api/property-history — the same feature now on the MLS
grid, front-page + broker modals. Self-contained modal on map.html. Verified headless: opens, 0 errors.
c469c56 · 2026-06-30 · Add CSV export to MLS + broker grids (exports current filtered/sorted rows)
⬇ CSV button on both spreadsheet views — client-side export of the currently filtered+sorted rows with
all columns (proper quote-escaping). Verified headless: cre-mls-1407.csv + cre-brokers-2537.csv download, 0 errors.
5a26b03 · 2026-06-30 · Make the grids actionable: MLS row → 100-yr property history popup; broker-grid row → full contact/listings/pitch modal
mls.html: click any property (list row or grid card) → property-history popup (assessor parcel + sold
history + permits, address-only). broker-grid.html: click any broker → full modal (contact + current/
expired/sales listings with dates+MLS + ready Arcstone pitch). Header-sort clicks excluded. Verified
headless: both open correctly, sort still works, 0 console errors.
ddcd86b · 2026-06-30 · Broker grid+list view — all 2,537 brokers, every field sortable & searchable
public/broker-grid.html: List (spreadsheet, 15 cols: name/firm/type/listings/total-assets/phone/email/
website/linkedin/title/DRE-MLS/specialties/office/source/added) + Grid toggle. Every column click-sorts
(numeric-aware), global search across all fields. Backed by new GET /api/brokers/all (all fields + listings
count). Linked from CRCP nav + front-page header. Verified headless: sort/search/toggle, 0 errors.
03d9129 · 2026-06-30 · Broker card: current+expired+sales with dates/MLS#/url across both modals
/api/broker: current listings now carry listed_at (+zip/units); new 'expired' (best-effort match of a
broker's listings against the sold feed — honest empty-state since there's no MLS off-market feed); 'sales'
(area sold comps) enriched with sold_date + MLS# + url + beds/baths/sqft. Front-page #bkmodal AND crcp.html
modal both render Current(dated) / Expired-off-market / Sales(dated+MLS+link) sections. name/email/phone/
website already present. Verified headless on front modal (all sections, dates, MLS#, 0 errors).
9c3c4e8 · 2026-06-30 · Add MLS spreadsheet + grid view (sortable & searchable, all property data)
public/mls.html: MLS-style view over ranked.json (1,407 properties) — Table (spreadsheet, sticky
header, 18 cols: address/city/zip/type/price/units/sqft/$per-unit/$per-sqft/cap/year/rent-control/
status/firm/finance/score/source) AND Grid toggle. Every column click-sorts (numeric-aware), global
search filters all fields. Header link added on index.html. Verified headless: sort/search/toggle, 0 errors.
bfc32f8 · 2026-06-30 · fix(assessor): stop on exceededTransferLimit, not short page (was truncating at 294k/2.43M) + CC_START_OFFSET resume
The ArcGIS parcel layer returns short pages (<maxRecordCount) mid-dataset while exceededTransferLimit is still true, so breaking on feats.length<PAGE silently stopped the pull at ~12%. Now terminates only on the server's real end-of-data signal, and CC_START_OFFSET resumes/appends a partial pull.
69ac4d3 · 2026-06-30 · CRE :9911 — 'Best leads for Frank' ranked list: expandable MLS-style current listings + Sold button + 100-yr address-only property history
- serve.js: GET /api/leads/frank (brokers ranked by Arcstone-financeability of current listings — mixed-use/condo x3, multifamily/commercial x2; excludes Frank; returns listings_json) + GET /api/property-history (address-only, NO owner names — assessor parcel roll + closed_sale sold history + WhoLivedThere permits/events).
- index.html: front-page section is now 🎯 Best leads for Frank — ranked, click-to-expand leads; each shows MLS-style current listings (address/type/price/units/cap), a Sold/area-history button (area sold comps), and per-listing 📜 100-yr property history popup (no names). Featured Frank card + contact/pitch modal retained.
Verified headless: 40 leads, expand 16 MLS rows, history popup + Sold all work, 0 console errors. Assessor facts (year built/beds/baths) populate once the 2.43M-roll ingest lands.
ee71adf · 2026-06-30 · CRE :9911 — front-page broker contacts (name/company/phone/email) + ready-pitch popup, Frank Arcstone demo, LinkedIn follow-tab
- index.html: self-contained Brokers & Agents panel above the deals grid — featured Frank Arcstone card (full contact + one-click pitch popup) + top-25 roster (name/company/phone/email), click any row -> contact modal with the ready-to-send Arcstone pitch (DRAFT; send stays George/Steve-gated). Header links: 👤 Brokers, 🔗 LinkedIn.
- linkedin.html: TOS-compliant follow-list for Frank — every broker/agent with stored LinkedIn profile or a people-search fallback URL, client-side followed-state, search + filter. Links only, no automation.
- serve.js: GET /api/brokers/linkedin (profile/search links + counts).
Frank pitch pre-generated (ready to send). Verified front page + tab 200, route + Frank contact/pitch OK.
9c8ad7b · 2026-06-26 · CRE: multi-firm listing-source framework + firm badges in viewer
- sources/firms.js: shared normalizer + dedup + declarative firm registry
  (Crexi verified; Marcus & Millichap, Lee & Associates, Colliers, CBRE, JLL
  wired with generic listing-shape sniffer, flagged needs-discovery)
- refresh-all.js: one Browserbase session drives every firm through the same
  capture->normalize->dedup->append path into listings.json
- discover-firm.js: one-command schema cracker to lock each new firm
- viewer: 🏢 firm/source badge on every deal card (verified 104 cards render)
- npm run refresh / npm run discover
39b655c · 2026-06-21 · Add rent-yield (rent÷price) metric + broader SFV sweep (81 listings)
- finance.js: grossYield = annual gross rent / price (from rent_roll/gross_actual) — surfaces 'rent close to price'
- viewer: Rent Yield sort + per-card 'rent yld' badge; morning-report: rent yield in recap
- broader Crexi sweep (+19 cities) -> 81 listings total

File tree

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

Other build journals

← Commercialdesignreps  ·  all 4 projects  ·  Compliance Agent →

Export

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

rendered in 3ms