← back to Ticket System
auto-data-snapshot: 2026-09-05T10:03:39 (4 data files) — data/claude-run-11256/evidence/canary.mjs.diff data/claude-run-11256/evidence/canary.mjs.post-fix data/claude-run-11256/evidence/canary.mjs.pre-fix-backup data/claude-run-11256/evidence/tk11256-image-identity-post-fix-full-manifest.json
63f6a57a941e5f9512928e2e3fbc5cd3e9b268ae · 2026-09-05 10:03:39 -0700 · auto-commit-fleet
Files touched
A data/claude-run-11256/evidence/canary.mjs.diffA data/claude-run-11256/evidence/canary.mjs.post-fixA data/claude-run-11256/evidence/canary.mjs.pre-fix-backupA data/claude-run-11256/evidence/tk11256-image-identity-post-fix-full-manifest.json
Diff
commit 63f6a57a941e5f9512928e2e3fbc5cd3e9b268ae
Author: auto-commit-fleet <steve@designerwallcoverings.com>
Date: Sat Sep 5 10:03:39 2026 -0700
auto-data-snapshot: 2026-09-05T10:03:39 (4 data files) — data/claude-run-11256/evidence/canary.mjs.diff data/claude-run-11256/evidence/canary.mjs.post-fix data/claude-run-11256/evidence/canary.mjs.pre-fix-backup data/claude-run-11256/evidence/tk11256-image-identity-post-fix-full-manifest.json
---
data/claude-run-11256/evidence/canary.mjs.diff | 33 ++
data/claude-run-11256/evidence/canary.mjs.post-fix | 169 ++++++
.../evidence/canary.mjs.pre-fix-backup | 140 +++++
...1256-image-identity-post-fix-full-manifest.json | 655 +++++++++++++++++++++
4 files changed, 997 insertions(+)
diff --git a/data/claude-run-11256/evidence/canary.mjs.diff b/data/claude-run-11256/evidence/canary.mjs.diff
new file mode 100644
index 00000000..e855fdb9
--- /dev/null
+++ b/data/claude-run-11256/evidence/canary.mjs.diff
@@ -0,0 +1,33 @@
+28a29,32
+> // Shopify appends a GUID suffix on re-upload of the same asset (e.g. "..._2df9_6aed8978-...-c7bc33a3d68d.jpg");
+> // stripping it lets us compare the underlying DAM asset identity, not the re-upload artifact.
+> const GUID_RE=/_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(\.[a-zA-Z]+)$/;
+> function stripGuid(fn){ return fn.replace(GUID_RE,'$1'); }
+49a54,72
+> function ownStagingFiles(vendors){
+> // Per-SKU precision check (fixes a confirmed false-positive class, TK-11256 2026-09-05:
+> // review12_verdicts.jsonl vision-adjudicated 7 "KEEP" cases where the flagged gallery
+> // image WAS the SKU's own staging main/gallery asset, but the coarse token() bucket
+> // let a DIFFERENT colorway's similarly-prefixed asset claim it in the global home map).
+> // Returns {mfr_sku: Set(stripGuid(filename))} — own-file identity, no cross-SKU bucketing.
+> const own={};
+> for(const v of vendors){ const cfg=STAGING[v]; if(!cfg) continue;
+> let rows='';
+> try{ rows=execSync(`/opt/homebrew/bin/psql -h /tmp dw_unified -t -A -F'|' -c "SELECT ${cfg.sku}, coalesce(${cfg.main},''), array_to_string(${cfg.gallery},'~~') FROM ${cfg.table};"`,{encoding:'utf8'}); }catch(e){ continue; }
+> for(const line of rows.split('\n')){ const p=line.split('|'); if(p.length<3) continue;
+> const sku=p[0].trim(); if(!sku) continue;
+> const set=own[sku]=own[sku]||new Set();
+> if(p[1]) set.add(stripGuid(fname(p[1])));
+> for(const g of p[2].split('~~')) if(g.trim()) set.add(stripGuid(fname(g)));
+> }
+> }
+> return own;
+> }
+88a112,113
+> // per-SKU own-file precision map (checked BEFORE the coarse token-bucket fallback below)
+> const ownFiles=ownStagingFiles(VENDORS);
+106a132,135
+> if(c==='skuless'){ // highest-precision check: is this literally the SKU's own staging file?
+> const own=ownFiles[psku];
+> if(own && own.has(stripGuid(f))) c='own';
+> }
diff --git a/data/claude-run-11256/evidence/canary.mjs.post-fix b/data/claude-run-11256/evidence/canary.mjs.post-fix
new file mode 100644
index 00000000..ac1f59c9
--- /dev/null
+++ b/data/claude-run-11256/evidence/canary.mjs.post-fix
@@ -0,0 +1,169 @@
+#!/usr/bin/env node
+// dw-image-identity-canary — flags GALLERY images whose filename-encoded SKU
+// does NOT match the product's own mfr SKU (cross-pattern / wrong-colorway
+// contamination). Vendor-generalizable; Sanderson-scoped by default.
+// READ-ONLY: only GETs Shopify Admin + reads local dw_unified mirror. Writes
+// only its own data/latest.json + data/baseline.json. Never mutates products.
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { execSync } from 'node:child_process';
+
+const DIR = path.dirname(fileURLToPath(import.meta.url));
+const DATA = path.join(DIR, 'data');
+const VER = '2024-10';
+const DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
+const VENDORS = (process.env.IIC_VENDORS || 'Sanderson').split(',').map(s=>s.trim()).filter(Boolean);
+// Per-vendor staging catalog wiring: enriches the asset-ownership (home) map with
+// filename->SKU encodings that exist in staging but appear SKU-less on the live product.
+// Vendor-generalizable: add a row per vendor as lines are onboarded.
+const STAGING = {
+ Sanderson: { table:'sanderson_catalog', sku:'mfr_sku', main:'image_url', gallery:'gallery_images' },
+};
+const ALERT = process.argv.includes('--alert');
+
+function token(fn){ return fn.split('?')[0].split('/').pop().split(/[_.]/)[0]; }
+function fname(src){ return src.split('?')[0].split('/').pop(); }
+const SKU_RE=/([A-Z]{3}\d{4})[_-](\d{2})/;
+function dsku(fn){ const m=fn.match(SKU_RE); return m?`${m[1]}-${m[2]}`:null; }
+// Shopify appends a GUID suffix on re-upload of the same asset (e.g. "..._2df9_6aed8978-...-c7bc33a3d68d.jpg");
+// stripping it lets us compare the underlying DAM asset identity, not the re-upload artifact.
+const GUID_RE=/_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(\.[a-zA-Z]+)$/;
+function stripGuid(fn){ return fn.replace(GUID_RE,'$1'); }
+
+function getToken(){
+ const env=fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8');
+ const m=env.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m);
+ return m[1].trim().replace(/^["']|["']$/g,'');
+}
+async function api(url,tok){
+ const r=await fetch(url,{headers:{'X-Shopify-Access-Token':tok,'Content-Type':'application/json'}});
+ if(!r.ok) throw new Error('HTTP '+r.status);
+ return {json:await r.json(), link:r.headers.get('link')||''};
+}
+function skuByIdFromMirror(vendors){
+ // mfr sku from local dw_unified mirror metafields, keyed by numeric shopify id
+ const list=vendors.map(v=>`'${v.replace(/'/g,"''")}'`).join(',');
+ const sql=`SELECT split_part(shopify_id,'/',5)||'|'||coalesce(metafields->'dwc'->'manufacturer_sku'->>'value','') FROM shopify_products WHERE vendor IN (${list});`;
+ const out=execSync(`/opt/homebrew/bin/psql -h /tmp dw_unified -t -A -c "${sql}"`,{encoding:'utf8'});
+ const map={};
+ for(const line of out.split('\n')){ const [id,sku]=line.split('|'); if(id) map[id.trim()]=(sku||'').trim(); }
+ return map;
+}
+
+function ownStagingFiles(vendors){
+ // Per-SKU precision check (fixes a confirmed false-positive class, TK-11256 2026-09-05:
+ // review12_verdicts.jsonl vision-adjudicated 7 "KEEP" cases where the flagged gallery
+ // image WAS the SKU's own staging main/gallery asset, but the coarse token() bucket
+ // let a DIFFERENT colorway's similarly-prefixed asset claim it in the global home map).
+ // Returns {mfr_sku: Set(stripGuid(filename))} — own-file identity, no cross-SKU bucketing.
+ const own={};
+ for(const v of vendors){ const cfg=STAGING[v]; if(!cfg) continue;
+ let rows='';
+ try{ rows=execSync(`/opt/homebrew/bin/psql -h /tmp dw_unified -t -A -F'|' -c "SELECT ${cfg.sku}, coalesce(${cfg.main},''), array_to_string(${cfg.gallery},'~~') FROM ${cfg.table};"`,{encoding:'utf8'}); }catch(e){ continue; }
+ for(const line of rows.split('\n')){ const p=line.split('|'); if(p.length<3) continue;
+ const sku=p[0].trim(); if(!sku) continue;
+ const set=own[sku]=own[sku]||new Set();
+ if(p[1]) set.add(stripGuid(fname(p[1])));
+ for(const g of p[2].split('~~')) if(g.trim()) set.add(stripGuid(fname(g)));
+ }
+ }
+ return own;
+}
+function stagingHome(vendors){
+ // returns {token: Set(sku)} from each vendor's staging catalog (SKU-encoded filenames)
+ const home={};
+ for(const v of vendors){ const cfg=STAGING[v]; if(!cfg) continue;
+ let rows='';
+ try{ rows=execSync(`/opt/homebrew/bin/psql -h /tmp dw_unified -t -A -F'|' -c "SELECT ${cfg.sku}, coalesce(${cfg.main},''), array_to_string(${cfg.gallery},'~~') FROM ${cfg.table};"`,{encoding:'utf8'}); }catch(e){ continue; }
+ for(const line of rows.split('\n')){ const p=line.split('|'); if(p.length<3) continue;
+ const files=[]; if(p[1]) files.push(fname(p[1])); for(const g of p[2].split('~~')) if(g.trim()) files.push(fname(g));
+ for(const fn of files){ const d=dsku(fn); if(d)(home[token(fn)]=home[token(fn)]||new Set()).add(d); }
+ }
+ }
+ return home;
+}
+function classify(fn, psku){
+ const pbase=psku.split('-')[0];
+ const d=dsku(fn);
+ if(d){ if(d===psku) return 'own'; return d.split('-')[0]!==pbase?'foreign_pattern':'foreign_colorway'; }
+ return 'skuless'; // undetermined by filename alone — canary does not flag (avoids FP)
+}
+
+async function run(){
+ let verdict='PASS', status='PASS', note='', err=null;
+ const perVendor={}; let totalForeignImgs=0, totalForeignProds=0, totalActive=0, totalGallery=0;
+ try{
+ const tok=getToken();
+ const skuMap=skuByIdFromMirror(VENDORS);
+ // global home map across all in-scope vendors
+ const home={}; const mainHome={};
+ const prodCache={};
+ for(const vendor of VENDORS){
+ let url=`https://${DOMAIN}/admin/api/${VER}/products.json?vendor=${encodeURIComponent(vendor)}&status=active&limit=250&fields=id,handle,title,images`;
+ const prods=[];
+ while(url){ const {json,link}=await api(url,tok); prods.push(...json.products); const m=link.split(',').find(p=>p.includes('rel="next"')); url=m?m.slice(m.indexOf('<')+1,m.indexOf('>')):''; if(url) await new Promise(r=>setTimeout(r,600)); }
+ prodCache[vendor]=prods;
+ for(const p of prods) for(const im of (p.images||[])){ const f=fname(im.src); const d=dsku(f); if(d)(home[token(f)]=home[token(f)]||new Set()).add(d); }
+ }
+ // enrich home map with staging-encoded ownership (recovers SKU-less-on-live foreigns)
+ const sh=stagingHome(VENDORS);
+ for(const t in sh){ (home[t]=home[t]||new Set()); for(const s2 of sh[t]) home[t].add(s2); }
+ // per-SKU own-file precision map (checked BEFORE the coarse token-bucket fallback below)
+ const ownFiles=ownStagingFiles(VENDORS);
+ // live-main-home: an asset used as some product's MAIN(pos1) image is 'owned' by that product
+ for(const v of VENDORS) for(const p of prodCache[v]){ const psk=skuMap[String(p.id)]; if(!psk) continue;
+ const im0=(p.images||[]).slice().sort((a,b)=>a.position-b.position)[0]; if(!im0) continue;
+ (mainHome[token(fname(im0.src))]=mainHome[token(fname(im0.src))]||new Set()).add(psk); }
+ for(const vendor of VENDORS){
+ const prods=prodCache[vendor];
+ let fImgs=0,fProds=0,gal=0;
+ const examples=[];
+ for(const p of prods){
+ totalActive++;
+ const psku=skuMap[String(p.id)]||'';
+ if(!psku) continue;
+ const pbase=psku.split('-')[0];
+ const imgs=(p.images||[]).slice().sort((a,b)=>a.position-b.position);
+ let prodFlagged=false;
+ for(const im of imgs.slice(1)){ // gallery = position>1
+ gal++; totalGallery++;
+ const f=fname(im.src); let c=classify(f,psku);
+ if(c==='skuless'){ // highest-precision check: is this literally the SKU's own staging file?
+ const own=ownFiles[psku];
+ if(own && own.has(stripGuid(f))) c='own';
+ }
+ if(c==='skuless'){ // resolve via home map (SKU-encoded/staging ownership)
+ const hosts=home[token(f)];
+ if(hosts && !hosts.has(psku)){ c=[...hosts].some(h=>h.split('-')[0]===pbase)?'foreign_colorway':'foreign_pattern'; }
+ }
+ if(c==='skuless'){ // resolve via live-main ownership (asset is another product's main)
+ const mh=mainHome[token(f)];
+ if(mh && !mh.has(psku)){ c=[...mh].some(h=>h.split('-')[0]===pbase)?'foreign_colorway':'foreign_pattern'; }
+ }
+ if(c==='foreign_pattern'||c==='foreign_colorway'){ fImgs++; prodFlagged=true;
+ if(examples.length<8) examples.push({handle:p.handle,mfr_sku:psku,img:f,cls:c}); }
+ }
+ if(prodFlagged) fProds++;
+ }
+ perVendor[vendor]={active:prods.length,gallery_imgs:gal,foreign_imgs:fImgs,foreign_products:fProds,examples};
+ totalForeignImgs+=fImgs; totalForeignProds+=fProds;
+ }
+ }catch(e){ err=String(e); verdict='UNKNOWN'; status='WARN'; note='read failure: '+err; }
+
+ // baseline-aware: alert only on worsening
+ const blPath=path.join(DATA,'baseline.json');
+ let baseline=null; if(fs.existsSync(blPath)) baseline=JSON.parse(fs.readFileSync(blPath,'utf8'));
+ if(!err){
+ if(!baseline){ baseline={foreign_products:totalForeignProds,foreign_imgs:totalForeignImgs,ts:new Date().toISOString(),note:'first-run baseline'}; fs.writeFileSync(blPath,JSON.stringify(baseline,null,1)); verdict='PASS'; status='PASS'; note=`baseline set: ${totalForeignProds} products / ${totalForeignImgs} imgs contaminated`; }
+ else if(totalForeignProds>baseline.foreign_products){ verdict='FAIL'; status='FAIL'; note=`contamination GREW: ${totalForeignProds} products vs baseline ${baseline.foreign_products} — a re-import likely re-introduced foreign gallery images`; }
+ else { verdict='PASS'; status='PASS'; note=`no worsening (${totalForeignProds} products <= baseline ${baseline.foreign_products})`; }
+ }
+ const out={ skill:'dw-image-identity-canary', verdict, status, ts:new Date().toISOString(),
+ vendors:VENDORS, totals:{active:totalActive,gallery_imgs:totalGallery,foreign_imgs:totalForeignImgs,foreign_products:totalForeignProds},
+ baseline, perVendor, note };
+ fs.writeFileSync(path.join(DATA,'latest.json'),JSON.stringify(out,null,1));
+ console.log(JSON.stringify({verdict,status,totals:out.totals,note},null,1));
+ if(ALERT && (status==='FAIL')) console.log('[ALERT] would post CNCP card + George email:',note);
+}
+run();
diff --git a/data/claude-run-11256/evidence/canary.mjs.pre-fix-backup b/data/claude-run-11256/evidence/canary.mjs.pre-fix-backup
new file mode 100644
index 00000000..ad97824f
--- /dev/null
+++ b/data/claude-run-11256/evidence/canary.mjs.pre-fix-backup
@@ -0,0 +1,140 @@
+#!/usr/bin/env node
+// dw-image-identity-canary — flags GALLERY images whose filename-encoded SKU
+// does NOT match the product's own mfr SKU (cross-pattern / wrong-colorway
+// contamination). Vendor-generalizable; Sanderson-scoped by default.
+// READ-ONLY: only GETs Shopify Admin + reads local dw_unified mirror. Writes
+// only its own data/latest.json + data/baseline.json. Never mutates products.
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { execSync } from 'node:child_process';
+
+const DIR = path.dirname(fileURLToPath(import.meta.url));
+const DATA = path.join(DIR, 'data');
+const VER = '2024-10';
+const DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
+const VENDORS = (process.env.IIC_VENDORS || 'Sanderson').split(',').map(s=>s.trim()).filter(Boolean);
+// Per-vendor staging catalog wiring: enriches the asset-ownership (home) map with
+// filename->SKU encodings that exist in staging but appear SKU-less on the live product.
+// Vendor-generalizable: add a row per vendor as lines are onboarded.
+const STAGING = {
+ Sanderson: { table:'sanderson_catalog', sku:'mfr_sku', main:'image_url', gallery:'gallery_images' },
+};
+const ALERT = process.argv.includes('--alert');
+
+function token(fn){ return fn.split('?')[0].split('/').pop().split(/[_.]/)[0]; }
+function fname(src){ return src.split('?')[0].split('/').pop(); }
+const SKU_RE=/([A-Z]{3}\d{4})[_-](\d{2})/;
+function dsku(fn){ const m=fn.match(SKU_RE); return m?`${m[1]}-${m[2]}`:null; }
+
+function getToken(){
+ const env=fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8');
+ const m=env.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m);
+ return m[1].trim().replace(/^["']|["']$/g,'');
+}
+async function api(url,tok){
+ const r=await fetch(url,{headers:{'X-Shopify-Access-Token':tok,'Content-Type':'application/json'}});
+ if(!r.ok) throw new Error('HTTP '+r.status);
+ return {json:await r.json(), link:r.headers.get('link')||''};
+}
+function skuByIdFromMirror(vendors){
+ // mfr sku from local dw_unified mirror metafields, keyed by numeric shopify id
+ const list=vendors.map(v=>`'${v.replace(/'/g,"''")}'`).join(',');
+ const sql=`SELECT split_part(shopify_id,'/',5)||'|'||coalesce(metafields->'dwc'->'manufacturer_sku'->>'value','') FROM shopify_products WHERE vendor IN (${list});`;
+ const out=execSync(`/opt/homebrew/bin/psql -h /tmp dw_unified -t -A -c "${sql}"`,{encoding:'utf8'});
+ const map={};
+ for(const line of out.split('\n')){ const [id,sku]=line.split('|'); if(id) map[id.trim()]=(sku||'').trim(); }
+ return map;
+}
+
+function stagingHome(vendors){
+ // returns {token: Set(sku)} from each vendor's staging catalog (SKU-encoded filenames)
+ const home={};
+ for(const v of vendors){ const cfg=STAGING[v]; if(!cfg) continue;
+ let rows='';
+ try{ rows=execSync(`/opt/homebrew/bin/psql -h /tmp dw_unified -t -A -F'|' -c "SELECT ${cfg.sku}, coalesce(${cfg.main},''), array_to_string(${cfg.gallery},'~~') FROM ${cfg.table};"`,{encoding:'utf8'}); }catch(e){ continue; }
+ for(const line of rows.split('\n')){ const p=line.split('|'); if(p.length<3) continue;
+ const files=[]; if(p[1]) files.push(fname(p[1])); for(const g of p[2].split('~~')) if(g.trim()) files.push(fname(g));
+ for(const fn of files){ const d=dsku(fn); if(d)(home[token(fn)]=home[token(fn)]||new Set()).add(d); }
+ }
+ }
+ return home;
+}
+function classify(fn, psku){
+ const pbase=psku.split('-')[0];
+ const d=dsku(fn);
+ if(d){ if(d===psku) return 'own'; return d.split('-')[0]!==pbase?'foreign_pattern':'foreign_colorway'; }
+ return 'skuless'; // undetermined by filename alone — canary does not flag (avoids FP)
+}
+
+async function run(){
+ let verdict='PASS', status='PASS', note='', err=null;
+ const perVendor={}; let totalForeignImgs=0, totalForeignProds=0, totalActive=0, totalGallery=0;
+ try{
+ const tok=getToken();
+ const skuMap=skuByIdFromMirror(VENDORS);
+ // global home map across all in-scope vendors
+ const home={}; const mainHome={};
+ const prodCache={};
+ for(const vendor of VENDORS){
+ let url=`https://${DOMAIN}/admin/api/${VER}/products.json?vendor=${encodeURIComponent(vendor)}&status=active&limit=250&fields=id,handle,title,images`;
+ const prods=[];
+ while(url){ const {json,link}=await api(url,tok); prods.push(...json.products); const m=link.split(',').find(p=>p.includes('rel="next"')); url=m?m.slice(m.indexOf('<')+1,m.indexOf('>')):''; if(url) await new Promise(r=>setTimeout(r,600)); }
+ prodCache[vendor]=prods;
+ for(const p of prods) for(const im of (p.images||[])){ const f=fname(im.src); const d=dsku(f); if(d)(home[token(f)]=home[token(f)]||new Set()).add(d); }
+ }
+ // enrich home map with staging-encoded ownership (recovers SKU-less-on-live foreigns)
+ const sh=stagingHome(VENDORS);
+ for(const t in sh){ (home[t]=home[t]||new Set()); for(const s2 of sh[t]) home[t].add(s2); }
+ // live-main-home: an asset used as some product's MAIN(pos1) image is 'owned' by that product
+ for(const v of VENDORS) for(const p of prodCache[v]){ const psk=skuMap[String(p.id)]; if(!psk) continue;
+ const im0=(p.images||[]).slice().sort((a,b)=>a.position-b.position)[0]; if(!im0) continue;
+ (mainHome[token(fname(im0.src))]=mainHome[token(fname(im0.src))]||new Set()).add(psk); }
+ for(const vendor of VENDORS){
+ const prods=prodCache[vendor];
+ let fImgs=0,fProds=0,gal=0;
+ const examples=[];
+ for(const p of prods){
+ totalActive++;
+ const psku=skuMap[String(p.id)]||'';
+ if(!psku) continue;
+ const pbase=psku.split('-')[0];
+ const imgs=(p.images||[]).slice().sort((a,b)=>a.position-b.position);
+ let prodFlagged=false;
+ for(const im of imgs.slice(1)){ // gallery = position>1
+ gal++; totalGallery++;
+ const f=fname(im.src); let c=classify(f,psku);
+ if(c==='skuless'){ // resolve via home map (SKU-encoded/staging ownership)
+ const hosts=home[token(f)];
+ if(hosts && !hosts.has(psku)){ c=[...hosts].some(h=>h.split('-')[0]===pbase)?'foreign_colorway':'foreign_pattern'; }
+ }
+ if(c==='skuless'){ // resolve via live-main ownership (asset is another product's main)
+ const mh=mainHome[token(f)];
+ if(mh && !mh.has(psku)){ c=[...mh].some(h=>h.split('-')[0]===pbase)?'foreign_colorway':'foreign_pattern'; }
+ }
+ if(c==='foreign_pattern'||c==='foreign_colorway'){ fImgs++; prodFlagged=true;
+ if(examples.length<8) examples.push({handle:p.handle,mfr_sku:psku,img:f,cls:c}); }
+ }
+ if(prodFlagged) fProds++;
+ }
+ perVendor[vendor]={active:prods.length,gallery_imgs:gal,foreign_imgs:fImgs,foreign_products:fProds,examples};
+ totalForeignImgs+=fImgs; totalForeignProds+=fProds;
+ }
+ }catch(e){ err=String(e); verdict='UNKNOWN'; status='WARN'; note='read failure: '+err; }
+
+ // baseline-aware: alert only on worsening
+ const blPath=path.join(DATA,'baseline.json');
+ let baseline=null; if(fs.existsSync(blPath)) baseline=JSON.parse(fs.readFileSync(blPath,'utf8'));
+ if(!err){
+ if(!baseline){ baseline={foreign_products:totalForeignProds,foreign_imgs:totalForeignImgs,ts:new Date().toISOString(),note:'first-run baseline'}; fs.writeFileSync(blPath,JSON.stringify(baseline,null,1)); verdict='PASS'; status='PASS'; note=`baseline set: ${totalForeignProds} products / ${totalForeignImgs} imgs contaminated`; }
+ else if(totalForeignProds>baseline.foreign_products){ verdict='FAIL'; status='FAIL'; note=`contamination GREW: ${totalForeignProds} products vs baseline ${baseline.foreign_products} — a re-import likely re-introduced foreign gallery images`; }
+ else { verdict='PASS'; status='PASS'; note=`no worsening (${totalForeignProds} products <= baseline ${baseline.foreign_products})`; }
+ }
+ const out={ skill:'dw-image-identity-canary', verdict, status, ts:new Date().toISOString(),
+ vendors:VENDORS, totals:{active:totalActive,gallery_imgs:totalGallery,foreign_imgs:totalForeignImgs,foreign_products:totalForeignProds},
+ baseline, perVendor, note };
+ fs.writeFileSync(path.join(DATA,'latest.json'),JSON.stringify(out,null,1));
+ console.log(JSON.stringify({verdict,status,totals:out.totals,note},null,1));
+ if(ALERT && (status==='FAIL')) console.log('[ALERT] would post CNCP card + George email:',note);
+}
+run();
diff --git a/data/claude-run-11256/evidence/tk11256-image-identity-post-fix-full-manifest.json b/data/claude-run-11256/evidence/tk11256-image-identity-post-fix-full-manifest.json
new file mode 100644
index 00000000..e20764c5
--- /dev/null
+++ b/data/claude-run-11256/evidence/tk11256-image-identity-post-fix-full-manifest.json
@@ -0,0 +1,655 @@
+{
+ "skill": "dw-image-identity-canary",
+ "verdict": "PASS",
+ "status": "PASS",
+ "ts": "2026-09-05T16:55:36.850Z",
+ "vendors": [
+ "Sanderson"
+ ],
+ "totals": {
+ "active": 597,
+ "gallery_imgs": 236,
+ "foreign_imgs": 89,
+ "foreign_products": 39
+ },
+ "baseline": {
+ "foreign_products": 39,
+ "foreign_imgs": 89,
+ "ts": "2026-09-05T16:55:36.850Z",
+ "note": "first-run baseline"
+ },
+ "perVendor": {
+ "Sanderson": {
+ "active": 597,
+ "gallery_imgs": 236,
+ "foreign_imgs": 89,
+ "foreign_products": 39,
+ "examples": [
+ {
+ "handle": "maelee-linen-sanderson",
+ "mfr_sku": "SAW0079-02",
+ "img": "DHPO216374_6d50.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7939958439987
+ },
+ {
+ "handle": "rye-wedgwood-sanderson",
+ "mfr_sku": "SAW0218-01",
+ "img": "DSAB217421_b068.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7940188438579
+ },
+ {
+ "handle": "sherwood-stripe-cashew-sanderson",
+ "mfr_sku": "SAW0219-03",
+ "img": "DSAB217437_811a_8c9eb94e-d7df-4831-993e-ef477d0f01ea.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944130396211
+ },
+ {
+ "handle": "sherwood-stripe-cashew-sanderson",
+ "mfr_sku": "SAW0219-03",
+ "img": "DSAB217428_d1bb_f2c4fab9-8a24-47e0-9b6b-0ce4850a4017.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944130396211
+ },
+ {
+ "handle": "sherwood-stripe-cashew-sanderson",
+ "mfr_sku": "SAW0219-03",
+ "img": "DSAB217438_d99c_89a2eb03-e78d-457c-b4f2-429ac7ba01b2.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944130396211
+ },
+ {
+ "handle": "sherwood-stripe-sandstone-sanderson",
+ "mfr_sku": "SAW0219-02",
+ "img": "DSAB217427_b43f.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944130592819
+ },
+ {
+ "handle": "sherwood-stripe-willow-sanderson",
+ "mfr_sku": "SAW0219-01",
+ "img": "DSAB217419_dea1.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944130986035
+ },
+ {
+ "handle": "sherwood-stripe-willow-sanderson",
+ "mfr_sku": "SAW0219-01",
+ "img": "DSAB217416_b20d.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944130986035
+ },
+ {
+ "handle": "sherwood-stripe-willow-sanderson",
+ "mfr_sku": "SAW0219-01",
+ "img": "DSAB217434_9fe9_01c3488b-18a1-4d9f-bf22-747f67e1036e.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944130986035
+ },
+ {
+ "handle": "sherwood-stripe-willow-sanderson",
+ "mfr_sku": "SAW0219-01",
+ "img": "DSAB217422_4849.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944130986035
+ },
+ {
+ "handle": "sherwood-stripe-willow-sanderson",
+ "mfr_sku": "SAW0219-01",
+ "img": "DSAB217420_d65a_d817f39b-c2c1-4fc1-8546-bf6ddb87d2bb.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944130986035
+ },
+ {
+ "handle": "shore-birds-driftwood-sanderson",
+ "mfr_sku": "SAW0116-02",
+ "img": "DCOA216581_8cbf_5958de52-abed-451f-ba4b-b28ce47c0ece.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944131280947
+ },
+ {
+ "handle": "silver-lime-gritstone-rose-sanderson",
+ "mfr_sku": "SAW0231-01",
+ "img": "DHIP217503_7b95_a6589190-4808-45dc-b371-7e32b7964733.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944131903539
+ },
+ {
+ "handle": "silver-lime-nymph-sanderson",
+ "mfr_sku": "SAW0231-03",
+ "img": "DHIP217484_60bb_ee3015c7-91b3-47e8-a29c-cb76c290e047.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944132067379
+ },
+ {
+ "handle": "silver-lime-nymph-sanderson",
+ "mfr_sku": "SAW0231-03",
+ "img": "DHIP217491_5566.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944132067379
+ },
+ {
+ "handle": "soho-plain-birch-white-sanderson",
+ "mfr_sku": "SAW0044-04",
+ "img": "DCPW216784_7d23_b129a914-5ce4-4006-9ae9-84a872a9d4ed.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944134164531
+ },
+ {
+ "handle": "soho-plain-eau-de-nil-sanderson",
+ "mfr_sku": "SAW0044-01",
+ "img": "DSOH235245_e46c.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944134328371
+ },
+ {
+ "handle": "soho-plain-eau-de-nil-sanderson",
+ "mfr_sku": "SAW0044-01",
+ "img": "DSOH235246_a4e6.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944134328371
+ },
+ {
+ "handle": "sonning-stripe-silver-grey-sanderson",
+ "mfr_sku": "SAW0153-03",
+ "img": "DLMW216897_6440_7b3bebf1-ae5a-468b-963e-b881882b7d07.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944135147571
+ },
+ {
+ "handle": "sonning-stripe-silver-grey-sanderson",
+ "mfr_sku": "SAW0153-03",
+ "img": "DLMW216898_04e8_8fe5811d-f480-44e8-a1e2-a25bf2fd1a76.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944135147571
+ },
+ {
+ "handle": "squirrel-amp-dove-dove-teal-red-sanderson",
+ "mfr_sku": "SAW0005-02",
+ "img": "DVIN224338_00e0.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944136032307
+ },
+ {
+ "handle": "squirrel-amp-dove-dove-teal-red-sanderson",
+ "mfr_sku": "SAW0005-02",
+ "img": "DVIN214598_01d7_40886e1b-efb4-4d50-81d6-f60747e15aa0.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944136032307
+ },
+ {
+ "handle": "stapleton-park-ink-broncho-sanderson",
+ "mfr_sku": "SAW0166-03",
+ "img": "DOSW217034_f849_5afde7bf-004f-4fee-acfc-70f8fbd7f708.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944136458291
+ },
+ {
+ "handle": "stapleton-park-ink-broncho-sanderson",
+ "mfr_sku": "SAW0166-03",
+ "img": "DOSW217033_ba6e_5bbb6ef1-2e97-4542-b04c-a6b432da5861.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944136458291
+ },
+ {
+ "handle": "stapleton-park-sage-honey-sanderson",
+ "mfr_sku": "SAW0166-02",
+ "img": "DOSW217029_e170_5f370ac1-126a-4968-9169-5304e26ecdbf.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944136589363
+ },
+ {
+ "handle": "summer-harvest-cornflower-wheat-sanderson",
+ "mfr_sku": "SAW0103-01",
+ "img": "DEBB216516_d0cf.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944136982579
+ },
+ {
+ "handle": "summer-harvest-silver-chalk-sanderson",
+ "mfr_sku": "SAW0103-03",
+ "img": "DEBB216503_49cb_daa88567-98c1-4c9f-8a8d-4041cee8e4f4.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944137277491
+ },
+ {
+ "handle": "summer-harvest-silver-chalk-sanderson",
+ "mfr_sku": "SAW0103-03",
+ "img": "DEBB216517_ee4c_0e850fe5-8c59-445c-8976-da0b9ede30d0.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944137277491
+ },
+ {
+ "handle": "sycamore-trail-copper-sanderson",
+ "mfr_sku": "SAW0105-01",
+ "img": "DEBB216503_49cb_ed6844de-0b2f-4b1b-bb1e-20eca1611788.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944138457139
+ },
+ {
+ "handle": "sycamore-trail-copper-sanderson",
+ "mfr_sku": "SAW0105-01",
+ "img": "DEBB216517_ee4c_9473e47e-bd74-4d0f-9d5b-f52c0947742e.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7944138457139
+ },
+ {
+ "handle": "sycamore-trail-gold-sanderson",
+ "mfr_sku": "SAW0105-03",
+ "img": "DEBB216503_49cb_da6edf92-8ede-4784-be6a-209ca1973c82.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945552756787
+ },
+ {
+ "handle": "sycamore-trail-gold-sanderson",
+ "mfr_sku": "SAW0105-03",
+ "img": "DEBB216517_ee4c_21c500ec-3472-43b3-9372-897ce5d93bfb.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945552756787
+ },
+ {
+ "handle": "sycamore-trail-silver-sanderson",
+ "mfr_sku": "SAW0105-02",
+ "img": "DEBB216506_a5a6_6c70f914-1fe9-4915-ba26-1d2c5e3f3c7e.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945552789555
+ },
+ {
+ "handle": "sycamore-trail-silver-sanderson",
+ "mfr_sku": "SAW0105-02",
+ "img": "DEBB216494_9663.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945552789555
+ },
+ {
+ "handle": "sycamore-trail-silver-sanderson",
+ "mfr_sku": "SAW0105-02",
+ "img": "DEBB216517_ee4c_38ad33d9-622c-4613-9a7d-fc14fab03afe.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945552789555
+ },
+ {
+ "handle": "tally-ho-evergreen-crimson-sanderson-1",
+ "mfr_sku": "SAW0043-02",
+ "img": "DVIN224338_00e0_db256482-84c9-4874-9534-5c50e846d45b.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945552822323
+ },
+ {
+ "handle": "tally-ho-evergreen-crimson-sanderson-1",
+ "mfr_sku": "SAW0043-02",
+ "img": "DVIN224339_f717_cacbbc0c-b6ed-4ece-9947-a5d4772322c8.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945552822323
+ },
+ {
+ "handle": "tansy-bloom-atlantis-sanderson",
+ "mfr_sku": "SAW0212-01",
+ "img": "DGDW217373_eb54.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945552986163
+ },
+ {
+ "handle": "tapestry-trees-berry-pink-clay-sanderson",
+ "mfr_sku": "SAW0220-02",
+ "img": "DSAB217438_d99c_fcf97c73-b6c4-4b4e-869b-bf18b5f05f6c.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553051699
+ },
+ {
+ "handle": "tapestry-trees-berry-pink-clay-sanderson",
+ "mfr_sku": "SAW0220-02",
+ "img": "DSAB217441_980b_47b810f3-e19a-4718-88ca-2c50758cbf63.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553051699
+ },
+ {
+ "handle": "tapestry-trees-forest-willow-sanderson",
+ "mfr_sku": "SAW0220-03",
+ "img": "DSAB217419_dea1_769bd67d-f3a5-44e4-bb3f-2e1a33a26e3f.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553117235
+ },
+ {
+ "handle": "tapestry-trees-forest-willow-sanderson",
+ "mfr_sku": "SAW0220-03",
+ "img": "DSAB217423_4ee0_5ba78983-20b9-4c28-a744-72f5b3040f11.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553117235
+ },
+ {
+ "handle": "tapestry-trees-forest-willow-sanderson",
+ "mfr_sku": "SAW0220-03",
+ "img": "DSAB217434_9fe9_685e566b-f5b8-4ffd-8024-8c876eaec095.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553117235
+ },
+ {
+ "handle": "tapestry-trees-pottery-blue-sanderson",
+ "mfr_sku": "SAW0220-04",
+ "img": "DSAB217440_346d_68474874-b231-4db6-8d88-51e3b40e4688.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553182771
+ },
+ {
+ "handle": "tapestry-trees-pottery-blue-sanderson",
+ "mfr_sku": "SAW0220-04",
+ "img": "DSAB217426_2feb_ff0e8dca-888e-4407-b7e6-6277f53f25c2.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553182771
+ },
+ {
+ "handle": "tapestry-trees-pottery-blue-sanderson",
+ "mfr_sku": "SAW0220-04",
+ "img": "DSAB217427_b43f_cba6ea45-0c9f-482d-9285-97136121215d.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553182771
+ },
+ {
+ "handle": "tapestry-trees-pottery-blue-sanderson",
+ "mfr_sku": "SAW0220-04",
+ "img": "DSAB217441_980b_eaa9c131-fb9e-4c11-97c5-1b15f1193c67.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553182771
+ },
+ {
+ "handle": "tapestry-trees-pottery-blue-sanderson",
+ "mfr_sku": "SAW0220-04",
+ "img": "DSAB217439_800a_463df4ab-f477-4225-9b38-1da0a5d22f9f.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553182771
+ },
+ {
+ "handle": "tapestry-trees-raw-chocolate-slip-sanderson",
+ "mfr_sku": "SAW0220-01",
+ "img": "DSAB217437_811a_3f36afdd-d1a0-456e-b045-7860314d4818.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553313843
+ },
+ {
+ "handle": "tapestry-trees-raw-chocolate-slip-sanderson",
+ "mfr_sku": "SAW0220-01",
+ "img": "DSAB217428_d1bb_de484cf1-5890-4fb1-9a28-58d72a868400.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553313843
+ },
+ {
+ "handle": "thackeray-fig-sanderson",
+ "mfr_sku": "SAW0093-01",
+ "img": "DDAM216419_eb9a_85fb41cd-4d50-4385-9b71-9a00f429b0cd.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553510451
+ },
+ {
+ "handle": "the-stumpery-lichen-sanderson",
+ "mfr_sku": "SAW0233-01",
+ "img": "DHIP217494_ee44_75e0acf4-8d48-4ae3-bece-22bc5ab3ff2f.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553870899
+ },
+ {
+ "handle": "the-stumpery-lichen-sanderson",
+ "mfr_sku": "SAW0233-01",
+ "img": "DHIP217519_97ef_520b10e8-49c4-4798-afd0-1be5daaaed94.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553870899
+ },
+ {
+ "handle": "the-stumpery-lichen-sanderson",
+ "mfr_sku": "SAW0233-01",
+ "img": "DHIP217493_25dd.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553870899
+ },
+ {
+ "handle": "thyme-walk-damson-quince-sanderson",
+ "mfr_sku": "SAW0234-02",
+ "img": "DHIP217501_87cc_d2fd88d7-e8b8-495e-a979-d890b288b311.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553969203
+ },
+ {
+ "handle": "thyme-walk-damson-quince-sanderson",
+ "mfr_sku": "SAW0234-02",
+ "img": "DHIP217487_8992.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553969203
+ },
+ {
+ "handle": "thyme-walk-damson-quince-sanderson",
+ "mfr_sku": "SAW0234-02",
+ "img": "DHIP217492_11be_05fb13fa-a711-4dfc-8f50-9421a4087bfc.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945553969203
+ },
+ {
+ "handle": "tomato-leaf-green-sanderson",
+ "mfr_sku": "SAW0221-04",
+ "img": "DSAB217442_732e_c61ee906-3b37-47c6-bd42-dac9f7b0f673.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554001971
+ },
+ {
+ "handle": "tomato-leaf-green-sanderson",
+ "mfr_sku": "SAW0221-04",
+ "img": "DSAB217418_e214_2446da6c-b4b5-4c2c-8784-b4fdbf6d51a7.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554001971
+ },
+ {
+ "handle": "tomato-leaf-pink-clay-sanderson",
+ "mfr_sku": "SAW0221-02",
+ "img": "DSAB217438_d99c_1f708764-1ca0-465e-86fc-0eaf616f2388.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554100275
+ },
+ {
+ "handle": "tomato-leaf-pink-clay-sanderson",
+ "mfr_sku": "SAW0221-02",
+ "img": "DSAB217440_346d_a6bba6e5-a68b-42d5-aac1-85718653bc58.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554100275
+ },
+ {
+ "handle": "tomato-leaf-wedgwood-sanderson",
+ "mfr_sku": "SAW0221-03",
+ "img": "DSAB217432_a4df.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554133043
+ },
+ {
+ "handle": "tomato-leaf-wedgwood-sanderson",
+ "mfr_sku": "SAW0221-03",
+ "img": "DSAB217439_800a_64bd999b-4912-471e-93a0-524e7fc1079e.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554133043
+ },
+ {
+ "handle": "tomato-leaf-wedgwood-sanderson",
+ "mfr_sku": "SAW0221-03",
+ "img": "DSAB217434_9fe9_ede752c9-3b17-4a74-ba81-ca72006aa2ca.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554133043
+ },
+ {
+ "handle": "tomato-leaf-wedgwood-sanderson",
+ "mfr_sku": "SAW0221-03",
+ "img": "DSAB217433_91e2_b9360d3a-3240-4e5f-a469-6d9dca95fe58.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554133043
+ },
+ {
+ "handle": "tomato-leaf-willow-sanderson",
+ "mfr_sku": "SAW0221-01",
+ "img": "DSAB217414_6020_55e14385-4128-44aa-a174-6f8814ea3925.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554165811
+ },
+ {
+ "handle": "tomato-leaf-willow-sanderson",
+ "mfr_sku": "SAW0221-01",
+ "img": "DSAB217424_97ec_2f25f409-5bb7-4503-8014-4a9e6bff0a02.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554165811
+ },
+ {
+ "handle": "tomato-leaf-willow-sanderson",
+ "mfr_sku": "SAW0221-01",
+ "img": "DSAB217432_a4df_230bf245-3979-4ae9-b69c-6aec8103884a.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554165811
+ },
+ {
+ "handle": "topiary-view-muntjac-sanderson",
+ "mfr_sku": "SAW0235-03",
+ "img": "DHIP217478_f463_87673614-12c8-44b4-a7f2-03f412581e71.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554198579
+ },
+ {
+ "handle": "topiary-view-muntjac-sanderson",
+ "mfr_sku": "SAW0235-03",
+ "img": "DHIP217505_16e4_8b07032e-df60-424d-b0e1-e21a65b175ab.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554198579
+ },
+ {
+ "handle": "topiary-view-muntjac-sanderson",
+ "mfr_sku": "SAW0235-03",
+ "img": "DHIP217480_a513_4b2c197e-f817-4301-ab07-401a6e4391ff.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554198579
+ },
+ {
+ "handle": "topiary-view-muntjac-sanderson",
+ "mfr_sku": "SAW0235-03",
+ "img": "DHIP217479_6619.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554198579
+ },
+ {
+ "handle": "topiary-view-thyme-sanderson",
+ "mfr_sku": "SAW0235-02",
+ "img": "DHIP217479_6619_aec0e859-2b1b-43c8-8444-a92b66841622.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554231347
+ },
+ {
+ "handle": "topiary-view-thyme-sanderson",
+ "mfr_sku": "SAW0235-02",
+ "img": "DHIP217502_74d9_491abb6c-bec6-42c4-b353-d26b54444864.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554231347
+ },
+ {
+ "handle": "topiary-view-thyme-sanderson",
+ "mfr_sku": "SAW0235-02",
+ "img": "DHIP217507_eaad.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554231347
+ },
+ {
+ "handle": "topiary-view-thyme-sanderson",
+ "mfr_sku": "SAW0235-02",
+ "img": "DHIP217505_16e4_59b37917-3f90-4c6d-9fb0-b747af8a7a96.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554231347
+ },
+ {
+ "handle": "topiary-view-wedgwood-sanderson",
+ "mfr_sku": "SAW0235-01",
+ "img": "DHIP217506_6f8c_1bd52a60-8294-4e15-973e-41dc8b59ba93.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554296883
+ },
+ {
+ "handle": "topiary-view-wedgwood-sanderson",
+ "mfr_sku": "SAW0235-01",
+ "img": "DHIP217486_50fb_95b7664d-cf41-47fe-8948-479702aa1fc2.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554296883
+ },
+ {
+ "handle": "topiary-view-wedgwood-sanderson",
+ "mfr_sku": "SAW0235-01",
+ "img": "DHIP217485_77d3.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554296883
+ },
+ {
+ "handle": "topiary-view-wedgwood-sanderson",
+ "mfr_sku": "SAW0235-01",
+ "img": "DHIP217484_60bb_3c62c7f6-10ef-4541-95ac-2515bec7a696.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554296883
+ },
+ {
+ "handle": "trelliage-raspberry-stone-sanderson",
+ "mfr_sku": "SAW0213-03",
+ "img": "DGDW217305_812a_4ef6544a-cf76-4f7c-9e8f-aecd999c9984.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554460723
+ },
+ {
+ "handle": "trelliage-raspberry-stone-sanderson",
+ "mfr_sku": "SAW0213-03",
+ "img": "DGDW217303_fff2.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554460723
+ },
+ {
+ "handle": "trelliage-raspberry-stone-sanderson",
+ "mfr_sku": "SAW0213-03",
+ "img": "DGDW217312_077e_5c466b30-181a-4de4-ac64-d651ef3e3572.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554460723
+ },
+ {
+ "handle": "trelliage-raspberry-stone-sanderson",
+ "mfr_sku": "SAW0213-03",
+ "img": "DGDW217307_ec1e_de4e6085-9934-40de-b4b0-2b6577adc19b.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554460723
+ },
+ {
+ "handle": "truffle-blue-clay-sanderson",
+ "mfr_sku": "SAW0187-03",
+ "img": "DABW217252_1a21_6070b0dd-7f9a-495f-bd6a-b6df6a075196.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554657331
+ },
+ {
+ "handle": "truffle-blue-clay-sanderson",
+ "mfr_sku": "SAW0187-03",
+ "img": "DABW217255_ca01_616c7147-2d40-463f-8c23-2eb34aa00476.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554657331
+ },
+ {
+ "handle": "truffle-blue-clay-sanderson",
+ "mfr_sku": "SAW0187-03",
+ "img": "DABW217254_a9e8_8c989c29-54b1-49bf-954a-df1f9c54bc2e.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554657331
+ },
+ {
+ "handle": "truffle-indigo-sanderson",
+ "mfr_sku": "SAW0187-01",
+ "img": "DABW217252_1a21_733c18ba-f110-4189-b383-ee9fc74f09a7.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945554853939
+ },
+ {
+ "handle": "tulipomania-ink-sanderson",
+ "mfr_sku": "SAW0135-02",
+ "img": "DGLW216654_b9d3.jpg",
+ "cls": "foreign_pattern",
+ "product_id": 7945555116083
+ }
+ ]
+ }
+ },
+ "note": "baseline set: 39 products / 89 imgs contaminated"
+}
\ No newline at end of file
← a75d7d2f Record ordered monitoring cycle and verified SDG staging evi
·
back to Ticket System
·
Record ordered ticket cycle and verified enrichment stall 4f706d03 →