[object Object]

← back to Designer Wallcoverings

audit: readiness re-run post-enrichment-complete (Lilycolor enriched 806→2634)

0dadf14966cc34a907b11989f3bcbc58e36d8de7 · 2026-07-02 06:22:47 -0700 · Steve Abrams

Files touched

Diff

commit 0dadf14966cc34a907b11989f3bcbc58e36d8de7
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Jul 2 06:22:47 2026 -0700

    audit: readiness re-run post-enrichment-complete (Lilycolor enriched 806→2634)
---
 onboarding/sangetsu-lilycolor/READINESS-063026A.md | 207 +++++++++------------
 .../sangetsu-lilycolor/readiness-063026A.json      | 103 +++++-----
 2 files changed, 141 insertions(+), 169 deletions(-)

diff --git a/onboarding/sangetsu-lilycolor/READINESS-063026A.md b/onboarding/sangetsu-lilycolor/READINESS-063026A.md
index 246038ea..5dd51ab5 100644
--- a/onboarding/sangetsu-lilycolor/READINESS-063026A.md
+++ b/onboarding/sangetsu-lilycolor/READINESS-063026A.md
@@ -1,169 +1,134 @@
-# Sangetsu + Lilycolor — Activation-Gate Readiness Audit (063026A)
+# Sangetsu + Lilycolor — Activation-Gate Readiness Audit (063026A) — RE-RUN post-enrichment-complete
 
-**Type:** READ-ONLY audit. No writes to dw_unified, Shopify, or any canonical store. No LLM/ollama calls.
-**Generated:** 2026-07-01 (Mac2). Snapshot of a still-running enrichment + title-translation sweep.
-**Inputs (staging/):** `sangetsu-staging.jsonl`, `lilycolor-merged-063026A.jsonl`, `lilycolor-titles-en-063026A.jsonl`, `enrichment-full-063026A.jsonl` (+ `.seed/.shard0/.shard1/.sweep/.pilot`).
+**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).
 
 ---
 
-## Executive Summary
+## Executive Summary — HEADLINE MOVED
 
-**Gate-ready EXCEPT cost = 320 SKUs** (all Lilycolor). These 320 have images + specs + a description + an EN title, and are blocked on ONE thing only: a confirmed DW net cost. The staged `¥` is Japan **LIST** price, not cost — so **cost is KNOWN-MISSING for 100% of all 12,806 staged SKUs** and is the sole Steve/purchasing blocker. That 320 is a floor that will rise as the enrichment + title sweep (running right now) fills descriptions and EN titles: 2,543 Lilycolor SKUs already have 100% images / 100% specs / 100% list-price, so as description coverage (currently 701/2,543 = 28%) and EN-title coverage (689/2,543 = 27%) climb toward complete, the gate-ready-except-cost count converges toward the full 2,543. **Sangetsu contributes 0 gate-ready SKUs** — its schema has no price, no description field, and specs are populated on only ~9% of SKUs; it needs a spec + description + cost build-out before any of its 10,263 SKUs can approach the gate.
+**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.
 
-**Bottom line for Steve:** the cost ask is precisely scoped to **all 12,806 SKUs** (every one is cost-blocked), but the *nearest-term* activatable tranche is the Lilycolor 2,543 — of which **320 are ready TODAY** except cost, growing toward 2,543 as the local sweep completes. Sangetsu's 10,263 need enrichment work regardless of cost.
+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").
 
----
-
-## 1. Total staged SKU count — reconciled
-
-| Vendor | Proposed prefix | Unique SKUs | Notes |
-|---|---|---|---|
-| Lilycolor | `DWLC` | **2,543** | SKU-level rows in `lilycolor-merged-063026A.jsonl`, 1 row = 1 mfr_sku, no dupes |
-| Sangetsu/Goodrich | `DWGO` | **10,263** | 622 patterns → 10,532 colorway-SKU entries − 269 cross-pattern dup entries = 10,263 unique |
-| **TOTAL** | | **12,806** | |
+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.**
 
