[object Object]

← 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

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 →