[object Object]

← back to Wallco Ai

etsy pipeline: brand → Fentucci Designs (was Designer Wallcoverings) in single-listing footer + bundle footer + intro line

f32ecb63a23cf59488aab6b70404b3e849874c07 · 2026-05-28 07:38:45 -0700 · Steve Abrams

Files touched

Diff

commit f32ecb63a23cf59488aab6b70404b3e849874c07
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu May 28 07:38:45 2026 -0700

    etsy pipeline: brand → Fentucci Designs (was Designer Wallcoverings) in single-listing footer + bundle footer + intro line
---
 public/admin/cactus-curator.html | 44 ++++++++++++++++++++++++++++++++++++++--
 scripts/export-etsy-digital.js   |  4 ++--
 scripts/generate-etsy-bundles.js |  4 +++-
 3 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/public/admin/cactus-curator.html b/public/admin/cactus-curator.html
index 0c0add9..6751681 100644
--- a/public/admin/cactus-curator.html
+++ b/public/admin/cactus-curator.html
@@ -1004,6 +1004,7 @@ load();
         <span id="hmtitle" style="flex:1;text-align:center;color:#aaa">—</span>
         <span id="hmsel" style="color:#ffd0d0">0 regions</span>
         <button id="hmheal" style="background:#3b2e08;color:#f0b400;border:1px solid #5a4710;padding:7px 16px;font-weight:800;border-radius:8px;cursor:pointer">⚕ Heal selected</button>
+        <button id="hmregen" style="background:#1d2c3b;color:#7ec8ff;border:1px solid #365778;padding:7px 16px;font-weight:800;border-radius:8px;cursor:pointer" title="re-run the original prompt with a new seed — guaranteed clean lines (heal can degrade quality on flat designs)">⟲ Regenerate</button>
         <button id="hmaccept" style="background:#2a6b35;color:#fff;border:0;padding:7px 16px;font-weight:800;border-radius:8px;cursor:pointer" disabled>✓ Accept</button>
         <button id="hmclose" style="background:#3a2222;color:#ffdada;border:1px solid #663;padding:7px 14px;font-weight:700;border-radius:8px;cursor:pointer">✕ Close</button>
       </header>
@@ -1018,6 +1019,7 @@ load();
     modal.querySelector('#hmclose').onclick = closeModal;
     modal.querySelector('#hmback').onclick = back;
     modal.querySelector('#hmheal').onclick = heal;
+    modal.querySelector('#hmregen').onclick = regenerate;
     modal.querySelector('#hmaccept').onclick = accept;
     wireDraw();
     return modal;
@@ -1084,12 +1086,17 @@ load();
     if (modal) modal.style.display = 'none';
     original = current = null; history = []; manual = [];
   }
+  // Heal returns ok even when the result is QUALITY-DEGRADED (SDXL inpaint on a
+  // flat-screen-print tile often produces a worse seam than the original). Steve
+  // rule: "100% clean lines always — it cannot look fixed." So we compare
+  // scan_after vs scan_before, and if the heal degraded the tile, we auto-fall
+  // back to ⟲ Regenerate (which re-rolls from the original prompt instead).
   async function heal() {
     if (!manual.length) { flash('drag on image to mark a region first'); return; }
     const btn = modal.querySelector('#hmheal'); const orig = btn.textContent;
     btn.disabled = true; btn.textContent = `⚕ healing ${manual.length}…`;
     const status = modal.querySelector('#hmfoot');
-    status.textContent = `inpainting ${manual.length} region(s) on #${current} via Replicate (~3-8s)…`;
+    status.textContent = `inpainting ${manual.length} region(s) on #${current} via Replicate (~10-15s)…`;
     try {
       const r = await fetch(q(`/api/seam-debug/${current}/heal`), {
         method:'POST', headers:{'Content-Type':'application/json'},
@@ -1097,15 +1104,48 @@ load();
       });
       const j = await r.json();
       if (!r.ok || !j.ok) throw new Error(j.error || ('HTTP ' + r.status));
+      const before = j.scan_before?.scores?.overall_max, after = j.scan_after?.scores?.overall_max;
+      const degraded = Number.isFinite(before) && Number.isFinite(after) && after > before + 0.3;
+      if (degraded) {
+        // Don't push degraded heal onto the history — discard it. Auto-fall back
+        // to regenerate so the curator never has to manually undo + click again.
+        status.innerHTML = `⚠ heal degraded the tile (overall_max ${before.toFixed(2)} → ${after.toFixed(2)}) — discarding and ⟲ regenerating from the original prompt instead…`;
+        await regenerate({ silent: true });
+        return;
+      }
       history.push({ id: current, boxes: manual.slice() });
       showId(j.new_id);
-      status.textContent = `✓ heal #${j.new_id} ready — ⚕ heal again to refine, ↺ Back to revert, or ✓ Accept to replace original #${original}`;
+      status.textContent = `✓ heal #${j.new_id} (overall_max ${before?.toFixed(2)} → ${after?.toFixed(2)}) — ⚕ heal again, ↺ Back, or ✓ Accept`;
     } catch (e) {
       status.textContent = '✗ heal failed: ' + e.message;
     } finally {
       btn.disabled = false; btn.textContent = orig;
     }
   }
