[object Object]

← back to Dw Photo Capture

Learn how each vendor labels their samples (180 vendor profiles)

5ebe4e664f10ccc92e90d8dc06d8f743832df9b6 · 2026-06-25 23:03:04 -0700 · Steve Abrams

The scanner's vendor knowledge was 5 hardcoded entries; now it learns every
vendor's sample-labeling pattern from two sources:

- build_vendor_profiles.py: one Shopify bulk export grouped by vendor induces a
  per-vendor profile — brand-name regex, manufacturer-code prefix histogram,
  numeric-share, example codes. Learns from the MANUFACTURER code (what's printed
  on the swatch), not the DW house SKU. 180 vendors profiled from 131k products.
- /api/learn: each scan that resolves to a real product folds the on-swatch code
  prefix back into that vendor's profile (learned_scans++), persisted + live.

server.js merges seed VENDOR_LEX + learned profiles into a runtime LEXICON that
analyzeOcr consults, so brand detection + SKU-prefix boosting + fast-lock now
cover all 180 vendors. profileToLex handles prefixed AND numeric-coded vendors.

/learn viewer (admin, basic-auth) shows what's been learned per vendor — prefixes,
examples, code-source (mfr vs house), private-label flag, scan count, updated time.

Verified: Scalamandre (learned-only, not seeded) → vendor detected + topStrong;
/api/learn write persists + rebuilds lexicon. $0 (local + Shopify read).

Files touched

Diff

commit 5ebe4e664f10ccc92e90d8dc06d8f743832df9b6
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Jun 25 23:03:04 2026 -0700

    Learn how each vendor labels their samples (180 vendor profiles)
    
    The scanner's vendor knowledge was 5 hardcoded entries; now it learns every
    vendor's sample-labeling pattern from two sources:
    
    - build_vendor_profiles.py: one Shopify bulk export grouped by vendor induces a
      per-vendor profile — brand-name regex, manufacturer-code prefix histogram,
      numeric-share, example codes. Learns from the MANUFACTURER code (what's printed
      on the swatch), not the DW house SKU. 180 vendors profiled from 131k products.
    - /api/learn: each scan that resolves to a real product folds the on-swatch code
      prefix back into that vendor's profile (learned_scans++), persisted + live.
    
    server.js merges seed VENDOR_LEX + learned profiles into a runtime LEXICON that
    analyzeOcr consults, so brand detection + SKU-prefix boosting + fast-lock now
    cover all 180 vendors. profileToLex handles prefixed AND numeric-coded vendors.
    
    /learn viewer (admin, basic-auth) shows what's been learned per vendor — prefixes,
    examples, code-source (mfr vs house), private-label flag, scan count, updated time.
    
    Verified: Scalamandre (learned-only, not seeded) → vendor detected + topStrong;
    /api/learn write persists + rebuilds lexicon. $0 (local + Shopify read).
---
 build_vendor_profiles.py  |  148 ++
 data/vendor_profiles.json | 4520 +++++++++++++++++++++++++++++++++++++++++++++
 public/index.html         |    8 +-
 public/learn.html         |  109 ++
 server.js                 |   85 +-
 5 files changed, 4867 insertions(+), 3 deletions(-)

