[object Object]

← back to Elitis Price 2026

WS3: build 328 Elitis DRAFT colorways (exact-pattern-join, real color/width/retail, Size+Sample+sellable, Needs-Image); route 403 no-data + 86 fuzzy-join rows to FOLLOWUP_scrape_403.md

0d7dcccdd66129eff187faa2073c70833b9bc67b · 2026-07-10 21:57:36 -0700 · Steve Abrams

Files touched

Diff

commit 0d7dcccdd66129eff187faa2073c70833b9bc67b
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri Jul 10 21:57:36 2026 -0700

    WS3: build 328 Elitis DRAFT colorways (exact-pattern-join, real color/width/retail, Size+Sample+sellable, Needs-Image); route 403 no-data + 86 fuzzy-join rows to FOLLOWUP_scrape_403.md
---
 FOLLOWUP_scrape_403.md     |  74 ++++++++++
 exec/ledger/ws3_drafts.csv | 331 +++++++++++++++++++++++++++++++++++++++++++++
 exec/ws3_drafts.py         | 216 +++++++++++++++++++++++++++++
 3 files changed, 621 insertions(+)

diff --git a/FOLLOWUP_scrape_403.md b/FOLLOWUP_scrape_403.md
new file mode 100644
index 0000000..e7012f5
--- /dev/null
+++ b/FOLLOWUP_scrape_403.md
@@ -0,0 +1,74 @@
+# Elitis Spring-2026 — Follow-up scrape needed (WS3 leftovers)
+
+Two buckets of new-on-list Elitis SKUs could **not** be built into DRAFT
+colorway products in this reconciliation, because the prior-work data
+(`elitis_catalog.json`) carries only `pattern_name, color_name, mfr_sku, width,
+product_type` — **no image URLs and no specs beyond width** — and for the second
+bucket, no reliable catalog pattern to join against at all.
+
+Per the standing rule *"do NOT create hollow products"*, these were **routed
+here instead of force-built**. Run the vendor scrape below to capture real
+images + specs, then re-run `exec/ws3_drafts.py` (extend it to consume the
+scraped rows).
+
+## Scrape command
+
+```
+/elitis            # elitis.com main wallcovering catalog
+/elitispanoramic   # elitis.com Panoramique / mural line
+```
+
+Both currently route to the shared `product-import-from-url` engine. Per Steve's
+standing rule *every vendor gets its own dedicated `*-scraper-manager` skill*,
+an `elitis-scraper-manager` should be authored (feed-first, $0 local extraction)
+— the shared engine is the interim.
+
+What the scrape must capture per SKU (the fields missing today):
+- **image** (real product/swatch photo) — hard-blocks ACTIVE until present
+- **width** metafield (have it for bucket B; missing for bucket A)
+- **specs** — repeat, roll/panel dimensions, material/contents, fire rating for
+  the Commercial line
+- confirm **unit** (Roll / Yard / Panel / "Lot of 9 pieces") and per-SKU price
+
+## Bucket A — 403 SKUs with NO catalog data at all
+Source: `OUT_577_no_catalog_data.csv` (list_sku, collection, pattern, unit,
+us1_cost, retail — retail already = round(US1/0.65/0.85, 2)).
+
+- 403 rows across ~78 collections (Panoramique 41, Soleil levant 19, Tempo 18,
+  360° 16, Talamone 12, Essences de bois 12, Voiles de papier 10, Pleats 9,
+  Flower power 9, Initiation 9, Volver 9, Mille millions 8, Parfums 8, Parade 8,
+  Les petites histoires 8, Kandy 7, Nature précieuse 7, Formentera 7 …).
+- Units: Roll 274, Yard 119, "Lot of 9 pieces" 8, Panel 2. NB the "Lot of 9
+  pieces" unit is new — decide packaging/variant title before building those 8.
+
+## Bucket B — 86 staging rows whose pattern did NOT exact-match the catalog
+Source: `OUT_577_staging_join.csv`, the rows whose `pattern` is NOT a key in
+`elitis_catalog.json` `pattern_name`. ~150 colorways across 60 patterns.
+These are almost all **accent / spelling / suffix drift** vs the catalog, e.g.:
+- `Colosse frutier` → catalog `Colosse fruitier`
+- `Eclat` / `Eclats cosmiques` → `Éclat` / `Éclats cosmiques`
+- `Panthere` → `Panthère`, `Icone` → `Icône`, `Metal brush`/`(métal)` suffixes
+- `Medina`→`Médina`, `Eternite`→`Éternité`, `Pepite`→`Pépite`, etc.
+
+Fix path (cheaper than re-scraping B): build an accent-insensitive /
+casefold+unidecode pattern matcher in `ws3_drafts.py` (`build_targets`), re-run
+`--report`, eyeball the newly-joined patterns, then build. Only genuinely-new
+patterns fall through to the scrape.
+
+Distinct unmatched patterns (60): Abstract floral, Algues dorées, Amara,
+Aspirations fusionnelles, Au pied du Ventoux, Ballet, Big croco (métal), Blasons,
+Bleu comme une Rose, Brocéliande, Brume, Brumes laquées, Bury, Colosse frutier,
+Costalegre, Eclat, Eclats cosmiques, Enlace, Epi, Eternite, Flirt aquatique,
+Hope (métal), Hydra, Icone, Kosa silk (métal), L'Eden et après, L'appel de la
+forêt, L'habit de Vénus, Leopard, Lignes telluriques, Liège, Manihi, Marques de
+l'Empire, Metal brush, Mise en scène, Movida (métal), Médina, Métallisé, Nuit
+cinétique, Palette, Panthere, Pepite, Pignada, Prosperine, Rama, Retour des
+Indes, Sashiko, Seta (métal), Silva, Sol, Solstice, Sperenza, Terres lointaines,
+Tigre royal, Twist lin, Une certaine magnificence, Vol au vent, Voltige, Voyage
+sur un Nuage, Zakinthos.
+
+## Built this run (for reference)
+- WS3 buildable (exact-pattern-match, not already on Shopify): **331** DRAFT
+  colorways created via `exec/ws3_drafts.py` (DRAFT + `Needs-Image`, real
+  pattern/color/width/retail, Size option + Sample + sellable). They still need
+  the **image** backfill from the same scrape — every one carries `Needs-Image`.
diff --git a/exec/ledger/ws3_drafts.csv b/exec/ledger/ws3_drafts.csv
index 701d7fd..4f39f9a 100644
--- a/exec/ledger/ws3_drafts.csv
+++ b/exec/ledger/ws3_drafts.csv
@@ -1 +1,332 @@
 ts,list_sku,pattern,colorway,unit,retail,product_id,dw_sku,status
+2026-07-10T21:42:32,RM_250,Empreinte,Le lac des cygnes,Yard,65.16,7880939175987,DWEL-RM-250-04,OK

+2026-07-10T21:43:30,RM_250,Empreinte,chartreuse,Yard,65.16,7880939274291,DWEL-RM-250-05,OK

+2026-07-10T21:43:33,RM_250,Empreinte,teal,Yard,65.16,7880939307059,DWEL-RM-250-06,OK

+2026-07-10T21:43:35,RM_250,Empreinte,camel,Yard,65.16,7880939339827,DWEL-RM-250-10,OK

+2026-07-10T21:43:37,RM_250,Empreinte,ivory,Yard,65.16,7880939372595,DWEL-RM-250-01,OK

+2026-07-10T21:43:40,RM_253,Volutes,Pensées d'un promeneur solitaire,Yard,65.16,7880939405363,DWEL-RM-253-01,OK

+2026-07-10T21:43:42,RM_253,Volutes,beige,Yard,65.16,7880939438131,DWEL-RM-253-02,OK

+2026-07-10T21:43:45,RM_253,Volutes,Le goût de l'étrange,Yard,65.16,7880939470899,DWEL-RM-253-12,OK

+2026-07-10T21:43:47,RM_254,Aladin,burlywood,Yard,65.16,7880939503667,DWEL-RM-254-09,OK

+2026-07-10T21:43:50,RM_254,Aladin,gold,Yard,65.16,7880939536435,DWEL-RM-254-07,OK

+2026-07-10T21:43:52,RM_254,Aladin,La perle du désert,Yard,65.16,7880939569203,DWEL-RM-254-01,OK

+2026-07-10T21:43:54,RM_254,Aladin,Le saphir bleu,Yard,65.16,7880939601971,DWEL-RM-254-11,OK

+2026-07-10T21:43:57,RM_256_01,Allégorie,Allégorie (uni coordonné),Roll,1978.28,7880939634739,DWEL-RM-256-02,OK

+2026-07-10T21:43:59,RM_256_02,Allégorie,Allégorie (uni coordonné),Roll,716.74,,DWEL-RM-256-02,SKIP:already-on-shopify

