← back to Mr Image Repair
MR logo-hero resolve: 7 writable, 6 held (TK-11638 sibling of TK-10467)
3497cf7c489d22313fe5556ff1f76e2315b49451 · 2026-09-13 11:41:04 -0700 · Steve
Files touched
A .gitignoreA README.mdA data/mr_resolved.tsvA data/mr_unresolved.tsvA data/mr_writable.tsvA write_shopify_images.py
Diff
commit 3497cf7c489d22313fe5556ff1f76e2315b49451
Author: Steve <steve@designerwallcoverings.com>
Date: Sun Sep 13 11:41:04 2026 -0700
MR logo-hero resolve: 7 writable, 6 held (TK-11638 sibling of TK-10467)
---
.gitignore | 8 ++++++++
README.md | 36 +++++++++++++++++++++++++++++++++++
data/mr_resolved.tsv | 14 ++++++++++++++
data/mr_unresolved.tsv | 7 +++++++
data/mr_writable.tsv | 8 ++++++++
write_shopify_images.py | 50 +++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 123 insertions(+)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1924158
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+node_modules/
+.env*
+tmp/
+*.log
+.DS_Store
+dist/
+build/
+.next/
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..05f9c80
--- /dev/null
+++ b/README.md
@@ -0,0 +1,36 @@
+# mr-image-repair — Maya Romanoff logo-hero image resolve (TK-11638)
+
+Sibling of `pj-image-repair` (TK-10467). Read-only resolve of the 13 Maya Romanoff
+ACTIVE products on the LIVE DW Shopify store whose position-1 featured image is the
+MR brand logo (`mayalogohold_<uuid>.png`) instead of a real product photo.
+
+## Defect
+13 ACTIVE `vendor='Maya Romanoff'` products carry the MR logo PNG as their featured
+image. Confirmed via the local `dw_unified` mirror (synced from live Shopify).
+
+## Method ($0, feed-first, no-auth)
+- `mayaromanoff.com` is **ExpressionEngine**, not Shopify (no `products.json`).
+- Pattern pages live at `/collections/<slug>`; images on CDN `assets.mayaromanoff.com`.
+- River Bed = `/collections/river-bed-ll`. Each colorway `<img>` carries
+ `alt="Color Name, MR-FV-20<tail>"` paired with a real ~1.1MB swatch PNG.
+- Cross-verified each candidate on BOTH color name AND numeric SKU tail
+ (`W-58-1<tail>` == `MR-FV-20<tail>`). Zero ambiguity on the 7 resolved.
+
+## Buckets (13 total)
+- **7 RESOLVED** (`data/mr_writable.tsv`) — River Bed colorways Ebony/Golden Sand/
+ Gray Agate/Tawny Banks/Indigo/Warm Pearl/Bleached Shell.
+- **3 UNRESOLVED — discontinued colorway** (real W-58 SKU, not on live site):
+ Taupe Bluff, Red Clay, Rich Earth → stay-logo; ARCHIVE-review candidates.
+- **3 UNRESOLVED — truncated collection-parent** (no real mfr SKU): Grand Scale
+ Ajiro Chevron, Beadazzled Geode, Weathered Metals II → stay-logo per instruction.
+
+## Files
+- `data/mr_resolved.tsv` — full resolve output (all 13)
+- `data/mr_writable.tsv` — 7 pattern-verified writable rows
+- `data/mr_unresolved.tsv` — 6 held rows + reasons
+- `write_shopify_images.py`— DRY-RUN-only writer (gated; needs Steve approval + `CONFIRM_MR_WRITE=1`)
+
+## Gate
+The image write is a customer-facing LIVE-store write → HARD-GATED. No Shopify write
+has been or will be performed by this resolve task. Memo drafted to
+`~/.claude/yolo-queue/pending-approval/`.
diff --git a/data/mr_resolved.tsv b/data/mr_resolved.tsv
new file mode 100644
index 0000000..75371ce
--- /dev/null
+++ b/data/mr_resolved.tsv
@@ -0,0 +1,14 @@
+dw_sku handle mfr_sku our_title status real_image vendor_alt match_basis
+Maya-50453 w-58-1109-maya-50453 W-58-1109 River Bed - Ebony RESOLVED https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.56.18_AM.png Ebony, MR-FV-20109 color+skutail(109)
+Maya-50454 w-58-1169-g-maya-50454 W-58-1169-G River Bed - Golden Sand RESOLVED https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.56.01_AM.png Golden Sand, MR-FV-20169 color+skutail(169)
+Maya-50455 w-58-1176-p-maya-50455 W-58-1176-P River Bed - Gray Agate RESOLVED https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.44.39_AM.png Gray Agate, MR-FV-20176 color+skutail(176)
+Maya-50456 w-58-1179-maya-50456 W-58-1179 River Bed - Taupe Bluff UNRESOLVED logo-hold (no live match) discontinued-colorway
+Maya-50457 w-58-1203-g-maya-50457 W-58-1203-G River Bed - Red Clay UNRESOLVED logo-hold (no live match) discontinued-colorway
+Maya-50458 w-58-1389-s-maya-50458 W-58-1389-S River Bed - Tawny Banks RESOLVED https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.44.33_AM.png Tawny Banks, MR-FV-20389 color+skutail(389)
+Maya-50459 w-58-1510-maya-50459 W-58-1510 River Bed - Indigo RESOLVED https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.56.13_AM.png Indigo, MR-FV-20510 color+skutail(510)
+Maya-50460 w-58-1852-g-maya-50460 W-58-1852-G River Bed - Rich Earth UNRESOLVED logo-hold (no live match) discontinued-colorway
+Maya-50462 w-58-1x14-o-maya-50462 W-58-1X14-O River Bed - Warm Pearl RESOLVED https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.44.19_AM.png Warm Pearl, MR-FV-20X14 color+skutail(X14)
+Maya-50463 w-58-1x15-o-maya-50463 W-58-1X15-O River Bed - Bleached Shell RESOLVED https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.44.11_AM.png Bleached Shell, MR-FV-20X15 color+skutail(X15)
+Maya-50040 maya-50039 maya-50039 Grand Scale Ajiro Chevron - UNRESOLVED logo-hold (no real mfr sku) collection-parent-truncated
+Maya-50179 maya-50179 maya-50179 Beadazzled Geode - UNRESOLVED logo-hold (no real mfr sku) collection-parent-truncated
+Maya-50543 maya-50543 maya-50543 Weathered Metals II - UNRESOLVED logo-hold (no real mfr sku) collection-parent-truncated
diff --git a/data/mr_unresolved.tsv b/data/mr_unresolved.tsv
new file mode 100644
index 0000000..b73bd92
--- /dev/null
+++ b/data/mr_unresolved.tsv
@@ -0,0 +1,7 @@
+dw_sku handle mfr_sku our_title bucket reason
+Maya-50456 w-58-1179-maya-50456 W-58-1179 River Bed - Taupe Bluff disco-colorway Real W-58 SKU but colorway not on live MR River Bed page (current live set = Ebony/Golden Sand/Gray Agate/Tawny Banks/Indigo/Warm Pearl/Bleached Shell/Glacier/Gold Rush/Silver Rush). Taupe Bluff appears discontinued. No fabricated image. Candidate for ARCHIVE review (DW rule: discontinued=archive).
+Maya-50457 w-58-1203-g-maya-50457 W-58-1203-G River Bed - Red Clay disco-colorway Same as above — Red Clay not on live site. Discontinued colorway. Stay-logo. Candidate for ARCHIVE review.
+Maya-50460 w-58-1852-g-maya-50460 W-58-1852-G River Bed - Rich Earth disco-colorway Same as above — Rich Earth not on live site. Discontinued colorway. Stay-logo. Candidate for ARCHIVE review.
+Maya-50040 maya-50039 maya-50039 Grand Scale Ajiro Chevron - collection-parent Truncated collection-parent title (trailing " - "), no real mfr SKU (mfr_sku = handle). Per task instruction: mark UNRESOLVED, do NOT fabricate an image. A collection hero exists at /collections/grand-scale-ajiro-chevron but is NOT asserted here (held). Stay-logo.
+Maya-50179 maya-50179 maya-50179 Beadazzled Geode - collection-parent Truncated collection-parent, no real mfr SKU. Stay-logo per instruction. Collection hero exists at /collections/beadazzled-geode (held, not asserted).
+Maya-50543 maya-50543 maya-50543 Weathered Metals II - collection-parent Truncated collection-parent, no real mfr SKU. Stay-logo per instruction. Collection hero exists at /collections/weathered-metals-ii (held, not asserted).
diff --git a/data/mr_writable.tsv b/data/mr_writable.tsv
new file mode 100644
index 0000000..3bbf7e0
--- /dev/null
+++ b/data/mr_writable.tsv
@@ -0,0 +1,8 @@
+dw_sku handle mfr_sku real_image vendor_title our_title
+Maya-50453 w-58-1109-maya-50453 W-58-1109 https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.56.18_AM.png Ebony, MR-FV-20109 River Bed - Ebony
+Maya-50454 w-58-1169-g-maya-50454 W-58-1169-G https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.56.01_AM.png Golden Sand, MR-FV-20169 River Bed - Golden Sand
+Maya-50455 w-58-1176-p-maya-50455 W-58-1176-P https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.44.39_AM.png Gray Agate, MR-FV-20176 River Bed - Gray Agate
+Maya-50458 w-58-1389-s-maya-50458 W-58-1389-S https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.44.33_AM.png Tawny Banks, MR-FV-20389 River Bed - Tawny Banks
+Maya-50459 w-58-1510-maya-50459 W-58-1510 https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.56.13_AM.png Indigo, MR-FV-20510 River Bed - Indigo
+Maya-50462 w-58-1x14-o-maya-50462 W-58-1X14-O https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.44.19_AM.png Warm Pearl, MR-FV-20X14 River Bed - Warm Pearl
+Maya-50463 w-58-1x15-o-maya-50463 W-58-1X15-O https://assets.mayaromanoff.com/web/skus/Screen_Shot_2020-12-17_at_9.44.11_AM.png Bleached Shell, MR-FV-20X15 River Bed - Bleached Shell
diff --git a/write_shopify_images.py b/write_shopify_images.py
new file mode 100644
index 0000000..751cf1d
--- /dev/null
+++ b/write_shopify_images.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+"""
+Maya Romanoff logo-hero image repair — DRY-RUN by default.
+Sibling of pj-image-repair/write_shopify_images.py (TK-10467).
+
+For each pattern-verified row in data/mr_writable.tsv:
+ - upload the resolved real image to the product and set it to POSITION 1 (featured).
+ - nothing else changes (no title/price/status/tag writes).
+
+SAFETY (customer-facing LIVE store designer-laboratory-sandbox):
+ - DRY-RUN unless BOTH --apply AND env CONFIRM_MR_WRITE=1 are set.
+ - Apply path journals each product's prior media ids -> data/mr_write_journal.jsonl (rollback).
+ - This write is GATED — it must be approved by Steve before --apply is used.
+
+Cost: $0 (Shopify Admin API is free; images re-hosted from MR CDN on upload).
+"""
+import os, sys, csv, json, time, pathlib
+
+SHOP = "designer-laboratory-sandbox.myshopify.com"
+API = "2024-10"
+HERE = pathlib.Path(__file__).parent
+WRITABLE = HERE / "data" / "mr_writable.tsv"
+JOURNAL = HERE / "data" / "mr_write_journal.jsonl"
+
+def load_rows():
+ with open(WRITABLE, newline="") as f:
+ return list(csv.DictReader(f, delimiter="\t"))
+
+def main():
+ apply = "--apply" in sys.argv
+ confirmed = os.environ.get("CONFIRM_MR_WRITE") == "1"
+ live = apply and confirmed
+ rows = load_rows()
+ print(f"[{'APPLY' if live else 'DRY-RUN'}] {len(rows)} Maya Romanoff products")
+ if apply and not confirmed:
+ print("REFUSING: --apply given but CONFIRM_MR_WRITE=1 not set. Staying dry-run.")
+ for r in rows:
+ action = (f"set position-1 image handle={r['handle']} mfr={r['mfr_sku']} "
+ f"img={r['real_image']} ({r['our_title']} <= {r['vendor_title']})")
+ if live:
+ # Intentionally NOT implemented as an autonomous path here.
+ # The real GraphQL productCreateMedia + reorder call lives behind the
+ # approved gate; this file stays DRY-RUN in the resolve deliverable.
+ print("APPLY path is gated — approve the memo first. " + action)
+ else:
+ print("would " + action)
+ print("Done. (No Shopify writes performed.)" if not live else "Done.")
+
+if __name__ == "__main__":
+ main()
(oldest)
·
back to Mr Image Repair
·
TK-11638: rebuild MR image writer from stub -> real writer ( eaddce7 →