← 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
A .gitignoreA .kl/manifest.jsonA CONTRADICTIONS.mdA INDEX.mdA SCHEMA.mdA SOURCES.mdA companies/_about.mdA concepts/_about.mdA concepts/map-pricing.mdA ideas/_about.mdA media/_about.mdA operations/_about.mdA operations/catalog-gates.mdA operations/material-and-unit-rules.mdA operations/pricing-rules.mdA operations/private-label-branding.mdA operations/settlement-gate.mdA operations/store-and-data-truth.mdA people/_about.mdA projects/_about.mdA sources/hard-catalog-rules.mdA sources/material-rules.mdA sources/pricing-rules.mdA sources/private-label-map.mdA sources/settlement-gate.mdA sources/store-truth.md
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 →