+2026-07-10T21:44:00,RM_257_01,Kimono,Kimono (uni coordonné),Roll,1978.28,7880939667507,DWEL-RM-257-02,OK

+2026-07-10T21:44:02,RM_257_02,Kimono,Kimono (uni coordonné),Roll,685.97,,DWEL-RM-257-02,SKIP:already-on-shopify

+2026-07-10T21:44:03,RM_631,Ecorce,ivory,Roll,876.02,7880939700275,DWEL-RM-631-94,OK

+2026-07-10T21:44:05,RM_631,Ecorce,Un chic ultime,Roll,876.02,7880939733043,DWEL-RM-631-71,OK

+2026-07-10T21:44:08,RM_631,Ecorce,Bercée par la nature,Roll,876.02,7880939765811,DWEL-RM-631-20,OK

+2026-07-10T21:44:10,RM_631,Ecorce,Entrer dans la matière,Roll,876.02,7880939798579,DWEL-RM-631-80,OK

+2026-07-10T21:44:13,RM_631,Ecorce,Parler d'or,Roll,876.02,7880939831347,DWEL-RM-631-72,OK

+2026-07-10T21:44:15,RM_631,Ecorce,beige,Roll,876.02,7880939864115,DWEL-RM-631-92,OK

+2026-07-10T21:44:17,RM_987,Etincelle,ivory,Yard,237.1,7880939896883,DWEL-RM-987-01,OK

+2026-07-10T21:44:20,RM_987,Etincelle,espresso,Yard,237.1,7880939929651,DWEL-RM-987-80,OK

+2026-07-10T21:44:22,RM_987,Etincelle,Une force naturelle,Yard,237.1,7880939962419,DWEL-RM-987-72,OK

+2026-07-10T21:44:25,RM_988,Labyrinthe,Une précieuse collaboration,Yard,237.1,7880939995187,DWEL-RM-988-01,OK

+2026-07-10T21:44:27,RM_988,Labyrinthe,L'entrée des artistes,Yard,237.1,7880940027955,DWEL-RM-988-20,OK

+2026-07-10T21:44:30,RM_988,Labyrinthe,Capitale nuance,Yard,237.1,7880940060723,DWEL-RM-988-32,OK

+2026-07-10T21:44:32,RM_988,Labyrinthe,Sensation forte,Yard,237.1,7880940093491,DWEL-RM-988-72,OK

+2026-07-10T21:44:34,RM_989,Champagne,Valeur de symbole,Panel,687.78,7880940126259,DWEL-RM-989-72,OK

+2026-07-10T21:44:37,RM_1007,Silver,Rivière d'argent,Yard,331.22,7880940159027,DWEL-RM-1008-91,OK

+2026-07-10T21:44:39,RM_1007,Silver,La lumière,Yard,331.22,7880940191795,DWEL-RM-1007-01,OK

+2026-07-10T21:44:42,RM_1007,Silver,Tutoyer la beauté,Yard,331.22,7880940224563,DWEL-RM-1007-80,OK

+2026-07-10T21:44:45,RM_1007,Silver,Exprimer l'excellence,Yard,331.22,7880940257331,DWEL-RM-1007-90,OK

+2026-07-10T21:44:47,RM_1010,Wishlist,Mis en valeur,Yard,302.26,7880940290099,DWEL-RM-1010-80,OK

+2026-07-10T21:44:50,RM_1011,Elégante,Une simple élégance,Yard,302.26,7880940322867,DWEL-RM-1011-01,OK

+2026-07-10T21:44:52,RM_1013,Casual,ivory,Yard,322.17,7880940355635,DWEL-RM-1013-01,OK

+2026-07-10T21:44:55,RM_1013,Casual,Un chic urbain,Yard,322.17,7880940388403,DWEL-RM-1013-80,OK

+2026-07-10T21:44:57,RM_1014,L'essentiel,Le goût de la simplicité,Yard,258.82,7880940421171,DWEL-RM-1014-01,OK

+2026-07-10T21:44:59,RM_1014,L'essentiel,beige,Yard,258.82,7880940453939,DWEL-RM-1014-80,OK

+2026-07-10T21:45:02,RM_1015,Gentleman,Un raffinement naturel,Yard,302.26,7880940486707,DWEL-RM-1015-01,OK

+2026-07-10T21:45:04,RM_1016,L'indispensable,Achever sa mue,Yard,302.26,7880940519475,DWEL-RM-1016-04,OK

+2026-07-10T21:45:07,RM_1016,L'indispensable,Une vertue cordiale,Yard,302.26,7880940552243,DWEL-RM-1016-02,OK

+2026-07-10T21:45:09,RM_1016,L'indispensable,Une beauté holistique,Yard,302.26,7880940585011,DWEL-RM-1016-01,OK

+2026-07-10T21:45:12,RM_1016,L'indispensable,Miser sur la sobriété,Yard,302.26,7880940617779,DWEL-RM-1016-03,OK

+2026-07-10T21:45:14,RM_1016,L'indispensable,Une saine résolution,Yard,302.26,7880940650547,DWEL-RM-1016-15,OK

+2026-07-10T21:45:17,RM_1016,L'indispensable,Gage d'élégance,Yard,302.26,7880940683315,DWEL-RM-1016-41,OK

+2026-07-10T21:45:19,RM_1016,L'indispensable,Repousser ses limites,Yard,302.26,7880940716083,DWEL-RM-1016-72,OK

+2026-07-10T21:45:22,RM_1017,Cesteria,Sensuelle esthétique,Yard,220.81,7880940748851,DWEL-RM-1017-02,OK

+2026-07-10T21:45:24,RM_1017,Cesteria,Refuge à Bali,Yard,220.81,7880940781619,DWEL-RM-1017-03,OK

+2026-07-10T21:45:27,RM_1017,Cesteria,Une chaleureuse simplicité,Yard,220.81,7880940814387,DWEL-RM-1017-35,OK

+2026-07-10T21:45:29,RM_1017,Cesteria,Sous les lanternes,Yard,220.81,7880940847155,DWEL-RM-1017-80,OK

+2026-07-10T21:45:32,RM_1017,Cesteria,Ecrin de romantisme,Yard,220.81,7880940879923,DWEL-RM-1017-01,OK

+2026-07-10T21:45:34,RM_1017,Cesteria,La passion du naturel,Yard,220.81,7880940912691,DWEL-RM-1017-04,OK

+2026-07-10T21:45:37,RM_1017,Cesteria,Les fibres du plaisir,Yard,220.81,7880940945459,DWEL-RM-1017-21,OK

+2026-07-10T21:45:40,RM_1017,Cesteria,Une nature sophistiquée,Yard,220.81,7880940978227,DWEL-RM-1017-60,OK

+2026-07-10T21:45:42,RM_1019,Entrelazados,Accords parfaits,Yard,300.45,7880941010995,DWEL-RM-1019-01,OK

+2026-07-10T21:45:44,RM_1019,Entrelazados,beige,Yard,300.45,7880941043763,DWEL-RM-1019-04,OK

+2026-07-10T21:45:47,RM_1019,Entrelazados,Raffinement nomade,Yard,300.45,7880941076531,DWEL-RM-1019-02,OK

+2026-07-10T21:45:49,RM_1020,Partitura,Nature citadine,Yard,309.5,7880941109299,DWEL-RM-1020-60,OK

+2026-07-10T21:45:52,RM_1020,Partitura,Un luxe artisanal,Yard,309.5,7880941142067,DWEL-RM-1020-02,OK

+2026-07-10T21:45:54,RM_1020,Partitura,Chic et insolent,Yard,309.5,7880941174835,DWEL-RM-1020-80,OK

+2026-07-10T21:45:57,RM_1022,Impulsion,silver,Yard,470.59,7880941207603,DWEL-RM-1022-90,OK

+2026-07-10T21:45:59,RM_1022,Impulsion,Erodé par le temps,Yard,470.59,7880941240371,DWEL-RM-1022-65,OK

+2026-07-10T21:46:02,RM_1022,Impulsion,S'attacher aux reflets,Yard,470.59,7880941273139,DWEL-RM-1022-72,OK

+2026-07-10T21:46:05,RM_1022,Impulsion,Elever sa conscience,Yard,470.59,7880941305907,DWEL-RM-1022-91,OK

+2026-07-10T21:46:07,RM_1022,Impulsion,Le pouvoir de l'imaginaire,Yard,470.59,7880941338675,DWEL-RM-1022-92,OK

+2026-07-10T21:46:09,RM_1024,Esprit libre,Le choix de l'abstraction,Yard,323.98,7880941371443,DWEL-RM-1024-02,OK

+2026-07-10T21:46:12,RM_1024,Esprit libre,Parcours initiatique,Yard,323.98,7880941404211,DWEL-RM-1024-22,OK

