← back to Designer Wallcoverings
audit: readiness re-run post-Sangetsu-storeapi-enrich (descriptions 0->614)
8592e89076a3e14fd1390ad0d1ddbb15e057abb8 · 2026-07-02 07:47:05 -0700 · Steve Abrams
Files touched
M onboarding/sangetsu-lilycolor/READINESS-063026A.mdM onboarding/sangetsu-lilycolor/readiness-063026A.json
Diff
commit 8592e89076a3e14fd1390ad0d1ddbb15e057abb8
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Jul 2 07:47:05 2026 -0700
audit: readiness re-run post-Sangetsu-storeapi-enrich (descriptions 0->614)
---
onboarding/sangetsu-lilycolor/READINESS-063026A.md | 195 ++++++++++++---------
.../sangetsu-lilycolor/readiness-063026A.json | 132 ++++++++------
2 files changed, 192 insertions(+), 135 deletions(-)
diff --git a/onboarding/sangetsu-lilycolor/READINESS-063026A.md b/onboarding/sangetsu-lilycolor/READINESS-063026A.md
index 5dd51ab5..9b3456a2 100644
--- a/onboarding/sangetsu-lilycolor/READINESS-063026A.md
+++ b/onboarding/sangetsu-lilycolor/READINESS-063026A.md
@@ -1,134 +1,167 @@
-# Sangetsu + Lilycolor — Activation-Gate Readiness Audit (063026A) — RE-RUN post-enrichment-complete
+# 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.
-**Generated:** 2026-07-02 (Mac2). RE-RUN of the 2026-07-01 snapshot now that Lilycolor design-enrichment is COMPLETE.
-**Inputs (staging/):** `lilycolor-merged-063026A.jsonl` (2,543), `enrichment-full-063026A.final.jsonl` (2,634 rows, 0 error — the now-COMPLETE enrichment), `lilycolor-titles-en-063026A.jsonl` (963), `lilycolor-titles-fallback-063026A.jsonl` (1,580), `sangetsu-staging.jsonl` (622 patterns).
+**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 — HEADLINE MOVED
+## Executive Summary — SANGETSU DESCRIPTIONS LANDED
-**Gate-ready EXCEPT cost = 2,543 SKUs (was 320).** The entire Lilycolor line is now gate-ready on every content dimension and is blocked on ONE thing only: a confirmed DW net cost.
+**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.
-The prior audit's 320 was gated by two INCOMPLETE dimensions — description (28%) and EN-title (27%) — because enrichment coverage was only 806/2,634. **Both dimensions are now 100%:**
-- **Enrichment is COMPLETE** — `enrichment-full-063026A.final.jsonl` = **2,634 rows, all clean (styles[] + hex[] + material + description), 0 error**. Joining by `sku` to the 2,543 Lilycolor SKUs covers **2,543 / 2,543 = 100%** (the extra 91 enriched rows are SKU-range expansions within LV/LL/LMT/LW and are harmless overflow).
-- **EN titles are COMPLETE** — `titles-en` (963) ∪ `titles-fallback` (1,580) = **exactly 2,543 = 100%**, every SKU has an English title (with the banned word normalized to "Wallcovering").
+**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).
-With images (100%), specs (100%), and list price present (100%) already true, and description + EN-title now also 100%, **the intersection is the full 2,543.**
+**Lilycolor is unchanged: 2,543 gate-ready-except-cost (100% on every content dimension), blocked on ONE thing only — confirmed DW net cost.**
-**Bottom line for Steve:** The ONLY remaining Lilycolor publish blocker is **confirmed net cost** (`cost_confirmed = 0/2,543`, `activation_ready = 0/2,543` on the merged file) — already drafted in pending-approval. Sangetsu is **unchanged** and contributes **0 gate-ready SKUs** — its 10,263 still need a specs + description + cost build-out before it is gateable at all. **No NEW gated item surfaced.**
+**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 (unchanged)
+## 1. Total staged SKU count — reconciled (Sangetsu grew)
-| Vendor | Proposed prefix | Unique SKUs | Notes |
-|---|---|---|---|
-| Lilycolor | `DWLC` | **2,543** | 1 row = 1 mfr_sku in `lilycolor-merged-063026A.jsonl`, no dupes |
-| Sangetsu/Goodrich | `DWGO` | **10,263** | 622 patterns → 10,532 colorway entries − 269 cross-pattern dups = 10,263 unique |
-| **TOTAL** | | **12,806** | 2,543 + 10,263 = 12,806, confirmed |
+| 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)
-| Dimension | Lilycolor | Δ vs prior | Sangetsu | Δ |
+### 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 |
|---|---|---|---|---|
-| Unique SKUs | 2,543 | — | 10,263 | — |
-| Images (≥1) | **2,543 (100%)** | — | 9,492 (92.5%) | — |
-| Specs (width+unit / pattern spec) | **2,543 (100%)** | — | 906 (8.8%) | — |
-| **Enrichment (styles+hex+material+desc, join to final.jsonl)** | **2,543 (100%)** | **806 → 2,543** | 0 (0%) | — |
-| Description | **2,543 (100%)** | 701 → 2,543 | 0 (0%) | — |
-| EN title (en ∪ fallback) | **2,543 (100%)** | 689 → 2,543 | n/a (already English) | — |
-| List price present (¥ — LIST, **NOT cost**) | **2,543 (100%)** | — | 0 (0%) | — |
-| Confirmed net cost | **0 (0%)** | — | 0 (0%) | — |
-| **GATE-READY EXCEPT COST** | **2,543 (100%)** | **320 → 2,543** | **0** | — |
+| 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)
-All counts produced with `python3` reading raw JSONL. Working dir: `onboarding/sangetsu-lilycolor/staging/`.
+Working dir: `onboarding/sangetsu-lilycolor/staging/`. All counts via `python3` over raw JSONL.
-**Enrichment coverage — JOIN by `sku` to the COMPLETE final file:**
+**Sangetsu SKU-level dedup (first pattern wins):**
```python
-enrich_clean = set()
-for line in open('enrichment-full-063026A.final.jsonl'):
- d = json.loads(line)
- if d.get('error'): continue # 0 error rows
- if d.get('styles') and d.get('hex') and d.get('material') \
- and (d.get('description') or '').strip():
- enrich_clean.add(d['sku'])
-# len(enrich_clean) == 2634 ; all 2543 Lilycolor mfr_sku ∈ enrich_clean → 100%
+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%)
```
-**EN-title coverage — union of the two title files:**
+**Sangetsu gate-ready-except-enrichment-and-cost** (has image + description + width; lacks ONLY enrichment + cost):
```python
-any_title = {d['sku'] for d in map(json.loads, open('lilycolor-titles-en-063026A.jsonl'))
- if (d.get('title_en') or '').strip()} \
- | {d['sku'] for d in map(json.loads, open('lilycolor-titles-fallback-063026A.jsonl'))
- if (d.get('title_en') or '').strip()}
-# 963 ∪ 1580 == 2543 (exactly the full Lilycolor set)
+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**.
-**Gate-ready-except-cost per Lilycolor row:**
-```python
-for r in map(json.loads, open('lilycolor-merged-063026A.jsonl')):
- sku = r['mfr_sku']
- has_img = bool(r.get('has_image')) or (r.get('image_count') or 0) >= 1
- has_spec = bool(r.get('width')) and bool(r.get('unit'))
- has_desc = (sku in enrich_clean) or bool((r.get('design') or {}).get('description','').strip())
- has_en = (sku in any_title) or bool((r.get('title_en') or '').strip())
- ready = has_img and has_spec and has_desc and has_en # missing ONLY cost
-# sum(ready) == 2543
-```
-
-Every one of images / specs / enrichment / description / EN-title / list-price evaluates to 2,543 → the intersection is 2,543, with **zero** blocking reasons among non-ready (there are none).
+**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 the remainder — Lilycolor
+## 4. What still blocks Sangetsu — be specific
-**Nothing on the content side.** The blocking-reason tally over the 2,543 is empty: 0 missing image, 0 missing spec, 0 missing description, 0 missing EN title. The single gate that remains open for all 2,543 is:
+**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.
-- **Confirmed DW net cost** — `cost_confirmed = 0/2,543`, `activation_ready = 0/2,543`. The staged `list_price_yen` / `m2_price_yen` is Japan **LIST** price, explicitly **NOT** a confirmed DW net cost, and cannot be used to derive retail under the gate. This is the sole Steve/purchasing blocker and is **already drafted in pending-approval**.
+**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.
-No settlement or banned-word blocker exists: a scan of all 2,543 titles + descriptions found **0 occurrences of the banned word "Wallpaper"** (all normalized to "Wallcovering"). `settlement_required` flags are carried per SKU for the pre-publish gate but are not a content-coverage gap.
+**Sangetsu gate-ready-except-cost = 0** — because enrichment is a hard content dimension and it is 0 across the board.
---
-## 5. What still blocks Sangetsu (unchanged from prior audit)
+## 5. What still blocks Lilycolor (unchanged)
-Sangetsu is **not gateable** independent of cost. Its 10,263 unique SKUs still need a full content build:
+**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:
-| Missing dimension | Count | Notes |
-|---|---|---|
-| Description | 10,263 | no description field in schema; overview on only 4/622 patterns |
-| Specs (width/type/weight/backing) | 9,357 | pattern-level spec null on 544/622 patterns (only 906 SKUs covered) |
-| Enrichment | 10,263 | 0 Sangetsu SKUs in the enrichment final |
-| List price field | 10,263 | no price field at all (LIST unavailable, unlike Lilycolor) |
-| Image URL | 771 | unique SKUs with no `sku_images` entry (9,492 have one) |
-| Confirmed net cost | 10,263 | same cost blocker as Lilycolor |
+- **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)
-**Sangetsu gate-ready-except-cost = 0**, unchanged.
+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.)
---
-## 6. Gate-ready EXCEPT cost — the headline (RE-RUN)
+## 7. Gate-ready EXCEPT cost — the headline (RE-RUN)
-| Vendor | Prior (063026A snapshot) | **NOW (post-enrichment-complete)** |
+| Vendor | Prior (06:22 snapshot) | **NOW (post-Store-API enrich)** |
|---|---|---|
-| Lilycolor | 320 | **2,543** |
-| Sangetsu | 0 | **0** |
-| **TOTAL** | **320** | **2,543** |
+| 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** |
-The prior number was a live-sweep floor. With enrichment + titles both complete, the Lilycolor line has converged to its ceiling: **the entire 2,543 is ready to publish the moment net cost is confirmed.**
+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.
---
-## 7. Followups for Steve (gated)
+## 8. Followups for Steve (gated)
-1. **Confirm DW net cost for the Lilycolor 2,543** — the SOLE remaining activation blocker for the whole line; already drafted in pending-approval. On confirmation, all 2,543 flip gate-clear.
-2. Sangetsu (10,263) needs a specs + description + enrichment + cost build before it is gateable at all — separate track, independent of the Lilycolor cost ask.
+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 gated item surfaced by this re-run** (expected: none — confirmed).
+**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>
diff --git a/onboarding/sangetsu-lilycolor/readiness-063026A.json b/onboarding/sangetsu-lilycolor/readiness-063026A.json
index cd0d8de2..160966b1 100644
--- a/onboarding/sangetsu-lilycolor/readiness-063026A.json
+++ b/onboarding/sangetsu-lilycolor/readiness-063026A.json
@@ -1,53 +1,56 @@
{
"audit": "sangetsu-lilycolor-activation-gate-readiness",
"tag": "063026A",
- "run": "re-run-post-enrichment-complete",
+ "run": "re-run-post-sangetsu-storeapi-enrich",
"generated_at": "2026-07-02",
"machine": "Mac2",
"read_only": true,
"snapshot_partial": false,
- "complete_note": "Lilycolor enrichment COMPLETE (enrichment-full-063026A.final.jsonl = 2634 rows, 0 error, all clean). Description + EN-title dimensions now 100%; no live sweep running.",
+ "complete_note": "Sangetsu got a WooCommerce Store-API detail backfill (623/623 hits, 0 miss): overview 4->614 patterns, specs backfilled. A prior 06:33 restage also grew Sangetsu 622->623 patterns and 10,263->13,067 unique SKUs. Lilycolor unchanged.",
"headline": {
+ "sangetsu_description_pattern_level": { "before": 4, "after": 614, "of_patterns": 623, "pct": 98.6 },
+ "sangetsu_description_sku_level": { "before": 0, "after": 12588, "of_skus": 13067, "pct": 96.3 },
+ "sangetsu_gate_ready_except_enrichment_and_cost": 1209,
+ "sangetsu_gate_ready_except_cost": 0,
+ "lilycolor_gate_ready_except_cost": 2543,
"gate_ready_except_cost_total": 2543,
- "gate_ready_except_cost_prior": 320,
- "gate_ready_except_cost_by_vendor": { "lilycolor": 2543, "sangetsu": 0 },
- "cost_missing_all_skus": 12806,
- "cost_note": "staged yen is Japan LIST price, NOT confirmed DW net cost; cost missing for 100% (cost_confirmed=0/2543, activation_ready=0/2543)",
- "sole_remaining_lilycolor_blocker": "confirmed DW net cost (drafted in pending-approval)",
- "new_gated_item": null
+ "gate_ready_except_cost_prior": 2543,
+ "cost_missing_all_skus": 15610,
+ "cost_note": "Lilycolor staged yen is Japan LIST not DW net cost; Sangetsu has no price field at all.",
+ "new_steve_gated_item": null,
+ "new_content_normalization_flag": "banned word 'wallpaper' present in 53 Sangetsu patterns -> 3473 SKUs' backfilled descriptions; normalize to 'Wallcovering' at build (reversible, non-gated)"
},
"totals": {
- "claim_12806": "CONFIRMED",
- "reconciliation": "2543 lilycolor + 10263 sangetsu = 12806",
+ "prior_total": 12806,
+ "now_total": 15610,
+ "reconciliation": "2543 lilycolor + 13067 sangetsu = 15610",
"lilycolor_unique_skus": 2543,
- "sangetsu_unique_skus": 10263,
- "sangetsu_colorway_entries_raw": 10532,
- "sangetsu_cross_pattern_dup_entries": 269
+ "sangetsu_unique_skus": 13067,
+ "sangetsu_unique_skus_prior": 10263,
+ "sangetsu_sku_delta": 2804,
+ "sangetsu_sku_delta_cause": "06:33 restage (622->623 patterns, 10,532->13,358 colorway entries); NOT the store-api enrich",
+ "sangetsu_patterns": 623,
+ "sangetsu_colorway_entries_raw": 13358,
+ "sangetsu_cross_pattern_dup_entries": 291
},
- "enrichment_final": {
- "file": "enrichment-full-063026A.final.jsonl",
- "rows_total": 2634,
- "error_rows": 0,
- "clean_rows_styles_hex_material_desc": 2634,
- "unique_sku_keys": 2634,
- "lilycolor_skus_covered": 2543,
- "lilycolor_coverage_pct": 100.0,
- "extra_enrich_rows_not_in_merged": 91,
- "extra_enrich_prefixes": { "LV": 41, "LL": 30, "LMT": 7, "LW": 13 },
- "extra_note": "SKU-range expansions within existing patterns; harmless overflow, do not reduce Lilycolor coverage"
- },
- "titles": {
- "en_file_rows": 963,
- "fallback_file_rows": 1580,
- "union_with_title_en": 2543,
- "en_title_coverage_pct": 100.0,
- "banned_word_wallpaper_in_titles_or_desc": 0
+ "sangetsu_storeapi_enrich": {
+ "script": "scripts/sangetsu-storeapi-enrich.py",
+ "patterns": 623,
+ "store_api_hit": 623,
+ "miss": 0,
+ "overview_before": 4,
+ "overview_after": 614,
+ "width_or_type_before": 74,
+ "width_or_type_after": 96,
+ "pattern_field_coverage": {
+ "width": 78, "type": 75, "material": 26, "weight": 57,
+ "backing": 61, "match": 25, "repeat": 11
+ }
},
"vendors": {
"lilycolor": {
"prefix_proposed": "DWLC",
"unique_skus": 2543,
- "prefix_breakdown": { "LL": 867, "LW": 673, "LV": 642, "LMT": 224, "LWT": 41, "LWA": 41, "LIS": 24, "LLA": 24, "LLT": 7 },
"images_ge1": 2543, "images_pct": 100.0,
"specs_populated": 2543, "specs_pct": 100.0,
"enrichment_join_clean": 2543, "enrichment_pct": 100.0,
@@ -56,34 +59,55 @@
"list_price_present": 2543, "list_price_pct": 100.0, "list_price_is_cost": false,
"cost_confirmed": 0, "activation_ready": 0,
"gate_ready_except_cost": 2543,
- "gate_ready_except_cost_prior": 320,
- "blocking_reasons_among_non_ready": {}
+ "status": "unchanged; sole blocker = confirmed DW net cost (drafted in pending-approval)",
+ "banned_word_wallpaper_in_titles_or_desc": 0
},
"sangetsu": {
"prefix_proposed": "DWGO",
- "unique_skus": 10263,
- "colorway_entries_raw": 10532,
- "images_ge1": 9492, "images_missing": 771, "images_pct": 92.5,
- "specs_populated": 906, "specs_pct": 8.8,
- "patterns_with_any_spec": 78, "patterns_with_overview": 4,
- "description_nonempty": 0,
- "enrichment_clean": 0,
- "list_price_present": 0, "list_price_note": "no price field at all",
- "gate_ready_except_cost": 0,
- "status": "unchanged vs prior audit"
+ "patterns": 623,
+ "unique_skus": 13067,
+ "colorway_entries_raw": 13358,
+ "cross_pattern_dup_entries": 291,
+ "pattern_level": {
+ "overview": 614, "overview_pct": 98.6,
+ "width": 78, "type": 75, "width_or_type": 96, "width_or_type_pct": 15.4,
+ "material": 26, "weight": 57, "backing": 61, "match": 25, "repeat": 11
+ },
+ "sku_level": {
+ "image": 12291, "image_pct": 94.1, "image_missing": 776,
+ "description": 12588, "description_pct": 96.3, "description_missing": 479,
+ "width": 1270, "width_pct": 9.7, "width_missing": 11797,
+ "width_or_type": 1293, "width_or_type_pct": 9.9,
+ "enrichment": 0, "enrichment_pct": 0.0,
+ "cost": 0, "list_price": 0,
+ "gate_ready_except_enrichment_and_cost": 1209,
+ "gate_ready_except_cost": 0
+ },
+ "blocks_the_1209": ["enrichment (ollama, not run)", "confirmed DW net cost (no price field at all)"],
+ "blocks_the_remaining_11858": [
+ "width spec missing on 11,797 (only in PDF catalogs sangetsu-pdf-specs.jsonl + pricebooks/, not yet merged)",
+ "description missing on 479 (9 patterns w/o overview)",
+ "image missing on 776",
+ "enrichment (all)",
+ "cost (all)"
+ ],
+ "banned_word_wallpaper": { "patterns": 53, "skus_affected": 3473, "note": "vendor WooCommerce copy; normalize to 'Wallcovering' at build (non-gated)" }
}
},
"gap_table": [
- { "dimension": "description", "vendor": "sangetsu", "count": 10263 },
- { "dimension": "specs", "vendor": "sangetsu", "count": 9357 },
- { "dimension": "enrichment", "vendor": "sangetsu", "count": 10263 },
- { "dimension": "list_price_field", "vendor": "sangetsu", "count": 10263 },
- { "dimension": "image", "vendor": "sangetsu", "count": 771 },
- { "dimension": "net_cost", "vendor": "lilycolor", "count": 2543, "note": "SOLE remaining Lilycolor blocker; drafted in pending-approval" },
- { "dimension": "net_cost", "vendor": "sangetsu", "count": 10263 }
+ { "dimension": "width_spec", "vendor": "sangetsu", "count": 11797, "note": "biggest gap; width lives only in PDF catalogs" },
+ { "dimension": "enrichment", "vendor": "sangetsu", "count": 13067, "note": "ollama not run" },
+ { "dimension": "cost", "vendor": "sangetsu", "count": 13067, "note": "no price field at all" },
+ { "dimension": "image", "vendor": "sangetsu", "count": 776 },
+ { "dimension": "description", "vendor": "sangetsu", "count": 479 },
+ { "dimension": "net_cost", "vendor": "lilycolor", "count": 2543, "note": "SOLE remaining Lilycolor blocker; drafted in pending-approval" }
],
"gated_followups_for_steve": [
- "Confirm DW net cost for Lilycolor 2,543 — sole remaining activation blocker, already drafted in pending-approval. On confirmation all 2,543 flip gate-clear.",
- "Sangetsu 10,263 needs specs + description + enrichment + cost build before gateable (separate track)."
- ]
+ "Confirm DW net cost for Lilycolor 2,543 — sole remaining activation blocker, drafted in pending-approval.",
+ "Run ollama enrichment on Sangetsu — flips the 1,209 img+desc+width SKUs to gate-ready-except-cost.",
+ "Parse Sangetsu PDF catalogs (sangetsu-pdf-specs.jsonl + pricebooks/) into pattern width/type — 11,797 SKUs missing width.",
+ "Normalize 'wallpaper' -> 'Wallcovering' in 53 Sangetsu descriptions (3,473 SKUs) at build (reversible, non-gated).",
+ "Sangetsu cost — no price field; needs purchasing/rep quote (separate track)."
+ ],
+ "new_gated_item": null
}
← ee401ffe auto-save: 2026-07-02T07:46:12 (8 files) — DW-MCP/daily-sale
·
back to Designer Wallcoverings
·
sangetsu: case-insensitive banned-word guard in overview ext 5e8d6afa →