{"slug":"rentv-sheet-enrich-refine","total":76,"limit":100,"offset":0,"since":null,"commits":[{"hash":"956099c","date":"2026-08-31 01:38:19 -0700","author":"Steve Abrams","subject":"team_vp.py: repoint VP_MODEL default muse-glimmer→qwen3:14b (TK-10980, muse removed)","body":""},{"hash":"5e5158e","date":"2026-08-13 21:00:09 -0700","author":"Steve Abrams","subject":"rentv :9797 status data: explicit junk-value drop-list (Cody fix — no over-broad heuristic)","body":"Replaced the GREENISH-regex + trailing-char-dedup heuristics (which could false-drop a\nlegitimate sage-green status color or a real value like 'Tier2') with an explicit\nBAD_VALS=['Active / Contacted3'] key-drop. Precise, can't misfire on real data.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"51390ef","date":"2026-08-13 20:56:26 -0700","author":"Steve Abrams","subject":"rentv :9797 status data: strip enrichment-green mis-captures + trailing-char dup values","body":"The learned status_colors/status_values were polluted: 'Active / Contacted3' (a stray-digit\ndup of 'Active / Contacted') carrying #cae6b4 (enrichment green mis-read as a status color).\nloadMeta now filters greenish status colors + trailing-char near-dup values client-side, so\nthe status picker shows the 7 clean canonical values, no junk. Self-contained, reversible.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"4be38e7","date":"2026-08-13 20:43:03 -0700","author":"Steve Abrams","subject":"rentv :9797 legend: persist the 'more colors' fold state across re-renders (Cody fix)","body":"Expanding the one-off-colors fold then renaming/resetting a color re-rendered the panel\nand silently collapsed it. A module-scope _minorOpen now remembers the fold state and\nrestores it after each render.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"06105fe","date":"2026-08-13 20:41:03 -0700","author":"Steve Abrams","subject":"rentv :9797 legend: fold the long tail of one-off color tints under a 'N more' toggle","body":"Legend now shows the meaningful colors (count>=15 OR grounded name) up front and collapses\nthe ~20-30 low-count one-off tints (header/section shading) under a click-to-expand fold —\nSheet2 goes from 34 rows to 13 shown + 21 folded. Row template factored to a helper; all\nrename/reset handlers still wired across primary+minor.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"ddffc49","date":"2026-08-13 20:16:12 -0700","author":"Steve Abrams","subject":"Add derived 🔥 Warmth score column to RENTV live console + top-N export","body":"- warmth.py: shared scorer (appearances + status intent + Strong-Prospect + reachability)\n- live_server.py: augment tab()/combined() responses; guard write_cell against the derived col\n- index.html: numeric-aware sort, read-only heat-pill cell, default sort = Warmth desc\n- export_top.py: ranked 'top-N to work' CSV using the same scorer"},{"hash":"72a7312","date":"2026-08-13 20:15:36 -0700","author":"Steve Abrams","subject":"rentv :9797 legend: Cody fixes — sticky header (✕ stays visible on scroll) + Escape cancels a rename","body":"- .lghead now position:sticky + ✕ floats within it, so the close button no longer scrolls\n  out of view on tabs with many colors\n- Escape sets a _legEsc flag before closeLegend so the blur handler does NOT commit a\n  half-typed rename (Escape = cancel, not save)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"21e6af5","date":"2026-08-13 20:11:32 -0700","author":"Steve Abrams","subject":"rentv :9797 legend: close (✕/Esc/click-outside) + per-row ↺ reset for a rename","body":"Completes the Color Key UX + fixes Cody's 'no recovery path' for a bad rename: a renamed\ncolor now shows ↺ to clear the localStorage override back to its grounded/provisional name;\npanel closes via ✕, Escape, or clicking outside (consistent with the status picker).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"46c2c4d","date":"2026-08-13 18:42:30 -0700","author":"Steve Abrams","subject":"rentv :9797 legend: Cody fixes — empty-rename guard, mark heuristic guesses, don't nuke mid-edit","body":"- onblur only saves a NON-empty name (empty no longer permanently overrides CNAMED/heuristic)\n- provName getter ignores an empty stored name\n- non-grounded (heuristic) names render dim-italic + a grey '?' so a guess is never shown as fact\n- renderLegend() skips rebuild while a name is being edited (no mid-edit data loss on tab switch)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"aba95a9","date":"2026-08-13 18:39:26 -0700","author":"Steve Abrams","subject":"rentv :9797: add in-viewer Color Key legend panel (🎨 Colors) — swatch + count + editable provisional name","body":"Reads the client COLORS map for the loaded tab, tallies distinct exact colors, shows\neach with a swatch, hex, cell-count and a grounded provisional meaning (blue=Contacted,\ngreen=Has email, magenta=Needs email, cyan/yellow flagged ❓ awaiting Steve). Names are\nclick-to-rename, persisted to localStorage — reversible, NO sheet write. Addresses Cody's\n'color chaos with no key' note.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"60e8dcd","date":"2026-08-13 18:37:55 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-13T18:37:41 (1 data files) — __pycache__/snapshot.cpython-314.pyc","body":""},{"hash":"707c9b1","date":"2026-08-13 18:12:06 -0700","author":"Steve Abrams","subject":"rentv :9797 exact-colors: Cody fixes — readable text on painted link/mail/phone cells, saved-flash survives, drop ghost near-whites","body":"- link/mail/phone cells now get bg+auto-contrast text via --xtext var + td.xcol CSS\n  (!important) so accent-blue link text isn't unreadable on magenta/cyan fills\n- td.saved flash forced !important so a write-confirm still shows on colored cells\n- hexc() skips near-white greyscale ghosts (#f3f3f3 etc, invisible on panels); keeps #e6e6e6+\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"1c5e092","date":"2026-08-13 18:10:22 -0700","author":"Steve Abrams","subject":"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.).","body":"yoloforever cycle 3 (Cody title-row hint).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8150eeb","date":"2026-08-13 18:07:18 -0700","author":"Steve Abrams","subject":"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)","body":"yoloforever cycle 2 (Cody Bug 4).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"b159bca","date":"2026-08-13 18:05:15 -0700","author":"Steve Abrams","subject":"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.","body":"Found via yoloforever loop (Cody red-team + in-process DTD).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"ca6b2ac","date":"2026-08-13 18:05:13 -0700","author":"Steve Abrams","subject":"rentv :9797: paint EXACT original sheet cell colors in the grid (restore lost color-coding)","body":"snapshot.py now captures every non-white, non-enrichment-green cell's exact hex per\ntab (colors map); live_server tab()/combined() pass it through; cellTD paints each\ncell its real sheet background (bg-only on link/mail/phone, bg+auto-contrast text on\nplain). No legend names needed, no sheet write — the human color-coding is visible again.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"95c5ba3","date":"2026-08-13 17:17:09 -0700","author":"Steve Abrams","subject":"Live console: show Last Modified date+time directly under the Status chip; stamp it on status-pick and drag-drop writes too","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"fe7b566","date":"2026-08-13 16:59:24 -0700","author":"Steve Abrams","subject":"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)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"1098075","date":"2026-08-13 16:57:32 -0700","author":"Steve Abrams","subject":"rentv :9797 draft composer: richer Follow-up (thank-you + questions + scheduling options)","body":"Follow-up purpose now has its own copy across Email/LinkedIn/Phone: thanks them\nfor taking the time to review, asks 2-3 tailored questions, and offers creative\nnext steps (15-min call windows, 'name a better week' follow-up date, one-pager).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"dfed233","date":"2026-08-13 16:41:20 -0700","author":"Steve Abrams","subject":"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","body":"- snapshot.py: extract Status(color) value->color map + canonical value list from cell fills\n- live_server.py meta(): expose status_field/status_colors/status_values\n- UI: colored status chips + picker popover, email mailcell\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"00fc8a6","date":"2026-08-13 16:27:15 -0700","author":"Steve Abrams","subject":"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)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"2a21996","date":"2026-08-13 16:24:25 -0700","author":"Steve Abrams","subject":"Live console: FORCE grouping off on every load (kills the black sub-sort header bars for good; was persisting via localStorage)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"5e82fcf","date":"2026-08-13 16:20:57 -0700","author":"Steve Abrams","subject":"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","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"e2b2b9e","date":"2026-08-13 16:15:19 -0700","author":"Steve Abrams","subject":"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","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"c5739ce","date":"2026-08-13 16:11:03 -0700","author":"Steve Abrams","subject":"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","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"4ff3c02","date":"2026-08-13 16:06:19 -0700","author":"Steve Abrams","subject":"Live console: Website/LinkedIn/phone cells are now WHOLE-CELL clickable (leading icon never clipped) — opens popup / dials; text cells stay editable","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"1bff2a8","date":"2026-08-13 16:01:49 -0700","author":"Steve Abrams","subject":"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)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"44d2687","date":"2026-08-13 15:57:47 -0700","author":"Steve Abrams","subject":"Live console: icons open Website/LinkedIn in a popup window (contenteditable was swallowing clicks); Notes cells expand-on-click","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"15117d1","date":"2026-08-13 15:19:54 -0700","author":"Steve Abrams","subject":"Live console: real SVG phone/website/LinkedIn icons + value-as-plaintext links; persist density; harden phone-vs-domain detection","body":""},{"hash":"58c6056","date":"2026-08-13 15:10:13 -0700","author":"Steve Abrams","subject":"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)","body":""},{"hash":"775dcab","date":"2026-08-13 15:08:13 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"58db3f6","date":"2026-08-13 15:02:04 -0700","author":"Steve Abrams","subject":"Composer: wider default (620px) + drag left edge to resize/expand drawer (persists), taller flex-grow draft body, field values wrap fully so nothing truncates","body":""},{"hash":"ff8d35a","date":"2026-08-13 15:00:10 -0700","author":"Steve Abrams","subject":"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)","body":""},{"hash":"a8e0412","date":"2026-08-13 14:58:10 -0700","author":"Steve Abrams","subject":"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)","body":""},{"hash":"2c2d33c","date":"2026-08-13 14:56:29 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"10ea773","date":"2026-08-13 14:52:19 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"a43fc1d","date":"2026-08-13 14:50:13 -0700","author":"Steve Abrams","subject":"Left panel: column controls — '⤢ Fit all' (auto-expand every column to content), '↔ Wider' (+60px each), '↺ Reset' (clear widths+order)","body":""},{"hash":"f54646e","date":"2026-08-13 14:46:41 -0700","author":"Steve Abrams","subject":"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)","body":""},{"hash":"d4ebb5d","date":"2026-08-13 14:42:55 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"0f87d75","date":"2026-08-13 14:39:45 -0700","author":"Steve Abrams","subject":"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)","body":""},{"hash":"eb71907","date":"2026-08-13 14:31:30 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"43cf368","date":"2026-08-13 14:25:57 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"c6e12e8","date":"2026-08-13 14:15:48 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"6f48a2b","date":"2026-08-13 14:11:56 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"ea0de54","date":"2026-08-13 14:08:07 -0700","author":"Steve Abrams","subject":"Sort: blanks sink to bottom so real Last Names lead A->Z","body":""},{"hash":"e9851ab","date":"2026-08-13 14:07:45 -0700","author":"Steve Abrams","subject":"Console: default sort = Last Name ascending on tab load","body":""},{"hash":"4ad282d","date":"2026-08-13 14:06:14 -0700","author":"Steve Abrams","subject":"5x sweep: default landing tab = Unique Contacts (was tab[0] = tiny Color Legend, looked 'not working'); suppress favicon 404","body":""},{"hash":"ef8ce09","date":"2026-08-13 13:57:54 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"48eb172","date":"2026-08-13 13:33:05 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"0d5bb2d","date":"2026-08-13 13:27:55 -0700","author":"auto-commit-fleet","subject":"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","body":""},{"hash":"f2b7ed7","date":"2026-08-13 13:12:20 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"afcba93","date":"2026-08-13 13:07:24 -0700","author":"Steve Abrams","subject":"Fold 257 unenriched companies into the loop: append 312 contact rows to master + derive 1152 websites; regenerate 138 contact batches (4137 contacts)","body":""},{"hash":"b039b02","date":"2026-08-13 13:01:56 -0700","author":"Steve Abrams","subject":"Contact-level enrichment: write_by_contact.py (per-person company+name match) + CONTACT_INSTRUCTIONS + 135 batches (4025 contacts) for the LinkedIn/email yoloforever loop","body":""},{"hash":"6916f76","date":"2026-08-13 12:57:23 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-13T12:57:05 (1 data files) — data/ocbatches/oc_03_li.json","body":""},{"hash":"50ef157","date":"2026-08-13 12:51:20 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"45a7dba","date":"2026-08-13 12:46:01 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"cd3467b","date":"2026-08-13 12:28:37 -0700","author":"Steve Abrams","subject":"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)","body":""},{"hash":"9f7bbd0","date":"2026-08-13 12:22:02 -0700","author":"Steve Abrams","subject":"openclaw company-LI grind (oc_run.sh + 669 untried has-website-no-LI batches); local $0 fallback while VP agent-limiter cools","body":""},{"hash":"1576324","date":"2026-08-13 12:11:45 -0700","author":"Steve Abrams","subject":"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","body":""},{"hash":"4f042f7","date":"2026-08-13 11:56:12 -0700","author":"auto-commit-fleet","subject":"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","body":""},{"hash":"9983125","date":"2026-08-13 11:27:57 -0700","author":"Steve Abrams","subject":"LOCAL $0 pipeline: openclaw company-LinkedIn (local_li.py) + continuous runner (run_local.sh); replaces rate-limited Exa","body":""},{"hash":"e30cac5","date":"2026-08-13 11:10:26 -0700","author":"Steve Abrams","subject":"propagate to Sheet2 venues (7317) + Locations; all company/venue tabs enriched","body":""},{"hash":"3a1c93d","date":"2026-08-13 11:09:28 -0700","author":"Steve Abrams","subject":"propagate master enrichment (websites/phones/LinkedIn/Marketing-VP split/Why) to ALL company-bearing tabs","body":""},{"hash":"7de7dbb","date":"2026-08-13 11:05:56 -0700","author":"Steve Abrams","subject":"master: 770 company phones from $0 website scrape written (1933 cells)","body":""},{"hash":"27fa73a","date":"2026-08-13 11:03:10 -0700","author":"Steve Abrams","subject":"master: split Marketing/VP into Name/Position/LinkedIn/Phone cols (441 parsed); apply_phones.py staged","body":""},{"hash":"94e653b","date":"2026-08-13 10:57:51 -0700","author":"Steve Abrams","subject":"master enrichment: registered Unique Contacts tab, +websites(3230)+ported 56 cos; phone_scrape.py ($0 website phone harvester)","body":""},{"hash":"5357336","date":"2026-08-13 10:55:07 -0700","author":"auto-commit-fleet","subject":"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","body":""},{"hash":"f5ee325","date":"2026-08-13 10:30:13 -0700","author":"Steve Abrams","subject":"FIX: name-matched writer (row-shift immune); reset+re-applied Strong Prospects 28 cos by name (0 mismatches)","body":""},{"hash":"0c99341","date":"2026-08-13 10:21:40 -0700","author":"Steve Abrams","subject":"header-driven writer + Why(Marketing/VP) rationale column; Event Sponsors Layer-2 complete (30 LI, 22 marketing/VP+why)","body":""},{"hash":"b91ae60","date":"2026-08-13 09:48:42 -0700","author":"Steve Abrams","subject":"Layer 2 sweep harness: Updated Email column, contact-aware batches, shared writer + agent instructions","body":""},{"hash":"bca1d01","date":"2026-08-13 09:44:22 -0700","author":"Steve Abrams","subject":"provenance: contacts sourced from Steve Bloom / RENTV spreadsheets (SOURCES.md + realestate.data_provenance + memory)","body":""},{"hash":"3315bbc","date":"2026-08-13 09:35:46 -0700","author":"Steve Abrams","subject":"Layer 2 sample (12 cos): LinkedIn company/contact hyperlinks + Marketing/VP leads via Exa, green, honest blanks","body":""},{"hash":"9d158db","date":"2026-08-13 09:29:34 -0700","author":"Steve Abrams","subject":"Layer 1 complete: collision-proof column placement (live-detected), 1282 websites filled green across 3 revenue tabs; reset+re-mapped Strong Prospects/Event Sponsors","body":""},{"hash":"3661344","date":"2026-08-13 09:24:14 -0700","author":"Steve Abrams","subject":"Layer 1 LIVE: websites + 4 new cols (Website/LinkedIn Co/LinkedIn Contact/Marketing-VP) filled green across 3 revenue tabs","body":""},{"hash":"f280a73","date":"2026-08-13 09:20:03 -0700","author":"Steve Abrams","subject":"enrich Layer 1: website-from-email-domain engine + dry-run (1281 websites derivable $0)","body":""},{"hash":"915689c","date":"2026-08-13 09:18:01 -0700","author":"Steve Abrams","subject":"scaffold: Sheets API connect + stdlib read/write lib with light-green fill marking","body":""}]}