+2026-07-10T21:46:15,RM_1024,Esprit libre,Un clair obscur,Yard,323.98,7880941436979,DWEL-RM-1024-92,OK

+2026-07-10T21:46:17,RM_1024,Esprit libre,Le long du pacifique,Yard,323.98,7880941469747,DWEL-RM-1024-67,OK

+2026-07-10T21:46:20,RM_1024,Esprit libre,Symphonie des nombres,Yard,323.98,7880941502515,DWEL-RM-1024-75,OK

+2026-07-10T21:46:22,RM_1024,Esprit libre,Hommage nocturne,Yard,323.98,7880941535283,DWEL-RM-1024-80,OK

+2026-07-10T21:46:24,RM_1031,Naoshima,Rêver d'un autre monde,Yard,689.59,7880941568051,DWEL-RM-1031-06,OK

+2026-07-10T21:46:27,RM_1031,Naoshima,La muse des arts,Yard,689.59,7880941600819,DWEL-RM-1031-01,OK

+2026-07-10T21:46:29,RM_1031,Naoshima,Plus divine que diva !,Yard,689.59,7880941633587,DWEL-RM-1031-05,OK

+2026-07-10T21:46:32,RM_1031,Naoshima,Une belle rencontre,Yard,689.59,7880941666355,DWEL-RM-1031-03,OK

+2026-07-10T21:46:34,RM_1033,Jima,ivory,Yard,649.77,7880941699123,DWEL-RM-1033-01,OK

+2026-07-10T21:46:36,RM_1033,Jima,ivory,Yard,649.77,7880941731891,DWEL-RM-1033-03,OK

+2026-07-10T21:46:39,RM_1033,Jima,olive,Yard,649.77,7880941764659,DWEL-RM-1033-04,OK

+2026-07-10T21:46:41,RM_1033,Jima,prussian blue,Yard,649.77,7880941797427,DWEL-RM-1033-05,OK

+2026-07-10T21:46:44,RM_1034,Tokara,Elever sa conscience,Yard,550.23,7880941830195,DWEL-RM-1034-01,OK

+2026-07-10T21:46:46,RM_1035,Amami,Délicates tentations,Yard,649.77,7880941862963,DWEL-RM-1035-03,OK

+2026-07-10T21:46:49,RM_1035,Amami,ivory,Yard,649.77,7880941895731,DWEL-RM-1035-01,OK

+2026-07-10T21:46:51,RM_1035,Amami,Refuge d'esthète,Yard,649.77,7880941928499,DWEL-RM-1035-06,OK

+2026-07-10T21:46:54,RM_1035,Amami,cobalt blue,Yard,649.77,7880941961267,DWEL-RM-1035-05,OK

+2026-07-10T21:46:56,RM_1037,Fragments,Une parfaite alliance,Yard,432.58,7880941994035,DWEL-RM-1037-80,OK

+2026-07-10T21:46:59,RM_1037,Fragments,Un juste équilibre,Yard,432.58,7880942026803,DWEL-RM-1037-15,OK

+2026-07-10T21:47:01,RM_1038,Le roi soleil,espresso,Yard,432.58,7880942059571,DWEL-RM-1038-72,OK

+2026-07-10T21:47:04,RM_1038,Le roi soleil,taupe,Yard,432.58,7880942092339,DWEL-RM-1038-82,OK

+2026-07-10T21:47:06,RM_1038,Le roi soleil,pale beige,Yard,432.58,7880942125107,DWEL-RM-1038-03,OK

+2026-07-10T21:47:09,RM_1038,Le roi soleil,espresso,Yard,432.58,7880942157875,DWEL-RM-1038-80,OK

+2026-07-10T21:47:11,RM_1040,Empreintes,Une exhubérance sans extravagance,Yard,432.58,7880942190643,DWEL-RM-1040-01,OK

+2026-07-10T21:47:14,RM_1040,Empreintes,beige,Yard,432.58,7880942223411,DWEL-RM-1040-15,OK

+2026-07-10T21:47:16,RM_1040,Empreintes,Une certaine modernité,Yard,432.58,7880942256179,DWEL-RM-1040-80,OK

+2026-07-10T21:47:18,RM_1040,Empreintes,Inspiration ethnique,Yard,432.58,7880942288947,DWEL-RM-1040-75,OK

+2026-07-10T21:47:21,RM_1042,Sève,Gage de séduction,Yard,182.81,7880942321715,DWEL-RM-1042-72,OK

+2026-07-10T21:47:23,RM_1042,Sève,Salon de famille,Yard,182.81,7880942354483,DWEL-RM-1042-15,OK

+2026-07-10T21:47:26,RM_1042,Sève,Privilégier la simplicité,Yard,182.81,7880942387251,DWEL-RM-1042-01,OK

+2026-07-10T21:47:28,RM_1043,Pilastre,light gray,Yard,570.14,7880942420019,DWEL-RM-1043-40,OK

+2026-07-10T21:47:31,RM_1043,Pilastre,Retour de flamme,Yard,570.14,7880942452787,DWEL-RM-1043-70,OK

+2026-07-10T21:47:33,RM_1043,Pilastre,L'éveil des sens,Yard,570.14,7880942485555,DWEL-RM-1043-22,OK

+2026-07-10T21:47:36,RM_1043,Pilastre,En tête à tête,Yard,570.14,7880942518323,DWEL-RM-1043-80,OK

+2026-07-10T21:47:38,RM_1043,Pilastre,Apaiser ses doutes,Yard,570.14,7880942551091,DWEL-RM-1043-05,OK

+2026-07-10T21:47:41,RM_1043,Pilastre,Ses reflets de noblesse,Yard,570.14,7880942583859,DWEL-RM-1043-01,OK

+2026-07-10T21:47:43,RM_1043,Pilastre,Le goût de l'épure,Yard,570.14,7880942616627,DWEL-RM-1043-15,OK

+2026-07-10T21:47:45,RM_1043,Pilastre,rose,Yard,570.14,7880942649395,DWEL-RM-1043-51,OK

+2026-07-10T21:47:48,RM_1044,Colonne,Ode à la passion,Yard,570.14,7880942682163,DWEL-RM-1044-70,OK

+2026-07-10T21:47:51,RM_1044,Colonne,rose,Yard,570.14,7880942714931,DWEL-RM-1044-51,OK

+2026-07-10T21:47:53,RM_1044,Colonne,umber,Yard,570.14,7880942747699,DWEL-RM-1044-05,OK

+2026-07-10T21:47:55,RM_1044,Colonne,Source de lumière,Yard,570.14,7880942780467,DWEL-RM-1044-22,OK

+2026-07-10T21:47:58,RM_1044,Colonne,Liaisons heureuses,Yard,570.14,7880942813235,DWEL-RM-1044-01,OK

+2026-07-10T21:48:00,RM_1044,Colonne,Une véritable affinité,Yard,570.14,7880942846003,DWEL-RM-1044-15,OK

+2026-07-10T21:48:03,RM_1044,Colonne,pale green,Yard,570.14,7880942878771,DWEL-RM-1044-40,OK

+2026-07-10T21:48:05,RM_1044,Colonne,Une belle paire,Yard,570.14,7880942911539,DWEL-RM-1044-80,OK

+2026-07-10T21:48:08,RM_1045,Parthénon,burgundy,Yard,457.92,7880942944307,DWEL-RM-1045-70,OK

+2026-07-10T21:48:10,RM_1045,Parthénon,camel,Yard,457.92,7880942977075,DWEL-RM-1045-05,OK

+2026-07-10T21:48:12,RM_1045,Parthénon,golden yellow,Yard,457.92,7880943009843,DWEL-RM-1045-22,OK

+2026-07-10T21:48:15,RM_1045,Parthénon,camel,Yard,457.92,7880943042611,DWEL-RM-1045-15,OK

+2026-07-10T21:48:17,RM_1045,Parthénon,pale green,Yard,457.92,7880943075379,DWEL-RM-1045-40,OK

+2026-07-10T21:48:20,RM_1045,Parthénon,ivory,Yard,457.92,7880943140915,DWEL-RM-1045-01,OK

+2026-07-10T21:48:22,RM_1045,Parthénon,salmon,Yard,457.92,7880943173683,DWEL-RM-1045-51,OK

+2026-07-10T21:48:25,RM_1045,Parthénon,charcoal gray,Yard,457.92,7880943206451,DWEL-RM-1045-80,OK

+2026-07-10T21:48:27,RM_1047,Muse,Prémices artistiques,Yard,559.28,7880943239219,DWEL-RM-1047-01,OK

+2026-07-10T21:48:29,RM_1047,Muse,La fusion des talents,Yard,559.28,7880943271987,DWEL-RM-1047-02,OK

+2026-07-10T21:48:32,RM_1047,Muse,Le sens de la discrétion,Yard,559.28,7880943304755,DWEL-RM-1047-80,OK

