Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
bb0a80a · 2026-09-24 · backfill-rwltd-mfr: namespace-scoped idempotency + HTTP status check & retry
Two live-Shopify-path fixes on the 1,195-row backfill: (1) liveHasMfr now matches
the EXACT target metafield custom.manufacturer_sku (namespace + key), not any
namespace with that key — a same-keyed metafield elsewhere could previously mask a
genuinely-missing custom one and get counted "already had"; (2) added a fetchRetry
wrapper (429/5xx backoff, 6 tries) and res.ok checks in gql() and liveHasMfr(), so
a transient throttle no longer kills the batch mid-run or makes liveHasMfr return
false on an error body (which would trigger a needless write). Re-runs resume
safely via the live idempotency read.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
97382b2 · 2026-09-04 · TK-11256: fix Reid Witlin/Architectural Fabrics onboarder dropping description on the floor
Root cause of dw-five-field-canary cadence-regression FAIL (1005 recent products,
2026-09-03 batch): build_batch2.py never SELECTed rwltd_catalog.description/
ai_description and never emitted a description field in the CSV; create2.py never
sent descriptionHtml to Shopify at all. Also: activate_batch.py had no
description-present gate before flipping DRAFT->ACTIVE, unlike every other DW
onboarder's go-live.mjs (which holds as draft on empty descriptionHtml).
Fixes (code-only, no data/Shopify writes fired):
- build_batch2.py: SELECT description, ai_description in both pool queries; rec_common()
now emits description (description || ai_description, may still be empty if the
scraper never captured either -- separate data gap, not this bug).
- create2.py: sends descriptionHtml when row['description'] is non-empty.
- activate_batch.py: holds any product with empty descriptionHtml as DRAFT (writes
held-no-description.json) instead of activating it -- protects future runs against
repeating this regression.
Note: the single-Sample-variant/quote-only shape is NOT a bug -- Steve explicitly
approved activating this batch in that shape (git a5b4a18), matching the precedent of
190 prior same-shape ACTIVE Reid Witlin products. Not touched.
Already-live 1,005 products still missing descriptions is a Shopify write -- gated,
see pending-approval memo.
ef19926 · 2026-09-03 · Reid Witlin/Architectural Fabrics: rename titles to Pattern/Town - Colorway Fabric
Steve approved live: title format "{Pattern-or-Town} - {Colorway} Fabric"
(e.g. "Ashburn Cassis" -> "Ashburn - Cassis Fabric"). Rebuilt titles from
structured catalog data (pattern_name/virginia_town + mfr_sku-derived
colorway) rather than string-splitting rendered titles, with a casing
fix for ALL-CAPS raw vendor pattern names (e.g. "A ZILLION RUBS" ->
"A Zillion Rubs"). Scoped to ACTIVE products only (live status-checked
per row) -- 16 archived/discontinued rows correctly skipped.
Dry-run verified clean, live run: 1179 renamed, 16 skipped (not active),
0 errors.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
83290a6 · 2026-09-03 · Reid Witlin/Architectural Fabrics: publish to 12 sales channels
Steve approved live: "post to all 13 channels". Excluded "Fabricut" as
a documented vendor-dedicated channel (TK-10762: published via its own
full-pattern daily poster, never the shared rotation) -- publishing a
different vendor's line there would be a mismatch, flagged to Steve.
Two-step publish: first the 5 channels matching the existing 190 live
products' pattern (Online Store, POS, Buy Button, FB&IG, Houzz), then
the remaining 7 (Google&YouTube, Pinterest, Rakuten, Shop, Inbox,
TikTok, DWAutoPostBlog). Idempotent per-product missing-channel diff.
Verified: 1005/1005 confirmed on exactly 12 channels each, 0 errors.
Inventory: confirmed with Steve these are correctly untracked
(inventoryItem.tracked=false) -- always-purchasable by design, no
change needed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
a5b4a18 · 2026-09-03 · Reid Witlin/Architectural Fabrics: activate all 1,005 DRAFT products live
Steve approved live in conversation 2026-09-03: "make them active with
our pl - architectural fabrics line". These are quote-only, single-
Sample-variant products (same shape as the original 190 already-ACTIVE
products), structurally excluded from the automatic rotation-activator
cadence (SKU matches SAMPLE_SKU_REGEX -(sample|s)$), so this was a
direct one-time scripted activation, not a cadence fix.
Fetched the live DRAFT set fresh via GraphQL (1,005, matching post
codex overnight race-twin cleanup) rather than any local file.
DRY_RUN verified clean, live run: 1005/1005 activated, 0 errors.
Independently re-verified via GraphQL nodes() against the exact set:
all 1005 confirmed ACTIVE.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
8d6bbce · 2026-09-02 · Reid Witlin v2 batch: execute Steve-approved 1,005-item onboarding
Live create complete: rwltd_catalog live-pid count 190 -> 1193 (1003
net new DRAFT products across Pool A reconfirmed-old + Pool B new-gap).
Verified 0 duplicate mfr_sku products despite a concurrent-write
overlap with a sibling agent's process during the run -- Shopify's
productSet upsert-by-handle safely merged the races.
2 residual handle-collision failures (DWKR-190830, DWKR-190420) from a
pre-existing vendor-data town-mislabeling issue, non-urgent fix-later.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
6f25029 · 2026-09-02 · Reid Witlin v2 batch: corrected onboarding scope post re-scrape
build_batch2.py + create2.py supersede the quarantined 2026-07-30 plan
(stale DWDQ prefix, 1071-row catalog). Two verified pools reconfirmed
live by the 2026-09-01 re-scrape, neither overlapping the 190 already-
live products:
- Pool A (623 ready / 779 total): original Feb-2026 full-detail rows,
already carry a minted DWKR-19xxxx dw_sku, reused as-is.
- Pool B (382 ready): brand-new colorways from the re-scrape, minted
DWKR-191394..191775 continuing the live band.
DRY_RUN verified clean (1005 would-create, 0 errors). No Shopify or
DB writes fired. Live create stays Steve-gated.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>