← back to Designerwallcoverings
TK-11076 Anna French colorway retag: remediate+rollback+canary (stopped-canary-unsafe — strip cannot cleanly separate palette noise from real colors)
9b0e1287a0b2bca04929a4330d02002364979204 · 2026-09-01 12:44:54 -0700 · Steve Abrams
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
A scripts/anna-french-onboard/out/tk11076-canary-diff.jsonA scripts/anna-french-onboard/out/tk11076-skips.jsonA scripts/anna-french-onboard/tk11076-remediate.mjsA scripts/anna-french-onboard/tk11076-rollback.mjs
Diff
commit 9b0e1287a0b2bca04929a4330d02002364979204
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Tue Sep 1 12:44:54 2026 -0700
TK-11076 Anna French colorway retag: remediate+rollback+canary (stopped-canary-unsafe — strip cannot cleanly separate palette noise from real colors)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
.../out/tk11076-canary-diff.json | 574 +++++++++
scripts/anna-french-onboard/out/tk11076-skips.json | 1213 ++++++++++++++++++++
scripts/anna-french-onboard/tk11076-remediate.mjs | 307 +++++
scripts/anna-french-onboard/tk11076-rollback.mjs | 43 +
4 files changed, 2137 insertions(+)
diff --git a/scripts/anna-french-onboard/out/tk11076-canary-diff.json b/scripts/anna-french-onboard/out/tk11076-canary-diff.json
new file mode 100644
index 0000000..1488a51
--- /dev/null
+++ b/scripts/anna-french-onboard/out/tk11076-canary-diff.json
@@ -0,0 +1,574 @@
+[
+ {
+ "handle": "dwta-65215designerwallcoverings-los-angeles",
+ "mfr": "AT9876",
+ "status": "ACTIVE",
+ "title": "Waves - Charcoal Wallcovering | Anna French",
+ "anchor_colorway": "Charcoal",
+ "set_facet": "color:Charcoal",
+ "stripped_wrong_facet": [],
+ "stripped_bg_descriptor": [],
+ "stripped_ai_palette_strays": [
+ "Gray",
+ "Gunmetal",
+ "Silver",
+ "Steel"
+ ],
+ "KEPT_color_tags": [
+ "Dark Gray",
+ "Denim",
+ "Gold",
+ "Light Gray",
+ "Navy",
+ "Yellow",
+ "Charcoal"
+ ],
+ "old_tags": [
+ "Abstract",
+ "AI-Analyzed-v2",
+ "Anna French",
+ "Architectural",
+ "AT9876",
+ "Bathroom",
+ "Bedroom",
+ "Class A Fire Rated",
+ "Coastal",
+ "Commercial",
+ "Contemporary",
+ "Dark Gray",
+ "Denim",
+ "display_variant",
+ "Geometric",
+ "Gold",
+ "Gray",
+ "Gunmetal",
+ "Japonisme",
+ "Light Gray",
+ "Living Room",
+ "Navy",
+ "Office",
+ "Paper",
+ "Scandinavian",
+ "Showroom Line",
+ "Silver",
+ "Smoke",
+ "Steel",
+ "Wallcovering",
+ "Waves",
+ "Yellow"
+ ],
+ "new_tags": [
+ "Abstract",
+ "AI-Analyzed-v2",
+ "Anna French",
+ "Architectural",
+ "AT9876",
+ "Bathroom",
+ "Bedroom",
+ "Class A Fire Rated",
+ "Coastal",
+ "Commercial",
+ "Contemporary",
+ "Dark Gray",
+ "Denim",
+ "display_variant",
+ "Geometric",
+ "Gold",
+ "Japonisme",
+ "Light Gray",
+ "Living Room",
+ "Navy",
+ "Office",
+ "Paper",
+ "Scandinavian",
+ "Showroom Line",
+ "Smoke",
+ "Wallcovering",
+ "Waves",
+ "Yellow",
+ "color:Charcoal",
+ "Charcoal"
+ ]
+ },
+ {
+ "handle": "tate-trellis-black-anna-french",
+ "mfr": "AT57883",
+ "status": "ACTIVE",
+ "title": "Tate Trellis Black Wallcovering",
+ "anchor_colorway": "Black",
+ "set_facet": "color:Black",
+ "stripped_wrong_facet": [],
+ "stripped_bg_descriptor": [],
+ "stripped_ai_palette_strays": [
+ "Light Gray",
+ "Pearl",
+ "Silver",
+ "Taupe"
+ ],
+ "KEPT_color_tags": [
+ "Ash Gray",
+ "Black",
+ "Cream",
+ "Ivory",
+ "Neutral",
+ "Stone",
+ "Warm Gray"
+ ],
+ "old_tags": [
+ "Ash Gray",
+ "AT57883",
+ "Bedroom",
+ "Black",
+ "Botanical",
+ "Bristol",
+ "Calm",
+ "Contemporary",
+ "Cream",
+ "Dining Room",
+ "display_variant",
+ "Elegant",
+ "Entryway",
+ "Floral",
+ "Foliage",
+ "Geometric",
+ "Ivory",
+ "Light Gray",
+ "Living Room",
+ "Medium Scale",
+ "Neutral",
+ "Off-White",
+ "Office",
+ "Pattern",
+ "Pearl",
+ "Powder Room",
+ "Refined",
+ "Silver",
+ "Sophisticated",
+ "Stone",
+ "Tate Trellis",
+ "Taupe",
+ "Thibaut Wallcovering",
+ "Traditional",
+ "Transitional",
+ "Trellis",
+ "Wallcovering",
+ "Warm Gray"
+ ],
+ "new_tags": [
+ "Ash Gray",
+ "AT57883",
+ "Bedroom",
+ "Black",
+ "Botanical",
+ "Bristol",
+ "Calm",
+ "Contemporary",
+ "Cream",
+ "Dining Room",
+ "display_variant",
+ "Elegant",
+ "Entryway",
+ "Floral",
+ "Foliage",
+ "Geometric",
+ "Ivory",
+ "Living Room",
+ "Medium Scale",
+ "Neutral",
+ "Off-White",
+ "Office",
+ "Pattern",
+ "Powder Room",
+ "Refined",
+ "Sophisticated",
+ "Stone",
+ "Tate Trellis",
+ "Thibaut Wallcovering",
+ "Traditional",
+ "Transitional",
+ "Trellis",
+ "Wallcovering",
+ "Warm Gray",
+ "color:Black"
+ ]
+ },
+ {
+ "handle": "camellia-garden-navy-and-linen-anna-french",
+ "mfr": "AT24553",
+ "status": "ACTIVE",
+ "title": "Camellia Garden - Navy and Linen Wallcovering | Anna French",
+ "anchor_colorway": "Navy And Linen",
+ "set_facet": "color:Navy And Linen",
+ "stripped_wrong_facet": [],
+ "stripped_bg_descriptor": [],
+ "stripped_ai_palette_strays": [
+ "Steel Blue",
+ "White"
+ ],
+ "KEPT_color_tags": [
+ "Beige",
+ "Blue",
+ "Bone White",
+ "Champagne",
+ "Cream",
+ "Denim Blue",
+ "Linen",
+ "Slate Blue",
+ "Taupe"
+ ],
+ "old_tags": [
+ "ANNA FRENCH AT DW",
+ "Architectural",
+ "AT24553",
+ "Bedroom",
+ "Beige",
+ "Blue",
+ "Bone White",
+ "Botanical",
+ "CAMELLIA",
+ "Champagne",
+ "Coastal",
+ "Contemporary",
+ "Cream",
+ "Denim Blue",
+ "Dining Room",
+ "display_variant",
+ "Entryway",
+ "Floral",
+ "GARDEN",
+ "Hospitality",
+ "Linen",
+ "Living Room",
+ "material-group-non-woven",
+ "Non-woven",
+ "Residential",
+ "Rustic",
+ "Showroom Line",
+ "Slate Blue",
+ "Steel Blue",
+ "Taupe",
+ "Traditional",
+ "Transitional",
+ "Wallcovering",
+ "White"
+ ],
+ "new_tags": [
+ "ANNA FRENCH AT DW",
+ "Architectural",
+ "AT24553",
+ "Bedroom",
+ "Beige",
+ "Blue",
+ "Bone White",
+ "Botanical",
+ "CAMELLIA",
+ "Champagne",
+ "Coastal",
+ "Contemporary",
+ "Cream",
+ "Denim Blue",
+ "Dining Room",
+ "display_variant",
+ "Entryway",
+ "Floral",
+ "GARDEN",
+ "Hospitality",
+ "Linen",
+ "Living Room",
+ "material-group-non-woven",
+ "Non-woven",
+ "Residential",
+ "Rustic",
+ "Showroom Line",
+ "Slate Blue",
+ "Taupe",
+ "Traditional",
+ "Transitional",
+ "Wallcovering",
+ "color:Navy And Linen",
+ "Navy And Linen"
+ ]
+ },
+ {
+ "handle": "buddy-blue-anna-french",
+ "mfr": "AT24602",
+ "status": "ACTIVE",
+ "title": "Buddy - Light Blue Wallcovering | Anna French",
+ "anchor_colorway": "Blue",
+ "set_facet": "color:Blue",
+ "stripped_wrong_facet": [],
+ "stripped_bg_descriptor": [],
+ "stripped_ai_palette_strays": [
+ "Powder Blue",
+ "White"
+ ],
+ "KEPT_color_tags": [
+ "Beige",
+ "Blue",
+ "Light Blue",
+ "Taupe"
+ ],
+ "old_tags": [
+ "AI-Analyzed-v2",
+ "Animal",
+ "Animal/Insects",
+ "Anna French",
+ "ANNA FRENCH AT DW",
+ "Architectural",
+ "AT24602",
+ "Bathroom",
+ "Bedroom",
+ "Beige",
+ "Blue",
+ "Coastal",
+ "Commercial",
+ "display_variant",
+ "Dog",
+ "Entryway",
+ "Farmhouse",
+ "Light Blue",
+ "Living Room",
+ "Nursery",
+ "Office",
+ "Paper",
+ "Powder Blue",
+ "Scandinavian",
+ "Showroom Line",
+ "Taupe",
+ "Traditional",
+ "Transitional",
+ "Wallcovering",
+ "White"
+ ],
+ "new_tags": [
+ "AI-Analyzed-v2",
+ "Animal",
+ "Animal/Insects",
+ "Anna French",
+ "ANNA FRENCH AT DW",
+ "Architectural",
+ "AT24602",
+ "Bathroom",
+ "Bedroom",
+ "Beige",
+ "Blue",
+ "Coastal",
+ "Commercial",
+ "display_variant",
+ "Dog",
+ "Entryway",
+ "Farmhouse",
+ "Light Blue",
+ "Living Room",
+ "Nursery",
+ "Office",
+ "Paper",
+ "Scandinavian",
+ "Showroom Line",
+ "Taupe",
+ "Traditional",
+ "Transitional",
+ "Wallcovering",
+ "color:Blue"
+ ]
+ },
+ {
+ "handle": "dwta-65133designerwallcoverings-los-angeles",
+ "mfr": "AT15121",
+ "status": "ACTIVE",
+ "title": "Cornwall - Green and Beige Fabric | Anna French",
+ "anchor_colorway": "Green And Beige",
+ "set_facet": "color:Green And Beige",
+ "stripped_wrong_facet": [],
+ "stripped_bg_descriptor": [],
+ "stripped_ai_palette_strays": [
+ "Linen"
+ ],
+ "KEPT_color_tags": [
+ "Beige",
+ "Cream",
+ "Green",
+ "Light Beige",
+ "Light Green",
+ "Sage",
+ "White"
+ ],
+ "old_tags": [
+ "AI-Analyzed-v2",
+ "Anna French",
+ "Architectural",
+ "Asparagus",
+ "Bedroom",
+ "Beige",
+ "Botanical",
+ "Citron",
+ "Class A Fire Rated",
+ "Commercial",
+ "Cornwall",
+ "Cream",
+ "Creme",
+ "display_variant",
+ "Entryway",
+ "Fabric",
+ "Farmhouse",
+ "Floral",
+ "Green",
+ "Honeydew",
+ "Laurel",
+ "Lichen",
+ "Light Beige",
+ "Light Green",
+ "Linen",
+ "Living Room",
+ "Moss",
+ "Nursery",
+ "Paper",
+ "Pattern",
+ "Pesto",
+ "Pistachio",
+ "Putty",
+ "Sage",
+ "Scandinavian",
+ "Showroom Line",
+ "Thyme",
+ "Traditional",
+ "Wallcovering",
+ "White",
+ "Willow"
+ ],
+ "new_tags": [
+ "AI-Analyzed-v2",
+ "Anna French",
+ "Architectural",
+ "Asparagus",
+ "Bedroom",
+ "Beige",
+ "Botanical",
+ "Citron",
+ "Class A Fire Rated",
+ "Commercial",
+ "Cornwall",
+ "Cream",
+ "Creme",
+ "display_variant",
+ "Entryway",
+ "Fabric",
+ "Farmhouse",
+ "Floral",
+ "Green",
+ "Honeydew",
+ "Laurel",
+ "Lichen",
+ "Light Beige",
+ "Light Green",
+ "Living Room",
+ "Moss",
+ "Nursery",
+ "Paper",
+ "Pattern",
+ "Pesto",
+ "Pistachio",
+ "Putty",
+ "Sage",
+ "Scandinavian",
+ "Showroom Line",
+ "Thyme",
+ "Traditional",
+ "Wallcovering",
+ "White",
+ "Willow",
+ "color:Green And Beige",
+ "Green And Beige"
+ ]
+ },
+ {
+ "handle": "dwta-65010designerwallcoverings-los-angeles",
+ "mfr": "AT24600",
+ "status": "ACTIVE",
+ "title": "Buddy - Multi Wallcovering | Anna French",
+ "anchor_colorway": "Multi",
+ "set_facet": "color:Multi",
+ "stripped_wrong_facet": [],
+ "stripped_bg_descriptor": [],
+ "stripped_ai_palette_strays": [
+ "Ivory",
+ "White"
+ ],
+ "KEPT_color_tags": [
+ "Beige",
+ "Black",
+ "Cream",
+ "Gray",
+ "Grey",
+ "Multi"
+ ],
+ "old_tags": [
+ "Abstract",
+ "AI-Analyzed-v2",
+ "Animal",
+ "Animal/Insects",
+ "Anna French",
+ "ANNA FRENCH AT DW",
+ "Architectural",
+ "AT24600",
+ "Bathroom",
+ "Bedroom",
+ "Beige",
+ "Black",
+ "Coastal",
+ "Commercial",
+ "Cream",
+ "display_variant",
+ "Dog",
+ "Entryway",
+ "Farmhouse",
+ "Gray",
+ "Grey",
+ "Ivory",
+ "Living Room",
+ "Novelty",
+ "Nursery",
+ "Office",
+ "Orange",
+ "Paper",
+ "Showroom Line",
+ "Traditional",
+ "Wallcovering",
+ "White"
+ ],
+ "new_tags": [
+ "Abstract",
+ "AI-Analyzed-v2",
+ "Animal",
+ "Animal/Insects",
+ "Anna French",
+ "ANNA FRENCH AT DW",
+ "Architectural",
+ "AT24600",
+ "Bathroom",
+ "Bedroom",
+ "Beige",
+ "Black",
+ "Coastal",
+ "Commercial",
+ "Cream",
+ "display_variant",
+ "Dog",
+ "Entryway",
+ "Farmhouse",
+ "Gray",
+ "Grey",
+ "Living Room",
+ "Novelty",
+ "Nursery",
+ "Office",
+ "Orange",
+ "Paper",
+ "Showroom Line",
+ "Traditional",
+ "Wallcovering",
+ "color:Multi",
+ "Multi"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/scripts/anna-french-onboard/out/tk11076-skips.json b/scripts/anna-french-onboard/out/tk11076-skips.json
new file mode 100644
index 0000000..7a83981
--- /dev/null
+++ b/scripts/anna-french-onboard/out/tk11076-skips.json
@@ -0,0 +1,1213 @@
+[
+ {
+ "handle": "samantha-s-striated-stripe-rop-73632",
+ "mfr": "73632",
+ "reason": "no anchor row",
+ "title": "Samantha's Striated Stripe"
+ },
+ {
+ "handle": "dwtt-70690-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Cape May Weave Teal - Teal Natural Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwtt-70700-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Cordoza Weave Charcoal - Charcoal Gray Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwtt-70750-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Fine Harvest Black - Black Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwta-65000designerwallcoverings-los-angeles",
+ "mfr": "AT24575",
+ "reason": "no anchor row",
+ "title": "Barlow Linen - Beige Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65001designerwallcoverings-los-angeles",
+ "mfr": "AT24583",
+ "reason": "no anchor row",
+ "title": "Barlow Linen - Blue Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65002designerwallcoverings-los-angeles",
+ "mfr": "AT24581",
+ "reason": "no anchor row",
+ "title": "Barlow Linen - Blush Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65003designerwallcoverings-los-angeles",
+ "mfr": "AT24576",
+ "reason": "no anchor row",
+ "title": "Barlow Linen - Flax Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65004designerwallcoverings-los-angeles",
+ "mfr": "AT24577",
+ "reason": "no anchor row",
+ "title": "Barlow Linen - Linen Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65005designerwallcoverings-los-angeles",
+ "mfr": "AT24582",
+ "reason": "no anchor row",
+ "title": "Barlow Linen - Light Blue Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65006designerwallcoverings-los-angeles",
+ "mfr": "AT24580",
+ "reason": "no anchor row",
+ "title": "Barlow Linen - Robin's Egg Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65007designerwallcoverings-los-angeles",
+ "mfr": "AT24578",
+ "reason": "anchor colorway Default/blank",
+ "title": "Barlow Linen - Light Blue Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65008designerwallcoverings-los-angeles",
+ "mfr": "AT24579",
+ "reason": "no anchor row",
+ "title": "Barlow Linen - Soft Green Fabric | Anna French"
+ },
+ {
+ "handle": "buddy-robins-egg-anna-french",
+ "mfr": "AT24603",
+ "reason": "anchor colorway Default/blank",
+ "title": "Buddy - Robin's Egg Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65030designerwallcoverings-los-angeles",
+ "mfr": "AT24542",
+ "reason": "no anchor row",
+ "title": "Ellery Stripe - Pale Blue Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65031designerwallcoverings-los-angeles",
+ "mfr": "AT24564",
+ "reason": "no anchor row",
+ "title": "Westmont - Green Wallcovering | Anna French"
+ },
+ {
+ "handle": "mini-sun-robins-egg-anna-french",
+ "mfr": "AT24567",
+ "reason": "anchor colorway Default/blank",
+ "title": "Mini Sun - Robin's Egg Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65042designerwallcoverings-los-angeles",
+ "mfr": "AT24557",
+ "reason": "no anchor row",
+ "title": "Pontorma - Green Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65057designerwallcoverings-los-angeles",
+ "mfr": "ATM24573",
+ "reason": "no anchor row",
+ "title": "Javanese Stripe - Wedgewood Blue Commercial Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65058designerwallcoverings-los-angeles",
+ "mfr": "ATM24571",
+ "reason": "no anchor row",
+ "title": "Javanese Stripe - Navy Commercial Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65059designerwallcoverings-los-angeles",
+ "mfr": "ATM24572",
+ "reason": "no anchor row",
+ "title": "Saybrook Check - Beige Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65060designerwallcoverings-los-angeles",
+ "mfr": "AT24590",
+ "reason": "no anchor row",
+ "title": "Wesley Stripe - Beige Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65064designerwallcoverings-los-angeles",
+ "mfr": "AT24589",
+ "reason": "no anchor row",
+ "title": "Wesley Stripe - Linen Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65079designerwallcoverings-los-angeles",
+ "mfr": "AT23161",
+ "reason": "no anchor row",
+ "title": "Bryson - Pale Beige Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65080designerwallcoverings-los-angeles",
+ "mfr": "AT23165",
+ "reason": "no anchor row",
+ "title": "Bryson - Charcoal Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65082designerwallcoverings-los-angeles",
+ "mfr": "AT23164",
+ "reason": "no anchor row",
+ "title": "Bryson - Light Gray Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65092designerwallcoverings-los-angeles",
+ "mfr": "AT23170",
+ "reason": "no anchor row",
+ "title": "Keswick Stripe - Light Blue Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65120designerwallcoverings-los-angeles",
+ "mfr": "ATWW15169",
+ "reason": "no anchor row",
+ "title": "Antilles Toile - Brown Commercial Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65121designerwallcoverings-los-angeles",
+ "mfr": "ATWW15172",
+ "reason": "no anchor row",
+ "title": "Antilles Toile | Anna French"
+ },
+ {
+ "handle": "dwta-65122designerwallcoverings-los-angeles",
+ "mfr": "ATWW15171",
+ "reason": "no anchor row",
+ "title": "Antilles Toile | Anna French"
+ },
+ {
+ "handle": "dwta-65123designerwallcoverings-los-angeles",
+ "mfr": "ATWW15170",
+ "reason": "no anchor row",
+ "title": "Edo Bloom - Apricot and Slate on Pearl Commercial Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65126designerwallcoverings-los-angeles",
+ "mfr": "AT15130",
+ "reason": "anchor colorway Default/blank",
+ "title": "Clipperton Stripe - Brown on Natural Fabric | Anna French"
+ },
+ {
+ "handle": "clipperton-stripe-navy-anna-french",
+ "mfr": "AT15128",
+ "reason": "anchor colorway Default/blank",
+ "title": "Clipperton Stripe - Navy Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65138designerwallcoverings-los-angeles",
+ "mfr": "AT15106",
+ "reason": "no anchor row",
+ "title": "Fern Stripe - Brown and Slate Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65140designerwallcoverings-los-angeles",
+ "mfr": "AT15101",
+ "reason": "no anchor row",
+ "title": "Fern Stripe - Navy Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65141designerwallcoverings-los-angeles",
+ "mfr": "AT15105",
+ "reason": "no anchor row",
+ "title": "Fern Stripe - Red and Blue Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65142designerwallcoverings-los-angeles",
+ "mfr": "AT15103",
+ "reason": "no anchor row",
+ "title": "Fern Stripe - Spa Blue Fabric | Anna French"
+ },
+ {
+ "handle": "javanese-stripe-spa-blue-anna-french",
+ "mfr": "AT15140",
+ "reason": "anchor colorway Default/blank",
+ "title": "Javanese Stripe - Light Blue Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65157designerwallcoverings-los-angeles",
+ "mfr": "AT15161",
+ "reason": "no anchor row",
+ "title": "Julian - Ivory Fabric | Anna French"
+ },
+ {
+ "handle": "saybrook-check-beige-anna-french",
+ "mfr": "AT15143",
+ "reason": "anchor colorway Default/blank",
+ "title": "Saybrook Check - Beige Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65202designerwallcoverings-los-angeles",
+ "mfr": "AT9832",
+ "reason": "no anchor row",
+ "title": "Shadows - Navy Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65207designerwallcoverings-los-angeles",
+ "mfr": "AT9849",
+ "reason": "no anchor row",
+ "title": "Takao Weave - Navy Fabric | Anna French"
+ },
+ {
+ "handle": "cleo-vine-green-and-white-anna-french",
+ "mfr": "AT9622",
+ "reason": "anchor colorway Default/blank",
+ "title": "Cleo Vine - Green and White Wallcovering | Anna French"
+ },
+ {
+ "handle": "gaya-emerald-green-anna-french",
+ "mfr": "AT9657",
+ "reason": "anchor colorway Default/blank",
+ "title": "Gaya - Emerald Green Natural Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65246designerwallcoverings-los-angeles",
+ "mfr": "AT9660",
+ "reason": "anchor colorway Default/blank",
+ "title": "Gaya Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65249designerwallcoverings-los-angeles",
+ "mfr": "AT9639",
+ "reason": "no anchor row",
+ "title": "Herriot Way - Flax Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65250designerwallcoverings-los-angeles",
+ "mfr": "AT9611",
+ "reason": "no anchor row",
+ "title": "Herriot Way Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65251designerwallcoverings-los-angeles",
+ "mfr": "AT9611",
+ "reason": "no anchor row",
+ "title": "Herriot Way Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65252designerwallcoverings-los-angeles",
+ "mfr": "AT9611",
+ "reason": "no anchor row",
+ "title": "Herriot Way - Spa Blue Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65265designerwallcoverings-los-angeles",
+ "mfr": "AT9694",
+ "reason": "anchor colorway Default/blank",
+ "title": "Pyramid - Beige Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65266designerwallcoverings-los-angeles",
+ "mfr": "AT9696",
+ "reason": "no anchor row",
+ "title": "Pyramid - White Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65267designerwallcoverings-los-angeles",
+ "mfr": "AT9692",
+ "reason": "no anchor row",
+ "title": "Pyramid - Ivory Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65268designerwallcoverings-los-angeles",
+ "mfr": "AT9693",
+ "reason": "no anchor row",
+ "title": "Pyramid - Navy on White Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65269designerwallcoverings-los-angeles",
+ "mfr": "AT9695",
+ "reason": "no anchor row",
+ "title": "Pyramid - Smoke Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65270designerwallcoverings-los-angeles",
+ "mfr": "AT9607",
+ "reason": "no anchor row",
+ "title": "Riva Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65271designerwallcoverings-los-angeles",
+ "mfr": "AT9607",
+ "reason": "no anchor row",
+ "title": "Riva Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65273designerwallcoverings-los-angeles",
+ "mfr": "AT9608",
+ "reason": "no anchor row",
+ "title": "Riva - Navy Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65274designerwallcoverings-los-angeles",
+ "mfr": "AT9607",
+ "reason": "no anchor row",
+ "title": "Riva - Plum Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65275designerwallcoverings-los-angeles",
+ "mfr": "AT9606",
+ "reason": "no anchor row",
+ "title": "Riva - Red Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65276designerwallcoverings-los-angeles",
+ "mfr": "AT9604",
+ "reason": "no anchor row",
+ "title": "Riva - Soft Blue Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65312designerwallcoverings-los-angeles",
+ "mfr": "AT78746",
+ "reason": "no anchor row",
+ "title": "Gibson - Red Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65328designerwallcoverings-los-angeles",
+ "mfr": "AT78780",
+ "reason": "anchor colorway Default/blank",
+ "title": "Kahna Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65355designerwallcoverings-los-angeles",
+ "mfr": "DWAF-65355",
+ "reason": "no anchor row",
+ "title": "Mini Trellis Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65367designerwallcoverings-los-angeles",
+ "mfr": "DWAF-65367",
+ "reason": "no anchor row",
+ "title": "Tansman Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65369designerwallcoverings-los-angeles",
+ "mfr": "AT78732",
+ "reason": "anchor colorway Default/blank",
+ "title": "Tansman Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65371designerwallcoverings-los-angeles",
+ "mfr": "AT78766",
+ "reason": "no anchor row",
+ "title": "Vero Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65372designerwallcoverings-los-angeles",
+ "mfr": "AT78763",
+ "reason": "anchor colorway Default/blank",
+ "title": "Vero Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65373designerwallcoverings-los-angeles",
+ "mfr": "AT78766",
+ "reason": "no anchor row",
+ "title": "Vero Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65374designerwallcoverings-los-angeles",
+ "mfr": "AT78766",
+ "reason": "no anchor row",
+ "title": "Vero Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65375designerwallcoverings-los-angeles",
+ "mfr": "AT78766",
+ "reason": "no anchor row",
+ "title": "Vero - Navy Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65376designerwallcoverings-los-angeles",
+ "mfr": "AT78766",
+ "reason": "no anchor row",
+ "title": "Vero Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65386designerwallcoverings-los-angeles",
+ "mfr": "AT79130",
+ "reason": "no anchor row",
+ "title": "Balin Ikat - Beige Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65387designerwallcoverings-los-angeles",
+ "mfr": "AT79131",
+ "reason": "no anchor row",
+ "title": "Balin Ikat Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65388designerwallcoverings-los-angeles",
+ "mfr": "AT79131",
+ "reason": "no anchor row",
+ "title": "Balin Ikat Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65389designerwallcoverings-los-angeles",
+ "mfr": "AT79132",
+ "reason": "no anchor row",
+ "title": "Balin Ikat - Navy Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65391designerwallcoverings-los-angeles",
+ "mfr": "AT79131",
+ "reason": "no anchor row",
+ "title": "Balin Ikat - Sage Fabric | Anna French"
+ },
+ {
+ "handle": "cashiers-beige-anna-french",
+ "mfr": "AT79109",
+ "reason": "anchor colorway Default/blank",
+ "title": "Cashiers - Beige Wallcovering | Anna French"
+ },
+ {
+ "handle": "davis-dot-aqua-anna-french",
+ "mfr": "AT79163",
+ "reason": "anchor colorway Default/blank",
+ "title": "Davis Dot - Aqua Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65421designerwallcoverings-los-angeles",
+ "mfr": "AT79160",
+ "reason": "anchor colorway Default/blank",
+ "title": "Davis Dot Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65425designerwallcoverings-los-angeles",
+ "mfr": "AT79139",
+ "reason": "anchor colorway Default/blank",
+ "title": "Fairfield Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65445designerwallcoverings-los-angeles",
+ "mfr": "AT79182",
+ "reason": "no anchor row",
+ "title": "Manor - Ivory Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65446designerwallcoverings-los-angeles",
+ "mfr": "AT79185",
+ "reason": "no anchor row",
+ "title": "Manor - Beige Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65448designerwallcoverings-los-angeles",
+ "mfr": "AT79182",
+ "reason": "no anchor row",
+ "title": "Manor Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65467designerwallcoverings-los-angeles",
+ "mfr": "AT7918",
+ "reason": "anchor colorway Default/blank",
+ "title": "Mamba Wallcovering | Anna French"
+ },
+ {
+ "handle": "mamba-pearl-anna-french",
+ "mfr": "AT7918",
+ "reason": "anchor colorway Default/blank",
+ "title": "Mamba - Pearl Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65482designerwallcoverings-los-angeles",
+ "mfr": "AT7928",
+ "reason": "anchor colorway Default/blank",
+ "title": "Plumes Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65491designerwallcoverings-los-angeles",
+ "mfr": "AT7946",
+ "reason": "no anchor row",
+ "title": "Watercourse - Beige Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65494designerwallcoverings-los-angeles",
+ "mfr": "AT7947",
+ "reason": "no anchor row",
+ "title": "Watercourse - Taupe Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65499designerwallcoverings-los-angeles",
+ "mfr": "AT7915",
+ "reason": "no anchor row",
+ "title": "Willow Wood - Navy Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65513designerwallcoverings-los-angeles",
+ "mfr": "AT6140",
+ "reason": "no anchor row",
+ "title": "Dawson Stripe Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65514designerwallcoverings-los-angeles",
+ "mfr": "AT6140",
+ "reason": "no anchor row",
+ "title": "Dawson Stripe - Charcoal and Linen Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65515designerwallcoverings-los-angeles",
+ "mfr": "AT6141",
+ "reason": "anchor colorway Default/blank",
+ "title": "Dawson Stripe Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65516designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65516",
+ "reason": "no anchor row",
+ "title": "Mallorca Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65517designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65517",
+ "reason": "no anchor row",
+ "title": "Mallorca Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65584designerwallcoverings-los-angeles",
+ "mfr": "AT6032",
+ "reason": "anchor colorway Default/blank",
+ "title": "Zane Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65608designerwallcoverings-los-angeles",
+ "mfr": "AT34100",
+ "reason": "no anchor row",
+ "title": "Cholla Sisal - Off White Fabric | Anna French"
+ },
+ {
+ "handle": "livorette-citron-yellow-anna-french",
+ "mfr": "AT34127",
+ "reason": "anchor colorway Default/blank",
+ "title": "Livorette - Citron Yellow Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65619designerwallcoverings-los-angeles",
+ "mfr": "AT34127",
+ "reason": "anchor colorway Default/blank",
+ "title": "Livorette Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65622designerwallcoverings-los-angeles",
+ "mfr": "AT34127",
+ "reason": "anchor colorway Default/blank",
+ "title": "Livorette Wallcovering | Anna French"
+ },
+ {
+ "handle": "rue-de-seine-off-white-on-yellow-anna-french",
+ "mfr": "AT34140",
+ "reason": "anchor colorway Default/blank",
+ "title": "Rue De Seine - Off White on Yellow Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65629designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65629",
+ "reason": "no anchor row",
+ "title": "Tuileries Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65630designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65630",
+ "reason": "no anchor row",
+ "title": "Tuileries Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65631designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65631",
+ "reason": "no anchor row",
+ "title": "Tuileries Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65632designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65632",
+ "reason": "no anchor row",
+ "title": "Tuileries Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65633designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65633",
+ "reason": "no anchor row",
+ "title": "Tuileries Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65634designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65634",
+ "reason": "no anchor row",
+ "title": "Tyndall Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65636designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65636",
+ "reason": "no anchor row",
+ "title": "Tyndall Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65638designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65638",
+ "reason": "no anchor row",
+ "title": "Tyndall Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65639designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65639",
+ "reason": "no anchor row",
+ "title": "Zola Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65641designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65641",
+ "reason": "no anchor row",
+ "title": "Zola Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65390designerwallcoverings-los-angeles",
+ "mfr": "AT79131",
+ "reason": "no anchor row",
+ "title": "Balin Ikat Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65392designerwallcoverings-los-angeles",
+ "mfr": "AT79131",
+ "reason": "no anchor row",
+ "title": "Balin Ikat Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65498designerwallcoverings-los-angeles",
+ "mfr": "DWAF-65498",
+ "reason": "no anchor row",
+ "title": "Willow Wood Fabric | Anna French"
+ },
+ {
+ "handle": "dwta-65511designerwallcoverings-los-angeles",
+ "mfr": "AT6140",
+ "reason": "no anchor row",
+ "title": "Dawson Stripe Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65512designerwallcoverings-los-angeles",
+ "mfr": "AT6140",
+ "reason": "no anchor row",
+ "title": "Dawson Stripe Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65518designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65518",
+ "reason": "no anchor row",
+ "title": "Mallorca Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwta-65521designerwallcoverings-los-angeles",
+ "mfr": "DWAT-65521",
+ "reason": "no anchor row",
+ "title": "Mallorca Wallcovering | Anna French"
+ },
+ {
+ "handle": "dwtt-80250-designer-wallcoverings-los-angeles",
+ "mfr": "AT57818",
+ "reason": "no anchor row",
+ "title": "Beckley Stripe Soft Gold Wallcovering"
+ },
+ {
+ "handle": "dwtt-80251-designer-wallcoverings-los-angeles",
+ "mfr": "AT57820",
+ "reason": "no anchor row",
+ "title": "Beckley Stripe Beige Wallcovering"
+ },
+ {
+ "handle": "beckley-stripe-sky-anna-french",
+ "mfr": "AT57823",
+ "reason": "anchor colorway Default/blank",
+ "title": "Beckley Stripe Ivory Wallcovering"
+ },
+ {
+ "handle": "dwtt-80256-designer-wallcoverings-los-angeles",
+ "mfr": "AT57825",
+ "reason": "no anchor row",
+ "title": "Ensbury Fern Light Blue Wallcovering"
+ },
+ {
+ "handle": "dwtt-80284-designer-wallcoverings-los-angeles",
+ "mfr": "AT57863",
+ "reason": "no anchor row",
+ "title": "Balmuccia Damask Pearl Wallcovering"
+ },
+ {
+ "handle": "dwtt-80285-designer-wallcoverings-los-angeles",
+ "mfr": "AT57864",
+ "reason": "no anchor row",
+ "title": "Balmuccia Damask Beige Wallcovering"
+ },
+ {
+ "handle": "dwtt-80286-designer-wallcoverings-los-angeles",
+ "mfr": "AT57865",
+ "reason": "no anchor row",
+ "title": "Balmuccia Damask Blush Wallcovering"
+ },
+ {
+ "handle": "dwtt-80287-designer-wallcoverings-los-angeles",
+ "mfr": "AT57866",
+ "reason": "no anchor row",
+ "title": "Balmuccia Damask Soft Blue Wallcovering"
+ },
+ {
+ "handle": "dwtt-80288-designer-wallcoverings-los-angeles",
+ "mfr": "AT57867",
+ "reason": "no anchor row",
+ "title": "Balmuccia Damask Soft Green Wallcovering"
+ },
+ {
+ "handle": "dwtt-80290-designer-wallcoverings-los-angeles",
+ "mfr": "AT57869",
+ "reason": "no anchor row",
+ "title": "Balmuccia Damask Pewter on Chestnut Wallcovering"
+ },
+ {
+ "handle": "dwtt-80292-designer-wallcoverings-los-angeles",
+ "mfr": "AT57871",
+ "reason": "no anchor row",
+ "title": "Cielo Multi Wallcovering"
+ },
+ {
+ "handle": "dwtt-80294-designer-wallcoverings-los-angeles",
+ "mfr": "AT57873",
+ "reason": "no anchor row",
+ "title": "Cielo Slate Wallcovering"
+ },
+ {
+ "handle": "dwtt-80295-designer-wallcoverings-los-angeles",
+ "mfr": "AT57874",
+ "reason": "no anchor row",
+ "title": "Ashton Beige Wallcovering"
+ },
+ {
+ "handle": "dwtt-80299-designer-wallcoverings-los-angeles",
+ "mfr": "AT57879",
+ "reason": "no anchor row",
+ "title": "Tate Trellis Beige Wallcovering"
+ },
+ {
+ "handle": "dwtt-80301-designer-wallcoverings-los-angeles",
+ "mfr": "AT57881",
+ "reason": "no anchor row",
+ "title": "Tate Trellis Soft Blue Wallcovering"
+ },
+ {
+ "handle": "dwtt-80305-designer-wallcoverings-los-angeles",
+ "mfr": "AT57885",
+ "reason": "no anchor row",
+ "title": "Ensbury Fern Pearl Wallcovering"
+ },
+ {
+ "handle": "dwtt-80983-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Kyoto Asian Branches Navy Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwtt-80985-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Kyoto Asian Branches Emerald Green Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwtt-80986-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Kyoto Asian Branches Black Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwtt-80988-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Kyoto Asian Branches Fuchsia Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwtt-80991-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Shadows Brushstrokes Emerald Green Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwtt-80996-designer-wallcoverings-los-angeles",
+ "mfr": "AT9839",
+ "reason": "no anchor row",
+ "title": "Charlotte Raffia Light Taupe Wallcovering"
+ },
+ {
+ "handle": "dwtt-80998-designer-wallcoverings-los-angeles",
+ "mfr": "AT9841",
+ "reason": "no anchor row",
+ "title": "Charlotte Raffia Tan Wallcovering"
+ },
+ {
+ "handle": "dwtt-81001-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Charlotte Geomteric Fret Natural Raffia Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwtt-81011-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Kimono Geometric Robin'S Egg Aqua Wallcovering | Thibaut"
+ },
+ {
+ "handle": "dwtt-81025-designer-wallcoverings-los-angeles",
+ "reason": "foreign-vendor title",
+ "title": "Wallcovering | Thibaut"
+ },
+ {
+ "handle": "chelsea-fabrics-af57840-lavender-thibaut",
+ "mfr": "AT57840",
+ "reason": "no anchor row",
+ "title": "Chelsea - Lavender Fabric | Anna French"
+ },
+ {
+ "handle": "stockbridge-fabrics-af16137-lavender-and-blue-thibaut",
+ "mfr": "AT16137",
+ "reason": "no anchor row",
+ "title": "Stockbridge - Lavender and Blue Fabric | Anna French"
+ },
+ {
+ "handle": "stockbridge-fabrics-af16140-blush-thibaut",
+ "mfr": "AT16140",
+ "reason": "no anchor row",
+ "title": "Stockbridge - Blush Fabric | Anna French"
+ },
+ {
+ "handle": "laura-fabrics-af23101-lavender-and-green-thibaut",
+ "mfr": "AT23101",
+ "reason": "no anchor row",
+ "title": "Laura - Lavender and Green Fabric | Anna French"
+ },
+ {
+ "handle": "laura-fabrics-af23100-blush-and-green-thibaut",
+ "mfr": "AT23100",
+ "reason": "no anchor row",
+ "title": "Laura - Blush and Green Fabric | Anna French"
+ },
+ {
+ "handle": "laura-fabrics-af23105-blue-thibaut",
+ "mfr": "AT23105",
+ "reason": "no anchor row",
+ "title": "Laura - Blue Fabric | Anna French"
+ },
+ {
+ "handle": "laura-fabrics-af23103-coral-and-black-thibaut",
+ "mfr": "AT23103",
+ "reason": "no anchor row",
+ "title": "Laura - Coral and Black Fabric | Anna French"
+ },
+ {
+ "handle": "laura-fabrics-af23104-citrus-and-blue-thibaut",
+ "mfr": "AT23104",
+ "reason": "no anchor row",
+ "title": "Laura - Citrus and Blue Fabric | Anna French"
+ },
+ {
+ "handle": "peacock-toile-fabrics-af57828-soft-blue-and-beige-thibaut",
+ "mfr": "AT57828",
+ "reason": "no anchor row",
+ "title": "Peacock Toile - Soft Blue and Beige Fabric | Anna French"
+ },
+ {
+ "handle": "newlands-toile-fabrics-af57838-black-thibaut",
+ "mfr": "AT57838",
+ "reason": "no anchor row",
+ "title": "Newlands Toile - Black Fabric | Anna French"
+ },
+ {
+ "handle": "pontorma-fabrics-af24558-neutral-thibaut",
+ "mfr": "AT24558",
+ "reason": "anchor colorway Default/blank",
+ "title": "Pontorma - Neutral Fabric | Anna French"
+ },
+ {
+ "handle": "ellery-stripe-fabrics-af24542-white-on-soft-blue-thibaut",
+ "mfr": "AT24542",
+ "reason": "no anchor row",
+ "title": "Ellery Stripe - White on Soft Blue Fabric | Anna French"
+ },
+ {
+ "handle": "ellery-stripe-fabrics-af24543-sky-blue-on-white-thibaut",
+ "mfr": "AT24543",
+ "reason": "no anchor row",
+ "title": "Ellery Stripe - Sky Blue on White Fabric | Anna French"
+ },
+ {
+ "handle": "ellery-stripe-fabrics-af24547-navy-on-white-thibaut",
+ "mfr": "AT24547",
+ "reason": "no anchor row",
+ "title": "Ellery Stripe - Navy on White Fabric | Anna French"
+ },
+ {
+ "handle": "lindsey-fabrics-af57809-sand-thibaut",
+ "mfr": "AT57809",
+ "reason": "no anchor row",
+ "title": "Lindsey - Sand Fabric | Anna French"
+ },
+ {
+ "handle": "lindsey-fabrics-af57810-blush-thibaut",
+ "mfr": "AT57810",
+ "reason": "no anchor row",
+ "title": "Lindsey - Blush Fabric | Anna French"
+ },
+ {
+ "handle": "lindsey-fabrics-af57811-lavender-thibaut",
+ "mfr": "AT57811",
+ "reason": "no anchor row",
+ "title": "Lindsey - Lavender Fabric | Anna French"
+ },
+ {
+ "handle": "lindsey-fabrics-af57813-blue-thibaut",
+ "mfr": "AT57813",
+ "reason": "no anchor row",
+ "title": "Lindsey - Blue Fabric | Anna French"
+ },
+ {
+ "handle": "ellery-stripe-fabrics-af24548-navy-on-soft-teal-thibaut",
+ "mfr": "AT24548",
+ "reason": "no anchor row",
+ "title": "Ellery Stripe - Navy on Soft Teal Fabric | Anna French"
+ },
+ {
+ "handle": "sussex-hydrangea-fabrics-af57846-blue-and-green-thibaut",
+ "mfr": "AT57846",
+ "reason": "no anchor row",
+ "title": "Sussex Hydrangea - Blue and Green Fabric | Anna French"
+ },
+ {
+ "handle": "lindsey-fabrics-af57815-navy-thibaut",
+ "mfr": "AT57815",
+ "reason": "no anchor row",
+ "title": "Lindsey - Navy Fabric | Anna French"
+ },
+ {
+ "handle": "cornwall-wallcoverings-af15124-red-and-blue-thibaut",
+ "reason": "foreign-vendor title",
+ "title": "Cornwall Wallcoverings – Red and Blue | Thibaut"
+ },
+ {
+ "handle": "chelsea-fabrics-af57842-slate-and-linen-thibaut",
+ "mfr": "AT57842",
+ "reason": "no anchor row",
+ "title": "Chelsea - Slate and Linen Fabric | Anna French"
+ },
+ {
+ "handle": "chelsea-fabrics-af57839-soft-blue-and-green-thibaut",
+ "mfr": "AT57839",
+ "reason": "no anchor row",
+ "title": "Chelsea - Soft Blue and Green Fabric | Anna French"
+ },
+ {
+ "handle": "chelsea-fabrics-af57843-chestnut-thibaut",
+ "mfr": "AT57843",
+ "reason": "no anchor row",
+ "title": "Chelsea - Chestnut Fabric | Anna French"
+ },
+ {
+ "handle": "stockbridge-fabrics-af16138-blue-thibaut",
+ "mfr": "AT16138",
+ "reason": "no anchor row",
+ "title": "Stockbridge - Blue Fabric | Anna French"
+ },
+ {
+ "handle": "stockbridge-fabrics-af16139-apricot-and-slate-thibaut",
+ "mfr": "AT16139",
+ "reason": "no anchor row",
+ "title": "Stockbridge - Apricot and Slate Fabric | Anna French"
+ },
+ {
+ "handle": "holly-trellis-fabrics-af16125-blue-thibaut",
+ "mfr": "AT16125",
+ "reason": "no anchor row",
+ "title": "Holly Trellis - Blue Fabric | Anna French"
+ },
+ {
+ "handle": "holly-trellis-fabrics-af16126-beige-thibaut",
+ "mfr": "AT16126",
+ "reason": "no anchor row",
+ "title": "Holly Trellis - Beige Fabric | Anna French"
+ },
+ {
+ "handle": "garden-club-fabrics-af16133-apricot-and-slate-thibaut",
+ "mfr": "AT16133",
+ "reason": "no anchor row",
+ "title": "Garden Club - Apricot and Slate Fabric | Anna French"
+ },
+ {
+ "handle": "garden-club-fabrics-af16134-blue-thibaut",
+ "mfr": "AT16134",
+ "reason": "no anchor row",
+ "title": "Garden Club - Blue Fabric | Anna French"
+ },
+ {
+ "handle": "garden-club-fabrics-af16136-blush-thibaut",
+ "mfr": "AT16136",
+ "reason": "no anchor row",
+ "title": "Garden Club - Blush Fabric | Anna French"
+ },
+ {
+ "handle": "elwood-fabrics-af24563-navy-thibaut",
+ "mfr": "AT24563",
+ "reason": "no anchor row",
+ "title": "Elwood - Navy Fabric | Anna French"
+ },
+ {
+ "handle": "sussex-hydrangea-fabrics-af57848-soft-gold-thibaut",
+ "mfr": "AT57848",
+ "reason": "no anchor row",
+ "title": "Sussex Hydrangea - Soft Gold Fabric | Anna French"
+ },
+ {
+ "handle": "sussex-hydrangea-fabrics-af57849-white-and-green-thibaut",
+ "mfr": "AT57849",
+ "reason": "no anchor row",
+ "title": "Sussex Hydrangea - White and Green Fabric | Anna French"
+ },
+ {
+ "handle": "shadows-fabrics-af9836-eggplant-thibaut",
+ "mfr": "AT9836",
+ "reason": "no anchor row",
+ "title": "Shadows - Eggplant Fabric | Anna French"
+ },
+ {
+ "handle": "cornwall-blush-fabric-anna-french",
+ "mfr": "AT15119",
+ "reason": "anchor colorway Default/blank",
+ "title": "Cornwall Fabric – Blush | Anna French"
+ },
+ {
+ "handle": "shadows-fabrics-af9834-emerald-green-thibaut",
+ "mfr": "AT9834",
+ "reason": "no anchor row",
+ "title": "Shadows - Emerald Green Fabric | Anna French"
+ },
+ {
+ "handle": "shadows-fabrics-af9835-black-thibaut",
+ "mfr": "AT9835",
+ "reason": "no anchor row",
+ "title": "Shadows - Black Fabric | Anna French"
+ },
+ {
+ "handle": "julian-wallcoverings-af15164-brown-thibaut",
+ "reason": "foreign-vendor title",
+ "title": "Julian Wallcoverings – Brown | Thibaut"
+ },
+ {
+ "handle": "julian-fabrics-af15161-beige-and-spa-blue-thibaut",
+ "mfr": "AT15161",
+ "reason": "no anchor row",
+ "title": "Julian - Beige and Spa Blue Fabric | Anna French"
+ },
+ {
+ "handle": "lindsey-fabrics-af57817-black-thibaut",
+ "mfr": "AT57817",
+ "reason": "no anchor row",
+ "title": "Lindsey - Black Fabric | Anna French"
+ },
+ {
+ "handle": "pontorma-fabrics-af24555-soft-gold-thibaut",
+ "mfr": "AT24555",
+ "reason": "no anchor row",
+ "title": "Pontorma - Soft Gold Fabric | Anna French"
+ },
+ {
+ "handle": "sussex-hydrangea-fabrics-af57845-soft-blue-thibaut",
+ "mfr": "AT57845",
+ "reason": "no anchor row",
+ "title": "Sussex Hydrangea - Soft Blue Fabric | Anna French"
+ },
+ {
+ "handle": "laura-fabrics-af23102-sage-and-gold-thibaut",
+ "mfr": "AT23102",
+ "reason": "no anchor row",
+ "title": "Laura - Sage and Gold Fabric | Anna French"
+ },
+ {
+ "handle": "bloomsbury-square-fabrics-af23112-beige-thibaut",
+ "mfr": "AT23112",
+ "reason": "no anchor row",
+ "title": "Bloomsbury Square - Beige Fabric | Anna French"
+ },
+ {
+ "handle": "sussex-hydrangea-fabrics-af57847-slate-and-linen-thibaut",
+ "mfr": "AT57847",
+ "reason": "no anchor row",
+ "title": "Sussex Hydrangea - Slate and Linen Fabric | Anna French"
+ },
+ {
+ "handle": "peacock-toile-fabrics-af57830-blue-and-green-thibaut",
+ "mfr": "AT57830",
+ "reason": "no anchor row",
+ "title": "Peacock Toile - Blue and Green Fabric | Anna French"
+ },
+ {
+ "handle": "pontorma-fabrics-af24557-kelly-thibaut",
+ "mfr": "AT24557",
+ "reason": "no anchor row",
+ "title": "Pontorma - Kelly Fabric | Anna French"
+ },
+ {
+ "handle": "peacock-toile-fabrics-af57829-green-and-plum-thibaut",
+ "mfr": "AT57829",
+ "reason": "no anchor row",
+ "title": "Peacock Toile - Green and Plum Fabric | Anna French"
+ },
+ {
+ "handle": "pontorma-fabrics-af24559-rose-thibaut",
+ "mfr": "AT24559",
+ "reason": "no anchor row",
+ "title": "Pontorma - Rose Fabric | Anna French"
+ },
+ {
+ "handle": "cleo-green-and-white-anna-french",
+ "mfr": "AT9622",
+ "reason": "anchor colorway Default/blank",
+ "title": "Cleo - Green and White Fabric | Anna French"
+ },
+ {
+ "handle": "elwood-fabrics-af24564-document-linen-thibaut",
+ "mfr": "AT24564",
+ "reason": "no anchor row",
+ "title": "Elwood - Document Linen Fabric | Anna French"
+ },
+ {
+ "handle": "chloe-blush-wallcovering-thibaut",
+ "mfr": "AT10746",
+ "reason": "no anchor row",
+ "title": "Chloe - Blush | Wallcovering | Anna French"
+ },
+ {
+ "handle": "chloe-green-wallcovering-thibaut",
+ "mfr": "AT10748",
+ "reason": "no anchor row",
+ "title": "Chloe - Green | Wallcovering | Anna French"
+ },
+ {
+ "handle": "chloe-mineral-wallcovering-thibaut",
+ "mfr": "AT10749",
+ "reason": "no anchor row",
+ "title": "Chloe - Mineral | Wallcovering | Anna French"
+ },
+ {
+ "handle": "chloe-beige-wallcovering-thibaut",
+ "mfr": "AT10750",
+ "reason": "no anchor row",
+ "title": "Chloe - Beige | Wallcovering | Anna French"
+ },
+ {
+ "handle": "chloe-spa-blue-wallcovering-thibaut",
+ "mfr": "AT10751",
+ "reason": "no anchor row",
+ "title": "Chloe - Spa Blue | Wallcovering | Anna French"
+ },
+ {
+ "handle": "chloe-spa-blue-on-white-wallcovering-thibaut",
+ "mfr": "AT10752",
+ "reason": "no anchor row",
+ "title": "Chloe - Spa Blue on White | Wallcovering | Anna French"
+ },
+ {
+ "handle": "deauville-linen-flax-dwat-65119",
+ "mfr": "AT16148",
+ "reason": "anchor colorway Default/blank",
+ "title": "Deauville Linen, Flax Wallcoverings | Anna French"
+ },
+ {
+ "handle": "antoinette-blue-dwat-65127",
+ "mfr": "AT16156",
+ "reason": "anchor colorway Default/blank",
+ "title": "Antoinette, Blue Wallcoverings | Anna French"
+ }
+]
\ No newline at end of file
diff --git a/scripts/anna-french-onboard/tk11076-remediate.mjs b/scripts/anna-french-onboard/tk11076-remediate.mjs
new file mode 100644
index 0000000..a30b8be
--- /dev/null
+++ b/scripts/anna-french-onboard/tk11076-remediate.mjs
@@ -0,0 +1,307 @@
+#!/usr/bin/env node
+/**
+ * TK-11076 — batch-correct LIVE Anna French products (vendor="Anna French").
+ *
+ * ANCHOR: authoritative real colorway = anna_french_catalog.color_name (Mac2-canonical, /tmp socket),
+ * joined to each live product by mfr_sku (custom.manufacturer_sku, else variant SKU base).
+ *
+ * PER PRODUCT:
+ * (1) SET the correct color:<anchor color_name> facet (anchor is authoritative — the live title
+ * colorway is the corrupted AI value; verified 69/328 title-vs-anchor disagreements).
+ * (2) STRIP AI-palette STRAY color tags — sourced from THIS product's OWN AI metafields
+ * (custom.color_details[].name + color_1/2/3_name + background_color), deterministic + per-product,
+ * NOT a global denylist — EXCLUDING any token that IS (a component of) the real anchor colorway.
+ * Also strip stale "color:"/"Color:" facets that are not the correct anchor facet, and the
+ * "Background Color X" descriptor tags (AI palette noise).
+ * (3) PRESERVE the correct color facet + the bare anchor colorway word(s) + every legit color word that
+ * is NOT in the AI palette + EVERY non-color tag (vendor, pattern, collection, material, rooms,
+ * styles, New Arrival, Trending, display_variant, Showroom Line, AI-Analyzed-v2, etc).
+ *
+ * NO variant SKU / price / status / sales-channel / image writes. Tags only.
+ *
+ * SCOPE GATE — only remediate products that:
+ * • are non-ARCHIVED, vendor Anna French, and
+ * • join the anchor by mfr_sku with a NON-"Default"/non-blank color_name.
+ * Products with no anchor row, a "Default" colorway, or a foreign-vendor title (e.g. "| Thibaut") are
+ * SKIPPED (never guessed). PG-first: nothing to write in anna_french_catalog for the tag fix (color_name
+ * there is already authoritative). We record old tags in THIS VENDOR'S rollback file, then write Shopify.
+ *
+ * node tk11076-remediate.mjs # DRY-RUN
+ * node tk11076-remediate.mjs --canary # DRY-RUN + write canary diff for 6 diverse products
+ * node tk11076-remediate.mjs --apply --limit=6 # apply first N
+ * node tk11076-remediate.mjs --apply --only=h1,h2
+ * node tk11076-remediate.mjs --apply # full batch (90s gap every 25)
+ */
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { execSync } from 'node:child_process';
+
+const HERE = path.dirname(fileURLToPath(import.meta.url));
+const DB = 'postgresql:///dw_unified?host=/tmp';
+const STORE = process.env.SHOPIFY_STORE || 'designer-laboratory-sandbox.myshopify.com';
+const TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
+const API = process.env.SHOPIFY_API_VERSION || '2024-10';
+const APPLY = process.argv.includes('--apply');
+const CANARY = process.argv.includes('--canary');
+const LIMIT = parseInt((process.argv.find(a => a.startsWith('--limit=')) || '').split('=')[1] || '0', 10);
+const ONLY = ((process.argv.find(a => a.startsWith('--only=')) || '').split('=')[1] || '').split(',').filter(Boolean);
+const ROLLBACK = path.join(process.env.HOME, '.claude/yolo-queue/executed-reversible/TK-11076-Anna_French-rollback.json');
+const LEDGER_LOG = path.join(process.env.HOME, '.claude/yolo-queue/executed-reversible');
+if (!TOKEN) { console.error('FATAL: set SHOPIFY_ADMIN_TOKEN'); process.exit(1); }
+const sleep = ms => new Promise(r => setTimeout(r, ms));
+const decode = s => String(s || '').replace(/&/g, '&').replace(/'/g, "'").replace(/"/g, '"');
+const titleCase = s => decode(s).replace(/\b\w/g, c => c.toUpperCase()).trim();
+const norm = s => decode(s).toLowerCase().replace(/\s*\/\s*/g, '/').replace(/\s+/g, ' ').trim();
+
+// Base color lexicon (only used to CLASSIFY a bare tag as "colour-ish" for the strip; the actual
+// strip decision is driven by the product's OWN AI palette metafields, not by this set).
+const COLOR_MODIFIERS = new Set(['soft','pale','dark','light','deep','bright','warm','cool','dusty',
+ 'metallic','metalic','antique','burnished','muted','rich','medium','pastel','dusky','faded']);
+const COLOR_WORDS = new Set([
+ 'white','black','grey','gray','ivory','cream','beige','stone','dove','taupe','greige','oatmeal',
+ 'alabaster','bone','eggshell','linen','sand','almond','pearl','chalk','parchment','champagne','flax','ecru',
+ 'silver','gold','gilver','bronze','copper','pewter','platinum','mica','graphite','charcoal','slate','gunmetal',
+ 'teal','aqua','turquoise','jade','celadon','sage','mint','emerald','forest','olive','chartreuse','lime','green','spa','seafoam',
+ 'blue','navy','indigo','cobalt','sapphire','cornflower','sky','denim','powder','peacock','azure','cerulean','wedgewood','robin','steel','ocean',
+ 'red','crimson','scarlet','burgundy','wine','russet','terracotta','rust','brick','coral','salmon','blush','camel',
+ 'pink','rose','fuchsia','magenta','lavender','lilac','purple','plum','amethyst','mauve','violet','petal',
+ 'yellow','ochre','saffron','mustard','honey','amber','peach','apricot','tan','walnut','espresso','coffee',
+ 'brown','chocolate','khaki','multi','natural','neutral','midnight','ash','mineral','spring']);
+function colorTokens(str) {
+ return norm(str).split(/[^a-z']+/).filter(Boolean).filter(w => COLOR_WORDS.has(w) || COLOR_MODIFIERS.has(w));
+}
+function isColorishTag(tag) {
+ // a bare tag counts as "colour-ish" if it is short and every word is in the color lexicon
+ const words = norm(tag).split(/[^a-z']+/).filter(Boolean);
+ if (!words.length || words.length > 3) return false;
+ const hasBase = words.some(w => COLOR_WORDS.has(w));
+ return hasBase && words.every(w => COLOR_WORDS.has(w) || COLOR_MODIFIERS.has(w));
+}
+
+async function gql(query, variables) {
+ for (let a = 0; a < 5; a++) {
+ const res = await fetch(`https://${STORE}/admin/api/${API}/graphql.json`, {
+ method: 'POST', headers: { 'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json' },
+ body: JSON.stringify({ query, variables }), signal: AbortSignal.timeout(45000) });
+ const j = await res.json().catch(() => ({}));
+ if (j.errors) { if (a === 4) return { errors: j.errors }; await sleep(1200 * (a + 1)); continue; }
+ await sleep(350); return j.data;
+ }
+}
+
+async function fetchLive() {
+ const out = []; let cursor = null;
+ const q = `query($cursor:String){
+ products(first:100, query:"vendor:'Anna French'", after:$cursor){
+ pageInfo{ hasNextPage endCursor }
+ nodes{ id handle status title tags
+ featuredImage{ url }
+ mfr: metafield(namespace:"custom", key:"manufacturer_sku"){ value }
+ cd: metafield(namespace:"custom", key:"color_details"){ value }
+ c1: metafield(namespace:"custom", key:"color_1_name"){ value }
+ c2: metafield(namespace:"custom", key:"color_2_name"){ value }
+ c3: metafield(namespace:"custom", key:"color_3_name"){ value }
+ bg: metafield(namespace:"custom", key:"background_color"){ value }
+ variants(first:3){ nodes{ sku } } }
+ } }`;
+ for (let guard = 0; guard < 60; guard++) {
+ const d = await gql(q, { cursor });
+ if (!d || d.errors) { console.error('fetchLive gql error', JSON.stringify(d && d.errors)); break; }
+ for (const n of d.products.nodes) out.push(n);
+ if (!d.products.pageInfo.hasNextPage) break;
+ cursor = d.products.pageInfo.endCursor;
+ }
+ return out;
+}
+
+function mfrOf(p) {
+ return (p.mfr && p.mfr.value) ||
+ (p.variants.nodes.map(v => v.sku).find(Boolean) || '').replace(/-DWA[TF](-Sample)?$/i, '').replace(/-Sample$/i, '');
+}
+
+// mfr_sku(upper) → authoritative color_name from anna_french_catalog (Mac2-canonical staging)
+function anchorMap() {
+ const raw = execSync(`psql "${DB}" -tAc "select coalesce(json_agg(json_build_object('sku',upper(mfr_sku),'col',color_name,'pat',pattern_name))::text,'[]') from anna_french_catalog"`,
+ { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 }).trim();
+ const m = new Map();
+ for (const r of JSON.parse(raw || '[]')) if (r.sku) m.set(String(r.sku).toUpperCase(), { col: r.col || '', pat: r.pat || '' });
+ return m;
+}
+
+async function run() {
+ const anchor = anchorMap();
+ let live = await fetchLive();
+ console.log(`live Anna French products: ${live.length}`);
+ if (ONLY.length) live = live.filter(p => ONLY.includes(p.handle));
+
+ const plans = [], skips = [];
+ for (const p of live) {
+ if (p.status === 'ARCHIVED') { continue; } // discontinued = leave archived, untouched
+ // Foreign-vendor mislabel guard: a title that names another house is NOT Anna French.
+ if (/\|\s*(Thibaut|Schumacher|York|Kravet|Brewster)\b/i.test(p.title)) {
+ skips.push({ handle: p.handle, reason: 'foreign-vendor title', title: p.title }); continue;
+ }
+ const mfrU = String(mfrOf(p)).toUpperCase();
+ const a = anchor.get(mfrU);
+ if (!a) { skips.push({ handle: p.handle, mfr: mfrU, reason: 'no anchor row', title: p.title }); continue; }
+ const colorway = (a.col || '').trim();
+ if (!colorway || /^default$/i.test(colorway)) {
+ skips.push({ handle: p.handle, mfr: mfrU, reason: 'anchor colorway Default/blank', title: p.title }); continue;
+ }
+ const cwTitle = titleCase(colorway);
+ const facet = 'color:' + cwTitle;
+ // tokens that ARE the real colorway (never strip these) — e.g. "Robin's Egg on White" → robin egg white
+ const cwTokens = new Set(colorTokens(colorway));
+ const cwNorm = norm(colorway);
+
+ // AI palette = THIS product's own AI metafields (deterministic strip source)
+ const palette = new Set();
+ try { for (const c of JSON.parse(p.cd && p.cd.value || '[]')) { const n = c && (c.name || c.color); if (n) palette.add(titleCase(n)); } } catch {}
+ for (const v of [p.c1 && p.c1.value, p.c2 && p.c2.value, p.c3 && p.c3.value, p.bg && p.bg.value]) if (v) palette.add(titleCase(v));
+ const paletteNorm = new Set([...palette].map(norm));
+
+ const newTags = []; const strippedFacet = [], strippedPalette = [], strippedBgDesc = [];
+ for (const t of p.tags) {
+ const tn = norm(t);
+ // (a) existing color: / "Color:" facets — keep only if it is exactly the correct anchor facet
+ if (/^color\s*:/i.test(t)) {
+ if (tn === norm(facet)) { newTags.push(facet); continue; } // already correct, canonicalize
+ strippedFacet.push(t); continue; // wrong/stale facet → strip
+ }
+ // (b) "Background Color X" descriptor tags = AI palette noise → strip
+ if (/^background color\b/i.test(t)) { strippedBgDesc.push(t); continue; }
+ // never strip a tag that is (a component of) the real colorway
+ const tWords = tn.split(/[^a-z']+/).filter(Boolean);
+ const isColorwayPiece = tn === cwNorm || (tWords.length && tWords.every(w => cwTokens.has(w)));
+ if (isColorwayPiece) { newTags.push(t); continue; } // PRESERVE the real colour word(s)
+ // (c) strip bare colour-ish tags that the AI palette produced for THIS product
+ if (isColorishTag(t) && paletteNorm.has(tn)) { strippedPalette.push(t); continue; }
+ newTags.push(t); // PRESERVE every other tag
+ }
+ // (d) ensure correct facet + bare colorway present
+ if (!newTags.includes(facet)) newTags.push(facet);
+ if (!newTags.map(norm).includes(cwNorm)) newTags.push(cwTitle);
+
+ // de-dup preserving order
+ const seen = new Set(); const finalTags = [];
+ for (const t of newTags) { const k = norm(t); if (seen.has(k)) continue; seen.add(k); finalTags.push(t); }
+
+ const changed = JSON.stringify([...p.tags].sort()) !== JSON.stringify([...finalTags].sort());
+ if (!changed) continue;
+ plans.push({ id: p.id, handle: p.handle, status: p.status, mfr: mfrU, title: p.title,
+ colorway: cwTitle, featuredImage: p.featuredImage && p.featuredImage.url || null,
+ oldTags: p.tags, newTags: finalTags, strippedFacet, strippedPalette, strippedBgDesc });
+ }
+
+ console.log(`plans: ${plans.length} need correction`);
+ console.log(`skipped: ${skips.length}`);
+ const skReasons = {}; for (const s of skips) skReasons[s.reason] = (skReasons[s.reason] || 0) + 1;
+ console.log('skip reasons:', JSON.stringify(skReasons));
+ fs.writeFileSync(path.join(HERE, 'out', 'tk11076-skips.json'), JSON.stringify(skips, null, 2));
+
+ // ---- CANARY: 6 diverse products, before/after diff, JUDGE strip safety ----
+ if (CANARY) {
+ // pick diverse: compound colorway, single colorway, many-strip, few-strip, fabric, wallcovering
+ const pick = [];
+ const byStrips = [...plans].sort((a, b) => b.strippedPalette.length - a.strippedPalette.length);
+ const compound = plans.find(p => /\s(on|and)\s/i.test(p.colorway));
+ const single = plans.find(p => !/\s(on|and)\s/i.test(p.colorway) && p.strippedPalette.length >= 1);
+ const fabric = plans.find(p => /Fabric/i.test(p.title));
+ const wall = plans.find(p => /Wallcovering/i.test(p.title));
+ for (const c of [byStrips[0], byStrips[1], compound, single, fabric, wall]) {
+ if (c && !pick.find(x => x && x.handle === c.handle)) pick.push(c);
+ }
+ let i = 0; while (pick.length < 6 && i < plans.length) { if (!pick.find(x => x.handle === plans[i].handle)) pick.push(plans[i]); i++; }
+ const canary = pick.slice(0, 6).map(pl => {
+ const kept = pl.newTags.filter(t => isColorishTag(t));
+ return {
+ handle: pl.handle, mfr: pl.mfr, status: pl.status, title: pl.title,
+ anchor_colorway: pl.colorway,
+ set_facet: 'color:' + pl.colorway,
+ stripped_wrong_facet: pl.strippedFacet,
+ stripped_bg_descriptor: pl.strippedBgDesc,
+ stripped_ai_palette_strays: pl.strippedPalette,
+ KEPT_color_tags: kept,
+ old_tags: pl.oldTags, new_tags: pl.newTags,
+ };
+ });
+ fs.writeFileSync(path.join(HERE, 'out', 'tk11076-canary-diff.json'), JSON.stringify(canary, null, 2));
+ console.log('\n===== CANARY (6 diverse) =====');
+ for (const c of canary) {
+ console.log(`\n### ${c.handle} [${c.status}] mfr=${c.mfr}`);
+ console.log(` title: ${c.title}`);
+ console.log(` SET facet: ${c.set_facet}`);
+ console.log(` strip wrong-facet: ${JSON.stringify(c.stripped_wrong_facet)}`);
+ console.log(` strip bg-desc: ${JSON.stringify(c.stripped_bg_descriptor)}`);
+ console.log(` strip AI strays: ${JSON.stringify(c.stripped_ai_palette_strays)}`);
+ console.log(` KEPT color tags: ${JSON.stringify(c.KEPT_color_tags)}`);
+ }
+ console.log(`\ncanary diff → ${path.join(HERE, 'out', 'tk11076-canary-diff.json')}`);
+ return;
+ }
+
+ let toApply = plans;
+ if (LIMIT) toApply = plans.slice(0, LIMIT);
+ if (!APPLY) {
+ for (const pl of toApply.slice(0, 30)) {
+ const add = pl.newTags.filter(t => !pl.oldTags.includes(t));
+ const rem = pl.oldTags.filter(t => !pl.newTags.includes(t));
+ console.log(`\n[${pl.status}] ${pl.handle} (${pl.mfr}) → color:${pl.colorway}`);
+ console.log(` +[${add.join(', ')}] -[${rem.join(', ')}]`);
+ }
+ console.log(`\nDRY-RUN. ${plans.length} would change (showing ≤30). Re-run with --apply.`);
+ return;
+ }
+
+ // ---- APPLY ----
+ const rollback = fs.existsSync(ROLLBACK) ? JSON.parse(fs.readFileSync(ROLLBACK, 'utf8')) : {};
+ let done = 0, pass = 0, fail = 0, batchCount = 0;
+ for (const pl of toApply) {
+ rollback[pl.handle] = { id: pl.id, mfr: pl.mfr, ts: new Date().toISOString(),
+ colorway: pl.colorway, old_tags: pl.oldTags, new_tags: pl.newTags };
+ fs.writeFileSync(ROLLBACK, JSON.stringify(rollback, null, 2));
+
+ const d = await gql(`mutation($input:ProductInput!){ productUpdate(input:$input){ product{ id } userErrors{ field message } } }`,
+ { input: { id: pl.id, tags: pl.newTags } });
+ const ue = d && d.productUpdate && d.productUpdate.userErrors;
+ if (ue && ue.length) { console.error(` userErrors ${pl.handle}: ${JSON.stringify(ue)}`); fail++; continue; }
+
+ // per-item verify: re-GET tags + image + status
+ const v = await gql(`query($id:ID!){ product(id:$id){ status tags featuredImage{ url } variants(first:1){ nodes{ sku price } } } }`, { id: pl.id });
+ const prod = v && v.product || {};
+ const liveTags = prod.tags || [];
+ const facet = 'color:' + pl.colorway;
+ const facetOk = liveTags.map(norm).includes(norm(facet));
+ const noWrongFacet = !liveTags.some(t => /^color\s*:/i.test(t) && norm(t) !== norm(facet));
+ // every stray we stripped must be gone (unless it IS the colorway word we deliberately keep)
+ const cwNorm = norm(pl.colorway);
+ const straysGone = !pl.strippedPalette.concat(pl.strippedBgDesc).some(t => liveTags.includes(t) && norm(t) !== cwNorm);
+ // no legit/non-color tag lost: every old tag that is NOT a stripped stray/wrong-facet must still be present
+ const strippedSet = new Set([...pl.strippedFacet, ...pl.strippedPalette, ...pl.strippedBgDesc].map(norm));
+ const noLegitLost = pl.oldTags.filter(t => !strippedSet.has(norm(t))).every(t => liveTags.map(norm).includes(norm(t)));
+ const imgOk = (prod.featuredImage && prod.featuredImage.url || null) === pl.featuredImage;
+ const statusOk = prod.status === pl.status;
+ const verifyOk = facetOk && noWrongFacet && straysGone && noLegitLost && imgOk && statusOk;
+ if (verifyOk) pass++; else { fail++; console.error(` VERIFY FAIL ${pl.handle}: facetOk=${facetOk} noWrongFacet=${noWrongFacet} straysGone=${straysGone} noLegitLost=${noLegitLost} imgOk=${imgOk} statusOk=${statusOk}`); }
+
+ done++;
+ console.log(`[${done}/${toApply.length}] ${pl.handle} ✓ ${verifyOk ? 'verified' : 'VERIFY-FAIL'} color:${pl.colorway}`);
+ try {
+ execSync(`node "${path.join(LEDGER_LOG, 'log-exec.mjs')}" ` +
+ `--agent vp-dw-commerce --ticket TK-11076 ` +
+ `--action "Anna French retag ${pl.handle}: color:${pl.colorway}, strip AI-palette strays" ` +
+ `--blast 1 ` +
+ `--undo "cd ${HERE} && node tk11076-rollback.mjs --only=${pl.handle} --apply" ` +
+ `--verify "GET product ${pl.id} — color facet correct, strays gone, non-color tags intact, image/status unchanged"`,
+ { stdio: 'ignore' });
+ } catch { /* ledger best-effort */ }
+
+ batchCount++;
+ if (batchCount % 25 === 0 && done < toApply.length) { console.log(' …90s inter-batch gap…'); await sleep(90000); }
+ else await sleep(650);
+ }
+ console.log(`\nDONE: ${done} products · verify-pass ${pass} · verify-fail ${fail}`);
+ console.log(`rollback map: ${ROLLBACK}`);
+}
+run();
diff --git a/scripts/anna-french-onboard/tk11076-rollback.mjs b/scripts/anna-french-onboard/tk11076-rollback.mjs
new file mode 100644
index 0000000..9a4bdb8
--- /dev/null
+++ b/scripts/anna-french-onboard/tk11076-rollback.mjs
@@ -0,0 +1,43 @@
+#!/usr/bin/env node
+/**
+ * TK-11076 Anna French rollback — restore old_tags per handle from THIS vendor's own rollback file.
+ * node tk11076-rollback.mjs # DRY-RUN (all recorded handles)
+ * node tk11076-rollback.mjs --only=h1,h2 --apply # restore specific handles
+ * node tk11076-rollback.mjs --apply # restore ALL recorded handles
+ */
+import fs from 'node:fs';
+import path from 'node:path';
+const STORE = process.env.SHOPIFY_STORE || 'designer-laboratory-sandbox.myshopify.com';
+const TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
+const API = process.env.SHOPIFY_API_VERSION || '2024-10';
+const APPLY = process.argv.includes('--apply');
+const ONLY = ((process.argv.find(a => a.startsWith('--only=')) || '').split('=')[1] || '').split(',').filter(Boolean);
+const ROLLBACK = path.join(process.env.HOME, '.claude/yolo-queue/executed-reversible/TK-11076-Anna_French-rollback.json');
+if (!TOKEN) { console.error('FATAL: set SHOPIFY_ADMIN_TOKEN'); process.exit(1); }
+const sleep = ms => new Promise(r => setTimeout(r, ms));
+async function gql(query, variables) {
+ for (let a = 0; a < 5; a++) {
+ const res = await fetch(`https://${STORE}/admin/api/${API}/graphql.json`, {
+ method: 'POST', headers: { 'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json' },
+ body: JSON.stringify({ query, variables }), signal: AbortSignal.timeout(45000) });
+ const j = await res.json().catch(() => ({}));
+ if (j.errors) { if (a === 4) return { errors: j.errors }; await sleep(1200 * (a + 1)); continue; }
+ await sleep(300); return j.data;
+ }
+}
+const map = fs.existsSync(ROLLBACK) ? JSON.parse(fs.readFileSync(ROLLBACK, 'utf8')) : {};
+let handles = Object.keys(map);
+if (ONLY.length) handles = handles.filter(h => ONLY.includes(h));
+console.log(`rollback candidates: ${handles.length}`);
+if (!APPLY) { console.log('DRY-RUN. Re-run with --apply to restore old_tags.'); process.exit(0); }
+let done = 0;
+for (const h of handles) {
+ const rec = map[h];
+ const d = await gql(`mutation($input:ProductInput!){ productUpdate(input:$input){ product{ id } userErrors{ message } } }`,
+ { input: { id: rec.id, tags: rec.old_tags } });
+ const ue = d && d.productUpdate && d.productUpdate.userErrors;
+ if (ue && ue.length) { console.error(` ERR ${h}: ${JSON.stringify(ue)}`); continue; }
+ done++; console.log(`[${done}/${handles.length}] restored ${h}`);
+ await sleep(500);
+}
+console.log(`DONE: restored ${done} products.`);
← a6fd514 TK-11076: Rebel Walls AI-palette retag remediate+rollback (c
·
back to Designerwallcoverings
·
auto-data-snapshot: 2026-09-01T12:55:30 (10 data files) — sc 3d0551a →