[object Object]

← back to Majilite Jewelry Cases

TK-11086: stage reversible removal of jewelry glass-counter images from live DW Shopify (dry-run default, --apply gated)

af9272beee60a31a04603ecc60ec10f61dd61b90 · 2026-09-01 17:14:59 -0700 · Steve Abrams

309 image IDs sourced from data/push.log LIVE PUSH record (153 novasuede + 156 majilite).
Live deploy stays Steve-gated per customer-facing rule.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit af9272beee60a31a04603ecc60ec10f61dd61b90
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Sep 1 17:14:59 2026 -0700

    TK-11086: stage reversible removal of jewelry glass-counter images from live DW Shopify (dry-run default, --apply gated)
    
    309 image IDs sourced from data/push.log LIVE PUSH record (153 novasuede + 156 majilite).
    Live deploy stays Steve-gated per customer-facing rule.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
 data/tk11086-jewelry-removal-targets.jsonl | 309 +++++++++++++++++++++++++++++
 scripts/remove-jewelry-shopify.mjs         |  66 ++++++
 2 files changed, 375 insertions(+)

diff --git a/data/tk11086-jewelry-removal-targets.jsonl b/data/tk11086-jewelry-removal-targets.jsonl
new file mode 100644
index 0000000..26a9703
--- /dev/null
+++ b/data/tk11086-jewelry-removal-targets.jsonl
@@ -0,0 +1,309 @@
+{"handle":"majilite-stature-storm","image_id":"37874722275379"}
+{"handle":"majilite-apollo-silver-icon","image_id":"37874722406451"}
+{"handle":"majilite-chinchilla-ice-floe","image_id":"37874722504755"}
+{"handle":"majilite-metallic-paragon-silver","image_id":"37874722570291"}
+{"handle":"majilite-metallic-raindrop-stainless-steel","image_id":"37874722603059"}
+{"handle":"majilite-brushed-finesse-pewter","image_id":"37874722635827"}
+{"handle":"majilite-reflection-aluminum","image_id":"37874722668595"}
+{"handle":"majilite-reflection-aluminum-icon","image_id":"37874722701363"}
+{"handle":"majilite-legacy-pearl-black-icon-gold-glitter","image_id":"37874722734131"}
+{"handle":"majilite-radiance-dove","image_id":"37874722766899"}
+{"handle":"majilite-finesse-mercury","image_id":"37874722799667"}
+{"handle":"majilite-shimmer-grey-pearl","image_id":"37874722897971"}
+{"handle":"majilite-infinity-onyx","image_id":"37874722963507"}
+{"handle":"majilite-legacy-pearl-black","image_id":"37874722996275"}
+{"handle":"majilite-stature-granite-icon","image_id":"37874723029043"}
+{"handle":"majilite-eclipse-fx-mercury","image_id":"37874723061811"}
+{"handle":"majilite-drizzle-black","image_id":"37874723094579"}
+{"handle":"majilite-techno-black","image_id":"37874723389491"}
+{"handle":"majilite-finesse-pearl-black","image_id":"37874723422259"}
+{"handle":"majilite-presto-silver","image_id":"37874723455027"}
+{"handle":"majilite-finesse-fx-silver","image_id":"37874723586099"}
+{"handle":"majilite-infinity-iceberg","image_id":"37874723618867"}
+{"handle":"majilite-infinity-silver","image_id":"37874723651635"}
+{"handle":"majilite-legacy-mercury","image_id":"37874723684403"}
+{"handle":"majilite-pony-moonbeam","image_id":"37874723717171"}
+{"handle":"majilite-eclipse-fx-silver","image_id":"37874723749939"}
+{"handle":"majilite-pony-granite-grey","image_id":"37874723782707"}
+{"handle":"majilite-drizzle-black-silver","image_id":"37874723815475"}
+{"handle":"majilite-echo-silver-black","image_id":"37874723848243"}
+{"handle":"majilite-shimmer-mercury","image_id":"37874723881011"}
+{"handle":"majilite-starlite-stainless-steel","image_id":"37874724208691"}
+{"handle":"majilite-eclipse-fx-carbon","image_id":"37874724241459"}
+{"handle":"majilite-nuance-nickel","image_id":"37874724274227"}
+{"handle":"majilite-status-silver-black","image_id":"37874724306995"}
+{"handle":"majilite-burnished-metal-pewter","image_id":"37874724339763"}
+{"handle":"majilite-brushed-finesse-stainless-steel","image_id":"37874724372531"}
+{"handle":"majilite-shimmer-charcoal","image_id":"37874724405299"}
+{"handle":"majilite-pony-black","image_id":"37874724438067"}
+{"handle":"majilite-apollo-black-icon","image_id":"37874724470835"}
+{"handle":"majilite-chinchilla-black","image_id":"37874724569139"}
+{"handle":"majilite-charm-white","image_id":"37874724765747"}
+{"handle":"majilite-eclipse-fx-pearl-pure-white","image_id":"37874724864051"}
+{"handle":"majilite-capricorn-bright-star","image_id":"37874725716019"}
+{"handle":"majilite-farro-pearl-white-gold-stardust","image_id":"37874725912627"}
+{"handle":"majilite-shimmer-polar-white","image_id":"37874726109235"}
+{"handle":"majilite-apollo-snow","image_id":"37874726142003"}
+{"handle":"majilite-chinchilla-snow","image_id":"37874726174771"}
+{"handle":"majilite-radiance-pearl-white","image_id":"37874726240307"}
+{"handle":"majilite-shimmer-polar-white-gab-paraweave","image_id":"37874726338611"}
+{"handle":"majilite-finesse-pearl-white","image_id":"37874726371379"}
+{"handle":"majilite-shimmer-ivory","image_id":"37874726764595"}
+{"handle":"majilite-legacy-white","image_id":"37874726797363"}
+{"handle":"majilite-nuance-glacier","image_id":"37874726830131"}
+{"handle":"majilite-eclipse-hx-snow-white","image_id":"37874726862899"}
+{"handle":"majilite-nuance-silver","image_id":"37874726895667"}
+{"handle":"majilite-nuance-snow","image_id":"37874726928435"}
+{"handle":"majilite-finesse-hx-pure-white-silver-saffa","image_id":"37874726961203"}
+{"handle":"majilite-legacy-white-gabardine-black-saffa","image_id":"37874726993971"}
+{"handle":"majilite-nuance-platinum","image_id":"37874727026739"}
+{"handle":"majilite-palisades-igloo","image_id":"37874727059507"}
+{"handle":"majilite-finesse-pearl-gelato","image_id":"37874727157811"}
+{"handle":"majilite-nuance-pearl-gelato","image_id":"37874727223347"}
+{"handle":"majilite-pony-pearl-gelato","image_id":"37874727256115"}
+{"handle":"majilite-deco-white-pearl","image_id":"37874727288883"}
+{"handle":"majilite-charm-featherbed","image_id":"37874727321651"}
+{"handle":"majilite-sandwash-salt","image_id":"37874727485491"}
+{"handle":"majilite-starlite-pearl-gelato","image_id":"37874727616563"}
+{"handle":"majilite-classic-platinum","image_id":"37874727747635"}
+{"handle":"majilite-legacy-platinum","image_id":"37874727780403"}
+{"handle":"majilite-nuance-white-gold","image_id":"37874727878707"}
+{"handle":"majilite-brushed-finesse-pearl-gelato","image_id":"37874727911475"}
+{"handle":"majilite-nuance-gold-leaf","image_id":"37874727944243"}
+{"handle":"majilite-legacy-pearl-gelato","image_id":"37874728108083"}
+{"handle":"majilite-charm-ii-platinum","image_id":"37874728271923"}
+{"handle":"majilite-hammered-metal-parchment","image_id":"37874728304691"}
+{"handle":"majilite-beton-platinum","image_id":"37874728468531"}
+{"handle":"majilite-stature-icicle","image_id":"37874728665139"}
+{"handle":"majilite-eclipse-fx-icicle","image_id":"37874728828979"}
+{"handle":"majilite-charm-pashmina","image_id":"37874728992819"}
+{"handle":"majilite-chinchilla-fawn","image_id":"37874729189427"}
+{"handle":"majilite-charm-pearl-gelato","image_id":"37874729353267"}
+{"handle":"majilite-finesse-pearl-eggshell-gab-paraweave","image_id":"37874729386035"}
+{"handle":"majilite-legacy-pearl-gelato-icon-gold-glitter","image_id":"37874729549875"}
+{"handle":"majilite-radiance-sand","image_id":"37874729713715"}
+{"handle":"majilite-brushed-finesse-fawn","image_id":"37874729943091"}
+{"handle":"majilite-shimmer-mist","image_id":"37874730139699"}
+{"handle":"majilite-linea-ash","image_id":"37874730238003"}
+{"handle":"majilite-nuance-pebble","image_id":"37874730434611"}
+{"handle":"majilite-charm-silver","image_id":"37874730631219"}
+{"handle":"majilite-nuance-fawn","image_id":"37874730729523"}
+{"handle":"majilite-cross-hatch-gold","image_id":"37874730827827"}
+{"handle":"majilite-infinity-pebble","image_id":"37874730991667"}
+{"handle":"majilite-starlite-fawn","image_id":"37874731155507"}
+{"handle":"majilite-finesse-pearl-cr-me","image_id":"37874731319347"}
+{"handle":"majilite-shimmer-mist-pique","image_id":"37874731548723"}
+{"handle":"majilite-splendor-sand","image_id":"37874731712563"}
+{"handle":"majilite-sandwash-cream-gold","image_id":"37874731876403"}
+{"handle":"majilite-metallic-raindrop-fawn","image_id":"37874731909171"}
+{"handle":"majilite-shimmer-wheat","image_id":"37874731941939"}
+{"handle":"majilite-celestial-pearl-gelato","image_id":"37874732007475"}
+{"handle":"majilite-finesse-pearl-eggshell","image_id":"37874732073011"}
+{"handle":"majilite-eclipse-fx-wheat","image_id":"37874732171315"}
+{"handle":"majilite-legacy-beige","image_id":"37874732204083"}
+{"handle":"majilite-legacy-natural","image_id":"37874732236851"}
+{"handle":"majilite-pony-pearl-buff","image_id":"37874732269619"}
+{"handle":"majilite-apollo-chardonnay","image_id":"37874732367923"}
+{"handle":"majilite-vibes-eggshell-gold-stardust","image_id":"37874732433459"}
+{"handle":"majilite-drizzle-buff","image_id":"37874732466227"}
+{"handle":"majilite-hive-antique-gold","image_id":"37874732564531"}
+{"handle":"majilite-orion-gold-coin","image_id":"37874732630067"}
+{"handle":"majilite-chinchilla-gold","image_id":"37874732695603"}
+{"handle":"majilite-finesse-gold","image_id":"37874732793907"}
+{"handle":"majilite-legacy-sand","image_id":"37874732859443"}
+{"handle":"majilite-nuance-sand","image_id":"37874732957747"}
+{"handle":"majilite-eclipse-hx-mystic-gold","image_id":"37874733088819"}
+{"handle":"majilite-legacy-tan","image_id":"37874733121587"}
+{"handle":"majilite-echo-gold","image_id":"37874733187123"}
+{"handle":"majilite-fortuna-white-gold","image_id":"37874733252659"}
+{"handle":"majilite-nuance-petal","image_id":"37874733318195"}
+{"handle":"majilite-palisades-pearl-eggshell","image_id":"37874733383731"}
+{"handle":"majilite-stature-rose-gold","image_id":"37874733449267"}
+{"handle":"majilite-chinchilla-rose-gold","image_id":"37874733514803"}
+{"handle":"majilite-bijoux-pink","image_id":"37874733580339"}
+{"handle":"majilite-finesse-pearl-dark-powder","image_id":"37874733613107"}
+{"handle":"majilite-chinchilla-blossom","image_id":"37874734006323"}
+{"handle":"majilite-finesse-metallic-rose","image_id":"37874734071859"}
+{"handle":"majilite-infinity-white-zinfandel","image_id":"37874734104627"}
+{"handle":"majilite-brushed-finesse-champagne","image_id":"37874734137395"}
+{"handle":"majilite-chinchilla-wheat","image_id":"37874734170163"}
+{"handle":"majilite-infinity-sand-icon-silver-glitter","image_id":"37874734235699"}
+{"handle":"majilite-capricorn-gold-leaf","image_id":"37874734301235"}
+{"handle":"majilite-presto-fawn","image_id":"37874734366771"}
+{"handle":"majilite-infinity-sand","image_id":"37874734432307"}
+{"handle":"majilite-heirloom-soft-gold","image_id":"37874734465075"}
+{"handle":"majilite-metallic-paragon-ivory","image_id":"37874734530611"}
+{"handle":"majilite-burnished-metal-penny","image_id":"37874734596147"}
+{"handle":"majilite-legacy-cameo","image_id":"37874734661683"}
+{"handle":"majilite-shimmer-mist-legend","image_id":"37874734694451"}
+{"handle":"majilite-echo-white-silver","image_id":"37874734727219"}
+{"handle":"majilite-eclipse-fx-diamond","image_id":"37874734759987"}
+{"handle":"majilite-palisades-metallic-taupe","image_id":"37874734792755"}
+{"handle":"majilite-infinity-mist","image_id":"37874734825523"}
+{"handle":"majilite-distinction-grey","image_id":"37874734858291"}
+{"handle":"majilite-nuance-grey","image_id":"37874734891059"}
+{"handle":"majilite-burnished-metal-mercury","image_id":"37874734923827"}
+{"handle":"majilite-nuance-pewter","image_id":"37874734956595"}
+{"handle":"majilite-charm-metallic-taupe","image_id":"37874734989363"}
+{"handle":"majilite-shimmer-slate","image_id":"37874735022131"}
+{"handle":"majilite-charm-antique-gold","image_id":"37874735054899"}
+{"handle":"majilite-infinity-grey","image_id":"37874735087667"}
+{"handle":"majilite-metallic-paragon-slate","image_id":"37874735120435"}
+{"handle":"majilite-attache-rose-gold","image_id":"37874735153203"}
+{"handle":"majilite-shimmer-pewter","image_id":"37874735185971"}
+{"handle":"majilite-stature-gold","image_id":"37874735218739"}
+{"handle":"majilite-finesse-pearl-pewter","image_id":"37874735251507"}
+{"handle":"majilite-hammered-metal-midnight","image_id":"37874735284275"}
+{"handle":"novasuede™-hyacinth","image_id":"37874735349811"}
+{"handle":"novasuede™-iceberg","image_id":"37874735382579"}
+{"handle":"novasuede™-ivory","image_id":"37874735415347"}
+{"handle":"novasuede™-lavender","image_id":"37874735448115"}
+{"handle":"novasuede™-light-amethyst","image_id":"37874735480883"}
+{"handle":"novasuede™-light-grey","image_id":"37874735513651"}
+{"handle":"novasuede™-linen","image_id":"37874735546419"}
+{"handle":"novasuede™-madison-grey","image_id":"37874735579187"}
+{"handle":"novasuede™-maize","image_id":"37874735611955"}
+{"handle":"novasuede™-maroon","image_id":"37874735644723"}
+{"handle":"novasuede™-meadow","image_id":"37874735710259"}
+{"handle":"novasuede™-melon","image_id":"37874735743027"}
+{"handle":"novasuede™-milk","image_id":"37874735775795"}
+{"handle":"novasuede™-mint-julip","image_id":"37874735808563"}
+{"handle":"novasuede™-misty-dew","image_id":"37874735841331"}
+{"handle":"novasuede™-mocha","image_id":"37874735874099"}
+{"handle":"novasuede™-moss","image_id":"37874735906867"}
+{"handle":"novasuede™-mushroom","image_id":"37874735939635"}
+{"handle":"novasuede™-nutmeg","image_id":"37874735972403"}
+{"handle":"novasuede™-ocean","image_id":"37874736005171"}
+{"handle":"novasuede™-olive","image_id":"37874736037939"}
+{"handle":"novasuede™-oyster","image_id":"37874736070707"}
+{"handle":"novasuede™-pale-green","image_id":"37874736103475"}
+{"handle":"novasuede™-passion-blue","image_id":"37874736136243"}
+{"handle":"novasuede™-peach","image_id":"37874736169011"}
+{"handle":"novasuede™-pebble","image_id":"37874736201779"}
+{"handle":"novasuede™-peppermint","image_id":"37874736234547"}
+{"handle":"novasuede™-peridot","image_id":"37874736267315"}
+{"handle":"novasuede™-periwinkle","image_id":"37874736300083"}
+{"handle":"novasuede™-fabric-wallcovering-pistachio","image_id":"37874736693299"}
+{"handle":"novasuede™-plum-pleasure","image_id":"37874736726067"}
+{"handle":"novasuede™-strong-white","image_id":"37874736758835"}
+{"handle":"novasuede™-powder-grey","image_id":"37874736791603"}
+{"handle":"novasuede™-prairie","image_id":"37874736824371"}
+{"handle":"novasuede™-fabric-wallcovering-white-copy","image_id":"37874737020979"}
+{"handle":"novasuede™-straw","image_id":"37874737315891"}
+{"handle":"novasuede™-fabric-wallcovering-rosewater","image_id":"37874737938483"}
+{"handle":"novasuede™-mauve","image_id":"37874738200627"}
+{"handle":"novasuede™-ruby","image_id":"37874738692147"}
+{"handle":"novasuede™-sable","image_id":"37874738954291"}
+{"handle":"novasuede™-fabric-wallcovering-safari","image_id":"37874739445811"}
+{"handle":"novasuede™-saffron","image_id":"37874739478579"}
+{"handle":"novasuede™-sage","image_id":"37874739544115"}
+{"handle":"novasuede™-fabric-wallcovering-bliss","image_id":"37874739576883"}
+{"handle":"novasuede™-fabric-wallcovering-blank-slate","image_id":"37874739609651"}
+{"handle":"novasuede™-fabric-wallcovering-amber","image_id":"37874739642419"}
+{"handle":"novasuede™-fabric-wallcovering-blush-rose","image_id":"37874739675187"}
+{"handle":"novasuede™-fabric-wallcovering-cement","image_id":"37874739740723"}
+{"handle":"novasuede™-fabric-wallcovering-colonial-blue","image_id":"37874739806259"}
+{"handle":"novasuede™-fabric-wallcovering-dusty-ranch","image_id":"37874739871795"}
+{"handle":"novasuede™-fabric-wallcovering-dusty-teal","image_id":"37874739904563"}
+{"handle":"novasuede™-fabric-wallcovering-fire","image_id":"37874739970099"}
+{"handle":"novasuede™-fabric-wallcovering-flagstone","image_id":"37874740002867"}
+{"handle":"novasuede™-fabric-wallcovering-henna","image_id":"37874740035635"}
+{"handle":"novasuede™-fabric-wallcovering-kiva","image_id":"37874740101171"}
+{"handle":"novasuede™-fabric-wallcovering-lipstick","image_id":"37874740166707"}
+{"handle":"novasuede™-fabric-wallcovering-noir","image_id":"37874740232243"}
+{"handle":"novasuede™-fabric-wallcovering-opal","image_id":"37874740265011"}
+{"handle":"novasuede™-fabric-wallcovering-pastel-blue","image_id":"37874740297779"}
+{"handle":"novasuede™-fabric-wallcovering-pastel-pink","image_id":"37874740363315"}
+{"handle":"novasuede™-salt","image_id":"37874740428851"}
+{"handle":"novasuede™-fabric-wallcovering-port-blue","image_id":"37874740461619"}
+{"handle":"novasuede™-fabric-wallcovering-pink-lace","image_id":"37874740494387"}
+{"handle":"novasuede™-fabric-wallcovering-royal-blue","image_id":"37874740527155"}
+{"handle":"novasuede™-fabric-wallcovering-raisin","image_id":"37874740559923"}
+{"handle":"novasuede™-fabric-wallcovering-sedona","image_id":"37874740592691"}
+{"handle":"novasuede™-fabric-wallcovering-shale","image_id":"37874740625459"}
+{"handle":"novasuede™-fabric-wallcovering-spruce","image_id":"37874740658227"}
+{"handle":"novasuede™-fabric-wallcovering-terracotta","image_id":"37874740690995"}
+{"handle":"novasuede™-fabric-wallcovering-thistle","image_id":"37874740723763"}
+{"handle":"novasuede™-fabric-wallcovering-tusk","image_id":"37874740756531"}
+{"handle":"novasuede™-fabric-wallcovering-umber","image_id":"37874740789299"}
+{"handle":"novasuede™-fabric-wallcovering-verdigris","image_id":"37874740822067"}
+{"handle":"novasuede™-fabric-wallcovering-vermilion","image_id":"37874740854835"}
+{"handle":"novasuede™-fabric-wallcovering-wheat","image_id":"37874740887603"}
+{"handle":"novasuede™-fabric-wallcovering-winter-white","image_id":"37874740920371"}
+{"handle":"novasuede™-fabric-wallcovering-woodland","image_id":"37874740953139"}
+{"handle":"novasuede™-scarlet-wine","image_id":"37874740985907"}
+{"handle":"novasuede™-sea-blue","image_id":"37874741051443"}
+{"handle":"novasuede™-sea-breeze","image_id":"37874741084211"}
+{"handle":"novasuede™-sea-grass","image_id":"37874741116979"}
+{"handle":"novasuede™-seafoam","image_id":"37874741149747"}
+{"handle":"novasuede™-sienna","image_id":"37874741182515"}
+{"handle":"novasuede™-silver","image_id":"37874741215283"}
+{"handle":"novasuede™-sky-blue","image_id":"37874741248051"}
+{"handle":"novasuede™-smoke","image_id":"37874741280819"}
+{"handle":"novasuede™-soft-clay","image_id":"37874741313587"}
+{"handle":"novasuede™-solar-yellow","image_id":"37874741346355"}
+{"handle":"novasuede™-steel","image_id":"37874741379123"}
+{"handle":"novasuede™-stone-grey","image_id":"37874741411891"}
+{"handle":"novasuede™-stone-taupe","image_id":"37874741444659"}
+{"handle":"novasuede™-fabric-wallcovering-storm","image_id":"37874741477427"}
+{"handle":"novasuede™-fabric-wallcovering-iceberg-copy","image_id":"37874741510195"}
+{"handle":"novasuede™-fabric-wallcovering-strong-white","image_id":"37874741542963"}
+{"handle":"novasuede™-sugar-plum","image_id":"37874741575731"}
+{"handle":"novasuede™-sweet-lilac","image_id":"37874741608499"}
+{"handle":"novasuede™-tan","image_id":"37874741641267"}
+{"handle":"novasuede™-tarragon","image_id":"37874741674035"}
+{"handle":"novasuede™-taupe","image_id":"37874741706803"}
+{"handle":"novasuede™-thyme","image_id":"37874741739571"}
+{"handle":"novasuede™-trench","image_id":"37874741772339"}
+{"handle":"novasuede™-vanilla","image_id":"37874742132787"}
+{"handle":"novasuede™-white","image_id":"37874742198323"}
+{"handle":"novasuede™-fabric-wallcovering-abyss","image_id":"37874742263859"}
+{"handle":"novasuede™-fabric-wallcovering-satin","image_id":"37874742329395"}
+{"handle":"novasuede™-navy-luxury-suede","image_id":"37874742427699"}
+{"handle":"novasuede™-acorn","image_id":"37874742526003"}
+{"handle":"novasuede™-adobe","image_id":"37874742624307"}
+{"handle":"novasuede™-african-violet","image_id":"37874742755379"}
+{"handle":"novasuede™-apricot","image_id":"37874742853683"}
+{"handle":"novasuede™-arrow-wood","image_id":"37874742951987"}
+{"handle":"novasuede™-aubergine","image_id":"37874743017523"}
+{"handle":"novasuede™-baltic","image_id":"37874743050291"}
+{"handle":"novasuede™-beige","image_id":"37874743083059"}
+{"handle":"novasuede™-biscuit","image_id":"37874743181363"}
+{"handle":"novasuede™-bluestone","image_id":"37874743214131"}
+{"handle":"novasuede™-blush-pink","image_id":"37874743246899"}
+{"handle":"novasuede™-bone","image_id":"37874743279667"}
+{"handle":"novasuede™-brown","image_id":"37874743312435"}
+{"handle":"novasuede™-buff","image_id":"37874743345203"}
+{"handle":"novasuede™-buttercup","image_id":"37874743377971"}
+{"handle":"novasuede™-cane","image_id":"37874743410739"}
+{"handle":"novasuede™-carbon","image_id":"37874743443507"}
+{"handle":"novasuede™-cashew","image_id":"37874743476275"}
+{"handle":"novasuede™-cashmere","image_id":"37874743869491"}
+{"handle":"novasuede™-celadon","image_id":"37874743902259"}
+{"handle":"novasuede™-celery","image_id":"37874743935027"}
+{"handle":"novasuede™-champagne","image_id":"37874743967795"}
+{"handle":"novasuede™-china-blue","image_id":"37874744000563"}
+{"handle":"novasuede™-chrome-grey","image_id":"37874744033331"}
+{"handle":"novasuede™-cinder","image_id":"37874744066099"}
+{"handle":"novasuede™-cloud","image_id":"37874744098867"}
+{"handle":"novasuede™-cocoa","image_id":"37874744131635"}
+{"handle":"novasuede™-coral","image_id":"37874744197171"}
+{"handle":"novasuede™-cottage-grey","image_id":"37874744229939"}
+{"handle":"novasuede™-cream","image_id":"37874744262707"}
+{"handle":"novasuede™-cypress","image_id":"37874744295475"}
+{"handle":"novasuede™-dark-sand","image_id":"37874744328243"}
+{"handle":"novasuede™-dew","image_id":"37874744361011"}
+{"handle":"novasuede™-dove","image_id":"37874744393779"}
+{"handle":"novasuede™-dune","image_id":"37874744426547"}
+{"handle":"novasuede™-dusty-rose","image_id":"37874744459315"}
+{"handle":"novasuede™-ecru","image_id":"37874744492083"}
+{"handle":"novasuede™-fawn","image_id":"37874744524851"}
+{"handle":"novasuede™-french-blue","image_id":"37874744557619"}
+{"handle":"novasuede™-gainsborough","image_id":"37874744623155"}
+{"handle":"novasuede™-garnet","image_id":"37874744655923"}
+{"handle":"novasuede™-gelato","image_id":"37874744688691"}
+{"handle":"novasuede™-goldstone","image_id":"37874744721459"}
+{"handle":"novasuede™-granite","image_id":"37874744754227"}
+{"handle":"novasuede™-grape","image_id":"37874744819763"}
+{"handle":"novasuede™-green-marble","image_id":"37874744852531"}
+{"handle":"novasuede™-fabric-wallcovering-persimmon","image_id":"37874744885299"}
diff --git a/scripts/remove-jewelry-shopify.mjs b/scripts/remove-jewelry-shopify.mjs
new file mode 100644
index 0000000..68c6a58
--- /dev/null
+++ b/scripts/remove-jewelry-shopify.mjs
@@ -0,0 +1,66 @@
+#!/usr/bin/env node
+// TK-11086 (Steve 2026-09-01): "stop showing the jewelry photo across the dw network".
+// Detaches the glass-counter JEWELRY render (pushed live by push-shopify.mjs) from each DW Shopify
+// product it was attached to. The image IDs come straight from data/push.log (the LIVE PUSH record).
+//
+// GATED: this is a customer-facing production write across the LIVE DW store -> DRY-RUN by default;
+// real deletes require --apply (Steve-gated). Reversible: the render still exists on disk under
+// output/<dir>/glass-counter.png and can be re-attached via push-shopify.mjs --apply.
+//
+// Flags: --apply (LIVE DELETE)  --limit N (canary)  --only <handle-substr>
+// SAFETY: before deleting each image it GETs the image and refuses unless the image is still present
+// on that product (so a stale/already-removed id is a no-op, never a wrong delete).
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+const ROOT = path.resolve(__dirname, '..');
+const SHOP = 'designer-laboratory-sandbox.myshopify.com'; // LIVE DW store (legacy misnomer)
+const API = '2024-10';
+const TOKEN = (fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env', 'utf8')
+  .match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m) || [])[1]?.trim().replace(/"/g, '');
+
+const args = process.argv.slice(2);
+const has = f => args.includes(f);
+const val = (f, d) => { const i = args.indexOf(f); return i >= 0 ? args[i + 1] : d; };
+const APPLY = has('--apply');
+const LIMIT = parseInt(val('--limit', '0'), 10);
+const ONLY = val('--only', '');
+
+const TARGETS = path.join(ROOT, 'data/tk11086-jewelry-removal-targets.jsonl');
+const MAP = JSON.parse(fs.readFileSync(path.join(ROOT, 'data/shopify-map.json'), 'utf8'));
+const byHandle = new Map(MAP.map(r => [r.handle, r]));
+
+let rows = fs.readFileSync(TARGETS, 'utf8').trim().split('\n').map(l => JSON.parse(l));
+if (ONLY) rows = rows.filter(r => r.handle.includes(ONLY));
+if (LIMIT) rows = rows.slice(0, LIMIT);
+
+const api = (method, url, body) => {
+  const opt = { method, headers: { 'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json' } };
+  if (body) opt.body = JSON.stringify(body);
+  return fetch(`https://${SHOP}/admin/api/${API}/${url}`, opt);
+};
+const sleep = ms => new Promise(r => setTimeout(r, ms));
+
+console.log(`Store: ${SHOP} (LIVE)  API ${API}`);
+console.log(`Targets: ${rows.length}  | mode: ${APPLY ? 'APPLY (LIVE DELETE)' : 'DRY-RUN (no writes)'}`);
+
+let ok = 0, gone = 0, missing = 0, err = 0;
+for (const r of rows) {
+  const m = byHandle.get(r.handle);
+  if (!m || !m.shopify_id) { console.log(`  ? ${r.handle}: no product id in map — skip`); missing++; continue; }
+  const pid = String(m.shopify_id).replace(/\D/g, '');
+  // verify the image still exists on the product (never blind-delete)
+  const g = await api('GET', `products/${pid}/images.json`);
+  if (!g.ok) { console.log(`  ! ${r.handle}: images GET ${g.status}`); err++; await sleep(300); continue; }
+  const imgs = (await g.json()).images || [];
+  const hit = imgs.find(i => String(i.id) === String(r.image_id));
+  if (!hit) { console.log(`  = ${r.handle}: image ${r.image_id} already gone`); gone++; await sleep(300); continue; }
+  if (!APPLY) { console.log(`  + ${r.handle}: WOULD delete image ${r.image_id}`); ok++; await sleep(120); continue; }
+  const d = await api('DELETE', `products/${pid}/images/${r.image_id}.json`);
+  if (d.ok) { console.log(`  - ${r.handle}: deleted image ${r.image_id}`); ok++; }
+  else { console.log(`  ! ${r.handle}: DELETE ${d.status}`); err++; }
+  await sleep(350);
+}
+console.log(`\n${APPLY ? 'LIVE DELETE' : 'DRY-RUN'} done. ${APPLY ? 'deleted' : 'would-delete'}=${ok} already_gone=${gone} missing_map=${missing} errors=${err}`);

← c2a07c2 chore: lint (drop dead gql/bySky), refactor, hoverproof clea  ·  back to Majilite Jewelry Cases  ·  auto-data-snapshot: 2026-09-01T17:22:42 (2 data files) — dat 39c7bda →