{"slug":"pattern-vault","total":89,"limit":100,"offset":0,"since":null,"commits":[{"hash":"b6d0086","date":"2026-07-27 06:36:02 -0700","author":"Steve Abrams","subject":"design-trend-scout: refresh trend board 2026-07-27 (tiger-replaces-leopard #1, check family + Art Nouveau + Maxi Floral lanes, equestrian window aging, 70s-geo downgraded)","body":""},{"hash":"3bbd6c6","date":"2026-07-23 08:28:23 -0700","author":"Steve","subject":"auth: accept second admin user dbrown","body":""},{"hash":"8f62235","date":"2026-07-22 21:51:52 -0700","author":"Steve Abrams","subject":"fix: front-page H1 was leaking 'Fernwick Studio' (a designer persona) as the storefront brand — restore 'The Pattern Vault'","body":""},{"hash":"f053b3d","date":"2026-07-20 06:35:18 -0700","author":"steve@designerwallcoverings.com","subject":"design-trend-scout: refresh trend board 2026-07-20 (correct Year-of-Horse timing, +checkerboard lane, reframe nursery)","body":""},{"hash":"a337213","date":"2026-07-16 10:27:38 -0700","author":"Steve","subject":"chore: lint, refactor, v0.2.3 (session close)","body":""},{"hash":"42412e9","date":"2026-07-16 10:06:57 -0700","author":"Steve Abrams","subject":"spoonflower: default to Browserbase cloud (no local Chrome); local fallback uses isolated bundled Chromium not real Chrome; drop real-Chrome manual helper per Steve","body":""},{"hash":"c528dae","date":"2026-07-16 09:39:07 -0700","author":"Steve Abrams","subject":"spoonflower: add rung-3 Browserbase upload path (SF_BROWSERBASE=1) — cloud Chrome, residential proxy + native captcha/Cloudflare solve, fresh login; smoke-verified CF clears","body":""},{"hash":"ee917f9","date":"2026-07-16 09:33:34 -0700","author":"Steve Abrams","subject":"spoonflower: add plain-real-Chrome manual-login fallback (sf_login_manual.sh + capture --manual) for when Cloudflare bounces the automated path","body":""},{"hash":"958c6be","date":"2026-07-16 09:24:58 -0700","author":"Steve Abrams","subject":"spoonflower: drive real Chrome (channel:chrome) w/ persistent profile + webdriver-hiding instead of bundled Chromium, to clear Cloudflare","body":""},{"hash":"378dec5","date":"2026-07-13 06:53:22 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-13T06:53:18 (2 files) — data/trend-board.json memos/trend-board.md","body":""},{"hash":"7dbc8b4","date":"2026-07-09 22:23:32 -0700","author":"Steve","subject":"wpb-uploaders: control panel (:9813) — click-to-launch per-platform login/dry-run/verify, live status","body":""},{"hash":"a0ae52d","date":"2026-07-09 22:19:10 -0700","author":"Steve","subject":"capture-session: WebKit (Safari engine) default per Steve; cookies are engine-portable","body":""},{"hash":"71d3222","date":"2026-07-09 22:17:12 -0700","author":"Steve","subject":"capture-session: authoritative session probe (load account page in-context, verify real markers) instead of login-page DOM guessing","body":""},{"hash":"4b93b71","date":"2026-07-09 19:13:06 -0700","author":"Steve","subject":"capture-session: require POSITIVE auth marker (kill false-positive) + 15s time guard","body":""},{"hash":"6800cc2","date":"2026-07-09 19:10:09 -0700","author":"Steve","subject":"capture-session: robust login detect (no-password-field + domain) + 10min + auto-raise window","body":""},{"hash":"bd366e3","date":"2026-07-09 19:01:30 -0700","author":"Steve","subject":"capture-session: auto-detect login (poll for logged-in marker, no keypress) — works via ! prefix, 5-min timeout","body":""},{"hash":"b68bdf0","date":"2026-07-09 18:55:33 -0700","author":"Steve","subject":"gitignore: uploader sessions + ARMED runtime flags","body":""},{"hash":"e610955","date":"2026-07-09 18:55:33 -0700","author":"Steve","subject":"wpb-uploaders: generic session-capture (CM/Redbubble/Society6/Patternbank) — headed login → storageState, run by Steve","body":""},{"hash":"27a5610","date":"2026-07-09 18:22:49 -0700","author":"Steve","subject":"STATUS: Spoonflower WORKS (id 22723313 proven); note test artifact","body":""},{"hash":"f72c062","date":"2026-07-09 18:22:20 -0700","author":"Steve","subject":"SPOONFLOWER UPLOAD WORKS (real id 22723313 proven): late-consent dismiss after file registers + post-select evidence diagnostic; etsy payload corrected per verified v3 schema (tags mapped, invalid state/is_digital removed)","body":""},{"hash":"6662111","date":"2026-07-09 18:14:49 -0700","author":"Steve","subject":"wpb-uploaders: Etsy createDraftListing payload mapping + --dry-run (38 payloads, gated on OAuth+taxonomy); per-platform STATUS.md","body":""},{"hash":"7fb0d68","date":"2026-07-09 18:13:14 -0700","author":"Steve","subject":"spoonflower: proven filechooser selector + network-block consent vendors + iframe-aware dismiss + deep DOM diagnostic; next blocker = file doesn't register post-filechooser (needs headed session)","body":""},{"hash":"45745d8","date":"2026-07-09 18:11:39 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-09T18:11:36 (2 files) — whimsical-compare/daily/scripts/diagnose_sf_upload.js whimsical-compare/daily/scripts/upload_sf.js","body":""},{"hash":"0c248af","date":"2026-07-09 16:27:43 -0700","author":"Steve","subject":"daily_run: count only real-id uploads (dry-run id:null no longer reports phantom uploads) — contrarian fix","body":""},{"hash":"5542bd8","date":"2026-07-09 16:23:51 -0700","author":"Steve","subject":"wpb-uploaders: disarmed per-platform framework (etsy/CM/redbubble/society6/patternbank) — anti-bot base, fail-loud, Steve-gated arming","body":""},{"hash":"6393b54","date":"2026-07-09 16:21:29 -0700","author":"Steve","subject":"fernwick: fail-loud upload_sf (no false-green id:null), filechooser+consent upload path, daily_run false-green guard, read-only SF diagnostic","body":""},{"hash":"829fadb","date":"2026-07-08 10:35:18 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-08T10:35:15 (1 files) — whimsical-compare/daily/ARMED","body":""},{"hash":"44f3950","date":"2026-07-08 10:13:09 -0700","author":"Steve Abrams","subject":"fernwick: header comment 4/day (cadence rule codified in memory)","body":""},{"hash":"e83ceb4","date":"2026-07-08 10:12:17 -0700","author":"Steve Abrams","subject":"fernwick: throttle to 4 designs/day (Steve anti-bot rule: few + sporadic + human-typing)","body":""},{"hash":"0e635bd","date":"2026-07-08 09:04:58 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-08T09:04:55 (1 files) — whimsical-compare/daily/scripts/__pycache__/","body":""},{"hash":"db2ebec","date":"2026-07-08 08:52:39 -0700","author":"Steve Abrams","subject":"fernwick: daily drop generates whimsical+trending mix (--lanes both, FERNWICK_LANES override)","body":""},{"hash":"54f8025","date":"2026-07-08 08:52:05 -0700","author":"Steve Abrams","subject":"fernwick: wire trending-dw GAP lanes into the generator (--lanes trending|both)","body":"Connects the intelligence board to the generation pipeline: gen_daily.py can now generate in\nthe 8 settlement-safe GAP lanes that trending.designerwallcoverings.com flags as SELLING but\nthin in our catalog (Art-Deco Geometric, Animal-Skin Print, Texture-Effect, Boho, Paisley/\nNomadic, Abstract Blur, Retro Geometric, Mushroom/Goblincore) — 'make what's actually selling'\ninstead of only whimsical. Tropical deliberately EXCLUDED (closest to the DW settlement bone).\n--lanes whimsical (default) | trending | both. Records lane per design. Verified end-to-end:\n2 trending designs generated + settlement-passed (Boho kilim + rose-blush tiger stripes = the\nboard's #1 animal-print-with-a-twist pick), actual cost $0.0063."},{"hash":"3f91374","date":"2026-07-08 08:43:01 -0700","author":"Steve Abrams","subject":"fernwick: surface uploader-DEGRADED in the daily email (both silent-failure classes)","body":"report.js now reads the pre-flight health.json and, on DEGRADED, prepends a red banner +\nflags the subject line — so a moved-upload-page OR expired-session is loud in Steve's inbox,\nnot just buried in cron.out.log. Closes the 'silently broken, nobody noticed' loop end-to-end:\npre-flight check → run-dir health.json → daily email alert."},{"hash":"9efb375","date":"2026-07-08 08:41:47 -0700","author":"Steve Abrams","subject":"fernwick: add uploader health-check monitor + record the first 3 published designs","body":"The whole pipeline was silently broken for a long time (0 uploads) with TWO invisible\nfailures — expired session AND Spoonflower moving the upload page — and nothing caught it.\n- check_health.js: read-only monitor that verifies (a) session valid (not bounced to /login)\n  and (b) the /artists/designs/new file input is present. Exits 0=HEALTHY / 2=DEGRADED with a\n  reason. Catches both silent-failure classes; publishes nothing. Verified HEALTHY.\n- daily_run.sh: runs check_health as a pre-flight every run, logs uploader-health + writes\n  health.json to the run dir — so a silent break is now loud in cron.out.log.\n- spoonflower-uploads.json: recorded the first 3 real uploads (22712805/06/09, Fernwick Studio,\n  PRIVATE) that the direct upload_sf.js run didn't log."},{"hash":"6603026","date":"2026-07-08 08:34:52 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-08T08:34:49 (1 files) — package-lock.json","body":""},{"hash":"5903c70","date":"2026-07-08 08:29:13 -0700","author":"Steve Abrams","subject":"chore: v0.2.2 (session close) — Spoonflower uploader fix (uploader lint/refactor: clean, no changes)","body":""},{"hash":"4fc9047","date":"2026-07-07 16:38:33 -0700","author":"Steve Abrams","subject":"fernwick: fix Spoonflower uploader — upload page moved to /artists/designs/new","body":"The uploader targeted stale URLs (/en/upload, /upload, /design_upload) which are now\njust landing pages with an 'UPLOAD A DESIGN' link and NO file input — so every upload\nfailed with 'file input not found' and the pipeline published 0 designs despite running\ndaily. Spoonflower moved the real uploader to /artists/designs/new (confirmed: 1 hidden\ninput[type=file], accept image/jpeg,png). Fixed the URL list + wait for the input ATTACHED\n(it's hidden dropzone-style; setInputFiles drives hidden inputs). Dry-run now finds the\ninput for all 3 test designs (was 3/3 failed → 0 failed). Session valid, generator works."},{"hash":"3007363","date":"2026-07-07 13:12:58 -0700","author":"Steve Abrams","subject":"chore: v0.2.1 (session close)","body":""},{"hash":"e978c1f","date":"2026-07-07 07:25:08 -0700","author":"Steve Abrams","subject":"spoonflower daily: add headful session-capture script + move session to persistent path (~/.config, survives reboot) — session now captured for info@designerwallcoverings.com","body":""},{"hash":"cb3baaa","date":"2026-07-07 07:08:27 -0700","author":"Steve Abrams","subject":"spoonflower: switch upload/seller account to info@designerwallcoverings.com; printmurals becomes designer persona (docs + record annotation)","body":""},{"hash":"e6d0a44","date":"2026-07-04 13:28:05 -0700","author":"Steve Abrams","subject":"lead-collection: add PDL atelier-voice descriptions (descriptionPDL) for all 14 originals, AI-disclosed","body":""},{"hash":"7ad5188","date":"2026-07-04 13:23:23 -0700","author":"Steve Abrams","subject":"lead-collection: curated 14 in-house originals manifest (money-lane ranked, AI-disclosed copy) for patterndesignlab page-1 seed","body":""},{"hash":"11f60d9","date":"2026-07-04 11:00:36 -0700","author":"Steve Abrams","subject":"kits: add marketplace-compliant AI-generation disclosure to all 38 rows across all 3 kits (contrarian blocker fix)","body":""},{"hash":"71cadbe","date":"2026-07-04 10:10:08 -0700","author":"Steve Abrams","subject":"etsy: split compound tags into <=20-char atoms instead of dropping them (contrarian fix — was leaving 6 generic tags/listing; now min 7/avg 8.6)","body":""},{"hash":"1909be7","date":"2026-07-04 09:55:37 -0700","author":"Steve Abrams","subject":"etsy: auto-resolve digital-pattern taxonomy_id at wire-up (getSellerTaxonomyNodes) — removes the manual taxonomy step","body":""},{"hash":"d0febc9","date":"2026-07-04 09:50:47 -0700","author":"Steve Abrams","subject":"etsy: dry-run listing pipeline from kit CSV — 38 type=download draft payloads, OAuth-gated (safe until shop connected)","body":""},{"hash":"83df324","date":"2026-07-04 09:45:37 -0700","author":"Steve Abrams","subject":"signup-handoff: record Redbubble automated path (recon-proven, one gated command from go) + full-catalog kits","body":""},{"hash":"0cd4c2e","date":"2026-07-04 09:34:37 -0700","author":"Steve Abrams","subject":"gitignore embedded pod-signup repo (keep independent history out of parent index)","body":""},{"hash":"1aa9b2c","date":"2026-07-04 09:34:25 -0700","author":"Steve Abrams","subject":"kits: extend all 3 marketplace kits to full 38-design catalog (add 14 in-house originals), sanitize internal jargon from listing copy","body":""},{"hash":"fe41b86","date":"2026-07-03 08:08:09 -0700","author":"Steve","subject":"chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)","body":""},{"hash":"7a0948d","date":"2026-07-02 14:15:03 -0700","author":"Steve Abrams","subject":"Tema e Variazioni: 20 original b&w face-medallion tiles (our faces, whimsical variations) — IP-safe homage to Fornasetti format + /faces gallery on compare server","body":""},{"hash":"5ab1439","date":"2026-07-02 14:14:39 -0700","author":"Steve","subject":"pipeline: add groundColor mode to gen_briefs.py (front-load flat ground color + dark-bg negative + guidance 9.5) — codifies the chartreuse fix; set on deco brief","body":""},{"hash":"d9bd2b6","date":"2026-07-02 12:19:36 -0700","author":"Steve Abrams","subject":"fernwick daily drop: 20 settlement-passed originals/day, random-time 6am-6pm planner, human-like uploader (dry-run default), steve-office report via George; launchd wired","body":""},{"hash":"f338dc2","date":"2026-07-02 12:19:18 -0700","author":"Steve","subject":"Spoonflower: 12/14 designs proofed (graphic-designer gated); 2 held for seam faults","body":""},{"hash":"fad3685","date":"2026-07-02 12:17:58 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-02T12:17:53 (3 files) — whimsical-compare/daily/runs/2026-07-02-test/20260702test_01.png whimsical-compare/daily/runs/2026-07-02-test/20260702test_02.png whimsical-compare/daily/runs/2026-07-02-test/manifest.json","body":""},{"hash":"50fa4f0","date":"2026-07-02 12:14:18 -0700","author":"Steve","subject":"deco-01 v4: chartreuse ground achieved (RGB ~174,205,37), settlement PASS, added to spoonflower-ready — all 8 gap-lanes now print-prepped","body":""},{"hash":"e73596c","date":"2026-07-02 12:13:45 -0700","author":"Steve Abrams","subject":"deco-01 v4: chartreuse-anchored regen lands yellow-green ground (v4a/v4b), settlement PASS","body":""},{"hash":"58fe9d9","date":"2026-07-02 12:11:39 -0700","author":"Steve","subject":"regen v3: texture-01 grasscloth fixed (lane hit) + added to spoonflower-ready; deco-01 v3 geometry fixed (chartreuse still pending v4)","body":""},{"hash":"38e9481","date":"2026-07-02 12:10:34 -0700","author":"Steve","subject":"regen deco-01 + texture-01 as _v3 (2 variants each), settlement 4/4 PASS, curator-mode is_published=false","body":""},{"hash":"7662df1","date":"2026-07-02 12:07:10 -0700","author":"Steve Abrams","subject":"whimsical top-100: compare tool (original vs ours) + inline chat + SDXL regenerate; 100 bestsellers stored in dw_unified","body":""},{"hash":"8d1ba79","date":"2026-07-02 12:06:44 -0700","author":"Steve","subject":"gap-brief generation: 16 settlement-PASS originals staged + 6 Spoonflower-ready (150 DPI, no upscale) + curator gallery","body":""},{"hash":"1a98394","date":"2026-07-02 12:00:16 -0700","author":"Steve Abrams","subject":"pattern-vault: generate + settlement post-gen-vision 8 trend briefs (16 variants, curator-mode is_published=FALSE)","body":""},{"hash":"9ecb329","date":"2026-07-02 11:48:09 -0700","author":"Steve","subject":"Spoonflower: 14 Fernwick Studio originals uploaded to fernwick_studio (Private), manifest recorded","body":""},{"hash":"2832406","date":"2026-07-02 11:35:11 -0700","author":"Steve","subject":"trend-board: add saturated Toile de Jouy brief (BRIEF-2026-toile-01)","body":""},{"hash":"035da17","date":"2026-07-02 11:18:21 -0700","author":"Steve","subject":"feat(vault): rebrand storefront as Fernwick Studio (Pattern Vault kept as internal tag) + Handoff nav link + listing copy re-signed with the Fernwick Studio brand voice — coherent brand, ready to go live","body":""},{"hash":"b92f4dc","date":"2026-07-02 11:15:37 -0700","author":"Steve","subject":"chore(handoff): finalize brand — Fernwick Studio shop name + info@printmurals.com login shown in the cockpit header (aligns with the new account being verified)","body":""},{"hash":"928c4a9","date":"2026-07-02 10:13:57 -0700","author":"Steve","subject":"feat(vault): /handoff — manual-action cockpit for Steve: signup links (Spoonflower/Etsy/Stripe/affiliates) + all 14 designs with copy-title/desc/tags buttons + 4096px master downloads + one-click listings CSV. Everything he needs to list, in one page","body":""},{"hash":"831c5ad","date":"2026-07-02 10:04:10 -0700","author":"Steve","subject":"feat: trend board loop closed — mark 6/7 hot lanes FILLED by our in-house originals (coveredBy + summary); the board now shows demand→gap→WE-MADE-IT, honestly. Lane 7 (nursery) left open (wrong brand register)","body":""},{"hash":"518c9d5","date":"2026-07-02 10:03:40 -0700","author":"Steve","subject":"style(vault): add .roomtag CSS (bottom-right pill, gilds on hover) — the room-preview tag was rendering unstyled","body":""},{"hash":"fea7e23","date":"2026-07-02 10:03:19 -0700","author":"Steve","subject":"fix(vault): clean render patch for room hover-swap (heredoc mangled it) — 3 hero cards now swap to on-wall preview on hover, verified","body":""},{"hash":"25eb2b4","date":"2026-07-02 10:02:44 -0700","author":"Steve","subject":"feat(vault): on-wall lifestyle previews for 3 hero designs (Arden/Nocturne/Tide Lines) — card swaps to the styled-room shot on hover + '🛋 see in a room' tag; premium listing imagery, ~$0.009","body":""},{"hash":"a921b56","date":"2026-07-02 09:59:36 -0700","author":"Steve","subject":"chore: listings.csv → all 14 originals; +4 colorway print masters (gitignored). Full collection listing-ready","body":""},{"hash":"5386845","date":"2026-07-02 09:58:26 -0700","author":"Steve","subject":"feat: collection → 14 originals — heritage family (+Gilded Bough noir, +Rosewater Trellis) + moody family (+Amethyst Nocturne, +Emerald Nocturne); all settlement PASS; ~$0.048 gen total","body":""},{"hash":"1d026ed","date":"2026-07-02 09:56:35 -0700","author":"Steve","subject":"chore: 10 print masters generated (4x Real-ESRGAN, ~4096px, 150-DPI-class, ~/bin/zsh.10) → public/assets/masters/ gitignored (regenerable, 165MB); listing-ready. Go-memo updated to current state","body":""},{"hash":"390442d","date":"2026-07-02 09:53:12 -0700","author":"Steve","subject":"feat: paste-ready listing metadata (data/listings.csv) for the 10 originals — title/desc/tags/pricing per Spoonflower+Etsy fields, so the list-it switch is one drag-and-drop","body":""},{"hash":"6c21f30","date":"2026-07-02 09:52:17 -0700","author":"Steve","subject":"feat(vault): feature the 10 in-house originals — gold ✦ IN-HOUSE ORIGINAL badge on each card + a header band distinguishing our own designs from licensed WPB catalog","body":""},{"hash":"fe4935e","date":"2026-07-02 09:51:19 -0700","author":"Steve","subject":"feat: collection grows to 10 in-house originals — +Atomic Meadow (retro), Tide Lines (coastal), Folk Tile (block-print), Calico Vine (seam-fixed heritage); all settlement PASS; Replicate $0.036 total across 12 gens","body":""},{"hash":"9848ca5","date":"2026-07-02 09:48:38 -0700","author":"Steve","subject":"feat: 6-design in-house collection live in vault (Arden+Nocturne+Cottage Wash+Indigo Trellis+Crimson/Teal Nocturne) — all settlement post-gen PASS; lane1c held (seam), lane3 v1 held (superseded); Replicate $0.024 total","body":""},{"hash":"4b3a748","date":"2026-07-02 09:47:04 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-02T09:46:55 (2 files) — public/assets/pilot/lane1b.webp public/assets/pilot/lane3b.webp","body":""},{"hash":"2a02686","date":"2026-07-02 09:43:19 -0700","author":"Steve","subject":"feat: FIRST closed loop — 2 in-house original designs (Arden Botanical + Nocturne Bloom) generated from trend research, settlement post-gen PASS, live in the vault; lane-3 HELD (post-gen vision caught frond+open-space tropical risk the text gate missed). Replicate cost $0.009","body":""},{"hash":"b279f3b","date":"2026-07-02 09:01:09 -0700","author":"Steve","subject":"feat: first design-trend-scout board — 7 lanes, 21 original briefs","body":""},{"hash":"bbe592a","date":"2026-07-02 09:00:17 -0700","author":"Steve","subject":"feat: Trend Board page (/trends) — renders design-trend-scout market research + original briefs","body":""},{"hash":"f781872","date":"2026-07-02 08:07:14 -0700","author":"Steve Abrams","subject":"chore: lint guards (stripe try/catch, checkout fetch try/catch), catalogItems refactor, v0.2.0 (session close)","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"8eb308a","date":"2026-07-02 07:42:19 -0700","author":"Steve Abrams","subject":"setup guide + README: codify the new-Stripe-account rail (Pattern Vault never uses the DW live account)","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"65485ea","date":"2026-07-02 07:41:47 -0700","author":"Steve Abrams","subject":"signup tooling snapshot: browserbase step-driver (bb.js/step.js) from abandoned auto-signup attempt; gitignore session/passwords/shots; probe inquiry event","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"8c2d263","date":"2026-07-02 07:27:24 -0700","author":"Steve Abrams","subject":"setup guide page at /setup.html — live status pills, copy-paste steps for the 3 gated switches; stays behind Basic Auth even when PUBLIC_VAULT=1","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"63bed8a","date":"2026-07-02 07:23:53 -0700","author":"Steve Abrams","subject":"signup handoff: Spoonflower=existing login, 3 marketplaces=Steve manual w/ paste-ready values","body":""},{"hash":"0155759","date":"2026-07-02 07:23:22 -0700","author":"Steve Abrams","subject":"docs: root README — run instructions, data map, the 3 Steve-gated switches","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"1fe1588","date":"2026-07-02 06:35:20 -0700","author":"Steve","subject":"initial: Pattern Vault digital-license store (24 WPB designs, 3 tiers, sort+density, stripe TEST-ready, PUBLIC_VAULT gated) + marketplace kits (spoonflower/etsy/creative-market, 24 imgs)","body":""}]}