[object Object]

← back to Rentv Sheet Enrich

yoloforever cycle 1: +5 domains (113 total), 5 held (ambiguous/defunct)

b21787e52509e645aa3abc3592b478aa7c716801 · 2026-08-14 09:13:56 -0700 · Steve Abrams

Files touched

Diff

commit b21787e52509e645aa3abc3592b478aa7c716801
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri Aug 14 09:13:56 2026 -0700

    yoloforever cycle 1: +5 domains (113 total), 5 held (ambiguous/defunct)
---
 analyze_colors.py             | 70 +++++++++++++++++++++++++++++++++++++++++++
 rentv_websearch_recovered.csv |  5 ++++
 verify_bloom.py               | 40 +++++++++++++++++++++++++
 3 files changed, 115 insertions(+)

diff --git a/analyze_colors.py b/analyze_colors.py
new file mode 100644
index 0000000..3fbca8e
--- /dev/null
+++ b/analyze_colors.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+"""
+analyze_colors.py — READ-ONLY. For every tab, tally the EXACT background color of every
+non-white, non-enrichment-green cell, BY COLUMN, so we can see which column carries each
+row's status color-coding. Writes NOTHING.
+"""
+import sys, os, json, urllib.request, urllib.parse
+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+import lib
+
+def api(url, tok):
+    r = urllib.request.Request(url, headers={"Authorization": f"Bearer {tok}"})
+    return json.load(urllib.request.urlopen(r))
+
+G = lib.GREEN
+def is_green(bg):
+    return bool(bg) and abs(bg.get("red",1)-G["red"])<0.06 and \
+        abs(bg.get("green",1)-G["green"])<0.06 and abs(bg.get("blue",1)-G["blue"])<0.06
+def hexc(bg):
+    if not bg: return None
+    r,g,b = bg.get("red",0.0),bg.get("green",0.0),bg.get("blue",0.0)
+    if r>0.96 and g>0.96 and b>0.96: return None
+    if (max(r,g,b)-min(r,g,b))<0.04 and min(r,g,b)>0.91: return None
+    return "#%02x%02x%02x" % (round(r*255),round(g*255),round(b*255))
+
+tok = lib.access_token()
+sheets = [(s["properties"]["sheetId"], s["properties"]["title"])
+          for s in lib.get_meta(tok)["sheets"]]
+qs = "&".join("ranges="+urllib.parse.quote("'"+t.replace("'","''")+"'",safe="") for _,t in sheets)
+# values (for headers) + backgrounds
+vals = api(f"{lib.API}/{lib.SID}/values:batchGet?{qs}&majorDimension=ROWS&valueRenderOption=FORMATTED_VALUE", tok)
+vr = {t: v.get("values",[]) for (_,t),v in zip(sheets, vals.get("valueRanges",[]))}
+fmt = api(f"{lib.API}/{lib.SID}?{qs}&includeGridData=true"
+          "&fields=sheets(properties(sheetId,title),data.rowData.values.effectiveFormat.backgroundColor)", tok)
+
+def header_row(rows):
+    best,bi=-1,0
+    for i in range(min(4,len(rows))):
+        n=sum(1 for c in rows[i] if str(c).strip())
+        if n>best: best,bi=n,i
+    return bi
+
+overall={}
+print("=== PER-TAB, PER-COLUMN COLOR TALLY (data rows only) ===")
+for sh in fmt.get("sheets",[]):
+    gid=sh["properties"]["sheetId"]; title=sh["properties"]["title"]
+    rows=vr.get(title,[])
+    if not rows: continue
+    hr=header_row(rows)
+    hdr=[str(x).strip() for x in rows[hr]]
+    grid=(sh.get("data") or [{}])[0].get("rowData",[])
+    colcolors={}  # col -> {hex:count}
+    for ri,row in enumerate(grid):
+        if ri<=hr: continue
+        for ci,cell in enumerate(row.get("values",[]) or []):
+            bg=(cell.get("effectiveFormat") or {}).get("backgroundColor")
+            if is_green(bg): continue
+            hx=hexc(bg)
+            if hx:
+                colcolors.setdefault(ci,{}); colcolors[ci][hx]=colcolors[ci].get(hx,0)+1
+                overall[hx]=overall.get(hx,0)+1
+    if not colcolors: continue
+    print(f"\n## {title}  (gid={gid}, header_row={hr}, cols={len(hdr)})")
+    for ci in sorted(colcolors):
+        h = hdr[ci] if ci<len(hdr) else ""
+        dist=", ".join(f"{k}:{v}" for k,v in sorted(colcolors[ci].items(),key=lambda kv:-kv[1]))
+        print(f"  col{ci:>2} [{h[:28]:28}] {dist}")
+print("\n=== OVERALL COLOR TOTALS ===")
+for k,v in sorted(overall.items(),key=lambda kv:-kv[1]):
+    print(f"  {k}: {v}")
diff --git a/rentv_websearch_recovered.csv b/rentv_websearch_recovered.csv
index 648edbd..52e7a6a 100644
--- a/rentv_websearch_recovered.csv
+++ b/rentv_websearch_recovered.csv
@@ -101,13 +101,18 @@ Jeff Higgins,Ascentris,jeff.higgins@ascentris.com,303-317-6464,Needs Email / Out
 Jeff Stargardter,Trimont Real Estate Advisors,jeff.stargardter@trimont.com,,Active / Contacted,2,websearch first.last
 Jeffrey Hakim,iCore Global,jeffrey.hakim@icoreglobal.com,,Needs Email / Outreach Pending,2,websearch first.last
 Jeffrey Weller,Lion Real Estate,jeffrey.weller@lionreg.com,,Needs Email / Outreach Pending,2,websearch first.last