+2026-07-10T21:48:34,RM_1047,Muse,De l'or en plaque,Yard,559.28,7880943370291,DWEL-RM-1047-92,OK

+2026-07-10T21:48:37,RM_1049,Himalaya,D'un naturel charmant,Yard,385.52,7880943403059,DWEL-RM-1049-02,OK

+2026-07-10T21:48:39,RM_1049,Himalaya,ivory,Yard,385.52,7880943435827,DWEL-RM-1049-01,OK

+2026-07-10T21:48:42,RM_1049,Himalaya,ivory,Yard,385.52,7880943468595,DWEL-RM-1049-03,OK

+2026-07-10T21:48:44,RM_1049,Himalaya,Magnétique attraction,Yard,385.52,7880943501363,DWEL-RM-1049-80,OK

+2026-07-10T21:48:47,RM_1054,Wave lin,beige,Yard,678.73,7880943534131,DWEL-RM-1054-01,OK

+2026-07-10T21:48:49,RM_1055,Wave flanelle,olive,Yard,678.73,7880943566899,DWEL-RM-1055-67,OK

+2026-07-10T21:48:51,RM_1055,Wave flanelle,burnt sienna,Yard,678.73,7880943599667,DWEL-RM-1055-35,OK

+2026-07-10T21:48:54,RM_1055,Wave flanelle,beige,Yard,678.73,7880943632435,DWEL-RM-1055-05,OK

+2026-07-10T21:48:56,RM_1056,Madone chenille,beige,Yard,644.34,7880943665203,DWEL-RM-1056-01,OK

+2026-07-10T21:48:59,RM_1056,Madone chenille,beige,Yard,644.34,7880943697971,DWEL-RM-1056-04,OK

+2026-07-10T21:49:01,RM_1056,Madone chenille,charcoal,Yard,644.34,7880943763507,DWEL-RM-1056-80,OK

+2026-07-10T21:49:04,RM_1057,Madone lin,beige,Yard,678.73,7880943796275,DWEL-RM-1057-01,OK

+2026-07-10T21:49:06,RM_1058,Noto,ivory,Yard,443.44,7880943829043,DWEL-RM-1058-01,OK

+2026-07-10T21:49:09,RM_1058,Noto,Tout en majesté,Yard,443.44,7880943861811,DWEL-RM-1058-80,OK

+2026-07-10T21:49:11,RM_1058,Noto,Tenue d'apparat,Yard,443.44,7880943894579,DWEL-RM-1058-02,OK

+2026-07-10T21:49:14,RM_1058,Noto,Un oasis solaire,Yard,443.44,7880943927347,DWEL-RM-1058-04,OK

+2026-07-10T21:49:16,RM_1059,Nishino,ivory,Yard,443.44,7880943960115,DWEL-RM-1059-02,OK

+2026-07-10T21:49:18,RM_1059,Nishino,beige,Yard,443.44,7880943992883,DWEL-RM-1059-04,OK

+2026-07-10T21:49:21,RM_1059,Nishino,ivory,Yard,443.44,7880944025651,DWEL-RM-1059-01,OK

+2026-07-10T21:49:23,RM_1059,Nishino,charcoal gray,Yard,443.44,7880944058419,DWEL-RM-1059-80,OK

+2026-07-10T21:49:26,RM_1061,Toshima,Royal emblème,Panel,1321.27,7880944091187,DWEL-RM-1061-75,OK

+2026-07-10T21:49:28,RM_1062,Takara,Les noces du luxe et de l'art,Yard,443.44,7880944123955,DWEL-RM-1062-04,OK

+2026-07-10T21:49:30,RM_1062,Takara,Voyage initiatique,Yard,443.44,7880944156723,DWEL-RM-1062-02,OK

+2026-07-10T21:49:33,RM_1076,Orphée,Une dimension esthétique,Roll,2796.38,7880944189491,DWEL-RM-1076-02,OK

+2026-07-10T21:49:35,RM_1076,Orphée,Un univers contemporain,Roll,2796.38,7880944222259,DWEL-RM-1076-80,OK

+2026-07-10T21:49:38,RM_1076,Orphée,Sublimer la simplicité,Roll,2796.38,7880944255027,DWEL-RM-1076-01,OK

+2026-07-10T21:49:40,RM_1076,Orphée,brown,Roll,2796.38,7880944287795,DWEL-RM-1076-55,OK

+2026-07-10T21:49:43,RM_1077,Kallisté,Une habilité raffinée,Roll,2908.6,7880944320563,DWEL-RM-1077-11,OK

+2026-07-10T21:49:45,RM_1077,Kallisté,L'essence de la virtuosité,Roll,2908.6,7880944353331,DWEL-RM-1077-80,OK

+2026-07-10T21:49:48,RM_1077,Kallisté,Une matière d'art,Roll,2908.6,7880944386099,DWEL-RM-1077-02,OK

+2026-07-10T21:49:50,RM_1077,Kallisté,Une maîtrise artistique,Roll,2908.6,7880944418867,DWEL-RM-1077-60,OK

+2026-07-10T21:49:53,RM_1084,Shinrin,Brume de soie,Yard,226.24,7880944451635,DWEL-RM-1084-54,OK

+2026-07-10T21:49:55,RM_1084,Shinrin,Paille de lune,Yard,226.24,7880944484403,DWEL-RM-1084-11,OK

+2026-07-10T21:49:58,RM_1084,Shinrin,Mousse ombrée,Yard,226.24,7880944517171,DWEL-RM-1084-61,OK

+2026-07-10T21:50:00,RM_1085,Kasumi,Gagner en sérénité,Yard,226.24,7880944549939,DWEL-RM-1085-02,OK

+2026-07-10T21:50:03,RM_1085,Kasumi,Terres éternelles,Yard,226.24,7880944582707,DWEL-RM-1085-04,OK

+2026-07-10T21:50:05,RM_1085,Kasumi,Depuis la nuit des temps,Yard,226.24,7880944615475,DWEL-RM-1085-81,OK

+2026-07-10T21:50:08,RM_1088,Mosaïque du verger,beige,Yard,680.54,7880944648243,DWEL-RM-1088-02,OK

+2026-07-10T21:50:10,RM_1098,Samarkand,Sa véritable beauté,Roll,4038.01,7880944681011,DWEL-RM-1098-15,OK

+2026-07-10T21:50:13,RM_1098,Samarkand,Une conscience esthétique,Roll,4038.01,7880944713779,DWEL-RM-1098-01,OK

+2026-07-10T21:50:15,RM_1100,Lazgi,Invitation à la danse,Roll,3813.57,7880944746547,DWEL-RM-1100-01,OK

+2026-07-10T21:50:18,RM_1102,Palimpseste,Vestiges de la lumière,Yard,680.54,7880944779315,DWEL-RM-1092-80,OK

+2026-07-10T21:50:20,RM_1102,Palimpseste,La richesse du temps,Yard,680.54,7880944812083,DWEL-RM-1092-11,OK

+2026-07-10T21:50:23,RM_1107,Rafta,Une élégance très naturelle,Yard,331.51,7880944844851,DWEL-RM-1107-03,OK

+2026-07-10T21:50:25,RM_1107,Rafta,La simplicité du naturel,Yard,331.51,7880944877619,DWEL-RM-1133-04,OK

+2026-07-10T21:50:28,RM_1108,Iranja,Sous les tropiques,Yard,331.51,7880944910387,DWEL-RM-1108-02,OK

+2026-07-10T21:50:31,RM_1113,Alphabet,Trame primitive,Roll,4549.65,7880944943155,DWEL-RM-1113-01,OK

+2026-07-10T21:50:33,RM_1113,Alphabet,Épure tribale,Roll,4549.65,7880944975923,DWEL-RM-1113-02,OK

+2026-07-10T21:50:36,RM_1113,Alphabet,Pigment d'argile,Roll,4549.65,7880945008691,DWEL-RM-1113-35,OK

+2026-07-10T21:50:38,RM_1113,Alphabet,Temps nocturnes,Roll,4549.65,7880945041459,DWEL-RM-1113-67,OK

+2026-07-10T21:50:41,RM_1114,Asvata,ivory,Panel,7087.4,7880945074227,DWEL-RM-1114-80,OK

+2026-07-10T21:50:44,RM_1114,Asvata,Une majesté ravivée,Panel,7087.4,7880945106995,DWEL-RM-1114-02,OK

+2026-07-10T21:50:46,RM_1115,Trenza,Éclat bohême,Yard,331.51,7880945139763,DWEL-RM-1115-02,OK

+2026-07-10T21:50:48,RM_1115,Trenza,La faille de minuit,Yard,331.51,7880945172531,DWEL-RM-1115-80,OK

+2026-07-10T21:50:51,RM_1117,Filigrane,Écorce de sirène,Yard,422.96,7880945205299,DWEL-RM-1117-03,OK

