[object Object]

← back to Rentv

feat(services): DTD-verdict guardrails on the Featured layer (keep-with-guardrails)

e393d66a59ddf85acfbdb8f6d488d4eb74c3581b · 2026-08-06 15:42:52 -0700 · Steve

Panel voted 8/8 to KEEP the curated Featured layer, conditional on hardening the
pay-to-play firewall. Implements the four attached conditions:

1. Disclosure banner above Featured cards: '★ Featured = unpaid editorial selection —
   no firm has paid for placement …' (public-facing, on every category with featured).
2. Published selection methodology in the banner (prominence + verifiable standing +
   metro coverage), sourced from services-featured.json selection_criteria.
3. Pay-to-play tripwire: seed 'policy' field + code — a paid slot MUST set paid:true,
   which renders 'Sponsored' (not '★ Featured'), visually distinct, with rel=sponsored
   on its link; editorial Featured stays rel=nofollow. Never silently mixed.
4. last_verified date (shown in banner) + verify_cadence_days:90 in the seed for a
   re-check cadence so a defunct firm is never shown as Featured.

Verified: facets returns featured_meta; Title view renders the banner with the date +
'no firm has paid' line; featured rows carry paid:false / source_label 'Featured'.

Files touched

Diff

commit e393d66a59ddf85acfbdb8f6d488d4eb74c3581b
Author: Steve <steve@designerwallcoverings.com>
Date:   Thu Aug 6 15:42:52 2026 -0700

    feat(services): DTD-verdict guardrails on the Featured layer (keep-with-guardrails)
    
    Panel voted 8/8 to KEEP the curated Featured layer, conditional on hardening the
    pay-to-play firewall. Implements the four attached conditions:
    
    1. Disclosure banner above Featured cards: '★ Featured = unpaid editorial selection —
       no firm has paid for placement …' (public-facing, on every category with featured).
    2. Published selection methodology in the banner (prominence + verifiable standing +
       metro coverage), sourced from services-featured.json selection_criteria.
    3. Pay-to-play tripwire: seed 'policy' field + code — a paid slot MUST set paid:true,
       which renders 'Sponsored' (not '★ Featured'), visually distinct, with rel=sponsored
       on its link; editorial Featured stays rel=nofollow. Never silently mixed.
    4. last_verified date (shown in banner) + verify_cadence_days:90 in the seed for a
       re-check cadence so a defunct firm is never shown as Featured.
    
    Verified: facets returns featured_meta; Title view renders the banner with the date +
    'no firm has paid' line; featured rows carry paid:false / source_label 'Featured'.
---
 data/services-featured.json |  4 ++++
 public/services.html        | 13 +++++++++++--
 server.js                   | 18 ++++++++++++------
 3 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/data/services-featured.json b/data/services-featured.json
