← 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
A analyze_colors.pyM rentv_websearch_recovered.csvA verify_bloom.py
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 →