← 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
M scripts/check-publish-status.mjs
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 →