+Jenn Lackey,Unison Bank,jenn.lackey@unisonbank.com,,Prospect / Follow-up,2,websearch first.last

 Jennifer Walton,H. Hendy Associates,jennifer.walton@hhendy.com,,Needs Email / Outreach Pending,2,websearch first.last
 Jeremy Sedrish,Vanbarton Group,jeremy.sedrish@vanbartongroup.com,,Active / Contacted,2,websearch first.last
 Jerry Dunn,A10 Capital,jerry.dunn@a10capital.com,,Active / Contacted,1,websearch first.last
+Jesse Liu,Laurus Corporation,jesse.liu@lauruscorporation.com,,Needs Email / Outreach Pending,2,websearch first.last

 Jim McGill,CA Ventures/CA Industrial,jim.mcgill@ca-ventures.com,,Needs Email / Outreach Pending,3,websearch first.last
 Jim McGill,CA Industrial,jim.mcgill@ca-ventures.com,,Needs Email / Outreach Pending,2,websearch first.last
 JJ Smith,CA Ventures/CA Industrial,jj.smith@ca-ventures.com,,Needs Email / Outreach Pending,3,websearch first.last
 Joe Gomez,A10 Capital,joe.gomez@a10capital.com,,Active / Contacted,1,websearch first.last
+John Ho,Landsea Holdings,john.ho@landseahomes.com,,Needs Email / Outreach Pending,2,websearch first.last

+JOhn MacLean,Fidelity Mortgage Lenders,john.maclean@fidelityca.com,310-820-4300,Needs Email / Outreach Pending,2,websearch first.last

+John Murray,PIMCO,john.murray@pimco.com,,Needs Email / Outreach Pending,2,websearch first.last

 Jonathan Winick,Upside Capital Holdings,jonathan.winick@upsidecapitalholdings.com,,Active / Contacted,3,websearch first.last
 Jordan Mellovitz,3Edgewood,jordan.mellovitz@3edgewood.com,,Active / Contacted,5,websearch first.last
 Jordan Stone,Harbor Group International,jordan.stone@harborgroupint.com,,Active / Contacted,4,websearch first.last
diff --git a/verify_bloom.py b/verify_bloom.py
new file mode 100644
index 0000000..fabf48c
--- /dev/null
+++ b/verify_bloom.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+"""
+verify_bloom.py — READ-ONLY proof capture for the master "Unique Contacts (all tabs)"
+tab. Prints column indices + non-empty counts + a stable SHA of the ORIGINAL columns
+(Email, Company/Venue, Contact Name) so we can prove ADD-only writes never touched them.
+Writes NOTHING. Usage: python3 verify_bloom.py [label]
+"""
+import sys, os, hashlib, json
+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+import lib
+
+LABEL = sys.argv[1] if len(sys.argv) > 1 else "state"
+GID = 3823360
+TITLE = "Unique Contacts (all tabs)"
+
+tok = lib.access_token()
+rows = lib.read_tab(tok, TITLE)
+hdr = [h.strip() for h in rows[0]]
+c = {v: i for i, v in enumerate(hdr) if v}
+def col(name): return c.get(name)
+def g(r, i): return (r[i].strip() if (i is not None and i < len(r)) else "")
+
+def coldump(i):
+    return [g(r, i) for r in rows[1:]]
+
+def colsha(i):
+    return hashlib.sha256("\x1f".join(coldump(i)).encode()).hexdigest()[:16]
+
+def nonempty(i):
+    return sum(1 for r in rows[1:] if g(r, i))
+
+targets = ["Contact Name", "Company/Venue", "Email", "Updated Email (found)",
+           "Likely Email (inferred)", "LinkedIn (Contact)"]
+out = {"label": LABEL, "title": TITLE, "total_rows": len(rows) - 1, "cols": {}}
+for t in targets:
+    i = col(t)
+    out["cols"][t] = {"idx": i,
+                      "nonempty": nonempty(i) if i is not None else None,
+                      "sha16": colsha(i) if i is not None else None}
+print(json.dumps(out, indent=1))

← ebccbbf Loop tick 14: +8 domains (108 total), Dove + Riverwest held  ·  back to Rentv Sheet Enrich  ·  auto-data-snapshot: 2026-08-14T09:20:46 (3 data files) — NOT 31013ee →