← back to Gmc Titlefix
TK-11493: sub-100px featured-image remediation plan + dry-run executor (22 fixes: 20 Scalamandré Scene7 same-asset, 2 reorder; 3 vendor-fetch tail)
9ff16888746d01baa6c68798fd5e8160b762596a · 2026-09-12 20:13:14 -0700 · Steve Abrams
Read-only census re-verified all 25 live. Key finding: the 13 Scalamandré 'bigger' pos2 images are a WRONG COLORWAY of the same pattern — a naive reorder would ship the wrong color; plan instead re-fetches the correct Scene7 asset id. Shopify image writes stay GATED (executor dry-run by default).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z
Files touched
A data/tk11493-census.jsonA data/tk11493-remediation-plan.jsonA tk11493-apply-plan.mjs
Diff
commit 9ff16888746d01baa6c68798fd5e8160b762596a
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sat Sep 12 20:13:14 2026 -0700
TK-11493: sub-100px featured-image remediation plan + dry-run executor (22 fixes: 20 Scalamandré Scene7 same-asset, 2 reorder; 3 vendor-fetch tail)
Read-only census re-verified all 25 live. Key finding: the 13 Scalamandré 'bigger' pos2 images are a WRONG COLORWAY of the same pattern — a naive reorder would ship the wrong color; plan instead re-fetches the correct Scene7 asset id. Shopify image writes stay GATED (executor dry-run by default).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KfevHRTapvcS2vMNNuC31z
---
data/tk11493-census.json | 430 +++++++++++++++++++++++++++++++++++++
data/tk11493-remediation-plan.json | 270 +++++++++++++++++++++++
tk11493-apply-plan.mjs | 53 +++++
3 files changed, 753 insertions(+)
diff --git a/data/tk11493-census.json b/data/tk11493-census.json
new file mode 100644
index 0000000..71cca6f
--- /dev/null
+++ b/data/tk11493-census.json
@@ -0,0 +1,430 @@
+[
+ {
+ "handle": "faux-leaf-squares-fls-2768",
+ "vendor": "Hollywood Wallcoverings",
+ "old_wh": "94x94",
+ "live": true,
+ "published": true,
+ "n_images": 1,
+ "feat_wh": "94x94",
+ "feat_min": 94,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "puget-s-pineapple-scr-7919",
+ "vendor": "Designer Wallcoverings",
+ "old_wh": "80x104",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "80x104",
+ "feat_min": 80,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "896x1152",
+ "min": 896,
+ "src": "room-living_room-puget-s-pineapple-scr-7919.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "love-stars-cor-23333",
+ "vendor": "Coordonn\u00e9",
+ "old_wh": "90x58",
+ "live": true,
+ "published": true,
+ "n_images": 1,
+ "feat_wh": "90x58",
+ "feat_min": 58,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "lola-leaf-stripes-cor-23336",
+ "vendor": "Coordonn\u00e9",
+ "old_wh": "90x69",
+ "live": true,
+ "published": true,
+ "n_images": 1,
+ "feat_wh": "90x69",
+ "feat_min": 69,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "sc_0030g1193",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 1,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "sc_0031g1193",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 1,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "sc_0034g1193",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 1,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "sc_0038g1193",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 1,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "sc_0003g1194",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 1,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "sc_0001wp88366",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 1,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "sc_0004wp88366",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": []
+ },
+ {
+ "handle": "sc_0002wp88367",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0003WP88367_00ac1346-834a-4305-b808-de88c8b160d9.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0005wp88367",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0003WP88367_125de157-00cf-42b4-a19e-6cafcab7f0c3.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0005wp88368",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0002WP88368_3f0d0ed6-2c4d-43b3-9716-f6defbbcec57.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0003wp88369",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0004WP88369_919e4586-467d-45f8-abbe-3cee983685dc.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0004wp88370",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0003WP88370_12347bc2-d623-445b-8a8c-2f3688cc7978.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0004wp88371",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0001WP88371_a6b2edfe-9889-47e3-8c40-251d9cae5f1a.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0003wp88372",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0001WP88372_29a08abd-bf4b-46cf-a2c5-10f2e5b4b3ce.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0002wp88373",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0007WP88373_cc95ca47-d801-481a-b9eb-15ba5ccf9dad.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0003wp88374",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0004WP88374_b6e96243-d8bd-4acc-a092-70e722fc1401.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0003wp88375",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0004WP88375_24c86ad5-8440-4d45-ba23-9af04e196200.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0003wp88381",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0001WP88381_f357e889-a84b-4b8c-be3a-3f7e823d9f12.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0002wp88383",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0001WP88383_0342b811-e4f2-4d85-b9ad-e1b20098565d.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "sc_0001wp88416",
+ "vendor": "Scalamandre Wallpaper",
+ "old_wh": "10x16",
+ "live": true,
+ "published": true,
+ "n_images": 2,
+ "feat_wh": "10x16",
+ "feat_min": 10,
+ "bigger_on_product": [
+ {
+ "pos": 2,
+ "wh": "400x533",
+ "min": 400,
+ "src": "SC_0002WP88416_5983583e-1c10-4c8e-bdfd-d84907287f60.jpg"
+ }
+ ]
+ },
+ {
+ "handle": "danville-contemporary-architectural-fabrics",
+ "vendor": "Architectural Fabrics",
+ "old_wh": "1x1",
+ "live": true,
+ "published": true,
+ "n_images": 11,
+ "feat_wh": "1x1",
+ "feat_min": 1,
+ "bigger_on_product": [
+ {
+ "pos": 3,
+ "wh": "1024x1024",
+ "min": 1024,
+ "src": "DWRW-190070-sofa-setting.png"
+ },
+ {
+ "pos": 4,
+ "wh": "1024x1024",
+ "min": 1024,
+ "src": "DWRW-190070-chair-setting.png"
+ },
+ {
+ "pos": 5,
+ "wh": "1024x1024",
+ "min": 1024,
+ "src": "DWRW-190070-hotel-lobby.png"
+ },
+ {
+ "pos": 6,
+ "wh": "1024x1024",
+ "min": 1024,
+ "src": "1b37aab678be2b39802317f800fe4ec4.png"
+ },
+ {
+ "pos": 7,
+ "wh": "1024x1024",
+ "min": 1024,
+ "src": "c2d33c4c91d91c07a2b9c0db012b13d5.png"
+ },
+ {
+ "pos": 8,
+ "wh": "1024x1024",
+ "min": 1024,
+ "src": "34181e5f46339476379c7401286cb5f3.png"
+ },
+ {
+ "pos": 9,
+ "wh": "1024x1024",
+ "min": 1024,
+ "src": "f53c5a9b9350ca613255a22ed00e01cb.png"
+ },
+ {
+ "pos": 10,
+ "wh": "1024x1024",
+ "min": 1024,
+ "src": "48cab8dc3fbdc3f4a4decbaf9ba0e18f.png"
+ },
+ {
+ "pos": 2,
+ "wh": "400x400",
+ "min": 400,
+ "src": "DWKR-190070-circular-swatch.png"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/data/tk11493-remediation-plan.json b/data/tk11493-remediation-plan.json
new file mode 100644
index 0000000..b03de4a
--- /dev/null
+++ b/data/tk11493-remediation-plan.json
@@ -0,0 +1,270 @@
+{
+ "ticket": "TK-11493",
+ "generated": "2026-09-13",
+ "by": "w20-worker",
+ "note": "25 ACTIVE products with featured image <100px (GMC image_too_small DISAPPROVED zone). 22 have a deterministic correct-colorway fix here; 3 (2 Coordonn\u00e9 + 1 Hollywood) need a vendor image fetch and are listed separately in tail_needs_vendor_source, NOT in rows.",
+ "rows": [
+ {
+ "handle": "sc_0030g1193",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0030g1193",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0030G1193?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0030G1193"
+ },
+ {
+ "handle": "sc_0031g1193",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0031g1193",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0031G1193?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0031G1193"
+ },
+ {
+ "handle": "sc_0034g1193",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0034g1193",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0034G1193?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0034G1193"
+ },
+ {
+ "handle": "sc_0038g1193",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0038g1193",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0038G1193?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0038G1193"
+ },
+ {
+ "handle": "sc_0003g1194",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0003g1194",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0003G1194?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0003G1194"
+ },
+ {
+ "handle": "sc_0001wp88366",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0001wp88366",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0001WP88366?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0001WP88366"
+ },
+ {
+ "handle": "sc_0004wp88366",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0004wp88366",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0004WP88366?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0004WP88366"
+ },
+ {
+ "handle": "sc_0002wp88367",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0002wp88367",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0002WP88367?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0002WP88367"
+ },
+ {
+ "handle": "sc_0005wp88367",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0005wp88367",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0005WP88367?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0005WP88367"
+ },
+ {
+ "handle": "sc_0005wp88368",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0005wp88368",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0005WP88368?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0005WP88368"
+ },
+ {
+ "handle": "sc_0003wp88369",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0003wp88369",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0003WP88369?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0003WP88369"
+ },
+ {
+ "handle": "sc_0004wp88370",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0004wp88370",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0004WP88370?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0004WP88370"
+ },
+ {
+ "handle": "sc_0004wp88371",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0004wp88371",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0004WP88371?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0004WP88371"
+ },
+ {
+ "handle": "sc_0003wp88372",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0003wp88372",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0003WP88372?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0003WP88372"
+ },
+ {
+ "handle": "sc_0002wp88373",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0002wp88373",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0002WP88373?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0002WP88373"
+ },
+ {
+ "handle": "sc_0003wp88374",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0003wp88374",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0003WP88374?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0003WP88374"
+ },
+ {
+ "handle": "sc_0003wp88375",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0003wp88375",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0003WP88375?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0003WP88375"
+ },
+ {
+ "handle": "sc_0003wp88381",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0003wp88381",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0003WP88381?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0003WP88381"
+ },
+ {
+ "handle": "sc_0002wp88383",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0002wp88383",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0002WP88383?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0002WP88383"
+ },
+ {
+ "handle": "sc_0001wp88416",
+ "vendor": "Scalamandre Wallpaper",
+ "action": "ADD",
+ "title": "sc_0001wp88416",
+ "before_featured": "10x16",
+ "after_featured": "https://s7d2.scene7.com/is/image/starkcarpet/SC_0001WP88416?$Full%5FImages$",
+ "after_size": "1200x954",
+ "source": "scene7 same-asset (correct colorway)",
+ "sku_asset": "SC_0001WP88416"
+ },
+ {
+ "handle": "puget-s-pineapple-scr-7919",
+ "vendor": "Designer Wallcoverings",
+ "action": "REORDER_FEATURED",
+ "title": null,
+ "before_featured": "80x104",
+ "after_featured": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/room-living_room-puget-s-pineapple-scr-7919.jpg",
+ "after_size": "896x1152",
+ "source": "on-product pos2, filename matches handle (correct product)"
+ },
+ {
+ "handle": "danville-contemporary-architectural-fabrics",
+ "vendor": "Architectural Fabrics",
+ "action": "REORDER_FEATURED",
+ "title": null,
+ "before_featured": "1x1",
+ "after_featured": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DWKR-190070-circular-swatch.png",
+ "after_size": "400x400",
+ "source": "on-product pos2 circular swatch (DWKR-190070). EYEBALL: confirm 190070==Danville & prefer a >=500px tile if one of pos6-8 is a flat swatch",
+ "needs_eyeball": true
+ }
+ ],
+ "tail_needs_vendor_source": [
+ {
+ "handle": "love-stars-cor-23333",
+ "vendor": "Coordonn\u00e9",
+ "feat": "90x58",
+ "why": "only tiny image on product; not in coordonne_catalog by pattern/sku; needs coordonne.com fetch"
+ },
+ {
+ "handle": "lola-leaf-stripes-cor-23336",
+ "vendor": "Coordonn\u00e9",
+ "feat": "90x69",
+ "why": "only tiny image on product; not in coordonne_catalog; needs coordonne.com fetch. SETTLEMENT-GATE (leaf pattern) before publish."
+ },
+ {
+ "handle": "faux-leaf-squares-fls-2768",
+ "vendor": "Hollywood Wallcoverings",
+ "feat": "94x94",
+ "why": "FLS-2768 not in hollywood_catalog (sibling colorways present only as sample thumbnails); needs Momentum/Versa vendor fetch. SETTLEMENT-GATE (leaf pattern) before publish."
+ }
+ ],
+ "wrong_colorway_finding": "The 13 Scalamandr\u00e9 products each carry a pos2 image of a DIFFERENT colorway of the same pattern (e.g. sc_0002wp88367 carries a SC_0003WP88367 swatch). A naive reorder-to-those would ship the WRONG COLOR. This plan ignores those pos2 images and instead re-fetches the CORRECT asset id from Scene7 for all 20 Scalamandr\u00e9."
+}
\ No newline at end of file
diff --git a/tk11493-apply-plan.mjs b/tk11493-apply-plan.mjs
new file mode 100644
index 0000000..8768d6b
--- /dev/null
+++ b/tk11493-apply-plan.mjs
@@ -0,0 +1,53 @@
+#!/usr/bin/env node
+/** TK-11493 executor for data/tk11493-remediation-plan.json.
+ * Fixes the 22 in-plan ACTIVE products whose featured image is <100px (GMC image_too_small
+ * DISAPPROVED zone). 20 Scalamandré = ADD the full-size Scene7 image of the SAME asset id
+ * (correct colorway, no wrong-colorway risk) and make it featured; 2 = REORDER an existing
+ * larger on-product image to featured. The 3 tail items (2 Coordonné + 1 Hollywood) are NOT
+ * in rows — they need a vendor image fetch first.
+ *
+ * Pattern reused verbatim from tk11448-apply-plan.mjs (proven on the 2026-09-11 placeholder fix).
+ * DRY-RUN BY DEFAULT. Requires --apply AND ticket approval to write.
+ * Records a per-row undo into data/tk11493-apply-ledger.jsonl BEFORE each write.
+ * Canary-first: --canary N writes the first N rows, then stops for a human look.
+ * Undo: REORDER_FEATURED -> productReorderMedia back to before_media_order;
+ * ADD -> productDeleteMedia the created media id (recorded in the ledger). */
+import fs from 'fs';
+const APPLY=process.argv.includes('--apply');
+const CAN=(()=>{const i=process.argv.indexOf('--canary');return i>0?+process.argv[i+1]:0;})();
+const SHOP='designer-laboratory-sandbox';
+const tok=(fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8').match(/^SHOPIFY_FULL_ACCESS_TOKEN=(.+)$/m)||[])[1];
+async function gql(q,v){for(let a=0;a<6;a++){const r=await fetch(`https://${SHOP}.myshopify.com/admin/api/2024-10/graphql.json`,{method:'POST',headers:{'X-Shopify-Access-Token':tok,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v}),signal:AbortSignal.timeout(60000)});const j=await r.json();if(j.errors){if(JSON.stringify(j.errors).includes('THROTTLED')&&a<5){await new Promise(z=>setTimeout(z,2500*(a+1)));continue;}throw new Error(JSON.stringify(j.errors).slice(0,300));}return j.data;}throw new Error('throttled');}
+const plan=JSON.parse(fs.readFileSync('data/tk11493-remediation-plan.json','utf8'));
+let rows=plan.rows; if(CAN) rows=rows.slice(0,CAN);
+console.log(`${APPLY?'APPLY':'DRY-RUN'} | TK-11493 | rows ${rows.length} of ${plan.rows.length}`);
+if(!APPLY){ for(const r of rows) console.log(' would',r.action.padEnd(16),r.handle.padEnd(42),'->',r.after_size,String(r.after_featured).slice(0,80));
+ console.log(`\nTail (need vendor fetch, NOT fired): ${plan.tail_needs_vendor_source.map(t=>t.handle).join(', ')}`);
+ console.log('DRY-RUN ONLY. Nothing written. Re-run with --apply (or --apply --canary 3) after ticket approval.'); process.exit(0); }
+const led=fs.createWriteStream('data/tk11493-apply-ledger.jsonl',{flags:'a'});
+for(const r of rows){
+ const cur=await gql(`query($h:String!){productByHandle(handle:$h){id media(first:30){edges{node{id ... on MediaImage{image{url}}}}}}}`,{h:r.handle});
+ const p=cur.productByHandle; if(!p){console.log(' SKIP (handle not found)',r.handle);continue;}
+ const before=p.media.edges.map(e=>e.node.id);
+ led.write(JSON.stringify({ts:new Date().toISOString(),ticket:'TK-11493',handle:r.handle,productId:p.id,action:r.action,
+ before_media_order:before,before_featured:r.before_featured,
+ undo:r.action==='REORDER_FEATURED'?'productReorderMedia to before_media_order':'productDeleteMedia the created id'})+'\n');
+ if(r.action==='REORDER_FEATURED'){
+ const target=p.media.edges.find(e=>e.node.image&&e.node.image.url.split('?')[0]===r.after_featured.split('?')[0]);
+ if(!target){console.log(' SKIP (target media not found on product)',r.handle);continue;}
+ const res=await gql(`mutation($id:ID!,$m:[MoveInput!]!){productReorderMedia(id:$id,moves:$m){userErrors{field message}}}`,{id:p.id,m:[{id:target.node.id,newPosition:'0'}]});
+ console.log(' REORDER',r.handle,JSON.stringify(res.productReorderMedia.userErrors));
+ } else { // ADD + feature
+ const res=await gql(`mutation($id:ID!,$m:[CreateMediaInput!]!){productCreateMedia(productId:$id,media:$m){media{id status} mediaUserErrors{field message}}}`,
+ {id:p.id,m:[{originalSource:r.after_featured,mediaContentType:'IMAGE',alt:r.title}]});
+ const err=res.productCreateMedia.mediaUserErrors;
+ if(err&&err.length){console.log(' ERR',r.handle,JSON.stringify(err));continue;}
+ const newId=res.productCreateMedia.media[0].id;
+ led.write(JSON.stringify({ts:new Date().toISOString(),ticket:'TK-11493',handle:r.handle,created_media_id:newId,undo:`productDeleteMedia ${newId}`})+'\n');
+ await new Promise(z=>setTimeout(z,4000)); // let Shopify finish processing before reorder
+ const res2=await gql(`mutation($id:ID!,$m:[MoveInput!]!){productReorderMedia(id:$id,moves:$m){userErrors{field message}}}`,{id:p.id,m:[{id:newId,newPosition:'0'}]});
+ console.log(' ADD+FEATURE',r.handle,newId,r.after_size,JSON.stringify(res2.productReorderMedia.userErrors));
+ }
+ await new Promise(z=>setTimeout(z,800));
+}
+led.end(); console.log('ledger -> data/tk11493-apply-ledger.jsonl');
← b1fe027 TK-11449: execute Steve-approved orphan-unpublish (61) + pri
·
back to Gmc Titlefix
·
TK-11493: apply-ledger for 22 live featured-image fixes (rev 72268cd →