-**"12,806" claim = CONFIRMED, no discrepancy.** It equals 2,543 + 10,263 exactly. The raw Sangetsu colorway count (10,532) includes 269 SKUs that appear in more than one pattern; on a unique basis it is 10,263, which is the number `PUBLISH-PREP-063026A.md` uses. (`staging-summary.json` reports 3,107 for the *older* `lilycolor-staging.jsonl` and is stale relative to the freshest merge — the audit uses the freshest `lilycolor-merged-063026A.jsonl` per instruction, hence 2,543.)
+**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.**
 
 ---
 
-## 2. Images
+## 1. Total staged SKU count — reconciled (unchanged)
 
-| Vendor | Basis | ≥1 image | Zero image | % |
-|---|---|---|---|---|
-| Lilycolor | per SKU (`has_image` / `image_manifest`) | **2,543** | 0 | 100% |
-| Sangetsu | per unique SKU (`sku_images[sku]`) | **9,492** | 771 | 92.5% |
-| **TOTAL** | | **12,035** | 771 | 94.0% |
-
-Lilycolor images come from catalog ZIP manifests (C/P/R kinds) — bytes not yet fetched (`image_bytes_fetched:false`) but URLs/paths are present for 100%. Sangetsu images are direct `wp-content` JPG URLs at the colorway-SKU level; 771 unique SKUs have no image URL.
+| 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 |
 
 ---
 
-## 3. Specs (material / dimensions / type)
+## 2. Per-vendor coverage table (RE-RUN)
 
-| Vendor | Field basis | Populated | Missing | % |
+| Dimension | Lilycolor | Δ vs prior | Sangetsu | Δ |
 |---|---|---|---|---|
-| Lilycolor | `width` + `unit` per SKU (repeat on 1,246) | **2,543** | 0 | 100% |
-| Sangetsu | pattern-level `spec.{width,type,weight,backing}` propagated to SKUs | **906** | 9,357 | 8.8% |
-
-Lilycolor carries `width` (100%), `unit` (100%), and `repeat_tate/yoko` (49%) per SKU — spec-complete. Sangetsu's `spec` block is pattern-level and almost entirely null: only 78 of 622 patterns have any spec field (28 width, 64 type), covering 906 SKUs. **Sangetsu specs are the single biggest content gap.**
+| 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** | — |
 
 ---
 
-## 4. Description (non-empty body)
+## 3. Join logic (reproducible, read-only)
 
-| Vendor | Source | Non-empty | Missing | % |
-|---|---|---|---|---|
-| Lilycolor | `design.description` (local-hybrid enrichment) | **701** | 1,842 | 27.6% |
-| Sangetsu | — no description field in schema — | **0** | 10,263 | 0% |
-
-Lilycolor descriptions are produced by the running enrichment sweep (`_provider: local-hybrid`, `$0 (local)`). **PARTIAL — sweep still writing** (`enrichment-full-063026A.jsonl` + `.sweep.jsonl` mtimes seconds old at snapshot; PIDs 30405/52728/95458/2412 live). Sangetsu has no `overview`/`description` populated (4/622 patterns have any `overview`) and no per-SKU body at all.
+All counts produced with `python3` reading raw JSONL. Working dir: `onboarding/sangetsu-lilycolor/staging/`.
 
----
+**Enrichment coverage — JOIN by `sku` to the COMPLETE final file:**
+```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%
+```
 
-## 5. Title — Lilycolor EN vs JA-only
+**EN-title coverage — union of the two title files:**
+```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)
+```
 
