[object Object]

← back to Adsense Fleet Viewer

Load all 8 AdSense account sites (steveabramsdesigns@gmail.com) + reconcile dashboard review-status vs live probe; list-driven via sites.txt

3bc598e9c3619aafb2f4de0766b7af86d94cfa16 · 2026-08-05 11:29:04 -0700 · Steve

Files touched

Diff

commit 3bc598e9c3619aafb2f4de0766b7af86d94cfa16
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed Aug 5 11:29:04 2026 -0700

    Load all 8 AdSense account sites (steveabramsdesigns@gmail.com) + reconcile dashboard review-status vs live probe; list-driven via sites.txt
---
 account-status.json |  11 ++---
 adsense-sites.json  |  16 +++++++
 build.mjs           | 109 ++++++++++++++++++++++++++++++++-------------
 public/index.html   | 124 +++++++++++++++++++++++++---------------------------
 public/status.json  |  96 +++++++++++++++++++++-------------------
 sites.txt           |  14 ++++++
 6 files changed, 226 insertions(+), 144 deletions(-)

diff --git a/account-status.json b/account-status.json
index 3fe7e5c..12b06a1 100644
--- a/account-status.json
+++ b/account-status.json
@@ -1,9 +1,10 @@
 {
-  "_comment": "MANUAL — the one thing probing cannot see. Fill these after checking adsense.google.com, then re-run `node build.mjs`. Values: yes | no | unknown",
+  "_comment": "MANUAL — dashboard-only truth. Values: yes | no | unknown | in-review. Update after checking adsense.google.com, then re-run `node build.mjs`.",
+  "account": "steveabramsdesigns@gmail.com",
   "pubId": "pub-5278231299883833",
-  "approved": "unknown",
+  "approved": "no",
   "autoAdsOn": "unknown",
-  "serving": "unknown",
-  "checkedAt": "",
-  "notes": ""
+  "serving": "no",
+  "checkedAt": "2026-08-05",
+  "notes": "8 sites added; NONE 'Ready' — 3 Getting ready, 5 Requires review. No site is serving real ads yet. celebsignatures + chargeandexplore are closest ('Getting ready')."
 }
diff --git a/adsense-sites.json b/adsense-sites.json
new file mode 100644
index 0000000..b1d873b
--- /dev/null
+++ b/adsense-sites.json
@@ -0,0 +1,16 @@
+{
+  "_comment": "Snapshot of the AdSense 'Manage your sites' dashboard (account steveabramsdesigns@gmail.com / pub-5278231299883833). Pasted 2026-08-05. review = Ready|Getting ready|Requires review|Needs attention. adsTxt = what GOOGLE's crawler sees (Authorized|Not found). Update after each dashboard visit.",
+  "account": "steveabramsdesigns@gmail.com",
+  "pubId": "pub-5278231299883833",
+  "snapshotAt": "2026-08-05",
+  "sites": {
+    "nodailyworries.com":          { "review": "Requires review", "adsTxt": "Not found",  "added": "2025-08-24" },
+    "beverlyhillsvideos.com":      { "review": "Requires review", "adsTxt": "Not found",  "added": "2025-08-24" },
+    "wholivedthere.com":           { "review": "Requires review", "adsTxt": "Not found",  "added": "2026-08-05" },
+    "claimmyaddress.com":          { "review": "Requires review", "adsTxt": "Not found",  "added": "2026-08-05" },
+    "bubbe.ai":                    { "review": "Requires review", "adsTxt": "Authorized", "added": "2026-08-05" },
+    "celebsignatures.com":         { "review": "Getting ready",   "adsTxt": "Not found",  "added": "2026-08-04" },
+    "bubbesblock.com":             { "review": "Getting ready",   "adsTxt": "Not found",  "added": "2026-08-04" },
+    "chargeandexplore.com":        { "review": "Getting ready",   "adsTxt": "Authorized", "added": "2026-08-04" }
+  }
+}
diff --git a/build.mjs b/build.mjs
index e13f5d2..efcfb17 100644
--- a/build.mjs
+++ b/build.mjs
@@ -16,22 +16,46 @@ import { writeFile, readFile } from 'node:fs/promises';
 let ACCT = { pubId: 'pub-5278231299883833', approved: 'unknown', autoAdsOn: 'unknown', serving: 'unknown', checkedAt: '', notes: '' };
 try { ACCT = { ...ACCT, ...JSON.parse(await readFile(new URL('./account-status.json', import.meta.url), 'utf8')) }; } catch {}
 
-// domain -> which project owns it. Best-known mapping; edit as domains are confirmed.
+// LIST-DRIVEN: the domains probed come from sites.txt (one domain per line;
+// '#' comments + blank lines ignored). Paste your AdSense Sites list in there and
+// re-run. Known domains get policy/project metadata from POLICY_MAP below; any
+// domain not in the map is probed as policy:'unknown' with a name derived from it.
+//
 // policy = the AdSense placement rule (DTD verdict 2026-08-05):
