[object Object]

← back to Norma

IG fleet: fold 5 email-discovered owned accounts into manifest + stage themes

5b914e4d573b15f915cca8bcb0f85e8d81d810e7 · 2026-08-12 10:37:02 -0700 · steve@designerwallcoverings.com

Files touched

Diff

commit 5b914e4d573b15f915cca8bcb0f85e8d81d810e7
Author: steve@designerwallcoverings.com <steve@designerwallcoverings.com>
Date:   Wed Aug 12 10:37:02 2026 -0700

    IG fleet: fold 5 email-discovered owned accounts into manifest + stage themes
---
 agents/instagram-agent/account-themes.json |  9 ++++++-
 agents/instagram-agent/build-manifest.json | 11 ++++++++
 agents/instagram-agent/probe-unlinked.js   | 42 ++++++++++++++++++++++++++++++
 3 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/agents/instagram-agent/account-themes.json b/agents/instagram-agent/account-themes.json
index 75d022e..247e8ed 100644
--- a/agents/instagram-agent/account-themes.json
+++ b/agents/instagram-agent/account-themes.json
@@ -61,6 +61,13 @@
     "tradeonlytextiles":       { "keyword": "textile" },
     "charlestonwallpaper":     { "keyword": "charleston traditional" },
     "chicagowallpaper":        { "keyword": "chicago modern" },
-    "asseeninmovies":          { "keyword": "dramatic scenic", "sensitive": true }
+    "asseeninmovies":          { "keyword": "dramatic scenic", "sensitive": true },
+
+    "_email_sweep_note": "Below: owned/active accounts found in the 2026-08-12 email sweep, staged for the moment each IG is connected to its Page (build-registry then enrolls it). Inert until the handle is linked. protestdaily is skip — it's a news/media account, not a wallcovering product feed; give it bespoke content, never the DW-product cadence.",
+    "designerschat":           { "keyword": "interior design" },
+    "beverlyandhillsdesigns":  { "keyword": "glamour interior design" },
+    "filthyrichlivingcom":     { "keyword": "luxury glamour" },
+    "nationalpaperhangers":    { "keyword": "wallpaper installation" },
+    "protestdaily":            { "skip": "news/media account — not a wallcovering product cadence; post bespoke content only" }
   }
 }
diff --git a/agents/instagram-agent/build-manifest.json b/agents/instagram-agent/build-manifest.json
index 5f3d2d8..e2c0024 100644
--- a/agents/instagram-agent/build-manifest.json
+++ b/agents/instagram-agent/build-manifest.json
@@ -33,6 +33,17 @@
   "already_decided": [
     { "page_name": "Hospitality Fabrics (CREATE)", "handle": "hospitalityfabrics", "status": "exists", "line": "Hospitality fabrics", "theme_keyword": "hospitality fabric", "sensitive": false, "note": "DTD 8/8 2026-08-12 — account exists (360 followers), CREATE the 'Hospitality Fabrics' Page then link + assign, then re-run build-registry (fleet 35->36)." }
   ],
