[object Object]

← back to Labj Cre Banks

Viewer: surface data provenance (LABJ-pointer vs public-source), per-row source badge, clearer detail labels (TK-10411)

221f2f7f723dd2c957f6e2c149b0a92376ff5916 · 2026-08-10 11:55:07 -0700 · Steve Abrams

Files touched

Diff

commit 221f2f7f723dd2c957f6e2c149b0a92376ff5916
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 10 11:55:07 2026 -0700

    Viewer: surface data provenance (LABJ-pointer vs public-source), per-row source badge, clearer detail labels (TK-10411)
---
 public/index.html | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/public/index.html b/public/index.html
index 84b062a..61f389b 100644
--- a/public/index.html
+++ b/public/index.html
@@ -44,6 +44,12 @@
   .detail-grid { display: grid; grid-template-columns: 160px 1fr; gap: 2px 14px; font-size: 12px; }
   .detail-grid b { color: #555; font-weight: 600; }
   .count { padding: 6px 18px; font-size: 12px; color: #666; background: #faf8f4; }
+  .prov { padding: 8px 18px; font-size: 12px; line-height: 1.5; color: #3a3a3a;
+          background: #eef3ea; border-bottom: 1px solid #d6e0cf; }
+  .prov b { color: #1a1a1a; }
+  .pill { font-size: 10px; font-weight: 700; padding: 2px 7px; border-radius: 999px; letter-spacing: .3px; }
+  .orig-labj { background: #12223a; color: #fff; }
+  .orig-research { background: #e7e2d6; color: #5a5344; }
 </style>
 </head>
 <body>
@@ -58,6 +64,7 @@
   <button id="reset">Reset</button>
   <span style="font-size:12px;color:#888">tip: click a row to expand · click a header to sort · drag headers to reorder</span>
 </div>
+<div class="prov" id="prov">loading provenance…</div>
 <div class="chips" id="chips"></div>
 <div class="colpanel" id="colpanel"></div>
 <div class="count" id="count"></div>
@@ -73,9 +80,9 @@ const ALL_COLS = [
   ["specialties","Specialties"], ["key_metric","Metric"],
   ["state","State"], ["zip","Zip"], ["address","Address"],
   ["advertiser_fit_reason","Fit reason"], ["source_company","Sources"],
-  ["origin","Origin"], ["last_verified","Verified"]
+  ["origin","Source"], ["last_verified","Verified"]
 ];
-const DEFAULT_COLS = ["company_name","categories","advertiser_fit_score","city",
+const DEFAULT_COLS = ["company_name","origin","categories","advertiser_fit_score","city",
   "website","main_phone","top_local_executive","marketing_pr_contact","public_email","last_verified"];
 let DATA = [], state = load();
 
@@ -87,6 +94,14 @@ fetch("./labj_master.json").then(r=>r.json()).then(d=>{
   DATA = d.records || d;
   document.getElementById("meta").textContent =
     `${d.count||DATA.length} companies · generated ${d.generated||""} · sorted by RENTV advertiser-fit`;
+  const labj = DATA.filter(r=>r.origin==="labj_seed").length;
+  const research = DATA.length - labj;
+  const withSrc = DATA.filter(r=>(r.source_company||"").trim()).length;
+  document.getElementById("prov").innerHTML =
+    `<b>Where this data comes from:</b> LABJ's paid "Book of Lists" is used only as a <i>discovery/ranking pointer</i> — every field is rebuilt from independent public sources with attribution (no LABJ paid product is reproduced). ` +
+    `<b>${labj}</b> firms were captured from LABJ's <i>public</i> list rows (ranks 1–3, the only rows LABJ shows for free); ` +
+    `<b>${research}</b> were rebuilt from each firm's own public web presence (LABJ used only to know which firms/categories to research). ` +
+    `<b>${withSrc}/${DATA.length}</b> carry public source URLs — click any row to see its <i>LABJ list pointer</i> and its <i>data sources</i>. The <span class="pill orig-labj">LABJ</span> / <span class="pill orig-research">Research</span> badge on each row marks which.`;
   buildChips(); buildColPanel(); applyDensity(); render();
 });
 
@@ -142,6 +157,10 @@ function cell(r,k){
   if(k==="main_phone" && v) return `<a href="tel:${v.replace(/[^0-9+]/g,'')}">${v}</a>`;
   if(k==="advertiser_fit_score") return `<span class="score ${scoreClass(+v)}">${v}</span>`;
   if(k==="categories") return `<span class="cat">${v.replace(/ \| /g,'<br>')}</span>`;
+  if(k==="origin"){
+    if(v==="labj_seed") return `<span class="pill orig-labj" title="Captured from LABJ's public list (top-3 rows)">LABJ</span>`;
+    return `<span class="pill orig-research" title="Rebuilt from independent public sources; LABJ used as a category pointer">Research</span>`;
+  }
   return v;
 }
 
@@ -198,7 +217,7 @@ function toggleDetail(tr, r){
     ["Top exec","top_local_executive"],["Exec title","exec_title"],
     ["Mktg/PR contact","marketing_pr_contact"],["Mktg/PR title","marketing_pr_title"],["Email","public_email"],
     ["Specialties","specialties"],["Key metric","key_metric"],["LA presence","la_presence"],
-    ["Sources","source_company"],["LABJ pointer","source_labj"],["Origin","origin"],["Verified","last_verified"]];
+    ["Data sources (public)","source_company"],["LABJ list (discovery pointer)","source_labj"],["Record source","origin"],["Verified","last_verified"]];
   let h='<div class="detail-grid">';
   flds.forEach(([lab,k])=>{
     let v = k? (r[k]||"") : `${r.city||""} ${r.state||""} ${r.zip||""}`.trim();

← 6067c89 Restore verified Rexford CEO Laura Clark (eff. 2026-04-01, s  ·  back to Labj Cre Banks  ·  chore: gitignore __pycache__ (session close) 992b50e →