+2026-07-10T21:50:54,RM_1117,Filigrane,Roseau des rivages,Yard,422.96,7880945238067,DWEL-RM-1117-01,OK

+2026-07-10T21:50:56,RM_1117,Filigrane,Lait de corail,Yard,422.96,7880945270835,DWEL-RM-1117-40,OK

+2026-07-10T21:50:59,RM_1117,Filigrane,Encre de perle,Yard,422.96,7880945303603,DWEL-RM-1117-81,OK

+2026-07-10T21:51:01,RM_1118,Calyptra,silver,Yard,685.88,7880945336371,DWEL-RM-1118-40,OK

+2026-07-10T21:51:04,RM_1118,Calyptra,Éclat de nacre,Yard,685.88,7880945369139,DWEL-RM-1118-02,OK

+2026-07-10T21:51:06,RM_1118,Calyptra,Un puissant symbole,Yard,685.88,7880945401907,DWEL-RM-1118-91,OK

+2026-07-10T21:51:09,RM_1119,Lithos,ivory,Yard,508.69,7880945434675,DWEL-RM-1119-01,OK

+2026-07-10T21:51:11,RM_1119,Lithos,Sable de Mélusine,Yard,508.69,7880945467443,DWEL-RM-1119-02,OK

+2026-07-10T21:51:13,RM_1119,Lithos,beige,Yard,508.69,7880945500211,DWEL-RM-1119-05,OK

+2026-07-10T21:51:16,RM_1119,Lithos,Roche de Scylla,Yard,508.69,7880945532979,DWEL-RM-1119-70,OK

+2026-07-10T21:51:18,RM_1119,Lithos,Un chant de sirène,Yard,508.69,7880945565747,DWEL-RM-1119-71,OK

+2026-07-10T21:51:21,RM_1120,Nyx,charcoal gray,Yard,525.84,7880945598515,DWEL-RM-1120-80,OK

+2026-07-10T21:51:23,RM_1124,Shibui,Une vibrante contemplation,Roll,4549.65,7880945631283,DWEL-RM-1124-02,OK

+2026-07-10T21:51:26,RM_1125,Contrepoint,La trame des élégants,Yard,331.51,7880945664051,DWEL-RM-1125-05,OK

+2026-07-10T21:51:28,RM_1125,Contrepoint,Une discrète sensualité,Yard,331.51,7880945696819,DWEL-RM-1125-02,OK

+2026-07-10T21:51:30,RM_1125,Contrepoint,Sobre et sophistiquée,Yard,331.51,7880945729587,DWEL-RM-1125-07,OK

+2026-07-10T21:51:33,RM_1129,Tashkent,Sur une montagne céleste,Yard,605.86,7880945762355,DWEL-RM-1129-03,OK

+2026-07-10T21:51:35,RM_1129,Tashkent,Éclats d'or mordorés,Yard,605.86,7880945795123,DWEL-RM-1129-60,OK

+2026-07-10T21:51:38,RM_1129,Tashkent,Fragments du temps,Yard,605.86,7880945827891,DWEL-RM-1129-74,OK

+2026-07-10T21:51:40,VP_602,Madagascar,Une succession de petits bonheurs,Roll,892.31,7880945860659,DWEL-VP-602-03,OK

+2026-07-10T21:51:43,VP_602,Madagascar,Une nostalgie toujours présente,Roll,892.31,7880945893427,DWEL-VP-731-34,OK

+2026-07-10T21:51:45,VP_602,Madagascar,Une secret bien gardé,Roll,892.31,7880945926195,DWEL-VP-731-07,OK

+2026-07-10T21:51:47,VP_602,Madagascar,Un écrin de quiétude,Roll,892.31,7880945958963,DWEL-VP-731-10,OK

+2026-07-10T21:51:50,VP_602,Madagascar,Tout un raffinement,Roll,892.31,7880945991731,DWEL-VP-731-40,OK

+2026-07-10T21:51:52,VP_602,Madagascar,Secret crush,Roll,892.31,7880946024499,DWEL-VP-731-09,OK

+2026-07-10T21:51:55,VP_602,Madagascar,Fleur de frangipanier,Roll,892.31,7880946057267,DWEL-VP-731-84,OK

+2026-07-10T21:51:57,VP_602,Madagascar,L'esprit libre,Roll,892.31,7880946090035,DWEL-VP-731-19,OK

+2026-07-10T21:51:59,VP_602,Madagascar,Frapper sa monnaie,Roll,892.31,7880946122803,DWEL-VP-602-04,OK

+2026-07-10T21:52:02,VP_602,Madagascar,À peine éclose !,Roll,892.31,7880946155571,DWEL-VP-731-50,OK

+2026-07-10T21:52:04,VP_602,Madagascar,Saveurs métissées,Roll,892.31,7880946188339,DWEL-VP-731-35,OK

+2026-07-10T21:52:07,VP_602,Madagascar,Transformer le plomb en or,Roll,892.31,7880946221107,DWEL-VP-602-02,OK

+2026-07-10T21:52:09,VP_602,Madagascar,Le sens du Kai,Roll,892.31,7880946253875,DWEL-VP-731-01,OK

+2026-07-10T21:52:12,VP_602,Madagascar,Prospérité assurée,Roll,892.31,7880946286643,DWEL-VP-731-02,OK

+2026-07-10T21:52:14,VP_602,Madagascar,Nouveau cycle,Roll,892.31,7880946319411,DWEL-VP-731-17,OK

+2026-07-10T21:52:17,VP_602,Madagascar,Pieds nus sur le sable,Roll,892.31,7880946352179,DWEL-VP-731-16,OK

+2026-07-10T21:52:19,VP_602,Madagascar,En toute quiétude,Roll,892.31,7880946384947,DWEL-VP-731-33,OK

+2026-07-10T21:52:22,VP_602,Madagascar,golden yellow,Roll,892.31,7880946417715,DWEL-VP-731-22,OK

+2026-07-10T21:52:24,VP_602,Madagascar,Sous le vent des manguiers,Roll,892.31,7880946450483,DWEL-VP-731-37,OK

+2026-07-10T21:52:26,VP_602,Madagascar,Pour mieux la sublimer,Roll,892.31,7880946483251,DWEL-VP-731-41,OK

+2026-07-10T21:52:29,VP_602,Madagascar,Au dessus des tropiques,Roll,892.31,7880946516019,DWEL-VP-731-42,OK

+2026-07-10T21:52:31,VP_602,Madagascar,Reflet du lagon,Roll,892.31,7880946548787,DWEL-VP-731-43,OK

+2026-07-10T21:52:33,VP_602,Madagascar,Sève d'aloe vera,Roll,892.31,7880946581555,DWEL-VP-731-60,OK

+2026-07-10T21:52:36,VP_602,Madagascar,Le chant des cigales,Roll,892.31,7880946614323,DWEL-VP-731-61,OK

+2026-07-10T21:52:38,VP_602,Madagascar,Paradis blanc,Roll,892.31,7880946647091,DWEL-VP-731-83,OK

+2026-07-10T21:52:41,VP_602,Madagascar,À l'aube vibrante,Roll,892.31,7880946679859,DWEL-VP-731-85,OK

+2026-07-10T21:52:43,VP_619,Sierra,Le Prince d'Arles,Roll,646.15,7880946712627,DWEL-VP-619-09,OK

+2026-07-10T21:52:46,VP_619,Sierra,Une discipline fantasque,Roll,646.15,7880946745395,DWEL-VP-619-07,OK

+2026-07-10T21:52:48,VP_629,Veracruz,Désirs inavoués,Roll,445.25,7880946778163,DWEL-VP-629-02,OK

+2026-07-10T21:52:51,VP_629,Veracruz,camel,Roll,445.25,7880946843699,DWEL-VP-629-06,OK

+2026-07-10T21:52:53,VP_632,Zanzibar,Rambouillet en janvier,Roll,447.06,7880947040307,DWEL-VP-632-11,OK

+2026-07-10T21:52:56,VP_632,Zanzibar,ivory,Roll,447.06,7880947204147,DWEL-VP-632-02,OK

+2026-07-10T21:52:58,VP_632,Zanzibar,L'étalon noir,Roll,447.06,7880947269683,DWEL-VP-632-07,OK

+2026-07-10T21:53:01,VP_656,Loup,Reflets d'argent,Roll,398.19,7880947400755,DWEL-VP-656-07,OK

+2026-07-10T21:53:03,VP_656,Loup,Bien au chaud,Roll,398.19,7880947433523,DWEL-VP-656-05,OK

+2026-07-10T21:53:06,VP_658,Parure,La reine de Saba,Roll,477.83,7880947466291,DWEL-VP-658-34,OK

