← back to Designer Wallcoverings
pending-approval: found genuine BA469 image + ready-to-run live fix script (gated)
b91d293d0db06f353cdd256bb16658a4eb4dbf17 · 2026-06-24 07:49:12 -0700 · Steve
Files touched
M pending-approval/coastal-mist-oil-filter-image-fix.mdA pending-approval/fix-coastal-mist-BA469.sh
Diff
commit b91d293d0db06f353cdd256bb16658a4eb4dbf17
Author: Steve <steve@designerwallcoverings.com>
Date: Wed Jun 24 07:49:12 2026 -0700
pending-approval: found genuine BA469 image + ready-to-run live fix script (gated)
---
.../coastal-mist-oil-filter-image-fix.md | 7 ++
pending-approval/fix-coastal-mist-BA469.sh | 83 ++++++++++++++++++++++
2 files changed, 90 insertions(+)
diff --git a/pending-approval/coastal-mist-oil-filter-image-fix.md b/pending-approval/coastal-mist-oil-filter-image-fix.md
index 143c16cd..98e2a954 100644
--- a/pending-approval/coastal-mist-oil-filter-image-fix.md
+++ b/pending-approval/coastal-mist-oil-filter-image-fix.md
@@ -4,6 +4,13 @@
**Drafted:** 2026-06-24
**Decision basis:** DTD verdict A (3/3 unanimous — Claude/Codex/Qwen)
+## UPDATE 2026-06-24 — genuine image FOUND + ready-to-run script
+- **Real SKU:** Washington Wallcoverings **BA469** "Smoke Gray Sisal" (Best of Asia IV). "Phillipe Romano Portofino Bamboo – Coastal Mist" is the DW private-label rebrand. `color:Smoke` was correct all along.
+- **Root cause (confirmed):** importer fuzzy-matched real SKU **BA469 → B7469** (a Baldwin oil filter) — a 2-char string collision.
+- **Verified genuine image:** `https://www.interiordecorating.com/images/cat/wall/washington/BA469.jpg` — downloaded + eyeballed = correct grey sisal grasscloth. ⚠ low-res 200×250 (EXIF shows a 3278×4097 Canon original exists; source hi-res from Washington Wallcoverings for the final).
+- **Execute with:** `CONFIRM=1 bash pending-approval/fix-coastal-mist-BA469.sh` (dry-run by default; reads live tags so it won't clobber drift). Steps: add BA469 image → delete oil-filter image `37091234611251` → strip `Red` + `Needs-Image` (keep `color:Smoke`).
+- This supersedes the "just delete the image" plan below — we now replace with the real photo.
+
## What's wrong (live, customer-facing)
Product on designerwallcoverings.com:
- **handle:** `bamboo-wallcovering-coastal-mist-wallcovering-phillipe-romano`
diff --git a/pending-approval/fix-coastal-mist-BA469.sh b/pending-approval/fix-coastal-mist-BA469.sh
new file mode 100755
index 00000000..3e1dd301
--- /dev/null
+++ b/pending-approval/fix-coastal-mist-BA469.sh
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+# ─────────────────────────────────────────────────────────────────────────────
+# GATED PROD WRITE — run by Steve only. Default = DRY RUN (prints, changes nothing).
+#
+# Fixes live Shopify product "Portofino Bamboo - Coastal Mist Wallcovering"
+# (designerwallcoverings.com), which currently shows a Baldwin B7469 automotive
+# oil filter. Root cause: importer fuzzy-matched real SKU BA469 -> file B7469.
+#
+# Real product : Washington Wallcoverings BA469 "Smoke Gray Sisal" (Best of Asia IV)
+# Verified image: https://www.interiordecorating.com/images/cat/wall/washington/BA469.jpg
+# (confirmed grey sisal grasscloth; matches color:Smoke tag)
+# ⚠ low-res 200x250 — see HI-RES note at bottom before going live.
+#
+# Three steps: (1) add the real BA469 image, (2) delete the oil-filter image,
+# (3) strip the wrong `Red` tag and (image now present) `Needs-Image`.
+#
+# To execute for real: CONFIRM=1 bash fix-coastal-mist-BA469.sh
+# ─────────────────────────────────────────────────────────────────────────────
+set -euo pipefail
+
+SHOP="designer-laboratory-sandbox.myshopify.com"
+API="2024-10"
+PRODUCT_ID="7808267157555"
+OIL_FILTER_IMAGE_ID="37091234611251"
+NEW_IMAGE_SRC="https://www.interiordecorating.com/images/cat/wall/washington/BA469.jpg"
+NEW_IMAGE_ALT="Portofino Bamboo - Coastal Mist (Washington Wallcoverings BA469 Smoke Gray Sisal)"
+TAGS_TO_REMOVE=("Red" "Needs-Image") # keep color:Smoke and everything else
+
+TOKEN="${SHOPIFY_ADMIN_TOKEN:-}"
+if [ -z "$TOKEN" ]; then
+ TOKEN="$(grep -hE '^SHOPIFY_ADMIN_TOKEN=' "$HOME/Projects/secrets-manager/.env" 2>/dev/null | head -1 | cut -d= -f2-)"
+fi
+[ -z "$TOKEN" ] && { echo "ERROR: SHOPIFY_ADMIN_TOKEN not in env or secrets-manager/.env"; exit 1; }
+
+BASE="https://$SHOP/admin/api/$API"
+H_TOK=(-H "X-Shopify-Access-Token: $TOKEN")
+H_JSON=(-H "Content-Type: application/json")
+DRY=1; [ "${CONFIRM:-0}" = "1" ] && DRY=0
+
+say(){ printf '\n\033[1m%s\033[0m\n' "$*"; }
+run(){ if [ "$DRY" = "1" ]; then echo " [dry-run] $*"; else eval "$*"; fi; }
+
+say "Target: $PRODUCT_ID on $SHOP (api $API) | mode: $([ "$DRY" = 1 ] && echo DRY-RUN || echo LIVE)"
+
+say "0) Current state"
+curl -s "${H_TOK[@]}" "$BASE/products/$PRODUCT_ID.json" \
+ | python3 -c 'import json,sys;p=json.load(sys.stdin)["product"];print(" images:",[(i["id"],i["src"].split("/")[-1]) for i in p["images"]]);print(" tags :",p["tags"])'
+
+say "1) Add real BA469 image (Shopify pulls from src)"
+run "curl -s -X POST \"$BASE/products/$PRODUCT_ID/images.json\" ${H_TOK[*]} ${H_JSON[*]} \
+ -d '{\"image\":{\"src\":\"$NEW_IMAGE_SRC\",\"position\":1,\"alt\":\"$NEW_IMAGE_ALT\"}}' \
+ | python3 -c 'import json,sys;i=json.load(sys.stdin).get(\"image\",{});print(\" added image id\",i.get(\"id\"),i.get(\"src\"))'"
+
+say "2) Delete the oil-filter image ($OIL_FILTER_IMAGE_ID)"
+run "curl -s -X DELETE \"$BASE/products/$PRODUCT_ID/images/$OIL_FILTER_IMAGE_ID.json\" ${H_TOK[*]} -o /dev/null -w ' delete HTTP %{http_code}\n'"
+
+say "3) Strip wrong tags (${TAGS_TO_REMOVE[*]}) — reads LIVE tags first, removes only these"
+CUR_TAGS="$(curl -s "${H_TOK[@]}" "$BASE/products/$PRODUCT_ID.json" | python3 -c 'import json,sys;print(json.load(sys.stdin)["product"]["tags"])')"
+NEW_TAGS="$(python3 - "$CUR_TAGS" <<'PY'
+import sys
+cur=[t.strip() for t in sys.argv[1].split(",") if t.strip()]
+drop={"red","needs-image"}
+print(", ".join(t for t in cur if t.lower() not in drop))
+PY
+)"
+echo " before: $CUR_TAGS"
+echo " after : $NEW_TAGS"
+run "curl -s -X PUT \"$BASE/products/$PRODUCT_ID.json\" ${H_TOK[*]} ${H_JSON[*]} \
+ -d \"\$(python3 -c 'import json,sys;print(json.dumps({\"product\":{\"id\":int(\"$PRODUCT_ID\"),\"tags\":sys.argv[1]}}))' \"\$NEW_TAGS\")\" \
+ -o /dev/null -w ' tag update HTTP %{http_code}\n'"
+
+say "4) Verify"
+[ "$DRY" = "0" ] && curl -s "${H_TOK[@]}" "$BASE/products/$PRODUCT_ID.json" \
+ | python3 -c 'import json,sys;p=json.load(sys.stdin)["product"];print(" images:",[i["src"].split("/")[-1] for i in p["images"]]);print(" tags :",p["tags"])' \
+ || echo " (dry-run: skipped verify)"
+
+say "Done ($([ "$DRY" = 1 ] && echo 'DRY-RUN — re-run with CONFIRM=1 to apply' || echo 'LIVE applied'))."
+# ── HI-RES note ──────────────────────────────────────────────────────────────
+# The interiordecorating.com asset is only 200x250. For a luxury PDP, source the
+# full-res BA469 from Washington Wallcoverings directly (EXIF shows a 3278x4097
+# Canon original), upload via the images endpoint as a base64 "attachment", and
+# skip the src-pull above. If you'd rather keep Needs-Image until hi-res lands,
+# remove "Needs-Image" from TAGS_TO_REMOVE.
← 3b51069d pending-approval: draft live Coastal Mist oil-filter image f
·
back to Designer Wallcoverings
·
Coastal Mist: full-res 960x1200 BA469 image + our-info alt t 97c99a3d →