← 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
A agents/instagram-agent/erase-tk10758-residuals.js
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 →