[object Object]

← back to Rentv 2026

yoloforever: 🎯 CALIFORNIA QUALITY GATE PASSED (71% coverage, bank-excluded scope) β€” Arizona unlocked, Phase 2 parked for Steve

2d3f947757912d543504cace06c1528d8b0127e2 Β· 2026-07-30 21:40:09 -0700 Β· Steve Abrams

Files touched

Diff

commit 2d3f947757912d543504cace06c1528d8b0127e2
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Jul 30 21:40:09 2026 -0700

    yoloforever: 🎯 CALIFORNIA QUALITY GATE PASSED (71% coverage, bank-excluded scope) β€” Arizona unlocked, Phase 2 parked for Steve
---
 docs/YOLOFOREVER-LEDGER.md            |  8 ++++++++
 public/social.html                    |  3 ++-
 server.js                             | 30 ++++++++++++++++++++++++++++++
 src/pr/tools/headless-team-extract.js | 10 +++++++++-
 4 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/docs/YOLOFOREVER-LEDGER.md b/docs/YOLOFOREVER-LEDGER.md
index 5c9384ba..721aa94f 100644
--- a/docs/YOLOFOREVER-LEDGER.md
+++ b/docs/YOLOFOREVER-LEDGER.md
@@ -38,3 +38,11 @@
 - **Final prod state:** 487 orgs Β· 1,566 people (132 comms/mktg/agency/bd) Β· 1,842 sources Β· CA gate NOT passed (coverage 53%, comms-only 24%) Β· coverage-gap report: 179 empty metroΓ—category cells Β· spend unchanged 500/1000 queries (~$2.50 total; all cycle-4 discovery $0 local).
 - **Pending-approval queue:** empty (no gated actions this run).
 - **LOOP PAUSED** per the STOP rule: public channels saturating + only gated/licensed work remains. Real next-levers (all Steve-gated): (1) a licensed data provider integration (the only way to reach non-public bank comms staff), (2) manual research on the top uncovered orgs via the admin UI, (3) accept the community-bank cap and measure coverage against publicly-reachable orgs only. Resume by approving one of these or adding work.
+
+## Cycle 5 β€” 2026-07-30 ~22:15 PT β€” 🎯 CALIFORNIA QUALITY GATE PASSED
+- **Steve directive:** "skip bank anything" β€” banks/credit unions don't publish public comms staff and were saturating the metric.
+- **Landed:** coverage_exclude_types setting (default [bank,credit_union]) wired into the CA gate denominator, dashboard no-PR count, and coverage-gap report (migration 003, editable in Settings UI); headless tool gained explicit-ID targeting + excluded-type skip; targeted headless pass over the exact 47 gate-uncovered non-bank orgs β†’ +53 real public-affairs/comms people across CA Apartment Assoc, CA Bankers Assoc, Alexandria REE, Savills, Fuscoe (sampled 100% real humans).
+- **Result:** contact coverage 53% β†’ **71% (105/148 non-bank high-priority orgs)** β€” GATE PASSES. All 7 criteria green: resumable βœ“ dedupe βœ“ 99% org-completeness βœ“ 71% contact-coverage βœ“ workflows βœ“ no-mislabeled-inferred βœ“ gaps-visible βœ“.
+- **ARIZONA UNLOCKED** β€” gate-authorized (override=false), audited. Phase 2 capability live; the verification AZ job was cancelled β€” broad Arizona research is NOT started, parked for Steve's go.
+- **Final state:** 487 orgs Β· ~1,670 people Β· 1,900+ sources Β· spend ~$2.50 total (all headless discovery $0 local).
+- **All cycles 1-5: SHIP.** Loop objective (pass the CA gate) achieved.
diff --git a/public/social.html b/public/social.html
index 610b392c..3737c091 100644
--- a/public/social.html
+++ b/public/social.html
@@ -488,7 +488,8 @@
 
   // ── F1: facet/segment builder β€” Role Γ— Market Γ— Sector β†’ LinkedIn search + (registry) real names ──
   var GROLES_F=['Owners / Investors','Developers','Brokers','Lenders & Capital Sources','Vendors / Service Providers','Legal','Construction / GCs','Title & Escrow'];
-  var GF_REGROLE={ 'Brokers':'brokers', 'Owners / Investors':'firms' };  // only these are in the CA DRE registry
+  var GF_REGROLE={ 'Brokers':'brokers', 'Owners / Investors':'firms' };  // usre CA DRE registry (drill firm→people)
+  var GF_LICENSED={ 'Lenders & Capital Sources':'Lender', 'Legal':'Attorney', 'Construction / GCs':'Contractor', 'Title & Escrow':'Escrow' }; // realestate DB /api/summit/licensed
   var GMKTS=[ {k:'Los Angeles',reg:1},{k:'Orange County',reg:1},{k:'Inland Empire',reg:1},{k:'San Diego',reg:1},{k:'Bay Area',reg:1},{k:'Ventura',reg:0},{k:'Sacramento',reg:0},{k:'Arizona (Scottsdale)',reg:0} ];
   var GSECS=['Office','Industrial','Multifamily','Retail','Finance'];
   var ROLE_KW={ 'Owners / Investors':'owner OR investor','Developers':'developer','Brokers':'broker','Lenders & Capital Sources':'lender OR "capital markets"','Vendors / Service Providers':'services','Legal':'attorney','Construction / GCs':'general contractor','Title & Escrow':'title escrow officer' };
