Rentv Sheet Enrich

repo: ~/Projects/rentv-sheet-enrich · 168 commits · 0 in last 24h, 0 in last 7d ·

Search the build

168 commits indexed

  1. 47a9aa3 2026-09-02 TK-10550 bloom-enrich: batch LANDED +31 LI +1 email (Steve-authorized), verified 1373/4297
  2. e74470f 2026-09-02 TK-10550 bloom-enrich: +6 LinkedIn +1 email (wb_007-008), 31 total staged; WebSearch-budget stop
  3. 15369e8 2026-09-02 TK-10550 bloom-enrich: stage 25 verified contact-LinkedIn (wb_000–006, STAGE-only, 2 Cody-dropped)
  4. 414e9cf 2026-09-02 auto-data-snapshot: 2026-09-02T09:35:20 (118 data files) — data/warm_batches/wb_000.json data/warm_batches/wb_001.json data/warm_batches/wb_002.json data/warm_batches/wb_003.json data/warm_batches/wb_004.json
  5. be9a096 2026-08-31 team_vp.py: repoint VP_MODEL default muse-glimmer→qwen3:14b (TK-10980, muse removed)
  6. 4f190d2 2026-08-24 auto-data-snapshot: 2026-08-24T11:44:27 (1 data files) — __pycache__/write_by_contact.cpython-314.pyc
  7. 504437f 2026-08-24 TK-10533: add 'LinkedIn (Contact) — found' date-provenance column + going-forward stamp
  8. eec7a10 2026-08-24 yoloforever cycle 20: wb_045 +21 contact-LinkedIn (1325/4297, 30%)
  9. 367ec07 2026-08-24 yoloforever cycle 19: wb_044 +17 contact-LinkedIn (1304/4297, 30%)
  10. 254315e 2026-08-24 yoloforever cycle 18: wb_043 +13 contact-LinkedIn (1287/4297, 29%) - cool tail
  11. 6209ac7 2026-08-24 yoloforever cycle 17: wb_042 +21 contact-LinkedIn (1274/4297, 29%)
  12. 57b09cd 2026-08-24 yoloforever cycle 16: wb_041 +23 contact-LinkedIn (1253/4297, 29%)
  13. 875e973 2026-08-24 yoloforever cycle 15: wb_040 +23 contact-LinkedIn (1230/4297, 28%)
  14. 1bd7964 2026-08-24 yoloforever cycle 14: wb_039 +22 contact-LinkedIn (1207/4297, 28%)
  15. 8221a3d 2026-08-24 yoloforever cycle 13: wb_038 +23 contact-LinkedIn (1185/4297, 27%)
  16. 16af7e5 2026-08-24 TK-10579: read-only preflight_matches.py dry-run — 19 staged matches still to write, 0 unmatched; LinkedIn col 1152; Email sha intact
  17. 7e480d7 2026-08-24 yoloforever cycle 12: subagent recovered, +16 LI (coverage 1162/27%); gate rejected 2 inferred, verify agreed both drop; SHIP
  18. 2c86d61 2026-08-24 yoloforever cycle 11: main-loop +3 LI; /res panel=RESUME 6-0; SHIP
  19. b7a032e 2026-08-24 yoloforever cycle 10 ledger: main-loop +4 LI; cool-tail yield note; SHIP
  20. aa30df6 2026-08-24 yoloforever cycle 9 ledger: main-loop +6 LI; SHIP
  21. 1ff6bd5 2026-08-24 yoloforever cycle 8 ledger: subagent recovered, +25 LI (coverage 1131/26%); SHIP
  22. 200a82c 2026-08-24 yoloforever cycle 7 ledger: main-loop +5 LI (coverage 1106/25%); SHIP
  23. b49cf5c 2026-08-24 yoloforever cycle 6 ledger: main-loop +6 LI all live_title (coverage 1101/25%); SHIP
  24. c30bf70 2026-08-23 yoloforever cycle 5 ledger: main-loop fallback +9 LI all live_title (coverage 1095/25%); SHIP
  25. ddada5b 2026-08-23 yoloforever cycle 4 ledger: +23 LI all live (coverage 1086/25%); SHIP
  26. eea8aa6 2026-08-22 yoloforever cycle 3 ledger: gate's first production catch (rejected+verified+recovered Mark Sanford); +26 verified, coverage 1063/24%; SHIP
  27. 199333c 2026-08-22 yoloforever cycle 2 ledger: +21 LI all live-tagged (coverage 1037/24%), slug-source gate clean (0 inferred); SHIP
  28. bad2918 2026-08-22 yoloforever cycle 1 ledger: +24 LI (coverage 1016/23%); Cody FIX-FIRST slug-source gate applied+verified; date-column deferred to pending-approval
  29. 8a0aa54 2026-08-22 Cody FIX-FIRST: enforce slug-source gate in write_by_contact.py (auto-reject inferred/fabricated slugs, report rejected_inferred count); require slug_source in worker prompts + name the Cody gate as mandatory in WARM-RESUME
  30. b381287 2026-08-21 TK-10579 LinkedIn cycle9: 8 searched, 4 Cody-KEEP staged (Sutton/Chang Soo/Caldwell/Byerly), 2 REJECT held (Fowler/Champion Parker); 30 total staged across b6-12; 0 fabrication; gated to Steve
  31. ffd701c 2026-08-21 TK-10579 LinkedIn cycle8: 10 searched, 9 Cody-KEEP staged (Cesar Pena + 8 Chads), 0 REJECT, Eschmeyer omitted stale; 26 total staged across b6-11; 0 fabrication; gated to Steve
  32. 833afb4 2026-08-21 wb_007-010: +68 verified contact-LinkedIn (599->701, 16%); WARM-RESUME throttle-fallback note
  33. bd47a06 2026-08-21 TK-10579 LinkedIn cycle7: 10 searched, 4 Cody-KEEP staged (Sears/Wilson/Fincher/Jackson), 2 REJECT held (King/Jones); 17 total staged across b6-10; 0 fabrication; gated to Steve
  34. 5728b2b 2026-08-21 TK-10579 LinkedIn cycle6: 10 searched, 3 Cody-KEEP staged (Calhoun/Groner/Carfi), 2 REJECT held (Stumpf/Roark); 13 total staged across b6-9; 0 fabrication; gated to Steve
  35. 0737e37 2026-08-21 TK-10579 LinkedIn cycle5: 9 searched, 4 Cody-KEEP staged (Cukier/Douglass/Horner/Southerland), 1 REJECT held (Shaffer); 10 total staged across b6-8; 0 fabrication; gated to Steve
  36. c9ad67c 2026-08-21 Session wave: +88 verified contact-LinkedIn (511->599, warmth-first wb_000-004, 65-73% yield); add WARM-RESUME.md (self-correcting rebuild + 2-concurrent cadence + measured yields)
  37. f08c5b9 2026-08-21 TK-10579 LinkedIn cycle4: 8 searched, 2 Cody-KEEP staged (Warnica, Bruce Beck x3 rows), 1 REJECT held (Brooke Jacob), 0 fabrication; write gated to Steve
  38. a5b716b 2026-08-21 Warmth-first LinkedIn-enrichment batches: rebuild 3513 still-missing contacts ordered by warmth (major-firm/reachable first), garbage-name filtered; supersedes alphabetical missing_batches for higher yield
  39. 3a2091d 2026-08-21 TK-10579 LinkedIn cycle3: 9 searched, 2 Cody-KEEP staged (McGlynn/Murphy), 1 REJECT held (Brighton Barnes), 0 fabrication; write gated to Steve
  40. 75d6f6d 2026-08-17 Apply dedup to send-ready exports: READY_verified already clean (0 dups); VERIFY_FIRST inferred collapsed 7 same-email pairs -> deduped export (977->970 rows); raw files intact
  41. 31159ba 2026-08-17 Add deduped CRE worklist export (4,036 rows): collapse 169 same-email duplicate re-scores to one highest-warmth row each, backfilling phone/position/company from dropped dups; raw worklist left intact
  42. de9f5d3 2026-08-17 Update coverage report: mark data-quality findings #1 (pipe-merges) + #2 (personal-domain tagging) RESOLVED; correct gmail count 100->157
  43. b6c0043 2026-08-17 Add 'Domain Type' column to CRE worklist (personal/firm/blank) — tags 157 individual-agent personal-domain emails so firm/domain rollups aren't skewed (coverage report finding #2)
  44. dbbef8f 2026-08-17 Class-3c: resolve 12 domain-clear reserved company merges to canonical (78 rows; Colliers cluster, LBA, Grand Pacific, etc.); SVN franchise names + 1 gmail oddball kept as-is
  45. a4557d6 2026-08-16 Class-3b: resolve 30 evidence-clear company variants (typos, association-token strips, sub-brand arms) to canonical (144 rows); 13 ambiguous merges reserved for Steve
  46. c9a6490 2026-08-16 Class-3a: collapse 54 same-firm spelling/case/typo twins to curated canonical names (253 rows, 10 CSVs); 43 mixed-brand strings left for Steve's ruling
  47. 2628508 2026-08-16 Strip '| EMAIL' parse-artifact token from company names (46 firms, 370 rows across 4 CSVs); multi-segment names left for class-3 dedup
  48. e70a1e4 2026-08-16 Fix CBRE | Colliers bad merge -> CBRE across 4 worklist CSVs (120 rows; all 59+59 contacts are @cbre.com, zero Colliers)
  49. 0216cda 2026-08-16 Add coverage/quality report for completed RENTV CRE dataset (analysis only, no send)
  50. c57888a 2026-08-15 SAFETY: fail-closed RENTV email kill switch (Steve directive 2026-08-15 — no rentv emails to anyone)
  51. af2fa34 2026-08-15 auto-data-snapshot: 2026-08-15T08:12:28 (1 data files) — data/searched_names.txt
  52. e1e9fbe 2026-08-14 Draft real RENTV outreach messages: 3 grounded variants (network-intro / event-invite / deal-flow), value-first, personalized, compliant, bracketed unknowns. Steve picks + wires into send script
  53. 7042676 2026-08-14 Finish send mechanics: real Purelymail SMTP send (smtplib SSL) with idempotent sent-log, warmup cap, env-only password; all guards verified (dry-run default, placeholder-abort, from/pass-required). Sends nothing without explicit --send+message+creds
  54. 0f44288 2026-08-14 Stage $0 Purelymail send path for 2636 verified CRE audience: dry-run, warmup-batched, verified-only, mandatory CAN-SPAM footer, message=placeholder (Steve-gated). Sends nothing.
  55. 3f9875d 2026-08-14 DTD verdict A: free MX-drop on 987 inferred (removed 10 dead-domain contacts); note free-verification ceiling reached, mailbox validation = paid spend gate, B write-back = gated follow-on
  56. c43ea67 2026-08-14 DTD verdict C (Cody-scoped): stage verified-only CRE outreach audience (send-ready) + separate inferred verify-first list; NOT sent (gate stays Steve's)
  57. 6c07e9e 2026-08-14 Final commercial-RE work-list: whole set minus ~15 off-vertical, CRE-confidence tagged (HIGH/PROBABLE), warmth-sorted w/ email provenance
  58. ed10d1c 2026-08-14 Refine to commercial-RE focus: CRE-relevance tag by source-tab signal; export rentv_CRE_worklist.csv (CRE-only, off-vertical excluded)
  59. 36e924c 2026-08-14 Export updated warmth-ranked work-list (top-300, Email Source provenance) post-recovery
  60. cb4a421 2026-08-14 flag pmrg/vandeweerd no-MX (auto-skipped)
  61. 296217b 2026-08-14 FINISH BURST: last 52 firms processed, queue exhausted (166 resolved/71 held), +30 final top-up write. RENTV recovery COMPLETE, loop stopped clean
  62. ebc4a83 2026-08-14 yoloforever cycle 5 (final auto-cycle): +7 domains (140 total); loop PAUSED per unanimous DTD stop-verdict, awaiting Steve
  63. 25601d0 2026-08-14 write-back top-up: +16 guard-clean MX-valid inferred emails -> live sheet
  64. b7aa372 2026-08-14 flag rubyred.media no-MX
  65. 76ca18a 2026-08-14 yoloforever cycle 4: +9 domains (133 total), guards enforced, 1 held
  66. b9217cb 2026-08-14 yoloforever C3: ledger
  67. dccabd2 2026-08-14 yoloforever C3 FIX-THEN-SHIP (Cody re-gate): role-label stoplist (asst/jr/sr/vp/...), guards wired into infer_emails.py direct-write path, Email Source col in export, cleared live role-label cells
  68. 4a978f7 2026-08-14 yoloforever cycle 3 (a): +5 domains (124 total), NGKF->nmrk institutional-guarded, 5 held
  69. de43cf4 2026-08-14 flag caesars no-MX
  70. f824754 2026-08-14 yoloforever cycle 2: +6 domains (114 total), guards applied at generation, 4 held
  71. a439e34 2026-08-14 yoloforever C1: ledger + institutional-guess decision memo (gated to Steve)
  72. f2f6c50 2026-08-14 yoloforever C1 FIX-THEN-SHIP (Cody): guards.py name-sanity + institutional/gov domain blocklist in writeback, cleared 13 live garbage cells, guard-clean master + 26 clean top-up
  73. 31013ee 2026-08-14 auto-data-snapshot: 2026-08-14T09:20:46 (3 data files) — NOTES-unverified.txt __pycache__/guards.cpython-314.pyc rentv_recovered_ALL.csv
  74. b21787e 2026-08-14 yoloforever cycle 1: +5 domains (113 total), 5 held (ambiguous/defunct)
  75. ebccbbf 2026-08-14 Loop tick 14: +8 domains (108 total), Dove + Riverwest held
  76. a9cdb6c 2026-08-14 Loop tick 13: +8 domains (100 total), Liberty Property Trust defunct + Mosaic held
  77. 47f4186 2026-08-14 Loop tick 12: +8 domains (92 total), Cannon Beach + N&N held
  78. 5c34183 2026-08-14 Write-back top-up (Steve approved): +15 MX-valid inferred emails -> live sheet (219 total written)
  79. 24589ac 2026-08-14 Loop tick 11: +8 domains (84 total), BRAND + CASCO held
  80. be06d7e 2026-08-14 Loop tick 10: +7 domains (76 total), PICOR label-disambiguated, 3 held
  81. a04a7d7 2026-08-14 Write-back APPLIED (Steve approved, Option A): 204 MX-valid inferred emails -> live RENTV sheet, ADD-only
  82. 5f935c7 2026-08-14 Loop tick 9: +8 domains (69 total), Wren + AT Real Estate held
  83. c911b98 2026-08-13 Wrap-up: consolidate 207 recovered emails (MX-tagged master) + gated write-back memo
  84. ff5f196 2026-08-13 Loop tick 8: +6 domains (61 total), 4 held (franchise/generic/ambiguous)
  85. 8fb2924 2026-08-13 Loop tick 7: +8 domains (55 total), IDI Gazeley defunct + Abbott ambiguous held
  86. 8d3df92 2026-08-13 Loop tick 6: +8 domains (47 total), Verde no-site + Enzed ambiguous held
  87. 8ab5552 2026-08-13 Loop tick 5: +6 domains (39 total), 4 ambiguous held; web emails regenerated
  88. ed09fa4 2026-08-13 Loop tick 4: +9 domains, 1 ambiguous (Rubicon) held back; recovered emails regenerated
  89. fb96ca3 2026-08-13 Flag bcpmgt.com MX-unconfirmed
  90. 4d4c69e 2026-08-13 Loop tick 3: +9 domains (24 total), per-company pattern col (Oaktree=flast), 88 emails; Masyno no-site; aspirant MX flagged
  91. 23d3ff2 2026-08-13 Loop tick: +10 company domains resolved (15 total), 63 emails recovered, MX-verified
  92. 81ed641 2026-08-13 Loop dig: web-domain lookup lane proven (5 companies -> 30 emails) + resume procedure
  93. f5d1b91 2026-08-13 Loop dig: local email recovery + brand-collision guard + MX verify
  94. 5e5158e 2026-08-13 rentv :9797 status data: explicit junk-value drop-list (Cody fix — no over-broad heuristic)
  95. 51390ef 2026-08-13 rentv :9797 status data: strip enrichment-green mis-captures + trailing-char dup values
  96. 4be38e7 2026-08-13 rentv :9797 legend: persist the 'more colors' fold state across re-renders (Cody fix)
  97. 06105fe 2026-08-13 rentv :9797 legend: fold the long tail of one-off color tints under a 'N more' toggle
  98. ddffc49 2026-08-13 Add derived 🔥 Warmth score column to RENTV live console + top-N export
  99. 72a7312 2026-08-13 rentv :9797 legend: Cody fixes — sticky header (✕ stays visible on scroll) + Escape cancels a rename
  100. 21e6af5 2026-08-13 rentv :9797 legend: close (✕/Esc/click-outside) + per-row ↺ reset for a rename
  101. 46c2c4d 2026-08-13 rentv :9797 legend: Cody fixes — empty-rename guard, mark heuristic guesses, don't nuke mid-edit
  102. aba95a9 2026-08-13 rentv :9797: add in-viewer Color Key legend panel (🎨 Colors) — swatch + count + editable provisional name
  103. 60e8dcd 2026-08-13 auto-data-snapshot: 2026-08-13T18:37:41 (1 data files) — __pycache__/snapshot.cpython-314.pyc
  104. 707c9b1 2026-08-13 rentv :9797 exact-colors: Cody fixes — readable text on painted link/mail/phone cells, saved-flash survives, drop ghost near-whites
  105. 1c5e092 2026-08-13 FIX write off-by-hr: 9 tabs have a title row above the header (hr=1) so write_cell's hardcoded row0+1 wrote to the HEADER row instead of the data row. Snapshot now stores hr per tab; write_cell targets hr+1+row0. Verified against live sheet (retail panel / ARIZONA BROKERAGE etc.).
  106. 8150eeb 2026-08-13 Live console: guard drag-to-fill against phantom writes — native text-selection drags inside editable cells are now ignored on drop (intentional value-cell drags + external drops still write)
  107. b159bca 2026-08-13 FIX critical data-corruption: combined/multi-sheet view writes went to the wrong tab/row/column (postWrite sent stale GID + combined indices). Server now reverse-maps combined (row,union-col) -> source (gid,tab-row,tab-col); client sends DATA.gid+gids. Verified exact on 157/157 sampled cells.
  108. ca6b2ac 2026-08-13 rentv :9797: paint EXACT original sheet cell colors in the grid (restore lost color-coding)
  109. 95c5ba3 2026-08-13 Live console: show Last Modified date+time directly under the Status chip; stamp it on status-pick and drag-drop writes too
  110. fe7b566 2026-08-13 Live console: row-number gutter down the left; drag-to-fill — drop a value onto any field to replace it in the sheet (Notes appends instead of replacing)
  111. 1098075 2026-08-13 rentv :9797 draft composer: richer Follow-up (thank-you + questions + scheduling options)
  112. dfed233 2026-08-13 Live console: email cells are now clickable mailto links; color-coded Status field (colors pulled from the sheet) + click-to-set status picker that writes the value to the sheet
  113. 00fc8a6 2026-08-13 Live console: Width presets (Tight/Cozy/Wide/Fit + auto-refit on window resize) + Text size S/M/L, replacing the raw density slider; fix column drag-to-reorder (preventDefault stops text-selection hijack)
  114. 2a21996 2026-08-13 Live console: FORCE grouping off on every load (kills the black sub-sort header bars for good; was persisting via localStorage)
  115. 5e82fcf 2026-08-13 Live console: turn OFF grouping (removes the unwanted black header bars; one-time reset, Group dropdown still available); readable theme-aware scrollbars for night mode
  116. e2b2b9e 2026-08-13 Draft drawer: contact data on a white card (crisp links, not blue-on-black); fix broken Contact-via control -> real mail/LinkedIn/phone SVG icons + full-width segmented control
  117. c5739ce 2026-08-13 Live console: theme-aware interaction colors (no more black-on-black in day mode); soften group headers from black bars to tinted band; default to OS light/dark
  118. 4ff3c02 2026-08-13 Live console: Website/LinkedIn/phone cells are now WHOLE-CELL clickable (leading icon never clipped) — opens popup / dials; text cells stay editable
  119. 1bff2a8 2026-08-13 Live console: click a field in the left rail to open its full value lookup in the main table area (search + multi-select to filter)
  120. 44d2687 2026-08-13 Live console: icons open Website/LinkedIn in a popup window (contenteditable was swallowing clicks); Notes cells expand-on-click
  121. 15117d1 2026-08-13 Live console: real SVG phone/website/LinkedIn icons + value-as-plaintext links; persist density; harden phone-vs-domain detection
  122. 58c6056 2026-08-13 Server: send no-store/no-cache headers so the browser always loads the latest console (kills the stale-cache 'doesn't work' after every update)
  123. 775dcab 2026-08-13 Left-panel Sheets selector: check 1..all sheets by name (with row counts); multi-select shows COMBINED data via /api/combined (union columns by header, Sheet Name leads, green remapped); click a name = only that sheet; All/None; layout persists per-view
  124. 58db3f6 2026-08-13 Composer: wider default (620px) + drag left edge to resize/expand drawer (persists), taller flex-grow draft body, field values wrap fully so nothing truncates
  125. ff8d35a 2026-08-13 Phone UX: number renders as plain text + a 📞 call icon beside it (tel: link on the icon, not the number); applies to every phone field across all tabs (Phone 1-4, Phone(s), Company Phone)
  126. a8e0412 2026-08-13 Remove jumpy 'Wider' bulk button (bumped all cols +60 -> lurched table 1000px+ right); keep 'Fit to content' + 'Reset'. Phone split verified populating Phone 1/2/3 from multi-number Phone(s)
  127. 2c2d33c 2026-08-13 Fix width-weird-on-click: table width = exact sum of column widths (absolute, no proportional re-scaling); resize re-renders once on release. Verified stable across sort/filter/view clicks via click-through
  128. 10ea773 2026-08-13 Smooth column resize: drag a guide line (no per-frame 2500-row reflow), apply width once on release; resize cursor + wider grab handle. Fixes jolty resize UX
  129. a43fc1d 2026-08-13 Left panel: column controls — '⤢ Fit all' (auto-expand every column to content), '↔ Wider' (+60px each), '↺ Reset' (clear widths+order)
  130. f54646e 2026-08-13 Field reorder = drag (removed up/down buttons): left FIELDS rows have a grip to drag-reorder; table header drag + panel drag share one reorder() that syncs BOTH views; column order persists per tab. Also: split Phone(s) into Phone 1-4 columns (tap-to-call)
  131. d4ebb5d 2026-08-13 Left FIELDS panel: per-field move up/down controls that reorder table columns (self-wiring renderFields + moveField, order persists per tab); shows fields in current column order
  132. 0f87d75 2026-08-13 Console: default column order pulls First Name + Last Name up right after Contact Name so they're visible without scrolling (only when user has no saved order)
  133. eb71907 2026-08-13 Add 'Sheet Name' as first column on every tab, populated with the tab title on every record (non-destructive insert); phone cells tap-to-call (tel: links); composer phone option = full spoken phone pitch
  134. 43cf368 2026-08-13 Console layout: FREEZE header row (border-collapse:separate + #wrap scroll container makes sticky thead work) + MOVE columns via reliable manual drag (5px threshold, click=sort/drag=reorder, persists per tab) + resize/autofit; all layout state (width+order) auto-saves per user
  135. c6e12e8 2026-08-13 All LinkedIn + Website cells href to exact site: cellRender links any URL/domain (not just http-prefixed); snapshot reads FORMULA render to recover URLs from =HYPERLINK(...,'LinkedIn') label cells (533/533 MVP LinkedIn now linked). Columns: resize-drag on every column + double-click-to-autofit + hover-title full content
  136. 6f48a2b 2026-08-13 Console: resizable columns (drag edge, persists per tab via colgroup+table-layout:fixed) + night/day theme toggle (persisted) + confirm LinkedIn cells href to exact company/profile URL
  137. ea0de54 2026-08-13 Sort: blanks sink to bottom so real Last Names lead A->Z
  138. e9851ab 2026-08-13 Console: default sort = Last Name ascending on tab load
  139. 4ad282d 2026-08-13 5x sweep: default landing tab = Unique Contacts (was tab[0] = tiny Color Legend, looked 'not working'); suppress favicon 404
  140. ef8ce09 2026-08-13 Rearchitect console: serve from OUR OWN local snapshot (snapshot.py, whole workbook in ~3 batch reads) instead of live-reading the sheet per tab-switch — kills the 60/min Sheets read-quota that blanked tabs (tab reads 0.9s->0.001s); rebuilt UI with full left filter panel (search + sort + group + density + per-field toggles + per-value click-to-filter facets), List/Table/Grid, live write-back + snapshot patch, /api/refresh; smart header-row detection for title-row tabs
  141. 48eb172 2026-08-13 Split Contact Name -> First Name + Last Name across ALL 19 name-bearing tabs (parallel, quota-safe values+green writes, auto grid-expand); handles Contact Name/Contact Name(s)/Contact variants + title-row headers
  142. 0d5bb2d 2026-08-13 auto-data-snapshot: 2026-08-13T13:27:38 (3 data files) — data/ocbatches/oc_07_li.json data/ocbatches/oc_08_li.json data/ocbatches/oc_09_li.json
  143. f2b7ed7 2026-08-13 Generative email inference: learn each company's email convention from known emails, infer 800 likely emails (560 pattern-detected, 240 default) into flagged 'Likely Email (inferred)' column
  144. afcba93 2026-08-13 Fold 257 unenriched companies into the loop: append 312 contact rows to master + derive 1152 websites; regenerate 138 contact batches (4137 contacts)
  145. b039b02 2026-08-13 Contact-level enrichment: write_by_contact.py (per-person company+name match) + CONTACT_INSTRUCTIONS + 135 batches (4025 contacts) for the LinkedIn/email yoloforever loop
  146. 6916f76 2026-08-13 auto-data-snapshot: 2026-08-13T12:57:05 (1 data files) — data/ocbatches/oc_03_li.json
  147. 50ef157 2026-08-13 Live Console: reflect enriched (green) cells — /api/format reads Sheets cell backgroundColor (14236 green in master), UI tints enriched cells + legend chip; newly-edited cells mark green live
  148. 45a7dba 2026-08-13 RENTV Live Console: two-way live Sheet viewer (pull+green write-back) over lib.py; Nav Agent grid chrome (left field panel/sort/group/density/movable) + List/Table/Grid; click-to-draft composer with channel-adaptive letters (email/LinkedIn/phone) + local-AI enhance; pm2 rentv-live-console :9797
  149. cd3467b 2026-08-13 session close: openclaw first slice landed (+31 company-LI, 724 total); grind batches oc_00-12 saved for resume; back-to-back VP waves proven rate-limited (scheduled cadence only)
  150. 9f7bbd0 2026-08-13 openclaw company-LI grind (oc_run.sh + 669 untried has-website-no-LI batches); local $0 fallback while VP agent-limiter cools
  151. 1576324 2026-08-13 VP wave vp_10-15: +24 marketing VPs (118/1734 cos); split_mvp.py reusable splitter; Cody-gated scope caveats on 4 enterprise/hybrid entries
  152. 4f042f7 2026-08-13 auto-data-snapshot: 2026-08-13T11:55:54 (59 data files) — VP_INSTRUCTIONS.md __pycache__/team_vp.cpython-314.pyc data/vpbatches/vp_01.json data/vpbatches/vp_02.json data/vpbatches/vp_03.json
  153. 9983125 2026-08-13 LOCAL $0 pipeline: openclaw company-LinkedIn (local_li.py) + continuous runner (run_local.sh); replaces rate-limited Exa
  154. e30cac5 2026-08-13 propagate to Sheet2 venues (7317) + Locations; all company/venue tabs enriched
  155. 3a1c93d 2026-08-13 propagate master enrichment (websites/phones/LinkedIn/Marketing-VP split/Why) to ALL company-bearing tabs
  156. 7de7dbb 2026-08-13 master: 770 company phones from $0 website scrape written (1933 cells)
  157. 27fa73a 2026-08-13 master: split Marketing/VP into Name/Position/LinkedIn/Phone cols (441 parsed); apply_phones.py staged
  158. 94e653b 2026-08-13 master enrichment: registered Unique Contacts tab, +websites(3230)+ported 56 cos; phone_scrape.py ($0 website phone harvester)
  159. 5357336 2026-08-13 auto-data-snapshot: 2026-08-13T10:54:53 (51 data files) — AGENT_INSTRUCTIONS.md __pycache__/enrich.cpython-314.pyc data/spbatches/sp_01.json data/spbatches/sp_02.json data/spbatches/sp_03.json
  160. f5ee325 2026-08-13 FIX: name-matched writer (row-shift immune); reset+re-applied Strong Prospects 28 cos by name (0 mismatches)
  161. 0c99341 2026-08-13 header-driven writer + Why(Marketing/VP) rationale column; Event Sponsors Layer-2 complete (30 LI, 22 marketing/VP+why)
  162. b91ae60 2026-08-13 Layer 2 sweep harness: Updated Email column, contact-aware batches, shared writer + agent instructions
  163. bca1d01 2026-08-13 provenance: contacts sourced from Steve Bloom / RENTV spreadsheets (SOURCES.md + realestate.data_provenance + memory)
  164. 3315bbc 2026-08-13 Layer 2 sample (12 cos): LinkedIn company/contact hyperlinks + Marketing/VP leads via Exa, green, honest blanks
  165. 9d158db 2026-08-13 Layer 1 complete: collision-proof column placement (live-detected), 1282 websites filled green across 3 revenue tabs; reset+re-mapped Strong Prospects/Event Sponsors
  166. 3661344 2026-08-13 Layer 1 LIVE: websites + 4 new cols (Website/LinkedIn Co/LinkedIn Contact/Marketing-VP) filled green across 3 revenue tabs
  167. f280a73 2026-08-13 enrich Layer 1: website-from-email-domain engine + dry-run (1281 websites derivable $0)
  168. 915689c 2026-08-13 scaffold: Sheets API connect + stdlib read/write lib with light-green fill marking

Authors

Agents used

  • none detected

Skills used

  • /phone6
  • /ocbatches4
  • /combined3
  • /mail3
  • /vpbatches3
  • /spbatches3
  • /domain2
  • /down2
  • /claude1
  • /code1
  • /res1
  • /fabricated1
  • /reachable1
  • /position1
  • /company1
  • /firm1
  • /blank1
  • /case1
  • /typo1
  • /quality1
  • /pass-required1
  • /vandeweerd1
  • /gov1
  • /guards1
  • /defunct1
  • /generic1
  • /ambiguous1
  • /resetting1
  • /section1
  • /reset1

Creative ideas + design notes

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

15369e8 · 2026-09-02 · TK-10550 bloom-enrich: stage 25 verified contact-LinkedIn (wb_000–006, STAGE-only, 2 Cody-dropped)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HCs5zSboHd1NJkqMMjoszq
504437f · 2026-08-24 · TK-10533: add 'LinkedIn (Contact) — found' date-provenance column + going-forward stamp
Cody FIX-FIRST secondary item, approved by Steve. write_by_contact.py now resolves
a per-contact 'LinkedIn (Contact) — found' column (append-only at rightmost edge,
by-label lookup, auto-created if missing) and stamps today's ISO date the day a
LinkedIn slug is first written — giving each green LinkedIn stamp a liveness date.
ADD-only + append-only: cannot shift columns under or collide with the concurrent
RENTV writer. Column header created live at AF on gid 3823360. Legacy 1335 cells left
undated (honest 'unknown') rather than back-stamped with a false today's-date.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c911b98 · 2026-08-13 · Wrap-up: consolidate 207 recovered emails (MX-tagged master) + gated write-back memo
- rentv_recovered_ALL.csv: master of both lanes, deduped, MX-tagged, warmth-sorted
- gated write-back memo -> pending-approval (A/B/C options, low-confidence flagged)
- loop stopped at Steve's call; 162-company tail queue left intact
81ed641 · 2026-08-13 · Loop dig: web-domain lookup lane proven (5 companies -> 30 emails) + resume procedure
- data/company_domains_found.csv: resolved company domains (persistent loop state)
- rentv_websearch_recovered.csv: 30 emails from batch-1 web lookups
- rentv_company_domain_todo.csv: 238 companies ranked by warmth for the loop to grind
- RESUME-DIG.md: exact per-wake-up loop procedure + guards
f5d1b91 · 2026-08-13 · Loop dig: local email recovery + brand-collision guard + MX verify
- infer_emails_local.py: non-writing inference w/ website-domain fallback (staging only)
- company-name normalization recovery: 72 clean emails the live script missed
- ambiguity guard: blocks franchise brand-collisions (Cushman&Wakefield->picor trap)
- MX verification: all 72 recovered domains accept mail
- staged CSVs: recovered emails (confidence-tagged) + web-lookup target list
5e5158e · 2026-08-13 · rentv :9797 status data: explicit junk-value drop-list (Cody fix — no over-broad heuristic)
Replaced the GREENISH-regex + trailing-char-dedup heuristics (which could false-drop a
legitimate sage-green status color or a real value like 'Tier2') with an explicit
BAD_VALS=['Active / Contacted3'] key-drop. Precise, can't misfire on real data.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51390ef · 2026-08-13 · rentv :9797 status data: strip enrichment-green mis-captures + trailing-char dup values
The learned status_colors/status_values were polluted: 'Active / Contacted3' (a stray-digit
dup of 'Active / Contacted') carrying #cae6b4 (enrichment green mis-read as a status color).
loadMeta now filters greenish status colors + trailing-char near-dup values client-side, so
the status picker shows the 7 clean canonical values, no junk. Self-contained, reversible.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4be38e7 · 2026-08-13 · rentv :9797 legend: persist the 'more colors' fold state across re-renders (Cody fix)
Expanding the one-off-colors fold then renaming/resetting a color re-rendered the panel
and silently collapsed it. A module-scope _minorOpen now remembers the fold state and
restores it after each render.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
06105fe · 2026-08-13 · rentv :9797 legend: fold the long tail of one-off color tints under a 'N more' toggle
Legend now shows the meaningful colors (count>=15 OR grounded name) up front and collapses
the ~20-30 low-count one-off tints (header/section shading) under a click-to-expand fold —
Sheet2 goes from 34 rows to 13 shown + 21 folded. Row template factored to a helper; all
rename/reset handlers still wired across primary+minor.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ddffc49 · 2026-08-13 · Add derived 🔥 Warmth score column to RENTV live console + top-N export
- warmth.py: shared scorer (appearances + status intent + Strong-Prospect + reachability)
- live_server.py: augment tab()/combined() responses; guard write_cell against the derived col
- index.html: numeric-aware sort, read-only heat-pill cell, default sort = Warmth desc
- export_top.py: ranked 'top-N to work' CSV using the same scorer
72a7312 · 2026-08-13 · rentv :9797 legend: Cody fixes — sticky header (✕ stays visible on scroll) + Escape cancels a rename
- .lghead now position:sticky + ✕ floats within it, so the close button no longer scrolls
  out of view on tabs with many colors
- Escape sets a _legEsc flag before closeLegend so the blur handler does NOT commit a
  half-typed rename (Escape = cancel, not save)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
21e6af5 · 2026-08-13 · rentv :9797 legend: close (✕/Esc/click-outside) + per-row ↺ reset for a rename
Completes the Color Key UX + fixes Cody's 'no recovery path' for a bad rename: a renamed
color now shows ↺ to clear the localStorage override back to its grounded/provisional name;
panel closes via ✕, Escape, or clicking outside (consistent with the status picker).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
46c2c4d · 2026-08-13 · rentv :9797 legend: Cody fixes — empty-rename guard, mark heuristic guesses, don't nuke mid-edit
- onblur only saves a NON-empty name (empty no longer permanently overrides CNAMED/heuristic)
- provName getter ignores an empty stored name
- non-grounded (heuristic) names render dim-italic + a grey '?' so a guess is never shown as fact
- renderLegend() skips rebuild while a name is being edited (no mid-edit data loss on tab switch)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
aba95a9 · 2026-08-13 · rentv :9797: add in-viewer Color Key legend panel (🎨 Colors) — swatch + count + editable provisional name
Reads the client COLORS map for the loaded tab, tallies distinct exact colors, shows
each with a swatch, hex, cell-count and a grounded provisional meaning (blue=Contacted,
green=Has email, magenta=Needs email, cyan/yellow flagged ❓ awaiting Steve). Names are
click-to-rename, persisted to localStorage — reversible, NO sheet write. Addresses Cody's
'color chaos with no key' note.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
707c9b1 · 2026-08-13 · rentv :9797 exact-colors: Cody fixes — readable text on painted link/mail/phone cells, saved-flash survives, drop ghost near-whites
- link/mail/phone cells now get bg+auto-contrast text via --xtext var + td.xcol CSS
  (!important) so accent-blue link text isn't unreadable on magenta/cyan fills
- td.saved flash forced !important so a write-confirm still shows on colored cells
- hexc() skips near-white greyscale ghosts (#f3f3f3 etc, invisible on panels); keeps #e6e6e6+

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
b159bca · 2026-08-13 · FIX critical data-corruption: combined/multi-sheet view writes went to the wrong tab/row/column (postWrite sent stale GID + combined indices). Server now reverse-maps combined (row,union-col) -> source (gid,tab-row,tab-col); client sends DATA.gid+gids. Verified exact on 157/157 sampled cells.
Found via yoloforever loop (Cody red-team + in-process DTD).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ca6b2ac · 2026-08-13 · rentv :9797: paint EXACT original sheet cell colors in the grid (restore lost color-coding)
snapshot.py now captures every non-white, non-enrichment-green cell's exact hex per
tab (colors map); live_server tab()/combined() pass it through; cellTD paints each
cell its real sheet background (bg-only on link/mail/phone, bg+auto-contrast text on
plain). No legend names needed, no sheet write — the human color-coding is visible again.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1098075 · 2026-08-13 · rentv :9797 draft composer: richer Follow-up (thank-you + questions + scheduling options)
Follow-up purpose now has its own copy across Email/LinkedIn/Phone: thanks them
for taking the time to review, asks 2-3 tailored questions, and offers creative
next steps (15-min call windows, 'name a better week' follow-up date, one-pager).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
dfed233 · 2026-08-13 · Live console: email cells are now clickable mailto links; color-coded Status field (colors pulled from the sheet) + click-to-set status picker that writes the value to the sheet
- snapshot.py: extract Status(color) value->color map + canonical value list from cell fills
- live_server.py meta(): expose status_field/status_colors/status_values
- UI: colored status chips + picker popover, email mailcell

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

File tree

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

Other build journals

← Rentv Promos  ·  all 4 projects  ·  Rentv Sheet Enrich Refine →

Export

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

rendered in 5ms