-| Metric | Count | % |
-|---|---|---|
-| Lilycolor SKUs with an EN title (join to `lilycolor-titles-en-063026A.jsonl`, 687 title rows) | **689** | 27.1% |
-| Lilycolor SKUs still JA-only / untitled | 1,854 | 72.9% |
+**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
+```
 
-**PARTIAL — `translate-titles` running** (PID 2412 live, file growing). Titles join by `sku`; the titles file already carries de-JA'd pattern names (e.g. `ブークレ` → `Bouclé`) with the banned word normalized to "Wallcovering" in the suffix. Sangetsu pattern names are already English (`Acappella`, etc.) so no JA→EN title step applies to Sangetsu.
+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).
 
 ---
 
-## 6. Enrichment coverage (style/color tags + hex) — CLEAN rows only
+## 4. What still blocks the remainder — Lilycolor
 
-Consolidated + deduped across all 6 enrichment jsonls (`full/seed/shard0/shard1/sweep/pilot`), last-write-wins, excluding rows with an `error` field or `usable:false`:
+**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:
 
-| Metric | Count |
-|---|---|
-| Raw enrichment rows read (all files) | 1,559 |
-| Rows with `error` field (dropped) | 175 |
-| Rows `usable:false` (dropped) | 0 |
-| **Unique SKUs with a CLEAN enrichment row** (styles + hex + description) | **706** |
+- **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**.
 
-By prefix the clean-enriched set is 645 `LL`, 24 `LIS`, plus small `LW/LV/LMT/LWT/LWA/LLA` — **all Lilycolor; 0 Sangetsu SKUs enriched.** **PARTIAL** — the sweep is mid-run; this number is a snapshot and will grow.
+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.
 
 ---
 
-## 7. List price present (¥) — LIST, NOT COST
+## 5. What still blocks Sangetsu (unchanged from prior audit)
 
-| Vendor | With `list_price_yen` or `m2_price_yen` | % |
-|---|---|---|
-| Lilycolor | **2,543** | 100% |
-| Sangetsu | **0** | 0% |
-
-**⚠ This is Japan LIST price, NOT confirmed DW net cost.** It cannot be used to derive retail (no foreign-list→retail derivation per the gate). It is reported only to show the price *field* is present for Lilycolor; the Activation Gate still fails on cost for 100% of SKUs. Sangetsu has no price field whatsoever.
-
----
-
-## 8. Gate-ready EXCEPT cost — the headline
+Sangetsu is **not gateable** independent of cost. Its 10,263 unique SKUs still need a full content build:
 
-Definition: has image **AND** specs **AND** description **AND** (EN title for Lilycolor), missing **ONLY** confirmed net cost.
-
-| Vendor | Gate-ready-except-cost | Ceiling (once sweep completes) |
+| Missing dimension | Count | Notes |
 |---|---|---|
-| Lilycolor | **320** | up to 2,543 (image/spec/price already 100%; gated on desc + EN-title fill) |
-| Sangetsu | **0** | needs specs (8.8%→) + descriptions (0→) + cost build-out first |
-| **TOTAL** | **320** | |
+| 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 |
 
-The 320 are the intersection of {2,543 image} ∩ {2,543 spec} ∩ {701 desc} ∩ {689 EN-title}. Because image/spec/price are already at 100% for Lilycolor, the binding constraints today are description (28%) and EN title (27%) — both being filled by the live sweep. Expect this number to climb materially on the next snapshot.
+**Sangetsu gate-ready-except-cost = 0**, unchanged.
 
 ---
 
-## 9. Gap table (actionable)
+## 6. Gate-ready EXCEPT cost — the headline (RE-RUN)
 
-| Missing dimension | Vendor | Count | Top example SKUs |
-|---|---|---|---|
-| Description | Sangetsu | 10,263 | AZ52935, AZ52936, AZ52937 (no desc field in schema) |
-| Specs (width/type/weight/backing) | Sangetsu | 9,357 | AZ52935… (pattern spec block null on 544/622 patterns) |
-| Description | Lilycolor | 1,842 | LLA6050, LLA6051, LLA6052, LLA6053 |
-| EN title | Lilycolor | 1,854 | LIS42001, LIS42002, LIS42003, LIS42004 |
-| Image URL | Sangetsu | 771 | (unique SKUs with no `sku_images` entry) |
-| **Confirmed DW net cost** | **BOTH** | **12,806 (100%)** | ALL — the Steve/purchasing blocker |
-| List price field | Sangetsu | 10,263 | (no price field at all — LIST unavailable, unlike Lilycolor) |
+| Vendor | Prior (063026A snapshot) | **NOW (post-enrichment-complete)** |
+|---|---|---|
+| Lilycolor | 320 | **2,543** |
+| Sangetsu | 0 | **0** |
+| **TOTAL** | **320** | **2,543** |
 
-**Remediation priority:** (1) Steve/purchasing — confirm DW net cost for Lilycolor (2,543) first, since everything else is nearly done there; (2) let the local enrichment + title sweep finish to lift Lilycolor gate-ready 320→~2,543; (3) Sangetsu needs a spec + description build before it's gateable at all, independent of cost.
+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.**
 
 ---
 
-## Appendix — reproducible one-liners
-
-All counts produced with `python3` reading the raw JSONL (no LLM, no ollama, read-only). Working directory: `onboarding/sangetsu-lilycolor/staging/`.
-
-**Totals / dedup (Sangetsu unique SKUs):**
-```python
-uniq=set()
-for line in open('sangetsu-staging.jsonl'):
-    d=json.loads(line)
-    for s in d.get('colorway_skus') or []: uniq.add(s)
-# len(uniq) == 10263 ; total entries 10532 ; dup entries 269
-```
-
-**Lilycolor coverage (per SKU):**
-```python
-for line in open('lilycolor-merged-063026A.jsonl'):
-    d=json.loads(line)
-    has_img = bool(d.get('has_image')) or (d.get('image_count') or 0)>=1
-    has_spec = bool(d.get('width')) and bool(d.get('unit'))
-    des=d.get('design') or {}
-    has_desc = bool((des.get('description') or '').strip()) or sku in clean_enrich
-    has_en   = bool(d.get('title_en')) or sku in en_titles   # en_titles from lilycolor-titles-en-063026A.jsonl
-    has_price= bool(d.get('list_price_yen') or d.get('m2_price_yen'))
-    gate_ex_cost = has_img and has_spec and has_desc and has_en   # sum == 320
-```
+## 7. Followups for Steve (gated)
 
-**Enrichment consolidation (clean rows, deduped):**
-```python
-files=['enrichment-full-063026A.jsonl','...seed','...shard0','...shard1','...sweep','enrichment-pilot-063026A.jsonl']
-# drop rows with d.get('error') or d.get('usable') is False; clean = styles and hex and description
-# unique clean SKUs == 706 (all Lilycolor prefixes)
-```
-
-**Sangetsu per-unique-SKU image/spec:**
-```python
-# image: any sku in sku_images with truthy url  -> 9492 / 10263
-# spec : pattern spec has any of width/type/weight/backing -> 906 / 10263
-```
+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.
 
-**Caveat:** Sections 4, 5, 6, 8 are a live snapshot — enrichment (`enrich-full` PID 30405, `enrich-finish` 52728, `enrich-retry` 95458) and `translate-titles` (PID 2412) were actively writing at generation time. Re-run for a fresher count; the gate-ready-except-cost number only goes up.
+**No NEW gated item surfaced by this re-run** (expected: none — confirmed).
diff --git a/onboarding/sangetsu-lilycolor/readiness-063026A.json b/onboarding/sangetsu-lilycolor/readiness-063026A.json
index b530e3f1..cd0d8de2 100644
--- a/onboarding/sangetsu-lilycolor/readiness-063026A.json
+++ b/onboarding/sangetsu-lilycolor/readiness-063026A.json
@@ -1,16 +1,20 @@
 {
   "audit": "sangetsu-lilycolor-activation-gate-readiness",
   "tag": "063026A",
-  "generated_at": "2026-07-01",
+  "run": "re-run-post-enrichment-complete",
+  "generated_at": "2026-07-02",
   "machine": "Mac2",
   "read_only": true,
-  "snapshot_partial": true,
-  "partial_note": "enrichment + translate-titles sweep actively writing at generation (PIDs enrich-full 30405, enrich-finish 52728, enrich-retry 95458, translate-titles 2412); description/EN-title/enrichment counts are a floor and will rise.",
+  "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.",
   "headline": {
-    "gate_ready_except_cost_total": 320,
-    "gate_ready_except_cost_by_vendor": { "lilycolor": 320, "sangetsu": 0 },
+    "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_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
   },
   "totals": {
     "claim_12806": "CONFIRMED",
@@ -18,65 +22,68 @@
     "lilycolor_unique_skus": 2543,
     "sangetsu_unique_skus": 10263,
     "sangetsu_colorway_entries_raw": 10532,
-    "sangetsu_cross_pattern_dup_entries": 269,
-    "staging_summary_json_note": "reports 3107 for older lilycolor-staging.jsonl; stale vs freshest merge (2543)"
+    "sangetsu_cross_pattern_dup_entries": 269
+  },
+  "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
   },
   "vendors": {
     "lilycolor": {
       "prefix_proposed": "DWLC",
       "unique_skus": 2543,
-      "images_ge1": 2543,
-      "images_pct": 100.0,
-      "specs_populated": 2543,
-      "specs_pct": 100.0,
-      "description_nonempty": 701,
-      "description_pct": 27.6,
-      "en_title": 689,
-      "en_title_pct": 27.1,
-      "en_title_missing": 1854,
-      "enrichment_clean": 706,
-      "list_price_present": 2543,
-      "list_price_is_cost": false,
-      "gate_ready_except_cost": 320
+      "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,
+      "description_nonempty": 2543, "description_pct": 100.0,
+      "en_title": 2543, "en_title_pct": 100.0,
+      "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": {}
     },
     "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,
+      "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,
-      "description_note": "no description field in schema; overview populated on 4/622 patterns",
-      "en_title": "n/a",
-      "en_title_note": "pattern names already English (e.g. Acappella)",
       "enrichment_clean": 0,
-      "list_price_present": 0,
-      "list_price_note": "no price field at all",
-      "gate_ready_except_cost": 0
+      "list_price_present": 0, "list_price_note": "no price field at all",
+      "gate_ready_except_cost": 0,
+      "status": "unchanged vs prior audit"
     }
   },
-  "enrichment_consolidation": {
-    "files": ["enrichment-full-063026A.jsonl", "enrichment-full-063026A.seed.jsonl", "enrichment-full-063026A.shard0.jsonl", "enrichment-full-063026A.shard1.jsonl", "enrichment-full-063026A.sweep.jsonl", "enrichment-pilot-063026A.jsonl"],
-    "raw_rows_read": 1559,
-    "dropped_error_field": 175,
-    "dropped_usable_false": 0,
-    "unique_clean_skus": 706,
-    "all_lilycolor": true,
-    "sangetsu_enriched": 0
-  },
   "gap_table": [
-    { "dimension": "description", "vendor": "sangetsu", "count": 10263, "examples": ["AZ52935", "AZ52936", "AZ52937"] },
-    { "dimension": "specs", "vendor": "sangetsu", "count": 9357, "examples": ["AZ52935"] },
-    { "dimension": "description", "vendor": "lilycolor", "count": 1842, "examples": ["LLA6050", "LLA6051", "LLA6052"] },
-    { "dimension": "en_title", "vendor": "lilycolor", "count": 1854, "examples": ["LIS42001", "LIS42002", "LIS42003"] },
+    { "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": "both", "count": 12806 },
-    { "dimension": "list_price_field", "vendor": "sangetsu", "count": 10263 }
+    { "dimension": "net_cost", "vendor": "lilycolor", "count": 2543, "note": "SOLE remaining Lilycolor blocker; drafted in pending-approval" },
+    { "dimension": "net_cost", "vendor": "sangetsu", "count": 10263 }
   ],
   "gated_followups_for_steve": [
-    "Confirm DW net cost (all 12806; Lilycolor 2543 nearest-term). Sole activation blocker."
+    "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)."
   ]
 }

← a406aeb8 mirror repair-justindavid-relative-urls.js (98 relative-path  ·  back to Designer Wallcoverings  ·  snapshot before restart: Lilycolor enrichment complete (2634 46bfc170 →