+2026-07-10T21:53:08,VP_658,Parure,Attributs princiers,Roll,477.83,7880947499059,DWEL-VP-658-37,OK

+2026-07-10T21:53:11,VP_870,Hope,Entre rigueur et sobriété,Roll,892.31,7880947564595,DWEL-VP-870-07,OK

+2026-07-10T21:53:13,VP_870,Hope,Un pouvoir de fascination,Roll,892.31,7880947597363,DWEL-VP-870-04,OK

+2026-07-10T21:53:16,VP_930,Kari,Rivaliser de grâce,Roll,637.1,7880947630131,DWEL-VP-930-01,OK

+2026-07-10T21:53:18,VP_930,Kari,Parfum de mer,Roll,637.1,7880947662899,DWEL-VP-930-41,OK

+2026-07-10T21:53:21,VP_930,Kari,L'équilibre des forces,Roll,637.1,7880947695667,DWEL-VP-930-80,OK

+2026-07-10T21:53:23,VP_932,Yuzen,Porteur de sens,Roll,637.1,7880947728435,DWEL-VP-932-60,OK

+2026-07-10T21:53:25,VP_932,Yuzen,Une lumineuse sensibilité,Roll,637.1,7880947761203,DWEL-VP-932-10,OK

+2026-07-10T21:53:28,VP_932,Yuzen,Expérience holistique,Roll,637.1,7880947793971,DWEL-VP-932-40,OK

+2026-07-10T21:53:30,VP_932,Yuzen,Au-delà du temps,Roll,637.1,7880947826739,DWEL-VP-932-01,OK

+2026-07-10T21:53:32,VP_932,Yuzen,Contribuer à son éclat,Roll,637.1,7880947859507,DWEL-VP-932-70,OK

+2026-07-10T21:53:35,VP_932,Yuzen,Corne d'abondance,Roll,637.1,7880947892275,DWEL-VP-932-80,OK

+2026-07-10T21:53:37,VP_934_01,Noren,Noren (uni coordonné),Roll,2778.28,7880947925043,DWEL-VP-934-02,OK

+2026-07-10T21:53:40,VP_934_02,Noren,Noren (uni coordonné),Roll,1009.95,,DWEL-VP-934-02,SKIP:already-on-shopify

+2026-07-10T21:53:40,VP_937,Volute,Une nature domptée,Roll,546.61,7880947957811,DWEL-VP-937-01,OK

+2026-07-10T21:53:43,VP_937,Volute,Rondeur boisée,Roll,546.61,7880947990579,DWEL-VP-937-70,OK

+2026-07-10T21:53:45,VP_937,Volute,Sieste à l'ombre,Roll,546.61,7880948056115,DWEL-VP-937-71,OK

+2026-07-10T21:53:47,VP_937,Volute,Un refuge imaginaire,Roll,546.61,7880948088883,DWEL-VP-937-73,OK

+2026-07-10T21:53:50,VP_937,Volute,Un détail suffit,Roll,546.61,7880948121651,DWEL-VP-937-10,OK

+2026-07-10T21:53:53,VP_937,Volute,Son totem,Roll,546.61,7880948154419,DWEL-VP-937-31,OK

+2026-07-10T21:53:55,VP_937,Volute,La force du geste,Roll,546.61,7880948187187,DWEL-VP-937-20,OK

+2026-07-10T21:53:58,VP_937,Volute,Entre émotion et raison,Roll,546.61,7880948252723,DWEL-VP-937-21,OK

+2026-07-10T21:54:00,VP_937,Volute,Y faire son miel,Roll,546.61,7880948285491,DWEL-VP-937-30,OK

+2026-07-10T21:54:03,VP_937,Volute,L'empreinte du temps,Roll,546.61,7880948318259,DWEL-VP-937-72,OK

+2026-07-10T21:54:05,VP_938,Ramille,Révéler la matière,Roll,546.61,7880948383795,DWEL-VP-938-70,OK

+2026-07-10T21:54:08,VP_938,Ramille,Réinventer le mythe,Roll,546.61,7880948416563,DWEL-VP-938-72,OK

+2026-07-10T21:54:10,VP_938,Ramille,Reflets dorés,Roll,546.61,7880948449331,DWEL-VP-938-21,OK

+2026-07-10T21:54:13,VP_938,Ramille,cream,Roll,546.61,7880948482099,DWEL-VP-938-01,OK

+2026-07-10T21:54:15,VP_938,Ramille,black,Roll,546.61,7880948514867,DWEL-VP-938-80,OK

+2026-07-10T21:54:17,VP_938,Ramille,Un éclat subtil,Roll,546.61,7880948547635,DWEL-VP-938-20,OK

+2026-07-10T21:54:20,VP_938,Ramille,Comme un parchemin,Roll,546.61,7880948580403,DWEL-VP-938-30,OK

+2026-07-10T21:54:22,VP_938,Ramille,Tatouer la nature,Roll,546.61,7880948613171,DWEL-VP-938-73,OK

+2026-07-10T21:54:25,VP_942,Moshi moshi,Plaisir sensoriel,Roll,600.9,7880948645939,DWEL-VP-942-08,OK

+2026-07-10T21:54:28,VP_942,Moshi moshi,Donner du sens,Roll,600.9,7880948678707,DWEL-VP-942-11,OK

+2026-07-10T21:54:30,VP_942,Moshi moshi,Accueillir l'imprévu,Roll,600.9,7880948711475,DWEL-VP-942-09,OK

+2026-07-10T21:54:32,VP_942,Moshi moshi,L'équilibre des formes,Roll,600.9,7880948744243,DWEL-VP-942-03,OK

+2026-07-10T21:54:35,VP_942,Moshi moshi,Conquérir les coeurs,Roll,600.9,7880948777011,DWEL-VP-942-05,OK

+2026-07-10T21:54:37,VP_942,Moshi moshi,beige,Roll,600.9,7880949137459,DWEL-VP-942-01,OK

+2026-07-10T21:54:40,VP_942,Moshi moshi,Passion intemporelle,Roll,600.9,7880949661747,DWEL-VP-942-04,OK

+2026-07-10T21:54:42,VP_942,Moshi moshi,gray,Roll,600.9,7880950153267,DWEL-VP-942-07,OK

+2026-07-10T21:54:45,VP_942,Moshi moshi,olive,Roll,600.9,7880950218803,DWEL-VP-942-06,OK

+2026-07-10T21:54:47,VP_942,Moshi moshi,Valeur ancestrale,Roll,600.9,7880950251571,DWEL-VP-942-10,OK

+2026-07-10T21:54:50,VP_942,Moshi moshi,steel blue,Roll,600.9,7880950284339,DWEL-VP-942-13,OK

+2026-07-10T21:54:52,VP_943,Chogak,Porteur de paix,Roll,600.9,7880950317107,DWEL-VP-943-02,OK

+2026-07-10T21:54:54,VP_943,Chogak,La nuit des temps,Roll,600.9,7880950349875,DWEL-VP-943-08,OK

+2026-07-10T21:54:57,VP_943,Chogak,beige,Roll,600.9,7880950382643,DWEL-VP-943-04,OK

+2026-07-10T21:54:59,VP_943,Chogak,Une part de mystère,Roll,600.9,7880950415411,DWEL-VP-943-07,OK

+2026-07-10T21:55:02,VP_943,Chogak,Un véritable enchantement,Roll,600.9,7880950448179,DWEL-VP-943-01,OK

+2026-07-10T21:55:04,VP_943,Chogak,L'appel au sensible,Roll,600.9,7880950480947,DWEL-VP-943-03,OK

+2026-07-10T21:55:07,VP_943,Chogak,La poésie des épices,Roll,600.9,7880950513715,DWEL-VP-943-06,OK

+2026-07-10T21:55:09,VP_943,Chogak,L'esprit des voyages,Roll,600.9,7880950546483,DWEL-VP-943-05,OK

+2026-07-10T21:55:11,VP_944,Kungbo,Avec des doigts de fée,Roll,600.9,7880950579251,DWEL-VP-944-07,OK

+2026-07-10T21:55:14,VP_944,Kungbo,Symbole tribal,Roll,600.9,7880950612019,DWEL-VP-944-06,OK

+2026-07-10T21:55:16,VP_944,Kungbo,Des gens au bout des doigts,Roll,600.9,7880950644787,DWEL-VP-944-08,OK

+2026-07-10T21:55:19,VP_944,Kungbo,Le talent de l'artisan,Roll,600.9,7880950677555,DWEL-VP-944-04,OK

+2026-07-10T21:55:21,VP_944,Kungbo,Tout en poésie,Roll,600.9,7880950710323,DWEL-VP-944-02,OK

+2026-07-10T21:55:24,VP_944,Kungbo,Le fruit d'un savoir faire,Roll,600.9,7880950743091,DWEL-VP-944-05,OK

