← back to Dw Validator Debug TK11314
TK-10834: audit artifacts + canary image-hash assertion snapshot (skills dir is gitignored, this is the tracked copy)
0a272ebb376a76e5c284172475770fa3a18a90e3 · 2026-08-25 09:45:01 -0700 · steve
Files touched
A DW-Skills-Output/tk10834/archive_run.jsonA DW-Skills-Output/tk10834/canary-with-imghash-assertion.mjsA DW-Skills-Output/tk10834/imghash-baseline.jsonA DW-Skills-Output/tk10834/preverify.json
Diff
commit 0a272ebb376a76e5c284172475770fa3a18a90e3
Author: steve <steve@designerwallcoverings.com>
Date: Tue Aug 25 09:45:01 2026 -0700
TK-10834: audit artifacts + canary image-hash assertion snapshot (skills dir is gitignored, this is the tracked copy)
---
DW-Skills-Output/tk10834/archive_run.json | 379 ++++++++++
.../tk10834/canary-with-imghash-assertion.mjs | 207 ++++++
DW-Skills-Output/tk10834/imghash-baseline.json | 5 +
DW-Skills-Output/tk10834/preverify.json | 760 +++++++++++++++++++++
4 files changed, 1351 insertions(+)
diff --git a/DW-Skills-Output/tk10834/archive_run.json b/DW-Skills-Output/tk10834/archive_run.json
new file mode 100644
index 00000000..0585f90f
--- /dev/null
+++ b/DW-Skills-Output/tk10834/archive_run.json
@@ -0,0 +1,379 @@
+{
+ "ts": "2026-08-25T16:40:50.663Z",
+ "archived": 31,
+ "problems": 0,
+ "results": [
+ {
+ "n": 1,
+ "arch_pid": "7924022509619",
+ "arch_title": "Mavis 503 | Fabricut",
+ "keep_pid": "7924025032755",
+ "keep_title": "Mavis Ivory | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 2,
+ "arch_pid": "7924022706227",
+ "arch_title": "Sunset Wave 502 | Fabricut",
+ "keep_pid": "7924022542387",
+ "keep_title": "Sunset Wave Pink | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 3,
+ "arch_pid": "7924022837299",
+ "arch_title": "Gisella 504 | Fabricut",
+ "keep_pid": "7924022804531",
+ "keep_title": "Gisella Jade | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 4,
+ "arch_pid": "7924022902835",
+ "arch_title": "Menson 502 | Fabricut",
+ "keep_pid": "7924022870067",
+ "keep_title": "Menson Grey | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 5,
+ "arch_pid": "7924022968371",
+ "arch_title": "Veliora 501 | Fabricut",
+ "keep_pid": "7924022935603",
+ "keep_title": "Veliora Copper Gold | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 6,
+ "arch_pid": "7924023197747",
+ "arch_title": "Audra 504 | Fabricut",
+ "keep_pid": "7924023164979",
+ "keep_title": "Audra Navy | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 7,
+ "arch_pid": "7924023263283",
+ "arch_title": "Audra 503 | Fabricut",
+ "keep_pid": "7924025065523",
+ "keep_title": "Audra Green | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 8,
+ "arch_pid": "7924023427123",
+ "arch_title": "Audra 502 | Fabricut",
+ "keep_pid": "7924023296051",
+ "keep_title": "Audra Forest | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 9,
+ "arch_pid": "7924023558195",
+ "arch_title": "Raden 503 | Fabricut",
+ "keep_pid": "7924023459891",
+ "keep_title": "Raden Sky | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 10,
+ "arch_pid": "7924023656499",
+ "arch_title": "Mylo Plaid 503 | Fabricut",
+ "keep_pid": "7924023590963",
+ "keep_title": "Mylo Plaid Grey | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 11,
+ "arch_pid": "7924030570547",
+ "arch_title": "Raden 502 | Fabricut",
+ "keep_pid": "7924030373939",
+ "keep_title": "Raden Slate02 | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 12,
+ "arch_pid": "7924037812275",
+ "arch_title": "Sunset Wave 503 | Fabricut",
+ "keep_pid": "7924037746739",
+ "keep_title": "Sunset Wave Sky | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 13,
+ "arch_pid": "7924037877811",
+ "arch_title": "Sunset Wave 501 | Fabricut",
+ "keep_pid": "7924037845043",
+ "keep_title": "Sunset Wave Dusk | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 14,
+ "arch_pid": "7924038664243",
+ "arch_title": "Liane 503 | Fabricut",
+ "keep_pid": "7924038631475",
+ "keep_title": "Liane Blue | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 15,
+ "arch_pid": "7924038729779",
+ "arch_title": "Audra 501 | Fabricut",
+ "keep_pid": "7924038697011",
+ "keep_title": "Audra Olive | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 16,
+ "arch_pid": "7924038795315",
+ "arch_title": "Raden 505 | Fabricut",
+ "keep_pid": "7924038762547",
+ "keep_title": "Raden Silver | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 17,
+ "arch_pid": "7924038926387",
+ "arch_title": "Mylo Plaid 502 | Fabricut",
+ "keep_pid": "7924038893619",
+ "keep_title": "Mylo Plaid Blue | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 18,
+ "arch_pid": "7924048822323",
+ "arch_title": "Gisella 505 | Fabricut",
+ "keep_pid": "7924048560179",
+ "keep_title": "Gisella Peacock | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 19,
+ "arch_pid": "7924051869747",
+ "arch_title": "Leana 502 | Fabricut",
+ "keep_pid": "7924051542067",
+ "keep_title": "Leana Blue | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 20,
+ "arch_pid": "7924069072947",
+ "arch_title": "Mavis 501 | Fabricut",
+ "keep_pid": "7924069040179",
+ "keep_title": "Mavis Sage | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 21,
+ "arch_pid": "7924069335091",
+ "arch_title": "Gisella 501 | Fabricut",
+ "keep_pid": "7924069302323",
+ "keep_title": "Gisella Olive Wood | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 22,
+ "arch_pid": "7924069826611",
+ "arch_title": "Raden 504 | Fabricut",
+ "keep_pid": "7924069793843",
+ "keep_title": "Raden Sage | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 23,
+ "arch_pid": "7924080541747",
+ "arch_title": "Gisella 503 | Fabricut",
+ "keep_pid": "7924080476211",
+ "keep_title": "Gisella Grey | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 24,
+ "arch_pid": "7924080607283",
+ "arch_title": "Gisella 502 | Fabricut",
+ "keep_pid": "7924080574515",
+ "keep_title": "Gisella Blush | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 25,
+ "arch_pid": "7924080738355",
+ "arch_title": "Menson 503 | Fabricut",
+ "keep_pid": "7924080705587",
+ "keep_title": "Menson Dune | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 26,
+ "arch_pid": "7924080803891",
+ "arch_title": "Menson 501 | Fabricut",
+ "keep_pid": "7924080771123",
+ "keep_title": "Menson Charcoal | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 27,
+ "arch_pid": "7924080869427",
+ "arch_title": "Veliora 503 | Fabricut",
+ "keep_pid": "7924080836659",
+ "keep_title": "Veliora Black Gold | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 28,
+ "arch_pid": "7924080934963",
+ "arch_title": "Liane 505 | Fabricut",
+ "keep_pid": "7924080902195",
+ "keep_title": "Liane Natural | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 29,
+ "arch_pid": "7924081000499",
+ "arch_title": "Liane 504 | Fabricut",
+ "keep_pid": "7924080967731",
+ "keep_title": "Liane Gold | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 30,
+ "arch_pid": "7924081426483",
+ "arch_title": "Leana 503 | Fabricut",
+ "keep_pid": "7924081393715",
+ "keep_title": "Leana Gold | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ },
+ {
+ "n": 31,
+ "arch_pid": "7924094697523",
+ "arch_title": "Raden 501 | Fabricut",
+ "keep_pid": "7924094533683",
+ "keep_title": "Raden Ecru01 | Fabricut",
+ "pre": "active",
+ "put": "archived",
+ "post": "archived",
+ "keep": "active",
+ "ok": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/DW-Skills-Output/tk10834/canary-with-imghash-assertion.mjs b/DW-Skills-Output/tk10834/canary-with-imghash-assertion.mjs
new file mode 100644
index 00000000..51824c27
--- /dev/null
+++ b/DW-Skills-Output/tk10834/canary-with-imghash-assertion.mjs
@@ -0,0 +1,207 @@
+// dw-fabricut-price-canary — LIVE-feed price-UNIT-integrity canary for the Fabricut wallcovering
+// line on the DW store. Catches the confirmed 2026-08-20 bug (Mavis 503, DWFC-230001): Fabricut
+// prices wallcoverings PER YARD (fabricut_catalog.msrp_unit='yard', vendor_msrp=$36/yd) put up in
+// multi-yard rolls (roll_yards=9), but the live store labels the sellable variant "Per Roll" while
+// carrying the per-YARD number — so a 9-yard roll (should be 9 x $36 = $324) sells for $36, a
+// ~roll_yards x underprice, with a phantom "9 rolls" minimum.
+//
+// This is a UNIT-MISLABEL bug, NOT the Carnegie under-markup bug — so the test is different:
+// a variant labeled "…Roll…" but priced ~ the per-YARD MSRP, on a roll of >= 2 yards.
+//
+// WHY LIVE, NOT DB: the dw_unified shopify_products mirror carries the ACTIVE Fabricut list + handles
+// but only the $4.25 sample variant price (min_variant_price), NOT the sellable per-variant price or
+// its option label. The live product .json is the only source of the real sell price + unit label.
+// The per-yard basis + roll length come DB-side from fabricut_catalog (authenticated trade scrape).
+//
+// Checks (per sampled live product, non-sample variants):
+// 1) FAIL unit_mislabel — option/title matches /roll/ AND source msrp_unit='yard' AND roll_yards>=2
+// AND live price is ~ the per-yard MSRP (<= perYard x YARD_TOL) i.e. well below perYard*roll_yards.
+// => per-yard price sold as a whole roll. Reports expected roll price (perYard*roll_yards).
+// 2) WARN sample_as_sell — a non-sample variant priced <= $5 (the $4.25 memo leaking as the sell price
+// -> GMC $4.25-feed disapproval risk).
+// BASELINE-AWARE: unit_mislabel count is compared to a stored floor (data/baseline.json). During
+// remediation the floor is the known backlog; alerts fire on GROWTH above the floor or any NEW
+// mislabel after a fix, never on the steady known backlog.
+//
+// READ-ONLY. Alerts to CNCP + George only on FAIL/WARN-growth; PASS/UNKNOWN are silent.
+// Writes data/latest.json every run (dw-canary-meta-watchdog heartbeat) with verdict PASS/WARN/FAIL.
+import { execFileSync } from 'node:child_process';
+import fs from 'node:fs';
+
+const HOME = process.env.HOME, SKILL = `${HOME}/.claude/skills/dw-fabricut-price-canary`;
+const DBURL = process.env.DW_UNIFIED_URL || 'postgresql:///dw_unified?host=/tmp';
+const STORE = process.env.DW_STORE || 'https://www.designerwallcoverings.com';
+const SAMPLE = +(process.env.FAB_SAMPLE || 25); // live products checked per run (rotating)
+const YARD_TOL = +(process.env.FAB_YARD_TOL || 1.25); // price <= perYard*TOL => "priced as a yard"
+const REQ_DELAY_MS = 1200;
+const PSQL = ['/opt/homebrew/opt/postgresql@14/bin/psql', '/usr/local/opt/postgresql@14/bin/psql', 'psql']
+ .find(p => { try { execFileSync(p, ['--version'], { stdio: 'ignore' }); return true; } catch { return false; } }) || 'psql';
+
+const sleep = ms => new Promise(r => setTimeout(r, ms));
+function q(sql) {
+ const out = execFileSync(PSQL, [DBURL, '-At', '-F', '|', '-c', sql], { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
+ return out.trim() ? out.trim().split('\n').map(r => r.split('|')) : [];
+}
+async function getJSON(url, tries = 4) {
+ let last = 'unknown';
+ for (let i = 0; i < tries; i++) {
+ try {
+ const res = await fetch(url, { headers: { 'User-Agent': 'dw-fabricut-canary/1.0' } });
+ if (res.status === 429) { last = 'HTTP 429'; await sleep(2500 * (i + 1)); continue; }
+ if (res.status === 404) return { __notfound: true };
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
+ return await res.json();
+ } catch (e) { last = String(e.message || e); if (i === tries - 1) break; await sleep(1500 * (i + 1)); }
+ }
+ throw new Error(last);
+}
+const baseSku = s => String(s || '').replace(/-(sample|roll|yard|yd|sr|dr|single.*|double.*)$/i, '').trim();
+
+// --- driver: ACTIVE Fabricut products (mirror is authoritative for the list + handle) ---
+let driver = [];
+try {
+ driver = q(`select handle from shopify_products
+ where vendor ilike '%fabricut%' and status='ACTIVE' and handle is not null and handle<>''
+ order by handle`).map(([handle]) => ({ handle }));
+} catch { /* table missing -> inputs_verified false */ }
+
+// --- per-yard basis + roll length by dw_sku (fabricut_catalog = authenticated trade scrape) ---
+const basis = new Map(); // dw_sku -> { perYard, rollYards, unitSrc, width }
+try {
+ for (const [sku, msrp, retail, unit, ry, w] of q(
+ `select dw_sku, vendor_msrp, price_retail, msrp_unit, roll_yards, width_inches
+ from fabricut_catalog where dw_sku is not null`)) {
+ const perYard = parseFloat(msrp) || parseFloat(retail) || 0;
+ basis.set(sku, { perYard, rollYards: parseInt(ry, 10) || 0, unitSrc: (unit || '').toLowerCase().trim(), width: w });
+ }
+} catch { /* no basis -> can't judge unit */ }
+
+// --- rotating sample cursor ---
+const curFile = `${SKILL}/data/cursor.json`;
+let cursor = 0;
+try { cursor = JSON.parse(fs.readFileSync(curFile, 'utf8')).cursor || 0; } catch { /* start 0 */ }
+if (driver.length && cursor >= driver.length) cursor = 0;
+const batch = driver.slice(cursor, cursor + SAMPLE);
+const nextCursor = driver.length ? (cursor + SAMPLE) % driver.length : 0;
+
+// --- live-check the sampled products ---
+const mislabel = [], sampleSell = [];
+let checked = 0, notFound = 0, feedError = '';
+try {
+ for (const d of batch) {
+ let pj;
+ try { pj = await getJSON(`${STORE}/products/${d.handle}.json`); }
+ catch (e) { feedError = String(e.message || e).slice(0, 120); break; } // 429/hard error -> UNKNOWN
+ if (pj?.__notfound) { notFound++; await sleep(REQ_DELAY_MS); continue; }
+ const p = pj?.product; if (!p) { await sleep(REQ_DELAY_MS); continue; }
+ checked++;
+ for (const v of (p.variants || [])) {
+ const price = +v.price, sku = v.sku || '';
+ const label = `${v.title || ''} ${v.option1 || ''}`.toLowerCase();
+ const isSample = /sample/.test(label) || /sample/i.test(sku);
+ if (isSample) continue;
+ if (price <= 5) { sampleSell.push({ handle: p.handle, sku, price }); continue; }
+ const b = basis.get(sku) || basis.get(baseSku(sku));
+ if (!b || !(b.perYard > 0)) continue; // no per-yard basis -> can't judge
+ const soldByRoll = /roll/.test(label);
+ if (soldByRoll && b.unitSrc === 'yard' && b.rollYards >= 2 && price <= b.perYard * YARD_TOL) {
+ const expectedRoll = +(b.perYard * b.rollYards).toFixed(2);
+ mislabel.push({ handle: p.handle, sku, label: (v.option1 || v.title || '').trim(),
+ live: price, per_yard: b.perYard, roll_yards: b.rollYards,
+ expected_roll: expectedRoll, under_x: +(expectedRoll / price).toFixed(1) });
+ }
+ }
+ await sleep(REQ_DELAY_MS);
+ }
+} catch (e) { feedError = feedError || String(e.message || e).slice(0, 120); }
+
+// advance cursor only if the live pass actually ran
+if (!feedError && driver.length) fs.writeFileSync(curFile, JSON.stringify({ cursor: nextCursor, at: new Date().toISOString() }));
+
+// --- TK-10834 assertion: 2+ ACTIVE Fabricut products sharing ONE image-content-hash ---
+// (the Fabricut double-import defect — same jpg re-listed under two adjacent SKUs, one
+// color-named + one numeric-titled. Remediated 2026-08-25 to floor 0; alert on any
+// NEW active image-hash duplicate cluster. DB-side over shopify_products×fabricut_catalog,
+// so it does not depend on the rotating live sample above.)
+let dupClusters = 0, dupDetail = [], dupError = '';
+try {
+ // join the ACTIVE Fabricut list (mirror = list authority) to fabricut_catalog.image_url,
+ // group by the image content-hash (leading 32-hex of the Shopify CDN filename), flag >1.
+ const rows = q(`
+ with active_fab as (
+ select handle from shopify_products
+ where vendor ilike '%fabricut%' and status='ACTIVE' and handle is not null and handle<>''
+ ),
+ joined as (
+ select fc.dw_sku, fc.image_url,
+ lower(substring(fc.image_url from '/([0-9a-fA-F]{32})')) as imghash
+ from fabricut_catalog fc
+ where fc.on_shopify = true and fc.image_url is not null and fc.shopify_product_id is not null
+ )
+ select imghash, count(*) n, string_agg(dw_sku, ',') skus
+ from joined
+ where imghash is not null
+ group by imghash
+ having count(*) > 1
+ order by n desc`);
+ dupClusters = rows.length;
+ dupDetail = rows.slice(0, 30).map(([h, n, skus]) => ({ imghash: h, n: +n, skus }));
+} catch (e) { dupError = String(e.message || e).slice(0, 120); }
+
+// baseline-aware: floor 0 after the 2026-08-25 remediation; alert only on GROWTH.
+const dupBaseFile = `${SKILL}/data/imghash-baseline.json`;
+let dupBaseline = null;
+try { dupBaseline = JSON.parse(fs.readFileSync(dupBaseFile, 'utf8')); } catch { /* first run */ }
+let dupGrew = false, dupFloor = dupClusters;
+if (dupBaseline && Number.isFinite(dupBaseline.dup_clusters)) { dupFloor = dupBaseline.dup_clusters; dupGrew = dupClusters > dupBaseline.dup_clusters; }
+else if (!dupError && driver.length) fs.writeFileSync(dupBaseFile, JSON.stringify({ dup_clusters: dupClusters, captured_at: new Date().toISOString(), note: 'TK-10834 image-hash dup floor; 0 = clean post-remediation' }, null, 2));
+
+// --- baseline-aware mislabel count ---
+const baseFile = `${SKILL}/data/baseline.json`;
+let baseline = null;
+try { baseline = JSON.parse(fs.readFileSync(baseFile, 'utf8')); } catch { /* first run */ }
+const mNow = mislabel.length;
+let grew = false, floor = mNow;
+if (baseline && Number.isFinite(baseline.mislabel)) { floor = baseline.mislabel; grew = mNow > baseline.mislabel; }
+else if (driver.length) fs.writeFileSync(baseFile, JSON.stringify({ mislabel: mNow, captured_at: new Date().toISOString(), note: 'sampled per run; floor is a rolling sample count, not the whole line' }, null, 2));
+
+const findings = [];
+if (mislabel.length) findings.push({ sev: 'FAIL', check: 'unit_mislabel',
+ msg: `${mislabel.length} Fabricut variant(s) labeled per-roll but priced ~per-yard (a full roll should be per_yard x roll_yards)`, rows: mislabel.slice(0, 30) });
+if (sampleSell.length) findings.push({ sev: 'WARN', check: 'sample_as_sell',
+ msg: `${sampleSell.length} non-sample variant(s) priced <=$5 (memo leaking as the sell price)`, rows: sampleSell.slice(0, 30) });
+if (grew && !mislabel.length) findings.push({ sev: 'WARN', check: 'mislabel_growth',
+ msg: `sampled unit-mislabel count grew to ${mNow} (floor ${floor})` });
+// TK-10834: any ACTIVE image-hash dup cluster is a FAIL when floor is 0 (remediated);
+// during any pre-clean backlog it WARNs on growth above the recorded floor.
+if (dupClusters > 0 && dupFloor === 0) findings.push({ sev: 'FAIL', check: 'image_hash_dup',
+ msg: `${dupClusters} image-content-hash cluster(s) with 2+ ACTIVE Fabricut products (same jpg re-listed under two SKUs — the TK-10834 double-import defect)`, rows: dupDetail });
+else if (dupGrew) findings.push({ sev: 'WARN', check: 'image_hash_dup_growth',
+ msg: `ACTIVE Fabricut image-hash dup clusters grew to ${dupClusters} (floor ${dupFloor})`, rows: dupDetail });
+
+const fail = findings.filter(f => f.sev === 'FAIL').length;
+const warn = findings.filter(f => f.sev === 'WARN').length;
+const verdict = feedError ? 'UNKNOWN' : fail ? 'FAIL' : warn ? 'WARN' : 'PASS';
+
+const inputs_verified = driver.length > 0 && checked > 0 && basis.size > 0 && !feedError;
+const nowIso = new Date().toISOString();
+const out = {
+ scanned_at: nowIso, verdict, status: verdict, fail, warn, findings,
+ stats: { driver_total: driver.length, basis_skus: basis.size, sampled: batch.length, checked,
+ not_found: notFound, cursor, next_cursor: nextCursor, yard_tol: YARD_TOL,
+ mislabel_now: mNow, mislabel_floor: floor, feed_error: feedError || null,
+ imghash_dup_clusters: dupClusters, imghash_dup_floor: dupFloor, imghash_dup_error: dupError || null },
+ ok: true, checked_at: nowIso, inputs_verified, self_test: driver.length > 0 && basis.size > 0,
+ health_note: `driver=${driver.length} · checked=${checked}/${batch.length} · basis=${basis.size} · mislabel=${mNow} · cursor→${nextCursor}`
+ + (feedError ? ` · FEED ERROR: ${feedError}` : '')
+ + (inputs_verified ? '' : ' — blind: verify shopify_products + fabricut_catalog + feed'),
+};
+fs.mkdirSync(`${SKILL}/data`, { recursive: true });
+fs.writeFileSync(`${SKILL}/data/audit-${nowIso.replace(/[:.]/g, '-')}.json`, JSON.stringify(out, null, 2));
+fs.writeFileSync(`${SKILL}/data/latest.json`, JSON.stringify(out, null, 2));
+
+console.log(`[fabricut-canary] ${verdict} · ${fail} FAIL · ${warn} WARN · ${out.health_note}`);
+for (const f of findings) console.log(` ${f.sev === 'FAIL' ? '✗' : '△'} ${f.check}: ${f.msg}`);
+for (const r of mislabel.slice(0, 20)) console.log(` ${r.handle} (${r.sku}) "${r.label}" live $${r.live} = per-yard $${r.per_yard} × ${r.roll_yards}yd roll → should be $${r.expected_roll} (~${r.under_x}× under)`);
+if (verdict === 'PASS') console.log(' ✓ sampled Fabricut roll-labeled variants are all priced as full rolls (no per-yard-as-roll mislabel, no memo leak)');
+if (verdict === 'UNKNOWN') console.log(` ? feed unreadable — ${feedError}`);
diff --git a/DW-Skills-Output/tk10834/imghash-baseline.json b/DW-Skills-Output/tk10834/imghash-baseline.json
new file mode 100644
index 00000000..58396a12
--- /dev/null
+++ b/DW-Skills-Output/tk10834/imghash-baseline.json
@@ -0,0 +1,5 @@
+{
+ "dup_clusters": 0,
+ "captured_at": "2026-08-25T16:44:19.664Z",
+ "note": "TK-10834 image-hash dup floor; 0 = clean post-remediation"
+}
\ No newline at end of file
diff --git a/DW-Skills-Output/tk10834/preverify.json b/DW-Skills-Output/tk10834/preverify.json
new file mode 100644
index 00000000..f1429c2d
--- /dev/null
+++ b/DW-Skills-Output/tk10834/preverify.json
@@ -0,0 +1,760 @@
+{
+ "verified": [
+ {
+ "hash": "b9350c131a7cc7395114a78e90c168bc",
+ "keep_pid": "7924025032755",
+ "keep_title": "Mavis Ivory | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "b9350c131a7cc7395114a78e90c168bc",
+ "arch_pid": "7924022509619",
+ "arch_title": "Mavis 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "b9350c131a7cc7395114a78e90c168bc"
+ },
+ {
+ "hash": "378cba44c4ce964c9779f8163d93fd93",
+ "keep_pid": "7924022542387",
+ "keep_title": "Sunset Wave Pink | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "378cba44c4ce964c9779f8163d93fd93",
+ "arch_pid": "7924022706227",
+ "arch_title": "Sunset Wave 502 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "378cba44c4ce964c9779f8163d93fd93"
+ },
+ {
+ "hash": "64fe7fd3b4ead174dd2de357552cfa8e",
+ "keep_pid": "7924022804531",
+ "keep_title": "Gisella Jade | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "64fe7fd3b4ead174dd2de357552cfa8e",
+ "arch_pid": "7924022837299",
+ "arch_title": "Gisella 504 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "64fe7fd3b4ead174dd2de357552cfa8e"
+ },
+ {
+ "hash": "579b4f06602615b18e68028c3a4aa6c7",
+ "keep_pid": "7924022870067",
+ "keep_title": "Menson Grey | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "579b4f06602615b18e68028c3a4aa6c7",
+ "arch_pid": "7924022902835",
+ "arch_title": "Menson 502 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "579b4f06602615b18e68028c3a4aa6c7"
+ },
+ {
+ "hash": "8b0429d72144db29c0622bed77e9d3d3",
+ "keep_pid": "7924022935603",
+ "keep_title": "Veliora Copper Gold | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "8b0429d72144db29c0622bed77e9d3d3",
+ "arch_pid": "7924022968371",
+ "arch_title": "Veliora 501 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "8b0429d72144db29c0622bed77e9d3d3"
+ },
+ {
+ "hash": "664cb101e452f88853a7cc79ec935250",
+ "keep_pid": "7924023164979",
+ "keep_title": "Audra Navy | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "664cb101e452f88853a7cc79ec935250",
+ "arch_pid": "7924023197747",
+ "arch_title": "Audra 504 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "664cb101e452f88853a7cc79ec935250"
+ },
+ {
+ "hash": "6d94b0acfe7a0343bad9625a07cbb5ea",
+ "keep_pid": "7924025065523",
+ "keep_title": "Audra Green | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "6d94b0acfe7a0343bad9625a07cbb5ea",
+ "arch_pid": "7924023263283",
+ "arch_title": "Audra 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "6d94b0acfe7a0343bad9625a07cbb5ea"
+ },
+ {
+ "hash": "bd89771335b0399e9a0f06a340010913",
+ "keep_pid": "7924023296051",
+ "keep_title": "Audra Forest | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "bd89771335b0399e9a0f06a340010913",
+ "arch_pid": "7924023427123",
+ "arch_title": "Audra 502 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "bd89771335b0399e9a0f06a340010913"
+ },
+ {
+ "hash": "97c290be26446f9b16386aee7c5ca080",
+ "keep_pid": "7924023459891",
+ "keep_title": "Raden Sky | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "97c290be26446f9b16386aee7c5ca080",
+ "arch_pid": "7924023558195",
+ "arch_title": "Raden 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "97c290be26446f9b16386aee7c5ca080"
+ },
+ {
+ "hash": "3cec9e2894683443989aff6c2eb90bb2",
+ "keep_pid": "7924023590963",
+ "keep_title": "Mylo Plaid Grey | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "3cec9e2894683443989aff6c2eb90bb2",
+ "arch_pid": "7924023656499",
+ "arch_title": "Mylo Plaid 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "3cec9e2894683443989aff6c2eb90bb2"
+ },
+ {
+ "hash": "50c491ba413570e595e3353575161489",
+ "keep_pid": "7924030373939",
+ "keep_title": "Raden Slate02 | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "50c491ba413570e595e3353575161489",
+ "arch_pid": "7924030570547",
+ "arch_title": "Raden 502 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "50c491ba413570e595e3353575161489"
+ },
+ {
+ "hash": "35aa289cfca36f3cb4b1d5b70b213bb9",
+ "keep_pid": "7924037746739",
+ "keep_title": "Sunset Wave Sky | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "35aa289cfca36f3cb4b1d5b70b213bb9",
+ "arch_pid": "7924037812275",
+ "arch_title": "Sunset Wave 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "35aa289cfca36f3cb4b1d5b70b213bb9"
+ },
+ {
+ "hash": "c119af912b9d3f92b4ae60881a7d24ce",
+ "keep_pid": "7924037845043",
+ "keep_title": "Sunset Wave Dusk | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "c119af912b9d3f92b4ae60881a7d24ce",
+ "arch_pid": "7924037877811",
+ "arch_title": "Sunset Wave 501 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "c119af912b9d3f92b4ae60881a7d24ce"
+ },
+ {
+ "hash": "6d08594d8d9b2778a663b9b8c93f5aea",
+ "keep_pid": "7924038631475",
+ "keep_title": "Liane Blue | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "6d08594d8d9b2778a663b9b8c93f5aea",
+ "arch_pid": "7924038664243",
+ "arch_title": "Liane 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "6d08594d8d9b2778a663b9b8c93f5aea"
+ },
+ {
+ "hash": "4dd2f422acff627c3ca4120a4d7680a1",
+ "keep_pid": "7924038697011",
+ "keep_title": "Audra Olive | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "4dd2f422acff627c3ca4120a4d7680a1",
+ "arch_pid": "7924038729779",
+ "arch_title": "Audra 501 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "4dd2f422acff627c3ca4120a4d7680a1"
+ },
+ {
+ "hash": "6076255a26d46fcdbe4401f5d2352ffd",
+ "keep_pid": "7924038762547",
+ "keep_title": "Raden Silver | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "6076255a26d46fcdbe4401f5d2352ffd",
+ "arch_pid": "7924038795315",
+ "arch_title": "Raden 505 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "6076255a26d46fcdbe4401f5d2352ffd"
+ },
+ {
+ "hash": "3aaa96e20f0280f1760eec70d8d49073",
+ "keep_pid": "7924038893619",
+ "keep_title": "Mylo Plaid Blue | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "3aaa96e20f0280f1760eec70d8d49073",
+ "arch_pid": "7924038926387",
+ "arch_title": "Mylo Plaid 502 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "3aaa96e20f0280f1760eec70d8d49073"
+ },
+ {
+ "hash": "eada7ce11572db535ce6fb10744f7f18",
+ "keep_pid": "7924048560179",
+ "keep_title": "Gisella Peacock | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "eada7ce11572db535ce6fb10744f7f18",
+ "arch_pid": "7924048822323",
+ "arch_title": "Gisella 505 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "eada7ce11572db535ce6fb10744f7f18"
+ },
+ {
+ "hash": "c3ee0045d208b2fae7cfb9863f92516f",
+ "keep_pid": "7924051542067",
+ "keep_title": "Leana Blue | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "c3ee0045d208b2fae7cfb9863f92516f",
+ "arch_pid": "7924051869747",
+ "arch_title": "Leana 502 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "c3ee0045d208b2fae7cfb9863f92516f"
+ },
+ {
+ "hash": "56e6f487265921f3b91d173ad57d73f7",
+ "keep_pid": "7924069040179",
+ "keep_title": "Mavis Sage | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "56e6f487265921f3b91d173ad57d73f7",
+ "arch_pid": "7924069072947",
+ "arch_title": "Mavis 501 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "56e6f487265921f3b91d173ad57d73f7"
+ },
+ {
+ "hash": "2819bc0c757ada8fa494814417ba3499",
+ "keep_pid": "7924069302323",
+ "keep_title": "Gisella Olive Wood | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "2819bc0c757ada8fa494814417ba3499",
+ "arch_pid": "7924069335091",
+ "arch_title": "Gisella 501 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "2819bc0c757ada8fa494814417ba3499"
+ },
+ {
+ "hash": "ce2ef4cd8b83d0e7d05b2b6f400164bf",
+ "keep_pid": "7924069793843",
+ "keep_title": "Raden Sage | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "ce2ef4cd8b83d0e7d05b2b6f400164bf",
+ "arch_pid": "7924069826611",
+ "arch_title": "Raden 504 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "ce2ef4cd8b83d0e7d05b2b6f400164bf"
+ },
+ {
+ "hash": "fabb0a6903d4058f6413ccde65e13390",
+ "keep_pid": "7924080476211",
+ "keep_title": "Gisella Grey | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "fabb0a6903d4058f6413ccde65e13390",
+ "arch_pid": "7924080541747",
+ "arch_title": "Gisella 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "fabb0a6903d4058f6413ccde65e13390"
+ },
+ {
+ "hash": "4d6d26bca194389f5543069bb17a400c",
+ "keep_pid": "7924080574515",
+ "keep_title": "Gisella Blush | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "4d6d26bca194389f5543069bb17a400c",
+ "arch_pid": "7924080607283",
+ "arch_title": "Gisella 502 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "4d6d26bca194389f5543069bb17a400c"
+ },
+ {
+ "hash": "6845c4f97f8979dde750c0b6226b4356",
+ "keep_pid": "7924080705587",
+ "keep_title": "Menson Dune | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "6845c4f97f8979dde750c0b6226b4356",
+ "arch_pid": "7924080738355",
+ "arch_title": "Menson 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "6845c4f97f8979dde750c0b6226b4356"
+ },
+ {
+ "hash": "6c6c2260c412723af4cc0527428c1988",
+ "keep_pid": "7924080771123",
+ "keep_title": "Menson Charcoal | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "6c6c2260c412723af4cc0527428c1988",
+ "arch_pid": "7924080803891",
+ "arch_title": "Menson 501 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "6c6c2260c412723af4cc0527428c1988"
+ },
+ {
+ "hash": "faa4bd32b6c783828f4b292936b97f8e",
+ "keep_pid": "7924080836659",
+ "keep_title": "Veliora Black Gold | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "faa4bd32b6c783828f4b292936b97f8e",
+ "arch_pid": "7924080869427",
+ "arch_title": "Veliora 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "faa4bd32b6c783828f4b292936b97f8e"
+ },
+ {
+ "hash": "b523212e2808789d050e0c851da591dc",
+ "keep_pid": "7924080902195",
+ "keep_title": "Liane Natural | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "b523212e2808789d050e0c851da591dc",
+ "arch_pid": "7924080934963",
+ "arch_title": "Liane 505 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "b523212e2808789d050e0c851da591dc"
+ },
+ {
+ "hash": "7ccf36668d19831c25cc1e8932283b74",
+ "keep_pid": "7924080967731",
+ "keep_title": "Liane Gold | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "7ccf36668d19831c25cc1e8932283b74",
+ "arch_pid": "7924081000499",
+ "arch_title": "Liane 504 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "7ccf36668d19831c25cc1e8932283b74"
+ },
+ {
+ "hash": "9de9481d339cf8817522c046cac174df",
+ "keep_pid": "7924081393715",
+ "keep_title": "Leana Gold | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "9de9481d339cf8817522c046cac174df",
+ "arch_pid": "7924081426483",
+ "arch_title": "Leana 503 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "9de9481d339cf8817522c046cac174df"
+ },
+ {
+ "hash": "de9f750ac1c642327c28f3548da0ef5d",
+ "keep_pid": "7924094533683",
+ "keep_title": "Raden Ecru01 | Fabricut",
+ "keep_status": "active",
+ "keep_imgmd5": "de9f750ac1c642327c28f3548da0ef5d",
+ "arch_pid": "7924094697523",
+ "arch_title": "Raden 501 | Fabricut",
+ "arch_status": "active",
+ "arch_imgmd5": "de9f750ac1c642327c28f3548da0ef5d"
+ }
+ ],
+ "problems": [],
+ "active_fabricut_count": 84,
+ "active_dup_hash_clusters": 31,
+ "active_dup_hash_detail": [
+ {
+ "hash": "b9350c131a7cc7395114a78e90c168bc",
+ "members": [
+ {
+ "id": "7924022509619",
+ "title": "Mavis 503 | Fabricut"
+ },
+ {
+ "id": "7924025032755",
+ "title": "Mavis Ivory | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "378cba44c4ce964c9779f8163d93fd93",
+ "members": [
+ {
+ "id": "7924022542387",
+ "title": "Sunset Wave Pink | Fabricut"
+ },
+ {
+ "id": "7924022706227",
+ "title": "Sunset Wave 502 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "64fe7fd3b4ead174dd2de357552cfa8e",
+ "members": [
+ {
+ "id": "7924022804531",
+ "title": "Gisella Jade | Fabricut"
+ },
+ {
+ "id": "7924022837299",
+ "title": "Gisella 504 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "579b4f06602615b18e68028c3a4aa6c7",
+ "members": [
+ {
+ "id": "7924022870067",
+ "title": "Menson Grey | Fabricut"
+ },
+ {
+ "id": "7924022902835",
+ "title": "Menson 502 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "8b0429d72144db29c0622bed77e9d3d3",
+ "members": [
+ {
+ "id": "7924022935603",
+ "title": "Veliora Copper Gold | Fabricut"
+ },
+ {
+ "id": "7924022968371",
+ "title": "Veliora 501 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "664cb101e452f88853a7cc79ec935250",
+ "members": [
+ {
+ "id": "7924023164979",
+ "title": "Audra Navy | Fabricut"
+ },
+ {
+ "id": "7924023197747",
+ "title": "Audra 504 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "6d94b0acfe7a0343bad9625a07cbb5ea",
+ "members": [
+ {
+ "id": "7924023263283",
+ "title": "Audra 503 | Fabricut"
+ },
+ {
+ "id": "7924025065523",
+ "title": "Audra Green | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "bd89771335b0399e9a0f06a340010913",
+ "members": [
+ {
+ "id": "7924023296051",
+ "title": "Audra Forest | Fabricut"
+ },
+ {
+ "id": "7924023427123",
+ "title": "Audra 502 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "97c290be26446f9b16386aee7c5ca080",
+ "members": [
+ {
+ "id": "7924023459891",
+ "title": "Raden Sky | Fabricut"
+ },
+ {
+ "id": "7924023558195",
+ "title": "Raden 503 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "3cec9e2894683443989aff6c2eb90bb2",
+ "members": [
+ {
+ "id": "7924023590963",
+ "title": "Mylo Plaid Grey | Fabricut"
+ },
+ {
+ "id": "7924023656499",
+ "title": "Mylo Plaid 503 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "50c491ba413570e595e3353575161489",
+ "members": [
+ {
+ "id": "7924030373939",
+ "title": "Raden Slate02 | Fabricut"
+ },
+ {
+ "id": "7924030570547",
+ "title": "Raden 502 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "35aa289cfca36f3cb4b1d5b70b213bb9",
+ "members": [
+ {
+ "id": "7924037746739",
+ "title": "Sunset Wave Sky | Fabricut"
+ },
+ {
+ "id": "7924037812275",
+ "title": "Sunset Wave 503 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "c119af912b9d3f92b4ae60881a7d24ce",
+ "members": [
+ {
+ "id": "7924037845043",
+ "title": "Sunset Wave Dusk | Fabricut"
+ },
+ {
+ "id": "7924037877811",
+ "title": "Sunset Wave 501 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "6d08594d8d9b2778a663b9b8c93f5aea",
+ "members": [
+ {
+ "id": "7924038631475",
+ "title": "Liane Blue | Fabricut"
+ },
+ {
+ "id": "7924038664243",
+ "title": "Liane 503 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "4dd2f422acff627c3ca4120a4d7680a1",
+ "members": [
+ {
+ "id": "7924038697011",
+ "title": "Audra Olive | Fabricut"
+ },
+ {
+ "id": "7924038729779",
+ "title": "Audra 501 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "6076255a26d46fcdbe4401f5d2352ffd",
+ "members": [
+ {
+ "id": "7924038762547",
+ "title": "Raden Silver | Fabricut"
+ },
+ {
+ "id": "7924038795315",
+ "title": "Raden 505 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "3aaa96e20f0280f1760eec70d8d49073",
+ "members": [
+ {
+ "id": "7924038893619",
+ "title": "Mylo Plaid Blue | Fabricut"
+ },
+ {
+ "id": "7924038926387",
+ "title": "Mylo Plaid 502 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "eada7ce11572db535ce6fb10744f7f18",
+ "members": [
+ {
+ "id": "7924048560179",
+ "title": "Gisella Peacock | Fabricut"
+ },
+ {
+ "id": "7924048822323",
+ "title": "Gisella 505 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "c3ee0045d208b2fae7cfb9863f92516f",
+ "members": [
+ {
+ "id": "7924051542067",
+ "title": "Leana Blue | Fabricut"
+ },
+ {
+ "id": "7924051869747",
+ "title": "Leana 502 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "56e6f487265921f3b91d173ad57d73f7",
+ "members": [
+ {
+ "id": "7924069040179",
+ "title": "Mavis Sage | Fabricut"
+ },
+ {
+ "id": "7924069072947",
+ "title": "Mavis 501 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "2819bc0c757ada8fa494814417ba3499",
+ "members": [
+ {
+ "id": "7924069302323",
+ "title": "Gisella Olive Wood | Fabricut"
+ },
+ {
+ "id": "7924069335091",
+ "title": "Gisella 501 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "ce2ef4cd8b83d0e7d05b2b6f400164bf",
+ "members": [
+ {
+ "id": "7924069793843",
+ "title": "Raden Sage | Fabricut"
+ },
+ {
+ "id": "7924069826611",
+ "title": "Raden 504 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "fabb0a6903d4058f6413ccde65e13390",
+ "members": [
+ {
+ "id": "7924080476211",
+ "title": "Gisella Grey | Fabricut"
+ },
+ {
+ "id": "7924080541747",
+ "title": "Gisella 503 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "4d6d26bca194389f5543069bb17a400c",
+ "members": [
+ {
+ "id": "7924080574515",
+ "title": "Gisella Blush | Fabricut"
+ },
+ {
+ "id": "7924080607283",
+ "title": "Gisella 502 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "6845c4f97f8979dde750c0b6226b4356",
+ "members": [
+ {
+ "id": "7924080705587",
+ "title": "Menson Dune | Fabricut"
+ },
+ {
+ "id": "7924080738355",
+ "title": "Menson 503 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "6c6c2260c412723af4cc0527428c1988",
+ "members": [
+ {
+ "id": "7924080771123",
+ "title": "Menson Charcoal | Fabricut"
+ },
+ {
+ "id": "7924080803891",
+ "title": "Menson 501 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "faa4bd32b6c783828f4b292936b97f8e",
+ "members": [
+ {
+ "id": "7924080836659",
+ "title": "Veliora Black Gold | Fabricut"
+ },
+ {
+ "id": "7924080869427",
+ "title": "Veliora 503 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "b523212e2808789d050e0c851da591dc",
+ "members": [
+ {
+ "id": "7924080902195",
+ "title": "Liane Natural | Fabricut"
+ },
+ {
+ "id": "7924080934963",
+ "title": "Liane 505 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "7ccf36668d19831c25cc1e8932283b74",
+ "members": [
+ {
+ "id": "7924080967731",
+ "title": "Liane Gold | Fabricut"
+ },
+ {
+ "id": "7924081000499",
+ "title": "Liane 504 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "9de9481d339cf8817522c046cac174df",
+ "members": [
+ {
+ "id": "7924081393715",
+ "title": "Leana Gold | Fabricut"
+ },
+ {
+ "id": "7924081426483",
+ "title": "Leana 503 | Fabricut"
+ }
+ ]
+ },
+ {
+ "hash": "de9f750ac1c642327c28f3548da0ef5d",
+ "members": [
+ {
+ "id": "7924094533683",
+ "title": "Raden Ecru01 | Fabricut"
+ },
+ {
+ "id": "7924094697523",
+ "title": "Raden 501 | Fabricut"
+ }
+ ]
+ }
+ ],
+ "summary": {
+ "pairs_in_list": 31,
+ "verified_ok": 31,
+ "problems": 0,
+ "active_fabricut_now": 84,
+ "active_dup_hash_clusters_now": 31
+ }
+}
← 73d0ee74 auto-data-snapshot: 2026-08-25T09:32:22 (4 data files) — DW-
·
back to Dw Validator Debug TK11314
·
auto-data-snapshot: 2026-08-25T11:28:19 (1 data files) — sho fd190d81 →