index af38832c..ce53c10f 100644
--- a/data/services-featured.json
+++ b/data/services-featured.json
@@ -1,5 +1,9 @@
 {
   "note": "Editorially FEATURED, real and verifiable major CRE service firms. Purpose: guarantee at least one vendor in EVERY service category in every metro where the public California license registries do not cover (Title, Property Management) or barely cover (Legal — only 3 attorney records exist statewide). markets tokens: \"national\" = firm operates across all served metros INCLUDING Arizona (e.g. First American Title, CBRE); \"socal\" = the five California metros only (Greater LA, Orange County, San Diego, Inland Empire, Ventura) — used for SoCal-specific firms (e.g. California real-estate law firms) so they never falsely claim Arizona coverage. Registry-backed categories (Construction, Lenders, Escrow, Developers) already have hundreds-to-thousands of vendors per metro. Verify engagement terms and current licensure directly with each firm.",
+  "policy": "★ Featured is UNPAID EDITORIAL SELECTION. No firm has paid for placement, and Featured status is NEVER sold. This page also serves RENTV ad-sales as a lead list — that function must stay walled off from Featured selection. If a firm is ever given PAID placement, it MUST be a separate entry with \"paid\": true, rendered as a 'Sponsored' entry (not '★ Featured'), visually distinct, with rel=\"sponsored\" on its link — never silently mixed into the editorial Featured set. (DTD verdict 2026-08-06, 8/8 keep-with-guardrails; the pay-to-play tripwire is the load-bearing condition.)",
+  "selection_criteria": "Editorially selected for prominence in the market, verifiable licensure or professional standing, and broad metro coverage — not for payment.",
+  "last_verified": "2026-08-06",
+  "verify_cadence_days": 90,
   "vendors": [
     {
       "cat": "title",
diff --git a/public/services.html b/public/services.html
index 8b020ccf..504a6f61 100644
--- a/public/services.html
+++ b/public/services.html
@@ -83,6 +83,9 @@
   .locs{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;font-weight:800;letter-spacing:.02em;padding:2px 8px;border-radius:20px;background:#eaf2ff;color:#1857b8;border:1px solid #cadcf7}
   .card.feat{border-color:#ecdca4;background:linear-gradient(180deg,#fffdf7,#fff)}
   .fhint{color:#8a6d1a;font-size:11px;font-weight:700;margin:6px 2px 0}
+  .fdisc{background:#fffaf0;border:1px solid #ecdca4;border-radius:10px;padding:9px 13px;margin:4px 2px 10px;color:#7a611a;font-size:12px;line-height:1.5}
+  .fdisc b{color:#8a6d1a}
+  .st.spon{background:#eef1f4;color:#4a4f55;border:1px solid #d5dae0}
   .spec{font-size:12px;color:var(--ink);font-weight:600}
   .loc{color:var(--sub);font-size:12.5px}
   .loc a:hover{color:var(--red);text-decoration:underline}
@@ -183,6 +186,7 @@
     </div>
   </div>
 
+  <div class="fdisc" id="fdisc" style="display:none"></div>
   <section class="rows" id="rows"></section>
   <button class="more" id="more" style="display:none">Load more</button>
   <div class="note" id="note"></div>
@@ -323,11 +327,11 @@ function card(r){
   const spec=r.specialty?`<div class="spec">${esc(r.specialty)}</div>`:'';
   const loc=[r.city&&`<a href="/services?cat=${esc(cat)}&market=${encodeURIComponent(market)}&city=${encodeURIComponent(r.city)}">${esc(cap(r.city))}</a>`,
              r.county&&esc(cap(r.county))+' County', r.zip&&esc(r.zip)].filter(Boolean).join(' · ');
-  const st=r.featured?`<span class="st feat">★ Featured</span>`:(r.license_status?`<span class="st${ok?' ok':''}">${esc(cap(r.license_status))}</span>`:'');
+  const st=r.featured?(r.paid?`<span class="st spon">Sponsored</span>`:`<span class="st feat">★ Featured</span>`):(r.license_status?`<span class="st${ok?' ok':''}">${esc(cap(r.license_status))}</span>`:'');
   const lic=r.license_no?`<div class="lic">${esc(r.source_label||'License')} #${esc(r.license_no)}</div>`:'';
   const acts=[];
   if(r.phone) acts.push(`<a class="act p" href="tel:${esc(String(r.phone).replace(/[^0-9+]/g,''))}">☎ ${esc(r.phone)}</a>`);
-  if(r.website) acts.push(`<a class="act" href="${esc(/^https?:/.test(r.website)?r.website:'https://'+r.website)}" target="_blank" rel="noopener noreferrer nofollow">Website ↗</a>`);
+  if(r.website) acts.push(`<a class="act" href="${esc(/^https?:/.test(r.website)?r.website:'https://'+r.website)}" target="_blank" rel="noopener noreferrer ${r.paid?'sponsored':'nofollow'}">Website ↗</a>`);
   if(r.source_url) acts.push(`<a class="act" href="${esc(r.source_url)}" target="_blank" rel="noopener noreferrer nofollow">Public license record ↗</a>`);
   if(ADMIN){ const done=inOutreach(r.name,SOCIAL_CAT[cat]||'Vendors / Service Providers'); acts.push(`<button class="act sol${done?' added':''}" data-solicit="${esc(r.id)}">${done?'✓ In outreach':'✉ Solicit'}</button>`); }
   return `<article class="card">
@@ -361,6 +365,11 @@ async function load(reset){
   const featured=reset?(d.featured||[]):[];
   const rows=d.rows||[];
   const grand=total+featuredTotal;
+  if(reset){
+    if(featuredTotal>0){ const fm=FACETS.featured_meta||{}; $('fdisc').style.display='block';
+      $('fdisc').innerHTML=`<b>★ Featured</b> = unpaid editorial selection — <b>no firm has paid for placement</b>. Selected for ${esc(fm.selection_criteria||'prominence, verifiable standing and metro coverage')}${fm.last_verified?` · verified ${esc(fm.last_verified)}`:''}. Verify licensure &amp; engagement terms directly.`;
+    } else { $('fdisc').style.display='none'; }
+  }
   if(!grand){ $('meta').textContent=''; $('rows').innerHTML='<div class="empty"><h3>No providers found</h3><div>Try a different name, city or category.</div></div>'; $('more').style.display='none'; return; }
   const html=featured.map(card).join('')+rows.map(card).join('');
   if(reset)$('rows').innerHTML=html; else $('rows').insertAdjacentHTML('beforeend',rows.map(card).join(''));
diff --git a/server.js b/server.js
index 0497baa9..7c3f7903 100644
--- a/server.js
+++ b/server.js
@@ -1600,9 +1600,12 @@ const SERVICE_CATS = {
 };
 // Curated real-firm seed (data/services-featured.json) — guarantees >=1 vendor per category per
 // metro where the registry is thin/absent (Title, Property Mgmt, Legal). Loaded once at startup.
-let SERVICE_FEATURED = [];
-try { SERVICE_FEATURED = (JSON.parse(fs.readFileSync(path.join(DATA, 'services-featured.json'), 'utf8')).vendors) || []; }
-catch (e) { console.warn('[services] no services-featured.json (running without featured seed)'); }
+let SERVICE_FEATURED = [], SERVICE_FEATURED_META = {};
+try {
+  const doc = JSON.parse(fs.readFileSync(path.join(DATA, 'services-featured.json'), 'utf8'));
+  SERVICE_FEATURED = doc.vendors || [];
+  SERVICE_FEATURED_META = { selection_criteria: doc.selection_criteria || '', last_verified: doc.last_verified || '', verify_cadence_days: doc.verify_cadence_days || 0 };
+} catch (e) { console.warn('[services] no services-featured.json (running without featured seed)'); }
 const SOCAL_METROS = ['Greater LA', 'Orange County', 'San Diego', 'Inland Empire', 'Ventura'];
 // Resolve a featured firm's coverage HONESTLY: "national" = also Arizona; "socal"/"all" = CA metros
 // only (so SoCal-specific law firms never falsely claim Arizona); or an explicit market array.
@@ -1624,8 +1627,11 @@ function featuredFor(catKey, market, q) {
       city: v.hq || null, county: null, zip: null, market,
       phone: null, website: v.website || null,
       license_no: null, license_type: null, license_status: 'Featured',
-      specialty: v.desc || null, source: 'featured', source_label: 'Featured',
-      source_url: null, featured: true, loc_count: null, city_count: null,
+      specialty: v.desc || null,
+      // Pay-to-play tripwire (DTD verdict 2026-08-06): an unpaid editorial pick is '★ Featured';
+      // a PAID slot MUST be flagged paid:true in the seed → renders as 'Sponsored' (never mixed in).
+      source: v.paid ? 'sponsored' : 'featured', source_label: v.paid ? 'Sponsored' : 'Featured',
+      paid: !!v.paid, source_url: null, featured: true, loc_count: null, city_count: null,
     }));
 }
 const SERVICE_MARKETS = new Set(['Greater LA', 'Orange County', 'San Diego', 'Inland Empire', 'Ventura', 'Arizona', 'SoCal (other)']);
@@ -1744,7 +1750,7 @@ app.get('/api/services/facets', async (req, res) => {
     const cityR = await rePool.query(
       "SELECT city, count(*)::int n FROM rentv_licensed_targets WHERE within_300mi AND market=$1 AND city IS NOT NULL AND city <> '' GROUP BY city ORDER BY n DESC LIMIT 24", [market]);
     res.set('Cache-Control', 'public, max-age=300');
-    res.json({ market, intro: SERVICE_CONTENT.intro || {}, cats, cities: cityR.rows });
+    res.json({ market, intro: SERVICE_CONTENT.intro || {}, cats, cities: cityR.rows, featured_meta: SERVICE_FEATURED_META });
   } catch (e) { res.status(502).json({ cats: [], cities: [], error: 'services registry unavailable' }); }
 });
 

← b63cb339 auto-data-snapshot: 2026-08-06T15:32:11 (7 data files) — dat  ·  back to Rentv  ·  feat(deals): parseAcquirer recall 19→23/30 — handle developm 6190cac5 →