[object Object]

← back to Norma

TK-10758: ID-pinned eraser for the 2 residual sassy reposts

690a70bed2f9c31686337a2946299c0f4775fd82 · 2026-09-10 07:37:23 -0700 · Steve Abrams

fleet-sassy-scan.js --go deletes whatever its regex flags at run time, and
CREDIT_RE also matches a legitimate '📸 @handle' photo credit — so that path
could sweep an unreviewed good post. This pins the irreversible delete to the
exact two media_ids verified live on 2026-09-10, re-checks each is still live
and still sassy before acting, and tombstones each verified deletion.

Dry-run by default; --go is Steve-gated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013JCERcLpRfsvEBoPtvUkMJ

Files touched

Diff

commit 690a70bed2f9c31686337a2946299c0f4775fd82
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Sep 10 07:37:23 2026 -0700

    TK-10758: ID-pinned eraser for the 2 residual sassy reposts
    
    fleet-sassy-scan.js --go deletes whatever its regex flags at run time, and
    CREDIT_RE also matches a legitimate '📸 @handle' photo credit — so that path
    could sweep an unreviewed good post. This pins the irreversible delete to the
    exact two media_ids verified live on 2026-09-10, re-checks each is still live
    and still sassy before acting, and tombstones each verified deletion.
    
    Dry-run by default; --go is Steve-gated.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_013JCERcLpRfsvEBoPtvUkMJ
---
 agents/instagram-agent/erase-tk10758-residuals.js | 82 +++++++++++++++++++++++
 1 file changed, 82 insertions(+)

diff --git a/agents/instagram-agent/erase-tk10758-residuals.js b/agents/instagram-agent/erase-tk10758-residuals.js
new file mode 100644
index 0000000..7f39ec0
--- /dev/null
+++ b/agents/instagram-agent/erase-tk10758-residuals.js
@@ -0,0 +1,82 @@
+#!/usr/bin/env node
+/**
+ * erase-tk10758-residuals.js — TK-10758 final 2 residual sassy reposts.
+ *
+ * WHY THIS EXISTS instead of `fleet-sassy-scan.js --go`:
+ * that tool deletes whatever its regex flags AT RUN TIME. CREDIT_RE matches "📸 @handle",
+ * which a LEGITIMATE photo-credit post also trips — so a later run could sweep away a good
+ * post nobody reviewed. An irreversible customer-facing delete must be pinned to exactly the
+ * items that were reviewed. These two media_ids are hard-coded, verified live 2026-09-10.
+ *
+ *   node erase-tk10758-residuals.js         # dry run — verify + show, delete nothing
+ *   node erase-tk10758-residuals.js --go    # delete (Steve-gated; irreversible)
+ */
+require('dotenv').config();
+const fs = require('fs');
+const path = require('path');
+const https = require('https');
+
+const TOKEN = process.env.IG_ACCESS_TOKEN;
+const VER = process.env.IG_GRAPH_VERSION || 'v21.0';
+const HOST = 'graph.facebook.com';
+const TOMBS = path.join(__dirname, 'data', 'deleted-posts.jsonl');
+const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
+
+// The ONLY posts this script may ever touch. Verified live + sassy on 2026-09-10.
+const TARGETS = [
+  { handle: 'fabric_fridays', media_id: '17881914915683823', permalink: 'https://www.instagram.com/p/DcCNqSdAaAF/',
+    why: 'repost of Brunschwig & Fils content — "…pull up to Fabric Friday with THIS and had to share. The audacity of good taste"' },
+  { handle: 'fabric_fridays', media_id: '18054497498547838', permalink: 'https://www.instagram.com/p/DcCNoLrAXlz/',
+    why: 'repost of Designtex content — "Okay Designtex, this is doing WAY too much — in the exact right way."' },
+];
+
+const req = (method, p) => new Promise((resolve) => {
+  const r = https.request(`https://${HOST}/${VER}/${p}`, { method }, (res) => {
+    let s = ''; res.on('data', (d) => (s += d));
+    res.on('end', () => { let j = null; try { j = JSON.parse(s); } catch {} resolve({ status: res.statusCode, body: j }); });
+  });
+  r.on('error', () => resolve({ status: 0 })); r.end();
+});
+
+(async () => {
+  if (!TOKEN) { console.error('IG_ACCESS_TOKEN missing — aborting.'); process.exit(1); }
+  const GO = process.argv.includes('--go');
+  console.log(`\n=== TK-10758 residual erase — ${GO ? 'LIVE (--go)' : 'DRY RUN'} ===`);
+  console.log(`Pinned targets: ${TARGETS.length} (this script cannot touch anything else)\n`);
+
+  // Pre-flight: confirm each target is still live AND still carries its sassy caption.
+  const live = [];
+  for (const t of TARGETS) {
+    const r = await req('GET', `${t.media_id}?fields=id,caption,permalink&access_token=${TOKEN}`);
+    if (r.status === 200 && r.body && r.body.id) {
+      const cap = (r.body.caption || '').replace(/\n/g, ' ').slice(0, 90);
+      console.log(`  LIVE  @${t.handle} ${t.permalink}\n        "${cap}"\n        ${t.why}`);
+      live.push(t);
+    } else {
+      console.log(`  GONE  @${t.handle} ${t.permalink} — already deleted, nothing to do`);
+    }
+    await sleep(300);
+  }
+
+  if (!live.length) { console.log('\n✓ Nothing live to erase — TK-10758 residuals are already clear.'); return; }
+  if (!GO) { console.log(`\n${live.length} still live. Re-run with --go to erase (IRREVERSIBLE).`); return; }
+
+  let ok = 0, fail = 0;
+  for (const t of live) {
+    process.stdout.write(`DELETE @${t.handle} ${t.permalink} ... `);
+    await req('DELETE', `${t.media_id}?access_token=${TOKEN}`);
+    await sleep(1500);
+    const chk = await req('GET', `${t.media_id}?fields=id&access_token=${TOKEN}`);
+    const gone = chk.status !== 200 || (chk.body && chk.body.error);
+    if (gone) {
+      fs.appendFileSync(TOMBS, JSON.stringify({ ts: new Date().toISOString(), handle: t.handle,
+        media_id: t.media_id, permalink: t.permalink, method: 'graph-api', ticket: 'TK-10758',
+        reason: 'sassy-reshare-residual', verified: true }) + '\n');
+      ok++; console.log('✓ deleted + verified gone');
+    } else { fail++; console.log('✗ FAILED (still live)'); }
+    await sleep(3000);
+  }
+  console.log(`\nDONE: erased+verified ${ok}, failed ${fail}, of ${live.length}.`);
+  console.log('Next: re-run the guard to confirm clean →');
+  console.log('  node ~/.claude/skills/ig-sassy-repost-canary/check.mjs --deep');
+})();

← dd68303 IG fleet: add read-only link-drift checker (TK-10740)  ·  back to Norma  ·  IG fleet: re-enroll @grassclothwallpaper (34->35) — link res 2c9013b →