diff --git a/build_vendor_profiles.py b/build_vendor_profiles.py
new file mode 100644
index 0000000..a40973d
--- /dev/null
+++ b/build_vendor_profiles.py
@@ -0,0 +1,148 @@
+#!/usr/bin/env python3
+"""Build data/vendor_profiles.json — learn HOW EACH VENDOR LABELS THEIR SAMPLES from the
+live catalog, so the SKU scanner can detect the brand and lock onto the right code fast.
+
+For every Shopify `vendor` we group all of that vendor's manufacturer codes (+ house SKUs)
+and induce a profile:
+  • aliases  — brand-name strings to look for in the OCR text (regex-ready)
+  • prefixes — histogram of the leading alpha run of their codes (WD, WDW, WHF, …)
+  • numeric  — share of codes that are bare numbers (Schumacher 5255-16 style)
+  • shape    — typical length of a code
+  • examples — a few real codes
+This is the deterministic counterpart to live scan-learning (/api/learn): the catalog
+teaches the broad strokes instantly; live scans refine the on-swatch reality over time.
+
+Uses one Bulk Operation (server-side full export). Read-only. $0 (local + Shopify read)."""
+import json, os, re, sys, time, urllib.request
+from collections import defaultdict, Counter
+from datetime import datetime, timezone
+
+SHOP = "designer-laboratory-sandbox.myshopify.com"; API = "2024-10"
+ROOT = os.path.dirname(os.path.abspath(__file__))
+OUT = os.path.join(ROOT, "data", "vendor_profiles.json")
+TOKEN = os.environ.get("SHOPIFY_ADMIN_TOKEN", "")
+if not TOKEN:
+    for line in open(os.path.expanduser("~/Projects/secrets-manager/.env")):
+        if line.startswith("SHOPIFY_ADMIN_TOKEN="):
+            TOKEN = line.strip().split("=", 1)[1]; break
+assert TOKEN, "no SHOPIFY_ADMIN_TOKEN"
+
+# Front-facing private-label rule: these upstream names must NEVER be surfaced to a
+# customer. The scanner is an internal admin tool so it MAY detect them, but we tag the
+# profile so any public consumer can skip it. (See MEMORY: Brewster/York/WallQuest…)
+PRIVATE_LABEL = re.compile(r"BREWSTER|YORK|WALLQUEST|CHESAPEAKE|NEXTWALL|SEABROOK|COMMAND ?54|DESIMA|CARLSTEN|NICOLETTE ?MAYER", re.I)
+
+def gql(query):
+    req = urllib.request.Request(f"https://{SHOP}/admin/api/{API}/graphql.json",
+        data=json.dumps({"query": query}).encode(),
+        headers={"X-Shopify-Access-Token": TOKEN, "Content-Type": "application/json"})
+    return json.load(urllib.request.urlopen(req, timeout=90))
+
+def parts(val):                       # "WDW-2290; Diamond WMT5001" -> ["WDW-2290","Diamond WMT5001"]
+    return [p for p in re.split(r"[;,/|]+", val or "") if p.strip()]
+
+def norm(s):                          # display code, trimmed (keep dashes for shape)
+    return re.sub(r"\s+", "", (s or "").upper())
+
+def alpha_prefix(code):               # leading letters of a code: WDW2310 -> WDW ; 5255-16 -> ""
+    m = re.match(r"[A-Za-z]+", code.strip())
+    return m.group(0).upper() if m else ""
+
+def brand_regex(name):                # vendor name -> flexible OCR detection pattern
+    words = [w.upper() for w in re.findall(r"[A-Za-z]+", name) if len(w) >= 3]
+    if not words: return None
+    # single short word (ARTE, ROMO) is noisy — require ≥4 chars; multi-word is safe at ≥3
+    if len(words) == 1 and len(words[0]) < 4: return None
+    return r"\s*".join(re.escape(w) for w in words)
+
+# ── 1) bulk export: vendor + mfr metafields + variant skus ────────────────────
+BULK_Q = '''
+{
+  products {
+    edges { node {
+      id status vendor
+      mf: metafield(namespace:"custom", key:"manufacturer_sku"){ value }
+      mf2: metafield(namespace:"dwc", key:"manufacturer_sku"){ value }
+      variants { edges { node { sku } } }
+    }}
+  }
+}'''
+start = gql('mutation { bulkOperationRunQuery(query: """%s""") { bulkOperation{ id status } userErrors{ field message } } }' % BULK_Q)
+ue = start.get("data", {}).get("bulkOperationRunQuery", {}).get("userErrors", [])
+if ue:
+    print("bulk start errors:", ue)
+    print("current:", gql('{ currentBulkOperation { id status } }')["data"]["currentBulkOperation"])
+    sys.exit(1)
+print("bulk op started, polling…")
+
+url = None
+for _ in range(180):
+    time.sleep(5)
+    cur = gql('{ currentBulkOperation { id status errorCode objectCount url } }')["data"]["currentBulkOperation"]
+    print(f"  status={cur['status']} objects={cur.get('objectCount')}")
+    if cur["status"] == "COMPLETED": url = cur["url"]; break
+    if cur["status"] in ("FAILED", "CANCELED"): print("bulk failed:", cur); sys.exit(1)
+assert url, "bulk op did not complete in time"
+
+# ── 2) parse JSONL: collect codes per vendor ──────────────────────────────────
+# Keep the two code namespaces SEPARATE: the manufacturer code (printed on the physical
+# swatch — what the scanner reads) vs the DW house SKU (what we resolve to). The profile
+# describes the SAMPLE, so we learn from mfr codes first and only fall back to house codes.
+data = urllib.request.urlopen(url, timeout=300).read().decode()
+prod_vendor = {}                       # gid -> vendor
+mfr_by_vendor = defaultdict(list)      # vendor -> [manufacturer code, …]  (on the swatch)
+house_by_vendor = defaultdict(list)    # vendor -> [DW house sku, …]       (fallback)
+for line in data.splitlines():
+    if not line.strip(): continue
+    o = json.loads(line)
+    if "__parentId" in o and "sku" in o:                 # variant child = house sku
+        ven = prod_vendor.get(o["__parentId"])
+        sku = (o.get("sku") or "")
+        if ven and sku and not sku.lower().endswith("-sample"):
+            house_by_vendor[ven].append(sku)
+    elif "id" in o and ("vendor" in o or "status" in o): # product line = mfr metafields
+        ven = (o.get("vendor") or "").strip()
+        prod_vendor[o["id"]] = ven
+        if not ven: continue
+        for k in ("mf", "mf2"):
+            v = (o.get(k) or {}).get("value")
+            if v:
+                for c in parts(v): mfr_by_vendor[ven].append(c)
+
+# ── 3) induce a profile per vendor ────────────────────────────────────────────
+profiles = {}
+for vendor in set(mfr_by_vendor) | set(house_by_vendor):
+    mfr = [norm(c) for c in mfr_by_vendor.get(vendor, []) if len(norm(c)) >= 4]
+    house = [norm(c) for c in house_by_vendor.get(vendor, []) if len(norm(c)) >= 4]
+    # learn from the manufacturer codes (the swatch); only fall back to house if too thin
+    codes = mfr if len(set(mfr)) >= 3 else house
+    code_source = "mfr" if len(set(mfr)) >= 3 else "house"
+    if len(codes) < 3: continue                          # too thin to learn anything reliable
+    uniq = sorted(set(codes))
+    pre = Counter(alpha_prefix(c) for c in codes if alpha_prefix(c))
+    numeric = sum(1 for c in codes if not alpha_prefix(c))
+    # keep prefixes that are common enough to be a real signal (≥3 hits AND ≥4% of codes)
+    keep = [(p, n) for p, n in pre.most_common(8) if n >= 3 and n >= 0.04 * len(codes)]
+    lens = Counter(len(c) for c in codes)
+    profiles[vendor] = {
+        "n": len(uniq),
+        "aliases": [vendor.upper()],
+        "alias_re": brand_regex(vendor),
+        "prefixes": {p: n for p, n in keep},
+        "numeric_share": round(numeric / max(1, len(codes)), 2),
+        "common_len": lens.most_common(1)[0][0] if lens else 0,
+        "examples": uniq[:6],
+        "private_label": bool(PRIVATE_LABEL.search(vendor)),
+        "source": "catalog",
+        "code_source": code_source,        # "mfr" = learned from real swatch codes; "house" = fallback
+        "learned_scans": 0,
+        "updated_at": datetime.now(timezone.utc).isoformat(),
+    }
+
+meta = {"_meta": {"vendors": len(profiles), "products": len(prod_vendor),
+                  "built_at": datetime.now(timezone.utc).isoformat(), "source": "catalog-bulk"}}
+json.dump({**meta, "profiles": profiles}, open(OUT, "w"), indent=0)
+print(f"\nlearned {len(profiles)} vendor profiles from {len(prod_vendor)} products -> {OUT}")
+for probe in ("Winfield Thybony", "Schumacher", "Phillip Jeffries", "Thibaut", "Kravet"):
+    p = profiles.get(probe)
+    if p: print(f"  {probe:22} n={p['n']:5}  prefixes={list(p['prefixes'])}  ex={p['examples'][:3]}")
diff --git a/data/vendor_profiles.json b/data/vendor_profiles.json
new file mode 100644
index 0000000..37555de
--- /dev/null
+++ b/data/vendor_profiles.json
@@ -0,0 +1,4520 @@
+{
+  "_meta": {
+    "vendors": 180,
+    "products": 131515,
+    "built_at": "2026-06-26T06:01:30.211846+00:00",
+    "source": "catalog-bulk",
+    "updated_at": "2026-06-26T06:02:15.340Z"
+  },
+  "profiles": {
+    "Fentucci": {
+      "n": 607,
+      "aliases": [
+        "FENTUCCI"
+      ],
+      "alias_re": "FENTUCCI",
+      "prefixes": {
+        "TRUE": 2069
+      },
+      "numeric_share": 0.2,
+      "common_len": 4,
+      "examples": [
+        "1014-001834",
+        "1014-001858",
+        "145-44151",
+        "149-62141",
+        "19-87404",
+        "20232-27"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.714205+00:00"
+    },
+    "Versace": {
+      "n": 432,
+      "aliases": [
+        "VERSACE"
+      ],
+      "alias_re": "VERSACE",
+      "prefixes": {
+        "SANCAR": 184,
+        "VERSACE": 62,
+        "YORK": 41
+      },
+      "numeric_share": 0.57,
+      "common_len": 6,
+      "examples": [
+        "1202935221",
+        "1202935241",
+        "1202935244",
+        "1202935461",
+        "1202935465",
+        "1202935472"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.716310+00:00"
+    },
+    "Elitis": {
+      "n": 243,
+      "aliases": [
+        "ELITIS"
+      ],
+      "alias_re": "ELITIS",
+      "prefixes": {
+        "ELIT": 488
+      },
+      "numeric_share": 0,
+      "common_len": 15,
+      "examples": [
+        "ELIT-A-L-AUBE-VIBRANTE-VP-731-85",
+        "ELIT-AUTHENTIQUE-APPARENCE-VP-633-03",
+        "ELIT-BOIS-D-AUTOMNE-VP-1030-07",
+        "ELIT-COMME-UNE-PERLE-AMBREE-VP-633-80",
+        "ELIT-COUCHER-DE-SOLEIL-SUR-LE-PACIFIQUE-VP-1043-01",
+        "ELIT-DANS-LE-SOUFFLE-DU-VENT-VP-1048-05"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.717518+00:00"
+    },
+    "Brand McKenzie": {
+      "n": 5,
+      "aliases": [
+        "BRAND MCKENZIE"
+      ],
+      "alias_re": "BRAND\\s*MCKENZIE",
+      "prefixes": {
+        "BMTD": 86,
+        "BMPP": 74,
+        "BMCF": 71,
+        "BMHD": 70,
+        "BMGI": 26
+      },
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "BMCF003",
+        "BMGI006",
+        "BMHD002",
+        "BMPP004",
+        "BMTD001"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.718520+00:00"
+    },
+    "Mind the Gap": {
+      "n": 1157,
+      "aliases": [
+        "MIND THE GAP"
+      ],
+      "alias_re": "MIND\\s*THE\\s*GAP",
+      "prefixes": {
+        "WP": 942,
+        "TRUE": 110
+      },
+      "numeric_share": 0.09,
+      "common_len": 7,
+      "examples": [
+        "2020100",
+        "2020101",
+        "2020102",
+        "2020103",
+        "2020104",
+        "2020105"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.722661+00:00"
+    },
+    "Wolf Gordon": {
+      "n": 1658,
+      "aliases": [
+        "WOLF GORDON"
+      ],
+      "alias_re": "WOLF\\s*GORDON",
+      "prefixes": {
+        "AZ": 314,
+        "Y": 108
+      },
+      "numeric_share": 0.1,
+      "common_len": 9,
+      "examples": [
+        "031307",
+        "10002",
+        "10003",
+        "10200",
+        "10201",
+        "10202"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.729467+00:00"
+    },
+    "Nicolette Mayer Fabrics": {
+      "n": 57,
+      "aliases": [
+        "NICOLETTE MAYER FABRICS"
+      ],
+      "alias_re": "NICOLETTE\\s*MAYER\\s*FABRICS",
+      "prefixes": {
+        "N": 48,
+        "NM": 9
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "N4AG10-007",
+        "N4AG10-027",
+        "N4AG10-029",
+        "N4AG10-036",
+        "N4AG10-038",
+        "N4BL10-039"
+      ],
+      "private_label": true,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.729645+00:00"
+    },
+    "Brunschwig & Fils": {
+      "n": 4198,
+      "aliases": [
+        "BRUNSCHWIG & FILS"
+      ],
+      "alias_re": "BRUNSCHWIG\\s*FILS",
+      "prefixes": {
+        "BR": 625,
+        "T": 475,
+        "JAG": 218
+      },
+      "numeric_share": 0.7,
+      "common_len": 12,
+      "examples": [
+        "1001.CS.0",
+        "1002.CS.0",
+        "10020.CS.0",
+        "1003.CS.0",
+        "1004.CS.0",
+        "1006.CS.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.741669+00:00"
+    },
+    "Printy6": {
+      "n": 13,
+      "aliases": [
+        "PRINTY6"
+      ],
+      "alias_re": "PRINTY",
+      "prefixes": {
+        "SNP": 3
+      },
+      "numeric_share": 0,
+      "common_len": 13,
+      "examples": [
+        "SNP2ZSYCFA6LL",
+        "SNP3K0WXRPIIF",
+        "SNP4P2EECCZFG",
+        "SNPAOWGS6CV8R",
+        "SNPBOBJML11I3",
+        "SNPD8HIBUELMC"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.741785+00:00"
+    },
+    "Donghia": {
+      "n": 161,
+      "aliases": [
+        "DONGHIA"
+      ],
+      "alias_re": "DONGHIA",
+      "prefixes": {
+        "DG": 233,
+        "P": 84
+      },
+      "numeric_share": 0.01,
+      "common_len": 12,
+      "examples": [
+        "6021126",
+        "6021127.11.0",
+        "DG-09700.003",
+        "DG-09700.018",
+        "DG-09702.008",
+        "DG-09703.008"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.742683+00:00"
+    },
+    "Kirkby Design": {
+      "n": 3,
+      "aliases": [
+        "KIRKBY DESIGN"
+      ],
+      "alias_re": "KIRKBY\\s*DESIGN",
+      "prefixes": {
+        "WK": 5
+      },
+      "numeric_share": 0,
+      "common_len": 5,
+      "examples": [
+        "WK810",
+        "WK813",
+        "WK820"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.742765+00:00"
+    },
+    "Laura Ashley Wallpaper": {
+      "n": 130,
+      "aliases": [
+        "LAURA ASHLEY WALLPAPER"
+      ],
+      "alias_re": "LAURA\\s*ASHLEY\\s*WALLPAPER",
+      "prefixes": {
+        "LAURA": 27
+      },
+      "numeric_share": 0.85,
+      "common_len": 6,
+      "examples": [
+        "118469",
+        "118470",
+        "118471",
+        "118472",
+        "118473",
+        "118475"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.743358+00:00"
+    },
+    "Boråstapeter": {
+      "n": 28,
+      "aliases": [
+        "BORÅSTAPETER"
+      ],
+      "alias_re": "BOR\\s*STAPETER",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 4,
+      "examples": [
+        "1960",
+        "2078",
+        "2092",
+        "3119",
+        "4587",
+        "5350"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.743466+00:00"
+    },
+    "Threads": {
+      "n": 79,
+      "aliases": [
+        "THREADS"
+      ],
+      "alias_re": "THREADS",
+      "prefixes": {
+        "EW": 68,
+        "NARROWCORD": 12
+      },
+      "numeric_share": 0,
+      "common_len": 13,
+      "examples": [
+        "CABLECORD.COFFEE.0",
+        "EW15005_905",
+        "EW15013.140.0",
+        "EW15013.680.0",
+        "EW15018.225.0",
+        "EW15018.615.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.743755+00:00"
+    },
+    "Designers Guild": {
+      "n": 676,
+      "aliases": [
+        "DESIGNERS GUILD"
+      ],
+      "alias_re": "DESIGNERS\\s*GUILD",
+      "prefixes": {
+        "PDG": 901,
+        "P": 600
+      },
+      "numeric_share": 0.05,
+      "common_len": 6,
+      "examples": [
+        "985621",
+        "985631",
+        "985641",
+        "985651",
+        "985661",
+        "985761"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.749250+00:00"
+    },
+    "Witch & Watchman": {
+      "n": 10,
+      "aliases": [
+        "WITCH & WATCHMAN"
+      ],
+      "alias_re": "WITCH\\s*WATCHMAN",
+      "prefixes": {},
+      "numeric_share": 0,
+      "common_len": 29,
+      "examples": [
+        "AMAZONIA-DARK",
+        "AMAZONIA-LIGHT-JUNGLE-WALLPAPER",
+        "BELLA-DONNA-FANTASY-WALLPAPER",
+        "BELLA-DONNA-LIGHT-FANTASY-WALLPAPER",
+        "FOLIA-DARK-JUNGLE",
+        "FOLIA-LIGHT-JUNGLE-WALLPAPER"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.749316+00:00"
+    },
+    "Architectural Fabrics": {
+      "n": 478,
+      "aliases": [
+        "ARCHITECTURAL FABRICS"
+      ],
+      "alias_re": "ARCHITECTURAL\\s*FABRICS",
+      "prefixes": {
+        "PI": 296,
+        "BY": 116,
+        "OTHER": 72,
+        "KINDA": 42,
+        "SUNNY": 40
+      },
+      "numeric_share": 0,
+      "common_len": 17,
+      "examples": [
+        "ACQUISITIONS-220",
+        "ACQUISITIONS-7",
+        "BLOODLINE-CREAM",
+        "BLOODLINE-FAWN",
+        "BLOODLINE-FOG",
+        "BLOODLINE-MINERAL"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.752778+00:00"
+    },
+    "Et Cie Wall Panels": {
+      "n": 451,
+      "aliases": [
+        "ET CIE WALL PANELS"
+      ],
+      "alias_re": "CIE\\s*WALL\\s*PANELS",
+      "prefixes": {},
+      "numeric_share": 0.98,
+      "common_len": 5,
+      "examples": [
+        "19000",
+        "190001",
+        "190002",
+        "190003",
+        "190004",
+        "190005"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.755758+00:00"
+    },
+    "Roberto Cavalli Wallpaper": {
+      "n": 194,
+      "aliases": [
+        "ROBERTO CAVALLI WALLPAPER"
+      ],
+      "alias_re": "ROBERTO\\s*CAVALLI\\s*WALLPAPER",
+      "prefixes": {
+        "RC": 149
+      },
+      "numeric_share": 0.33,
+      "common_len": 7,
+      "examples": [
+        "0RC18092",
+        "16001",
+        "16003",
+        "16009",
+        "16013",
+        "16021"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.756899+00:00"
+    },
+    "1838 Wallcoverings": {
+      "n": 412,
+      "aliases": [
+        "1838 WALLCOVERINGS"
+      ],
+      "alias_re": "WALLCOVERINGS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 11,
+      "examples": [
+        "1001200",
+        "1001201",
+        "1001202",
+        "1001203",
+        "1001204",
+        "1001205"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.758648+00:00"
+    },
+    "Hospitality Wallcoverings": {
+      "n": 98,
+      "aliases": [
+        "HOSPITALITY WALLCOVERINGS"
+      ],
+      "alias_re": "HOSPITALITY\\s*WALLCOVERINGS",
+      "prefixes": {},
+      "numeric_share": 0.99,
+      "common_len": 5,
+      "examples": [
+        "30001",
+        "30002",
+        "30003",
+        "30004",
+        "30005",
+        "30006"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.759072+00:00"
+    },
+    "Los Angeles Fabrics": {
+      "n": 1958,
+      "aliases": [
+        "LOS ANGELES FABRICS"
+      ],
+      "alias_re": "LOS\\s*ANGELES\\s*FABRICS",
+      "prefixes": {
+        "JD": 4266
+      },
+      "numeric_share": 0,
+      "common_len": 19,
+      "examples": [
+        "JD-ABRAXAS-AMAZON",
+        "JD-ABRAXAS-AVOCADO",
+        "JD-ABRAXAS-CHOCO",
+        "JD-ABRAXAS-DESERT",
+        "JD-ABRAXAS-EMBER",
+        "JD-ABRAXAS-PARIS"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.772900+00:00"
+    },
+    "Hand Crafted": {
+      "n": 45,
+      "aliases": [
+        "HAND CRAFTED"
+      ],
+      "alias_re": "HAND\\s*CRAFTED",
+      "prefixes": {},
+      "numeric_share": 0.98,
+      "common_len": 5,
+      "examples": [
+        "50401",
+        "50402",
+        "50403",
+        "50404",
+        "50405",
+        "50406"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.773239+00:00"
+    },
+    "Newwall": {
+      "n": 62,
+      "aliases": [
+        "NEWWALL"
+      ],
+      "alias_re": "NEWWALL",
+      "prefixes": {
+        "A": 46
+      },
+      "numeric_share": 0.26,
+      "common_len": 6,
+      "examples": [
+        "2200-1",
+        "2200-2",
+        "2200-4",
+        "2200-5",
+        "2200-6",
+        "2200-7"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.773439+00:00"
+    },
+    "Fentucci Fabrics": {
+      "n": 8,
+      "aliases": [
+        "FENTUCCI FABRICS"
+      ],
+      "alias_re": "FENTUCCI\\s*FABRICS",
+      "prefixes": {
+        "TRUE": 367
+      },
+      "numeric_share": 0.03,
+      "common_len": 4,
+      "examples": [
+        "67317",
+        "67326",
+        "67330",
+        "67331",
+        "67336",
+        "67340"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.774547+00:00"
+    },
+    "Sister Parish": {
+      "n": 144,
+      "aliases": [
+        "SISTER PARISH"
+      ],
+      "alias_re": "SISTER\\s*PARISH",
+      "prefixes": {
+        "DWPH": 144
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "DWPH-10001",
+        "DWPH-10001-S",
+        "DWPH-10002",
+        "DWPH-10002-S",
+        "DWPH-10003",
+        "DWPH-10003-S"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.774888+00:00"
+    },
+    "Baker Lifestyle": {
+      "n": 5,
+      "aliases": [
+        "BAKER LIFESTYLE"
+      ],
+      "alias_re": "BAKER\\s*LIFESTYLE",
+      "prefixes": {
+        "PW": 9
+      },
+      "numeric_share": 0,
+      "common_len": 11,
+      "examples": [
+        "PW78000.5",
+        "PW78025.3",
+        "PW78033.5.0",
+        "PW78034.3.0",
+        "PW78034.5.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.774929+00:00"
+    },
+    "Harlequin": {
+      "n": 584,
+      "aliases": [
+        "HARLEQUIN"
+      ],
+      "alias_re": "HARLEQUIN",
+      "prefixes": {},
+      "numeric_share": 0.94,
+      "common_len": 6,
+      "examples": [
+        "110101",
+        "110104",
+        "110108",
+        "110367",
+        "110379",
+        "110556"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.777079+00:00"
+    },
+    "Kravet": {
+      "n": 4846,
+      "aliases": [
+        "KRAVET"
+      ],
+      "alias_re": "KRAVET",
+      "prefixes": {
+        "W": 4357,
+        "TP": 448
+      },
+      "numeric_share": 0.05,
+      "common_len": 9,
+      "examples": [
+        "2002172.16.0",
+        "2012175.11.0",
+        "2017119.40.0",
+        "2019105.134.0",
+        "2019153.133.0",
+        "23956.101.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.796971+00:00"
+    },
+    "Ralph Lauren": {
+      "n": 158,
+      "aliases": [
+        "RALPH LAUREN"
+      ],
+      "alias_re": "RALPH\\s*LAUREN",
+      "prefixes": {
+        "PRL": 242,
+        "FRL": 194
+      },
+      "numeric_share": 0.01,
+      "common_len": 7,
+      "examples": [
+        "19779",
+        "20132",
+        "48780",
+        "FRL009",
+        "FRL118",
+        "FRL123"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.798572+00:00"
+    },
+    "Flavor Paper": {
+      "n": 57,
+      "aliases": [
+        "FLAVOR PAPER"
+      ],
+      "alias_re": "FLAVOR\\s*PAPER",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 6,
+      "examples": [
+        "302001",
+        "302002",
+        "302004",
+        "302005",
+        "302006",
+        "302007"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.798827+00:00"
+    },
+    "Phyllis Morris": {
+      "n": 8,
+      "aliases": [
+        "PHYLLIS MORRIS"
+      ],
+      "alias_re": "PHYLLIS\\s*MORRIS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "75900",
+        "75905",
+        "75906",
+        "75910",
+        "75917",
+        "75922"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.798893+00:00"
+    },
+    "DW Bespoke Studio": {
+      "n": 100,
+      "aliases": [
+        "DW BESPOKE STUDIO"
+      ],
+      "alias_re": "BESPOKE\\s*STUDIO",
+      "prefixes": {
+        "DIG": 166,
+        "TRUE": 100,
+        "DIGITALPRINTONCORK": 14
+      },
+      "numeric_share": 0.06,
+      "common_len": 4,
+      "examples": [
+        "16457",
+        "16458",
+        "1800SGREENGOLDLEAFCREST.JPG",
+        "2023",
+        "60088",
+        "62108"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.817055+00:00"
+    },
+    "GP & J Baker": {
+      "n": 1885,
+      "aliases": [
+        "GP & J BAKER"
+      ],
+      "alias_re": "BAKER",
+      "prefixes": {
+        "BF": 949,
+        "BP": 504,
+        "PF": 329,
+        "BW": 272,
+        "PP": 114
+      },
+      "numeric_share": 0,
+      "common_len": 11,
+      "examples": [
+        "ALDINE_PLUM",
+        "B0860.1.0",
+        "BF10010_1",
+        "BF10010_3",
+        "BF10014_450",
+        "BF10036_990"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.824367+00:00"
+    },
+    "Designtex": {
+      "n": 351,
+      "aliases": [
+        "DESIGNTEX"
+      ],
+      "alias_re": "DESIGNTEX",
+      "prefixes": {},
+      "numeric_share": 0.76,
+      "common_len": 7,
+      "examples": [
+        "2693103",
+        "2693105",
+        "2693106",
+        "2693301",
+        "2693302",
+        "2693304"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.825431+00:00"
+    },
+    "Scalamandre Wallpaper": {
+      "n": 819,
+      "aliases": [
+        "SCALAMANDRE WALLPAPER"
+      ],
+      "alias_re": "SCALAMANDRE\\s*WALLPAPER",
+      "prefixes": {
+        "WP": 781,
+        "WRK": 195,
+        "WTT": 189,
+        "WH": 113,
+        "WTW": 70
+      },
+      "numeric_share": 0.05,
+      "common_len": 7,
+      "examples": [
+        "0001G1183",
+        "0001G1184",
+        "0001G1185",
+        "0001G1186",
+        "0001G1188",
+        "0001G1189"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.829151+00:00"
+    },
+    "Missoni Home": {
+      "n": 3,
+      "aliases": [
+        "MISSONI HOME"
+      ],
+      "alias_re": "MISSONI\\s*HOME",
+      "prefixes": {
+        "MIS": 3
+      },
+      "numeric_share": 0,
+      "common_len": 9,
+      "examples": [
+        "MIS-18312",
+        "MIS-18358",
+        "MIS-18378"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.829193+00:00"
+    },
+    "Franquemont London": {
+      "n": 26,
+      "aliases": [
+        "FRANQUEMONT LONDON"
+      ],
+      "alias_re": "FRANQUEMONT\\s*LONDON",
+      "prefixes": {
+        "JAVA": 22,
+        "VINE": 14,
+        "VERSTER": 10,
+        "FLORAL": 4
+      },
+      "numeric_share": 0,
+      "common_len": 15,
+      "examples": [
+        "FLORAL-STRIPE-MIDNIGHT-TRUFFLE",
+        "FLORAL-ZIGZAG-SLATE-BLUE",
+        "JAVA-ARCTIC",
+        "JAVA-BLUSH",
+        "JAVA-BURNT-ORANGE",
+        "JAVA-GLOWING-EMBER"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.829333+00:00"
+    },
+    "FallingStar Studio": {
+      "n": 21,
+      "aliases": [
+        "FALLINGSTAR STUDIO"
+      ],
+      "alias_re": "FALLINGSTAR\\s*STUDIO",
+      "prefixes": {
+        "FS": 20
+      },
+      "numeric_share": 0,
+      "common_len": 14,
+      "examples": [
+        "DWRA-1001",
+        "FS-DP-W1006-04",
+        "FS-DP-W1006-05",
+        "FS-DP-W1007-01",
+        "FS-DP-W1007-02",
+        "FS-DP-W1007-03"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.829434+00:00"
+    },
+    "Holly Hunt Walls": {
+      "n": 770,
+      "aliases": [
+        "HOLLY HUNT WALLS"
+      ],
+      "alias_re": "HOLLY\\s*HUNT\\s*WALLS",
+      "prefixes": {
+        "W": 654
+      },
+      "numeric_share": 0.32,
+      "common_len": 6,
+      "examples": [
+        "800001",
+        "800002",
+        "800004",
+        "800005",
+        "800006",
+        "800007"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.833408+00:00"
+    },
+    "Limited Stock": {
+      "n": 122,
+      "aliases": [
+        "LIMITED STOCK"
+      ],
+      "alias_re": "LIMITED\\s*STOCK",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "75600",
+        "75601",
+        "75602",
+        "75603",
+        "75604",
+        "75605"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.833922+00:00"
+    },
+    "Missoni Wallpaper": {
+      "n": 112,
+      "aliases": [
+        "MISSONI WALLPAPER"
+      ],
+      "alias_re": "MISSONI\\s*WALLPAPER",
+      "prefixes": {
+        "MI": 25,
+        "YORK": 14
+      },
+      "numeric_share": 0.66,
+      "common_len": 5,
+      "examples": [
+        "13500",
+        "13501",
+        "13502",
+        "13504",
+        "13505",
+        "13506"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.834366+00:00"
+    },
+    "Romo": {
+      "n": 295,
+      "aliases": [
+        "ROMO"
+      ],
+      "alias_re": "ROMO",
+      "prefixes": {
+        "W": 618,
+        "MW": 229,
+        "ZW": 70,
+        "WK": 52
+      },
+      "numeric_share": 0,
+      "common_len": 4,
+      "examples": [
+        "02FP",
+        "03FP",
+        "MW100",
+        "MW101",
+        "MW102",
+        "MW103"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.837501+00:00"
+    },
+    "Ronald Redding": {
+      "n": 514,
+      "aliases": [
+        "RONALD REDDING"
+      ],
+      "alias_re": "RONALD\\s*REDDING",
+      "prefixes": {
+        "RRD": 82,
+        "AC": 82,
+        "GV": 82,
+        "NZ": 45,
+        "ZA": 40,
+        "KT": 38,
+        "MX": 36
+      },
+      "numeric_share": 0.2,
+      "common_len": 6,
+      "examples": [
+        "5804",
+        "5851",
+        "5855",
+        "5873",
+        "66100",
+        "66102"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.839568+00:00"
+    },
+    "Nicolette Mayer Wallpaper": {
+      "n": 156,
+      "aliases": [
+        "NICOLETTE MAYER WALLPAPER"
+      ],
+      "alias_re": "NICOLETTE\\s*MAYER\\s*WALLPAPER",
+      "prefixes": {
+        "WNM": 151
+      },
+      "numeric_share": 0,
+      "common_len": 11,
+      "examples": [
+        "ARCADIA-NICOLETTE-MAYER-WALLPAPER",
+        "WNM0001BLOM",
+        "WNM0001BLOO",
+        "WNM0001BOSP",
+        "WNM0001BOUD",
+        "WNM0001CMAI"
+      ],
+      "private_label": true,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.840110+00:00"
+    },
+    "Nobilis": {
+      "n": 176,
+      "aliases": [
+        "NOBILIS"
+      ],
+      "alias_re": "NOBILIS",
+      "prefixes": {
+        "COS": 38,
+        "PBS": 36,
+        "PAN": 24,
+        "GRD": 22,
+        "MAP": 18,
+        "MHP": 18,
+        "QNT": 16
+      },
+      "numeric_share": 0,
+      "common_len": 5,
+      "examples": [
+        "ABA33",
+        "ABS44",
+        "ABS54",
+        "ABS82",
+        "ARC10",
+        "ARC23"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.840961+00:00"
+    },
+    "Phillip Jeffries": {
+      "n": 3456,
+      "aliases": [
+        "PHILLIP JEFFRIES"
+      ],
+      "alias_re": "PHILLIP\\s*JEFFRIES",
+      "prefixes": {
+        "DWJP": 465
+      },
+      "numeric_share": 0.91,
+      "common_len": 4,
+      "examples": [
+        "10000",
+        "10001",
+        "10002",
+        "10003",
+        "10004",
+        "10005"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.850492+00:00"
+    },
+    "Zeuxis Parrhasius Europe": {
+      "n": 25,
+      "aliases": [
+        "ZEUXIS PARRHASIUS EUROPE"
+      ],
+      "alias_re": "ZEUXIS\\s*PARRHASIUS\\s*EUROPE",
+      "prefixes": {
+        "ZEU": 25
+      },
+      "numeric_share": 0,
+      "common_len": 9,
+      "examples": [
+        "ZEU-34007",
+        "ZEU-34008",
+        "ZEU-34014",
+        "ZEU-34023",
+        "ZEU-34025",
+        "ZEU-34028"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.850620+00:00"
+    },
+    "Quadrille": {
+      "n": 42,
+      "aliases": [
+        "QUADRILLE"
+      ],
+      "alias_re": "QUADRILLE",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 10,
+      "examples": [
+        "303300F-00",
+        "303300F-03",
+        "303300F-05",
+        "303300F-09",
+        "303300F-11",
+        "304250F-24"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.850778+00:00"
+    },
+    "Graduate Collection UK": {
+      "n": 34,
+      "aliases": [
+        "GRADUATE COLLECTION UK"
+      ],
+      "alias_re": "GRADUATE\\s*COLLECTION",
+      "prefixes": {
+        "COPY": 9,
+        "VISITORIAN": 4,
+        "AB": 4,
+        "SAVANNAH": 3,
+        "STAG": 3,
+        "LH": 3
+      },
+      "numeric_share": 0,
+      "common_len": 22,
+      "examples": [
+        "AB1LEOAUB",
+        "AB1LEOBROWN",
+        "COPY-OF-ALL-OVER-LEOPARD-BLUE",
+        "COPY-OF-ALL-OVER-LEOPARD-CHARCOAL",
+        "COPY-OF-DACHSHUND-NATURAL",
+        "COPY-OF-DIPPED-IN-MOONLIGHT-CHARCOAL"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.850941+00:00"
+    },
+    "York Contract": {
+      "n": 137,
+      "aliases": [
+        "YORK CONTRACT"
+      ],
+      "alias_re": "YORK\\s*CONTRACT",
+      "prefixes": {
+        "MRE": 154,
+        "SG": 16,
+        "MCD": 16,
+        "BX": 12
+      },
+      "numeric_share": 0.24,
+      "common_len": 7,
+      "examples": [
+        "19-210",
+        "19-211",
+        "61-J01",
+        "61-J03",
+        "61-J04",
+        "61-J05"
+      ],
+      "private_label": true,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.851515+00:00"
+    },
+    "Fabricut": {
+      "n": 46,
+      "aliases": [
+        "FABRICUT"
+      ],
+      "alias_re": "FABRICUT",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 7,
+      "examples": [
+        "2112503",
+        "2112506",
+        "2112706",
+        "2566001",
+        "2566003",
+        "2566004"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.851666+00:00"
+    },
+    "Marimekko Exclusive": {
+      "n": 36,
+      "aliases": [
+        "MARIMEKKO EXCLUSIVE"
+      ],
+      "alias_re": "MARIMEKKO\\s*EXCLUSIVE",
+      "prefixes": {
+        "DWC": 36
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "DWC-14100X",
+        "DWC-14105X",
+        "DWC-14106X",
+        "DWC-23300X",
+        "DWC-23305X",
+        "DWC-23306X"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.851760+00:00"
+    },
+    "Tres Tintas": {
+      "n": 14,
+      "aliases": [
+        "TRES TINTAS"
+      ],
+      "alias_re": "TRES\\s*TINTAS",
+      "prefixes": {
+        "M": 20
+      },
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "JO2703-2",
+        "M2503-1",
+        "M2503-2",
+        "M2506-1",
+        "M2506-2",
+        "M2510-1"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.852381+00:00"
+    },
+    "Fentucci Naturals": {
+      "n": 148,
+      "aliases": [
+        "FENTUCCI NATURALS"
+      ],
+      "alias_re": "FENTUCCI\\s*NATURALS",
+      "prefixes": {
+        "TW": 54,
+        "TSJ": 38,
+        "SG": 28,
+        "MD": 20,
+        "BA": 18,
+        "HBD": 16,
+        "C": 14,
+        "EG": 14
+      },
+      "numeric_share": 0.03,
+      "common_len": 7,
+      "examples": [
+        "20232-27",
+        "20232-30",
+        "20232-31",
+        "6863-44",
+        "6863-52",
+        "BA206"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.853180+00:00"
+    },
+    "Fentucci Wallpaper": {
+      "n": 6,
+      "aliases": [
+        "FENTUCCI WALLPAPER"
+      ],
+      "alias_re": "FENTUCCI\\s*WALLPAPER",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "10113",
+        "10114",
+        "10119",
+        "39935",
+        "39936",
+        "43499"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.853220+00:00"
+    },
+    "Mulberry": {
+      "n": 482,
+      "aliases": [
+        "MULBERRY"
+      ],
+      "alias_re": "MULBERRY",
+      "prefixes": {
+        "FD": 316,
+        "FG": 259
+      },
+      "numeric_share": 0,
+      "common_len": 12,
+      "examples": [
+        "584.A127.0",
+        "ASPENDEVORE_OFFWHI",
+        "BREEZYCHECK_SOFTGO",
+        "CHA.0",
+        "CHALETSHEER_MILK",
+        "FADEDCHEQUERS_BISCUIT"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.855054+00:00"
+    },
+    "York": {
+      "n": 75,
+      "aliases": [
+        "YORK"
+      ],
+      "alias_re": "YORK",
+      "prefixes": {
+        "OG": 12,
+        "MH": 12,
+        "AF": 10,
+        "Y": 8,
+        "CI": 8,
+        "BW": 8,
+        "DM": 8,
+        "DI": 8
+      },
+      "numeric_share": 0.05,
+      "common_len": 6,
+      "examples": [
+        "2823-6247",
+        "2824-6244",
+        "331593",
+        "488-31249",
+        "AC9132",
+        "AF1908"
+      ],
+      "private_label": true,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.855415+00:00"
+    },
+    "Telefina Fine Fabrics": {
+      "n": 64,
+      "aliases": [
+        "TELEFINA FINE FABRICS"
+      ],
+      "alias_re": "TELEFINA\\s*FINE\\s*FABRICS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 7,
+      "examples": [
+        "1001871",
+        "1001872",
+        "1001873",
+        "1001874",
+        "1001875",
+        "1001876"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.855689+00:00"
+    },
+    "Alan Campbell": {
+      "n": 36,
+      "aliases": [
+        "ALAN CAMPBELL"
+      ],
+      "alias_re": "ALAN\\s*CAMPBELL",
+      "prefixes": {
+        "AC": 72
+      },
+      "numeric_share": 0,
+      "common_len": 8,
+      "examples": [
+        "AC122-01",
+        "AC122-02",
+        "AC122-04",
+        "AC122-05",
+        "AC850-00",
+        "AC850-01"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.855857+00:00"
+    },
+    "Holland and Sherry": {
+      "n": 3,
+      "aliases": [
+        "HOLLAND AND SHERRY"
+      ],
+      "alias_re": "HOLLAND\\s*AND\\s*SHERRY",
+      "prefixes": {},
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "DE13458",
+        "DE13465",
+        "WP1038"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.855892+00:00"
+    },
+    "Schumacher": {
+      "n": 2252,
+      "aliases": [
+        "SCHUMACHER"
+      ],
+      "alias_re": "SCHUMACHER",
+      "prefixes": {},
+      "numeric_share": 0.72,
+      "common_len": 7,
+      "examples": [
+        "1450",
+        "1451",
+        "1452",
+        "1453",
+        "1454",
+        "1456"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.866878+00:00"
+    },
+    "Lee Jofa": {
+      "n": 3666,
+      "aliases": [
+        "LEE JOFA"
+      ],
+      "alias_re": "LEE\\s*JOFA",
+      "prefixes": {
+        "GWF": 774,
+        "P": 410,
+        "BFC": 391,
+        "TL": 302,
+        "GWP": 213
+      },
+      "numeric_share": 0.53,
+      "common_len": 13,
+      "examples": [
+        "2000162.23.0",
+        "2000163.23.0",
+        "2001150_1",
+        "2001154_12",
+        "2001180_4",
+        "2001199_3"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.880609+00:00"
+    },
+    "Thibaut": {
+      "n": 3742,
+      "aliases": [
+        "THIBAUT"
+      ],
+      "alias_re": "THIBAUT",
+      "prefixes": {
+        "T": 6279,
+        "AT": 417
+      },
+      "numeric_share": 0.01,
+      "common_len": 6,
+      "examples": [
+        "9010",
+        "9012",
+        "9020",
+        "9022",
+        "9055",
+        "9070"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.898246+00:00"
+    },
+    "Caroline Cecil Textiles": {
+      "n": 3,
+      "aliases": [
+        "CAROLINE CECIL TEXTILES"
+      ],
+      "alias_re": "CAROLINE\\s*CECIL\\s*TEXTILES",
+      "prefixes": {
+        "CCP": 6
+      },
+      "numeric_share": 0,
+      "common_len": 13,
+      "examples": [
+        "CCP-2346.16.0",
+        "CCP-2347.16.0",
+        "CCP-2348.11.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.898375+00:00"
+    },
+    "Madagascar Walls": {
+      "n": 16,
+      "aliases": [
+        "MADAGASCAR WALLS"
+      ],
+      "alias_re": "MADAGASCAR\\s*WALLS",
+      "prefixes": {
+        "FD": 7
+      },
+      "numeric_share": 0.5,
+      "common_len": 5,
+      "examples": [
+        "14011",
+        "73091",
+        "73093",
+        "73095",
+        "73100",
+        "73101"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.898557+00:00"
+    },
+    "British Walls": {
+      "n": 495,
+      "aliases": [
+        "BRITISH WALLS"
+      ],
+      "alias_re": "BRITISH\\s*WALLS",
+      "prefixes": {
+        "ALA": 61,
+        "SAINT": 40,
+        "PLACE": 33,
+        "NAKURA": 31
+      },
+      "numeric_share": 0,
+      "common_len": 39,
+      "examples": [
+        "42841",
+        "ALA-FERRARA-WALLPAPER-ELE-42837",
+        "ALA-FERRARA-WALLPAPER-ELE-42838",
+        "ALA-FERRARA-WALLPAPER-ELE-42839",
+        "ALA-FERRARA-WALLPAPER-ELE-42840",
+        "ALA-MESSINA-WALLPAPER-ELE-42805"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.901170+00:00"
+    },
+    "Hygge & West": {
+      "n": 11,
+      "aliases": [
+        "HYGGE & WEST"
+      ],
+      "alias_re": "HYGGE\\s*WEST",
+      "prefixes": {
+        "BACK": 4,
+        "JAWS": 3
+      },
+      "numeric_share": 0,
+      "common_len": 44,
+      "examples": [
+        "BACK-TO-THE-FUTURE-HILL-VALLEY-WALLPAPER-BLACK",
+        "BACK-TO-THE-FUTURE-HILL-VALLEY-WALLPAPER-DENIM",
+        "BACK-TO-THE-FUTURE-HILL-VALLEY-WALLPAPER-RED",
+        "BACK-TO-THE-FUTURE-HILL-VALLEY-WALLPAPER-SKY",
+        "COPY-OF-JAWS-AMITY-WALLPAPER-INDIGO",
+        "ET-BE-GOOD-WALLPAPER-DUSK"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.901245+00:00"
+    },
+    "Zeuxis Parrhasius at DW": {
+      "n": 5,
+      "aliases": [
+        "ZEUXIS PARRHASIUS AT DW"
+      ],
+      "alias_re": "ZEUXIS\\s*PARRHASIUS",
+      "prefixes": {
+        "ZEU": 5
+      },
+      "numeric_share": 0,
+      "common_len": 9,
+      "examples": [
+        "ZEU-34036",
+        "ZEU-34051",
+        "ZEU-34094",
+        "ZEU-34095",
+        "ZEU-34104"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.901270+00:00"
+    },
+    "Fentucci Naturals Walls": {
+      "n": 38,
+      "aliases": [
+        "FENTUCCI NATURALS WALLS"
+      ],
+      "alias_re": "FENTUCCI\\s*NATURALS\\s*WALLS",
+      "prefixes": {
+        "LX": 38
+      },
+      "numeric_share": 0,
+      "common_len": 6,
+      "examples": [
+        "LX1090",
+        "LX1091",
+        "LX1092",
+        "LX1093",
+        "LX1094",
+        "LX1095"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.901370+00:00"
+    },
+    "Ralph Lauren Fabric": {
+      "n": 218,
+      "aliases": [
+        "RALPH LAUREN FABRIC"
+      ],
+      "alias_re": "RALPH\\s*LAUREN\\s*FABRIC",
+      "prefixes": {
+        "RLDF": 415
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "LCF65064F",
+        "LCF65282F",
+        "LCF65812F",
+        "LCF65893F",
+        "LCF67346F",
+        "LCF67409F"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.902529+00:00"
+    },
+    "SUGARBOO": {
+      "n": 10,
+      "aliases": [
+        "SUGARBOO"
+      ],
+      "alias_re": "SUGARBOO",
+      "prefixes": {
+        "WP": 10
+      },
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "WP20270",
+        "WP20271",
+        "WP20272",
+        "WP20273",
+        "WP20274",
+        "WP20275"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.902582+00:00"
+    },
+    "PS Removable Wallpaper": {
+      "n": 737,
+      "aliases": [
+        "PS REMOVABLE WALLPAPER"
+      ],
+      "alias_re": "REMOVABLE\\s*WALLPAPER",
+      "prefixes": {
+        "NW": 515,
+        "LN": 79,
+        "SG": 77,
+        "HG": 47
+      },
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "AX10800",
+        "AX10900",
+        "AX10902",
+        "DB20100",
+        "DB20101",
+        "DB20102"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.904952+00:00"
+    },
+    "Traditional Whimsy": {
+      "n": 105,
+      "aliases": [
+        "TRADITIONAL WHIMSY"
+      ],
+      "alias_re": "TRADITIONAL\\s*WHIMSY",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "11360APUG'SLIFEMULTI",
+        "12380FLAMINGOLAKEDUCKEGGPINK",
+        "12381FLAMINGOLAKEGREYCORAL",
+        "12382FLAMINGOLAKEMIDNIGHTBLUE",
+        "37259",
+        "37260"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.905510+00:00"
+    },
+    "PR Faux Leather": {
+      "n": 188,
+      "aliases": [
+        "PR FAUX LEATHER"
+      ],
+      "alias_re": "FAUX\\s*LEATHER",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "40194",
+        "40195",
+        "40196",
+        "40197",
+        "40198",
+        "40199"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.906639+00:00"
+    },
+    "Osborne & Little Fabrics": {
+      "n": 1101,
+      "aliases": [
+        "OSBORNE & LITTLE FABRICS"
+      ],
+      "alias_re": "OSBORNE\\s*LITTLE\\s*FABRICS",
+      "prefixes": {
+        "OSB": 1101
+      },
+      "numeric_share": 0,
+      "common_len": 12,
+      "examples": [
+        "OSB-F6137",
+        "OSB-F6150-02",
+        "OSB-F6244-0146",
+        "OSB-F6681-10",
+        "OSB-F6681-11",
+        "OSB-F6681-12"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.909250+00:00"
+    },
+    "Luxury Murals": {
+      "n": 56,
+      "aliases": [
+        "LUXURY MURALS"
+      ],
+      "alias_re": "LUXURY\\s*MURALS",
+      "prefixes": {
+        "MUR": 56
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "MUR-200299",
+        "MUR-200399",
+        "MUR-200499",
+        "MUR-200599",
+        "MUR-200699",
+        "MUR-200799"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.909415+00:00"
+    },
+    "Marburg": {
+      "n": 119,
+      "aliases": [
+        "MARBURG"
+      ],
+      "alias_re": "MARBURG",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "32002",
+        "32003",
+        "32044",
+        "33701",
+        "33702",
+        "33703"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.909784+00:00"
+    },
+    "Malibu": {
+      "n": 3,
+      "aliases": [
+        "MALIBU"
+      ],
+      "alias_re": "MALIBU",
+      "prefixes": {},
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "CN31304-2",
+        "DA61204",
+        "JB20204"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.909802+00:00"
+    },
+    "Artmura": {
+      "n": 161,
+      "aliases": [
+        "ARTMURA"
+      ],
+      "alias_re": "ARTMURA",
+      "prefixes": {
+        "DWXW": 161
+      },
+      "numeric_share": 0,
+      "common_len": 12,
+      "examples": [
+        "DWXW-1005370",
+        "DWXW-1005371",
+        "DWXW-1005372",
+        "DWXW-1005373",
+        "DWXW-1005374",
+        "DWXW-1005375"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.910190+00:00"
+    },
+    "Hollywood Acoustical": {
+      "n": 50,
+      "aliases": [
+        "HOLLYWOOD ACOUSTICAL"
+      ],
+      "alias_re": "HOLLYWOOD\\s*ACOUSTICAL",
+      "prefixes": {
+        "XPV": 23,
+        "XKL": 9,
+        "XJZ": 8,
+        "XKU": 5,
+        "ACT": 4
+      },
+      "numeric_share": 0,
+      "common_len": 9,
+      "examples": [
+        "ACT-73255",
+        "ACT-73256",
+        "ACT-73260",
+        "ACT-73261",
+        "XJZ-47385",
+        "XJZ-47386"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.910316+00:00"
+    },
+    "Arte International": {
+      "n": 530,
+      "aliases": [
+        "ARTE INTERNATIONAL"
+      ],
+      "alias_re": "ARTE\\s*INTERNATIONAL",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "11530",
+        "11531",
+        "15711",
+        "15712",
+        "18300",
+        "18301"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.912319+00:00"
+    },
+    "Glass Beaded": {
+      "n": 34,
+      "aliases": [
+        "GLASS BEADED"
+      ],
+      "alias_re": "GLASS\\s*BEADED",
+      "prefixes": {
+        "L": 5,
+        "J": 3
+      },
+      "numeric_share": 0.81,
+      "common_len": 5,
+      "examples": [
+        "16500",
+        "16501",
+        "16502",
+        "16503",
+        "16504",
+        "16505"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.912539+00:00"
+    },
+    "Nina Campbell Wallcoverings": {
+      "n": 111,
+      "aliases": [
+        "NINA CAMPBELL WALLCOVERINGS"
+      ],
+      "alias_re": "NINA\\s*CAMPBELL\\s*WALLCOVERINGS",
+      "prefixes": {
+        "DWC": 111
+      },
+      "numeric_share": 0,
+      "common_len": 14,
+      "examples": [
+        "DWC-NCF4280-02",
+        "DWC-NCF4280-03",
+        "DWC-NCF4280-04",
+        "DWC-NCF4280-05",
+        "DWC-NCF4280-06",
+        "DWC-NCF4281-01"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.912819+00:00"
+    },
+    "Bespoke": {
+      "n": 631,
+      "aliases": [
+        "BESPOKE"
+      ],
+      "alias_re": "BESPOKE",
+      "prefixes": {
+        "DIG": 1142
+      },
+      "numeric_share": 0,
+      "common_len": 16,
+      "examples": [
+        "BOOK-3001",
+        "BOOK-3002",
+        "CUSTOM-001",
+        "CUSTOM-002",
+        "CUSTOM-003",
+        "CUSTOMDIGITALFABRIC-SAMPLE"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.915899+00:00"
+    },
+    "Scalamandre": {
+      "n": 244,
+      "aliases": [
+        "SCALAMANDRE"
+      ],
+      "alias_re": "SCALAMANDRE",
+      "prefixes": {
+        "CH": 172,
+        "H": 164,
+        "A": 84,
+        "B": 22
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "90001",
+        "A91968-003",
+        "A91969-003",
+        "A91971-003",
+        "A91972-003",
+        "A91973-003"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.918114+00:00"
+    },
+    "Florence Broadhurst": {
+      "n": 25,
+      "aliases": [
+        "FLORENCE BROADHURST"
+      ],
+      "alias_re": "FLORENCE\\s*BROADHURST",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "28031",
+        "28032",
+        "28033",
+        "28034",
+        "28035",
+        "28036"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.918233+00:00"
+    },
+    "Grasscloth": {
+      "n": 5,
+      "aliases": [
+        "GRASSCLOTH"
+      ],
+      "alias_re": "GRASSCLOTH",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 14,
+      "examples": [
+        "303815G-04GRAS",
+        "303815G-05GRAS",
+        "303815G-06GRAS",
+        "303815G-10GRAS",
+        "303815G-15GRAS"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.918260+00:00"
+    },
+    "Suncloth": {
+      "n": 36,
+      "aliases": [
+        "SUNCLOTH"
+      ],
+      "alias_re": "SUNCLOTH",
+      "prefixes": {
+        "AC": 72
+      },
+      "numeric_share": 0,
+      "common_len": 11,
+      "examples": [
+        "AC302-13SUN",
+        "AC302-15SUN",
+        "AC302-16SUN",
+        "AC302-16WSUN",
+        "AC302-17WSUN",
+        "AC302-32WSUN"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.918431+00:00"
+    },
+    "NLXL": {
+      "n": 9,
+      "aliases": [
+        "NLXL"
+      ],
+      "alias_re": "NLXL",
+      "prefixes": {
+        "MRV": 6
+      },
+      "numeric_share": 0.67,
+      "common_len": 7,
+      "examples": [
+        "1001705",
+        "1001706",
+        "1001707",
+        "1001712",
+        "1001739",
+        "1001830"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.918485+00:00"
+    },
+    "Carlisle & Co. Walls": {
+      "n": 442,
+      "aliases": [
+        "CARLISLE & CO. WALLS"
+      ],
+      "alias_re": "CARLISLE\\s*WALLS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 6,
+      "examples": [
+        "805001",
+        "805002",
+        "805003",
+        "805004",
+        "805005",
+        "805006"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.919876+00:00"
+    },
+    "Zinc Textile": {
+      "n": 3,
+      "aliases": [
+        "ZINC TEXTILE"
+      ],
+      "alias_re": "ZINC\\s*TEXTILE",
+      "prefixes": {
+        "W": 3
+      },
+      "numeric_share": 0,
+      "common_len": 4,
+      "examples": [
+        "W144",
+        "W146",
+        "ZW135"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.919906+00:00"
+    },
+    "Charles Burger": {
+      "n": 36,
+      "aliases": [
+        "CHARLES BURGER"
+      ],
+      "alias_re": "CHARLES\\s*BURGER",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 7,
+      "examples": [
+        "1208-001",
+        "1208-009",
+        "1208-011",
+        "1208-013",
+        "1238",
+        "1716-01"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.920032+00:00"
+    },
+    "Natural Paint": {
+      "n": 26,
+      "aliases": [
+        "NATURAL PAINT"
+      ],
+      "alias_re": "NATURAL\\s*PAINT",
+      "prefixes": {
+        "NCR": 26
+      },
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "NCR-100",
+        "NCR-102",
+        "NCR-1025",
+        "NCR-104",
+        "NCR-105",
+        "NCR-106"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.920107+00:00"
+    },
+    "Retro Walls": {
+      "n": 938,
+      "aliases": [
+        "RETRO WALLS"
+      ],
+      "alias_re": "RETRO\\s*WALLS",
+      "prefixes": {
+        "TRUE": 945
+      },
+      "numeric_share": 0.5,
+      "common_len": 4,
+      "examples": [
+        "106393",
+        "30331",
+        "332201",
+        "332208",
+        "332209",
+        "332214"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.925820+00:00"
+    },
+    "Mid Century Modern": {
+      "n": 6,
+      "aliases": [
+        "MID CENTURY MODERN"
+      ],
+      "alias_re": "MID\\s*CENTURY\\s*MODERN",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 6,
+      "examples": [
+        "820001",
+        "820002",
+        "820003",
+        "820004",
+        "820006",
+        "820007"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.925992+00:00"
+    },
+    "Clarke And Clarke": {
+      "n": 846,
+      "aliases": [
+        "CLARKE AND CLARKE"
+      ],
+      "alias_re": "CLARKE\\s*AND\\s*CLARKE",
+      "prefixes": {
+        "F": 3542,
+        "W": 382
+      },
+      "numeric_share": 0.5,
+      "common_len": 5,
+      "examples": [
+        "01.CAC.0",
+        "02.CAC.0",
+        "03.CAC.0",
+        "04.CAC.0",
+        "05.CAC.0",
+        "06.CAC.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.944667+00:00"
+    },
+    "Steve Abrams Studios": {
+      "n": 509,
+      "aliases": [
+        "STEVE ABRAMS STUDIOS"
+      ],
+      "alias_re": "STEVE\\s*ABRAMS\\s*STUDIOS",
+      "prefixes": {
+        "ARTWORKID": 468
+      },
+      "numeric_share": 0.44,
+      "common_len": 7,
+      "examples": [
+        "11920433516380454476",
+        "13282691209491780458",
+        "14043440517780191149",
+        "16345310375004124922",
+        "17720673451185294920",
+        "21058139638669983550"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.948009+00:00"
+    },
+    "Nina Campbell": {
+      "n": 554,
+      "aliases": [
+        "NINA CAMPBELL"
+      ],
+      "alias_re": "NINA\\s*CAMPBELL",
+      "prefixes": {
+        "NCW": 865,
+        "NCF": 268
+      },
+      "numeric_share": 0.15,
+      "common_len": 10,
+      "examples": [
+        "1001322",
+        "1001323",
+        "1001324",
+        "1001325",
+        "1001326",
+        "1001327"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.951529+00:00"
+    },
+    "Peel and Stick": {
+      "n": 92,
+      "aliases": [
+        "PEEL AND STICK"
+      ],
+      "alias_re": "PEEL\\s*AND\\s*STICK",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "83500",
+        "83501",
+        "83502",
+        "83503",
+        "83504",
+        "83505"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.951951+00:00"
+    },
+    "Andrew Martin": {
+      "n": 7,
+      "aliases": [
+        "ANDREW MARTIN"
+      ],
+      "alias_re": "ANDREW\\s*MARTIN",
+      "prefixes": {
+        "AM": 4
+      },
+      "numeric_share": 0.15,
+      "common_len": 5,
+      "examples": [
+        "10055",
+        "AM100329.13.0",
+        "AM100444.15.0",
+        "AMW10001.1611.0",
+        "GOING-TO-THE-LIBRARY-COCOA-AMA",
+        "KKMYLA"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.952000+00:00"
+    },
+    "Armani Casa": {
+      "n": 3,
+      "aliases": [
+        "ARMANI CASA"
+      ],
+      "alias_re": "ARMANI\\s*CASA",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "93322",
+        "9612_CAPRI_ANTRACITE_LQ_2",
+        "9613_CAPRI_ORO-LIME-NERO_LQ"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.952229+00:00"
+    },
+    "Trikes-DL Couch-Eykon-Tower": {
+      "n": 807,
+      "aliases": [
+        "TRIKES-DL COUCH-EYKON-TOWER"
+      ],
+      "alias_re": "TRIKES\\s*COUCH\\s*EYKON\\s*TOWER",
+      "prefixes": {
+        "XTW": 807
+      },
+      "numeric_share": 0,
+      "common_len": 19,
+      "examples": [
+        "XTW-989020-T2-AL-01-1",
+        "XTW-989023-T2-AL-02",
+        "XTW-989024-T2-AL-03",
+        "XTW-989025-T2-AL-04",
+        "XTW-989026-T2-AL-05",
+        "XTW-989027-T2-AL-06"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.954232+00:00"
+    },
+    "Anna French": {
+      "n": 714,
+      "aliases": [
+        "ANNA FRENCH"
+      ],
+      "alias_re": "ANNA\\s*FRENCH",
+      "prefixes": {
+        "AT": 1236,
+        "AF": 197
+      },
+      "numeric_share": 0.09,
+      "common_len": 7,
+      "examples": [
+        "73500",
+        "73501",
+        "73502",
+        "73503",
+        "73504",
+        "73505"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.958568+00:00"
+    },
+    "Glambeads by DW": {
+      "n": 11,
+      "aliases": [
+        "GLAMBEADS BY DW"
+      ],
+      "alias_re": "GLAMBEADS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "20001",
+        "20002",
+        "20003",
+        "20004",
+        "20005",
+        "20006"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.958696+00:00"
+    },
+    "Novasuede": {
+      "n": 169,
+      "aliases": [
+        "NOVASUEDE"
+      ],
+      "alias_re": "NOVASUEDE",
+      "prefixes": {
+        "NOVASUEDE": 262
+      },
+      "numeric_share": 0,
+      "common_len": 16,
+      "examples": [
+        "AMBER(T3Q8W)",
+        "BLANKSLATE(T3L0W)",
+        "BLISS(T3Q7W)",
+        "BLUSHROSE(T3RFW)",
+        "CEMENT(T3LAW)",
+        "COLONIALBLUE(T3C9W)"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.960355+00:00"
+    },
+    "Jeffrey Stevens": {
+      "n": 4246,
+      "aliases": [
+        "JEFFREY STEVENS"
+      ],
+      "alias_re": "JEFFREY\\s*STEVENS",
+      "prefixes": {
+        "DWJS": 3889
+      },
+      "numeric_share": 0.19,
+      "common_len": 10,
+      "examples": [
+        "015398",
+        "148-32817",
+        "148-32818",
+        "148-32832",
+        "148-96292",
+        "148-96293"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.978909+00:00"
+    },
+    "Malibu Walls": {
+      "n": 115,
+      "aliases": [
+        "MALIBU WALLS"
+      ],
+      "alias_re": "MALIBU\\s*WALLS",
+      "prefixes": {},
+      "numeric_share": 0.97,
+      "common_len": 5,
+      "examples": [
+        "172A7EA62D678328BA2EFF9ECBF5D3A3",
+        "19119",
+        "19139",
+        "19159",
+        "19169",
+        "19179"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.979526+00:00"
+    },
+    "Paul Montgomery": {
+      "n": 80,
+      "aliases": [
+        "PAUL MONTGOMERY"
+      ],
+      "alias_re": "PAUL\\s*MONTGOMERY",
+      "prefixes": {
+        "DA": 47,
+        "OT": 17,
+        "MO": 9,
+        "NT": 4
+      },
+      "numeric_share": 0,
+      "common_len": 45,
+      "examples": [
+        "DA-AD1-BBANTIQUEDAMASK1ONSILVERSISALBLUEBEIGE",
+        "DA-AD1-BEANTIQUEDAMASK1ONSILVERSISALBLUEWHITE",
+        "DA-AD1-BGANTIQUEDAMASK1ONSILVERSISALBLUEGOLD",
+        "DA-AD1-BNANTIQUEDAMASK1ONSILVERSISALBLUEBROWN",
+        "DA-AD1-BRANTIQUEDAMASK1ONSILVERSISALBROWNGOLD",
+        "DA-AD1-BTANTIQUEDAMASK1ONSILVERSISALBLUETAUPE"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.979925+00:00"
+    },
+    "Osborne & Little": {
+      "n": 1016,
+      "aliases": [
+        "OSBORNE & LITTLE"
+      ],
+      "alias_re": "OSBORNE\\s*LITTLE",
+      "prefixes": {
+        "W": 972
+      },
+      "numeric_share": 0,
+      "common_len": 8,
+      "examples": [
+        "-02--METALLICSILVER",
+        "-03--",
+        "-04--METALLICGOLD",
+        "CRANESCREAMWALLPAPER",
+        "CW5410-08-QUARTZ-",
+        "CW5410-09-QUARTZ-"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.983211+00:00"
+    },
+    "Contrado": {
+      "n": 17,
+      "aliases": [
+        "CONTRADO"
+      ],
+      "alias_re": "CONTRADO",
+      "prefixes": {
+        "MENS": 8,
+        "LOAFER": 4,
+        "WOMENS": 4,
+        "KIKA": 4
+      },
+      "numeric_share": 0,
+      "common_len": 20,
+      "examples": [
+        "BEANIE",
+        "FLARED-SKIRT-3",
+        "HOLDALLS",
+        "KIKA-TOTE-4",
+        "KIKA-TOTE-5",
+        "LOAFER-ESPADRILLES-3"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.983644+00:00"
+    },
+    "AS Creation": {
+      "n": 449,
+      "aliases": [
+        "AS CREATION"
+      ],
+      "alias_re": "CREATION",
+      "prefixes": {
+        "AS": 770,
+        "DD": 223
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "AS143211-0",
+        "AS169020-0",
+        "AS184818-0",
+        "AS224064-0",
+        "AS251718-0",
+        "AS272355-0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:29.985860+00:00"
+    },
+    "Scalamandre Fabrics": {
+      "n": 8040,
+      "aliases": [
+        "SCALAMANDRE FABRICS"
+      ],
+      "alias_re": "SCALAMANDRE\\s*FABRICS",
+      "prefixes": {
+        "H": 4732,
+        "CH": 3733,
+        "A": 1592,
+        "B": 1546
+      },
+      "numeric_share": 0.01,
+      "common_len": 10,
+      "examples": [
+        "1098MM-001",
+        "1098MM-002",
+        "1098MM-004",
+        "1098MM-005",
+        "1098MM-006",
+        "1098MM-013",
+        "CH27148"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 1,
+      "updated_at": "2026-06-26T06:02:15.339Z"
+    },
+    "Armani/Casa": {
+      "n": 9,
+      "aliases": [
+        "ARMANI/CASA"
+      ],
+      "alias_re": "ARMANI\\s*CASA",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 4,
+      "examples": [
+        "9320",
+        "9322",
+        "9370",
+        "9371",
+        "9372",
+        "9373"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.021994+00:00"
+    },
+    "Plains": {
+      "n": 36,
+      "aliases": [
+        "PLAINS"
+      ],
+      "alias_re": "PLAINS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 7,
+      "examples": [
+        "009868T",
+        "009870T",
+        "009874T",
+        "009876T",
+        "009877T",
+        "010450T"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.022126+00:00"
+    },
+    "Vahallan": {
+      "n": 4,
+      "aliases": [
+        "VAHALLAN"
+      ],
+      "alias_re": "VAHALLAN",
+      "prefixes": {
+        "UNEARTHED": 3
+      },
+      "numeric_share": 0,
+      "common_len": 40,
+      "examples": [
+        "RHYTHM-FLUENT-WALLCOVERING-VAHALLAN",
+        "UNEARTHED-ROANOKE-WALLCOVERING-VAHALLAN",
+        "UNEARTHED-SALUDA-WALLCOVERING-VAHALLAN",
+        "UNEARTHED-WOODBURN-WALLCOVERING-VAHALLAN"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.022150+00:00"
+    },
+    "Wallpaper NYC": {
+      "n": 87,
+      "aliases": [
+        "WALLPAPER NYC"
+      ],
+      "alias_re": "WALLPAPER\\s*NYC",
+      "prefixes": {
+        "AT": 12
+      },
+      "numeric_share": 0.92,
+      "common_len": 5,
+      "examples": [
+        "56833",
+        "56834",
+        "56835",
+        "56836",
+        "56837",
+        "56838"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.022502+00:00"
+    },
+    "Daisy Bennett": {
+      "n": 70,
+      "aliases": [
+        "DAISY BENNETT"
+      ],
+      "alias_re": "DAISY\\s*BENNETT",
+      "prefixes": {
+        "DB": 19
+      },
+      "numeric_share": 0.83,
+      "common_len": 7,
+      "examples": [
+        "1001225",
+        "1001226",
+        "1001228",
+        "1001233",
+        "1001234",
+        "1001235"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.022820+00:00"
+    },
+    "Sandberg": {
+      "n": 980,
+      "aliases": [
+        "SANDBERG"
+      ],
+      "alias_re": "SANDBERG",
+      "prefixes": {
+        "P": 598,
+        "S": 150
+      },
+      "numeric_share": 0.41,
+      "common_len": 6,
+      "examples": [
+        "101-13",
+        "101-16",
+        "101-18",
+        "101-21",
+        "102-11",
+        "102-21"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.026931+00:00"
+    },
+    "DW Home": {
+      "n": 52,
+      "aliases": [
+        "DW HOME"
+      ],
+      "alias_re": "HOME",
+      "prefixes": {
+        "TRUE": 40
+      },
+      "numeric_share": 0.6,
+      "common_len": 5,
+      "examples": [
+        "49100",
+        "49102",
+        "49115",
+        "50201",
+        "50208",
+        "50209"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.027298+00:00"
+    },
+    "Versa Designed Surfaces": {
+      "n": 873,
+      "aliases": [
+        "VERSA DESIGNED SURFACES"
+      ],
+      "alias_re": "VERSA\\s*DESIGNED\\s*SURFACES",
+      "prefixes": {
+        "A": 913
+      },
+      "numeric_share": 0,
+      "common_len": 8,
+      "examples": [
+        "A119-038",
+        "A119-136",
+        "A119-198",
+        "A119-200",
+        "A119-231",
+        "A119-231-258"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.029381+00:00"
+    },
+    "Showroom Line": {
+      "n": 42,
+      "aliases": [
+        "SHOWROOM LINE"
+      ],
+      "alias_re": "SHOWROOM\\s*LINE",
+      "prefixes": {
+        "DWP": 7,
+        "DURALEE": 6,
+        "PIERREFREY": 6
+      },
+      "numeric_share": 0,
+      "common_len": 9,
+      "examples": [
+        "CARLTONV",
+        "CAROLEFABRICS",
+        "DURALEE-1",
+        "DURALEE-2",
+        "DURALEE-3",
+        "DURALEE-4"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.029534+00:00"
+    },
+    "Lincrusta": {
+      "n": 49,
+      "aliases": [
+        "LINCRUSTA"
+      ],
+      "alias_re": "LINCRUSTA",
+      "prefixes": {
+        "RD": 161,
+        "WM": 12,
+        "RDPRM": 8
+      },
+      "numeric_share": 0,
+      "common_len": 8,
+      "examples": [
+        "RD1583FR",
+        "RD1639FR",
+        "RD1640FR",
+        "RD1650FR",
+        "RD1805FR",
+        "RD1827FR"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.030057+00:00"
+    },
+    "Apartment Wallpaper": {
+      "n": 7,
+      "aliases": [
+        "APARTMENT WALLPAPER"
+      ],
+      "alias_re": "APARTMENT\\s*WALLPAPER",
+      "prefixes": {
+        "PSW": 14
+      },
+      "numeric_share": 0,
+      "common_len": 9,
+      "examples": [
+        "PSW1052RL",
+        "PSW1053RL",
+        "PSW1054RL",
+        "PSW1055RL",
+        "PSW1083RL",
+        "PSW1109RL"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.030195+00:00"
+    },
+    "Villa Nova": {
+      "n": 3,
+      "aliases": [
+        "VILLA NOVA"
+      ],
+      "alias_re": "VILLA\\s*NOVA",
+      "prefixes": {
+        "W": 5
+      },
+      "numeric_share": 0,
+      "common_len": 4,
+      "examples": [
+        "W517",
+        "W538",
+        "W635"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.030217+00:00"
+    },
+    "Graham & Brown": {
+      "n": 1607,
+      "aliases": [
+        "GRAHAM & BROWN"
+      ],
+      "alias_re": "GRAHAM\\s*BROWN",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 6,
+      "examples": [
+        "101448",
+        "102145",
+        "102146",
+        "102147",
+        "102148",
+        "102149"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.036179+00:00"
+    },
+    "Zoffany": {
+      "n": 327,
+      "aliases": [
+        "ZOFFANY"
+      ],
+      "alias_re": "ZOFFANY",
+      "prefixes": {
+        "ZOW": 302
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "313114",
+        "ZFOW312941",
+        "ZFOW312943",
+        "ZGUV08004",
+        "ZHIW312994",
+        "ZHIW312995"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.037413+00:00"
+    },
+    "Paul Montgomery Art Prints": {
+      "n": 397,
+      "aliases": [
+        "PAUL MONTGOMERY ART PRINTS"
+      ],
+      "alias_re": "PAUL\\s*MONTGOMERY\\s*ART\\s*PRINTS",
+      "prefixes": {
+        "DWART": 222,
+        "DWPM": 175
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "DWART-6000",
+        "DWART-6001",
+        "DWART-6002",
+        "DWART-6003",
+        "DWART-6004",
+        "DWART-6005"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.038356+00:00"
+    },
+    "Martyn Lawrence Bullard": {
+      "n": 77,
+      "aliases": [
+        "MARTYN LAWRENCE BULLARD"
+      ],
+      "alias_re": "MARTYN\\s*LAWRENCE\\s*BULLARD",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 6,
+      "examples": [
+        "210000",
+        "210001",
+        "210002",
+        "210003",
+        "210004",
+        "210005"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.038690+00:00"
+    },
+    "Phillipe Romano": {
+      "n": 14140,
+      "aliases": [
+        "PHILLIPE ROMANO"
+      ],
+      "alias_re": "PHILLIPE\\s*ROMANO",
+      "prefixes": {
+        "PI": 1703,
+        "XXP": 1565,
+        "XTY": 1486,
+        "LXPR": 1246,
+        "PRN": 1170,
+        "PRW": 1161
+      },
+      "numeric_share": 0.2,
+      "common_len": 9,
+      "examples": [
+        "*LCK*",
+        "-BEC51530.00",
+        "-BEC51538.00",
+        "-BEC51544.00",
+        "-MAD20052.00",
+        "01.CAC.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.099450+00:00"
+    },
+    "LA Walls": {
+      "n": 1246,
+      "aliases": [
+        "LA WALLS"
+      ],
+      "alias_re": "WALLS",
+      "prefixes": {
+        "SRC": 130,
+        "CHR": 87,
+        "MAN": 76,
+        "HAS": 76,
+        "VIR": 65
+      },
+      "numeric_share": 0.65,
+      "common_len": 5,
+      "examples": [
+        "23000",
+        "23001",
+        "23002",
+        "23003",
+        "23004",
+        "23005"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.103206+00:00"
+    },
+    "Emiliana Parati": {
+      "n": 15,
+      "aliases": [
+        "EMILIANA PARATI"
+      ],
+      "alias_re": "EMILIANA\\s*PARATI",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "86001",
+        "86006",
+        "86014",
+        "86031",
+        "86062",
+        "86065"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.103287+00:00"
+    },
+    "Home Couture": {
+      "n": 36,
+      "aliases": [
+        "HOME COUTURE"
+      ],
+      "alias_re": "HOME\\s*COUTURE",
+      "prefixes": {
+        "HC": 72
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "HC1280L-05TAJ",
+        "HC1280L-07TAJ",
+        "HC1280L-09TAJ",
+        "HC1280T-01",
+        "HC1280T-03",
+        "HC1280T-04"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.103468+00:00"
+    },
+    "Glitter Walls": {
+      "n": 49,
+      "aliases": [
+        "GLITTER WALLS"
+      ],
+      "alias_re": "GLITTER\\s*WALLS",
+      "prefixes": {
+        "ASTEK": 6
+      },
+      "numeric_share": 0.92,
+      "common_len": 5,
+      "examples": [
+        "51300",
+        "51301",
+        "51302",
+        "51304",
+        "51306",
+        "51307"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.104196+00:00"
+    },
+    "Architectural Wallcoverings": {
+      "n": 9,
+      "aliases": [
+        "ARCHITECTURAL WALLCOVERINGS"
+      ],
+      "alias_re": "ARCHITECTURAL\\s*WALLCOVERINGS",
+      "prefixes": {
+        "JD": 5,
+        "PNT": 4
+      },
+      "numeric_share": 0,
+      "common_len": 6,
+      "examples": [
+        "JD-AURA",
+        "JD-BAHARA-CAMACHA",
+        "JD-BAHARA-HAVILAND",
+        "JD-BAHARA-MARTINA",
+        "JD-BALBOA",
+        "PNT-01"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.104244+00:00"
+    },
+    "Malibu Wallpaper": {
+      "n": 2107,
+      "aliases": [
+        "MALIBU WALLPAPER"
+      ],
+      "alias_re": "MALIBU\\s*WALLPAPER",
+      "prefixes": {
+        "LN": 510,
+        "TS": 256,
+        "LW": 202,
+        "BV": 192,
+        "RY": 179,
+        "TG": 164
+      },
+      "numeric_share": 0.1,
+      "common_len": 7,
+      "examples": [
+        "0075853_CAF-27-TWILIGHT_400",
+        "0075855_CAF-27-CRYSTAL_400",
+        "0075857_CAF-27-AQUA_400",
+        "0075859_CAF-27-WICKER_400",
+        "0075861_CAF-27-OYSTER_400",
+        "0075866_CAF-27-VIRIDIAN_400"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.115988+00:00"
+    },
+    "Koroseal": {
+      "n": 2516,
+      "aliases": [
+        "KOROSEAL"
+      ],
+      "alias_re": "KOROSEAL",
+      "prefixes": {
+        "SG": 517,
+        "SRD": 224
+      },
+      "numeric_share": 0.28,
+      "common_len": 7,
+      "examples": [
+        "0204D096",
+        "0204D097",
+        "0204D098",
+        "0204D099",
+        "0204D100",
+        "0204D101"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.127948+00:00"
+    },
+    "Sancar": {
+      "n": 42,
+      "aliases": [
+        "SANCAR"
+      ],
+      "alias_re": "SANCAR",
+      "prefixes": {
+        "BM": 82
+      },
+      "numeric_share": 0.01,
+      "common_len": 7,
+      "examples": [
+        "32001",
+        "BM29001",
+        "BM29003",
+        "BM29004",
+        "BM29005",
+        "BM29006"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.128238+00:00"
+    },
+    "Fentucci Murals": {
+      "n": 87,
+      "aliases": [
+        "FENTUCCI MURALS"
+      ],
+      "alias_re": "FENTUCCI\\s*MURALS",
+      "prefixes": {
+        "DIG": 87
+      },
+      "numeric_share": 0,
+      "common_len": 23,
+      "examples": [
+        "DIG-269685-PAPER",
+        "DIG-269685-SAMPLE-PAPER",
+        "DIG-269685-SAMPLE-VINYL",
+        "DIG-269685-VINYL",
+        "DIG-269686-PAPER",
+        "DIG-269686-SAMPLE-PAPER"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.128559+00:00"
+    },
+    "LEED Walls": {
+      "n": 174,
+      "aliases": [
+        "LEED WALLS"
+      ],
+      "alias_re": "LEED\\s*WALLS",
+      "prefixes": {
+        "LLN": 20,
+        "LSL": 15,
+        "REVERE": 14,
+        "BEXHILL": 13,
+        "BRILLIANCE": 10,
+        "SPICE": 10,
+        "LANCASTER": 10,
+        "FACET": 10
+      },
+      "numeric_share": 0.1,
+      "common_len": 14,
+      "examples": [
+        "47277",
+        "47278",
+        "47279",
+        "49115",
+        "49116",
+        "49117"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.129070+00:00"
+    },
+    "China Seas Fabrics": {
+      "n": 4,
+      "aliases": [
+        "CHINA SEAS FABRICS"
+      ],
+      "alias_re": "CHINA\\s*SEAS\\s*FABRICS",
+      "prefixes": {
+        "DWCS": 4
+      },
+      "numeric_share": 0,
+      "common_len": 11,
+      "examples": [
+        "DWCS-900048",
+        "DWCS-900049",
+        "DWCS-962048",
+        "DWCS-962049"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.129102+00:00"
+    },
+    "Paul Montgomery Original Art": {
+      "n": 49,
+      "aliases": [
+        "PAUL MONTGOMERY ORIGINAL ART"
+      ],
+      "alias_re": "PAUL\\s*MONTGOMERY\\s*ORIGINAL\\s*ART",
+      "prefixes": {
+        "DWORIG": 49
+      },
+      "numeric_share": 0,
+      "common_len": 11,
+      "examples": [
+        "DWORIG-7000",
+        "DWORIG-7001",
+        "DWORIG-7002",
+        "DWORIG-7003",
+        "DWORIG-7004",
+        "DWORIG-7005"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.129225+00:00"
+    },
+    "Primo Leathers": {
+      "n": 145,
+      "aliases": [
+        "PRIMO LEATHERS"
+      ],
+      "alias_re": "PRIMO\\s*LEATHERS",
+      "prefixes": {
+        "LEA": 209
+      },
+      "numeric_share": 0.12,
+      "common_len": 9,
+      "examples": [
+        "98400",
+        "98401",
+        "98402",
+        "98403",
+        "98404",
+        "98405"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.129899+00:00"
+    },
+    "Cole & Son": {
+      "n": 498,
+      "aliases": [
+        "COLE & SON"
+      ],
+      "alias_re": "COLE\\s*SON",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 9,
+      "examples": [
+        "1001.CS.0",
+        "1001M.CS.0",
+        "1002.CS.0",
+        "10020.CS.0",
+        "10021.CS.0",
+        "10022.CS.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.136941+00:00"
+    },
+    "Arte": {
+      "n": 3,
+      "aliases": [
+        "ARTE"
+      ],
+      "alias_re": "ARTE",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "28034",
+        "38240",
+        "40313"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.137025+00:00"
+    },
+    "Backdrop": {
+      "n": 9,
+      "aliases": [
+        "BACKDROP"
+      ],
+      "alias_re": "BACKDROP",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 7,
+      "examples": [
+        "5016840",
+        "5016890",
+        "5017350",
+        "5017400",
+        "5017510",
+        "5017840"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.137072+00:00"
+    },
+    "China Seas": {
+      "n": 1805,
+      "aliases": [
+        "CHINA SEAS"
+      ],
+      "alias_re": "CHINA\\s*SEAS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 6,
+      "examples": [
+        "020070WP",
+        "700121",
+        "700221",
+        "700321",
+        "700421",
+        "700521"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.142615+00:00"
+    },
+    "Big Sur Beans": {
+      "n": 3,
+      "aliases": [
+        "BIG SUR BEANS"
+      ],
+      "alias_re": "BIG\\s*SUR\\s*BEANS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 20,
+      "examples": [
+        "29681700033311501200",
+        "35856857178923376630",
+        "44650038665030506303"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.142655+00:00"
+    },
+    "Designer Wallcoverings": {
+      "n": 1195,
+      "aliases": [
+        "DESIGNER WALLCOVERINGS"
+      ],
+      "alias_re": "DESIGNER\\s*WALLCOVERINGS",
+      "prefixes": {},
+      "numeric_share": 0.98,
+      "common_len": 5,
+      "examples": [
+        "10000",
+        "10001",
+        "10002",
+        "10003",
+        "10004",
+        "10005"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.148533+00:00"
+    },
+    "Pierre Frey": {
+      "n": 3,
+      "aliases": [
+        "PIERRE FREY"
+      ],
+      "alias_re": "PIERRE\\s*FREY",
+      "prefixes": {
+        "FP": 4
+      },
+      "numeric_share": 0,
+      "common_len": 13,
+      "examples": [
+        "FP767002-ROSE",
+        "FP767003-BLEU",
+        "LES-FEUILLAGES-WALLCOVERING-PIERRE-FREY"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.148593+00:00"
+    },
+    "Black Edition": {
+      "n": 5,
+      "aliases": [
+        "BLACK EDITION"
+      ],
+      "alias_re": "BLACK\\s*EDITION",
+      "prefixes": {
+        "W": 9
+      },
+      "numeric_share": 0,
+      "common_len": 4,
+      "examples": [
+        "W366",
+        "W393",
+        "W916",
+        "W930",
+        "W952"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.148628+00:00"
+    },
+    "Surface Stick": {
+      "n": 751,
+      "aliases": [
+        "SURFACE STICK"
+      ],
+      "alias_re": "SURFACE\\s*STICK",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "21500",
+        "21501",
+        "21502",
+        "21503",
+        "21504",
+        "21505"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.150522+00:00"
+    },
+    "Christian Lacroix Europe": {
+      "n": 88,
+      "aliases": [
+        "CHRISTIAN LACROIX EUROPE"
+      ],
+      "alias_re": "CHRISTIAN\\s*LACROIX\\s*EUROPE",
+      "prefixes": {
+        "PCL": 169
+      },
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "FCL7083",
+        "LESCENTAUREES03BLACKGOLDWALLPAPER",
+        "PCL004",
+        "PCL005",
+        "PCL005-03",
+        "PCL006"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.150935+00:00"
+    },
+    "William Morris": {
+      "n": 395,
+      "aliases": [
+        "WILLIAM MORRIS"
+      ],
+      "alias_re": "WILLIAM\\s*MORRIS",
+      "prefixes": {},
+      "numeric_share": 0.95,
+      "common_len": 6,
+      "examples": [
+        "#REF!",
+        "210270",
+        "210347",
+        "210349",
+        "210355",
+        "210362"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.152292+00:00"
+    },
+    "MC Escher Wallpaper": {
+      "n": 50,
+      "aliases": [
+        "MC ESCHER WALLPAPER"
+      ],
+      "alias_re": "ESCHER\\s*WALLPAPER",
+      "prefixes": {
+        "DWSC": 6
+      },
+      "numeric_share": 0.88,
+      "common_len": 45,
+      "examples": [
+        "23100_FISH_RED_NERO_CREAMAT$208NETAFTER20%DISCOUNT",
+        "23101_FISH_DARK-GREENAT$208NETAFTER20%DISCOUNT",
+        "23102_FISH_ORANGE-GREENAT$208NETAFTER20%DISCOUNT",
+        "23103_FISH_BLU_REDAT$208NETAFTER20%DISCOUNT",
+        "23104_FISH_LIGHT-GREYAT$208NETAFTER20%DISCOUNT",
+        "23110_SCALES_GREENAT$208NETAFTER20%DISCOUNT"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.152552+00:00"
+    },
+    "Limited Stock Flocked": {
+      "n": 13,
+      "aliases": [
+        "LIMITED STOCK FLOCKED"
+      ],
+      "alias_re": "LIMITED\\s*STOCK\\s*FLOCKED",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "67004",
+        "67005",
+        "67007",
+        "67008",
+        "67011",
+        "67016"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.152605+00:00"
+    },
+    "Graduate Collection": {
+      "n": 50,
+      "aliases": [
+        "GRADUATE COLLECTION"
+      ],
+      "alias_re": "GRADUATE\\s*COLLECTION",
+      "prefixes": {
+        "COPY": 9,
+        "SHOWGIRLS": 8,
+        "THESOIR": 6,
+        "EXOTIC": 4,
+        "VESTIGE": 3
+      },
+      "numeric_share": 0,
+      "common_len": 28,
+      "examples": [
+        "AB1LEOBROWN",
+        "BWLUXECHARCOAL",
+        "COPY-OF-AT-THE-ART-GALLERY-BURGUNDY",
+        "COPY-OF-AT-THE-ART-GALLERY-CHARCOAL",
+        "COPY-OF-AT-THE-ART-GALLERY-TEAL",
+        "COPY-OF-CAVALCADE-OF-CATS-BLUE"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.152816+00:00"
+    },
+    "Colefax and Fowler": {
+      "n": 360,
+      "aliases": [
+        "COLEFAX AND FOWLER"
+      ],
+      "alias_re": "COLEFAX\\s*AND\\s*FOWLER",
+      "prefixes": {
+        "W": 117
+      },
+      "numeric_share": 0.68,
+      "common_len": 24,
+      "examples": [
+        "1909124BELLFLOWERWALLPAPER",
+        "1909183BELLFLOWERWALLPAPER",
+        "1909214BELLFLOWERWALLPAPER",
+        "1909275BELLFLOWERWALLPAPER",
+        "1909305BELLFLOWERWALLPAPER",
+        "1909489DELANCEYWALLPAPER"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.153829+00:00"
+    },
+    "Porsche™ Paint - Speed Yellow": {
+      "n": 9,
+      "aliases": [
+        "PORSCHE™ PAINT - SPEED YELLOW"
+      ],
+      "alias_re": "PORSCHE\\s*PAINT\\s*SPEED\\s*YELLOW",
+      "prefixes": {
+        "PAINT": 9
+      },
+      "numeric_share": 0,
+      "common_len": 14,
+      "examples": [
+        "PAINT-302023-1",
+        "PAINT-302023-2",
+        "PAINT-302023-3",
+        "PAINT-302023-4",
+        "PAINT-302023-5",
+        "PAINT-302023-6"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "house",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.153864+00:00"
+    },
+    "Pixels": {
+      "n": 27,
+      "aliases": [
+        "PIXELS"
+      ],
+      "alias_re": "PIXELS",
+      "prefixes": {
+        "ARTWORKID": 40,
+        "WASHINGTON": 6,
+        "TEA": 4
+      },
+      "numeric_share": 0,
+      "common_len": 174,
+      "examples": [
+        "ARTWORKID[65264779]-PRODUCTID[PUZZLE-11-15]-IMAGEWIDTH[793]-IMAGEHEIGHT[1000]-TARGETX[-21]-TARGETY[0]-MODELWIDTH[750]-MODELHEIGHT[1000]-BACKGROUNDCOLOR[676350]-ORIENTATION[1]",
+        "ARTWORKID[65264819]-PRODUCTID[DUVETCOVER-KING]-IMAGEWIDTH[995]-IMAGEHEIGHT[666]-TARGETX[0]-TARGETY[89]-MODELWIDTH[995]-MODELHEIGHT[845]-BACKGROUNDCOLOR[656559]-ORIENTATION[0]",
+        "ARTWORKID[65264857]-PRODUCTID[CANVASPRINTSTRETCHED]-IMAGEWIDTH[6.5]-IMAGEHEIGHT[8]-PAPERID[GLOSSYCANVAS]-WRAPWIDTH[1.5]-WRAPCOLOR[MIRRORED]",
+        "ARTWORKID[65264857]-PRODUCTID[THROWPILLOW-14-14]-IMAGEWIDTH[479]-IMAGEHEIGHT[579]-TARGETX[0]-TARGETY[-50]-MODELWIDTH[479]-MODELHEIGHT[479]-BACKGROUNDCOLOR[51290E]-ORIENTATION[0]-INSERT[1]",
+        "ARTWORKID[65264903]-PRODUCTID[PUZZLE-11-15]-IMAGEWIDTH[778]-IMAGEHEIGHT[1000]-TARGETX[-14]-TARGETY[0]-MODELWIDTH[750]-MODELHEIGHT[1000]-BACKGROUNDCOLOR[A8926C]-ORIENTATION[1]",
+        "ARTWORKID[65264903]-PRODUCTID[YOGAMAT]-IMAGEWIDTH[1027]-IMAGEHEIGHT[1320]-TARGETX[-293]-TARGETY[0]-MODELWIDTH[440]-MODELHEIGHT[1320]-BACKGROUNDCOLOR[A8926C]-ORIENTATION[0]"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.158065+00:00"
+    },
+    "Innovations USA": {
+      "n": 300,
+      "aliases": [
+        "INNOVATIONS USA"
+      ],
+      "alias_re": "INNOVATIONS\\s*USA",
+      "prefixes": {
+        "TRUE": 45,
+        "SOA": 25,
+        "ZIO": 23
+      },
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "AGA-001",
+        "AGA-004",
+        "ARIN-3",
+        "ARIN-4",
+        "ARIN-7",
+        "ASR-001"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.159221+00:00"
+    },
+    "Coordonné Europe": {
+      "n": 29,
+      "aliases": [
+        "COORDONNÉ EUROPE"
+      ],
+      "alias_re": "COORDONN\\s*EUROPE",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "23013",
+        "23014",
+        "23015",
+        "23016",
+        "23057",
+        "23058"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.159359+00:00"
+    },
+    "Ultrasuede": {
+      "n": 65,
+      "aliases": [
+        "ULTRASUEDE"
+      ],
+      "alias_re": "ULTRASUEDE",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 8,
+      "examples": [
+        "5538-124",
+        "5538-133",
+        "5538-136",
+        "5538-232",
+        "5538-233",
+        "5538-253"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.159721+00:00"
+    },
+    "Newmor Wallcoverings": {
+      "n": 528,
+      "aliases": [
+        "NEWMOR WALLCOVERINGS"
+      ],
+      "alias_re": "NEWMOR\\s*WALLCOVERINGS",
+      "prefixes": {
+        "CZN": 54,
+        "BST": 32,
+        "DEL": 31,
+        "TEL": 29,
+        "CAS": 26,
+        "COR": 25,
+        "COS": 24,
+        "KOT": 24
+      },
+      "numeric_share": 0,
+      "common_len": 7,
+      "examples": [
+        "AR-101",
+        "AR-102",
+        "AR-103",
+        "AR-104",
+        "AR-105",
+        "AR-106"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.161641+00:00"
+    },
+    "Clarke and Clarke": {
+      "n": 4,
+      "aliases": [
+        "CLARKE AND CLARKE"
+      ],
+      "alias_re": "CLARKE\\s*AND\\s*CLARKE",
+      "prefixes": {
+        "W": 6
+      },
+      "numeric_share": 0.5,
+      "common_len": 5,
+      "examples": [
+        "01.CAC.0",
+        "02.CAC.0",
+        "W0201",
+        "W0202"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.161690+00:00"
+    },
+    "Innovations": {
+      "n": 9,
+      "aliases": [
+        "INNOVATIONS"
+      ],
+      "alias_re": "INNOVATIONS",
+      "prefixes": {
+        "R": 7,
+        "NDAL": 3
+      },
+      "numeric_share": 0,
+      "common_len": 6,
+      "examples": [
+        "NDAL-2",
+        "NDAL-5",
+        "NDAL-7",
+        "R78901",
+        "R78902",
+        "R78903"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.161733+00:00"
+    },
+    "Gaston Y Daniela": {
+      "n": 2285,
+      "aliases": [
+        "GASTON Y DANIELA"
+      ],
+      "alias_re": "GASTON\\s*DANIELA",
+      "prefixes": {
+        "GDT": 1455,
+        "LCT": 549,
+        "GDW": 220
+      },
+      "numeric_share": 0,
+      "common_len": 13,
+      "examples": [
+        "1004.CS.0",
+        "GDT1191.006.0",
+        "GDT1597.002.0",
+        "GDT1597.003.0",
+        "GDT3255.001.0",
+        "GDT3941.001.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.169244+00:00"
+    },
+    "Belarte Studio": {
+      "n": 11,
+      "aliases": [
+        "BELARTE STUDIO"
+      ],
+      "alias_re": "BELARTE\\s*STUDIO",
+      "prefixes": {
+        "BAS": 11
+      },
+      "numeric_share": 0,
+      "common_len": 11,
+      "examples": [
+        "BAS08501066",
+        "BAS08502070",
+        "BAS08503095",
+        "BAS08506040",
+        "BAS08507130",
+        "BAS08902103"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.169331+00:00"
+    },
+    "Parkertex": {
+      "n": 29,
+      "aliases": [
+        "PARKERTEX"
+      ],
+      "alias_re": "PARKERTEX",
+      "prefixes": {
+        "PF": 16,
+        "PT": 5,
+        "PP": 4,
+        "M": 3
+      },
+      "numeric_share": 0,
+      "common_len": 13,
+      "examples": [
+        "M5669_680",
+        "M7671_720",
+        "M7800_104",
+        "PF50004.1.0",
+        "PF50019.290.0",
+        "PF50020.390.0"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.169441+00:00"
+    },
+    "Sacha Walckhoff": {
+      "n": 3,
+      "aliases": [
+        "SACHA WALCKHOFF"
+      ],
+      "alias_re": "SACHA\\s*WALCKHOFF",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 13,
+      "examples": [
+        "113470-MASTER",
+        "113472-MASTER",
+        "113476-MASTER"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.169458+00:00"
+    },
+    "Maya Romanoff": {
+      "n": 745,
+      "aliases": [
+        "MAYA ROMANOFF"
+      ],
+      "alias_re": "MAYA\\s*ROMANOFF",
+      "prefixes": {
+        "MR": 202,
+        "FV": 62,
+        "TY": 59,
+        "W": 53,
+        "AC": 31
+      },
+      "numeric_share": 0,
+      "common_len": 10,
+      "examples": [
+        "-BEADAZZLEDGEODE-",
+        "-GRANDSCALEAJIROCHEVRON-",
+        "-WEATHEREDMETALSII-",
+        "ABH-1245",
+        "ABH-1410",
+        "ABH-1510"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.171235+00:00"
+    },
+    "Florentina Feathers": {
+      "n": 33,
+      "aliases": [
+        "FLORENTINA FEATHERS"
+      ],
+      "alias_re": "FLORENTINA\\s*FEATHERS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "20001",
+        "20003",
+        "20004",
+        "20005",
+        "20006",
+        "20009"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.171396+00:00"
+    },
+    "Hollywood Wallcoverings": {
+      "n": 6897,
+      "aliases": [
+        "HOLLYWOOD WALLCOVERINGS"
+      ],
+      "alias_re": "HOLLYWOOD\\s*WALLCOVERINGS",
+      "prefixes": {
+        "WHF": 296
+      },
+      "numeric_share": 0.32,
+      "common_len": 5,
+      "examples": [
+        "01099",
+        "09199309",
+        "09199903",
+        "100000",
+        "100001",
+        "100002"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.190123+00:00"
+    },
+    "Cloth and Paper": {
+      "n": 36,
+      "aliases": [
+        "CLOTH AND PAPER"
+      ],
+      "alias_re": "CLOTH\\s*AND\\s*PAPER",
+      "prefixes": {
+        "CP": 72
+      },
+      "numeric_share": 0,
+      "common_len": 9,
+      "examples": [
+        "CP1000-01",
+        "CP1000-02",
+        "CP1000-03",
+        "CP1000-04",
+        "CP1000-05",
+        "CP1000-06"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.190366+00:00"
+    },
+    "Rebel Walls": {
+      "n": 3477,
+      "aliases": [
+        "REBEL WALLS"
+      ],
+      "alias_re": "REBEL\\s*WALLS",
+      "prefixes": {
+        "R": 3194,
+        "RS": 1039
+      },
+      "numeric_share": 0,
+      "common_len": 6,
+      "examples": [
+        "74138",
+        "74139",
+        "74140",
+        "74141",
+        "74142",
+        "74144"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.203781+00:00"
+    },
+    "Limited Stock Prints": {
+      "n": 60,
+      "aliases": [
+        "LIMITED STOCK PRINTS"
+      ],
+      "alias_re": "LIMITED\\s*STOCK\\s*PRINTS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "54999",
+        "55000",
+        "55001",
+        "55002",
+        "55003",
+        "55004"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.204042+00:00"
+    },
+    "Coordonné": {
+      "n": 1266,
+      "aliases": [
+        "COORDONNÉ"
+      ],
+      "alias_re": "COORDONN",
+      "prefixes": {
+        "B": 496,
+        "A": 398,
+        "YSP": 140
+      },
+      "numeric_share": 0.5,
+      "common_len": 19,
+      "examples": [
+        "23001",
+        "23002",
+        "23003",
+        "23004",
+        "23005",
+        "31000"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.211577+00:00"
+    },
+    "Dolce & Gabbana": {
+      "n": 30,
+      "aliases": [
+        "DOLCE & GABBANA"
+      ],
+      "alias_re": "DOLCE\\s*GABBANA",
+      "prefixes": {
+        "TCW": 30
+      },
+      "numeric_share": 0,
+      "common_len": 16,
+      "examples": [
+        "TCW001TCAI5UL005",
+        "TCW001TCAI5UL033",
+        "TCW001TCAI5UZ005",
+        "TCW001TCAI8UB003",
+        "TCW002TCAHPUC085",
+        "TCW003TCAHPUC072"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.211696+00:00"
+    },
+    "Peg Norriss": {
+      "n": 3,
+      "aliases": [
+        "PEG NORRISS"
+      ],
+      "alias_re": "PEG\\s*NORRISS",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 7,
+      "examples": [
+        "5015851",
+        "5015852",
+        "5015853"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.211720+00:00"
+    },
+    "Hermes": {
+      "n": 28,
+      "aliases": [
+        "HERMES"
+      ],
+      "alias_re": "HERMES",
+      "prefixes": {},
+      "numeric_share": 1,
+      "common_len": 5,
+      "examples": [
+        "15000",
+        "15001",
+        "15002",
+        "15003",
+        "15004",
+        "15005"
+      ],
+      "private_label": false,
+      "source": "catalog",
+      "code_source": "mfr",
+      "learned_scans": 0,
+      "updated_at": "2026-06-26T06:01:30.211838+00:00"
+    }
+  }
+}
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
index d69d874..306c184 100644
--- a/public/index.html
+++ b/public/index.html
@@ -988,11 +988,11 @@ function chipTo(f){
 async function scanResolve(cands){
   for(const c of (cands||[])){            // pass 1 — TWIL catalog (dw_sku + mfr# + name + collection in hay)
     try{ const d=await (await fetch('/api/lookup?q='+encodeURIComponent(c))).json();
-      if(d&&d.items&&d.items.length) return {via:'any',q:c,n:d.items.length}; }catch(e){}
+      if(d&&d.items&&d.items.length) return {via:'any',q:c,n:d.items.length,vendor:(d.items[0]&&d.items[0].vendor)||''}; }catch(e){}
   }
   for(const c of (cands||[])){            // pass 2 — ALL Shopify (any vendor: dw sku / name / vendor)
     try{ const d=await (await fetch('/api/shopify-search?q='+encodeURIComponent(c))).json();
-      if(d&&d.items&&d.items.length) return {via:'shop',q:c,n:d.items.length}; }catch(e){}
+      if(d&&d.items&&d.items.length) return {via:'shop',q:c,n:d.items.length,vendor:(d.items[0]&&d.items[0].vendor)||''}; }catch(e){}
   }
   return null;
 }
@@ -1006,6 +1006,10 @@ async function applyScan(d){
     playUhoh(); chipTo('shop'); $('#q').value=cands[0]; toast('✗ No match for '+cands[0]+' — searching all Shopify'); return doShopSearch();
   }
   playYoohoo();                           // ✓ resolved to a real product — the happy lock
+  // LEARN: this scan resolved to a known vendor — refine that vendor's sample profile
+  // (fire-and-forget; server folds in the on-swatch code prefix). See /learn.
+  if(hit.vendor){ fetch('/api/learn',{method:'POST',headers:{'Content-Type':'application/json'},
+    body:JSON.stringify({text:(d&&d.text)||'',sku:hit.q,vendor:hit.vendor})}).catch(()=>{}); }
   $('#q').value=hit.q;
   if(hit.via==='any'){ chipTo('any'); toast('✓ '+hit.q+' — '+hit.n+' on TWIL'); doLookup(); }
   else { chipTo('shop'); toast('✓ '+hit.q+' — '+hit.n+' in Shopify'); doShopSearch(); }
diff --git a/public/learn.html b/public/learn.html
new file mode 100644
index 0000000..a22333a
--- /dev/null
+++ b/public/learn.html
@@ -0,0 +1,109 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
+<title>What the scanner has learned · DW</title>
+<style>
+  :root{ --bg:#0f0e0c; --card:#1b1916; --ink:#f3efe7; --muted:#9a9184; --line:#2e2a25;
+         --gold:#c8a24a; --green:#3fa06a; --red:#c0563f; --cols:3; }
+  *{box-sizing:border-box}
+  body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.45 -apple-system,BlinkMacSystemFont,"SF Pro Display",sans-serif}
+  header{position:sticky;top:0;z-index:5;background:rgba(15,14,12,.96);backdrop-filter:blur(8px);border-bottom:1px solid var(--line);padding:14px 18px}
+  .h1{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
+  .h1 b{font:700 18px/1 "SF Pro Display";letter-spacing:.02em}.h1 b i{color:var(--gold);font-style:normal}
+  .sub{color:var(--muted);font-size:12.5px}
+  .ver{font:600 9px/1 ui-monospace,Menlo,monospace;background:#1b1407;color:var(--gold);border-radius:99px;padding:3px 6px}
+  .controls{display:flex;gap:10px;align-items:center;margin-top:11px;flex-wrap:wrap}
+  input,select{background:#16140f;border:1px solid var(--line);color:var(--ink);border-radius:9px;padding:8px 11px;font-size:13.5px}
+  input#q{flex:1;min-width:180px}
+  input[type=range]{accent-color:var(--gold);padding:0}
+  .lbl{color:var(--muted);font-size:11.5px}
+  .wrap{padding:16px 18px 60px}
+  .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:12px}
+  .card{background:var(--card);border:1px solid var(--line);border-radius:13px;padding:13px 14px;display:flex;flex-direction:column;gap:8px}
+  .card .top{display:flex;align-items:center;gap:8px}
+  .vn{font:700 15px/1.2 "SF Pro Display";flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+  .src{font:600 9.5px/1 ui-monospace,Menlo,monospace;padding:3px 7px;border-radius:99px;border:1px solid var(--line);color:var(--muted)}
+  .src.scan{color:var(--green);border-color:#274c39}.src.catalog{color:var(--gold);border-color:#3a2e10}
+  .pl{font:700 9.5px/1 sans-serif;color:#000;background:var(--red);padding:3px 7px;border-radius:99px}
+  .stats{display:flex;gap:14px;color:var(--muted);font-size:12px}
+  .stats b{color:var(--ink);font:600 13px/1 ui-monospace,Menlo,monospace}
+  .chips{display:flex;gap:6px;flex-wrap:wrap}
+  .chip{font:600 11.5px/1 ui-monospace,Menlo,monospace;background:#221d12;color:var(--gold);border:1px solid #3a2e10;border-radius:7px;padding:4px 7px}
+  .chip .n{color:var(--muted);font-weight:400}
+  .ex{font:400 11px/1.3 ui-monospace,Menlo,monospace;color:var(--muted);word-break:break-all}
+  .when{font:500 10.5px/1 ui-monospace,Menlo,monospace;color:var(--muted);display:inline-flex;gap:5px;align-items:center}
+  .empty{color:var(--muted);padding:40px 0;text-align:center}
+  a{color:var(--gold)}
+</style>
+</head>
+<body>
+  <header>
+    <div class="h1"><b><i>DW</i> Scanner</b> · what it's learned about each vendor's samples <span class="ver">__VER__</span></div>
+    <div class="sub" id="sub">loading…</div>
+    <div class="controls">
+      <input id="q" placeholder="🔎 filter vendor / prefix…">
+      <select id="sort">
+        <option value="learned">Most scan-learned</option>
+        <option value="n">Most catalog codes</option>
+        <option value="az">Vendor A→Z</option>
+        <option value="updated">Recently updated</option>
+      </select>
+      <label class="lbl">density</label>
+      <input type="range" id="dens" min="2" max="6" value="3" title="cards per row">
+    </div>
+  </header>
+  <div class="wrap"><div class="grid" id="grid"></div><div class="empty" id="empty" hidden></div></div>
+<script>
+const $=s=>document.querySelector(s);
+let ALL=[];
+const LS=(k,d)=>{try{return localStorage.getItem(k)??d}catch(e){return d}};
+function fmtWhen(iso){ if(!iso) return ''; const d=new Date(iso);
+  return d.toLocaleString(undefined,{year:'numeric',month:'short',day:'numeric',hour:'numeric',minute:'2-digit'}); }
+function card(v){
+  const prefs=Object.entries(v.prefixes||{}).sort((a,b)=>b[1]-a[1])
+    .map(([p,n])=>`<span class="chip">${p}<span class="n"> ·${n}</span></span>`).join('')
+    || (v.numeric_share>=0.6?'<span class="chip">###<span class="n"> numeric</span></span>':'<span class="chip" style="opacity:.5">—</span>');
+  const ex=(v.examples||[]).slice(0,5).join('  ');
+  const src=(v.source==='scan'||v.learned_scans>0)?'scan':'catalog';
+  return `<div class="card">
+    <div class="top"><div class="vn" title="${v.name}">${v.name}</div>
+      ${v.private_label?'<span class="pl" title="private-label upstream — never customer-facing">PRIVATE</span>':''}
+      <span class="src ${src}">${src}</span></div>
+    <div class="stats"><span>codes <b>${v.n||0}</b></span><span>scans <b>${v.learned_scans||0}</b></span>
+      ${v.common_len?`<span>len <b>${v.common_len}</b></span>`:''}</div>
+    <div class="chips">${prefs}</div>
+    ${ex?`<div class="ex">${ex}</div>`:''}
+    <div class="when" title="${v.updated_at||''}">🕓 ${fmtWhen(v.updated_at)||'—'}</div>
+  </div>`;
+}
+function render(){
+  const q=$('#q').value.trim().toUpperCase(), sort=$('#sort').value;
+  let rows=ALL.filter(v=>!q || v.name.toUpperCase().includes(q) || Object.keys(v.prefixes||{}).some(p=>p.includes(q)));
+  const cmp={ learned:(a,b)=>(b.learned_scans||0)-(a.learned_scans||0)||(b.n||0)-(a.n||0),
+              n:(a,b)=>(b.n||0)-(a.n||0), az:(a,b)=>a.name.localeCompare(b.name),
+              updated:(a,b)=>String(b.updated_at||'').localeCompare(String(a.updated_at||'')) };
+  rows.sort(cmp[sort]||cmp.learned);
+  $('#grid').innerHTML=rows.map(card).join('');
+  $('#empty').hidden=rows.length>0; $('#empty').textContent=q?'No vendor matches that filter.':'Nothing learned yet — run build_vendor_profiles.py or scan a few samples.';
+}
+async function load(){
+  try{
+    const d=await (await fetch('/api/vendor-profiles')).json();
+    ALL=d.vendors||[];
+    const scans=ALL.reduce((s,v)=>s+(v.learned_scans||0),0);
+    $('#sub').textContent=`${d.total} vendors learned · ${d.seeded.length} curated seed · ${scans} live scan refinements`;
+    render();
+  }catch(e){ $('#sub').textContent='Could not load profiles.'; }
+}
+$('#q').addEventListener('input',render);
+$('#sort').addEventListener('change',()=>{ localStorage.setItem('learn_sort',$('#sort').value); render(); });
+$('#dens').addEventListener('input',e=>{ document.documentElement.style.setProperty('--cols',e.target.value); localStorage.setItem('learn_dens',e.target.value); });
+// restore persisted controls
+$('#sort').value=LS('learn_sort','learned'); $('#dens').value=LS('learn_dens','3');
+document.documentElement.style.setProperty('--cols',$('#dens').value);
+load(); setInterval(load,15000);
+</script>
+</body>
+</html>
diff --git a/server.js b/server.js
index e2ea11c..42ff2f2 100644
--- a/server.js
+++ b/server.js
@@ -291,7 +291,7 @@ function parseOcrRows(stdout) {
 // Pure: OCR rows → { text, vendor, candidates, top, topStrong }. No I/O.
 function analyzeOcr(rows) {
   const text = rows.map(r => r.t).join('\n');
-  const vlex = VENDOR_LEX.find(v => v.re.test(text.toUpperCase())) || null;
+  const vlex = LEXICON.find(v => v.re.test(text.toUpperCase())) || null;
   const vendor = vlex ? vlex.name : null;
   // SKU-likeness tie-breaker: brand-matching prefix first (the swatch told us the vendor),
   // then known prefixes (GRS- = Fentucci, WD = Winfield Thybony), dashed/alnum, length.
@@ -323,6 +323,49 @@ function analyzeOcr(rows) {
   return { text, vendor, candidates: codes.map(c => c.t), top: top ? top.t : null, topStrong };
 }
 
+
+// ── Vendor sample profiles: "how each vendor labels their samples" ─────────────
+// Built broadly from the catalog by build_vendor_profiles.py and refined per-scan by
+// /api/learn. Merged with the curated seed VENDOR_LEX into the runtime LEXICON the
+// scanner consults — so brand detection + SKU prefix-boosting improve as we learn.
+const VENDOR_PROFILES_FILE = path.join(DATA, 'vendor_profiles.json');
+const PRIVATE_LABEL_RE = /BREWSTER|YORK|WALLQUEST|CHESAPEAKE|NEXTWALL|SEABROOK|COMMAND ?54|DESIMA|CARLSTEN|NICOLETTE ?MAYER/i;
+const escapeRe = s => String(s).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+function brandRe(name) {                  // vendor name -> flexible OCR detection source string
+  const words = (String(name).match(/[A-Za-z]+/g) || []).filter(w => w.length >= 3).map(w => w.toUpperCase());
+  if (!words.length) return null;
+  if (words.length === 1 && words[0].length < 4) return null;   // single short word = noisy
+  return words.map(escapeRe).join('\\s*');
+}
+let VENDOR_PROFILES = (loadJSON(VENDOR_PROFILES_FILE, {}).profiles) || {};
+function saveVendorProfiles() {
+  const meta = loadJSON(VENDOR_PROFILES_FILE, {})._meta || {};
+  meta.updated_at = new Date().toISOString(); meta.vendors = Object.keys(VENDOR_PROFILES).length;
+  saveJSON(VENDOR_PROFILES_FILE, { _meta: meta, profiles: VENDOR_PROFILES });
+}
+// Compile one learned profile into the seed's {name, re, pfx} shape.
+function profileToLex(name, p) {
+  let re = null; try { re = p.alias_re ? new RegExp(p.alias_re) : null; } catch (e) { re = null; }
+  const prefs = Object.keys(p.prefixes || {}).filter(Boolean).sort((a, b) => b.length - a.length); // WDW before WD
+  // A vendor can be BOTH prefixed AND numeric-dominant (Schumacher: DWLK house code + bare
+  // numbers on the swatch) — express both so the scanner matches either form it sees.
+  const alts = prefs.map(escapeRe);
+  if ((p.numeric_share || 0) >= 0.3) alts.push('\\d{3,}');
+  let pfx = null;
+  if (alts.length) { try { pfx = new RegExp('^(' + alts.join('|') + ')'); } catch (e) { pfx = null; } }
+  if (!re && !pfx) return null;
+  return { name, re: re || /(?!)/, pfx: pfx || /(?!)/, learned: true, private_label: !!p.private_label };
+}
+// LEXICON = curated seed first (trusted), then learned profiles not already seeded.
+let LEXICON = [];
+function rebuildLexicon() {
+  const seeded = new Set(VENDOR_LEX.map(v => v.name.toUpperCase()));
+  const learned = Object.entries(VENDOR_PROFILES).map(([n, p]) => profileToLex(n, p))
+    .filter(Boolean).filter(e => !seeded.has(e.name.toUpperCase()));
+  LEXICON = VENDOR_LEX.concat(learned);
+}
+rebuildLexicon();
+
 const appHandler = (req, res) => {
   // public (no-auth) paths: health + the home-screen-install assets iOS fetches without creds
   const PUBLIC = ['/healthz', '/icon-180.png', '/icon-512.png', '/apple-touch-icon.png', '/manifest.webmanifest'];
@@ -417,6 +460,46 @@ const appHandler = (req, res) => {
     return res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' }), res.end(html);
   }
 
+  // ── Vendor-profile learning surface ──
+  // What the app has learned about how each vendor labels their samples.
+  if (u.pathname === '/api/vendor-profiles' && req.method === 'GET') {
+    const vendors = Object.entries(VENDOR_PROFILES).map(([name, p]) => Object.assign({ name }, p))
+      .sort((a, b) => (b.learned_scans || 0) - (a.learned_scans || 0) || (b.n || 0) - (a.n || 0));
+    return send(res, 200, { total: vendors.length, seeded: VENDOR_LEX.map(v => v.name), vendors });
+  }
+  // Refine a vendor's profile from a scan that resolved to a real product. Conservative:
+  // we only fold in structured signal (the on-swatch code prefix), never raw OCR prose.
+  if (u.pathname === '/api/learn' && req.method === 'POST') {
+    let body = ''; req.on('data', c => { body += c; if (body.length > 64 * 1024) req.destroy(); });
+    req.on('end', () => {
+      let p; try { p = JSON.parse(body); } catch (e) { return send(res, 400, { err: 'bad json' }); }
+      const vendor = String(p.vendor || '').trim();
+      const sku = String(p.sku || '').toUpperCase().replace(/\s+/g, '');
+      if (!vendor || !sku) return send(res, 400, { err: 'vendor + sku required' });
+      const prof = VENDOR_PROFILES[vendor] || (VENDOR_PROFILES[vendor] = {
+        n: 0, aliases: [vendor.toUpperCase()], alias_re: brandRe(vendor), prefixes: {},
+        numeric_share: 0, common_len: 0, examples: [], private_label: PRIVATE_LABEL_RE.test(vendor),
+        source: 'scan', learned_scans: 0
+      });
+      const pre = (sku.match(/^[A-Z]+/) || [''])[0];
+      if (pre) prof.prefixes[pre] = (prof.prefixes[pre] || 0) + 1;
+      else prof.numeric_share = Math.min(1, (prof.numeric_share || 0) + 0.05);
+      if (!prof.examples.includes(sku) && prof.examples.length < 8) prof.examples.push(sku);
+      prof.learned_scans = (prof.learned_scans || 0) + 1;
+      prof.updated_at = new Date().toISOString();
+      saveVendorProfiles(); rebuildLexicon();
+      return send(res, 200, { ok: true, vendor, learned_prefix: pre || null, learned_scans: prof.learned_scans });
+    });
+    return;
+  }
+  // Learning viewer page (admin, behind the existing basic-auth).
+  if (u.pathname === '/learn') {
+    const f = path.join(ROOT, 'public/learn.html');
+    if (!fs.existsSync(f)) return send(res, 404, { err: 'learn.html missing' });
+    const html = fs.readFileSync(f, 'utf8').replace(/__VER__/g, buildLabel());
+    return res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' }), res.end(html);
+  }
+
   // /selfcheck — re-runnable health report. Verifies data integrity + AUTO-CLEANS stale
   // photo refs (progress entries pointing at a deleted /photos file = the dead-link class).
   if (u.pathname === '/selfcheck') {

← 47a5ecf Ask-the-SKU: voice Q&A about a product via local Ollama ($0)  ·  back to Dw Photo Capture  ·  auto-save: 2026-06-25T23:07:50 (4 files) — bin/ocr bin/ocr.s 8fae114 →