+  "existing_owned_unlinked": {
+    "_note": "Owned, ACTIVE Instagram accounts surfaced by the 2026-08-12 email sweep (recipient-handle on real IG notification mail = account Steve controls) that are NOT in the 35 postable. Each is human-gated: Meta reserves the IG->Page connect for the account's own login, and Page-creation via Graph API was deprecated in 2023, so neither step is scriptable. Graph-probed 2026-08-12 (probe-unlinked.js against the shared token, 80 Pages). action=link_only -> Page already on token, just connect the IG; action=page_needed_then_link -> no Page on token, create the Page (UI) then connect. After either, re-run build-registry.js to auto-enroll.",
+    "verified_against": "me/accounts probe 2026-08-12 + George email sweep (601 IG mails, 4 mailboxes)",
+    "accounts": [
+      { "page_name": "Designers Chat", "handle": "designerschat", "status": "exists", "action": "link_only", "line": "Community / designers chat", "theme_keyword": "interior design", "sensitive": false, "note": "Page 'Designers Chat' IS on the token (no IG linked). IG @designerschat is active ('someone started following you' 8/7). Correction: the UNLINKED-PAGES-CHECKLIST filed this Tier-2 as 'no IG' — email proves the IG exists. Just connect it." },
+      { "page_name": "Beverly & Hills Designs", "handle": "beverlyandhillsdesigns", "status": "exists_ig_no_page", "action": "page_needed_then_link", "line": "Design / brand", "theme_keyword": "glamour interior design", "sensitive": false, "note": "No matching Page on token; IG active (recipient of feed/suggestion mail). Set IG to Business/Creator, create a Page, connect, assign, re-run build-registry." },
+      { "page_name": "Filthy Rich Living", "handle": "filthyrichlivingcom", "status": "exists_ig_no_page", "action": "page_needed_then_link", "line": "Luxury lifestyle", "theme_keyword": "luxury glamour", "sensitive": false, "note": "No Page on token; IG active + owns info@filthyrichliving.com. Create Page + connect." },
+      { "page_name": "National Paper Hangers", "handle": "nationalpaperhangers", "status": "exists_ig_no_page", "action": "page_needed_then_link", "line": "Installer directory", "theme_keyword": "wallpaper installation", "sensitive": false, "note": "No Page on token; IG active + owns info@nationalpaperhangers.com. Sibling of the live @wallpaperinstallers. Create Page + connect." },
+      { "page_name": "Protest Daily", "handle": "protestdaily", "status": "exists_ig_no_page", "action": "page_needed_then_link", "line": "News / media (venture)", "theme_keyword": null, "sensitive": true, "note": "No Page on token; IG active. NOT a wallcovering account — the DW-product daily cadence does NOT fit; theme is skip. Link it so it's postable, but feed it its own (non-product) content, not the auto-cadence." }
+    ]
+  },
   "tier2_link_only_if_posting": ["Designers Chat","Interior Designer Showroom","Local Design Firms","Local Designer Directory","DesignerWallpaperForum.com","WallpaperWeekly.com (overlaps @grassclothwallpaper)","To The Trade Daily","All News Daily","DSGN TV","Wallpaper Design Competition","NOTVRequired.com"],
   "tier3_dups_skip": ["Brazilliance Walls & Fabrics","Traditional Whimsy Home","FFE Purchasing Group"],
   "tier4_junk_skip": ["Bubbe","Why Legalize - Marijuana","Faux News Live","LAFires.org - Los Angeles Fires","Los Angeles Fires"]
diff --git a/agents/instagram-agent/probe-unlinked.js b/agents/instagram-agent/probe-unlinked.js
new file mode 100644
index 0000000..3acff03
--- /dev/null
+++ b/agents/instagram-agent/probe-unlinked.js
@@ -0,0 +1,42 @@
+#!/usr/bin/env node
+/* Probe the link-state of the owned-but-unenrolled accounts found in email.
+ * Reuses build-registry's token resolver; token stays in memory, never printed. */
+const fs = require('fs');
+const path = require('path');
+const os = require('os');
+const GRAPH = process.env.IG_GRAPH_HOST || 'https://graph.facebook.com';
+const V = process.env.IG_GRAPH_VERSION || 'v21.0';
+
+function token() {
+  if (process.env.META_ACCESS_TOKEN) return process.env.META_ACCESS_TOKEN;
+  try {
+    const p = path.join(os.homedir(), 'Projects/secrets-manager/.env');
+    const line = fs.readFileSync(p, 'utf8').split('\n').find((l) => l.startsWith('META_ACCESS_TOKEN='));
+    if (line) return line.slice('META_ACCESS_TOKEN='.length).trim();
+  } catch {}
+  return '';
+}
+
+const NEEDLES = ['beverly', 'filthy', 'protest', 'paperhanger', 'paper hanger', 'designers chat', 'designerschat', 'hospitality fabric', 'dsgn'];
+
+(async () => {
+  const t = token();
+  if (!t) { console.error('no token'); process.exit(1); }
+  let url = `${GRAPH}/${V}/me/accounts?fields=name,instagram_business_account{username},connected_instagram_account{username}&limit=100&access_token=${encodeURIComponent(t)}`;
+  const pages = [];
+  while (url) {
+    const r = await fetch(url); const j = await r.json();
+    if (j.error) { console.error('ERR', j.error.message); process.exit(1); }
+    pages.push(...(j.data || []));
+    url = j.paging && j.paging.next ? j.paging.next : null;
+  }
+  console.log('pages on token:', pages.length);
+  const hit = pages.filter((p) => NEEDLES.some((n) => (p.name || '').toLowerCase().includes(n)));
+  console.log('=== matching Pages ===');
+  for (const p of hit) {
+    const ig = p.instagram_business_account && p.instagram_business_account.username;
+    const ci = p.connected_instagram_account && p.connected_instagram_account.username;
+    console.log(`- "${p.name}" | ig_business=${ig || '—'} | connected=${ci || '—'}`);
+  }
+  if (!hit.length) console.log('(no Page names match — these accounts have NO Page on this token)');
+})();

← 2da8980 auto-data-snapshot: 2026-08-12T10:26:55 (1 data files) — age  ·  back to Norma  ·  IG runbook: add Phase 0b — link the 5 email-discovered owned 970272b →