Dw Yolo Loop

repo: ~/Projects/dw-yolo-loop · 277 commits · 2 in last 24h, 2 in last 7d · █

Search the build

277 commits indexed

  1. f0a9020 2026-09-26 TK-12333: remove Scalamandre from showroom-vendors (Steve 2026-09-26: Scalamandre is NOT a showroom line)
  2. 0efe7cc 2026-09-26 TK-11860: sync showroom-vendors snapshot to canonical fix-live-board@9bcd81c (+Jeffrey Stevens, Mind the Gap, Sandberg, Scalamandre)
  3. 4c10120 2026-09-10 deploy-vendor.sh: gate -internal hosts by default (TK-11391 root cause)
  4. 5b0f860 2026-09-10 Guard the vendor-microsite generator against showroom-only lines (TK-11200)
  5. 20ab7b0 2026-09-03 TK-11186: trending-tag-sync twin — guard showroom-only vendors out of Trending tag flow
  6. ea0eaee 2026-09-03 Google feed twin: hard-exclude showroom-only vendors via isShowroomVendor (TK-11186)
  7. 69ecd60 2026-09-01 refresh GMC leak guard heartbeat
  8. 1b1d813 2026-09-01 refresh GMC leak guard heartbeat
  9. bd5e681 2026-09-01 refresh GMC leak guard heartbeat
  10. 6108f5b 2026-09-01 fix(gmc-feed-guard): variant-based sample-leak classifier — kills 50,991 false positive, reports real ~457
  11. 7e33d8b 2026-09-01 gmc-feed-guard TK-10952: mirror crash artifact to skill dir, fix cron-fire-canary detection
  12. 1956af9 2026-09-01 TK-10952: gmc-feed-guard — add unhandledRejection handler for clean crash reporting
  13. 9270cd2 2026-09-01 TK-11055: lib/shopify.mjs prefer SHOPIFY_FULL_ACCESS_TOKEN for write_inventory scope
  14. 25ac473 2026-08-26 feat: read-only GMC full-leak-list exporter (TK-10862 session)
  15. 28e22d5 2026-08-25 gmc: staged GID-scoped exclude for the 9 true $4.25 leaks (Thibaut+DW), reversible (session close)
  16. 751727e 2026-08-25 feat: gmc-fentucci-exclude.js — scoped 462-Fentucci Google feed-exclude (dry-run + canary + restore-map; prevents the blunt-tool 49k mis-fire)
  17. 4f13dec 2026-08-20 carnegie landing: add required 'in collaboration with Designer Wallcoverings' About block (config-gated, additive)
  18. 0eba9c0 2026-08-20 carnegie landing: session-close snapshot
  19. ab7991d 2026-08-20 carnegie: add DW vendor-landing config block + line snapshot (5934 products)
  20. 05f0068 2026-08-11 chore: TK-10451 scope doc + version bump v0.1.1 (session close)
  21. 5795600 2026-08-10 gmc-feed-exclude: add --orphans-only (Bucket A / live-verified true orphans) for C-orphans (TK-10446)
  22. 86f28e8 2026-08-05 TK-10210: fix false no_roll_variant_price exclusion in dw-yolo-loop feed-eligibility
  23. 5df288c 2026-08-03 Romo close: batch ledger + price-correction ledger + audit artifacts
  24. 7e55c7b 2026-08-03 Romo pricing: fix double-tariff bug from authoritative trade portal
  25. 69ae2e6 2026-08-03 Romo REPRICE dry-run: 138 live-reconciled candidates (1 below-cost, 137 tariff-uplift)
  26. e6d0701 2026-08-03 Romo ADD canary: create script + 10 DRAFT products on live store (ledger)
  27. 671aec7 2026-08-03 Romo landing: 578-product snapshot + lexicon attribution (color/style/motif facets)
  28. 0510e2b 2026-06-18 cycle 92: officer vp-dw-commerce CONFIRMED + reorder/guardrails folded in (P1 free-checkout leads not polish; RL interim=UNPUBLISH-only not DENY+qty0; 33-roll deletion + Cole&Son SPLIT via self-healing builder + ROLL-unit MAP; JSON-LD/dup-titles promoted to P2 feed-integrity; re-activation readiness rules: inventory=2026 both variants + no-active-without-image+width)
  29. e22241f 2026-06-18 cycle 92: CONSOLIDATION DIGEST (DTD unanimous E1) — 63 findings -> one prioritized executable-vs-blocked remediation plan. Quick wins (~48 products: 5 Versace preamble + 2 no-image + 8 draft-zero + 33 select-to-free roll); P1 RL 111 (stop-checkout-now, reprice blocked on DG cost); P2 455 roll-mislabels (Cole&Son+Kravet MAP-safe, O&L relabel-only) + 238 inverse; P3 hygiene; 2 guards+watchdog await install; clean bills mapped. Bottleneck=ACTION not discovery
  30. cdf1e93 2026-06-18 cycle 91: officer vp-dw-marketing CONFIRMED + framing tightened (5 scoped to leading-English here-is class, not fleet-wide; body-copy wallpaper = separate proper-noun-safe debt vs titles=0; memory update REQUIRED + AT10701 flag; negative-control clean scoped to preamble class); 2 follow-ons queued
  31. 4aa2eb1 2026-06-18 cycle 91: AI-preamble leak sweep (DTD unanimous A) — 5 genuine leaks ALL Versace, confirmed by 2 methods (HIGH-pattern + body-START classifier both=5) w/ broad-net guard (58 here-is hits, 53 legit mid-copy); Wallpaper TITLE blast-radius=0 (titles normalized, independent productsCount) + ~9486 any-field mostly legit vendor-names; BOTH better than stale banned-word memory (25131+68); disposition=surgical fix 5 Versace descriptions P3 (not bulk rewrite), titles need nothing, update stale memory
  32. 7a63e67 2026-06-18 cycle 90: officer vp-dw-commerce CONFIRMED (boundary-case sound, self-correction honest, (b)=0) + 2 net-new watch items carried forward (variant-level oversold census; POD-vendor liveness check)
  33. 90deca5 2026-06-18 cycle 90: CONTINUE-masked segmentation (DTD unanimous A) — c89 (b) defect population = ZERO. Full active scan 71,717 -> 97.49% real-stock + 2.51% untracked POD + 0 true CONTINUE-oversold-at-empty + 0 blocked. SELF-CORRECTION: v1 conflated untracked-inventory (null qty) with oversold -> contaminated 831; own sanity counter (457 impossible DENY-buyable-at-0) caught it; v2 added inventoryItem.tracked -> true defect=0. Resolves c89 73.9%-CONTINUE worry (oversell layered on real stock, not masking empty). Buyability thread fully closed. Residuals: image-correctness, full-404, merch-depth, title/feed hygiene
  34. 232ce74 2026-06-18 cycle 89: consistency fix — decode header reframed (census=proof, probe=flag-honesty audit)
  35. fbd6449 2026-06-18 cycle 89: officer vp-dw-commerce CONFIRMED + narration sharpened (100% is a full CENSUS not a 4% probe-inference; 21% drift = TWO populations real-stock vs CONTINUE-masked; 73.9% CONTINUE oversell promoted to a named fulfillment/lead-time residual; clean bill scoped to buyability not a fleet all-clear)
  36. 6ddb941 2026-06-18 cycle 89: buyability audit (DTD unanimous B) — full active scan 71,719 -> 0 active-but-unbuyable (100% have >=1 purchasable variant); verified by MECHANISM not just the flag (3k-product probe: 73.9% CONTINUE oversell + 26.1% DENY-but-all-qty>0, 0 DENY+empty=the only blocking state); inventory=2026 conv ~79% followed (85.6% multi-var both), ~21% drift BENIGN (still buyable, not a defect); CLEAN BILL no fix; residuals named (cart-to-checkout, price-zero separate canary, image-correctness, full-404, merch-depth)
  37. e2240da 2026-06-18 cycle 88: consistency fix — closing line reflects draft-flip-first disposition
  38. 220c3b9 2026-06-18 cycle 88: officer vp-dw-commerce CONFIRMED + 4 refinements folded in (2-product fix = rule-mandated draft-flip+Needs-Image not discretionary add-image; don't mass-flag 63.9% single-image; image-CORRECTNESS higher-severity residual; full-404 pass = next image cycle)
  39. f38603d 2026-06-18 cycle 88: image-integrity sweep (DTD unanimous B) — full active scan 71,720 -> only 2 no-image products (China Seas + Tres Tintas, active+orderable = genuine P2 defects); neg-control 100% with-images (2 are true anomalies); bounded 39-URL 404 spot-check 0 broken (no CDN-rot epidemic, sample-limited); near-clean bill; secondary: 63.9% single-image PDPs = soft merchandising signal NOT a defect; residuals named (full 404, image quality, merchandising-depth, inventory=2026)
  40. 4ca0d91 2026-06-18 cycle 87: officer vp-dw-marketing CONFIRMED + scope tightenings folded in (closure=PUBLISHED+storefront-reachable not nav-admin-audited since menus ACCESS_DENIED; reachable!=merchandised qualifier on headline; next cycle=merchandising-depth gated on cracking Boost facet param)
  41. ea09611 2026-06-18 cycle 87: nav-link reachability (DTD unanimous A) — storefront runs Boost PFS; /collections/all Shop-All = full 72,453 catalog (infinite scroll, linked) + Boost search returns subsets (grasscloth 7715) -> NO dark-by-nav inventory, discoverability independent of per-collection nav links; c86 membership!=discoverable RESOLVED, 127k catch-all moot for reachability; honest limits (API facet-subset not confirmed; merchandising-depth unmeasured); closes collections/nav dark-inventory thread (April archive = only real vector)
  42. 7a5788f 2026-06-18 cycle 86: consistency fix — closing line reflects Flag A upgrade to P3
  43. c11af4e 2026-06-18 cycle 86: officer vp-dw-marketing CONFIRMED + refinements folded in (Flag A P4->P3 route to merchandising: catch-all mislabels 127k as Best Seller in feeds + 0-orphan rests on it; nav-link reachability queued as next collection cycle; soften 'collection-rich')
  44. f4ac7a9 2026-06-18 cycle 86: collection-membership integrity sweep (DTD 2/1 B) — full active scan 71,726 -> 0 true orphans, 100% in >=1 collection, 88% in 11+; NEG-CONTROL (bulk collection-rich) + publication probe both close caveats (12 single-collection products are in best-seller-internal-use which IS published to all 13 channels = reachable, not browse-dark); CLEAN BILL ruling out dark-by-orphaning fleet-wide; 2 minor non-defect flags (127k catch-all misnamed 'internal use' yet published P4; 8 Torre dups -> fleet-dedup P3); residuals named (image integrity, inventory=2026, nav-link)
  45. 99fbc92 2026-06-18 cycle 85: officer vp-dw-commerce CONFIRMED + 2 non-blocking softens folded in (thin-PDP subset don't auto-SPLIT; Steve decides relabel-vs-unpublish verb)
  46. b153437 2026-06-18 cycle 85: DISAMBIGUATE c84 238 inverse-mislabels (DTD unanimous A) — full active scan 0/238 in showroom collection + 0/238 have custom.showroom_line; NEG-CONTROL proves 100% of 600 deliberate Showroom-Lines carry the metafield (0% tag-only) -> signal validated, 'untagged Showroom batch' hypothesis REFUTED; genuine mislabels not tag; fix=relabel/unpublish (all 238) + SPLIT where cost exists (~74 DW private-label + Lee Jofa; PR 139 SPLIT-blocked no price sheet); 5 unit-named outliers hand-review
  47. b112a34 2026-06-18 cycle 84: consistency fix — closing line reflects re-scoped fix (title-promise triage, not blanket SPLIT)
  48. a7b5af4 2026-06-18 cycle 84: officer CONFIRMED finding + RE-SCOPED fix — not blanket SPLIT; per-product title-promise triage (tag-as-Showroom vs SPLIT); 233 core + 5 outliers; SPLIT gated on real cost (unexecutable for PR — no price sheet); likely-untagged-Showroom batch
  49. 0a3f9a7 2026-06-18 cycle 84: inverse-mislabel sweep — 238 active single-variant priced $5 titled as the FULL product (not 'Sample', not showroom-tagged, 233/238 Default Title) = the residual the Sample-sweeps missed; P2 storefront title-mismatch (shopper buys $5 'grasscloth' gets a swatch); heavily Phillipe Romano 129 + DW private-label; SPLIT-fix family; negative control held (26652 Sample-titled + 2768 showroom excluded)
  50. 7c6b2ee 2026-06-18 cycle 83: consistency fix — body header + closing line retract 'TRULY CLOSED' to 'signature decoded; residuals named'
  51. acdcf48 2026-06-18 cycle 83: officer FLAG — retract 'TRULY CLOSED' -> single-variant-Sample signature decoded (active+draft+archived-roll=0/18k); Fentucci NW 38 directly verified (single-variant $5 Wallcovering, sample-only); archived 0 roll-scale (restore-safe); heuristic corrected to structural-not-magnitude; multi-variant + non-Sample-titled residuals named
  52. fc29b74 2026-06-18 cycle 83: decode +221 DRAFT abnormal-samples — all SAMPLE-scale, off-storefront, 0 roll-mislabels (Thibaut 183 DWTF disco-line sample side $3.50-9.95 + Fentucci Naturals Walls 38 flat $5); c82 magnitude-gated heuristic load-bearing again; c68 scope TRULY CLOSED active+draft (~753); only customer-facing harm = 455 active roll-mislabels
  53. ed6f413 2026-06-18 cycle 82: consistency fix — closing line + rec reflect ACTIVE-decoded-5/5 (not fully closed; +221 draft) + sample-only-no-roll gap + Fentucci sunset check
  54. 749f3e3 2026-06-18 cycle 82: officer CONFIRMED benign-Fentucci + corrected 'scope CLOSED 5/5' -> ACTIVE-decoded-5/5 (verified draft sweep found +221 draft abnormal: Thibaut 183 + Fentucci Naturals Walls 38); + sample-only-no-roll separate gap, $5-vs-$4.25 Steve decision, lifecycle-sunset check
  55. 0010198 2026-06-18 cycle 82: Fentucci 21 decode (reused c81 decoder) — benign flat-$5 sample $0.75 above the $4.25 house standard (2026-recent, private-label, not Kravet-MAP, not roll-mislabel, not disco); decoder flat=disco heuristic mis-fired (corrected: flat must be roll-scale); c68 abnormal-sample scope CLOSED 5/5 (532=455 roll-mislabel+56 disco+21 benign)
  56. dc3d62e 2026-06-18 cycle 81: officer CONFIRMED — lifecycle/basis/disposition sound + 4 refinements (unrecovered-trade-cost not no-obligation; relabel doesnt legitimize price; UoM+self-heal guardrails; O&L lower-priority than verified-MAP sets); c68 scope 4/5 done
  57. 46b7a60 2026-06-18 cycle 81: O&L basis decode — 90 = CURRENT-live RRP-basis mislabel (955 active, 2020 import, 21-distinct prices $76-962, barcode=None, 0 in kravet_authoritative_pricing/product_map, 0pct costed); NOT Kravet-MAP, NOT disco; SPLIT-fix bucket; completes c68 scope 4/5 (Fentucci 21 remnant)
  58. 188b25f 2026-06-18 cycle 80: officer CONFIRMED + post-seed run VERIFIED HEALTHY (153 acknowledged, 0 NEW) — asserted->verified gap closed; c78 installable-now; +temporary-shim & status-key-noise notes; summary table updated
  59. fc4d261 2026-06-18 cycle 80: runbook §3 updated — c78 now INSTALLABLE-NOW (ack-baseline coded+seeded); §1 copies ack-baseline.json; re-baseline-to-0-after-reprice steps + SELFTEST/ACK_SEED modes
  60. 479ecde 2026-06-18 cycle 80: c78 set-difference acknowledged-baseline (c78/c79 officer design) — keyed handle#position#status (draft->active escalation fires); ACK_SEED + SELFTEST modes; seeded 153 tuples (145 active+8 draft); SELFTEST PASS (NEW fires, acknowledged quiet, escalation fires) -> c78 installable NOW (alerts only on NEW regression)
  61. 23c80c1 2026-06-18 cycle 79: officer REVISE — harden CNCP wrapper (node JSON.stringify body, smoke-tested http=200, log truncate-on-start) + runbook hbAbs watchdog entries + c78 INCONCLUSIVE-during-shrink nuance; chain+exit confirmed
  62. 2718958 2026-06-18 cycle 79: fix runbook promote-canary.sh invocation — add thin no-arg wrappers (run-sitemap-integrity.sh/run-zero-dollar.sh) since promote-canary runs $SCRIPT with no args + -f checks it; runbook schedules the bare wrappers
  63. c5b52c5 2026-06-18 cycle 79: catalog-integrity guard INSTALL RUNBOOK + CNCP-alert wrapper (run-canary-with-cncp.sh) — makes the c77+c78 guards installable via promote-canary.sh in one Steve-gated pass; c77 install-now, c78 after reprice/ack-baseline; PlistBuddy-validate per c56; nothing installed (gated)
  64. 4fdf1b1 2026-06-18 cycle 78: officer REVISE sign-off appended (3 false-clean blockers + 1 robustness item fixed + re-verified)
  65. 43256c6 2026-06-18 cycle 78: harden zero-dollar canary per officer REVISE — (1) inventoryQuantity in predicate (DENY+stock>0 false-clean hole), (2) variants first:100 + truncation observable, (3) coverage gate decoupled from RL to completeness-floor (survives the reprice), (4) token-guard; re-verified 145 active + 8 draft, gate PASS, 0 trunc
  66. fefd684 2026-06-18 cycle 78: BUILD zero-dollar-orderable canary (P1 free-checkout guard, c75 spec + c77 hardening) — active 145 (coverage gate RL=111 PASS) + NEW 8 DRAFT latent landmines (Arte 5/Romo/DW/Thibaut); abort-on-partial + coverage-gate + status-agnostic; exit 3 ALERT
  67. 423d741 2026-06-18 cycle 77: officer REVISE sign-off appended (6 hardening items fixed + re-verified)
  68. 213fd60 2026-06-18 cycle 77: harden canary per officer REVISE — abort-on-partial-crawl, confirm-before-page (re-run), freshness re-based to >72h stale-guard, upward-only baseline ratchet, fileURLToPath, data/latest.json heartbeat; re-verified healthy + crater-through-confirm-rerun
  69. 5427ff2 2026-06-18 cycle 77: BUILD sitemap-integrity canary (April-mass-archive early-warning) — baseline 72462 product URLs/29 children; asserts index+children 200 + count-crater vs baseline (>10pct) + regen-stall (>24h); HEALTHY now, negative-control fires on 63.8pct crater
  70. bb81aed 2026-06-17 cycle 76: officer CONFIRMED (reproduced live) — de-escalation sound; folded in GSC-request-indexing lever for fixed SKUs + narrow count-crater/200/stale canary carve-out (April-archive failure mode) + en-ca duplicate-sitemap tie to c65
  71. 3bedc51 2026-06-17 cycle 76: sitemap-lastmod freshness audit — recrawl-throttle hypothesis DISPROVEN; lastmod is per-file generation stamp (always fresh, regenerates every ~few min), not stale, not per-product; recrawl path healthy
  72. 5a1c7d5 2026-06-17 cycle 75: officer CONFIRMED synthesis faithful (no drift, all caveats preserved, canary complete); folded in variants-connection pagination
  73. ba51039 2026-06-17 cycle 75: consolidated variant/price-integrity synthesis (c66-c74) + basis-aware dw-map-auditor canary spec (zero-dollar STATUS-AGNOSTIC + abnormal-sample branched-by-basis + disco-completeness) + codified methodology
  74. d8119d3 2026-06-17 cycle 74: officer CONFIRMED finding + FLAG action — unpublish-first not archive-first (April caution); split DWTF $3.50 (price-integrity) from DWTT-71xx $125.43 (disco placeholder); hold 66 uninspected as own pass
  75. c74cbdc 2026-06-17 cycle 74: Thibaut 56 'abnormal-samples' are DISCONTINUED-line stragglers (32 DWTT-71xx flat $125.43 + 24 DWTF flat $3.50), NOT mislabels; disco-drift 122 active (46 DWTT-71xx+76 DWTF); fix=complete-archive not relabel; memory 301 is vendor-side
  76. 9b8b3ce 2026-06-17 cycle 73: officer CONFIRMED + stricter gate — per-SKU unit-confirm MANDATORY before split (namespace=prioritization not proof); carve out $1188 outlier (Wallcovering 34in, per-roll-vs-bolt unresolved)
  77. b81a8e3 2026-06-17 cycle 73: Kravet 13 verified at MAP per-roll (W-prefix namespace 99.85pct Roll, not tautology) = mislabel only P2; SCOPE CORRECTION: only Kravet+Cole&Son are Kravet-family, O&L/Thibaut/Fentucci deferred (non-Kravet bases)
  78. 8d19017 2026-06-17 cycle 72: officer FLAG (unit tautology) resolved — independent unit proof (Cole&Son MAP namespace=17 Roll+4 Panel, 0 yard; join 1:1); P3->P2 consumer harm; fix=split+self-heal not rename; scope sibling Kravet vendors
  79. 5b6a19d 2026-06-17 cycle 72: MAP-verify Cole&Son 352 — all 352 priced at EXACTLY Kravet new_map (0 below MAP), correctly priced just mislabeled; rename MAP-safe. Skeptical save: v1 product_map join false-negatived, real key=barcode->kravet_authoritative_pricing
  80. c2c95d8 2026-06-17 cycle 71: officer CONFIRMED+REVISE+FLAG; reframed fix (confirm sample value vs memo; 3-option disposition; min-safe CONTINUE->DENY); tempered draft-flag w/ live Koroseal active=2353 counterexample
  81. ddadd08 2026-06-17 cycle 71: root-cause 111 RL $0 Sample = NEVER-PRICED (RL in no pipeline: product_map=0, ~0pct costed, Schu-only seeders, no RL importer); 2025 import != the 33 legacy; fix=reprice $4.25 now + DG cost separate
  82. 60247d9 2026-06-17 cycle 70: officer CONFIRMED + reframed (producer-elimination is the spine not createdAt; build-roll-scale exonerated at code level; RL-111 follow-up by producer-elim not era)
  83. a7cac96 2026-06-17 cycle 70: root-cause 33 $0-roll variants = LEGACY 2018-19 placeholder (100% legacy, 0 in 2026); build-roll-scale EXONERATED; c69 pipeline-bug hypothesis disproven; orderability refined 15 CONTINUE/18 DENY
  84. 5fadfac 2026-06-17 cycle 69: officer CONFIRMED + position-model re-verified (0/33 render $0 by default; all have in-stock position-1 sample); re-seed=per-product triage
  85. 6526738 2026-06-17 cycle 69: multi-variant $0 full-catalog GraphQL sweep — default-$0=0, but 33 select-to-free-ROLL products (P2) + orphan straggler (single $0 111->112)
  86. 816dc6e 2026-06-17 cycle 68: officer CONFIRMED + scope sharpened (single-variant bounded; multi-variant $0-default uncovered -> c69; Cole&Son MAP-verify before rename)
  87. e0dfb6e 2026-06-17 cycle 68: fleet $0-Sample signature sweep — P1 BOUNDED to 111 RL (94% coverage, RL-reproduced gate); +534 roll-priced 'Sample' mislabel (P3). v1 hit /products.json 25k cap, v2 collection-enum fixed it
  88. 304aa1f 2026-06-17 cycle 67: officer FLAG — root-cause corrected (111 RL 'Sample' variants mis-seeded to $0, NOT DG-cost-gap); orderable=true -> P1; fix=reprice sample to $4.25
  89. b3c9f34 2026-06-17 cycle 67: price-at-render audit — 111 live Ralph Lauren PDPs render $0 (43.5% of RL), effective-layer confirmed; ties to RL-uncosted-via-DG
  90. c983851 2026-06-17 cycle 66: officer REVISE — rendered-layer re-measure (0/46 WCAG violations); WCAG claim retracted, downgraded P2->P3 image-SEO
  91. c740b1d 2026-06-17 cycle 66: image alt-text audit — 26.8% images empty alt (WCAG+image-SEO), premise verified (null→rendered alt='')
  92. a5d6de2 2026-06-17 cycle 65: officer sign-off + in-cycle collection-locale & sitemap-URL verification (both 302-consolidate, clean)
  93. d9679e1 2026-06-17 cycle 65: cross-locale hreflang+canonical audit (0/58 dupe, en-ca/en-gb consolidate to en, negative-control validated)
  94. 2c7c6b5 2026-06-17 cycle 64: officer sign-off + in-cycle stacked-param & tag-path verification (both clean)
  95. 719c31f 2026-06-17 cycle 64: collection + faceted-URL canonical audit (0/231 bloat, negative-control validated)
  96. f80814f 2026-06-17 cycle 63: canonical+robots indexability audit (347/347 clean, negative-control validated)
  97. 0f99d97 2026-06-17 jsonld-425-scan: sized the $4.25 JSON-LD leak — 87.8% of multi-variant products (101/115, CI 81.8-93.8%); ~21k fleet estimate, corroborates ~26k GMC bound; systemic across vendors; single-variant showroom-lines excluded; PJ excluded
  98. 2845706 2026-06-17 jsonld-audit: Product JSON-LD structurally healthy (50/50) but 6/50 leak $4.25 sample into offers.price (multi-variant, real variant exists) — schema.org echo of $4.25 problem; distinct from GMC channel feed (organic rich results + Merchant-Center disapproval)
  99. 1bc3c5b 2026-06-17 empty-collections audit: 575 advertised -> ~37 live-empty + 14 single-product crawlable pages in sitemap (sitemap-fed to Googlebot, distinct from c58/c59); 33 'errors' were transient 429s
  100. 540c991 2026-06-17 sitemap-health audit: robots+sitemap clean; 0 genuine dead URLs advertised (9/2000 archived were mirror-lag, live-200) — de-escalates c58 soft-404s (not sitemap-amplified)
  101. 00d4548 2026-06-17 redirect-health audit: canon clean; archived products soft-404 to homepage fleet-wide (~96% of sample, 69k archived)
  102. e88d630 2026-06-17 gmc-feed-guard: tag FAIL offenders sample-leak vs real-$4.25 (officer vp-compliance refinement)
  103. edc9003 2026-06-17 GMC feed-guard canary (c57): full-catalog recount PASS (0 still-on) + standing re-leak guard
  104. 780ef9c 2026-06-17 canary fleet REVISE (c56): fix corrupt metafield plist + stagger weekly jobs (officer vp-engineering)
  105. eff726d 2026-06-17 operationalize canary fleet (c56): 7 install-ready packages + consolidated INSTALL sheet
  106. 0af28b1 2026-06-17 GMC exclusion verification (c55): exclusion CONFIRMED — 20/20 sample off Google, 15/15 real retained, 0 still-on thru 36k
  107. b9c390f 2026-06-16 no-image scan (c54): 50 of 74,441 ACTIVE have no image (0.07%) — catalog image presence 99.93%
  108. f488a4e 2026-06-16 fence-strip APPLY (c53): 60/60 code-fence leaks stripped (Steve-authorized)
  109. 6c53615 2026-06-16 fence-strip dry-run: tighten to leading-fence-only per officer REVISE (61->60, drop stelios no-op)
  110. 1dc6ff6 2026-06-16 fence-strip DRY-RUN (c52): 61 code-fence leaks, review-ready, all gates pass (read-only)
  111. b5a6309 2026-06-16 body-quality scan (c51): 187 empty + 64 code-fence leaks; 14,772 'truncated' = FALSE POSITIVE
  112. 9424442 2026-06-16 dup-sku scan (c50): genuine dup-SKU ~0 (all colorways); found 529 placeholder/junk SKUs
  113. 91e962c 2026-06-16 orphan-products scan (c49): PASS — 0 un-navigable products of 74,541 ACTIVE
  114. 6c874fe 2026-06-16 dup-image scan (c47): clean — no wrong-image errors; all 27 shared-image groups are pattern variants
  115. b5c27d7 2026-06-16 isolate read-only yolo loop on its own worktree branch (yolo-loop-readonly-20260616)
  116. 7e353c5 2026-06-16 Activate 14 1838 $4.25 sample-only drafts as Showroom Lines (tag+custom.showroom_line+inv2026, smart collection auto-includes); hold 2 mispriced paste-tub accessories
  117. d44cbed 2026-06-16 Activate 451 of 467 1838 Wallcoverings drafts (status ACTIVE + inv2026 both variants; 16 sample-only $4.25 held). Steve-authorized.
  118. 074660a 2026-06-16 dup-title scan (c46): 18,577 ACTIVE products share non-unique titles; 84% generic/template
  119. 463cd18 2026-06-16 stage live-price-canary as install-ready launchd package (c45, install Steve-gated)
  120. 5d9d562 2026-06-16 live-price canary HARDENED (c45): retry/backoff + N=250 → UNKNOWN 20%→0.4%, number corrected
  121. ac592b1 2026-06-16 broken-image scan (c44): PASS — 0% broken on 117-sample (image loadability healthy)
  122. 31803d5 2026-06-16 cycle-44: broken-image delivery pilot (312 active sampled, 99.7% OK, 0 broken; axis closed, read-only)
  123. 72fbe08 2026-06-16 add_roll_variants: enforce ROLL-unit in-script (standing rule: no per-yard MAP on per-roll product); verified 305/305 ROLL, 0 dropped
  124. b10bbb7 2026-06-16 dark-vendor check (c43): 4 vendors fully DARK (not mis-collected) — 1,943 products
  125. e3607af 2026-06-16 add_roll_variants: commit the 305-target inputs into repo + resolve from inputs/ (reproducible across reboots; /tmp fallback for legacy runs)
  126. ae2c5c8 2026-06-16 Showroom Lines: scan + bulk tag/metafield scripts for single-variant $4.25 products (sample-only → showroom category)
  127. 8ff645a 2026-06-16 harden add_roll_variants: price floor (>=$10, block $4.25 sample-trap) + require -Sample SKU (skip+log fallback); 0 of approved 305 dropped, guards arm against input drift
  128. 4aeca4e 2026-06-16 collection merge+301 map (c42): 28 empties->twin, 15 no-twin (some whole-vendor-empty)
  129. ba1a136 2026-06-16 Kravet add-roll: harden width parser to extract leading number from metafield (fixes 3 PR labels like '20 in (50.8 cm)' -> '20In Wide'); relabeled live
  130. d32d8a1 2026-06-16 orphan-collection LIVE re-scan (c41): TRUE empty count = 43 (c39's 4 was a feed-stale undercount)
  131. 5f0ef46 2026-06-16 Kravet add-roll-variant writer: adds Sold-Per-Roll @ MAP to 305 sample-only wallcoverings (idempotent, custom.width label, qty2026/CONTINUE); canary verified on Gallier Diamond $747
  132. c97eb92 2026-06-16 collection-leak sweep (c40): 3 confirmed collection-level leaks + Brewster false-positive + stale-count catch
  133. fc12f52 2026-06-16 orphan-collection scan (c39): 4 empty live collections + a WallQuest leak
  134. 3acda5c 2026-06-16 live-price pilot (c38): storefront crawl — true displayed-price, independent of broken mirror
  135. 8068a1c 2026-06-16 DTD verdict A (3/3): guarded add-price diff for 305 sample-only Kravet ROLL products (all product_type=Wallcovering verified); WRITE gated pending Steve approval + VCC-flag confirm
  136. 7f37828 2026-06-16 Kravet ROLL reprice DRY-RUN (read-only, variant-level): 450 targets -> 305 sample-only (no roll price), 145 at-MAP, 0 below-MAP; all vendors display_prices=true
  137. ccfaa8a 2026-06-16 null-price live-check (c37): mirror price column unreliable; no blank/$0 epidemic
  138. cb534c8 2026-06-16 dark-inventory scan (c36): only 1,062 sellable-ready archived; cost is the limiter
  139. 7131130 2026-06-16 Kravet split-brain fix: copy kravet_authoritative_pricing (44734 SKUs) Mac2->Kamatera canonical; 10645 live products now MAP-matched, 457 ROLL safe-reprice target
  140. ff928c0 2026-06-16 cycle-33: promote-canary.sh harness — generate launchd plist for a built canary (council #2); install stays Steve-gated, plutil-validated
  141. d181396 2026-06-16 Kravet Jan-2026 price list -> dw_unified: kravet_master_price_2026 keyed master (8191 rows, joins live on mfr_sku, unlocks 457 ROLL wallcovering reprice targets)
  142. f72b052 2026-06-16 sitemap emergence sizing (c35): philipperomano fully generatable (8,229 URLs), novasuede Kamatera-only
  143. e3d61c1 2026-06-16 canary promotion harness (c34): stage 5 new canaries as install-ready launchd packages
  144. 150b6a1 2026-06-16 specs pattern-crosswalk probe (c33): PARTIAL feasibility + structural ceiling
  145. 83eb6fa 2026-06-16 specs-reparse sizing (c32): the data exists but won't join — SKU-namespace mismatch
  146. c79083c 2026-06-16 enrichment-board: local synthesis of c26/c28/c29/GMC into one ranked vendor×axis board
  147. 5c719ab 2026-06-16 schu roll-adds: complete all 81 (41 clean + 36 edge + 4 oddball); make edge script idempotent across cap-blocked partial runs
  148. fabc295 2026-06-16 alt-text coverage audit: repped-vendor image alt-text (read-only GraphQL)
  149. d9c8874 2026-06-16 metafield-coverage: harden specs check w/ global.width + pillow.* fallbacks (c28)
  150. 30b9b80 2026-06-16 robots/sitemap fleet canary: crawl-directive + sitemap health (read-only)
  151. acaeef7 2026-06-16 metafield-coverage audit: repped-vendor specs/images/color coverage (read-only GraphQL)
  152. 3343eea 2026-06-16 harden 3 read-only canaries (DTD-A 3/3): dynamic-dated reports + best-effort CNCP alert on FAIL
  153. 587c4e4 2026-06-16 tls-expiry canary: read-only fleet cert-expiry check (DTD 3/3; PASS, all certs >=41d; grasscloth.com parked off-fleet)
  154. 781635c 2026-06-16 handle-freshness canary: storefront 404 check on mirror-ACTIVE handles (DTD 3/3; PASS 4.4% drift, all explained mirror-lag)
  155. 7960af2 2026-06-16 queue-slo-snapshot: staleness-aware Shopify write-queue SLO probe (Mac2 mirror frozen at Apr-14; refuses fake-live numbers)
  156. 0607790 2026-06-16 Availability-drift canary: built, tested, found INVALID-as-is for DW (negative result)
  157. 30e9dc1 2026-06-16 DRAFT reactivation staging plan (report-only, tiered, batched)
  158. a8d1589 2026-06-16 Canary board: aggregate all DW canaries into one red/green health pane
  159. 4d885e1 2026-06-16 Banned-word body-leak scanner: exact cleanup list + strip preview (68 live)
  160. 75f9a55 2026-06-16 Banned-word 'Wallpaper' title rewrite PREVIEW (report-only, guarded transform)
  161. 7d9aad2 2026-06-16 Scraper contract test: DB-side field-depth canary for top-revenue vendors
  162. 65f918b 2026-06-16 April mass-archive restore staging plan (report-only, tiered, batched)
  163. e122d4f 2026-06-16 CF DNS drift snapshotter: read-only zone export + diff vs last commit
  164. 5159ca6 2026-06-16 docs: verify resume-roll-adds REMAIN-counter edge-set concern (RESUME-COUNTER-NOTE)
  165. d2d776f 2026-06-16 refactor: add scripts/lib/shopify.mjs shared GQL client + migrate 2 read-only auditors (proof of pattern)
  166. 540e242 2026-06-15 Contract-scope auditor: read-only dw_unified canary for vendor-scope integrity
  167. ceef3ac 2026-06-15 feat(staged): backup-freshness + secrets-env-backup LaunchAgents + INSTALL (Steve-gated install)
  168. d6bb2f3 2026-06-15 Add blocked-vendor cost-coverage ledger (2026-06-15): 7 vendors re-confirmed still-blocked via full-Drive walk (0 price docs)
  169. 36a2b0f 2026-06-15 Canary Meta-Watchdog: heartbeat verifier for com.steve.* jobs (read-only)
  170. f5311b1 2026-06-15 chore: gitignore runtime artifacts + un-track gmc-425-result.json
  171. fd37d08 2026-06-15 chore: remove dead rw-price-group one-off cluster (9 unreferenced Rebel Walls price-group experiment forks, ~2700 LOC)
  172. 7debeb6 2026-06-15 Stage GDrive cost-mine 2026-06-15: 772 rows (DW Exclusives 512, Mini/Mid-Century 141, Ralph Lauren DGD 114, Milton&King 4 collection-level)
  173. 21bdbc0 2026-06-15 Stage Kravet below-MAP fix-list (208 ROLL-eligible, 2026-06-15 analysis)
  174. 0bd224f 2026-06-15 GMC $4.25 feed-exclusion: staged Shopify-side fix (dry-run: 60,232 mispriced products in Google feed)
  175. 6e2c6a1 2026-06-15 Stage banned-word Wallpaper->Wallcovering rewrite PLAN + AI-preamble strip list (READ-ONLY, no Shopify writes)
  176. af6f41a 2026-06-15 Extend hue-sort runbook to all 34 color collections (cov_<hue> now written for all 14 hues, 127,880 metafields)
  177. 26d7765 2026-06-15 Add Boost hue-sort runbook (Half A client-side + Half B server-side cov_<hue> metafields)
  178. c1e6e70 2026-06-15 Move DWLK-829420 (probe-renamed to Size:Sample) from edge→clean roll-add CSV so tomorrow's resume finishes it hands-off
  179. 7532fe4 2026-06-15 Fleet dedup: archived 559 true duplicate products live + 301 redirects (Shopify -N handle signal, keeper-ACTIVE guard, read-back verified, 0 err); rejected 860 polluted count from maker-name SKUs
  180. e36e0e2 2026-06-15 Resolve 4 Schumacher oddballs via sku-swap (bare->Roll, existing->-Sample); wire into tomorrow's resume wrapper
  181. 50b1d33 2026-06-15 Add resume wrapper + persist target CSVs for tomorrow's remaining 77 Schumacher roll-adds (run manually after Shopify daily-cap reset)
  182. e96c972 2026-06-15 Add Schumacher edge add-roll handler (37 Default-Title via option-rename; 4 oddballs flagged for manual; separate revert log)
  183. 11048a7 2026-06-15 Schumacher add-roll: idempotent skip + accumulate revert-log across runs; 2-product live test verified (Sample+Roll @ retail, inv 2026)
  184. d8390e1 2026-06-15 Kravet dedup: archived 18 duplicate products live + 301 redirects to keeper handles (keeper-ACTIVE guard, read-back verified, 0 err)
  185. 5cb00ac 2026-06-15 Trending 2026: hard cap, raise to newest 1000 SKUs (no Artmura union); expanded 500->1000
  186. cf0c7f0 2026-06-15 Kravet dedup verifier: handle-driven keeper selection + redirect targets; 18-product verified archive plan (15 HIGH, 3 REVIEW)
  187. 7f7c9f1 2026-06-15 Trending 2026 tag reconciler: newest-500 active + all Artmura, daily launchd cron (trimmed 5130→500)
  188. 2cde42a 2026-06-15 Add Schumacher add-roll-variant builder (532 targets, inventory=2026, scope-gated preflight, reversible) — paused for upgraded token
  189. e3ad9a1 2026-06-15 Kravet dedup sweep: bulk full-catalog true-dup detector (vendor+SKU / vendor+SKU+title keys); 18 real dup clusters found, 18 removable
  190. 1193fa7 2026-06-15 Add Schumacher roll-price pusher + propagate price-sheet costs to Kamatera canonical (1,174 costed)
  191. 8965036 2026-06-15 Resolve staged price-sheet costs into shopify_products.cost (1,177 active Schumacher+Ralph Lauren, unit-aware, tagged & reversible)
  192. 1856ee2 2026-06-15 Ingest GDrive vendor price sheets into dw_unified.vendor_price_sheets (19,797 rows)
  193. 18fc285 2026-06-15 Kravet under-MAP reprice: 73 variants lifted to MAP (live, verified); variant-centric resolver dodges dup-SKU products; sample/unit/drift guards
  194. f57943b 2026-06-15 Kravet off-MAP: read-only paginated measurer (no bulk-op, no Kamatera; joins live price to 2026 MAP via custom.manufacturer_sku)
  195. f9f091b 2026-06-15 brands: repoint push script to recreated page id 208010608691 (cache-evict delete+recreate)
  196. 2927219 2026-06-15 brands: drop Zeuxis Parrhasius floral room-bg (settlement foliage); sync room maps
  197. fd8f8ac 2026-06-15 Push the 59 held ROLL anomalies up to MAP (Steve-authorized 2026-06-15)
  198. c50964f 2026-06-15 brands page: 3 audit fixes — promote title to <h1> (SEO), inject ItemList JSON-LD (100 brands, rich-result), strip 'Wallpaper wallcovering' double-noun from bg-img alt (banned-word + grammar). 100 tiles, all image+logo, 385KB.
  199. d9b77f9 2026-06-15 GMC $4.25 feed-price blast-radius count (read-only audit); remove incomplete gate-probe scratch
  200. f1da716 2026-06-15 ROOT CAUSE + FIX: Kravet MAP push now unit-aware (ROLL-only gate)
  201. 182a368 2026-06-15 Kravet MAP revert tool (DTD verdict B): restore the 448 written prices to original
  202. 6f4cc86 2026-06-15 Kravet MAP push tool: roll-variant-only price=MAP, dry-run gate + anomaly guard
  203. 2dae150 2026-06-15 Kravet cost campaign: 6,373/8,317 (77%) MAP-resolved from free sources + 1,944 disco-tail isolated
  204. f145eb5 2026-06-15 Kravet-family cost drive: MAP resolver + parallel per-brand currency-check
  205. 90c7e9a 2026-06-15 Google feed: prep-actions (punch-list + unpublish-list) + gated apply-unpublish
  206. 257f9f8 2026-06-15 feed-eligibility: leak-check on feed-emitted fields only (title/handle/vendor)
  207. 5de6726 2026-06-15 Google feed scoping: live-Shopify-driven eligibility gate + calibration proof + SCOPE.md
  208. 6967315 2026-06-15 Color-SEO landings: SEO title + meta description + editorial intro on all 17 live color collections (council idea #2 'Wallcoverings by Color'); GraphQL collectionUpdate via write_products
  209. 451c923 2026-06-15 brands page: consolidate Scalamandré to single /collections tile (drop 2 old /pages tiles) — final staged state: 100 A-Z tiles, 0 missing logo/image, 1838 pulled, Surface Stick→apartmentwallpaper, +8 high-volume brands
  210. 20610f5 2026-06-14 Add read-only Active/Draft gate-integrity audit script (ACTIVE+DRAFT GraphQL paging)
  211. d086ddd 2026-06-14 Add fail-closed pre-flight validator (rules.json + preflight-validate.js) codifying MEMORY/CLAUDE.md hard rules
  212. 148daae 2026-06-14 brands-page: drop dead 1838 tile, repoint Surface Stick to apartmentwallpaper.com, add 8 high-inventory brands (Phillipe Romano/Hollywood/Malibu/Jeffrey Stevens/Scalamandré/Christian Lacroix/Marimekko/Artmura) each w/ logo+bg → populated collections; 102 tiles, 0 missing logo/bg
  213. 1489f68 2026-06-14 Kravet disco: rigorous Algolia-index verification (URL-agnostic, exact-sku) + archive 121 confirmed-discontinued (dual-confirmed, AMW excluded), 0 failed; audit log saved
  214. bd38938 2026-06-14 Brands directory: every card now has bg image + logo chip (0 text-only)
  215. 094cdc7 2026-06-14 Brands page: add Featured Fabrics row (Pierre Frey/Lee Jofa/Romo/Designers Guild/Holland & Sherry); rename first row to Featured Wallcoverings for clean pairing
  216. 5fce4e0 2026-06-14 Brands page: add Featured Houses prestige row (Schumacher/Thibaut/Cole&Son/Ralph Lauren/Kravet) above All-Brands-A-Z divider+search (DW Marketing officer); fix Schumacher logo (was FREDERIC sub-brand -> schumacher-shopify)
  217. 074ac33 2026-06-14 Brands page officer refinements: type-to-filter search, editorial subtitle+intro copy w/ anchor-brand links, per-tile alt text+data-name, CSS typo fix (.dw-dard), Elitis->plain grasscloth swatch (compliance). Officers: commerce/marketing/steward/compliance all PASS
  218. 394aa03 2026-06-14 Kravet MAP integrity tools: coverage audit (GraphQL, REST-metafields-broken), unit-aware off-MAP delta, sample-trap exclusion, 1104 unit-verified reprice to 2026 MAP
  219. ad1f1a2 2026-06-13 Brands page: fix broken DW Exclusive link (/pages/dw-exclusive-1 404 -> /pages/dw-exclusive 200); found via live link test
  220. 454032f 2026-06-13 Brands page DTD-C: upgrade 8 flat-swatch tiles to settlement-clean room shots (Elitis,Fentucci,Koroseal,Laura Ashley,Maya Romanoff,Mulberry,Nina Campbell,Ralph Lauren via images[1] lifestyle); audited, leave clean logo tiles untouched
  221. 7863e7d 2026-06-13 Brands page: design-panel synthesis (graphic-designer 4/5 + interior-designer) — chip min-width+double shadow, object-position center, tighter heading tracking
  222. a249bd7 2026-06-13 Brands page: apply graphic-designer pass — uniform logo chips (fixed 66% width), drop-shadow to lift faint logos, tighter 10px grid gap, consistent chip opacity/shadow
  223. b065f65 2026-06-13 Brands page redesign: room-setting bg + vendor logo chip on top for 48 vendors; settlement-audited every bg (no tropical/leaves/florals/birds); curated clean room map persisted
  224. 018a8ab 2026-06-13 Brands page: settlement scrub — block 9 vendor room images with tropical/leaves/florals/birds/butterflies (AS Creation,Wallpaper NYC,Harlequin,Sancar,Mulberry,Backdrop,Peg Norriss,SUGARBOO,Brunschwig) -> clean wordmarks; permanent SETTLEMENT_BLOCK guard in build
  225. efd6d5f 2026-06-13 Brands page LIVE on /pages/brands (new design, leak-free); preview unpublished per DTD verdict C (fallback retained)
  226. 71696a6 2026-06-12 Refine: splitName strips trailing Wallcoverings + never uses junk tags as eyebrow
  227. fca0d80 2026-06-12 Brands page: delete+recreate canonical (still cache-frozen); park working design at /pages/brands-preview; snapshot original; memory update
  228. b51969d 2026-06-12 Cole & Son MAP reconcile by title-pattern (248/249 patterns uniform MAP); reprice 789 over-MAP products to MAP
  229. 783ea1b 2026-06-12 Brands page: 62 real logos (vendor-logos CDN set + 14 dig-and-find sourced inline) + 23 vendor room images; tighten grid (6-col, dense); force-purge attempts
  230. c106b30 2026-06-12 Schumacher title fix (517 doubled-Wallcoverings) + Cole&Son MAP audit/apply + build-line title-strip handles redundant Wallcoverings
  231. ee9be2e 2026-06-12 Brands page redesign: pill-tile logo grid for /pages/brands (52 real logos + elegant wordmarks; drop WallQuest+Nicolette leaks; write_content push)
  232. 4791fbe 2026-06-12 Schumacher landing LIVE (2326 products, 38/38 clickthrough); spec-rows assertion data-agnostic
  233. 51eefb7 2026-06-12 Schumacher: junk-product filter in build-line (skip vendor-name-only titles + imageless); snapshot 2326 clean, colors extracted
  234. 66accf5 2026-06-12 Schumacher config block + collection created (/collections/schumacher, 2326 products) + DNS staged
  235. bcd2924 2026-06-12 Fix broken Trade nav link: /pages/trade-program (404) → /pages/trade (real page)
  236. eee1f4d 2026-06-12 Landing: all line labels config-driven (card label, books heading, footer, gate, PDP crumbs/spec/share/story/JSON-LD) — fixes Thibaut showing 'Artmura'
  237. c8841df 2026-06-12 Thibaut color-extract script + color filter enabled (38/38 clickthrough)
  238. e49d2c2 2026-06-12 Landing shopbar text now config-driven (line name + product count) — was hardcoded Artmura/161
  239. 9ab487d 2026-06-12 clickthrough: data-agnostic count + optional book/color checks (Thibaut 37/37, Artmura 39/39)
  240. 2f4b8ae 2026-06-12 Thibaut snapshot: 1903 products built + cleaned (-SAMPLE suffix), store_url prefers live handle
  241. 584bf8a 2026-06-12 Vendor-landing template: generalize to any DW line + dw-vendor-landing skill
  242. 4ec71ec 2026-06-12 Artmura landing: add Playwright component click-through (39/39 live regression test)
  243. 8382b47 2026-06-12 Artmura: apply Cost/.75/.85 retail markup + hide prices on landing + add social share
  244. 700117a 2026-06-12 Artmura landing: Shop links now land on the real /collections/artmura collection
  245. 702c6d2 2026-06-12 Artmura landing: re-skin as Designer Wallcoverings house brand (not vendor-branded)
  246. 6d72771 2026-06-12 Artmura deploy: auto-pick free port on Kamatera (:9920 taken by another app) + pm2 start with PORT env
  247. f357517 2026-06-12 Artmura landing: self-contained BUNDLE mode + turnkey deploy script for artmura.designerwallcoverings.com
  248. 8a03eb4 2026-06-12 Artmura site README: document the clone-a-line template flow + deploy-gated status
  249. 5af2df5 2026-06-12 Vendor-landing factory: build-line.js generates a branded landing for ANY live DW vendor from Shopify
  250. 8489a63 2026-06-12 Vendor-landing template: config-driven + links to live Shopify (not a competing store)
  251. 8f441ef 2026-06-12 Artmura go-live: inventory=2026 both variants + publish to all 13 DW channels + status=ACTIVE
  252. 52f8e55 2026-06-12 Artmura titles: insert 'Wallcovering' → '<name> Wallcovering | Artmura'
  253. 9172451 2026-06-12 Artmura site: per-series 'Pattern' filter in catalog (21 collections) — honors committed per-series browsing
  254. 55fc397 2026-06-12 Artmura push: fix 422 (drop metafields from create — store defs collide), add req timeout + metafield backfill
  255. c695c88 2026-06-12 Thibaut: strip 160 junk parenthetical tags from live store (GET-strip-PUT, preserves trailing color, 0 failed)
  256. 7a52550 2026-06-12 Artmura site: README documenting features, data, endpoints, preview/gated status
  257. 528cdf4 2026-06-12 Artmura site (B): 'Pairs well with' recs + per-product JSON-LD on PDP
  258. 3e3a3bd 2026-06-12 Artmura site (B/catalog): dominant-color extraction → true-hue color sort + color dots + color filter bar
  259. ecdd0e4 2026-06-12 Artmura site (C/production-readiness): APCA hero fix + perf + deploy scaffold
  260. 1661105 2026-06-12 Artmura: direct Shopify draft-create pusher (models thibaut path; queue worker dead)
  261. dfb4bac 2026-06-12 Artmura site: pricing finalized at website price, no trade discount (Steve directive); drop reference framing
  262. 6bb84ee 2026-06-12 Artmura microsite: editorial Italian storefront (Express) for the 161 staged products
  263. f4eba66 2026-06-12 Artmura onboard: full-monte feed-first capture of 161 newwall.com Artmura products
  264. ca94dcb 2026-06-11 Thibaut mfr-fix: COMPLETE — 1096/1096 pushed live (0 failed), verified on store; store=designer-laboratory-sandbox IS prod
  265. 8da5a20 2026-06-11 Thibaut mfr-fix: one-line run-push.sh wrapper (no line-wrap mangling; store=prod confirmed)
  266. cd8b70e 2026-06-11 Thibaut mfr-fix: direct Shopify Admin REST pusher (DTD verdict A) — bypasses sandbox queue, writes live store from staging, dry-run + per-row logging
  267. 298b81b 2026-06-11 Thibaut mfr-fix: flag jobs are in wrong queue DB (worker reads separate Kamatera-side queue); re-enqueue needed
  268. bdd29b7 2026-06-11 Thibaut mfr-SKU fix: queue 1027 tag backfills, stage 69 title rewrites + backlog
  269. d8a8633 2026-06-03 Scrub residual vendor names from products.json (title/vendor/tags); preserve sku/handle
  270. dcc6255 2026-06-03 Add *.bak to .gitignore to exclude backup files from tracking
  271. 2525445 2026-06-01 hero/ideas: single big full-bleed hero (remove 2x2 four-square grid + hero-4grid.js/json + inert CSS), collapse Ideas to one rail
  272. 8eb1ccd 2026-05-31 Add per-site favicon (kills /favicon.ico 404)
  273. b4b5920 2026-05-28 scrub vendor name leaks from products.json source (176 products: title/vendor/tags cleaned per sku-redact denylist)
  274. 7ace082 2026-05-13 polish: tech-violet palette, editorial hero, 3-step how-it-works section
  275. 579e226 2026-05-12 dw site: log Gemini image-classify usage to cost-tracker
  276. f29cf27 2026-05-10 deploy: pm2 port 9925 + nginx :80 vhost, gemini env loader
  277. 469fcec 2026-05-10 initial scaffold + GA gtag — designerwallcoverings.ai room-match landing

Authors

Agents used

  • vp-dw-commerce5
  • vp-engineering2
  • vp-compliance-policy1

Skills used

  • /pages8
  • /products6
  • /collections6
  • /claude5
  • /code5
  • /latest5
  • /backoff5
  • /config4
  • /color4
  • /vendor4
  • /spec3
  • /facets3
  • /pillow3
  • /handle3
  • /artmura3
  • /skills2
  • /shopify2
  • /lead-time2
  • /unpublish2
  • /stale2
  • /robots-sitemap2
  • /alt-text2
  • /trailing2
  • /junk2
  • /material2
  • /template2
  • /draft2
  • /images2
  • /global2
  • /sitemap2

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

f0a9020 · 2026-09-26 · TK-12333: remove Scalamandre from showroom-vendors (Steve 2026-09-26: Scalamandre is NOT a showroom line)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HHVEexYEwkT1HYJzkvv66
0efe7cc · 2026-09-26 · TK-11860: sync showroom-vendors snapshot to canonical fix-live-board@9bcd81c (+Jeffrey Stevens, Mind the Gap, Sandberg, Scalamandre)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HHVEexYEwkT1HYJzkvv66
4c10120 · 2026-09-10 · deploy-vendor.sh: gate -internal hosts by default (TK-11391 root cause)
This template emitted an nginx vhost with NO auth_basic at all, so every microsite it
deployed came up publicly browsable. That is how 65 "-internal" hosts ended up ungated —
including phillip-jeffries-internal, which served 4,377 SKUs of a SHOWROOM-ONLY line to
anyone. Gating the 64 by hand fixes the instances; this fixes the source.

Gate is chosen from the fleet's own naming convention: an "-internal" host is a trade/spec
viewer and gets auth_basic + /etc/nginx/.htpasswd-dwvendors (same realm as the other ~453);
a public vendor landing (artmura, grasscloth) does not. GATE=1 / GATE=0 override either way.

Refuses to deploy an internal host at all if the htpasswd file is missing on the target,
rather than silently shipping it ungated. Adds a post-deploy edge check that warns loudly
if a host meant to be gated answers anything but 401/403.

Verified by rendering the template for all three cases: -internal gated, public landing
open, GATE=1 forces gating on a public name. bash -n clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5b0f860 · 2026-09-10 · Guard the vendor-microsite generator against showroom-only lines (TK-11200)
The *.designerwallcoverings.com vendor microsites are minted by this artmura-site
template, not by dw-domain-fleet — so the isShowroomVendor guard added there never
covered them. Showroom-only lines (Phillip Jeffries) must stay "addressable but not
discoverable", and a public browsable grid on its own subdomain is a discovery surface.

New showroom.js (self-contained so it rsyncs with a BUNDLE=1 deploy) + a local copy of
the canonical showroom-vendors.json, wired into all three stages:

- build-line.js  refuses to snapshot a showroom vendor; drops showroom-TAGGED products
                 from any snapshot; and refuses to write a 0-product snapshot (a bad
                 token silently blanked a live microsite's grid).
- deploy-vendor.sh refuses by slug, domain label, or the snapshot's own vendor field.
- server.js      refuses to serve a showroom-vendor config; hides showroom-TAGGED
                 products from the grid at catalog load.

Matching normalization collapses the "Philip"/"Phillip" spelling split and separator-less
slugs, so a one-letter typo or a renamed slug can't walk past the guard.
Escape hatch: ALLOW_SHOWROOM=1 (always logs loudly).

Verified locally: showroom vendor/slug/domain refused at all three stages; carnegie line
still boots and serves 5934 products (/api/config, /api/products, /api/facets all 200);
tag filter hides exactly the tagged rows. Nothing deployed — prod stays gated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cwgg8nQa46x1QZewDe7bGn
20ab7b0 · 2026-09-03 · TK-11186: trending-tag-sync twin — guard showroom-only vendors out of Trending tag flow
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YXf9gMQQWRfNex6EestZhp
ea0eaee · 2026-09-03 · Google feed twin: hard-exclude showroom-only vendors via isShowroomVendor (TK-11186)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BgCcr9t5zNGdb43pS4f1ks
7e33d8b · 2026-09-01 · gmc-feed-guard TK-10952: mirror crash artifact to skill dir, fix cron-fire-canary detection
- Add _SKILL_GUARD constant and mirror crash-handler writes to
  ~/.claude/skills/gmc-feed-guard/data/latest.json so the crash
  artifact stays in sync with the main artifact path.
- Previous session (HEAD) already added SKILL_DIR mirror for normal
  runs and verdict field — this extends the same pattern to crashes.
- Rebuilt cron-fire-canary manifest: primary_artifact_path now set to
  skill dir, so cron-fire-canary correctly detects freshness vs stale
  and classifies exit=2 (FAIL verdict) as a designed signal exit (ok),
  not a crash.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1956af9 · 2026-09-01 · TK-10952: gmc-feed-guard — add unhandledRejection handler for clean crash reporting
Script was crashing mid-run (exit code 2 = unhandled rejection) without writing
to data/latest.json, causing cron-fire-canary to see stale-unknown state.
Now: on any unhandled rejection, writes FAIL verdict to data/latest.json and
exits 1 so the error is visible + the fleet-health-rollup sees FAIL not silence.
86f28e8 · 2026-08-05 · TK-10210: fix false no_roll_variant_price exclusion in dw-yolo-loop feed-eligibility
Port the TK-10209 fix from designerwallcoverings to dw-yolo-loop:

1. isSample now uses price-beats-label logic: a variant priced >$5 is a
   real roll even if labeled "Sample" — fixes the Osborne W7351-01 class
   where the sole roll variant was mislabeled "Size: Sample" @ $76.02,
   causing rollPrice=null -> false no_roll_variant_price exclusion.

2. Wrap /tmp/cost_map.tsv readFileSync in try/catch: the file is GC-prone
   and the script is designed to flag kravet_map_unverified_no_cost when
   cost is missing — a hard crash here defeated that intent.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5df288c · 2026-08-03 · Romo close: batch ledger + price-correction ledger + audit artifacts
- 207-draft batch ledger, 117-product price-correction ledger (before->after)
- full-catalog audit: prices correct, descriptions clean, 2 sample-only structure exceptions (Floris/Raya)
7e55c7b · 2026-08-03 · Romo pricing: fix double-tariff bug from authoritative trade portal
- Root cause: our_price built from net_cost (trade + 2x tariff) not total_price_per_roll (trade + 1x)
- Confirmed vs trade.theromogroup.com: Figura W948/03 Total/Roll $946.05 -> retail $1712.31
- Catalog: recomputed our_price for 382 rows (backup: our_price_pre_tariff_fix)
- Store: corrected 117 created products ($2890.79 overcharge removed, 6 active), ledgered before->after
- REPRICE-138 was BACKWARDS (compared correct-live vs wrong-our_price) -> cancelled
e6d0701 · 2026-08-03 · Romo ADD canary: create script + 10 DRAFT products on live store (ledger)
- W-code reconciliation vs live store → 817 true-new safe-to-ADD
- mirrors live Romo structure (Title option, Single Roll + $4.25 Sample)
- 10/10 verified: sellable variant, sample, image, attribution tags, draft
- idempotency guard (skip existing SKU) + reversibility ledger
671aec7 · 2026-08-03 · Romo landing: 578-product snapshot + lexicon attribution (color/style/motif facets)
- site.config.js: add romo block (DW house chrome, collection handle 'romo')
- build-romo-enrich.js: attribute live products onto interior-designer lexicon from Shopify tags
- server.js: styles/motifs on each record + in /api/facets; vendor-aware startup banner
- index.html: Style + Motif filter selects + color bar (auto-hide when empty)
- lines/romo-colors.json: 578/578 color buckets, 522 styles, 525 motifs
e88d630 · 2026-06-17 · gmc-feed-guard: tag FAIL offenders sample-leak vs real-$4.25 (officer vp-compliance refinement)
Non-blocking refinement per vp-compliance-policy CONFIRMED sign-off: FAIL still fires on
any min-variant<=4.25-on-Google (fail-closed, correct), but each offender is now tagged
[sample-leak] (has a higher real variant = the expected import re-leak class) vs
[real-$4.25] (genuinely sample-only SKU) so the alert is actionable. PASS unchanged (0).
edc9003 · 2026-06-17 · GMC feed-guard canary (c57): full-catalog recount PASS (0 still-on) + standing re-leak guard
Hardened the c55 recount (retry/backoff on non-JSON/429/5xx — fixes the crash that
stopped it at 36k). Full catalog now: 74,441 scanned, 0 $4.25-still-on-Google in 232s
→ COMPLETES the c55 verification (GMC exclusion confirmed catalog-wide, not half-scan).
Promoted as a daily standing GMC feed-guard via the c34 harness: FAILs if any $4.25
product reappears on the Google channel (catches re-leak from new imports). Package
PlistBuddy-validated (c56 lesson). Install Steve-gated.
780ef9c · 2026-06-17 · canary fleet REVISE (c56): fix corrupt metafield plist + stagger weekly jobs (officer vp-engineering)
vp-engineering sign-off caught: (1) metafield-coverage plist was a bare JSON array (no
Label/StartInterval) — plutil-lint passed it as valid syntax but it was a dead launchd
job; regenerated + now PlistBuddy-valid. (2) all 5 weekly jobs shared StartInterval
604800 → would fire concurrently (3x 74k scans at once); converted to day-staggered
StartCalendarInterval (Mon-Fri 2-3am, heavy scans Wed/Thu/Fri). All 7 PlistBuddy-valid.
Stable-home rec = main-repo scripts/. Install Steve-gated.
eff726d · 2026-06-17 · operationalize canary fleet (c56): 7 install-ready packages + consolidated INSTALL sheet
Promoted the run's shippable read-only canaries to install-ready launchd packages via
the c34 harness: handle-freshness + live-price (daily), tls-expiry/robots-sitemap/
metafield-coverage/alt-text/no-image (weekly). Each = plist + heartbeat-wrapper +
meta-watchdog manifest row + INSTALL.txt; all plists lint OK. Consolidated INSTALL-FLEET
sheet written. FIXED a harness bug: promote-canary.sh had a hardcoded main-repo BASE path
(wrote packages into the main repo, contaminating the write-session tree) — reverted that
contamination + made BASE script-relative (worktree-aware). Caveat flagged: scripts live in
the worktree; move to a stable path before installing permanent jobs. Install Steve-gated.
0af28b1 · 2026-06-17 · GMC exclusion verification (c55): exclusion CONFIRMED — 20/20 sample off Google, 15/15 real retained, 0 still-on thru 36k
Read-only verification of the completed surgical exclusion (apply log: 57,744 unpublished,
0 failed). Live spot-check: 20/20 formerly-$4.25 products now publishedOnPublication(Google)
=false; 15/15 real-priced (>$4.25) STILL on Google (good listings retained — surgical goal
met, no over-exclusion). Catalog-wide recount showed 0 $4.25-still-on through ~36k active
before a transient non-JSON Shopify response crashed the unhardened loop (robustness gap,
not a data issue). $4.25-to-Google suspension risk neutralized while keeping the ~12.6k
good products on Google.
b9c390f · 2026-06-16 · no-image scan (c54): 50 of 74,441 ACTIVE have no image (0.07%) — catalog image presence 99.93%
Read-only full-catalog sweep (closes c26 gap: that was repped-only via metafields).
Verified live: 2 no-image samples genuinely 0 images (admin + storefront); control
returns 1 (query valid, not a false-zero). 50 no-image, top vendors Anna French 23,
Versace 9, Phillipe Romano 4, LA Walls 4. A no-image PDP is dead-on-arrival + a Google
feed disqualifier. Small concrete list; fix gated (source/attach image or de-list).
f488a4e · 2026-06-16 · fence-strip APPLY (c53): 60/60 code-fence leaks stripped (Steve-authorized)
Applied the officer-CONFIRMED fix: 60 ACTIVE products (Kravet 49/Scalamandre 8/
Graduate 2/Thibaut 1) had a leaked leading markdown code-fence in body_html. Per
product: re-fetched fresh, re-ran guards (leading-fence present, unwrap changes it,
non-empty + no banned word), set descriptionHtml=cleaned + seo.description=regen.
60 stripped, 0 skipped, 0 failed. Rollback (60 old bodies) saved to
yolo-queue/fence-strip-ROLLBACK-2026-06-16.json. Verified live: herb-garden +
all-over-leopard now fence-free w/ clean body + seo. $0 (Shopify Admin API).
6c53615 · 2026-06-16 · fence-strip dry-run: tighten to leading-fence-only per officer REVISE (61->60, drop stelios no-op)
vp-dw-marketing sign-off caught 1 false-positive (stelios-grey-grasscloth: normal
Fire-Rating body, stray mid-body marker, no leading fence -> a no-op write violating
gate-A). Tightened matcher to require the body to START with a fence. Re-run: 60/60,
stelios excluded, banned-word 0, meta-regen 60. Vendors Kravet 49/Scalamandre 8/
Graduate 2/Thibaut 1. Officer verdict now CONFIRMED-READY-TO-APPLY, Steve-gated.
1dc6ff6 · 2026-06-16 · fence-strip DRY-RUN (c52): 61 code-fence leaks, review-ready, all gates pass (read-only)
Staged the c51-officer-approved fix as read-only dry-run. Self-corrected mid-cycle:
v1 only matched complete fenced blocks (1/61); real leaks are UNCLOSED leading fences,
patched unwrap to strip leading/trailing fence markers -> v2 strips all 61 cleanly.
Gates: 0 banned-word Wallpaper after strip; all 61 need derived meta/OG regen (null
seo.description); 3 extra from c51 64 were bold false-positives, excluded. Vendors
Kravet 49 / Scalamandre 8. Worklist before/after x61 in yolo-queue. NO write, apply Steve-gated.
b5a6309 · 2026-06-16 · body-quality scan (c51): 187 empty + 64 code-fence leaks; 14,772 'truncated' = FALSE POSITIVE
Read-only scan of 74,541 ACTIVE bodies, segmented by defect. Real cohorts: empty/
near-empty 187 (0.3%); code-fence/markdown 64 — the ```html-wrapper leaks confirmed
genuine live (herb-garden, all-over-leopard show raw markdown on the PDP, same class
as the Versace preamble); preamble-only leftover 2 (Versace fix mop-up); raw-AI
artifact 1. The 'truncated' heuristic flagged 14,772 but spot-checks prove it's a
FALSE POSITIVE — minimal name/spec bodies that just lack terminal punctuation
('Grasscloth Basketweave #GRS-3012; Foreground: Brown... Sold per yard'), NOT
truncations. Discarded. Net real body defects ~254.
9424442 · 2026-06-16 · dup-sku scan (c50): genuine dup-SKU ~0 (all colorways); found 529 placeholder/junk SKUs
Read-only. 2-layer skeptical decode: 2,539 shared-SKU groups raw, but the top are
maker-name placeholders (SANCAR=Versace, the known false positive) and the digit-SKU
shares are colorways of one pattern sharing the vendor's pattern-level SKU (Scalamandre
WP####, Nina Campbell NCW####). Genuine two-different-products-same-real-SKU defects ~0.
REAL finding: 529 ACTIVE products carry a placeholder/junk SKU (no-digit, shared):
SANCAR 179 / TRUE 91 (boolean string leaked into SKU!) / YORK 57 / OSBORNE 56 /
INNOVATIONS 52 / DONGHIA 16 + descriptive strings. Breaks SKU lookup/dedup + junk MPN
to Google. Fix gated.
91e962c · 2026-06-16 · orphan-products scan (c49): PASS — 0 un-navigable products of 74,541 ACTIVE
Read-only sweep using authoritative product->collections membership (not stale
feed counts). Every ACTIVE product belongs to >=1 collection (usually 10+, via
the 'exclusive' + tag-based smart collections). Verified the query returns real
membership (spot-checked: products show glitter-wallpaper/modern-originals/
exclusive/innovative). Product-level navigability healthy; negative result rules
out an un-browsable-product defect.
6c874fe · 2026-06-16 · dup-image scan (c47): clean — no wrong-image errors; all 27 shared-image groups are pattern variants
Read-only. ACTIVE products sharing exact primary image_url: 27 groups / 56 products.
Two-step skeptical decode caught the false positives: 20 are colorways (Babington
Check Indigo/Red/Green/Teal share Mulberry's one pattern photo), 7 are substrate
variants (Simpatico Paper/Print, Sporting Life/Velvet, Arioso Paper/Print). In every
case the shared photo is the CORRECT pattern across that pattern's color/material
variants (vendor one-photo limitation) — NOT a wrong-image copy-paste defect. Clean
PASS. First isolated-worktree commit.
074660a · 2026-06-16 · dup-title scan (c46): 18,577 ACTIVE products share non-unique titles; 84% generic/template
Read-only. 3,285 ACTIVE titles shared across >1 handle (18,577 products); ~84%
(2,771) are GENERIC/template titles (vendor+material only — Versace Wallcovering
x99, Roberto Cavalli x149, Coordonne Durable Vinyl x366) — verified distinct real
products (distinct SKU handles) never differentiated by pattern+color. SEO
cannibalization + poor shopper differentiation. NOT accidental dup products
(fleet-dedup handled those). Fix = title-enrichment from existing pattern/color
data; GATED (title rewrite = customer-facing at scale, per banned-word rule).
5d9d562 · 2026-06-16 · live-price canary HARDENED (c45): retry/backoff + N=250 → UNKNOWN 20%→0.4%, number corrected
Hardened the c38 pilot into a promotable standing canary. retry/backoff cut
UNKNOWN from 30/150 (20%) to 1/245 (0.4%). Tighter+corrected number: SAMPLE_ONLY
43.7% / HAS_REAL 56.3% / NO_PRICE 0% (c38's noisy 59/40 was inflated by its high
UNKNOWN). Writes data/latest.json (c34 heartbeat shape); verdict PASS (FAIL if
NO_PRICE spikes — a blank-price regression the broken mirror can't catch).
ac592b1 · 2026-06-16 · broken-image scan (c44): PASS — 0% broken on 117-sample (image loadability healthy)
Read-only live products.json + CDN HEAD with retry/backoff. Prior cycles checked
image PRESENCE; this checks LOADABILITY. 120 sampled, 117 decided: OK=117,
BROKEN=0, NO_IMAGE=0, PDP_404=3 (known mirror-status lag, c23). Broken rate 0%
(95% CI <~3% by rule-of-three). Negative result — rules out a broken-image
problem. Shippable as a standing canary via the c34 harness.
b10bbb7 · 2026-06-16 · dark-vendor check (c43): 4 vendors fully DARK (not mis-collected) — 1,943 products
Read-only. c42's all-empty-collection vendors resolved: Colefax&Fowler (361),
Carlisle & Co. Walls (441), 1838 Wallcoverings (467 DRAFT+14 arch), Paul Montgomery
(656) = 1,943 products. All have empty live collections + sample PDPs 404 live +
mirror 100% archived/draft → CATALOG-DARK, not mis-collected. 1838 is DRAFT
(staged-never-launched, likeliest reactivation candidate); others archived.
Reactivation gated + needs cost-enrichment (c36: 1.4% archived cost coverage).
4aeca4e · 2026-06-16 · collection merge+301 map (c42): 28 empties->twin, 15 no-twin (some whole-vendor-empty)
Read-only. Turns c41's 43 empties into a merge proposal. 28 have a populated twin
(notably 18 phillipe-romano-* sub-collections -> phillipe-romano-1; clean ones
china-seas-fabrics->china-seas, ralph-lauren-fabrics->ralph-lauren, gold-wallpaper
->gold-wallcoverings). ~6 twins are generic/cross-category (paul-montgomery-murals
->murals, kravet-contract-1->kravet, york->brewster-york) = VERIFY before 301.
15 no-twin: 3 leaks/gone (wallquest, nicolette-mayer x2, stacy-garcia) + a deeper
signal — Colefax&Fowler, Carlisle, 1838, Paul-Montgomery have ALL collections
empty (products dark/unpublished or mis-collected). All merges GATED + per-pair verify.
d32d8a1 · 2026-06-16 · orphan-collection LIVE re-scan (c41): TRUE empty count = 43 (c39's 4 was a feed-stale undercount)
Read-only, retry/backoff. c40 proved collections.json products_count is stale, so
c39 undercounted empties. Live per-collection products.json: 43 EMPTY (0 live), 27
near(<4), 507 ok(4+), 1 unknown of 578. Suspected products.json was a Boost
false-zero, but cross-checked the authoritative Boost PFS API (collection_scope by
id) — it ALSO returns 0 for samples, and 507/578 populate fine via the same probe,
so the 43 are REAL empties (stale feed count had masked them). Many are duplicate-
handle pairs (carlisle-co/carlisle-and-company, colefax-fowler/colefax-and-fowler,
nicolette-mayer x2). 3 leak collections persist (wallquest + nicolette-mayer x2).
c97eb92 · 2026-06-16 · collection-leak sweep (c40): 3 confirmed collection-level leaks + Brewster false-positive + stale-count catch
Read-only live sweep of 578 collections vs private-label denylist. 4 raw hits;
after live verification: CONFIRMED leaks = wallquest-wallcoverings (0 live),
nicolette-mayer + nicolette-mayer-designs (0 live but public, must-stay-off names).
FALSE POSITIVE = brewster-york (1,010 products, but vendor=Daisy Bennett, a legit
brand under the Brewster&York distributor; 'brewster' denylist term too broad).
Methodology catch: collections.json products_count is STALE (NM showed 214, live=0)
so c39's orphan scan undercounted empties — empty detection must use live
products.json. NM products correctly 0-live (no reactivation regression); leak is
collection-name residue. Fixes gated.
fc12f52 · 2026-06-16 · orphan-collection scan (c39): 4 empty live collections + a WallQuest leak
Read-only live /collections.json. 578 collections; 4 EMPTY (0 products, all HTTP
200 = dead nav): gold-wallpaper, phillipe-romano-all-wallcoverings, stacy-garcia,
wallquest-wallcoverings. wallquest-wallcoverings is ALSO a private-label LEAK
(WallQuest must never be customer-facing → Malibu) — empty AND leaking, top
priority. 10 near-empty (<3). Fixes (hide/merge/unpublish) are gated prod writes.
3acda5c · 2026-06-16 · live-price pilot (c38): storefront crawl — true displayed-price, independent of broken mirror
Read-only GETs of /products/<handle>.json on 150 random ACTIVE handles (117
decided). Confirms c37: NO_PRICE (blank/$0) is ~0.9%, NOT the mirror's 70% (that
was an artifact). Customer-facing picture: 59% display ONLY the $4.25 sample, 40%
show a real roll >$4.25 — sizes the live impact of the sample-split remodel from
the shopper's view (GMC measured feed-side only). 30/150 UNKNOWN = needs retry/
backoff hardening before standing-canary promotion. Warranted as a live-price
canary (the only honest measure since the mirror price col is unreliable).
ccfaa8a · 2026-06-16 · null-price live-check (c37): mirror price column unreliable; no blank/$0 epidemic
Read-only. ACTIVE shows 41,987/60,075 (70%) null price in the Mac2 mirror, but a
live storefront cross-check proves those products DO have variant prices ($4.25
sample, +real roll where applicable). The mirror price column is only ~30%
populated (split-brain — not in the replicated set), so it cannot measure live
mispricing and NO DB-side price canary may trust it. The real live issue is the
already-known $4.25-sample-as-displayed-price (GMC, 60,455), not a distinct
null/$0 mode. Negative result + instrument caveat.
cb534c8 · 2026-06-16 · dark-inventory scan (c36): only 1,062 sellable-ready archived; cost is the limiter
Read-only. Of 85,993 archived/draft, only 1,062 are fully sellable-ready
(imaged+real-priced>4.25+costed) — because cost coverage on archived is just
1.4% (1,221 rows) and 79% have null/zero price. So the 82k archived CANNOT be
bulk-reactivated without cost re-enrichment. Split: 916 non-April + 146 April.
Top vendors Brunschwig 257/Jeffrey Stevens 249/Lee Jofa 224/Thibaut 119. EXCLUDE
before reactivating: Phillip Jeffries 18 (display-excluded), Nicolette Mayer 6
(hard-archived stay-off), Jeffrey Stevens 249 (likely disco per c8). Mirror-
approximate (c23 status lag).
f72b052 · 2026-06-16 · sitemap emergence sizing (c35): philipperomano fully generatable (8,229 URLs), novasuede Kamatera-only
Council #4. c27 found both flagship microsites lack a usable sitemap. Sizing:
neither is a Shopify products.json store — both are custom Next/Express sites.
philipperomano has local data/products.json (8,227 products) + a /p/:handle route,
so a valid sitemap (8,229 URLs, xmllint-clean, 965KB, one file) is generatable
from local data — PROOF written to yolo-queue, NOT deployed (route+deploy gated).
novasuede has no local project on Mac2 (Kamatera-only); ~153 colorways, fix is
Kamatera-side.
e3d61c1 · 2026-06-16 · canary promotion harness (c34): stage 5 new canaries as install-ready launchd packages
Inventory found this run's read-only canaries are loose one-offs (no plist) while
15 prior-gen com.steve.* canaries are wired. promote-canary.sh generates, per
canary, a plist + heartbeat-writing run wrapper + dw-canary-watchdog manifest row
+ INSTALL.txt — staged only, never bootstrapped (Steve-gated). Staged 5 shippable:
handle-freshness (daily), tls-expiry/robots-sitemap/metafield-coverage/alt-text
(weekly). Heartbeat stamp convention matches the meta-watchdog (stamp>artifact).
Correction: dw-backup-canary/restore-rehearsal/meta-watchdog ARE loaded (council
claimed otherwise).
150b6a1 · 2026-06-16 · specs pattern-crosswalk probe (c33): PARTIAL feasibility + structural ceiling
Read-only follow-up to c32. Width/material are per-pattern, so pattern_name (100%
populated both sides) can bridge the SKU-namespace gap WITHOUT exact-SKU. Coverage:
Clarke 288/1392 (21%), Coordonné 451/1320 (34%) live products. Ceiling is
structural — vendor-direct catalog is wallpaper-only (CCW), so it can't cover the
1,028 distributor-imported Clarke fabrics (F#). Path: pattern-crosswalk for the
partial free win + distributor (Cowtan) re-scrape for the rest.
83eb6fa · 2026-06-16 · specs-reparse sizing (c32): the data exists but won't join — SKU-namespace mismatch
Read-only sizing of council idea #1. Per-vendor *_catalog tables carry ~100%
width (+ vendor-varying material), but the live Shopify products were imported
via distributor channels (Cowtan F#/W#.CAC.0) while the catalog was scraped
vendor-direct (Clarke CCW####) — naive mfr_sku join matches ~0 (Clarke 0,
Coordonne 0, LeeJofa 1, Brunschwig 4; Gaston 55, Osborne 50). Width isn't
constant either (Coordonne bimodal 19.7in papers vs 157in murals). So the specs
gap is a SKU-crosswalk/channel-reconciliation problem, NOT a cheap DB push.
c79083c · 2026-06-16 · enrichment-board: local synthesis of c26/c28/c29/GMC into one ranked vendor×axis board
Cycle-30 (/bin/zsh, no new scan). Joins metafield-coverage (specs/images/color),
alt-text-coverage, and GMC $4.25 worklist per repped vendor; ranks by total
products-needing-work. Result: specs is the dominant gap (TOP fix for ~all
repped vendors); Clarke & Clarke 3,573 leads, then Gaston Y Daniela/China Seas/
Coordonné/Lee Jofa/Brunschwig; Wolf Gordon is the lone alt-led vendor. Phillip
Jeffries excluded from ranking (display-excluded by rule).
5c719ab · 2026-06-16 · schu roll-adds: complete all 81 (41 clean + 36 edge + 4 oddball); make edge script idempotent across cap-blocked partial runs
Edge bug: a prior cap-blocked run renamed Title->Size/Default Title->Sample but
died before creating the Roll variant; created.json only records after a
successful create, so re-runs found no 'Default Title' and skipped all 36.
Fix: handle already-renamed (Size:Sample) state + skip(roll exists) guard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fabc295 · 2026-06-16 · alt-text coverage audit: repped-vendor image alt-text (read-only GraphQL)
Cycle-29 read-only canary; image-QUALITY companion to c26 presence (~100%).
Per ACTIVE product: all-alt/some-alt/no-alt + image-level alt%. Result: weighted
repped all-alt 77.6% (89.x% excluding display-excluded Phillip Jeffries, whose
2,470 no-alt are by-design). Real fixable gaps: Wolf Gordon, China Seas, Maya
Romanoff, Graham & Brown, Elitis, Romo, Harlequin. Cross-finding: Clarke & Clarke
100% alt but 0% specs (c28) — enrichment axes independent.
d9c8874 · 2026-06-16 · metafield-coverage: harden specs check w/ global.width + pillow.* fallbacks (c28)
Accept width from custom.width/global.width/pillow.width_inches/pillow.dimensions
and material from custom.material/global.Contents/pillow.face_content; track
specs-strict (custom-only, c26) alongside to expose namespace artifacts. Result:
Scalamandre 0%->98.1% (the lone artifact, removed from gap list); all 12 remaining
repped gaps confirmed TRUE (specs==strict, fallbacks found nothing). Fixed a
GraphQL PARSE_ERROR from a // comment inside the query string (GraphQL uses #).
30b9b80 · 2026-06-16 · robots/sitemap fleet canary: crawl-directive + sitemap health (read-only)
Cycle-27 read-only canary (uncovered SEO/indexing gap). Per core fleet host,
GETs /robots.txt + /sitemap.xml: flags a Googlebot-effective Disallow:/ (UA
precedence-aware), missing/invalid/empty/stale sitemaps, sitemap-not-in-robots.
Result: NO site-wide block anywhere (good); 3 real FAILs (philipperomano 404,
novasuede serves HTML-as-sitemap, raffia parked/broken), 7 no-lastmod WARNs.
Hardened mid-cycle: blocksGooglebot() honors UA-group precedence + relative
Sitemap: URLs resolved against base (killed 2 false positives before reporting).
acaeef7 · 2026-06-16 · metafield-coverage audit: repped-vendor specs/images/color coverage (read-only GraphQL)
Cycle-26 read-only canary. Scans ACTIVE Shopify products, counts per-vendor
coverage of image (>=1/>=3), specs (custom.material+width), color-enrichment
(custom.color_hex/color_details), pattern_name metafields; tags repped vendors
from vendor_registry (active + non-private-label + discount_confirmed). Result:
images 100% + color 100% (solved), specs 51.9% weighted = the real gap, 13
repped vendors <60%. Price coverage tracked separately via GMC scan.
3343eea · 2026-06-16 · harden 3 read-only canaries (DTD-A 3/3): dynamic-dated reports + best-effort CNCP alert on FAIL
- Fix hardcoded 2026-06-16 output filename → dynamic ${today} so a scheduled
  run can't clobber a prior day's report or stamp a stale date.
- Wire a timeout-bounded, never-throws CNCP parking-lot alert on FAIL (these
  canaries previously only console.log'd — a 3am FAIL was silently written to
  a JSON nobody reads).
- queue-slo alert gated on !STALE && live-backup so the by-design Mac2 frozen-
  mirror STALE doesn't cry-wolf every run.
Smoke-tested tls-expiry: PASS, 15 hosts, dynamic date confirmed.
0607790 · 2026-06-16 · Availability-drift canary: built, tested, found INVALID-as-is for DW (negative result)
DTD-voted (2/3). variant.available conflates DW's trade/memo-sample inquiry model
(~97% of ACTIVE products are inquiry-only by design → available=false) with real
stockouts — would cry wolf. Store confirmed UP (shop-wide /products.json 250/250
buyable). Script header marked INVALID-AS-BUILT, not wired. Real sub-signal: ~3-18%
mirror→live handle 404 drift (data-quality). Honest negative result.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
30e9dc1 · 2026-06-16 · DRAFT reactivation staging plan (report-only, tiered, batched)
2,494 sellable DRAFTs (image+not-Nicolette+not-disco) → tiered T1/T2/T3, batched
1k/day, same pattern + stage-time gate as April plan. Malibu 1,632 + 1838 Walls
467 dominate. Sets inventory=2026 on both variants on activation. NO writes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

File tree

303 files tracked. Click any to browse the source at HEAD.

Other build journals

← Dw Width Fix  ·  all 4 projects  ·  Dwha Harlequin Onboard →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 9ms