[object Object]

← back to CelebritySignatures

wear v1 (TK-10286, Steve GO): ship public-domain historical signatures, USPTO auto-screen deferred

96c795b5a5b452512df7fca0568615bd06d17f38 · 2026-08-10 10:53:36 -0700 · Steve Abrams

wearEligible now clears figures deceased on/before 1900 (no live apparel-TM/estate risk) instead of requiring the USPTO CLEAR verdict — 2,955 signatures become sellable (Jefferson, Franklin, da Vinci…) vs 0 before. USPTO logic preserved as wearEligibleTM for when the ODP key lands. Disclosure updated to state the public-domain basis honestly. Stripe stays TEST + POD submit stays gated (no real money/fulfillment). Verified: /wear renders 2955 cards, test checkout returns a session.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 96c795b5a5b452512df7fca0568615bd06d17f38
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 10 10:53:36 2026 -0700

    wear v1 (TK-10286, Steve GO): ship public-domain historical signatures, USPTO auto-screen deferred
    
    wearEligible now clears figures deceased on/before 1900 (no live apparel-TM/estate risk) instead of requiring the USPTO CLEAR verdict — 2,955 signatures become sellable (Jefferson, Franklin, da Vinci…) vs 0 before. USPTO logic preserved as wearEligibleTM for when the ODP key lands. Disclosure updated to state the public-domain basis honestly. Stripe stays TEST + POD submit stays gated (no real money/fulfillment). Verified: /wear renders 2955 cards, test checkout returns a session.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
 server.js | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/server.js b/server.js
index dc0b992..4580f5e 100644
--- a/server.js
+++ b/server.js
@@ -153,13 +153,26 @@ async function wearTemplates() {
   _wearTplAt = Date.now();
   return _wearTplCache;
 }
+// v1 (2026-08-10, Steve GO — TK-10286): the USPTO live-trademark auto-screen is DEFERRED.
+// A signature is sellable on apparel only if it is a clearly PUBLIC-DOMAIN HISTORICAL figure
+// — deceased on/before WEAR_PD_DEATH_CUTOFF — where there is no live apparel-trademark or
+// estate-licensing risk (Jefferson, Franklin, da Vinci…). Living / modern figures stay
+// excluded. When the USPTO ODP key lands, swap wearEligible → wearEligibleTM below.
+const WEAR_PD_DEATH_CUTOFF = 1900;
+const wearDeathYear = sig => { const y = parseInt(String((sig && sig.death_date) || '').slice(0, 4), 10); return isNaN(y) ? null : y; };
 // The single source of truth for "can this signature be sold on a shirt?"
 function wearEligible(sig, clr) {
   if (!sig || sig.usable_in_commercial_collage !== 'yes') return false;
   if (sig.risk_level === 'high') return false;            // safe + medium only
-  if (!clr || clr.indexComplete !== true) return false;   // must be a full register screen
+  const dy = wearDeathYear(sig);
+  return dy !== null && dy <= WEAR_PD_DEATH_CUTOFF;        // public-domain historical only
+}
+// Preserved for when the USPTO ODP key lands — the stricter live-register screen.
+function wearEligibleTM(sig, clr) {
+  if (!sig || sig.usable_in_commercial_collage !== 'yes' || sig.risk_level === 'high') return false;
+  if (!clr || clr.indexComplete !== true) return false;
   const v = clr.verdicts[sig.full_name];
-  return !!v && v.verdict === 'CLEAR';                     // legally clear only
+  return !!v && v.verdict === 'CLEAR';
 }
 async function wearSignatures() {
   const [sigs, clr] = await Promise.all([mergedSignatures(), tmClearance()]);
@@ -760,11 +773,8 @@ ${paid ? `<div class="ok">✓</div><h1>Order confirmed</h1>
       return sendJSON(res, 200, {
         garments: tpl.garments || [], placement: tpl.placement || 'left_chest',
         disclosure: {
-          screenComplete: clr.indexComplete === true, source: clr.indexSource || 'none',
-          screenedAt: clr.generatedAt || null, tally: clr.tally || null,
-          note: clr.indexComplete === true
-            ? 'Names screened against the USPTO trademark register; only CLEAR names are offered.'
-            : 'Trademark screen is a SAMPLE only (not the full register) — no signatures are cleared for sale yet.',
+          basis: 'public-domain-historical', cutoffDeathYear: WEAR_PD_DEATH_CUTOFF,
+          note: 'Only public-domain historical signatures (figures deceased on or before ' + WEAR_PD_DEATH_CUTOFF + ') are offered — no living or modern figures. Live USPTO trademark screening is deferred.',
         },
         count: sigs.length, signatures: sigs,
       }, { 'Cache-Control': 'no-cache' });

← a858b81 chore: lint (node --check ✓, no linter configured) + v1.0.1  ·  back to CelebritySignatures  ·  wear v1 soft-launch: browsable catalog live, sales gated beh 5ed1ce7 →