[object Object]

← back to Dw Knowledge

DW wallcovering knowledge layer: seed private-label/pricing/gates/settlement/store/material rules

1f859e029faf9ff59c906b0e12e93356e301d762 · 2026-07-17 07:12:20 -0700 · Steve Abrams

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Files touched

Diff

commit 1f859e029faf9ff59c906b0e12e93356e301d762
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri Jul 17 07:12:20 2026 -0700

    DW wallcovering knowledge layer: seed private-label/pricing/gates/settlement/store/material rules
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---
 .gitignore                            |  9 +++++
 .kl/manifest.json                     | 30 ++++++++++++++++
 CONTRADICTIONS.md                     | 24 +++++++++++++
 INDEX.md                              | 17 ++++++++++
 SCHEMA.md                             | 64 +++++++++++++++++++++++++++++++++++
 SOURCES.md                            | 14 ++++++++
 companies/_about.md                   |  5 +++
 concepts/_about.md                    |  5 +++
 concepts/map-pricing.md               | 24 +++++++++++++
 ideas/_about.md                       |  5 +++
 media/_about.md                       |  5 +++
 operations/_about.md                  |  5 +++
 operations/catalog-gates.md           | 25 ++++++++++++++
 operations/material-and-unit-rules.md | 24 +++++++++++++
 operations/pricing-rules.md           | 28 +++++++++++++++
 operations/private-label-branding.md  | 31 +++++++++++++++++
 operations/settlement-gate.md         | 31 +++++++++++++++++
 operations/store-and-data-truth.md    | 35 +++++++++++++++++++
 people/_about.md                      |  5 +++
 projects/_about.md                    |  5 +++
 sources/hard-catalog-rules.md         | 14 ++++++++
 sources/material-rules.md             |  8 +++++
 sources/pricing-rules.md              | 14 ++++++++
 sources/private-label-map.md          | 13 +++++++
 sources/settlement-gate.md            | 10 ++++++
 sources/store-truth.md                |  7 ++++
 26 files changed, 457 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..87910ab
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+node_modules/
+.env*
+tmp/
+*.log
+.DS_Store
+dist/
+build/
+.next/
+__pycache__/
diff --git a/.kl/manifest.json b/.kl/manifest.json
new file mode 100644
index 0000000..a7afc97
--- /dev/null
+++ b/.kl/manifest.json
@@ -0,0 +1,30 @@
+{
+  "version": 1,
+  "compiled_at": "2026-07-17T14:12:20.295225+00:00",
+  "sources": {
+    "sources/hard-catalog-rules.md": {
+      "hash": "706f77d55bc93e064b27d8c5007087855d15d8a99d5762993150936fefa68e3e",
+      "bytes": 1008
+    },
+    "sources/material-rules.md": {
+      "hash": "95463122d23213c6500b0a126e25641b0e790aff5e7d275de54948430c1e5391",
+      "bytes": 478
+    },
+    "sources/pricing-rules.md": {
+      "hash": "88b4ba8ab938257df14a6dcfe4e0db028c661d96c5bba5f071a4137089431b4e",
+      "bytes": 930
+    },
+    "sources/private-label-map.md": {
+      "hash": "b91bbfb5a8b5654ad09d1205e262a856be9f1eb3cae2192112834a26d3d460e7",
+      "bytes": 1095
+    },
+    "sources/settlement-gate.md": {
+      "hash": "668e08e1266410f1ca7fdb76721ca47b46bc1ccdd2742e360ab7cf97e370cb2b",
+      "bytes": 786
+    },
+    "sources/store-truth.md": {
+      "hash": "1c69e9c70ed660f965924e2547dba1f911ac4ad1f4a9e816ac388c94e2b8b9fe",
+      "bytes": 483
+    }
+  }
+}
diff --git a/CONTRADICTIONS.md b/CONTRADICTIONS.md
new file mode 100644
index 0000000..4d09ecc
--- /dev/null
+++ b/CONTRADICTIONS.md
@@ -0,0 +1,24 @@
+# Contradictions
+
+When a new source disagrees with an existing entry, **do not silently
+overwrite**. Record both claims here with their sources and leave the item
+**open** (`- [ ]`) until a human resolves it. `kl_status.py` counts open items.
+
+This log is what makes the wiki trustworthy: a knowledge layer that quietly
+picks a winner teaches agents to state false certainty.
+
+_Last updated: 2026-07-17_
+
+## Open
+
+<!-- template:
+- [ ] **[[acme-corp]] renewal date** — `discovery-call-2026-05-01` says "renews
+      in Q3"; `contract.pdf` says "12-month term from 2026-04-01" (→ Q1 2027).
+      Both cited on the entry; needs human confirmation.
+-->
+
+_(none)_
+
+## Resolved
+
+<!-- Move items here as `- [x]` with the resolution + who decided. -->
diff --git a/INDEX.md b/INDEX.md
new file mode 100644
index 0000000..153ef07
--- /dev/null
+++ b/INDEX.md
@@ -0,0 +1,17 @@
+# Index — DW Wallcovering Knowledge Layer
+
+_Last updated: 2026-07-17_
+
+The read-first shared brain for the Designer Wallcoverings operation. Agents load
+the relevant entries before acting. No RAG — the structure is the index.
+
+## operations/
+- [[private-label-branding]] — vendor → house-brand map; real names never customer-facing.
+- [[pricing-rules]] — retail = cost/0.65/0.85; sample $4.25; per-vendor overrides.
+- [[catalog-gates]] — the 5-field rule + the vendor/mfr go-live gate.
+- [[settlement-gate]] — the wallpaper-imagery legal gate (Part A + Part B).
+- [[store-and-data-truth]] — sandbox IS live prod; unified-first; weight=shipping; GMC policy.
+- [[material-and-unit-rules]] — acoustical≠vinyl; GRS 36"; double-roll "2 and 2".
+
+## concepts/
+- [[map-pricing]] — MAP = WHLS × 1.5 (Kravet family + York).
diff --git a/SCHEMA.md b/SCHEMA.md
new file mode 100644
index 0000000..2953fdd
--- /dev/null
+++ b/SCHEMA.md
@@ -0,0 +1,64 @@
+# Schema
+
+This Knowledge Layer is a plain-directory, LLM-compiled wiki. The **structure is
+the index** — there is no vector database. Agents read the relevant entries
+first, then act.
+
+_Initialized: 2026-07-17_
+
+## Typed folders
+
+Every entry lives in exactly one typed folder: **people, companies, concepts, ideas, projects, operations, media**.
+
+One entity/concept per file. Narrow scope beats a sprawling page — a small,
+sharp entry is easier to keep correct than a giant one.
+
+## Entry file format
+
+`<folder>/<slug>.md`, kebab-case slug, YAML frontmatter + markdown body:
+
+```markdown
+---
+id: acme-corp
+type: company
+tags: [vendor, saas, active]
+aliases: ["ACME", "Acme Inc."]
+sources: [sources/discovery-call-2026-05-01.md, sources/contract.pdf]
+updated: 2026-05-02
+---
+# ACME Corp
+
+**Summary:** SaaS vendor we onboarded May 2026; primary contact [[jane-doe]].
+
+## Facts
+- Founded 2019, HQ Lisbon. <!-- src: discovery-call-2026-05-01 -->
+- Net-30 terms, 15% partner discount. <!-- src: contract -->
+
+## Open questions
+- Renewal date not yet confirmed.
+
+## Related
+- [[jane-doe]] — CEO / our contact
+- [[onboarding-playbook]]
+```
+
+### Frontmatter fields
+| field | required | meaning |
+|-------|----------|---------|
+| `id` | yes | stable slug, matches filename |
+| `type` | yes | one of the typed folders |
+| `tags` | recommended | lowercase facets for retrieval/filtering |
+| `aliases` | recommended | alternate names → boosts `kl_query.py` recall |
+| `sources` | **yes** | provenance: which `sources/` files back this entry |
+| `updated` | yes | ISO date of last compile touch |
+
+### Body conventions
+- `**Summary:**` one line — agents read this first, drill down on demand.
+- Per-fact provenance with an inline `<!-- src: <source-stem> -->` comment.
+- Cross-reference related entries with `[[slug]]` wikilinks.
+- Contradictions do NOT get resolved silently here — log them in
+  `CONTRADICTIONS.md` and cite both sources.
+
+## Evolving the schema
+Add a new typed folder only when a real category emerges (not speculatively).
+Record the addition here so the compile agent routes future material correctly.
diff --git a/SOURCES.md b/SOURCES.md
new file mode 100644
index 0000000..c9300bc
--- /dev/null
+++ b/SOURCES.md
@@ -0,0 +1,14 @@
+# Sources — DW Wallcovering Knowledge Layer
+
+_Last updated: 2026-07-17_
+
+Seeded from Steve's standing rules (CLAUDE.md + MEMORY.md + DW skill/canary set).
+
+| source file | what it is |
+|-------------|------------|
+| private-label-map.md   | vendor → house-brand private-label mappings |
+| pricing-rules.md       | retail formula, sample, MAP, per-vendor pricing |
+| hard-catalog-rules.md  | 5-field, go-live gate, unified-first, weight, GMC |
+| settlement-gate.md     | wallpaper-imagery legal gate |
+| store-truth.md         | which store is live; dw_unified canonical/authoritative |
+| material-rules.md      | acoustical≠vinyl, GRS width, double-roll rule |
diff --git a/companies/_about.md b/companies/_about.md
new file mode 100644
index 0000000..66d9978
--- /dev/null
+++ b/companies/_about.md
@@ -0,0 +1,5 @@
+# companies/
+
+One entry per organization/vendor. What they do, our relationship, key facts.
+
+Entry files here are `<slug>.md` with YAML frontmatter (see ../SCHEMA.md).
diff --git a/concepts/_about.md b/concepts/_about.md
new file mode 100644
index 0000000..6903bf0
--- /dev/null
+++ b/concepts/_about.md
@@ -0,0 +1,5 @@
+# concepts/
+
+One entry per idea/term/framework worth a durable definition.
+
+Entry files here are `<slug>.md` with YAML frontmatter (see ../SCHEMA.md).
diff --git a/concepts/map-pricing.md b/concepts/map-pricing.md
new file mode 100644
index 0000000..d93f3c4
--- /dev/null
+++ b/concepts/map-pricing.md
@@ -0,0 +1,24 @@
+---
+id: map-pricing
+type: concept
+tags: [pricing, MAP, kravet, york, compliance]
+aliases: ["MAP", "minimum advertised price"]
+sources: [sources/pricing-rules.md]
+updated: 2026-07-17
+---
+# MAP pricing
+
+**Summary:** The Kravet-umbrella family and York lines price at MAP (Minimum Advertised Price), NOT the generic cost formula. MAP = wholesale (WHLS) cost × 1.5.
+
+## Facts
+- MAP = WHLS cost × 1.5 (verified ~universal on Kravet). <!-- src: pricing-rules -->
+- Kravet ENFORCES MAP — pricing below MAP is a real compliance breach. <!-- src: pricing-rules -->
+- Kravet-umbrella family: Kravet (+Couture/Design/Contract/Basics), Lee Jofa,
+  Lee Jofa Modern, Groundworks, Brunschwig & Fils, Cole & Son, GP&J Baker,
+  Colefax & Fowler, Clarke & Clarke, Mulberry, Threads, Baker Lifestyle,
+  Andrew Martin, Nicolette Mayer, Aerin, Barclay Butera, Thom Filicia. <!-- src: pricing-rules -->
+- York + its private labels sell at MAP (blank → MSRP × 0.75). <!-- src: pricing-rules -->
+
+## Related
+- [[pricing-rules]] — the generic formula MAP overrides.
+- [[private-label-branding]] — the York PL brand is "Jeffrey Stevens".
diff --git a/ideas/_about.md b/ideas/_about.md
new file mode 100644
index 0000000..ac2ffec
--- /dev/null
+++ b/ideas/_about.md
@@ -0,0 +1,5 @@
+# ideas/
+
+Proposals and hypotheses (not yet decided). Link to the project once acted on.
+
+Entry files here are `<slug>.md` with YAML frontmatter (see ../SCHEMA.md).
diff --git a/media/_about.md b/media/_about.md
new file mode 100644
index 0000000..3eac59c
--- /dev/null
+++ b/media/_about.md
@@ -0,0 +1,5 @@
+# media/
+
+Notes on assets/links/videos/threads — the durable takeaway, not the raw file.
+
+Entry files here are `<slug>.md` with YAML frontmatter (see ../SCHEMA.md).
diff --git a/operations/_about.md b/operations/_about.md
new file mode 100644
index 0000000..81586e0
--- /dev/null
+++ b/operations/_about.md
@@ -0,0 +1,5 @@
+# operations/
+
+How-we-do-it: workflows, playbooks, standing rules, gotchas.
+
+Entry files here are `<slug>.md` with YAML frontmatter (see ../SCHEMA.md).
diff --git a/operations/catalog-gates.md b/operations/catalog-gates.md
new file mode 100644
index 0000000..7dde4b2
--- /dev/null
+++ b/operations/catalog-gates.md
@@ -0,0 +1,25 @@
+---
+id: catalog-gates
+type: operations
+tags: [hard-rule, go-live, data-quality, gate]
+aliases: ["5-field rule", "go-live gate", "publish gate"]
+sources: [sources/hard-catalog-rules.md]
+updated: 2026-07-17
+---
+# Catalog go-live gates
+
+**Summary:** Two hard gates before a SKU can go live — the 5-field completeness rule and the vendor+mfr go-live gate.
+
+## 5-field rule
+Every ACTIVE SKU must have: (1) a sample variant, (2) a sellable product
+variant, (3) complete pricing (no $0/null), (4) a description, (5) ≥2 tags.
+<!-- src: hard-catalog-rules -->
+
+## Go-live gate
+Any SKU created in the last 6 months must have a real vendor name AND a real mfr
+SKU number — not blank, not a reused internal counter, not just the handle's
+numeric tail — before it can go live. <!-- src: hard-catalog-rules -->
+
+## Related
+- [[store-and-data-truth]] — unified-first + weight/GMC rules that gate a publish.
+- [[pricing-rules]] — "complete pricing" means the right formula/MAP.
diff --git a/operations/material-and-unit-rules.md b/operations/material-and-unit-rules.md
new file mode 100644
index 0000000..11a3cbd
--- /dev/null
+++ b/operations/material-and-unit-rules.md
@@ -0,0 +1,24 @@
+---
+id: material-and-unit-rules
+type: operations
+tags: [material, units, hard-rule, roll, width, acoustical]
+aliases: ["acoustical is not vinyl", "double roll rule", "grasscloth width"]
+sources: [sources/material-rules.md]
+updated: 2026-07-17
+---
+# Material & unit rules
+
+**Summary:** Acoustical is fiber not vinyl; GRS grasscloth is 36" only; the private-label roll lines keep a "2 and 2" double-roll minimum.
+
+## Facts
+- **Acoustical wallcoverings are polyester/olefin FIBER, NOT Type II vinyl.** PDP
+  Material = `custom.material` metafield. (e.g. Sidmouth = Momentum "Silence",
+  50% Poly / 50% PP.) <!-- src: material-rules -->
+- **GRS grasscloth SKUs are 36" wide ONLY:** canonical width
+  `36" Wide (trim to 34")`. <!-- src: material-rules -->
+- **DOUBLE-ROLL RULE ("2 and 2"):** the private-label double-roll lines
+  (Thibaut, Malibu Wallpaper/WallQuest, Malibu Walls/Brewster, York) keep a
+  2-roll minimum and D/R length ≈ 2× S/R length. <!-- src: material-rules -->
+
+## Related
+- [[private-label-branding]] — the double-roll lines are these PL brands.
diff --git a/operations/pricing-rules.md b/operations/pricing-rules.md
new file mode 100644
index 0000000..bff6dce
--- /dev/null
+++ b/operations/pricing-rules.md
@@ -0,0 +1,28 @@
+---
+id: pricing-rules
+type: operations
+tags: [pricing, hard-rule, sample, tariff]
+aliases: ["retail formula", "how we price"]
+sources: [sources/pricing-rules.md]
+updated: 2026-07-17
+---
+# Pricing rules
+
+**Summary:** Generic retail = net_cost / 0.65 / 0.85; memo sample = $4.25. Several lines override this — Kravet/York at MAP, plus per-vendor rules below.
+
+## Facts
+- Generic retail formula: `retail = net_cost / 0.65 / 0.85`. <!-- src: pricing-rules -->
+- Memo sample price: **$4.25** (sample-only variant). <!-- src: pricing-rules -->
+- Brand McKenzie (DWBM): cost = Sancar FULL retail + 5% tariff (NO trade
+  discount); retail = sancar / 0.65 / 0.85. <!-- src: pricing-rules -->
+- Greenland / Phillipe Romano cork: $59.50 per yard, sold in 6-yard increments.
+  <!-- src: pricing-rules -->
+- Justin David / LA Fabrics: per-yard = 15% off JD list; retail ≈ list/0.65 +
+  flat tariff. <!-- src: pricing-rules -->
+
+## Overrides
+- Kravet-umbrella family and York price at MAP, not this formula — see
+  [[map-pricing]].
+
+## Related
+- [[map-pricing]] · [[private-label-branding]] · [[store-and-data-truth]] (GMC $4.25 leak risk).
diff --git a/operations/private-label-branding.md b/operations/private-label-branding.md
new file mode 100644
index 0000000..ed84097
--- /dev/null
+++ b/operations/private-label-branding.md
@@ -0,0 +1,31 @@
+---
+id: private-label-branding
+type: operations
+tags: [private-label, branding, compliance, hard-rule, leak]
+aliases: ["private label", "brand masking", "vendor masking"]
+sources: [sources/private-label-map.md]
+updated: 2026-07-17
+---
+# Private-label branding
+
+**Summary:** Several vendor lines sell under a DW house brand; the REAL vendor name must NEVER appear customer-facing (title, handle/URL, vendor field, brand metafield, tags, alt text, image filenames).
+
+## The map
+| Real vendor | Customer-facing brand | Notes |
+|---|---|---|
+| WallQuest / Chesapeake / NextWall / Seabrook | **Malibu Wallpaper** | |
+| Brewster | **Malibu Walls** | |
+| Command54 | **Phillipe Romano** | East Coast beach-city collection names |
+| Greenland (cork) | **Phillipe Romano** | coastal-city style names; `Cork-` SKUs |
+| Justin David (fabric) | **Los Angeles Fabrics** / Phillipe Romano | DWLA |
+| Momentum / Versa / Versa Designed Surfaces | **Hollywood Wallcoverings** | California-city names |
+| Sister Parish | **Saybrook House** (DWPH) | |
+| York-branded line | **Jeffrey Stevens** (DWJS) | |
+<!-- src: private-label-map -->
+
+- Desima/Carlsten and Nicolette Mayer are archived / must stay off. <!-- src: private-label-map -->
+- A weekly dw-leak-scanner watches live pages for any of these names leaking. <!-- src: private-label-map -->
+
+## Related
+- [[pricing-rules]] — York PL sells at MAP; see [[map-pricing]].
+- [[material-and-unit-rules]] — the double-roll lines are these PL lines.
diff --git a/operations/settlement-gate.md b/operations/settlement-gate.md
new file mode 100644
index 0000000..fc1fcaf
--- /dev/null
+++ b/operations/settlement-gate.md
@@ -0,0 +1,31 @@
+---
+id: settlement-gate
+type: operations
+tags: [legal, settlement, hard-rule, generation, publish-gate]
+aliases: ["settlement", "legal gate", "banana leaf rule"]
+sources: [sources/settlement-gate.md]
+updated: 2026-07-17
+---
+# Settlement legal gate
+
+**Summary:** Before generating OR publishing any wallpaper/wallcovering design, it must clear the settlement gate. A design violates only when it satisfies ALL of Part A AND contains a Part B element.
+
+## The rule
+- **Part A (all three required):** A1 directional variation among leaves / palm
+  fronds / foliage; A2 open space between leaves; A3 more than one ink color in
+  the foliage layer. <!-- src: settlement-gate -->
+- **Part B (any one):** bananas, banana pods, grapes, birds, or butterflies.
+  <!-- src: settlement-gate -->
+- Violation = full Part A **AND** a Part B element. Part B alone does not block.
+  <!-- src: settlement-gate -->
+- Acceptable carve-outs (tree trunks, clearly-represented branches, or
+  fruit/animal elements other than the Part B list) can make an otherwise-tropical
+  pattern OK. <!-- src: settlement-gate -->
+
+## Enforcement
+Text anti-prompts are NOT enforceable on the image generator, so the PRODUCED
+image must be visually re-checked before `is_published=true` or any Shopify
+push. <!-- src: settlement-gate -->
+
+## Related
+- [[store-and-data-truth]] — a publish is a customer-facing production write.
diff --git a/operations/store-and-data-truth.md b/operations/store-and-data-truth.md
new file mode 100644
index 0000000..5980be9
--- /dev/null
+++ b/operations/store-and-data-truth.md
@@ -0,0 +1,35 @@
+---
+id: store-and-data-truth
+type: operations
+tags: [hard-rule, shopify, dw_unified, gmc, shipping, gotcha]
+aliases: ["sandbox is live", "unified-first", "which store is live"]
+sources: [sources/store-truth.md, sources/hard-catalog-rules.md]
+updated: 2026-07-17
+---
+# Store & data truth
+
+**Summary:** designer-laboratory-sandbox.myshopify.com IS the LIVE production store; canonical writes go dw_unified first then Shopify; variant weight = customer shipping cost; GMC has a fixed price policy.
+
+## Store / data
+- `designer-laboratory-sandbox.myshopify.com` IS the real, LIVE, PRODUCTION DW
+  Shopify store — legacy misnomer, NOT staging. Every write is customer-facing;
+  gate as full production. <!-- src: store-truth -->
+- Canonical catalog writes go dw_unified (PostgreSQL) FIRST, then Shopify. The
+  Shopify write is the authoritative customer-facing one; the mirror re-syncs
+  from it. <!-- src: store-truth -->
+- dw_unified is the Kamatera canonical DB; a local mirror is read via the /tmp
+  socket. <!-- src: store-truth -->
+- UNIFIED-FIRST: answer "what/collections recently added" from
+  dw_sku_registry.created_at grouped by vendor_prefix, NOT live Shopify (the
+  mirror has no created_at). <!-- src: hard-catalog-rules -->
+
+## Gotchas that touch money
+- **WEIGHT = CHECKOUT SHIPPING:** the DW store is weight-based checkout shipping
+  (lb), so variant grams change what customers PAY. NEVER set grams to fix a GMC
+  missing_shipping_weight error — use a feed-only weight override. <!-- src: hard-catalog-rules -->
+- **GMC POLICY:** all active products on Google at the HIGHEST price; sample-only
+  at $4.25. A $4.25 price leaking as the sellable price risks GMC disapproval.
+  <!-- src: hard-catalog-rules -->
+
+## Related
+- [[catalog-gates]] · [[pricing-rules]] · [[settlement-gate]].
diff --git a/people/_about.md b/people/_about.md
new file mode 100644
index 0000000..6c30044
--- /dev/null
+++ b/people/_about.md
@@ -0,0 +1,5 @@
+# people/
+
+One entry per person. Aliases, role, affiliations, quotes, decisions they made.
+
+Entry files here are `<slug>.md` with YAML frontmatter (see ../SCHEMA.md).
diff --git a/projects/_about.md b/projects/_about.md
new file mode 100644
index 0000000..dbf9540
--- /dev/null
+++ b/projects/_about.md
@@ -0,0 +1,5 @@
+# projects/
+
+One entry per initiative. Goal, status, decisions, open questions.
+
+Entry files here are `<slug>.md` with YAML frontmatter (see ../SCHEMA.md).
diff --git a/sources/hard-catalog-rules.md b/sources/hard-catalog-rules.md
new file mode 100644
index 0000000..20be5c6
--- /dev/null
+++ b/sources/hard-catalog-rules.md
@@ -0,0 +1,14 @@
+DW HARD CATALOG RULES.
+- 5-FIELD RULE: every ACTIVE SKU must have (1) a sample variant, (2) a sellable
+  product variant, (3) complete pricing (no $0/null), (4) a description, (5) >=2 tags.
+- GO-LIVE GATE: any SKU created in the last 6 months must have a real vendor name
+  AND a real mfr SKU number (not blank, not a reused internal counter, not just
+  the handle's numeric tail) before it can go live.
+- UNIFIED-FIRST: data lands in dw_unified FIRST, then Shopify. Answer
+  "what/collections recently added" from dw_sku_registry.created_at grouped by
+  vendor_prefix, NOT live Shopify (the mirror has no created_at).
+- WEIGHT = CHECKOUT SHIPPING: the DW store is weight-based checkout shipping (lb),
+  so variant grams change what customers PAY. NEVER set grams to fix a GMC
+  missing_shipping_weight error; use a feed-only weight override instead.
+- GMC POLICY: all active products on Google at the HIGHEST price; sample-only at
+  $4.25. A $4.25 price leaking as the sellable price risks GMC disapproval.
diff --git a/sources/material-rules.md b/sources/material-rules.md
new file mode 100644
index 0000000..4f7ec83
--- /dev/null
+++ b/sources/material-rules.md
@@ -0,0 +1,8 @@
+DW MATERIAL / UNIT RULES.
+- Acoustical wallcoverings are polyester/olefin FIBER, NOT Type II vinyl. PDP
+  Material = custom.material metafield. (e.g. Sidmouth = Momentum "Silence"
+  50% Poly / 50% PP.)
+- GRS grasscloth SKUs are 36" wide ONLY: canonical width "36" Wide (trim to 34")".
+- DOUBLE-ROLL RULE ("2 and 2"): the private-label double-roll lines (Thibaut,
+  Malibu Wallpaper/WallQuest, Malibu Walls/Brewster, York) keep a 2-roll minimum
+  and D/R length ~ 2x S/R length.
diff --git a/sources/pricing-rules.md b/sources/pricing-rules.md
new file mode 100644
index 0000000..b10ba78
--- /dev/null
+++ b/sources/pricing-rules.md
@@ -0,0 +1,14 @@
+DW PRICING RULES.
+- Generic retail formula: retail = net_cost / 0.65 / 0.85.
+- Memo sample price: $4.25 (sample-only variant).
+- Kravet-umbrella family prices at MAP (Minimum Advertised Price), NOT the
+  generic formula. MAP = wholesale (WHLS) cost x 1.5 (verified ~universal).
+  Family: Kravet (+Couture/Design/Contract/Basics), Lee Jofa, Lee Jofa Modern,
+  Groundworks, Brunschwig & Fils, Cole & Son, GP&J Baker, Colefax & Fowler,
+  Clarke & Clarke, Mulberry, Threads, Baker Lifestyle, Andrew Martin,
+  Nicolette Mayer, Aerin, Barclay Butera, Thom Filicia. Kravet ENFORCES MAP.
+- York + its private labels sell at MAP (blank -> MSRP x 0.75).
+- Brand McKenzie (DWBM): cost = Sancar FULL retail + 5% tariff (no trade
+  discount); retail = sancar / 0.65 / 0.85.
+- Greenland/Phillipe Romano cork: $59.50 per yard, sold in 6-yard increments.
+- Justin David / LA Fabrics: per-yard = 15% off JD list; retail ~ list/0.65 + flat tariff.
diff --git a/sources/private-label-map.md b/sources/private-label-map.md
new file mode 100644
index 0000000..1f22635
--- /dev/null
+++ b/sources/private-label-map.md
@@ -0,0 +1,13 @@
+DW PRIVATE-LABEL MAP. Several vendor lines are sold under a DW house brand; the
+REAL vendor name must NEVER appear customer-facing (title, handle/URL, vendor
+field, brand metafield, tags, alt text, image filenames).
+- WallQuest / Chesapeake / NextWall / Seabrook  -> "Malibu Wallpaper"
+- Brewster                                        -> "Malibu Walls"
+- Command54                                       -> "Phillipe Romano" (East Coast beach-city collection names)
+- Greenland (cork)                                -> "Phillipe Romano" (coastal-city style names; Cork- SKUs)
+- Justin David (fabric)                           -> "Los Angeles Fabrics" / "Phillipe Romano" (DWLA)
+- Momentum / Versa / Versa Designed Surfaces      -> "Hollywood Wallcoverings" (California-city names)
+- Sister Parish                                   -> "Saybrook House" collection (DWPH)
+- York-branded line                               -> "Jeffrey Stevens" (DWJS)
+Also: Desima/Carlsten and Nicolette Mayer are archived / must stay off.
+A weekly dw-leak-scanner watches live pages for any of these names leaking.
diff --git a/sources/settlement-gate.md b/sources/settlement-gate.md
new file mode 100644
index 0000000..f61baab
--- /dev/null
+++ b/sources/settlement-gate.md
@@ -0,0 +1,10 @@
+SETTLEMENT LEGAL GATE (wallpaper imagery). Before generating or publishing any
+wallpaper/wallcovering design, it must clear the settlement gate. A design
+VIOLATES only when it satisfies ALL of Part A AND contains a Part B element:
+- Part A (all three): A1 directional variation among leaves/palm fronds/foliage;
+  A2 open space between leaves; A3 more than one ink color in the foliage layer.
+- Part B (any one): bananas, banana pods, grapes, birds, or butterflies.
+Acceptable carve-outs (tree trunks, clearly-represented branches, or fruit/animal
+elements other than the Part B list) can make an otherwise-tropical pattern OK.
+Text anti-prompts are not enforceable on the image generator, so the PRODUCED
+image must be visually re-checked before is_published=true or any Shopify push.
diff --git a/sources/store-truth.md b/sources/store-truth.md
new file mode 100644
index 0000000..69899c1
--- /dev/null
+++ b/sources/store-truth.md
@@ -0,0 +1,7 @@
+DW STORE / DATA TRUTH.
+- designer-laboratory-sandbox.myshopify.com IS the real, LIVE, PRODUCTION
+  Designer Wallcoverings Shopify store (legacy misnomer, NOT staging). Every
+  write is customer-facing; gate it as full production.
+- Canonical catalog writes go dw_unified (PostgreSQL) FIRST, then Shopify. The
+  Shopify write is the authoritative customer-facing one; the mirror re-syncs from it.
+- dw_unified is the Kamatera canonical DB; a local mirror is read via the /tmp socket.

(oldest)  ·  back to Dw Knowledge  ·  expand seed: Schumacher internal-only, disco flow, naturals bf6f121 →