-//   allow    — content/traffic surface, ads OK
-//   forbid   — customer-facing luxury/commerce surface, ads must NOT run
-//   verify   — thin/low-content, only after account check + real per-page content
-//   na       — not a public ad surface
-const FLEET = [
-  { project: 'CelebritySignatures',        domain: 'celebsignatures.com',            policy: 'allow' },
-  { project: 'interiordesignershowroom',   domain: 'interiordesignershowroom.com',   policy: 'forbid', flag: 'REMOVE pending approval' },
-  { project: 'tesla (Charge & Explore)',   domain: 'chargeandexplore.com',           policy: 'verify', note: 'app landing — thin page, keep only if not cluttering conversion' },
-  { project: 'ventura-corridor',           domain: 'venturacorridor.com',            policy: 'verify', note: 'templated directory — needs real per-page content first' },
-  { project: 'allnewsdaily',               domain: 'allnewsdaily.com',               policy: 'allow' },
-  { project: 'fashion-style-guides',       domain: 'fashionstyleguides.com',         policy: 'allow' },
-  { project: 'restaurant-directory',       domain: null, policy: 'allow',  note: 'public domain unconfirmed' },
-  { project: 'AbramsEgo',                  domain: null, policy: 'na',      note: 'internal command center (:9773) — not a public ad surface' },
-];
+//   allow  — content/traffic surface, ads OK
+//   forbid — customer-facing luxury/commerce surface, ads must NOT run
+//   verify — thin/low-content, only after account check + real per-page content
+//   na     — not a public ad surface
+//   unknown— not yet classified (default for pasted domains)
+const POLICY_MAP = {
+  'nodailyworries.com':           { project: 'nodailyworries',           policy: 'allow' },
+  'beverlyhillsvideos.com':       { project: 'beverlyhillsvideos',       policy: 'allow' },
+  'wholivedthere.com':            { project: 'WhoLivedThere',            policy: 'allow' },
+  'claimmyaddress.com':           { project: 'ClaimMyAddress',           policy: 'allow' },
+  'bubbe.ai':                     { project: 'bubbe.ai',                 policy: 'allow' },
+  'bubbesblock.com':              { project: 'BubbesBlock',              policy: 'allow' },
+  'celebsignatures.com':          { project: 'CelebritySignatures',      policy: 'allow' },
+  'chargeandexplore.com':         { project: 'tesla (Charge & Explore)', policy: 'verify', note: 'app landing — thin page' },
+  'interiordesignershowroom.com': { project: 'interiordesignershowroom', policy: 'forbid', flag: 'Serving loader but NOT in AdSense account — REMOVE (pending approval)' },
+};
+
+// AdSense dashboard snapshot (what Google's console reports — the truth probing can't see)
+let ADSENSE = { account: '', pubId: '', snapshotAt: '', sites: {} };
+try { ADSENSE = { ...ADSENSE, ...JSON.parse(await readFile(new URL('./adsense-sites.json', import.meta.url), 'utf8')) }; } catch {}
+
+let domains = [];
+try {
+  const txt = await readFile(new URL('./sites.txt', import.meta.url), 'utf8');
+  domains = [...new Set(txt.split('\n').map(l => l.trim().toLowerCase())
+    .filter(l => l && !l.startsWith('#'))
+    .map(l => l.replace(/^https?:\/\//, '').replace(/\/.*$/, '')))];
+} catch { domains = Object.keys(POLICY_MAP); }
+
+const FLEET = domains.map(domain => {
+  const meta = POLICY_MAP[domain] || {};
+  const project = meta.project || domain.replace(/\.(com|org|net|io|co)$/, '');
+  return { domain, project, policy: meta.policy || 'unknown', note: meta.note, flag: meta.flag };
+});
 
 const timeout = (ms) => new AbortController(); // placeholder (see fetchT)
 async function fetchT(url, ms = 9000) {
@@ -83,14 +107,17 @@ const PILL = {
   na:      ['#5b5b5b', '#eee', '– N/A'],
 };
 
-const liveCount = results.filter(r => verdict(r).key === 'loader' || verdict(r).key === 'full').length;
-const adSurfaces = results.filter(r => r.domain && !(r.note || '').includes('internal')).length;
+const liveCount = results.filter(r => r.loader).length;
+const sitesInAccount = Object.keys(ADSENSE.sites || {}).length;
+const readyCount = Object.values(ADSENSE.sites || {}).filter(s => s.review === 'Ready').length;
+const gettingReady = Object.values(ADSENSE.sites || {}).filter(s => s.review === 'Getting ready').length;
 
 const POLICY = {
-  allow:  ['#0a7d33', '#e6f4ea', '✅ Ads OK'],
-  forbid: ['#9a2323', '#fbeaea', '⛔ No ads (luxury/commerce)'],
-  verify: ['#a86a00', '#fdf3e2', '⚠ Verify content first'],
-  na:     ['#5b5b5b', '#eee', '– N/A'],
+  allow:   ['#0a7d33', '#e6f4ea', '✅ Ads OK'],
+  forbid:  ['#9a2323', '#fbeaea', '⛔ No ads (luxury/commerce)'],
+  verify:  ['#a86a00', '#fdf3e2', '⚠ Verify content first'],
+  na:      ['#5b5b5b', '#eee', '– N/A'],
+  unknown: ['#4a4a4a', '#eef0f2', '· Unclassified'],
 };
 function policyPill(r) {
   const [fg, bg, txt] = POLICY[r.policy] || POLICY.na;
@@ -98,6 +125,28 @@ function policyPill(r) {
   return `<span class="pill" style="color:${fg};background:${bg}">${txt}</span>${flag}`;
 }
 
+// AdSense dashboard review-status pill (from the console snapshot)
+const REVIEW = {
+  'Ready':           ['#0a7d33', '#e6f4ea'],
+  'Getting ready':   ['#0a6ba8', '#e4f1fa'],
+  'Requires review': ['#a86a00', '#fdf3e2'],
+  'Needs attention': ['#9a2323', '#fbeaea'],
+};
+function adsenseCells(domain, liveAdsTxt) {
+  const s = ADSENSE.sites?.[domain];
+  if (!s) return `<td><span class="muted">not in account</span></td><td><span class="muted">—</span></td>`;
+  const [fg, bg] = REVIEW[s.review] || ['#4a4a4a', '#eef0f2'];
+  const rev = `<span class="pill" style="color:${fg};background:${bg}">${s.review}</span><div class="sub">added ${s.added}</div>`;
+  // reconcile Google-crawled ads.txt vs what we actually serve live
+  const liveHas = !!liveAdsTxt;
+  const gAuth = s.adsTxt === 'Authorized';
+  let recon;
+  if (gAuth) recon = `<span style="color:#0a7d33">✓ Authorized</span>`;
+  else if (liveHas) recon = `<span style="color:#a86a00">Google: not found<br><span class="sub">but we serve it — awaiting re-crawl</span></span>`;
+  else recon = `<span style="color:#9a2323">✗ not found</span>`;
+  return `<td>${rev}</td><td>${recon}</td>`;
+}
+
 // Manual account-status card (dashboard-only truth)
 const AS = { yes: ['#0a7d33', '#e6f4ea', 'YES'], no: ['#9a2323', '#fbeaea', 'NO'], unknown: ['#a86a00', '#fdf3e2', 'UNKNOWN'] };
 const asBadge = (v) => { const [fg, bg, t] = AS[v] || AS.unknown; return `<span class="pill" style="color:${fg};background:${bg}">${t}</span>`; };
@@ -107,6 +156,7 @@ const acctCard = `<div class="acct">
     <div><span>Approved</span>${asBadge(ACCT.approved)}</div>
     <div><span>Auto ads ON</span>${asBadge(ACCT.autoAdsOn)}</div>
     <div><span>Actually serving</span>${asBadge(ACCT.serving)}</div>
+    <div><span>Account</span><code>${ACCT.account || '—'}</code></div>
     <div><span>Pub id</span><code>${ACCT.pubId}</code></div>
   </div>
   <div class="acct-foot">${ACCT.checkedAt ? `🕓 checked <code>${ACCT.checkedAt}</code>` : '<span class="warn">Not yet checked.</span>'} ${ACCT.notes ? '· ' + ACCT.notes : ''}
@@ -125,12 +175,10 @@ const rows = results.map(r => {
   return `<tr>
     <td><span class="proj">${r.project}</span><div class="sub">${site}</div></td>
     <td>${policyPill(r)}</td>
+    ${adsenseCells(r.domain, r.adsTxt)}
     <td><span class="pill" style="color:${fg};background:${bg}">${txt}</span><div class="sub">${vd.label}</div></td>
-    <td>${r.http ? cell(r.http) : cell(null)}</td>
     <td>${r.loader ? cell('yes', r.domain ? `view-source:https://${r.domain}/` : null) : cell(r.domain ? 'no' : null)}</td>
-    <td>${cell(r.adsTxt, r.domain ? `https://${r.domain}/ads.txt` : null, true)}</td>
-    <td>${r.slots.length ? cell(r.slots.join(', ')) : '<span class="muted">none (Auto ads only)</span>'}</td>
-    <td>${cell(r.pubFromLoader, null, true)}</td>
+    <td>${r.slots.length ? cell(r.slots.join(', ')) : '<span class="muted">none (Auto only)</span>'}</td>
   </tr>`;
 }).join('\n');
 
@@ -168,15 +216,16 @@ a{color:#1d7a36}.muted{color:var(--muted)}
 <div class="stamp">🕓 Live-probed <code>${stamp}</code> · re-run <code>node build.mjs</code> to refresh</div>
 
 <div class="cards">
-  <div class="card"><b>${liveCount}/${adSurfaces}</b><span>Loader live on ad surfaces</span></div>
-  <div class="card"><b>0</b><span>Manual ad units live (fleet-wide)</span></div>
-  <div class="card"><b>pub-5278…3833</b><span>Primary account</span></div>
+  <div class="card"><b>${readyCount}/${sitesInAccount}</b><span>Sites approved (Ready) in AdSense</span></div>
+  <div class="card"><b>${gettingReady}</b><span>Getting ready (in review)</span></div>
+  <div class="card"><b>${liveCount}</b><span>Loader served live on-site</span></div>
+  <div class="card"><b>0</b><span>Manual ad units live</span></div>
 </div>
 
 ${acctCard}
 
 <table>
-<thead><tr><th>Project / Domain</th><th>Policy</th><th>Status</th><th>HTTP</th><th>Loader</th><th>ads.txt</th><th>Manual units</th><th>Pub id (live)</th></tr></thead>
+<thead><tr><th>Project / Domain</th><th>Policy</th><th>AdSense review</th><th>ads.txt (Google vs live)</th><th>Live loader status</th><th>Loader served</th><th>Manual units</th></tr></thead>
 <tbody>
 ${rows}
 </tbody></table>
@@ -193,4 +242,4 @@ ${rows}
 
 await writeFile(new URL('./public/index.html', import.meta.url), html);
 await writeFile(new URL('./public/status.json', import.meta.url), JSON.stringify({ probedAt: now.toISOString(), results }, null, 2));
-console.log(`Wrote public/index.html — ${liveCount}/${adSurfaces} loader-live at ${stamp}`);
+console.log(`Wrote public/index.html — ${sitesInAccount} sites in account, ${readyCount} Ready, ${liveCount} loader-live at ${stamp}`);
diff --git a/public/index.html b/public/index.html
index 6484915..532a3d0 100644
--- a/public/index.html
+++ b/public/index.html
@@ -29,108 +29,102 @@ a{color:#1d7a36}.muted{color:var(--muted)}
 .acct-foot{margin-top:12px;font-size:12px;color:#6b6b6b}
 </style></head><body><div class="wrap">
 <h1>AdSense Fleet Status</h1>
-<div class="stamp">🕓 Live-probed <code>Aug 5, 2026, 11:19 AM</code> · re-run <code>node build.mjs</code> to refresh</div>
+<div class="stamp">🕓 Live-probed <code>Aug 5, 2026, 11:28 AM</code> · re-run <code>node build.mjs</code> to refresh</div>
 
 <div class="cards">
-  <div class="card"><b>3/6</b><span>Loader live on ad surfaces</span></div>
-  <div class="card"><b>0</b><span>Manual ad units live (fleet-wide)</span></div>
-  <div class="card"><b>pub-5278…3833</b><span>Primary account</span></div>
+  <div class="card"><b>0/8</b><span>Sites approved (Ready) in AdSense</span></div>
+  <div class="card"><b>3</b><span>Getting ready (in review)</span></div>
+  <div class="card"><b>6</b><span>Loader served live on-site</span></div>
+  <div class="card"><b>0</b><span>Manual ad units live</span></div>
 </div>
 
 <div class="acct">
   <h2>Account status — <span class="muted">dashboard-only, not probeable</span></h2>
   <div class="acct-row">
-    <div><span>Approved</span><span class="pill" style="color:#a86a00;background:#fdf3e2">UNKNOWN</span></div>
+    <div><span>Approved</span><span class="pill" style="color:#9a2323;background:#fbeaea">NO</span></div>
     <div><span>Auto ads ON</span><span class="pill" style="color:#a86a00;background:#fdf3e2">UNKNOWN</span></div>
-    <div><span>Actually serving</span><span class="pill" style="color:#a86a00;background:#fdf3e2">UNKNOWN</span></div>
+    <div><span>Actually serving</span><span class="pill" style="color:#9a2323;background:#fbeaea">NO</span></div>
+    <div><span>Account</span><code>steveabramsdesigns@gmail.com</code></div>
     <div><span>Pub id</span><code>pub-5278231299883833</code></div>
   </div>
-  <div class="acct-foot"><span class="warn">Not yet checked.</span> 
+  <div class="acct-foot">🕓 checked <code>2026-08-05</code> · 8 sites added; NONE 'Ready' — 3 Getting ready, 5 Requires review. No site is serving real ads yet. celebsignatures + chargeandexplore are closest ('Getting ready').
     <div class="muted">Fill these at <a href="https://adsense.google.com/" target="_blank" rel="noopener">adsense.google.com</a> → edit <code>account-status.json</code> → re-run <code>node build.mjs</code>.</div></div>
 </div>
 
 <table>
-<thead><tr><th>Project / Domain</th><th>Policy</th><th>Status</th><th>HTTP</th><th>Loader</th><th>ads.txt</th><th>Manual units</th><th>Pub id (live)</th></tr></thead>
+<thead><tr><th>Project / Domain</th><th>Policy</th><th>AdSense review</th><th>ads.txt (Google vs live)</th><th>Live loader status</th><th>Loader served</th><th>Manual units</th></tr></thead>
 <tbody>
 <tr>
-    <td><span class="proj">CelebritySignatures</span><div class="sub"><a href="https://celebsignatures.com/" target="_blank" rel="noopener">celebsignatures.com</a></div></td>
+    <td><span class="proj">nodailyworries</span><div class="sub"><a href="https://nodailyworries.com/" target="_blank" rel="noopener">nodailyworries.com</a></div></td>
     <td><span class="pill" style="color:#0a7d33;background:#e6f4ea">✅ Ads OK</span></td>
-    <td><span class="pill" style="color:#0a7d33;background:#e9f6ee">● Loader live</span><div class="sub">Loader live</div></td>
-    <td>200</td>
-    <td><a href="view-source:https://celebsignatures.com/" target="_blank" rel="noopener">yes</a></td>
-    <td><a href="https://celebsignatures.com/ads.txt" target="_blank" rel="noopener"><code>pub-5278231299883833</code></a></td>
-    <td><span class="muted">none (Auto ads only)</span></td>
-    <td><code>pub-5278231299883833</code></td>
+    <td><span class="pill" style="color:#a86a00;background:#fdf3e2">Requires review</span><div class="sub">added 2025-08-24</div></td><td><span style="color:#9a2323">✗ not found</span></td>
+    <td><span class="pill" style="color:#9a2323;background:#fbeaea">○ Not serving</span><div class="sub">No ads on live site</div></td>
+    <td>no</td>
+    <td><span class="muted">none (Auto only)</span></td>
   </tr>
 <tr>
-    <td><span class="proj">interiordesignershowroom</span><div class="sub"><a href="https://interiordesignershowroom.com/" target="_blank" rel="noopener">interiordesignershowroom.com</a></div></td>
-    <td><span class="pill" style="color:#9a2323;background:#fbeaea">⛔ No ads (luxury/commerce)</span><div class="sub warn">REMOVE pending approval</div></td>
+    <td><span class="proj">beverlyhillsvideos</span><div class="sub"><a href="https://beverlyhillsvideos.com/" target="_blank" rel="noopener">beverlyhillsvideos.com</a></div></td>
+    <td><span class="pill" style="color:#0a7d33;background:#e6f4ea">✅ Ads OK</span></td>
+    <td><span class="pill" style="color:#a86a00;background:#fdf3e2">Requires review</span><div class="sub">added 2025-08-24</div></td><td><span style="color:#9a2323">✗ not found</span></td>
+    <td><span class="pill" style="color:#9a2323;background:#fbeaea">✕ Unreachable</span><div class="sub">fetch failed</div></td>
+    <td>no</td>
+    <td><span class="muted">none (Auto only)</span></td>
+  </tr>
+<tr>
+    <td><span class="proj">WhoLivedThere</span><div class="sub"><a href="https://wholivedthere.com/" target="_blank" rel="noopener">wholivedthere.com</a></div></td>
+    <td><span class="pill" style="color:#0a7d33;background:#e6f4ea">✅ Ads OK</span></td>
+    <td><span class="pill" style="color:#a86a00;background:#fdf3e2">Requires review</span><div class="sub">added 2026-08-05</div></td><td><span style="color:#a86a00">Google: not found<br><span class="sub">but we serve it — awaiting re-crawl</span></span></td>
     <td><span class="pill" style="color:#0a7d33;background:#e9f6ee">● Loader live</span><div class="sub">Loader live</div></td>
-    <td>200</td>
-    <td><a href="view-source:https://interiordesignershowroom.com/" target="_blank" rel="noopener">yes</a></td>
-    <td><a href="https://interiordesignershowroom.com/ads.txt" target="_blank" rel="noopener"><code>pub-5278231299883833</code></a></td>
-    <td><span class="muted">none (Auto ads only)</span></td>
-    <td><code>pub-5278231299883833</code></td>
+    <td><a href="view-source:https://wholivedthere.com/" target="_blank" rel="noopener">yes</a></td>
+    <td><span class="muted">none (Auto only)</span></td>
   </tr>
 <tr>
-    <td><span class="proj">tesla (Charge & Explore)</span><div class="sub"><a href="https://chargeandexplore.com/" target="_blank" rel="noopener">chargeandexplore.com</a></div></td>
-    <td><span class="pill" style="color:#a86a00;background:#fdf3e2">⚠ Verify content first</span></td>
+    <td><span class="proj">ClaimMyAddress</span><div class="sub"><a href="https://claimmyaddress.com/" target="_blank" rel="noopener">claimmyaddress.com</a></div></td>
+    <td><span class="pill" style="color:#0a7d33;background:#e6f4ea">✅ Ads OK</span></td>
+    <td><span class="pill" style="color:#a86a00;background:#fdf3e2">Requires review</span><div class="sub">added 2026-08-05</div></td><td><span style="color:#a86a00">Google: not found<br><span class="sub">but we serve it — awaiting re-crawl</span></span></td>
     <td><span class="pill" style="color:#0a7d33;background:#e9f6ee">● Loader live</span><div class="sub">Loader live</div></td>
-    <td>200</td>
-    <td><a href="view-source:https://chargeandexplore.com/" target="_blank" rel="noopener">yes</a></td>
-    <td><a href="https://chargeandexplore.com/ads.txt" target="_blank" rel="noopener"><code>pub-5278231299883833</code></a></td>
-    <td><span class="muted">none (Auto ads only)</span></td>
-    <td><code>pub-5278231299883833</code></td>
+    <td><a href="view-source:https://claimmyaddress.com/" target="_blank" rel="noopener">yes</a></td>
+    <td><span class="muted">none (Auto only)</span></td>
   </tr>
 <tr>
-    <td><span class="proj">ventura-corridor</span><div class="sub"><a href="https://venturacorridor.com/" target="_blank" rel="noopener">venturacorridor.com</a></div></td>
-    <td><span class="pill" style="color:#a86a00;background:#fdf3e2">⚠ Verify content first</span></td>
-    <td><span class="pill" style="color:#9a2323;background:#fbeaea">○ Not serving</span><div class="sub">No ads on live site</div></td>
-    <td>200</td>
-    <td>no</td>
-    <td><a href="https://venturacorridor.com/ads.txt" target="_blank" rel="noopener"><span class="muted">—</span></a></td>
-    <td><span class="muted">none (Auto ads only)</span></td>
-    <td><span class="muted">—</span></td>
+    <td><span class="proj">bubbe.ai</span><div class="sub"><a href="https://bubbe.ai/" target="_blank" rel="noopener">bubbe.ai</a></div></td>
+    <td><span class="pill" style="color:#0a7d33;background:#e6f4ea">✅ Ads OK</span></td>
+    <td><span class="pill" style="color:#a86a00;background:#fdf3e2">Requires review</span><div class="sub">added 2026-08-05</div></td><td><span style="color:#0a7d33">✓ Authorized</span></td>
+    <td><span class="pill" style="color:#0a7d33;background:#e9f6ee">● Loader live</span><div class="sub">Loader live</div></td>
+    <td><a href="view-source:https://bubbe.ai/" target="_blank" rel="noopener">yes</a></td>
+    <td><span class="muted">none (Auto only)</span></td>
   </tr>
 <tr>
-    <td><span class="proj">allnewsdaily</span><div class="sub"><a href="https://allnewsdaily.com/" target="_blank" rel="noopener">allnewsdaily.com</a></div></td>
+    <td><span class="proj">CelebritySignatures</span><div class="sub"><a href="https://celebsignatures.com/" target="_blank" rel="noopener">celebsignatures.com</a></div></td>
     <td><span class="pill" style="color:#0a7d33;background:#e6f4ea">✅ Ads OK</span></td>
-    <td><span class="pill" style="color:#9a2323;background:#fbeaea">○ Not serving</span><div class="sub">No ads on live site</div></td>
-    <td>200</td>
-    <td>no</td>
-    <td><a href="https://allnewsdaily.com/ads.txt" target="_blank" rel="noopener"><span class="muted">—</span></a></td>
-    <td><span class="muted">none (Auto ads only)</span></td>
-    <td><span class="muted">—</span></td>
+    <td><span class="pill" style="color:#0a6ba8;background:#e4f1fa">Getting ready</span><div class="sub">added 2026-08-04</div></td><td><span style="color:#a86a00">Google: not found<br><span class="sub">but we serve it — awaiting re-crawl</span></span></td>
+    <td><span class="pill" style="color:#0a7d33;background:#e9f6ee">● Loader live</span><div class="sub">Loader live</div></td>
+    <td><a href="view-source:https://celebsignatures.com/" target="_blank" rel="noopener">yes</a></td>
+    <td><span class="muted">none (Auto only)</span></td>
   </tr>
 <tr>
-    <td><span class="proj">fashion-style-guides</span><div class="sub"><a href="https://fashionstyleguides.com/" target="_blank" rel="noopener">fashionstyleguides.com</a></div></td>
+    <td><span class="proj">BubbesBlock</span><div class="sub"><a href="https://bubbesblock.com/" target="_blank" rel="noopener">bubbesblock.com</a></div></td>
     <td><span class="pill" style="color:#0a7d33;background:#e6f4ea">✅ Ads OK</span></td>
+    <td><span class="pill" style="color:#0a6ba8;background:#e4f1fa">Getting ready</span><div class="sub">added 2026-08-04</div></td><td><span style="color:#9a2323">✗ not found</span></td>
     <td><span class="pill" style="color:#9a2323;background:#fbeaea">○ Not serving</span><div class="sub">No ads on live site</div></td>
-    <td>200</td>
     <td>no</td>
-    <td><a href="https://fashionstyleguides.com/ads.txt" target="_blank" rel="noopener"><span class="muted">—</span></a></td>
-    <td><span class="muted">none (Auto ads only)</span></td>
-    <td><span class="muted">—</span></td>
+    <td><span class="muted">none (Auto only)</span></td>
   </tr>
 <tr>
-    <td><span class="proj">restaurant-directory</span><div class="sub"><span class="muted">public domain unconfirmed</span></div></td>
-    <td><span class="pill" style="color:#0a7d33;background:#e6f4ea">✅ Ads OK</span></td>
-    <td><span class="pill" style="color:#5b5b5b;background:#eee">– N/A</span><div class="sub">No domain</div></td>
-    <td><span class="muted">—</span></td>
-    <td><span class="muted">—</span></td>
-    <td><span class="muted">—</span></td>
-    <td><span class="muted">none (Auto ads only)</span></td>
-    <td><span class="muted">—</span></td>
+    <td><span class="proj">tesla (Charge & Explore)</span><div class="sub"><a href="https://chargeandexplore.com/" target="_blank" rel="noopener">chargeandexplore.com</a></div></td>
+    <td><span class="pill" style="color:#a86a00;background:#fdf3e2">⚠ Verify content first</span></td>
+    <td><span class="pill" style="color:#0a6ba8;background:#e4f1fa">Getting ready</span><div class="sub">added 2026-08-04</div></td><td><span style="color:#0a7d33">✓ Authorized</span></td>
+    <td><span class="pill" style="color:#0a7d33;background:#e9f6ee">● Loader live</span><div class="sub">Loader live</div></td>
+    <td><a href="view-source:https://chargeandexplore.com/" target="_blank" rel="noopener">yes</a></td>
+    <td><span class="muted">none (Auto only)</span></td>
   </tr>
 <tr>
-    <td><span class="proj">AbramsEgo</span><div class="sub"><span class="muted">internal command center (:9773) — not a public ad surface</span></div></td>
-    <td><span class="pill" style="color:#5b5b5b;background:#eee">– N/A</span></td>
-    <td><span class="pill" style="color:#5b5b5b;background:#eee">– N/A</span><div class="sub">N/A · internal</div></td>
-    <td><span class="muted">—</span></td>
-    <td><span class="muted">—</span></td>
-    <td><span class="muted">—</span></td>
-    <td><span class="muted">none (Auto ads only)</span></td>
-    <td><span class="muted">—</span></td>
+    <td><span class="proj">interiordesignershowroom</span><div class="sub"><a href="https://interiordesignershowroom.com/" target="_blank" rel="noopener">interiordesignershowroom.com</a></div></td>
+    <td><span class="pill" style="color:#9a2323;background:#fbeaea">⛔ No ads (luxury/commerce)</span><div class="sub warn">Serving loader but NOT in AdSense account — REMOVE (pending approval)</div></td>
+    <td><span class="muted">not in account</span></td><td><span class="muted">—</span></td>
+    <td><span class="pill" style="color:#0a7d33;background:#e9f6ee">● Loader live</span><div class="sub">Loader live</div></td>
+    <td><a href="view-source:https://interiordesignershowroom.com/" target="_blank" rel="noopener">yes</a></td>
+    <td><span class="muted">none (Auto only)</span></td>
   </tr>
 </tbody></table>
 
diff --git a/public/status.json b/public/status.json
index 070873c..f6044a5 100644
--- a/public/status.json
+++ b/public/status.json
@@ -1,22 +1,32 @@
 {
-  "probedAt": "2026-08-05T18:19:52.140Z",
+  "probedAt": "2026-08-05T18:28:23.062Z",
   "results": [
     {
-      "project": "CelebritySignatures",
-      "domain": "celebsignatures.com",
+      "domain": "nodailyworries.com",
+      "project": "nodailyworries",
       "policy": "allow",
       "http": 200,
-      "loader": true,
-      "pubFromLoader": "pub-5278231299883833",
-      "adsTxt": "pub-5278231299883833",
+      "loader": false,
+      "pubFromLoader": null,
+      "adsTxt": null,
       "slots": [],
       "err": null
     },
     {
-      "project": "interiordesignershowroom",
-      "domain": "interiordesignershowroom.com",
-      "policy": "forbid",
-      "flag": "REMOVE pending approval",
+      "domain": "beverlyhillsvideos.com",
+      "project": "beverlyhillsvideos",
+      "policy": "allow",
+      "http": null,
+      "loader": false,
+      "pubFromLoader": null,
+      "adsTxt": null,
+      "slots": [],
+      "err": "fetch failed"
+    },
+    {
+      "domain": "wholivedthere.com",
+      "project": "WhoLivedThere",
+      "policy": "allow",
       "http": 200,
       "loader": true,
       "pubFromLoader": "pub-5278231299883833",
@@ -25,10 +35,9 @@
       "err": null
     },
     {
-      "project": "tesla (Charge & Explore)",
-      "domain": "chargeandexplore.com",
-      "policy": "verify",
-      "note": "app landing — thin page, keep only if not cluttering conversion",
+      "domain": "claimmyaddress.com",
+      "project": "ClaimMyAddress",
+      "policy": "allow",
       "http": 200,
       "loader": true,
       "pubFromLoader": "pub-5278231299883833",
@@ -37,31 +46,30 @@
       "err": null
     },
     {
-      "project": "ventura-corridor",
-      "domain": "venturacorridor.com",
-      "policy": "verify",
-      "note": "templated directory — needs real per-page content first",
+      "domain": "bubbe.ai",
+      "project": "bubbe.ai",
+      "policy": "allow",
       "http": 200,
-      "loader": false,
-      "pubFromLoader": null,
-      "adsTxt": null,
+      "loader": true,
+      "pubFromLoader": "pub-5278231299883833",
+      "adsTxt": "pub-5278231299883833",
       "slots": [],
       "err": null
     },
     {
-      "project": "allnewsdaily",
-      "domain": "allnewsdaily.com",
+      "domain": "celebsignatures.com",
+      "project": "CelebritySignatures",
       "policy": "allow",
       "http": 200,
-      "loader": false,
-      "pubFromLoader": null,
-      "adsTxt": null,
+      "loader": true,
+      "pubFromLoader": "pub-5278231299883833",
+      "adsTxt": "pub-5278231299883833",
       "slots": [],
       "err": null
     },
     {
-      "project": "fashion-style-guides",
-      "domain": "fashionstyleguides.com",
+      "domain": "bubbesblock.com",
+      "project": "BubbesBlock",
       "policy": "allow",
       "http": 200,
       "loader": false,
@@ -71,26 +79,26 @@
       "err": null
     },
     {
-      "project": "restaurant-directory",
-      "domain": null,
-      "policy": "allow",
-      "note": "public domain unconfirmed",
-      "http": null,
-      "loader": false,
-      "pubFromLoader": null,
-      "adsTxt": null,
+      "domain": "chargeandexplore.com",
+      "project": "tesla (Charge & Explore)",
+      "policy": "verify",
+      "note": "app landing — thin page",
+      "http": 200,
+      "loader": true,
+      "pubFromLoader": "pub-5278231299883833",
+      "adsTxt": "pub-5278231299883833",
       "slots": [],
       "err": null
     },
     {
-      "project": "AbramsEgo",
-      "domain": null,
-      "policy": "na",
-      "note": "internal command center (:9773) — not a public ad surface",
-      "http": null,
-      "loader": false,
-      "pubFromLoader": null,
-      "adsTxt": null,
+      "domain": "interiordesignershowroom.com",
+      "project": "interiordesignershowroom",
+      "policy": "forbid",
+      "flag": "Serving loader but NOT in AdSense account — REMOVE (pending approval)",
+      "http": 200,
+      "loader": true,
+      "pubFromLoader": "pub-5278231299883833",
+      "adsTxt": "pub-5278231299883833",
       "slots": [],
       "err": null
     }
diff --git a/sites.txt b/sites.txt
new file mode 100644
index 0000000..cebda28
--- /dev/null
+++ b/sites.txt
@@ -0,0 +1,14 @@
+# AdSense sites — account steveabramsdesigns@gmail.com / pub-5278231299883833
+# Pasted from the AdSense "Manage your sites" page 2026-08-05. One domain per line.
+# These 8 are the sites ADDED to the AdSense account (the authoritative list).
+nodailyworries.com
+beverlyhillsvideos.com
+wholivedthere.com
+claimmyaddress.com
+bubbe.ai
+celebsignatures.com
+bubbesblock.com
+chargeandexplore.com
+
+# --- Serving the loader but NOT in the AdSense account (misconfig — see flag) ---
+interiordesignershowroom.com

← cccd696 AdSense fleet status viewer — live probe + policy column + m  ·  back to Adsense Fleet Viewer  ·  Accurate per-site diagnosis: nodailyworries PARKED (needs DN 009af2f →