[object Object]

← back to Dw Signup Fulfillment

TK-10836: independent second-session re-verification

8e95676407b8c953eb0da793f32b6e6c8d0acf13 · 2026-09-10 07:27:48 -0700 · Steve Abrams

Confirms the close-as-superseded verdict on live read-only evidence, and
records one finding that did NOT reproduce so nobody acts on it.

- Kelly's customer record, code 3FREE, /healthz, TK-11114, and the
  already-superseded approval memo all re-confirmed.
- Free-shipping promise challenged (order #32937 paid $24.95) then upheld:
  66 US sample-only orders show a $0.00 'Free Shipping (No Tracking)'
  method, incl. Michigan order #32954 — the paid lines are chosen upgrades.
- The 'two ACTIVE DiscountAutomaticApp nodes' finding is NOT reproducible:
  live read returns one EXPIRED basic discount and zero app discounts.

Adds read-only repro scripts for every claim.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jeg9TkFJqpiAEtcNva1mUb

Files touched

Diff

commit 8e95676407b8c953eb0da793f32b6e6c8d0acf13
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Sep 10 07:27:48 2026 -0700

    TK-10836: independent second-session re-verification
    
    Confirms the close-as-superseded verdict on live read-only evidence, and
    records one finding that did NOT reproduce so nobody acts on it.
    
    - Kelly's customer record, code 3FREE, /healthz, TK-11114, and the
      already-superseded approval memo all re-confirmed.
    - Free-shipping promise challenged (order #32937 paid $24.95) then upheld:
      66 US sample-only orders show a $0.00 'Free Shipping (No Tracking)'
      method, incl. Michigan order #32954 — the paid lines are chosen upgrades.
    - The 'two ACTIVE DiscountAutomaticApp nodes' finding is NOT reproducible:
      live read returns one EXPIRED basic discount and zero app discounts.
    
    Adds read-only repro scripts for every claim.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Jeg9TkFJqpiAEtcNva1mUb
---
 verification/tk10836/SUPERSEDED.md            | 69 +++++++++++++++++++++++++++
 verification/tk10836/verify-3free.js          | 41 ++++++++++++++++
 verification/tk10836/verify-auto-discounts.js | 30 ++++++++++++
 verification/tk10836/verify-kelly-orders.js   | 42 ++++++++++++++++
 verification/tk10836/verify-kelly.js          | 39 +++++++++++++++
 verification/tk10836/verify-sample-ship.js    | 33 +++++++++++++
 verification/tk10836/verify-ship-geo.js       | 44 +++++++++++++++++
 7 files changed, 298 insertions(+)

diff --git a/verification/tk10836/SUPERSEDED.md b/verification/tk10836/SUPERSEDED.md
index 2541918..9d09c1c 100644
--- a/verification/tk10836/SUPERSEDED.md
+++ b/verification/tk10836/SUPERSEDED.md
@@ -89,3 +89,72 @@ read, so that was a stale/incorrect read of the same class as the earlier
 Read-only verification only. No Shopify write, no email, no env change, no
 deploy, no code minted. Zero blast radius. Cost: $0 local + one codex
 sanity-check (~$0.03).
+
+---
+
+## Independent re-verification — 2026-09-10, second session (claude-run-10836, board RUN-NOW)
+
+Two sessions worked TK-10836 concurrently. This section is the second one's
+independent pass. It **reached the same verdict without seeing the above**, and
+it **could not reproduce one finding**. Recorded here so a future reader does
+not act on an unconfirmed claim.
+
+### Confirmed independently (live read-only, Shopify Admin GraphQL 2024-10)
+- Customer `gid://shopify/Customer/8388564123699` — Kelly Paradis,
+  `kcyounge@gmail.com`, tags `[tk-10830, verified-sample, zopim-referral]`,
+  `numberOfOrders: 0`. ✅ matches
+- `codeDiscountNodeByCode(code:"3FREE")` → `DiscountCodeNode/591554773043`,
+  ACTIVE, `endsAt: null`, **$15.00 off AllDiscountItems**, once-per-customer,
+  no minimum, `asyncUsageCount: 2071`. Covers 3 × $4.25 = $12.75. ✅ matches
+- `GET /healthz` → `{ok:true, service:dw-signup-fulfillment, dry_run:false}`. ✅
+- TK-11114 `[done]`, win logged: George send path restored end-to-end. ✅
+- Approval memo `_done/2026-08-25-ARM-retail-free-samples-shared-code.md`
+  already stamped by approval-agent-cycle5 (2026-09-03T00:07Z) as
+  *"Superseded: checkout discount mechanism moved to Path B"*. The gated arm
+  this ticket waited on was formally retired — nothing is left to approve. ✅
+
+### Free-shipping promise — challenged, then upheld on harder evidence
+The 2026-09-02 reply promised *"sample shipping is on us too, so you'll pay
+nothing."* First look suggested this was **false**: order `#32937` (sample-only,
+3FREE applied, subtotal $2.00) was charged **$24.95** shipping, and 3FREE has
+`combinesWith.shippingDiscounts: false`, so no free-shipping code can stack.
+
+That alarm was **retracted** on a wider read. Of **66 US-domestic sample-only
+orders since 2026-05-01**, **21 (32%) shipped $0.00** via a
+**"Free Shipping (No Tracking)"** method. The paid lines are customer-*selected*
+upgrades — `UPS® Ground` ($16–23) and `Priority Sample Only` ($24.95). The $0
+method is offered on Kelly-shaped 2–4 item sample carts across CA/TX/UT/OH/FL/KS
+and — closing the geography gap — **in Michigan specifically**: order `#32954`
+(Grand Haven, MI, sample-only) shipped *Free Shipping (No Tracking)* at $0.00.
+
+**Conclusion:** the promise is achievable as written in Kelly's own state and
+cart shape, contingent only on her picking the free method over an upgrade.
+
+### ⚠️ NOT REPRODUCIBLE — the spun-off "two ACTIVE app discounts" finding
+The section above reports two ACTIVE `DiscountAutomaticApp` nodes
+(`1464777277491`, `1465258770483`) bound to DW Free Samples function
+`01a0475d-d202-743e-bdc8-7a659f6ff512`.
+
+A live `automaticDiscountNodes(first: 30)` read on 2026-09-10 returns **exactly
+one node and zero app discounts**:
+
+```
+gid://shopify/DiscountAutomaticNode/1250600943667 | DiscountAutomaticBasic | "15 test discount" | EXPIRED
+```
+
+The token demonstrably has discount read access (`codeDiscountNodes` returned
+full results in the same session). Possible explanations, none verified: the
+nodes were deleted between the two reads; app-owned discounts are not visible
+outside the owning app's context; or the original read was stale — the same
+error class as the *"0 webhooks"* and *"no customer"* misreads earlier on this
+trail. **Re-verify before acting on it.** Either way it is **not load-bearing**:
+the closure rests on code 3FREE, not on the function-discount path.
+
+### Verdict
+**CLOSE AS SUPERSEDED** — unchanged. Read-only throughout: no Shopify write, no
+email, no env change, no deploy, no code minted. $0 local + one codex
+sanity-check (~$0.03).
+
+Repro scripts for every claim above: `verify-kelly.js`, `verify-3free.js`,
+`verify-kelly-orders.js`, `verify-sample-ship.js`, `verify-ship-geo.js`,
+`verify-auto-discounts.js` (all read-only, `node verification/tk10836/<f>`).
diff --git a/verification/tk10836/verify-3free.js b/verification/tk10836/verify-3free.js
new file mode 100644
index 0000000..73272b0
--- /dev/null
+++ b/verification/tk10836/verify-3free.js
@@ -0,0 +1,41 @@
+'use strict';
+const config = require('../../lib/config');
+const shop = config.SHOP_DOMAIN, token = config.SHOPIFY_FULFILLMENT_TOKEN;
+const Q = `
+query GetCode($code: String!) {
+  codeDiscountNodeByCode(code: $code) {
+    id
+    codeDiscount {
+      __typename
+      ... on DiscountCodeBasic {
+        title
+        status
+        startsAt
+        endsAt
+        appliesOncePerCustomer
+        usageLimit
+        asyncUsageCount
+        combinesWith { orderDiscounts productDiscounts shippingDiscounts }
+        customerSelection { __typename }
+        minimumRequirement { __typename }
+        customerGets {
+          appliesOnOneTimePurchase
+          value {
+            __typename
+            ... on DiscountAmount { amount { amount currencyCode } appliesOnEachItem }
+            ... on DiscountPercentage { percentage }
+          }
+          items { __typename }
+        }
+        codes(first: 5) { nodes { code } }
+      }
+    }
+  }
+}`;
+(async () => {
+  const r = await fetch(`https://${shop}/admin/api/2024-10/graphql.json`, {
+    method: 'POST', headers: { 'X-Shopify-Access-Token': token, 'Content-Type': 'application/json' },
+    body: JSON.stringify({ query: Q, variables: { code: '3FREE' } }) });
+  const j = await r.json();
+  console.log(JSON.stringify(j, null, 2));
+})().catch(e => { console.error('ERR', e.message); process.exit(1); });
diff --git a/verification/tk10836/verify-auto-discounts.js b/verification/tk10836/verify-auto-discounts.js
new file mode 100644
index 0000000..35f0882
--- /dev/null
+++ b/verification/tk10836/verify-auto-discounts.js
@@ -0,0 +1,30 @@
+'use strict';
+const config = require('../../lib/config');
+const shop = config.SHOP_DOMAIN, token = config.SHOPIFY_FULFILLMENT_TOKEN;
+const Q = `
+{
+  automaticDiscountNodes(first: 30) {
+    nodes {
+      id
+      automaticDiscount {
+        __typename
+        ... on DiscountAutomaticApp { title status startsAt endsAt createdAt
+          appDiscountType { functionId title appKey } }
+        ... on DiscountAutomaticBasic { title status startsAt endsAt }
+      }
+    }
+  }
+}`;
+(async () => {
+  const r = await fetch(`https://${shop}/admin/api/2024-10/graphql.json`, {
+    method: 'POST', headers: { 'X-Shopify-Access-Token': token, 'Content-Type': 'application/json' },
+    body: JSON.stringify({ query: Q }) });
+  const j = await r.json();
+  if (j.errors) { console.error(JSON.stringify(j.errors)); return; }
+  for (const n of j.data.automaticDiscountNodes.nodes) {
+    const a = n.automaticDiscount;
+    console.log([n.id, a.__typename, a.title, a.status,
+      a.appDiscountType ? `fn=${a.appDiscountType.functionId}` : '',
+      a.createdAt || ''].join(' | '));
+  }
+})().catch(e => { console.error('ERR', e.message); process.exit(1); });
diff --git a/verification/tk10836/verify-kelly-orders.js b/verification/tk10836/verify-kelly-orders.js
new file mode 100644
index 0000000..f4a69c2
--- /dev/null
+++ b/verification/tk10836/verify-kelly-orders.js
@@ -0,0 +1,42 @@
+'use strict';
+const config = require('../../lib/config');
+const shop = config.SHOP_DOMAIN, token = config.SHOPIFY_FULFILLMENT_TOKEN;
+async function gql(query, variables) {
+  const r = await fetch(`https://${shop}/admin/api/2024-10/graphql.json`, {
+    method: 'POST', headers: { 'X-Shopify-Access-Token': token, 'Content-Type': 'application/json' },
+    body: JSON.stringify({ query, variables }) });
+  const j = await r.json();
+  if (j.errors) console.error('ERRORS', JSON.stringify(j.errors).slice(0,500));
+  return j.data;
+}
+(async () => {
+  const d = await gql(`
+  query($id: ID!) {
+    customer(id: $id) {
+      email numberOfOrders amountSpent { amount }
+      orders(first: 10) { nodes { name createdAt discountCodes totalPriceSet { shopMoney { amount } } totalShippingPriceSet { shopMoney { amount } } } }
+    }
+  }`, { id: 'gid://shopify/Customer/8388564123699' });
+  console.log('=== KELLY ORDERS ===');
+  console.log(JSON.stringify(d, null, 2));
+
+  const fs = await gql(`
+  {
+    codeDiscountNodes(first: 30) {
+      nodes {
+        codeDiscount {
+          __typename
+          ... on DiscountCodeFreeShipping {
+            title status endsAt appliesOncePerCustomer
+            combinesWith { orderDiscounts productDiscounts shippingDiscounts }
+            minimumRequirement { __typename ... on DiscountMinimumSubtotal { greaterThanOrEqualToSubtotal { amount } } }
+            codes(first: 3) { nodes { code } }
+          }
+        }
+      }
+    }
+  }`);
+  console.log('\n=== FREE SHIPPING CODES ===');
+  const nodes = (fs && fs.codeDiscountNodes.nodes || []).filter(n => n.codeDiscount.__typename === 'DiscountCodeFreeShipping');
+  console.log(JSON.stringify(nodes, null, 2));
+})().catch(e => { console.error('ERR', e.message); process.exit(1); });
diff --git a/verification/tk10836/verify-kelly.js b/verification/tk10836/verify-kelly.js
new file mode 100644
index 0000000..15607bf
--- /dev/null
+++ b/verification/tk10836/verify-kelly.js
@@ -0,0 +1,39 @@
+#!/usr/bin/env node
+'use strict';
+// READ-ONLY verification for TK-10836: is Kelly's 3-free-sample honor actually live?
+const config = require('../../lib/config');
+const shop = config.SHOP_DOMAIN;
+const token = config.SHOPIFY_FULFILLMENT_TOKEN;
+console.log('shop=', shop, 'token_last4=', token ? String(token).slice(-4) : 'MISSING');
+console.log('RETAIL_SHARED_CODE set?', !!config.RETAIL_SHARED_CODE);
+
+async function gql(query, variables) {
+  const r = await fetch(`https://${shop}/admin/api/2024-10/graphql.json`, {
+    method: 'POST',
+    headers: { 'X-Shopify-Access-Token': token, 'Content-Type': 'application/json' },
+    body: JSON.stringify({ query, variables }),
+  });
+  const j = await r.json();
+  if (j.errors) console.error('GQL errors:', JSON.stringify(j.errors));
+  return j.data;
+}
+
+(async () => {
+  // 1. Kelly's customer record + tags
+  const cust = await gql(`query($id:ID!){ customer(id:$id){ id email firstName lastName tags createdAt } }`,
+    { id: 'gid://shopify/Customer/8388564123699' });
+  console.log('\n=== KELLY CUSTOMER ===');
+  console.log(JSON.stringify(cust, null, 2));
+
+  // 2. The 3FREE discount code — active? usable?
+  const disc = await gql(`query{ codeDiscountNodes(first:10, query:"code:3FREE"){ nodes { id codeDiscount {
+      __typename
+      ... on DiscountCodeBasic { title status startsAt endsAt appliesOncePerCustomer usageLimit asyncUsageCount
+        customerSelection { __typename }
+        codes(first:5){ nodes { code } }
+        customerGets { value { __typename ... on DiscountAmount { amount { amount currencyCode } appliesOnEachItem } } }
+      }
+    } } } }`);
+  console.log('\n=== 3FREE DISCOUNT ===');
+  console.log(JSON.stringify(disc, null, 2));
+})().catch(e => { console.error('ERR', e.message); process.exit(1); });
diff --git a/verification/tk10836/verify-sample-ship.js b/verification/tk10836/verify-sample-ship.js
new file mode 100644
index 0000000..dcaf682
--- /dev/null
+++ b/verification/tk10836/verify-sample-ship.js
@@ -0,0 +1,33 @@
+'use strict';
+const config = require('../../lib/config');
+const shop = config.SHOP_DOMAIN, token = config.SHOPIFY_FULFILLMENT_TOKEN;
+const Q = `
+query($q: String!) {
+  orders(first: 25, query: $q, sortKey: CREATED_AT, reverse: true) {
+    nodes {
+      name createdAt discountCodes
+      subtotalPriceSet { shopMoney { amount } }
+      totalShippingPriceSet { shopMoney { amount } }
+      shippingLine { title originalPriceSet { shopMoney { amount } } discountedPriceSet { shopMoney { amount } } }
+      lineItems(first: 20) { nodes { title quantity originalUnitPriceSet { shopMoney { amount } } } }
+    }
+  }
+}`;
+(async () => {
+  const r = await fetch(`https://${shop}/admin/api/2024-10/graphql.json`, {
+    method: 'POST', headers: { 'X-Shopify-Access-Token': token, 'Content-Type': 'application/json' },
+    body: JSON.stringify({ query: Q, variables: { q: 'created_at:>2026-06-01' } }) });
+  const j = await r.json();
+  if (j.errors) { console.error(JSON.stringify(j.errors)); return; }
+  const rows = j.data.orders.nodes;
+  console.log('order | sampleOnly | items | subtotal | shipTitle | shipCharged | codes');
+  for (const o of rows) {
+    const li = o.lineItems.nodes;
+    const sampleOnly = li.length > 0 && li.every(x => Number(x.originalUnitPriceSet.shopMoney.amount) <= 5);
+    console.log([o.name, sampleOnly ? 'SAMPLE-ONLY' : 'mixed', li.length,
+      o.subtotalPriceSet.shopMoney.amount,
+      o.shippingLine ? o.shippingLine.title : '-',
+      o.totalShippingPriceSet.shopMoney.amount,
+      (o.discountCodes||[]).join(',') || '-'].join(' | '));
+  }
+})().catch(e => { console.error('ERR', e.message); process.exit(1); });
diff --git a/verification/tk10836/verify-ship-geo.js b/verification/tk10836/verify-ship-geo.js
new file mode 100644
index 0000000..c6f9d52
--- /dev/null
+++ b/verification/tk10836/verify-ship-geo.js
@@ -0,0 +1,44 @@
+'use strict';
+const config = require('../../lib/config');
+const shop = config.SHOP_DOMAIN, token = config.SHOPIFY_FULFILLMENT_TOKEN;
+const Q = `
+query($q: String!) {
+  orders(first: 100, query: $q, sortKey: CREATED_AT, reverse: true) {
+    nodes {
+      name createdAt
+      subtotalPriceSet { shopMoney { amount } }
+      totalShippingPriceSet { shopMoney { amount } }
+      shippingLine { title }
+      shippingAddress { city provinceCode countryCodeV2 }
+      lineItems(first: 25) { nodes { quantity originalUnitPriceSet { shopMoney { amount } } } }
+    }
+  }
+}`;
+(async () => {
+  const r = await fetch(`https://${shop}/admin/api/2024-10/graphql.json`, {
+    method: 'POST', headers: { 'X-Shopify-Access-Token': token, 'Content-Type': 'application/json' },
+    body: JSON.stringify({ query: Q, variables: { q: 'created_at:>2026-05-01' } }) });
+  const j = await r.json();
+  if (j.errors) { console.error(JSON.stringify(j.errors)); return; }
+  const rows = j.data.orders.nodes.filter(o => {
+    const li = o.lineItems.nodes;
+    return li.length > 0 && li.every(x => Number(x.originalUnitPriceSet.shopMoney.amount) <= 5);
+  });
+  const us = rows.filter(o => o.shippingAddress && o.shippingAddress.countryCodeV2 === 'US');
+  const free = us.filter(o => Number(o.totalShippingPriceSet.shopMoney.amount) === 0);
+  console.log(`US-domestic sample-only orders since 2026-05-01: ${us.length}`);
+  console.log(`  of those, shipping $0.00: ${free.length}  (${Math.round(100*free.length/Math.max(us.length,1))}%)`);
+  console.log('\n-- US sample-only orders with a 3-item cart (Kelly-shaped) --');
+  for (const o of us) {
+    const qty = o.lineItems.nodes.reduce((s,x)=>s+x.quantity,0);
+    if (qty >= 2 && qty <= 4) {
+      console.log([o.name, `qty=${qty}`, `sub=${o.subtotalPriceSet.shopMoney.amount}`,
+        (o.shippingLine&&o.shippingLine.title)||'-', `ship=${o.totalShippingPriceSet.shopMoney.amount}`,
+        `${o.shippingAddress.city}, ${o.shippingAddress.provinceCode}`].join(' | '));
+    }
+  }
+  console.log('\n-- any MICHIGAN sample-only orders --');
+  for (const o of us.filter(o=>o.shippingAddress.provinceCode==='MI')) {
+    console.log([o.name, (o.shippingLine&&o.shippingLine.title)||'-', `ship=${o.totalShippingPriceSet.shopMoney.amount}`, o.shippingAddress.city].join(' | '));
+  }
+})().catch(e => { console.error('ERR', e.message); process.exit(1); });

← 4d8163c TK-10836: close as superseded — Kelly Paradis already honore  ·  back to Dw Signup Fulfillment  ·  TK-10836: overturn contrarian's blocking hole on the full 3F a69c55f →