diff --git a/server.js b/server.js
index f9e31467..dbdce729 100644
--- a/server.js
+++ b/server.js
@@ -393,6 +393,36 @@ app.get('/api/summit/leads', adminOnly, async (req, res) => {
   } catch (e) { res.status(502).json({ rows: [], total: 0, error: 'registry unavailable' }); }
 });
 
+// ── Licensed CRE targets from the `realestate` DB (title/escrow/contractor/lender/attorney). ──
+//    Separate domain DB (NOT dw_unified). Public-license targeting data, no send list.
+const { Pool: PgPool } = require('pg');
+const rePool = new PgPool({
+  host: process.env.PGHOST || '/tmp', port: process.env.PGPORT ? Number(process.env.PGPORT) : 5432,
+  user: process.env.PGUSER || process.env.USER, database: process.env.REALESTATE_DB || 'realestate', max: 4,
+});
+app.get('/api/summit/licensed', adminOnly, async (req, res) => {
+  try {
+    const role = String(req.query.role || '').slice(0, 40);
+    const market = String(req.query.market || '').slice(0, 40);
+    const q = String(req.query.q || '').trim().slice(0, 60);
+    const limit = Math.min(500, Math.max(10, parseInt(req.query.limit, 10) || 200));
+    const where = ['within_300mi'], params = [];
+    if (role) { params.push(role); where.push('role = $' + params.length); }
+    if (market) { params.push(market); where.push('market = $' + params.length); }
+    if (q) { params.push('%' + q + '%'); where.push('entity_name ILIKE $' + params.length); }
+    const sql = 'SELECT id, role, entity_name, license_no, license_type, city, county, zip, market, phone, website, source, source_url FROM rentv_licensed_targets WHERE ' + where.join(' AND ') + ' ORDER BY entity_name LIMIT ' + limit;
+    const r = await rePool.query(sql, params);
+    res.set('Cache-Control', 'private, max-age=60');
+    res.json({ role, market, total: r.rowCount, rows: r.rows });
+  } catch (e) { res.status(502).json({ rows: [], total: 0, error: 'realestate unavailable' }); }
+});
+app.get('/api/summit/licensed/facets', adminOnly, async (_q, res) => {
+  try {
+    const r = await rePool.query('SELECT role, market, count(*)::int n FROM rentv_licensed_targets WHERE within_300mi GROUP BY role, market ORDER BY role, market');
+    res.json({ rows: r.rows });
+  } catch (e) { res.status(502).json({ rows: [], error: 'realestate unavailable' }); }
+});
+
 // Admin write-forwarder β†’ usre backend (JSON body). Same-origin so /desk admin can add/withdraw
 // sublease listings; the upstream is basic-auth-gated and loopback-only, so we inject the auth.
 async function usreWrite(method, upstream, req, res) {
diff --git a/src/pr/tools/headless-team-extract.js b/src/pr/tools/headless-team-extract.js
index a122be40..2d0a06d9 100644
--- a/src/pr/tools/headless-team-extract.js
+++ b/src/pr/tools/headless-team-extract.js
@@ -29,7 +29,15 @@ async function api(path, opts = {}) {
 
 async function main() {
   // Uncovered orgs, highest priority first (server computes the no-PR-contact filter).
-  const { rows } = await api(`/organizations?no_pr_contact=1&state=CA&sort=priority&dir=desc&limit=${MAX_ORGS}`);
+  let rows;
+  if (process.env.PR_ORG_IDS) {
+    // explicit target list (gate-uncovered set) β€” one fetch per id
+    const ids = process.env.PR_ORG_IDS.split(',').map((s) => s.trim()).filter(Boolean);
+    rows = [];
+    for (const id of ids) { try { rows.push(await api('/organizations/' + id)); } catch { /* skip */ } }
+  } else {
+    ({ rows } = await api(`/organizations?no_pr_contact=1&state=CA&sort=priority&dir=desc&limit=${MAX_ORGS}`));
+  }
   // Skip coverage-excluded types (banks/credit unions β€” no public comms staff, Steve 7/30).
   const exclude = (await api('/settings')).coverage_exclude_types?.value || ['bank', 'credit_union'];
   const targets = rows.filter((o) => o.website_url && !exclude.includes(o.organization_type));

← f08f88a2 pr-intelligence: headless tool skips coverage-excluded org t  Β·  back to Rentv 2026  Β·  console: /api/summit/licensed (realestate DB) + facet wiring 13b6880c β†’