+  // ⟲ Regenerate — re-runs generate_designs.js with the original prompt + new
+  // seed. Always produces clean lines (no inpaint stitching). Used as a manual
+  // option AND as the auto-fallback when heal degrades quality.
+  async function regenerate({ silent = false } = {}) {
+    const btn = modal.querySelector('#hmregen'); const orig = btn.textContent;
+    btn.disabled = true; btn.textContent = '⟲ regenerating…';
+    const status = modal.querySelector('#hmfoot');
+    if (!silent) status.textContent = `re-rolling #${current} from the original prompt with a new seed (~30-60s)…`;
+    try {
+      const r = await fetch(q(`/api/seam-debug/${current}/regenerate`), {
+        method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}',
+      });
+      const j = await r.json();
+      if (!r.ok || !j.ok) throw new Error(j.error || ('HTTP ' + r.status));
+      history.push({ id: current, boxes: manual.slice() });
+      manual = [];
+      showId(j.new_id);
+      status.textContent = `✓ regenerated #${j.new_id} — ⟲ again for another roll, ↺ Back to revert, ✓ Accept to replace original #${original}`;
+    } catch (e) {
+      status.textContent = '✗ regenerate failed: ' + e.message;
+    } finally {
+      btn.disabled = false; btn.textContent = orig;
+    }
+  }
   function back() {
     const prev = history.pop(); if (!prev) return;
     showId(prev.id);
diff --git a/scripts/export-etsy-digital.js b/scripts/export-etsy-digital.js
index ffe46ee..51f3183 100644
--- a/scripts/export-etsy-digital.js
+++ b/scripts/export-etsy-digital.js
@@ -117,7 +117,7 @@ function deriveDescription(d, title, pxOut) {
     '',
     'INSTANT DOWNLOAD · This listing is for a digital file only. No physical product ships.',
     '',
-    `🎨 A seamless wallpaper tile from the Designer Wallcoverings AI-original archive. Every pattern is unique — never repeated, never resold.`,
+    `🎨 A seamless wallpaper tile from the Fentucci Designs archive. Every pattern is unique — never repeated, never resold.`,
     '',
     `📐 What you get:`,
     `• ${dpiNote}`,
@@ -140,7 +140,7 @@ function deriveDescription(d, title, pxOut) {
     '',
     `⚠️ Personal use only. Do not redistribute, resell, or claim the design as your own.`,
     '',
-    `Designed by Designer Wallcoverings · designerwallcoverings.com`,
+    `— Fentucci Designs`,
   ].join('\n');
 }
 function deriveTags(d, title) {
diff --git a/scripts/generate-etsy-bundles.js b/scripts/generate-etsy-bundles.js
index d20545f..4476a4c 100644
--- a/scripts/generate-etsy-bundles.js
+++ b/scripts/generate-etsy-bundles.js
@@ -254,7 +254,9 @@ function bundleCopy(name, n, designs) {
     '',
     `📂 Delivered as a single ZIP via Etsy's automatic download after purchase.`,
     '',
-    `Curated from the Designer Wallcoverings AI-original archive — every pattern unique, never repeated. Browse more at designerwallcoverings.com.`,
+    `Curated from the Fentucci Designs archive — every pattern unique, never repeated.`,
+    ``,
+    `— Fentucci Designs`,
   ].join('\n');
   return { title, description, tags, price };
 }

← b962080 heal: drop SDXL-inpaint strength 0.95 -> 0.7 (blend with sur  ·  back to Wallco Ai  ·  etsy pipeline brand: Fentucci Digital Packs (final). 4 refer 243bd61 →