← back to Fentucci Naturals
TK-11868: live re-measurement — Fentucci Per-Yard width defect is 29, not 290 (261 already correct + rendering; 22 wrong-value linen, 7 missing faux-suede); memo width-source (tokiwa_catalog) does not join this vendor
e3b1ada6a6e4e0c8cf16db22ba3d61ff3b37e70a · 2026-09-20 01:06:56 -0700 · Steve Abrams
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7ujhBP8rChweH7QfhWRia
Files touched
A evidence/TK-11868/REMEASURE.mdA evidence/TK-11868/fentucci-width-scope.jsonA evidence/TK-11868/remeasure-probe.mjsA evidence/TK-11868/width-metafield-distribution-probe.mjs
Diff
commit e3b1ada6a6e4e0c8cf16db22ba3d61ff3b37e70a
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sun Sep 20 01:06:56 2026 -0700
TK-11868: live re-measurement — Fentucci Per-Yard width defect is 29, not 290 (261 already correct + rendering; 22 wrong-value linen, 7 missing faux-suede); memo width-source (tokiwa_catalog) does not join this vendor
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7ujhBP8rChweH7QfhWRia
---
evidence/TK-11868/REMEASURE.md | 47 +++++
evidence/TK-11868/fentucci-width-scope.json | 213 +++++++++++++++++++++
evidence/TK-11868/remeasure-probe.mjs | 35 ++++
.../width-metafield-distribution-probe.mjs | 26 +++
4 files changed, 321 insertions(+)
diff --git a/evidence/TK-11868/REMEASURE.md b/evidence/TK-11868/REMEASURE.md
new file mode 100644
index 0000000..086a67a
--- /dev/null
+++ b/evidence/TK-11868/REMEASURE.md
@@ -0,0 +1,47 @@
+# TK-11868 — Fentucci "Per Yard, no width" — LIVE RE-MEASUREMENT (2026-09-20)
+
+Agent: night-TK-11868 (overnight autonomous). READ-ONLY live verification via Shopify
+Admin API (designer-laboratory-sandbox, API 2024-10) + dw_unified mirror. No writes fired.
+
+## Headline: the memo's "290 with NO width" is OUTDATED. Real defect today = **29**, not 290.
+
+Re-measured all 290 ACTIVE vendor=`Fentucci` products that carry a purchasable
+`Sold Per Yard` variant (option "Size" = [Sold Per Yard, Sample], Per-Yard priced ~$94/yd,
+Sample $4.25 — a genuinely-priced per-yard line, NOT the quote-only $4.25 Tokiwa line):
+
+| bucket | count | custom.width value | verdict |
+|--------|-------|--------------------|---------|
+| OK | **261** | `36" Wide (trim to 34")` (259) / `36 Inches` (2) | width present AND renders on live PDP — **not defective** |
+| WRONGVAL | **22** | `3in x 1.5ft` (a memo/sample dimension, not a roll width) | wrong value — these are the **Bernadette Linen Fabric** products (DWQW-* handles) |
+| MISSING | **7** | (none) | no width metafield at all — the **Fentucci Faux Suede** products, DWFE-1061..1067 |
+
+Live PDP confirmation: grasscloth Per-Yard product `ba206-...` renders `36" Wide` +
+`trim to 34"` in the spec block → the 261 OK genuinely show width to the shopper.
+WRONGVAL sample `dwqw-58160-handle` does NOT render `3in x 1.5ft` on the PDP (fabric
+template) → those 22 show no usable width and the metafield value is wrong anyway.
+
+## Corrections to the gated memo (2026-09-16-...-peryard-no-width-290.md)
+
+1. **Scope is 29, not 290.** 261/290 already have a correct, rendered width (likely
+ remediated after the memo was authored 2026-09-16). Only 22 wrong-value + 7 missing remain.
+2. **Width SOURCE in the memo is WRONG for this scope.** Memo cites
+ `tokiwa_catalog.specs->>'width'` ("36 inches", 504/504). But `tokiwa_catalog` is the
+ **Fentucci NATURALS** line (dw_sku `DWFN-*`, mfr `A-180xx`). The 290 here are vendor
+ **`Fentucci`** (variant SKUs `DWFE-*` / `DWQW-*` / `DWPA-*`) and do NOT join to
+ `tokiwa_catalog` by dw_sku or mfr_sku (verified: 0 rows). So "no guessing, width is in
+ staging" does NOT hold for the actual 29.
+3. **No confirmed width source for the 29 fabrics.** They are FABRIC sub-lines (Bernadette
+ Linen ×22, Faux Suede ×7); the correct fabric roll width (linen/faux-suede are commonly
+ 54" but that is a GUESS) is not present in any staging table joinable by their SKUs.
+ **vp-dw-commerce / Steve must supply/confirm the real width before any write.**
+
+## Exact IDs
+`fentucci-width-scope.json` in this dir lists all 22 WRONGVAL + 7 MISSING product GIDs,
+titles, and per-yard SKUs. That is the bounded, reversible target set for the eventual
+GATED fix (metafield backfill/correction; record old→new per product; ≤29 blast radius).
+
+## Status
+The fix is a customer-facing live-store metafield write → **GATED**. Nothing fired here.
+This re-measurement only sharpens the memo (290→29) and surfaces the width-source gap.
+
+Reproduce: `node remeasure-probe.mjs` (read-only; needs SHOPIFY_ADMIN_TOKEN in env).
diff --git a/evidence/TK-11868/fentucci-width-scope.json b/evidence/TK-11868/fentucci-width-scope.json
new file mode 100644
index 0000000..784fcec
--- /dev/null
+++ b/evidence/TK-11868/fentucci-width-scope.json
@@ -0,0 +1,213 @@
+{
+ "measured_at": "2026-09-20T08:04:04.120Z",
+ "source": "Shopify Admin API live, vendor=Fentucci status=active",
+ "per_yard_total": 290,
+ "ok": 261,
+ "wrongval": [
+ {
+ "gid": "gid://shopify/Product/7317655158835",
+ "pid": "7317655158835",
+ "title": "Fentucci Bernadette Linen Fabric - Country Floral - French Blue & Antique Ruby",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58160"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655224371",
+ "pid": "7317655224371",
+ "title": "Fentucci Bernadette Linen Fabric- Country Floral - French Blue",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58161"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655257139",
+ "pid": "7317655257139",
+ "title": "Fentucci Bernadette Linen Fabric - Country Floral - Pomme & Antique Ruby",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58162"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655322675",
+ "pid": "7317655322675",
+ "title": "Fentucci Bernadette Linen Fabric - Country Floral - Hickory Smoke & Blue Bell",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58163"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655355443",
+ "pid": "7317655355443",
+ "title": "Fentucci Bernadette Linen Fabric - Country Floral - Summer Sky & French Blue",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58164"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655420979",
+ "pid": "7317655420979",
+ "title": "Fentucci Maia Linen Fabric- Country Botanical - Poppy Seed",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58165"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655519283",
+ "pid": "7317655519283",
+ "title": "Fentucci Maia Linen Fabric - Country Botanical - Antique Ruby",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58166"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655552051",
+ "pid": "7317655552051",
+ "title": "Fentucci Maia Linen Fabric Country Botanical - Bleu Bisque",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58167"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655617587",
+ "pid": "7317655617587",
+ "title": "Fentucci Maia Linen Fabric - Country Botanical - Rustic Rouge",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58168"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655650355",
+ "pid": "7317655650355",
+ "title": "Fentucci Maia Linen Fabric - Country Botanical - French Blue",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58169"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655715891",
+ "pid": "7317655715891",
+ "title": "Fentucci Chinoiserie Linen Fabric - Country Toile - Poppy Seed",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58170"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655748659",
+ "pid": "7317655748659",
+ "title": "Fentucci Chinoiserie Linen Fabric - Country Toile - Antique Ruby",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58171"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655814195",
+ "pid": "7317655814195",
+ "title": "Fentucci Chinoiserie Linen Fabric - Country Toile - Bleu Bisque",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58172"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655879731",
+ "pid": "7317655879731",
+ "title": "Fentucci Chinoiserie Linen Fabric - Country Toile - Herb",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58173"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655912499",
+ "pid": "7317655912499",
+ "title": "Fentucci Chinoiserie Linen Fabric - Country Toile - Hickory Smoke",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58174"
+ },
+ {
+ "gid": "gid://shopify/Product/7317655978035",
+ "pid": "7317655978035",
+ "title": "Fentucci Chinoiserie Linen Fabric - Country Toile - French Grey",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58175"
+ },
+ {
+ "gid": "gid://shopify/Product/7317656010803",
+ "pid": "7317656010803",
+ "title": "Fentucci Chinoiserie Linen Fabric - Country Toile - Denim Wash",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58176"
+ },
+ {
+ "gid": "gid://shopify/Product/7317656076339",
+ "pid": "7317656076339",
+ "title": "Fentucci Bebe Linen Fabric - Country Plaid - Poppy Seed",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58177"
+ },
+ {
+ "gid": "gid://shopify/Product/7317656109107",
+ "pid": "7317656109107",
+ "title": "Fentucci Bebe Linen Fabric - Country Plaid - Rustic Rouge",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58178"
+ },
+ {
+ "gid": "gid://shopify/Product/7317656141875",
+ "pid": "7317656141875",
+ "title": "Fentucci Bebe Linen Fabric - Country Plaid - Denim Wash",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58179"
+ },
+ {
+ "gid": "gid://shopify/Product/7317656207411",
+ "pid": "7317656207411",
+ "title": "Fentucci Bebe Linen Fabric - Country Plaid - Herb",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58180"
+ },
+ {
+ "gid": "gid://shopify/Product/7317656272947",
+ "pid": "7317656272947",
+ "title": "Fentucci Bebe Linen Fabric - Country Plaid - Driftwood",
+ "cw": "3in x 1.5ft",
+ "per_yard_sku": "DWQW-58181"
+ }
+ ],
+ "missing": [
+ {
+ "gid": "gid://shopify/Product/6847072862259",
+ "pid": "6847072862259",
+ "title": "Fentucci Faux Suede",
+ "handle": "bhr-74501faux-suede-fabric",
+ "per_yard_sku": "DWFE-1061"
+ },
+ {
+ "gid": "gid://shopify/Product/6847072895027",
+ "pid": "6847072895027",
+ "title": "Fentucci Faux Suede",
+ "handle": "bhr-74502faux-suede-fabric",
+ "per_yard_sku": "DWFE-1062"
+ },
+ {
+ "gid": "gid://shopify/Product/6847072960563",
+ "pid": "6847072960563",
+ "title": "Fentucci Faux Suede",
+ "handle": "bhr-74505faux-suede-fabric",
+ "per_yard_sku": "DWFE-1063"
+ },
+ {
+ "gid": "gid://shopify/Product/6847072993331",
+ "pid": "6847072993331",
+ "title": "Fentucci Faux Suede",
+ "handle": "bhr-74506faux-suede-fabric",
+ "per_yard_sku": "DWFE-1064"
+ },
+ {
+ "gid": "gid://shopify/Product/6847073026099",
+ "pid": "6847073026099",
+ "title": "Fentucci Faux Suede",
+ "handle": "bhr-74507faux-suede-fabric",
+ "per_yard_sku": "DWFE-1065"
+ },
+ {
+ "gid": "gid://shopify/Product/6847073058867",
+ "pid": "6847073058867",
+ "title": "Fentucci Faux Suede",
+ "handle": "bhr-74508faux-suede-fabric",
+ "per_yard_sku": "DWFE-1066"
+ },
+ {
+ "gid": "gid://shopify/Product/6847073091635",
+ "pid": "6847073091635",
+ "title": "Fentucci Faux Suede",
+ "handle": "bhr-74509faux-suede-fabric",
+ "per_yard_sku": "DWFE-1067"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/evidence/TK-11868/remeasure-probe.mjs b/evidence/TK-11868/remeasure-probe.mjs
new file mode 100644
index 0000000..6be3bba
--- /dev/null
+++ b/evidence/TK-11868/remeasure-probe.mjs
@@ -0,0 +1,35 @@
+import fs from 'fs'; import os from 'os'; import path from 'path';
+const SHOP='designer-laboratory-sandbox.myshopify.com'; const API=`https://${SHOP}/admin/api/2024-10/graphql.json`;
+function tok(){const e=fs.readFileSync(path.join(os.homedir(),'Projects/secrets-manager/.env'),'utf8');
+ const m=e.split('\n').find(l=>/^SHOPIFY_ADMIN_TOKEN=/i.test(l));return m.split('=').slice(1).join('=').trim().replace(/^["']|["']$/g,'');}
+const T=tok();
+async function gql(q,v){const r=await fetch(API,{method:'POST',headers:{'X-Shopify-Access-Token':T,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});
+ const j=await r.json(); if(j.errors)throw new Error(JSON.stringify(j.errors)); return j.data;}
+const Q=`query($c:String){products(first:50,query:"vendor:'Fentucci' status:active",after:$c){
+ pageInfo{hasNextPage endCursor}
+ nodes{id title handle
+ cw:metafield(namespace:"custom",key:"width"){value}
+ variants(first:5){nodes{title sku}}}}}`;
+let cur=null, all=[];
+for(;;){const d=await gql(Q,{c:cur}); all.push(...d.products.nodes);
+ if(!d.products.pageInfo.hasNextPage)break; cur=d.products.pageInfo.endCursor;}
+const py=all.filter(p=>(p.variants.nodes||[]).some(v=>/per\s*yard/i.test(v.title)));
+function cat(p){const v=(p.cw?.value||'').trim();
+ if(!v)return 'MISSING';
+ if(/ft/i.test(v))return 'WRONGVAL'; // "3in x 1.5ft" sample-memo dim
+ const m=v.match(/(\d+(?:\.\d+)?)\s*("|in|inch)/i);
+ if(m && parseFloat(m[1])<18)return 'WRONGVAL';
+ return 'OK';}
+const g={MISSING:[],WRONGVAL:[],OK:[]};
+for(const p of py)g[cat(p)].push(p);
+console.log(`per_yard=${py.length} OK=${g.OK.length} WRONGVAL=${g.WRONGVAL.length} MISSING=${g.MISSING.length}`);
+console.log('\nWRONGVAL sample values:', [...new Set(g.WRONGVAL.map(p=>p.cw.value))]);
+console.log('WRONGVAL ids:', g.WRONGVAL.map(p=>p.id.split('/').pop()).join(','));
+fs.writeFileSync('fentucci-width-scope.json',JSON.stringify({
+ measured_at:new Date().toISOString(), source:'Shopify Admin API live, vendor=Fentucci status=active',
+ per_yard_total:py.length, ok:g.OK.length, wrongval:g.WRONGVAL.length, missing:g.MISSING.length,
+ wrongval:g.WRONGVAL.map(p=>({gid:p.id,pid:p.id.split('/').pop(),title:p.title,cw:p.cw.value,
+ per_yard_sku:(p.variants.nodes.find(v=>/per\s*yard/i.test(v.title))||{}).sku})),
+ missing:g.MISSING.map(p=>({gid:p.id,pid:p.id.split('/').pop(),title:p.title,handle:p.handle,
+ per_yard_sku:(p.variants.nodes.find(v=>/per\s*yard/i.test(v.title))||{}).sku}))},null,2));
+console.log('\nwrote fentucci-width-scope.json');
diff --git a/evidence/TK-11868/width-metafield-distribution-probe.mjs b/evidence/TK-11868/width-metafield-distribution-probe.mjs
new file mode 100644
index 0000000..5fc3960
--- /dev/null
+++ b/evidence/TK-11868/width-metafield-distribution-probe.mjs
@@ -0,0 +1,26 @@
+import fs from 'fs'; import os from 'os'; import path from 'path';
+const SHOP='designer-laboratory-sandbox.myshopify.com'; const API=`https://${SHOP}/admin/api/2024-10/graphql.json`;
+function tok(){const e=fs.readFileSync(path.join(os.homedir(),'Projects/secrets-manager/.env'),'utf8');
+ const m=e.split('\n').find(l=>/^SHOPIFY_ADMIN_TOKEN=/i.test(l));return m.split('=').slice(1).join('=').trim().replace(/^["']|["']$/g,'');}
+const T=tok();
+async function gql(q,v){const r=await fetch(API,{method:'POST',headers:{'X-Shopify-Access-Token':T,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});
+ const j=await r.json(); if(j.errors)throw new Error(JSON.stringify(j.errors)); return j.data;}
+const Q=`query($c:String){products(first:50,query:"vendor:'Fentucci' status:active",after:$c){
+ pageInfo{hasNextPage endCursor}
+ nodes{id title handle productType options{name values}
+ cw:metafield(namespace:"custom",key:"width"){value}
+ sw:metafield(namespace:"specs",key:"width"){value}
+ variants(first:5){nodes{title price}}}}}`;
+let cur=null, all=[];
+for(;;){const d=await gql(Q,{c:cur}); all.push(...d.products.nodes);
+ if(!d.products.pageInfo.hasNextPage)break; cur=d.products.pageInfo.endCursor;}
+const py=all.filter(p=>(p.options||[]).some(o=>/per\s*yard/i.test(o.name)||(o.values||[]).some(v=>/per\s*yard/i.test(v)))
+ || (p.variants.nodes||[]).some(v=>/per\s*yard/i.test(v.title)));
+console.log("Per-Yard total:", py.length);
+const dist={};
+for(const p of py){const k=`custom.width=${JSON.stringify(p.cw?.value)} | specs.width=${JSON.stringify(p.sw?.value)}`; dist[k]=(dist[k]||0)+1;}
+console.log("width-metafield distribution across the 290:");
+for(const [k,n] of Object.entries(dist).sort((a,b)=>b[1]-a[1])) console.log(` ${n} ${k}`);
+console.log("\nNeither custom.width NOR specs.width:", py.filter(p=>!(p.cw?.value?.trim())&&!(p.sw?.value?.trim())).length);
+console.log("\n2 grasscloth samples w/ handle (for live PDP check):");
+for(const p of py.filter(p=>/grass/i.test(p.title)).slice(0,2)) console.log(" ", p.handle, "| custom.width:",p.cw?.value, "| specs.width:",p.sw?.value, "| type:",p.productType);
← 8b8222e TK-11664: propagate cadence exit codes (kill the false-green
·
back to Fentucci Naturals
·
TK-11943: evidence — Fentucci Naturals $0 Per-Yard is guarde ae29738 →