← back to Gmc Titlefix
TK-10993: gate the canary verdict on the config actually landing
a84ae548ea466a5efd0b2ef3b3c8e6cefbebd7f9 · 2026-09-04 05:58:15 -0700 · Steve Abrams
First real run exposed a flaw: a 3-offer drop in currency-mismatch (normal feed
churn) produced 'PARTIAL - currency errors falling', implying progress while the
console edits had not been made at all.
Verdict is now gated on the CA service actually reading CAD + shipping over 1 lb,
with a noise floor (max(50, 5%)) before any movement counts. Adds HALF-APPLIED
(currency landed, 1 lb cap still there) alongside HALF-FIXED, and REPROCESSING
for the legitimate config-landed-but-not-yet-serving window.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011CMTNwhCcyjeem27QgYMJS
Files touched
M tk10993-ca-canary-verify.mjs
Diff
commit a84ae548ea466a5efd0b2ef3b3c8e6cefbebd7f9
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Sep 4 05:58:15 2026 -0700
TK-10993: gate the canary verdict on the config actually landing
First real run exposed a flaw: a 3-offer drop in currency-mismatch (normal feed
churn) produced 'PARTIAL - currency errors falling', implying progress while the
console edits had not been made at all.
Verdict is now gated on the CA service actually reading CAD + shipping over 1 lb,
with a noise floor (max(50, 5%)) before any movement counts. Adds HALF-APPLIED
(currency landed, 1 lb cap still there) alongside HALF-FIXED, and REPROCESSING
for the legitimate config-landed-but-not-yet-serving window.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011CMTNwhCcyjeem27QgYMJS
---
tk10993-ca-canary-verify.mjs | 28 +++++++++++++++++++++++-----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/tk10993-ca-canary-verify.mjs b/tk10993-ca-canary-verify.mjs
index b5bfec5..b92b38d 100644
--- a/tk10993-ca-canary-verify.mjs
+++ b/tk10993-ca-canary-verify.mjs
@@ -100,13 +100,31 @@ console.log(` currency-mismatch ${f(bcur)} -> ${f(cur)}`);
console.log(` missing_shipping ${f(bca.codes?.missing_shipping)} -> ${f(ca.codes?.missing_shipping)}`);
console.log(` GB active ${f(gb.active)} disapproved ${f(gb.disapproved)}`);
+// Config gate: the canary numbers mean NOTHING until the console edits actually landed.
+// Small day-to-day drift in the feed is churn (products archived/added), not progress —
+// so require BOTH a landed config AND a material delta before claiming movement.
+const caSvc = snap.shipping?.CA?.[0] || {};
+const configLanded = caSvc.currency === 'CAD' && caSvc.ships_over_1lb === true;
+const currencyOnly = caSvc.currency === 'CAD' && caSvc.ships_over_1lb !== true;
+const MATERIAL = Math.max(50, Math.round((bcur || 0) * 0.05)); // noise floor
+const drop = (bcur || 0) - cur;
+
let verdict;
if (SAVE) verdict = 'BASELINE — pre-change snapshot only';
else if (!base) verdict = 'NO BASELINE — run --baseline first';
-else if (ca.active > 0 && cur < bcur * 0.5) verdict = 'PASS ✅ — canary flipped, shipping config PROVEN. Safe to proceed to the batched re-feed.';
-else if (cur < bcur && ca.active === 0) verdict = 'PARTIAL ⚠️ — currency errors falling but nothing serving yet; Google may still be reprocessing, or the weight bracket is still blocking.';
-else if ((ca.codes?.missing_shipping || 0) > (bca.codes?.missing_shipping || 0)) verdict = 'HALF-FIXED ❌ — currency cleared but offers moved to missing_shipping. The >1 lb weight bracket was NOT raised.';
-else if (ca.disapproved >= (bca.disapproved || 0)) verdict = 'NO CHANGE — edits not landed yet, or Google has not reprocessed (allow ~1–3 days).';
-else verdict = 'MOVED — partial change, review the numbers above.';
+else if (!caSvc.currency) verdict = 'UNKNOWN — could not read the CA shipping service.';
+else if (!configLanded && !currencyOnly)
+ verdict = `NO CHANGE — the console edits have NOT landed (CA still ${caSvc.currency}, still capped at 1 lb).`
+ + (Math.abs(drop) > 0 ? ` The ${drop > 0 ? '-' : '+'}${Math.abs(drop)} movement in the counts is normal feed churn, not progress.` : '');
+else if (currencyOnly && (ca.codes?.missing_shipping || 0) > (bca.codes?.missing_shipping || 0))
+ verdict = 'HALF-FIXED ❌ — currency landed but offers moved to missing_shipping. The >1 lb weight bracket was NOT raised. Go back to step 2.';
+else if (currencyOnly)
+ verdict = 'HALF-APPLIED ⚠️ — currency is CAD but the 1 lb cap is still in place, so ~4 lb rolls stay unshippable. Raise the weight bracket.';
+else if (ca.active > 0 && drop >= MATERIAL)
+ verdict = 'PASS ✅ — config landed AND the canary flipped. Shipping proven; safe to start the batched re-feed.';
+else if (ca.active > 0)
+ verdict = 'MOSTLY ✅ — config landed and offers are serving, but the currency-error drop is small; re-check in a day.';
+else
+ verdict = 'REPROCESSING ⏳ — config landed, nothing serving yet. Google typically takes ~1–3 days; re-run then.';
console.log(`\nVERDICT: ${verdict}`);
console.log('cost: $0 (read-only Google + Shopify reads)\n');
← 74802ae TK-10993: CA/GB recovery verifier + pre-change baseline
·
back to Gmc Titlefix
·
TK-10993: read-only US disapproval snapshot by issue code 9feab81 →