← back to Designer Wallcoverings
onboarding/sangetsu-lilycolor/READINESS-063026A.md
168 lines
# Sangetsu + Lilycolor — Activation-Gate Readiness Audit (063026A) — RE-RUN post-Sangetsu-Store-API enrich
**Type:** READ-ONLY audit. No writes to dw_unified, Shopify, or any canonical store. No LLM/ollama/vision calls — pure file/JSON analysis. One local report write only (this file + its JSON sibling).
**Generated:** 2026-07-02 (Mac2). RE-RUN of the 2026-07-02 06:22 snapshot after Sangetsu received a detail backfill from the WooCommerce Store API.
**Inputs (staging/):** `sangetsu-staging.jsonl` (623 patterns, 13,358 colorway entries), `lilycolor-merged-063026A.jsonl` (2,543), `enrichment-full-063026A.final.jsonl` (2,634 rows, 0 error), `lilycolor-titles-en-063026A.jsonl` (963), `lilycolor-titles-fallback-063026A.jsonl` (1,580).
---
## Executive Summary — SANGETSU DESCRIPTIONS LANDED
**NEW Sangetsu headline: description/overview coverage moved 0 → 614 of 623 patterns (98.6%), which propagates to 12,588 / 13,067 colorway SKUs (96.3%).** The Store-API enrich (`scripts/sangetsu-storeapi-enrich.py`, 623/623 store-API hits, 0 miss) merged per-pattern `overview` plus opportunistic spec fields into every pattern. This is the first time Sangetsu has had descriptions at all.
**Two independent movements this morning — do not conflate them:**
1. **Restage (06:33–06:36):** grew the catalog 622 patterns / 10,263 unique SKUs → **623 patterns / 13,067 unique SKUs** (+1 pattern, +2,804 SKUs). Overview still 4 at this stage.
2. **Store-API enrich (07:25–07:42):** SKU count UNCHANGED; **overview 4 → 614 patterns**, and specs backfilled where the source carries them (width 78, type 75, material 26, weight 57, backing 61, match 25, repeat 11 — per pattern).
**Lilycolor is unchanged: 2,543 gate-ready-except-cost (100% on every content dimension), blocked on ONE thing only — confirmed DW net cost.**
**Sangetsu gate-ready-except-enrichment-and-cost = 1,209 SKUs** (have image + description + a width spec; lack only enrichment + cost). The remaining ~11,858 are still spec-starved (width lives only in the PDF catalogs). **Sangetsu gate-ready-except-cost = 0** (every Sangetsu SKU still needs ollama enrichment, which has not been run).
**One NEW content-normalization flag** (not a Steve-gated action): the backfilled vendor copy carries the banned word "wallpaper" in **53 patterns → 3,473 SKUs' descriptions**; these must be normalized to "Wallcovering" during the build before any publish. **No new Steve-gated item surfaced** (expected: none — confirmed).
---
## 1. Total staged SKU count — reconciled (Sangetsu grew)
| Vendor | Proposed prefix | Unique SKUs | Δ vs prior | Notes |
|---|---|---|---|---|
| Lilycolor | `DWLC` | **2,543** | — | 1 row = 1 mfr_sku in `lilycolor-merged-063026A.jsonl`, no dupes |
| Sangetsu/Goodrich | `DWGO` | **13,067** | +2,804 | 623 patterns → 13,358 colorway entries − 291 cross-pattern dups = 13,067 unique |
| **TOTAL** | | **15,610** | +2,804 | 2,543 + 13,067 |
The +2,804 Sangetsu delta is entirely the **06:33 restage** (622→623 patterns, 10,532→13,358 colorway entries), not the Store-API enrich. Prior audit's 10,263 is now stale.
---
## 2. Per-vendor coverage table (RE-RUN)
### Lilycolor (unchanged)
| Dimension | Lilycolor | Δ |
|---|---|---|
| Unique SKUs | 2,543 | — |
| Images (≥1) | 2,543 (100%) | — |
| Specs (width+unit) | 2,543 (100%) | — |
| Enrichment (styles+hex+material+desc) | 2,543 (100%) | — |
| Description | 2,543 (100%) | — |
| EN title (en ∪ fallback) | 2,543 (100%) | — |
| List price present (¥ LIST, NOT cost) | 2,543 (100%) | — |
| Confirmed net cost | 0 (0%) | — |
| **GATE-READY EXCEPT COST** | **2,543 (100%)** | — |
### Sangetsu — PATTERN-LEVEL (of 623 patterns)
| Dimension | Count | % | Δ vs prior |
|---|---|---|---|
| **Overview / description** | **614** | **98.6%** | **4 → 614** |
| Width | 78 | 12.5% | 0/few → 78 |
| Type | 75 | 12.0% | — |
| Width OR Type (any dim spec) | 96 | 15.4% | 74 → 96 |
| Material | 26 | 4.2% | — |
| Weight | 57 | 9.1% | — |
| Backing | 61 | 9.8% | — |
| Match | 25 | 4.0% | — |
| Repeat | 11 | 1.8% | — |
### Sangetsu — SKU-LEVEL / colorway (of 13,067 unique)
| Dimension | Count | % | Missing | Δ vs prior |
|---|---|---|---|---|
| Image (≥1) | 12,291 | 94.1% | 776 | — (scaled w/ restage) |
| **Description (overview propagated)** | **12,588** | **96.3%** | 479 | **0 → 12,588** |
| Spec — width (gate metafield) | 1,270 | 9.7% | 11,797 | 0/few → 1,270 |
| Spec — width OR type | 1,293 | 9.9% | 11,774 | — |
| Enrichment (styles+hex+material) | 0 | 0% | 13,067 | — (ollama not run) |
| List price / cost | 0 | 0% | 13,067 | — (no price field) |
| **GATE-READY EXCEPT ENRICHMENT + COST** (img+desc+width) | **1,209** | 9.3% | — | 0 → 1,209 |
| **GATE-READY EXCEPT COST** (needs enrichment too) | **0** | 0% | — | — |
Per-pattern spec/overview propagates to every SKU in that pattern's `colorway_skus[]`, so SKU-level coverage = Σ colorway_count over patterns carrying the field.
---
## 3. Join logic (reproducible, read-only)
Working dir: `onboarding/sangetsu-lilycolor/staging/`. All counts via `python3` over raw JSONL.
**Sangetsu SKU-level dedup (first pattern wins):**
```python
seen=set(); rows=[]
for p in map(json.loads, open('sangetsu-staging.jsonl')):
sp = p.get('spec') or {}
ov = bool((p.get('overview') or '').strip())
imgs = p.get('sku_images') or {}
for s in (p.get('colorway_skus') or []):
if s in seen: continue # 291 cross-pattern dups dropped
seen.add(s)
rows.append(dict(img=bool(imgs.get(s)), desc=ov, width=bool(sp.get('width'))))
# len(rows) == 13067
# desc -> 12588 (96.3%) width -> 1270 (9.7%) img -> 12291 (94.1%)
```
**Sangetsu gate-ready-except-enrichment-and-cost** (has image + description + width; lacks ONLY enrichment + cost):
```python
gr = sum(1 for r in rows if r['img'] and r['desc'] and r['width']) # == 1209
```
Enrichment = 0 for all Sangetsu (no Sangetsu SKU appears in `enrichment-full-063026A.final.jsonl`), and cost = 0 for all, so **gate-ready-except-COST alone = 0**.
**Lilycolor (re-confirm):** `enrichment-full-063026A.final.jsonl` = 2,634 clean rows (0 error); all 2,543 `mfr_sku` ∈ enrich set (100%). Titles `963 ∪ 1,580 = 2,543` (100%). Images / specs / list-price all 2,543 (100%). Intersection missing only cost = **2,543**.
---
## 4. What still blocks Sangetsu — be specific
**The 1,209 gate-ready-except-enrichment-and-cost SKUs are blocked by exactly two things:**
1. **Enrichment (ollama)** — 0 Sangetsu SKUs enriched. Needs the vision/LLM enrichment pass (styles[] + hex[] + material + per-SKU description) run on Sangetsu, same as was done for Lilycolor. Requires ollama, which this audit explicitly does not run.
2. **Confirmed DW net cost** — Sangetsu has NO price field at all (unlike Lilycolor's Japan LIST ¥). Cost must come from purchasing/rep; nothing derivable from staging.
**The remaining ~11,858 SKUs (13,067 − 1,209) are additionally blocked by:**
3. **Specs — width** — 11,797 SKUs (90.3%) still have no width. Only 96/623 patterns carry any dimension from the Store API; the rest live **only in the Sangetsu PDF catalogs** (`staging/sangetsu-pdf-specs.jsonl` + `pricebooks/`), which have not been parsed/merged into the pattern spec. Width is the hard gate metafield — no width → cannot go ACTIVE.
4. **Description** — 479 SKUs across the 9 patterns still missing overview.
5. **Image** — 776 SKUs with no `sku_images` entry.
**Sangetsu gate-ready-except-cost = 0** — because enrichment is a hard content dimension and it is 0 across the board.
---
## 5. What still blocks Lilycolor (unchanged)
**Nothing on the content side.** 0 missing image, 0 missing spec, 0 missing description, 0 missing EN title across all 2,543. The single open gate:
- **Confirmed DW net cost** — `cost_confirmed = 0/2,543`, `activation_ready = 0/2,543`. Staged ¥ is Japan **LIST** price, explicitly NOT a confirmed DW net cost. Already drafted in pending-approval. On confirmation, all 2,543 flip gate-clear.
Banned-word scan of all 2,543 Lilycolor titles + descriptions: **0 occurrences of "Wallpaper"** (all normalized to "Wallcovering").
---
## 6. NEW flag — banned word in backfilled Sangetsu copy (content-normalization, not Steve-gated)
The Store-API descriptions are the vendor's own WooCommerce copy and carry the banned word **"wallpaper"** in **53 patterns → 3,473 unique SKUs' propagated descriptions**. Per the standing rule, this MUST be normalized to "Wallcovering" during the Sangetsu build before any publish. This is a reversible, local staging-side normalization (not a customer-facing / destructive / gated action), so it is flagged here rather than drafted to pending-approval. (The `source_url` also contains the substring "wallpaper-wallcovering" but is not customer-facing text.)
---
## 7. Gate-ready EXCEPT cost — the headline (RE-RUN)
| Vendor | Prior (06:22 snapshot) | **NOW (post-Store-API enrich)** |
|---|---|---|
| Lilycolor | 2,543 | **2,543** |
| Sangetsu (except **cost only**) | 0 | **0** (still needs enrichment) |
| Sangetsu (except **enrichment + cost**) | 0 | **1,209** |
| **TOTAL gate-ready-except-cost** | **2,543** | **2,543** |
Lilycolor is at its ceiling — the entire 2,543 publishes the moment net cost is confirmed. Sangetsu's descriptions are now real (0 → 12,588 SKUs), and 1,209 SKUs are one enrichment pass + a cost confirmation away from gateable.
---
## 8. Followups for Steve (gated)
1. **Confirm DW net cost for the Lilycolor 2,543** — SOLE remaining activation blocker for the whole line; already drafted in pending-approval.
2. **Run ollama enrichment on Sangetsu** — would flip the 1,209 img+desc+width SKUs to gate-ready-except-cost, and lift the rest once specs are parsed.
3. **Parse the Sangetsu PDF catalogs** (`sangetsu-pdf-specs.jsonl` + `pricebooks/`) into pattern width/type — the single biggest Sangetsu content gap (11,797 SKUs missing width).
4. **Normalize "wallpaper" → "Wallcovering"** in the 53 backfilled Sangetsu descriptions (3,473 SKUs) before publish — build-time, reversible, non-gated.
5. **Sangetsu cost** — no price field exists at all; needs a purchasing/rep quote (separate track from the Lilycolor cost ask).
**No NEW Steve-gated item surfaced by this re-run** (expected: none — confirmed). The banned-word item is a build-time normalization, not a gated action.
</content>
</invoke>