+2026-07-10T21:55:26,VP_967,Pampa,Un glamour discret,Roll,655.2,7880950775859,DWEL-VP-967-02,OK

+2026-07-10T21:55:28,VP_967,Pampa,Parcourir la Toundra,Roll,655.2,7880950808627,DWEL-VP-967-15,OK

+2026-07-10T21:55:31,VP_967,Pampa,Toujours plus fort,Roll,655.2,7880950841395,DWEL-VP-967-42,OK

+2026-07-10T21:55:33,VP_967,Pampa,Aux sources de l'humanité,Roll,655.2,7880950874163,DWEL-VP-967-60,OK

+2026-07-10T21:55:36,VP_967,Pampa,Rennes sauvages,Roll,655.2,7880950906931,DWEL-VP-967-81,OK

+2026-07-10T21:55:38,VP_967,Pampa,Initiation à la vie,Roll,655.2,7880950939699,DWEL-VP-967-04,OK

+2026-07-10T21:55:40,VP_967,Pampa,beige,Roll,655.2,7880950972467,DWEL-VP-967-01,OK

+2026-07-10T21:55:43,VP_967,Pampa,Terres fertiles,Roll,655.2,7880951005235,DWEL-VP-967-05,OK

+2026-07-10T21:55:45,VP_967,Pampa,Résister aux grands froids,Roll,655.2,7880951038003,DWEL-VP-967-62,OK

+2026-07-10T21:55:48,VP_967,Pampa,Fin comme un renard,Roll,655.2,7880951070771,DWEL-VP-967-75,OK

+2026-07-10T21:55:50,VP_975,Dédales,Évidence iconique,Roll,655.2,7880951103539,DWEL-VP-975-03,OK

+2026-07-10T21:55:53,VP_975,Dédales,Pièce maîtresse,Roll,655.2,7880951136307,DWEL-VP-975-81,OK

+2026-07-10T21:55:55,VP_975,Dédales,ivory,Roll,655.2,7880951169075,DWEL-VP-975-01,OK

+2026-07-10T21:55:57,VP_975,Dédales,Un équilibre en mouvement,Roll,655.2,7880951201843,DWEL-VP-975-60,OK

+2026-07-10T21:56:00,VP_975,Dédales,Le goût de la mise en scène,Roll,655.2,7880951234611,DWEL-VP-975-35,OK

+2026-07-10T21:56:02,VP_975,Dédales,Empreintes nocturnes,Roll,655.2,7880951300147,DWEL-VP-975-41,OK

+2026-07-10T21:56:05,VP_975,Dédales,Mise en boîte,Roll,655.2,7880951332915,DWEL-VP-975-76,OK

+2026-07-10T21:56:08,VP_977,Equilibre,Un teint de jouvence,Roll,655.2,7880951365683,DWEL-VP-977-50,OK

+2026-07-10T21:56:10,VP_977,Equilibre,Rehausser d'or,Roll,655.2,7880951398451,DWEL-VP-977-41,OK

+2026-07-10T21:56:12,VP_977,Equilibre,cream,Roll,655.2,7880951431219,DWEL-VP-977-02,OK

+2026-07-10T21:56:15,VP_977,Equilibre,ivory,Roll,655.2,7880951463987,DWEL-VP-977-01,OK

+2026-07-10T21:56:17,VP_984,Rotin,Au rythme de la nature,Roll,575.57,7880951496755,DWEL-VP-984-04,OK

+2026-07-10T21:56:20,VP_984,Rotin,Une joyeuse tribu,Roll,575.57,7880951529523,DWEL-VP-984-02,OK

+2026-07-10T21:56:22,VP_984,Rotin,Tresser des liens,Roll,575.57,7880951562291,DWEL-VP-984-73,OK

+2026-07-10T21:56:25,VP_996,Carrés jalonnés,Divin graphique,Roll,586.43,7880951595059,DWEL-VP-996-50,OK

+2026-07-10T21:56:27,VP_996,Carrés jalonnés,L'harmonie des contrastes,Roll,586.43,7880951627827,DWEL-VP-996-01,OK

+2026-07-10T21:56:30,VP_996,Carrés jalonnés,Maîtriser les codes,Roll,586.43,7880951660595,DWEL-VP-996-11,OK

+2026-07-10T21:56:32,VP_1009,Cybèle,Un charme discret,Roll,334.84,7880951693363,DWEL-VP-1009-02,OK

+2026-07-10T21:56:34,VP_1009,Cybèle,Rêve vert,Roll,334.84,7880951726131,DWEL-VP-1009-67,OK

+2026-07-10T21:56:37,VP_1009,Cybèle,Écho des brumes,Roll,334.84,7880951758899,DWEL-VP-1009-04,OK

+2026-07-10T21:56:39,VP_1009,Cybèle,Portée par la nature,Roll,334.84,7880951791667,DWEL-VP-1009-14,OK

+2026-07-10T21:56:42,VP_1029,Calero metal,Ruée vers l'or,Roll,1628.96,7880951824435,DWEL-VP-1029-91,OK

+2026-07-10T21:56:44,VP_1029,Calero metal,Filament d'argent,Roll,1628.96,7880951857203,DWEL-VP-1029-92,OK

+2026-07-10T21:56:46,VP_1035,Twill,Mousson d'opale,Roll,619.0,7880951889971,DWEL-VP-1035-65,OK

+2026-07-10T21:56:49,VP_1035,Twill,Écume d'ivoire,Roll,619.0,7880951922739,DWEL-VP-1035-02,OK

+2026-07-10T21:56:51,VP_1035,Twill,Ombre d'oasis,Roll,619.0,7880952021043,DWEL-VP-1035-15,OK

+2026-07-10T21:56:54,VP_1035,Twill,Brise égéenne,Roll,619.0,7880952184883,DWEL-VP-1035-44,OK

