[object Object]

← back to Dw Marketing Reels

TK-10395: monitor fails loud on armed 'posted-unverified' (was silent-green)

060af89385241eee701f3e900461064368e63ead · 2026-08-10 10:58:32 -0700 · Steve

Contrarian find: check-publish-status treated 'posted-unverified' as GOOD and
the dup-guard skips it next run — so a timed-out-uncertain post that actually
failed would silently never reach IG while the monitor stayed green (the exact
TK-10395 failure class). Armed 'posted-unverified' now exits 1 → verify on IG
out-of-band. Unarmed tolerated; 'posted' control unaffected. Proven by test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 060af89385241eee701f3e900461064368e63ead
Author: Steve <steve@designerwallcoverings.com>
Date:   Mon Aug 10 10:58:32 2026 -0700

    TK-10395: monitor fails loud on armed 'posted-unverified' (was silent-green)
    
    Contrarian find: check-publish-status treated 'posted-unverified' as GOOD and
    the dup-guard skips it next run — so a timed-out-uncertain post that actually
    failed would silently never reach IG while the monitor stayed green (the exact
    TK-10395 failure class). Armed 'posted-unverified' now exits 1 → verify on IG
    out-of-band. Unarmed tolerated; 'posted' control unaffected. Proven by test.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
 scripts/check-publish-status.mjs | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/scripts/check-publish-status.mjs b/scripts/check-publish-status.mjs
index c9447e5..1861e65 100644
--- a/scripts/check-publish-status.mjs
+++ b/scripts/check-publish-status.mjs
@@ -41,12 +41,21 @@ const status = ig.status || 'unknown';
 const detail = `${reel.file} → instagram: ${status}${ig.note ? ' — ' + ig.note : ''}${ig.http ? ' [http ' + ig.http + ']' : ''}`;
 
 // Healthy terminal states (posted, or the deliberate not-yet-live gates).
-const GOOD = ['posted', 'posted-unverified', 'simulated', 'ready-pending-arm', 'held-claims-review'];
+// NOTE: 'posted-unverified' is deliberately NOT here — it means the client timed out AFTER
+// sending the request, so the post OUTCOME IS UNKNOWN. It is handled explicitly below.
+const GOOD = ['posted', 'simulated', 'ready-pending-arm', 'held-claims-review'];
 // Gate states that are expected while NOT armed but are a real failure once armed.
 const GATE = ['pending-creds', 'no-creds-for-account', 'ready-pending-arm'];
 
 if (GOOD.includes(status) && status !== 'ready-pending-arm') ok(detail);
-if (!ARMED && (GATE.includes(status) || status === 'error')) ok(`(not armed) ${detail}`);
+if (!ARMED && (GATE.includes(status) || status === 'error' || status === 'posted-unverified')) ok(`(not armed) ${detail}`);
+
+// 'posted-unverified' = client timed out after the request was SENT (outcome UNKNOWN) AND the
+// publisher's dup-guard SKIPS this reel on the next run. So if the post actually failed it would
+// silently never land while the monitor stayed green — the exact TK-10395 silent-no-post class
+// (contrarian find: the old GOOD-list swallowed this into a false green). When ARMED, refuse to go
+// green on an unknown outcome — fail LOUD so it's verified on IG out-of-band.
+if (ARMED && status === 'posted-unverified') fail(`armed post UNVERIFIED (client timeout — outcome unknown, dup-guard will skip next run) — verify on IG: ${detail}`);
 
 // Armed + not a healthy post = the TK-10395 failure mode (incl. 2207076 after retry exhaust).
 if (status === 'error' || GATE.includes(status)) fail(`armed IG publish did not land — ${detail}`);

← da29f0a TK-10395: wire push-alert (CNCP card + George email to steve  ·  back to Dw Marketing Reels  ·  auto-data-snapshot: 2026-08-10T11:29:10 (2 data files) — dat 386055f →