[object Object]

← back to Designer Wallcoverings

Pierre Frey LAUNCH via cadence: vendors.js sampleOnly entry + activate-gated quote-only bypass (quotes tag -> activate w/ null price) + dedicated drip wrapper; first 15 promoted live (ACTIVE 3->18)

b10f1ac84621576c19aec28aef525a63ed1e2a99 · 2026-07-07 14:42:18 -0700 · steve@designerwallcoverings.com

Files touched

Diff

commit b10f1ac84621576c19aec28aef525a63ed1e2a99
Author: steve@designerwallcoverings.com <steve@designerwallcoverings.com>
Date:   Tue Jul 7 14:42:18 2026 -0700

    Pierre Frey LAUNCH via cadence: vendors.js sampleOnly entry + activate-gated quote-only bypass (quotes tag -> activate w/ null price) + dedicated drip wrapper; first 15 promoted live (ACTIVE 3->18)
---
 shopify/scripts/cadence/activate-gated.js            | 11 ++++++++---
 shopify/scripts/cadence/pierre-frey-activate-drip.sh | 17 +++++++++++++++++
 shopify/scripts/cadence/vendors.js                   | 14 ++++++++++++++
 3 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/shopify/scripts/cadence/activate-gated.js b/shopify/scripts/cadence/activate-gated.js
index 581c3cba..bd1247d8 100644
--- a/shopify/scripts/cadence/activate-gated.js
+++ b/shopify/scripts/cadence/activate-gated.js
@@ -145,7 +145,7 @@ function candidates(table, limit) {
 }
 
 const STATUS_Q = `query($ids:[ID!]!){nodes(ids:$ids){... on Product{
-  id status title descriptionHtml
+  id status title descriptionHtml tags
   images(first:50){nodes{url}}
   variants(first:10){nodes{price sku}}
   metafields(first:60){nodes{namespace key value}}
@@ -181,9 +181,14 @@ const SL = 'single_line_text_field';
         if (!n) continue;
         if (n.status === 'ACTIVE') { alreadyActive++; continue; }
         if (n.status !== 'DRAFT') { skippedArchived++; continue; } // ARCHIVED → leave
-        // PRICE gate on the live product: a real per-unit price > the $4.25 sample
+        // PRICE gate on the live product: a real per-unit price > the $4.25 sample.
+        // EXCEPTION — quote-only lines (Pierre Frey, Dedar, …) legitimately have NO roll
+        // price (only the $4.25 sample) and activate quote-only: NULL price + `quotes` tag.
+        // They carry the `quotes` tag, so bypass the real-price requirement for them; ALL
+        // other gates (specs + real description + image + sample variant) still apply.
         const hasRealPrice = (n.variants?.nodes || []).some(v => parseFloat(v.price) > 4.25);
-        if (!hasRealPrice) { skippedArchived++; continue; }
+        const isQuoteOnly = (n.tags || []).includes('quotes');
+        if (!hasRealPrice && !isQuoteOnly) { skippedArchived++; continue; }
         // FULL ACTIVATION GATE (Steve 2026-06-20): specs + real description + ALL
         // vendor images + title guards + sample variant. Built from the LIVE product
         // (images/metafields/body) cross-checked against the vendor row's all_images.
diff --git a/shopify/scripts/cadence/pierre-frey-activate-drip.sh b/shopify/scripts/cadence/pierre-frey-activate-drip.sh
new file mode 100755
index 00000000..b16f4a1b
--- /dev/null
+++ b/shopify/scripts/cadence/pierre-frey-activate-drip.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+# Pierre Frey quote-only LAUNCH drip (Steve "launch on the cadence schedule" 2026-07-07).
+# Promotes gate-passing DRAFT Pierre Frey products (quote-only: $4.25 sample + NULL price +
+# `quotes` tag) to ACTIVE, in bounded batches, via the shared activate-gated.js gate.
+# The gate (specs + real description + image + sample variant) still applies; the quote-only
+# `quotes`-tag bypass of the real-price requirement is what lets these activate. Un-ready
+# (e.g. enrichment-incomplete) rows are left DRAFT and retried next tick.
+set -u
+# launchd runs with a minimal PATH — node (/usr/local/bin) + psql (homebrew) aren't on it.
+export PATH="/usr/local/bin:/opt/homebrew/bin:/opt/homebrew/opt/postgresql@14/bin:$PATH"
+SHOP="$HOME/Projects/Designer-Wallcoverings/shopify"
+cd "$SHOP" || exit 1
+LOG="/tmp/dw-pierre-frey-activate.log"
+LIMIT="${PF_ACTIVATE_LIMIT:-60}"
+echo "=== $(date) pierre-frey activate drip (limit $LIMIT) ===" >> "$LOG"
+node scripts/cadence/activate-gated.js --vendor "Pierre Frey" --limit "$LIMIT" --commit >> "$LOG" 2>&1
+echo "exit $? at $(date)" >> "$LOG"
diff --git a/shopify/scripts/cadence/vendors.js b/shopify/scripts/cadence/vendors.js
index c6ff4e8e..713fdf39 100644
--- a/shopify/scripts/cadence/vendors.js
+++ b/shopify/scripts/cadence/vendors.js
@@ -186,4 +186,18 @@ module.exports = {
                         imageOverride: 'https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PhillipJeffriesLogo_3266367c-1ae8-48d5-8b02-d033802bee77.png?v=1722462657',
                         soldBy: 'Sample', productType: 'Wallcovering',
                         note: 'DRAFT-only drip, held unpriced until PJ cost confirmed (Steve 2026-06-30). NEVER pass --activate for PJ. Logo image only; dedup-clean net-new in pj_draft_catalog (DWPJ-14511+).' },
+
+  // ── Pierre Frey — quote-only samples LAUNCH via cadence drip (Steve "launch" 2026-07-07) ──────
+  // Full pierrefrey.com/en/wallpapers scrape (1,161 SKUs, DWPF-, its own pierre_frey_catalog table)
+  // imported as DRAFT quote-only. UNLIKE PJ (draftOnly, held), Pierre Frey is CLEARED TO ACTIVATE:
+  // it is quote-only (no cost — pierrefrey.com shows no price), so it activates with a $4.25 Sample
+  // variant + NULL product price + `quotes` tag (the price-agnostic validate-before-activate gate
+  // permits null price; it requires specs+description+image+sample only). Activation drips via a
+  // dedicated scheduled job (com.steve.dw-pierre-frey-activate → activate-gated.js --vendor "Pierre
+  // Frey" --limit N --commit); each tick promotes whatever now passes the gate (real ai_description
+  // from enrichment clears the "description too short" check). sampleOnly:true keeps it OUT of the
+  // priced-import cadence and HELD from the sampleonly IMPORT drip by default — this entry is used
+  // by activate-gated.js (which reads the same vendors.js) to recognize + promote the drafts.
+  'Pierre Frey': { table: 'pierre_frey_catalog', sampleOnly: true, soldBy: 'Sample', productType: 'Wallcovering',
+                   note: 'Quote-only samples LAUNCH (Steve 2026-07-07). No cost (pierrefrey.com shows no price) → activates quote-only: $4.25 Sample + NULL price + quotes tag. Drip-activated via com.steve.dw-pierre-frey-activate; held from the sampleonly IMPORT drip (already imported as DRAFT).' },
 };

← c428c621 auto-save: 2026-07-07T14:31:09 (6 files) — DW-Programming/Im  ·  back to Designer Wallcoverings  ·  pierre-frey import: deLabel strips leading Wallcovering pref 89a20838 →