diff --git a/exec/ws3_drafts.py b/exec/ws3_drafts.py
new file mode 100644
index 0000000..a619a01
--- /dev/null
+++ b/exec/ws3_drafts.py
@@ -0,0 +1,216 @@
+#!/usr/bin/env python3
+"""WS3 — build DRAFT colorway products for Elitis new-on-list patterns.
+Data reality: elitis_catalog.json carries pattern_name, color_name, mfr_sku,
+width, product_type ONLY -- NO image, NO specs beyond width. So every product is
+built DRAFT + tag Needs-Image (can never accidentally go ACTIVE without an image,
+per the standing rule). Title = 'Pattern Color | Elitis' (Title Case, real
+color from catalog -- never AI, never 'Unknown' -> fall back to mfr tail).
+Variants per the WS1 recipe: Size option, Sample ($4.25, DENY, {DW}-Sample) +
+sellable ({DW}-{Roll|Yard|Panel}, retail, CONTINUE, tracked, min/step=1).
+Only builds colorways whose staging pattern EXACT-matches a catalog pattern_name
+(reliable join); fuzzy/no-match patterns are routed to the follow-up scrape file.
+Idempotent + resumable via ledger + live pre-check. $0."""
+import csv, sys, os, json, datetime, time, re
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), "lib"))
+from shopify import gql
+
+ROOT = os.path.join(os.path.dirname(__file__), "..")
+LEDGER = os.path.join(os.path.dirname(__file__), "ledger", "ws3_drafts.csv")
+CAT = os.path.join(ROOT, "elitis_catalog.json")
+SJ = os.path.join(ROOT, "OUT_577_staging_join.csv")
+
+UNIT_LABEL = {"Roll": "Sold Per Roll", "Yard": "Sold Per Yard", "Panel": "Sold Per Panel"}
+
+M_CREATE = """mutation($input:ProductInput!){
+  productCreate(input:$input){ userErrors{ field message }
+    product{ id legacyResourceId title status handle
+      options{ id name values } } } }"""
+
+M_VAR_BULK = """mutation($pid:ID!,$strategy:ProductVariantsBulkCreateStrategy,$variants:[ProductVariantsBulkInput!]!){
+  productVariantsBulkCreate(productId:$pid, strategy:$strategy, variants:$variants){
+    userErrors{ field message }
+    productVariants{ id title sku price inventoryPolicy selectedOptions{name value} } } }"""
+
+M_MF_SET = """mutation($mf:[MetafieldsSetInput!]!){
+  metafieldsSet(metafields:$mf){ userErrors{ field message } } }"""
+
+
+def title_case(s):
+    # Title Case but preserve accented letters; keep short words lower except first
+    return " ".join(w[:1].upper() + w[1:] for w in s.split())
+
+
+def make_title(pattern, color, mfr):
+    color = (color or "").strip()
+    if not color or color.lower() == "unknown":
+        # fall back to mfr sku tail
+        tail = mfr.replace("ELIT-", "").replace("-", " ")
+        base = f"{title_case(pattern)} {tail}"
+    else:
+        base = f"{title_case(pattern)} {title_case(color)}"
+    return f"{base} | Elitis"
+
+
+def dw_sku(mfr):
+    # ELIT-RM-250-04 -> DWEL-RM-250-04 (unique, traceable)
+    return "DWEL-" + mfr.replace("ELIT-", "")
+
+
+def append_ledger(row):
+    exists = os.path.exists(LEDGER) and os.path.getsize(LEDGER) > 0
+    with open(LEDGER, "a", newline="") as f:
+        w = csv.writer(f)
+        if not exists:
+            w.writerow(["ts", "list_sku", "pattern", "colorway", "unit", "retail",
+                        "product_id", "dw_sku", "status"])
+        w.writerow(row)
+
+
+def seen_dw():
+    s = set()
+    if os.path.exists(LEDGER):
+        for r in csv.DictReader(open(LEDGER)):
+            if r.get("status", "").startswith("OK") and r.get("dw_sku"):
+                s.add(r["dw_sku"])
+    return s
+
+
+def exists_on_shopify(dw):
+    d = gql("""query($q:String!){ productVariants(first:3, query:$q){ edges{ node{ sku } } } }""",
+            {"q": f"sku:{dw}-Sample"})
+    return len(d["productVariants"]["edges"]) > 0
+
+
+def build_targets():
+    cat = json.load(open(CAT))
+    sj = list(csv.DictReader(open(SJ)))
+    cat_by_pat = {}
+    for e in cat:
+        cat_by_pat.setdefault(e["pattern_name"], []).append(e)
+    targets, unmatched = [], []
+    for r in sj:
+        pat = r["pattern"]
+        ents = cat_by_pat.get(pat)
+        if not ents:
+            unmatched.append(r)
+            continue
+        for e in ents:
+            if e.get("on_shopify"):
+                continue
+            targets.append({
+                "list_sku": r["list_sku"], "pattern": pat, "unit": r["unit"],
+                "retail": r["retail"], "mfr_sku": e["mfr_sku"],
+                "color": e["color_name"], "width": e["width"],
+                "product_type": e["product_type"],
+            })
+    return targets, unmatched
+
+
+def create_one(t, verbose=False):
+    ts = datetime.datetime.now().isoformat(timespec="seconds")
+    unit = t["unit"]; mfr = t["mfr_sku"]
+    dw = dw_sku(mfr)
+    title = make_title(t["pattern"], t["color"], mfr)
+    try:
+        retail = round(float(t["retail"]), 2)
+    except Exception:
+        append_ledger([ts, t["list_sku"], t["pattern"], t["color"], unit, t["retail"], "", dw, "SKIP:bad-retail"])
+        return "SKIP:bad-retail"
+    label = UNIT_LABEL.get(unit)
+    if not label:
+        append_ledger([ts, t["list_sku"], t["pattern"], t["color"], unit, retail, "", dw, f"SKIP:bad-unit:{unit}"])
+        return f"SKIP:bad-unit:{unit}"
+
+    if exists_on_shopify(dw):
+        append_ledger([ts, t["list_sku"], t["pattern"], t["color"], unit, retail, "", dw, "SKIP:already-on-shopify"])
+        return "SKIP:already-on-shopify"
+
+    # DRAFT product, Size option, Needs-Image tag (no image data exists)
+    pt = "Wallcovering" if "Wallcovering" in t["product_type"] else "Wallcovering"
+    inp = {
+        "title": title,
+        "vendor": "Elitis",
+        "productType": pt,
+        "status": "DRAFT",
+        "tags": ["Elitis", "display_variant", "Needs-Image"],
+        "productOptions": [{"name": "Size", "values": [{"name": "Sample"}, {"name": label}]}],
+    }
+    d = gql(M_CREATE, {"input": inp})
+    res = d["productCreate"]
+    if res["userErrors"]:
+        append_ledger([ts, t["list_sku"], t["pattern"], t["color"], unit, retail, "", dw, "FAIL:create:" + json.dumps(res["userErrors"])[:140]])
+        return "FAIL:create"
+    p = res["product"]; gid = p["id"]; pid = str(p["legacyResourceId"])
+
+    # productCreate makes ONE default variant. Fetch it, UPDATE it into the Sample
+    # variant, then bulk-CREATE the sellable variant.
+    dv = gql("""query($id:ID!){ product(id:$id){ variants(first:10){ edges{ node{
+      id title selectedOptions{name value} } } } } }""", {"id": gid})
+    default_id = dv["product"]["variants"]["edges"][0]["node"]["id"]
+
+    M_VAR_UPD = """mutation($pid:ID!,$variants:[ProductVariantsBulkInput!]!){
+      productVariantsBulkUpdate(productId:$pid, variants:$variants){
+        userErrors{ field message } productVariants{ id title sku } } }"""
+    du = gql(M_VAR_UPD, {"pid": gid, "variants": [{
+        "id": default_id, "price": "4.25", "inventoryPolicy": "DENY",
+        "optionValues": [{"optionName": "Size", "name": "Sample"}],
+        "inventoryItem": {"sku": f"{dw}-Sample", "tracked": True}}]})
+    ue = du["productVariantsBulkUpdate"]["userErrors"]
+    if ue:
+        append_ledger([ts, t["list_sku"], t["pattern"], t["color"], unit, retail, pid, dw, "FAIL:sample-upd:" + json.dumps(ue)[:140]])
+        return "FAIL:sample-upd"
+
+    dc = gql(M_VAR_BULK, {"pid": gid, "strategy": "DEFAULT", "variants": [{
+        "price": f"{retail:.2f}", "inventoryPolicy": "CONTINUE",
+        "optionValues": [{"optionName": "Size", "name": label}],
+        "inventoryItem": {"sku": f"{dw}-{unit}", "tracked": True}}]})
+    ce = dc["productVariantsBulkCreate"]["userErrors"]
+    if ce:
+        append_ledger([ts, t["list_sku"], t["pattern"], t["color"], unit, retail, pid, dw, "FAIL:sellable-create:" + json.dumps(ce)[:140]])
+        return "FAIL:sellable-create"
+
+    # width metafield + qty min/step=1
+    mf = [
+        {"ownerId": gid, "namespace": "global", "key": "width", "type": "single_line_text_field", "value": t["width"]},
+        {"ownerId": gid, "namespace": "specs", "key": "width", "type": "single_line_text_field", "value": re.sub(r'[^0-9.]', '', t["width"]) or t["width"]},
+        {"ownerId": gid, "namespace": "global", "key": "v_prods_quantity_order_min", "type": "single_line_text_field", "value": "1"},
+        {"ownerId": gid, "namespace": "global", "key": "v_prods_quantity_order_units", "type": "single_line_text_field", "value": "1"},
+    ]
+    gql(M_MF_SET, {"mf": mf})
+
+    append_ledger([ts, t["list_sku"], t["pattern"], t["color"], unit, retail, pid, dw, "OK"])
+    if verbose:
+        print(json.dumps({"gid": gid, "title": title, "dw": dw,
+                          "sellable_sku": f"{dw}-{unit}", "width": t["width"]}, indent=2, ensure_ascii=False))
+    return "OK"
+
+
+if __name__ == "__main__":
+    targets, unmatched = build_targets()
+    if "--report" in sys.argv:
+        print(f"WS3 buildable targets (exact-pattern-match, not on_shopify): {len(targets)}")
+        print(f"WS3 unmatched staging rows (fuzzy/no catalog pattern): {len(unmatched)}")
+        print("  unmatched patterns:", sorted(set(r['pattern'] for r in unmatched)))
+        sys.exit(0)
+    if "--canary" in sys.argv:
+        t = next(x for x in targets if x["pattern"] == "Empreinte" and x["color"] == "Le lac des cygnes")
+        print("=== WS3 CANARY build:", t, "===")
+        st = create_one(t, verbose=True)
+        print("RESULT:", st)
+        sys.exit(0)
+    seen = seen_dw()
+    n_ok = n_skip = n_fail = 0
+    for i, t in enumerate(targets):
+        if dw_sku(t["mfr_sku"]) in seen:
+            n_skip += 1; continue
+        st = create_one(t)
+        if st == "OK":
+            n_ok += 1
+        elif st.startswith("FAIL"):
+            n_fail += 1
+        else:
+            n_skip += 1
+        if (i + 1) % 25 == 0:
+            print(f"  ...{i+1}/{len(targets)} ok={n_ok} skip={n_skip} fail={n_fail}")
+        time.sleep(0.2)
+    print(f"WS3 DONE: ok={n_ok} skip={n_skip} fail={n_fail} buildable={len(targets)} unmatched={len(unmatched)}")

← 8aa2ad8 WS2 complete: archived all 20 off-list disco Elitis products  ·  back to Elitis Price 2026  ·  WS4 cleanup: retitle VP-963->Osorno, archive Raffia/Frivole b42aea3 →