[object Object]

← 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

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 →