All Designerwallcoverings

repo: ~/Projects/all-designerwallcoverings · 142 commits · 0 in last 24h, 2 in last 7d · ██

Search the build

142 commits indexed

  1. ecdd60e 2026-09-24 TK-12173: document versa-designed-surfaces 404 report as false positive (Versace mis-join; Versa sells as Hollywood private label)
  2. 24927fc 2026-09-24 build-data.py: harden active_count against stale registry counts; regenerate vendors.json (drops phantom Versa Designed Surfaces 842)
  3. c38381b 2026-09-09 auto-data-snapshot: 2026-09-09T12:49:50 (2 data files) — tk11330-applied.json tk11330-product-candidates.json
  4. f859e9a 2026-09-09 Record published collection image audit
  5. 50a60e8 2026-08-31 auto-data-snapshot: 2026-08-31T02:00:54 (1 data files) — package-lock.json
  6. 60c344a 2026-08-31 chore: v1.7.3 (session close — crawl-microsites pm2-CLI serialization)
  7. 2d035d0 2026-08-30 add creds-in-URL fetch guard to gated pages (TK-10984)
  8. c9e5e8e 2026-08-30 use owner-safe PM2 CLI wrapper
  9. 43684c2 2026-08-30 crawl-microsites: coherent pm2-lock constants (deadline 10s > STALE 8s) — Kimi review fix (TK-10970)
  10. 94b6673 2026-08-30 crawl-microsites: serialize seedFromPm2 pm2 jlist via shared mkdir-lock (TK-10970)
  11. c142012 2026-08-28 build full internal catalog for every unified vendor
  12. 76b09d5 2026-08-28 auto-data-snapshot: 2026-08-28T10:16:39 (2 data files) — cta/rec/chrome/page@35bf18e98f593c7becba91687e1ed4f7.webm cta/rec/chrome/page@ff4c16d68b48a1506d15b684ad89bf1c.webm
  13. 2752be2 2026-08-28 record complete unified vendor endpoint proof
  14. 9cd80ae 2026-08-28 keep internal vendor hostnames within DNS limits
  15. 30003d2 2026-08-28 probe shared vendor pairs without downloading duplicate feeds
  16. 6032ba8 2026-08-28 serve every unified vendor through shared host endpoints
  17. 10fd1a2 2026-08-28 record live vendor pair deployment proof
  18. 59dee87 2026-08-28 preserve public vendor keys while pairing internal sites
  19. 3ae884e 2026-08-28 keep internal vendor twins distinct in the crawl
  20. 88bd22e 2026-08-28 load every unified vendor as a public and internal site pair
  21. ce50840 2026-08-25 creds-safe fetch guard: resolve relative fetch vs credential-free location (creds-in-URL trap)
  22. cb52b7a 2026-08-25 all.dw: dedupe grid — suppress sample-twin + cross-source-vendor duplicates (TK-10841)
  23. 5f3f6eb 2026-08-24 auto-data-snapshot: 2026-08-24T10:08:33 (1 data files) — package-lock.json
  24. f0c0681 2026-08-24 chore: version bump v1.7.2 (session close)
  25. c78be5a 2026-08-24 all.dw: split 'Catalog only' out of 'Staged' lifecycle + fix status-facet double-count
  26. 3446057 2026-08-20 auto-data-snapshot: 2026-08-20T13:34:43 (1 data files) — package-lock.json
  27. ea049e2 2026-08-20 chore: v1.7.1 (session close)
  28. 292b078 2026-08-20 fix: replace SELECT * with explicit columns in shopify-push (pre-deploy lint)
  29. 7ae6937 2026-08-20 nav-agent: sync v1.3 (host left-sidebar collapse on load)
  30. f421126 2026-08-19 nav-agent: List data full-width tight columns (grid) — layout fix
  31. 7e30b82 2026-08-19 Refresh nav-agent to v1.2 (adds kv-list compact List view, default-off)
  32. 3b584b2 2026-08-13 nav-agent: universal grid-controls drop-in on internal viewer pages (STRONG-only)
  33. 7f2ae6c 2026-08-11 viewer control standard: add Fields on/off menu to index.html (+Image toggle, mfr sorters) and list-toggle+Fields menu to vendors.html
  34. 95446fa 2026-08-11 microsites.html: add list/grid toggle + per-field on/off menu (full viewer control standard)
  35. 47d2616 2026-08-10 all.: add greenland to BANNED (private-label leak) + drop rows whose image/url path leaks a banned mill (china /img/greenland fix)
  36. fca6523 2026-08-10 all.: register phillipe-romano brand (Greenland cork private-labeled) seeded via localhost:9831 feed for microsite directory
  37. e98a86b 2026-08-10 all.: repoint Phillipe Romano line-viewer off dead philliperomano.dw to live DW Shopify collection (crawl-resistant override)
  38. ba032a8 2026-08-01 all-designerwallcoverings: adopt href-to-deeper-data primitives — LOCAL only, deploy Steve-gated (TK-10093)
  39. 09077cc 2026-07-27 auto-save: 2026-07-27T15:21:37 (1 files) — package-lock.json
  40. 699a5fd 2026-07-27 chore: v1.7.0 — async job+poll live-check feature (session close)
  41. 26c4bba 2026-07-27 astek CF-Access: env-gated service-token headers on crawler + feed proxy (TK-11, memo 260727A)
  42. ae33f6d 2026-07-27 auto-save: 2026-07-27T14:51:27 (1 files) — server.js
  43. 76b0372 2026-07-27 all.dw: raise live-scrape worker timeout 52s->75s (async/poll decoupled from proxy cap; genuine ~63s scrapes now complete)
  44. ad479fd 2026-07-27 all.dw: async job+poll for metered live check (never 504s the proxy)
  45. fde98d3 2026-07-23 auto-save: 2026-07-23T12:20:57 (1 files) — server.js
  46. eb95b2f 2026-07-16 auto-save: 2026-07-16T17:13:50 (1 files) — package-lock.json
  47. 9d4985f 2026-07-16 chore: v1.6.1 (session close — lint ✓ clean, refactor ✓ no-change, code verified clean as shipped)
  48. 763b16b 2026-07-16 Keep Schumacher visible on all-dw (internal 401-gated aggregator, Steve OK 2026-07-16); revert schumacher from BANNED — private-label vendor names stay banned
  49. c3f43e4 2026-07-16 auto-save: 2026-07-16T16:43:46 (1 files) — data/live-stock-coverage.json
  50. 1e3c12a 2026-07-16 Kravet dash→dot W-code match: Shopify stores wallcovering codes dash-form (W3909-50), price file dot-form (W3909.50.0) — add the conversion to kravet-db candidateKeys + coverage counter. Kravet resolvable 840→2250 (32%→86%), ~1,410 more SKUs priced $0
  51. fc6f2ba 2026-07-16 all-dw: add schumacher to BANNED regex (internal-only vendor)
  52. 81aa19f 2026-07-15 Live-scrape 504 fix: kill scrape at 52s (below the 60s CF/nginx proxy cap) → honest in-app 'timed out — use Email Vendor' JSON instead of a raw gateway 504; document the 3-step Kravet prod light-up recovery in build-coverage.js
  53. 8a79e7b 2026-07-15 Backfill mfr_sku for 163 mfr-less Kravet-family SKUs at $0 (title-exact + price-consensus tiers, local-model tier for residual honestly declines no-signal cases) — kravet_mfr_backfill table wired into grid loader, kravet-db adapter, coverage counter; Kravet resolvable 840→1003
  54. 3658c7c 2026-07-15 auto-save: 2026-07-15T16:38:37 (4 files) — scripts/adapters/kravet-db.js scripts/build-coverage.js server.js scripts/backfill-kravet-mfr.js
  55. c5afd0d 2026-07-15 contrarian fixes: price-only live result gets neutral dot + 'availability unknown — price file only' disclosure + human tooltip; STOCK lookup falls back to -Sample-stripped key
  56. add8bb3 2026-07-15 coverage hot-reload: re-read live-stock-coverage.json on mtime change (10-min check) so regenerated coverage flows without a pm2 restart
  57. 750e7f4 2026-07-15 Every SKU card gets a smart face button: live price check (tier-labeled cost) → stored stock → Email Vendor fallback; shared per-card popovers + price-forward live render
  58. f9158ab 2026-07-15 Kravet family gets a $0 authoritative-price live check (kravet-db adapter, DB_AUTHORITATIVE tier)
  59. 016fb39 2026-07-15 chore: vendor_contacts self-heal DDL, microsites compose validation, v1.6.0 (session close)
  60. 3fa3f9f 2026-07-15 Email Vendor everywhere: stock & price inquiry compose on every product card + microsite card — /api/vendor-contact + /api/vendor-inquiry (vendor_contacts upsert + George Gmail DRAFT, never auto-send, mailto fallback)
  61. 9317a40 2026-07-14 chore: v1.5.0 (session close — pm2 viewer auto-discovery + /api/skus feed)
  62. 80c128c 2026-07-14 Auto-discover all co-located pm2 vendor viewers + read /api/skus feed → 49→156 vendors live in all.dw (fulfills 'every vendor viewer must be live'); private-label sources stay BANNED
  63. 2a6cffc 2026-07-14 chore: v1.4.1 (session close) — vendor facet alpha-sort
  64. ce9854c 2026-07-14 all.dw: vendor facet sorts alphabetically by name on load (was by count)
  65. 7e64421 2026-07-14 Contrarian fixes: scope crawler cred to internal hosts only; correct zuber-internal note :10105; de-mislead quadrille internalViewer (public-served)
  66. 26c1985 2026-07-14 Crawler: derive membership handle + title from mfr_sku/pattern_name when feed omits them (fixes gracie/zuber 0-count)
  67. 22ee077 2026-07-14 Fix crezana internalViewer port 10104->10106; vendor-name fallback for gated 401 directory titles
  68. f5cefcb 2026-07-13 chore: v1.4.0 — similar-pattern search feature (session close)
  69. 80f0bae 2026-07-13 disco banner: 'search the catalog' is now a button — /api/similar scores live substitutes (material/style/color/type/vendor/title-token) and renders matched cards below the banner
  70. 301550f 2026-07-09 auto-save: 2026-07-09T22:42:31 (2 files) — data/vendors.json scripts/__pycache__/
  71. 1fa387b 2026-07-09 internal category: plug 3 front-facing leaks — build-data.py vendor directory drops internal, /api/vendors+/api/microsites Cache-Control private no-store, microsite external URL suppressed for internal (contrarian FIX-FIRST)
  72. f37876c 2026-07-09 auto-save: 2026-07-09T22:12:24 (1 files) — server.js
  73. 9d3836e 2026-07-09 microsite crawler: seed from Cloudflare zone (authoritative, self-completing) + register -internal viewers
  74. c22ea62 2026-07-09 all.dw: make microsite feed ports env-overridable (MICROSITE_FEED_PORTS)
  75. b2fc39c 2026-07-09 all.dw: surface 4 luxury lines (Fromental/Gracie/Zuber/Crezana) via microsite full-feeds
  76. 5def1fd 2026-07-09 all.dw: register Fromental/Gracie/Zuber/Crezana brands (onboarding/staging, quote-only, import+deploy gated)
  77. cdc1dcf 2026-07-09 chore: lint (node --check ✓), v1.3.0 (session close)
  78. 287e09e 2026-07-08 Designtex dw_sku backfill on mac3 CANONICAL dw_unified: provenance note (288 rows, artifacts durable on-disk, gitignore honored)
  79. fe345ea 2026-07-08 all. cards: gallery count badge + hover-cycle through full Shopify image set
  80. 08c6237 2026-07-08 Full Shopify image galleries: bulk-sync product_images + serve images[] in feed
  81. 75328f4 2026-07-08 all.dw grid: manufacturer-SKU search — backfill mfr_sku from *_catalog tables (sync leaves shopify_products.mfr_sku empty for new lines); feeds mfr_number display + search haystack
  82. de111d4 2026-07-08 shopify-push: portable Shopify-lib resolution (env/mac3/co-located) for deploy safety
  83. 25613cb 2026-07-08 List view: add Mfr # column with DW·Shop·FM mismatch breakout
  84. d3b82a5 2026-07-08 Mismatch chip: show DW number alongside Shopify + FileMaker mfr numbers
  85. f088c73 2026-07-08 chore: v1.1.0 → v1.2.0 (session close — feed + discontinued-successor features)
  86. 8ed57a0 2026-07-08 FileMaker WALLPAPER as source of truth across all./substitute/photo
  87. 55b78db 2026-07-08 Add /api/discontinued + red successor banner: dead/archived SKU resolves (dash/-SAMPLE insensitive) → links live successor
  88. ecdf294 2026-07-08 auto-save: 2026-07-08T10:35:15 (1 files) — scripts/fm-wallpaper-sync.mjs
  89. 949b520 2026-07-08 Stop tracking data/backfills/ ops artifacts; gitignore the dir (repo hygiene)
  90. 2ac9b38 2026-07-08 all.dw internal tool: default scope = all-but-archived (incl. Staged/DRAFT); fold DELETED_FROM_SHOPIFY into Archived
  91. 02ea04b 2026-07-08 env-ify Basic-Auth: support BASIC_AUTH_USER/PASS, default unchanged (admin:DW2024!)
  92. 7d0202a 2026-07-08 Enable Designtex live-stock (13→14): drop from SCHEMA_PARSE_PENDING after dw_sku backfill
  93. 005a048 2026-07-08 auto-save: 2026-07-08T09:04:55 (1 files) — scripts/build-coverage.js
  94. f78c637 2026-07-08 Document targeted-rsync deploy guardrail (no full-tree --delete on this repo)
  95. 104aa8f 2026-07-08 Designtex dw_sku backfill on Kamatera dw_unified: backup + rollback artifacts
  96. aa87b85 2026-07-08 add internal /api/catalog-full feed (every non-archived SKU, leak-sanitized, product_id/handle/tags) for substitute + photo apps
  97. 5dfa17e 2026-07-08 deploy: infinite-scroll fix (5cdaf8a) live to all.designerwallcoverings.com (targeted public/index.html)
  98. 053a837 2026-07-08 Deploy staged +Koroseal live-stock build to prod (Kamatera 45.61.58.125)
  99. 5cdaf8a 2026-07-08 Fix stuck infinite scroll: pump on live sentinel geometry, not stale observer flag
  100. 59f752c 2026-07-07 auto-save: 2026-07-07T20:32:33 (2 files) — config/known-subdomains.json scripts/crawl-microsites.js
  101. 27f01e1 2026-07-07 Koroseal live-proven: reject synthesized catalog URLs (false-discontinued fix) + record verification
  102. 1aabc95 2026-07-07 Integrate 5 vendor live-stock adapters: enable Koroseal (liveness), dim Designtex/Schumacher/Fabricut/Contrado honestly
  103. 050399a 2026-07-07 all.dw: register Pierre Frey Fabrics microsite (pierrefreyfabrics, distinct vendor label so no dedup-merge with wallcovering pierre-frey)
  104. acfd50a 2026-07-07 all.dw infinite-scroll: robust pump loop (keep loading while sentinel visible) fixes 'scroll for more' stall when a load is in-flight as user reaches bottom (IntersectionObserver only fires on transition)
  105. 9759482 2026-07-07 crawler: read co-located Basic-Auth-gated microsite feeds via localhost internalViewer (bypass 401, no credential) + optional MICROSITE_BASIC_AUTH; Pierre Frey now shows 1161 on all.dw
  106. 3340f23 2026-07-07 live-stock: enable Thibaut in coverage (vault-cred proof landed on prod)
  107. a35f788 2026-07-07 live-stock: vault-cred adapter for Thibaut (creds referenced in place from dw-price-stock/.env)
  108. 9c2f43a 2026-07-07 all.dw: dedupe microsite seeds by vendor (fold DB auto-slug into registry brand slug); point Pierre Frey at live hyphenated host pierre-frey (401 gated)
  109. d0fcf53 2026-07-07 chore: lint + light refactor (shared adapter helpers, named consts) + v1.1.0 (session close)
  110. d537f75 2026-07-07 all.dw: register Pierre Frey microsite (slug pierrefrey, wave-19 samples viewer, staged/launch-gated)
  111. 77f866b 2026-07-07 live-stock: structured-only availability vote (kills Osborne discontinued-banner false-OOS) + Magento tocart/title CTA read; stamp DG/Marburg/Osborne live-verified
  112. 0ccd9b9 2026-07-07 live-stock: tune schema-public for Designers Guild + Marburg, remap Osborne SKUs, AS Creation honest-dim (8→11 live vendors)
  113. 3790ba8 2026-07-07 live-stock verify: 4 NEW vendors live-verified via schema-public (Mind the Gap/Graham & Brown/Innovations USA/Rebel Walls, in_stock:true, $0.03 ea) — live_capable 4→8, all verified; harden schema-public to read Magento microdata href; AS Creation/Designers Guild/Marburg kept wired-but-dim (JS-rendered availability, parse pending) rather than burn sessions for unknown; total verify spend $0.247 logged to cost-tracker
  114. d1be0d2 2026-07-07 live-stock: generic schema-public adapter (login-free schema.org/Magento availability) + reclassify 7 mis-tiered PORTAL_NO_CREDS vendors whose anonymous PDPs expose stock — AS Creation, Designers Guild, Graham & Brown, Innovations USA, Marburg, Mind the Gap, Rebel Walls now live-capable (resolvability-gated); Kravet honestly dimmed 'portal does not expose live stock (price sheet only)'; live-capable 4→11
  115. 2c397b4 2026-07-07 live-stock: daily $ kill-switch — global per-day spend ceiling (DAILY_LIVE_CAP_USD, default $5) persisted to data/live-spend.json, survives pm2 restart; live path hard-stops at $0 before any Browserbase session once the day's total hits the cap; day_spend+cap surfaced on every metered response; align findRowBySku with the grid's dw_sku-first identity so live checks actually resolve
  116. 875d338 2026-07-07 live-stock verification: 4 metered scrapes ($0.234 total) prove wallquest+shopify-public+romo adapters return live stock; harden romo nav-chrome parse; record per-vendor verified status in coverage
  117. 5d8857a 2026-07-07 adapters: shared grid-SKU→catalog resolver (bridge via shopify_products mfr_sku/dw_sku) so shopify-public/romo/woo actually resolve display SKUs
  118. 803861a 2026-07-07 coverage: resolvability gate — only ENABLE live-capable vendors whose display SKUs actually align with the catalog (drops PS Removable/Nina/Hygge false-enables); 4 genuinely-usable
  119. af39b75 2026-07-07 live-stock adapter framework: generalized per-vendor registry (wallquest/romo/shopify-public/woo-public), coverage-driven enable+dim, live-scrape.js dispatcher
  120. 93e37e2 2026-07-07 live-stock coverage audit: classify all 254 display-vendors into feasibility tiers (data/live-stock-coverage.json + scripts/build-coverage.js)
  121. 8c24b22 2026-07-07 all-dw: show Mfr # (mfr_sku) + Mfr Name (supplier_name) as card fields
  122. 94d8f0a 2026-07-07 This Item deep-link: capture full per-microsite handle set + resolve by membership (kills ~15-25% dead-ends)
  123. 9769200 2026-07-07 all-dw This Item: suppress deep-link for broken/empty vhosts (VENDOR_ITEM excludes up-but-0-product microsites). Partial fix — per-product handle divergence (dw handle != microsite SPA handle) still limits reliability; deploy HELD per yolo final DTD
  124. 435af85 2026-07-07 livestock: self-contained Browserbase backend (lib/romo-lib.js) so prod can run live checks without the skills dir
  125. bbcfd96 2026-07-07 livestock: one-click 'Check Live 🔄' — metered vendor-portal scrape endpoint + card control
  126. ef3b79c 2026-07-07 all-dw chips: add 'This Item ↗' link — internal microsite product page (/product/<handle>) for the single item, distinct from 'Line Viewer' (whole line)
  127. 9ca2518 2026-07-07 internal: expand per-card Internal into Admin / Line Viewer / Check Stock grouped control
  128. a5f3545 2026-07-07 grid: Book/Series facet in left rail + Website/Internal buttons on every card & list row (graceful disable)
  129. 3876a0d 2026-07-07 api: carry series (Book) facet + website/internal_url per product
  130. 7f71cd1 2026-07-06 microsites.html: density slider 1-30 with live readout + sort every field (products/name/slug/type both dirs, catalog/live/gated)
  131. ce4838d 2026-07-06 untrack data/microsites.json (live crawl artifact) + restore .gitignore entry lost in prod reconcile
  132. 2d9b4a7 2026-07-06 all.: add visible /microsites.html directory (sort + density + infinite scroll over /api/microsites) + nav links from index & vendors
  133. 228a80f 2026-07-06 reconcile local to deployed prod (5bc3e1a) + re-layer microsite crawl feature onto true prod base
  134. 260257f 2026-07-06 all.: add live *.designerwallcoverings.com microsite crawl (directory + merged products), served at /api/microsites, polled every 10 min in-process + launchd
  135. 96f3c15 2026-07-02 Astek-viewer alignment: accordion filter sections + CARD FIELDS toggles (image-only wall) + header count pill + --fs type scale + Basic Auth gate (admin/DW2024!, env-overridable, healthz open)
  136. bb41e31 2026-07-02 amazon-style left filter rail + grid/list toggle + sortable columns (every field, asc/desc w/ null-aware desc) + density to 20 + URL param overrides
  137. 86857a5 2026-07-02 portable snapshot SQL: probe optional mirror-only columns (min_variant_price, online_store_published) so the same code runs on Kamatera canonical
  138. c8c8cd7 2026-07-02 banned front-facing vendor scrub on the public snapshot (Brewster/York/WallQuest/NewWall/... per build-data.py hard rule)
  139. 0ff51f2 2026-07-02 full-catalog browser: in-memory dw_unified snapshot (153k products), word-anchored search, 9 sortable fields, chip-toggle facets (vendor/type/color/style/material/price/status/image) w/ type-ahead + expanders, density + infinite scroll; vendor directory preserved at /vendors.html
  140. 455cb72 2026-07-02 snapshot before full-catalog rebuild (vendor directory preserved at /vendors.html)
  141. 9e20e28 2026-07-02 staged one-shot go-live script (rsync + pm2 + nginx public-IP bind + CF DNS + certbot)
  142. cc3b3f5 2026-07-02 initial scaffold: front-facing vendor directory (all dw_unified vendor ids, private-label safe)

Authors

Agents used

  • none detected

Skills used

  • /adapters6
  • /microsites5
  • /build-coverage4
  • /vendors4
  • /catalog-full4
  • /index4
  • /facets3
  • /zuber3
  • /style3
  • /type3
  • /livestock3
  • /rec2
  • /chrome2
  • /page2
  • /off2
  • /nginx2
  • /live-stock-coverage2
  • /kravet-db2
  • /live-spend2
  • /skus2
  • /color2
  • /crezana2
  • /gracie2
  • /substitute2
  • /fm-wallpaper-sync2
  • /backfills2
  • /romo2
  • /claude1
  • /code1
  • /cli1

Creative ideas + design notes

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

ecdd60e · 2026-09-24 · TK-12173: document versa-designed-surfaces 404 report as false positive (Versace mis-join; Versa sells as Hollywood private label)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HFbfYmHuR8kNNNUrqEujkw
24927fc · 2026-09-24 · build-data.py: harden active_count against stale registry counts; regenerate vendors.json (drops phantom Versa Designed Surfaces 842)
active_count is sourced only from the live shopify_products ACTIVE query; removed
unused vendor_registry.shopify_count/total_products SELECT columns that invited
reintroducing the phantom count class. Regenerated local vendors.json: Versa
Designed Surfaces (0 ACTIVE, archived under Hollywood Wallcoverings) now absent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
94b6673 · 2026-08-30 · crawl-microsites: serialize seedFromPm2 pm2 jlist via shared mkdir-lock (TK-10970)
Share the ~/.pm2/cli.lock.d lock with keep-alive so the two scheduled pm2-CLI callers
never hit rpc.sock concurrently and stop auto-forking orphan God daemons (pm2-fracture,
TK-10932). FAIL-OPEN: crawl proceeds if lock unattainable. Local commit only — Kamatera
deploy stays Steve-gated per repo CLAUDE.md (never full-tree, never data/).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ce50840 · 2026-08-25 · creds-safe fetch guard: resolve relative fetch vs credential-free location (creds-in-URL trap)
Fleet inoculation — opening this basic-auth app with credentials in the URL
poisoned document.baseURI and made relative fetch('/api/…') throw. Guard resolves
non-absolute request URLs against location instead. Ref: creds-in-url-fetch-guard-fleet-pattern.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cb52b7a · 2026-08-25 · all.dw: dedupe grid — suppress sample-twin + cross-source-vendor duplicates (TK-10841)
Add dedupeRows() post-concat pass in loadSnapshot(): drop a -sample card only
when its non-sample base twin also renders (sample-only products untouched), and
drop microsite/catalog rows whose vendor is already a live Shopify vendor (incl.
Bespoke->DW Bespoke Studio alias). No DB writes; in-RAM only; git-revertable.
Verified on running :9958: default grid 214,081 -> 188,434, 0 dupes remaining,
38,245 sample-only + Fromental(shopify) preserved.
c78be5a · 2026-08-24 · all.dw: split 'Catalog only' out of 'Staged' lifecycle + fix status-facet double-count
- deriveMicrositeRow: never-on-Shopify *_catalog staging rows now read
  'Catalog only' instead of 'Staged', so 'Staged' means only real Shopify
  DRAFT / unpublished-ACTIVE go-live candidates (148,534 -> 42,854 local).
- LIFE_ORDER: add 'Catalog only' chip.
- /api/facets: status facet was passing {skip:'lifecycle'} (should be
  {skip:'status'}); status facet now reconciles to total (314,254 -> 214,358).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
26c4bba · 2026-07-27 · astek CF-Access: env-gated service-token headers on crawler + feed proxy (TK-11, memo 260727A)
Inert/byte-identical (Basic-Auth-only) until CF_ACCESS_ASTEK_ID/SECRET are set;
scoped to astek.designerwallcoverings.com only. Deploy to Kamatera stays gated.
ad479fd · 2026-07-27 · all.dw: async job+poll for metered live check (never 504s the proxy)
DB_AUTHORITATIVE (Kravet) tier stays fully synchronous (instant local PG read,
returns status:done inline). Browserbase tiers now fire-and-poll: the initiating
request starts the scrape WITHOUT awaiting it and returns status:pending
immediately (well under the ~60s Cloudflare/nginx proxy cap), so slow portals
(WallQuest/Romo ~63s) can no longer 504. Spend-accrual + result caching moved
into the background .then(); .catch caches an error result so a later poll
resolves cleanly and no unhandled rejection can occur. Front-end polls
livestock?...&poll=1 every poll_after_ms (max ~30 polls/~90s), renders on
status:done, falls back to the Email-Vendor copy on status:gone/exhaustion.
LIVE_WORKER made env-overridable for mocked local verification.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fc6f2ba · 2026-07-16 · all-dw: add schumacher to BANNED regex (internal-only vendor)
Schumacher is INTERNAL-ONLY (Steve 2026-07-16). BANNED already drops private-label
upstream names from the public search grid + microsite directory; adding schumacher
filters any Schumacher product row AND the internal.schumacher / schumacher microsite
tiles from this aggregator. Local commit only — deploy to the gated public surface
stays Steve-gated per this repo's CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
f9158ab · 2026-07-15 · Kravet family gets a $0 authoritative-price live check (kravet-db adapter, DB_AUTHORITATIVE tier)
- new scripts/adapters/kravet-db.js: resolves the grid SKU's mfr code and answers from
  dw_unified.kravet_authoritative_pricing with the MAP retail (new_map, else whls x 1.5 derived);
  session_opened:false so nothing bills; wholesale never emitted
- live-scrape.js: DB adapters run without the Browserbase lib (only session adapters need it)
- server.js: session_opened:false success -> cost 0, no ledger/live-spend entry; DB_AUTHORITATIVE
  tier exempt from the daily $-cap only (per-IP + inflight limits still apply)
- build-coverage.js: KRAVET_FAMILY -> DB_AUTHORITATIVE first-branch, kapMatchCount resolvability
  gate, Kravet removed from NO_LIVE_STOCK_PORTAL; coverage regenerated (12 vendors in tier,
  7 live-capable: Brunschwig 2636, Gaston 2142, Lee Jofa 2110, Cole & Son 1236, GP&J Baker 1185,
  Kravet 840, Threads 69)
9d3836e · 2026-07-09 · microsite crawler: seed from Cloudflare zone (authoritative, self-completing) + register -internal viewers
- add cfZoneSubdomains() 3rd seed source: fetch all A/CNAME for zone e4b88c70,
  derive <sub>.designerwallcoverings.com, merge with known+DB seeds (dedup)
- guarded: missing token / CF failure logs a warning + falls back to existing seeds
- denylist _-prefixed / _domainconnect / _dmarc / apex; www kept out (apex dup)
- token via env (CLOUDFLARE_API_TOKEN) + MICROSITE_CF_ZONE default = the zone
- register fromental/crezana/gracie/zuber -internal viewers in internal[]
- fix stale internalViewer ports 10071-10074 -> real Kamatera 10103-10106

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c22ea62 · 2026-07-09 · all.dw: make microsite feed ports env-overridable (MICROSITE_FEED_PORTS)
Prod's co-located internal viewers listen on different localhost ports than Mac2
dev (prod: fromental=10103/gracie=10104/zuber=10105/crezana=10106; dev defaults
10071/10073/10074/10072). Drive the per-line feed port from MICROSITE_FEED_PORTS
("slug=port,..."), falling back to the dev default so behavior is unchanged when
unset. Keeps the ingest portable across environments without hardcoding prod ports.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
b2fc39c · 2026-07-09 · all.dw: surface 4 luxury lines (Fromental/Gracie/Zuber/Crezana) via microsite full-feeds
Ingest the FULL /api/products feed of the 4 DW-family microsites over localhost
(bypassing the public 401 with the shared internal cred), normalize each feed's
heterogeneous shape to the grid row shape (colors/styles/materials via the same
tag lexicons, quote->null price), tag source='microsite', dedupe by vendor+handle,
and append to ROWS at each snapshot cycle. No Shopify import, no dw_unified write.
Additive + guarded: a failed feed keeps the prior cycle's rows for that line.
Verified locally: /api/facets vendor = Fromental 735 / Gracie 150 / Zuber 192 /
Crezana Design 443; products filter + color/style facets cross-filter; internal
/api/catalog-full unaffected (0 microsite rows).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
08c6237 · 2026-07-08 · Full Shopify image galleries: bulk-sync product_images + serve images[] in feed
- scripts/shopify-images-sync.mjs: Shopify Bulk Operations export of every non-archived
  product's full image set -> dw_unified.product_images (201,568 images / 87,599 products)
- server.js: load product_images by product_id, add images[] + image_count to every row,
  gap-fill the primary image from the gallery when featured image_url is null
- flows to /api/catalog-full so all./substitute/new inherit galleries; No-image dropped to 477
8ed57a0 · 2026-07-08 · FileMaker WALLPAPER as source of truth across all./substitute/photo
- scripts/fm-wallpaper-sync.mjs: mirror FileMaker WALLPAPER (Shopify Detail layout,
  clean-query rule, Record Type=Master) into dw_unified.filemaker_wallpaper
- server.js: LEFT-JOIN the mirror by dw_sku -> fm_mfr_number, fm_discontinued,
  fm_width, fm_specs, mfr_mismatch; hide FMPro-discontinued by default (union);
  FM stats on /healthz + /api/facets; fields flow to /api/catalog-full (substitute+photo)
- public/index.html: show both mfr numbers with mismatch flag, FM specs on cards,
  FM header chip + Mismatches/Show-FM-disco toggles + bulk Preview-sync modal,
  per-card Update Shopify button (dry-run)
- scripts/shopify-push.mjs: FileMaker->Shopify diff engine (name/mfr/width/specs);
  writes only non-empty changed fields, never downgrades richer Shopify data, never
  pushes a name into the mfr field; commit gated behind SHOPIFY_PUSH_ENABLED
7d0202a · 2026-07-08 · Enable Designtex live-stock (13→14): drop from SCHEMA_PARSE_PENDING after dw_sku backfill
build-coverage.js: Designtex removed from SCHEMA_PARSE_PENDING (it was the only
blocker) and given a VERIFIED entry; it now takes the enabled schema-public path and
clears the resolvability gate 417/417 (100%). Coverage rebuilt on prod against the
Kamatera dw_unified (the DB the aggregator loads) → live-capable 14, all 13 prior
vendors intact. Designtex proven live on prod: DWDX-220000 → in_stock:true via
schema-public-live (login-free, $0.03), kill-switch counter incremented. pm2
restarted to load the fresh coverage.
104aa8f · 2026-07-08 · Designtex dw_sku backfill on Kamatera dw_unified: backup + rollback artifacts
Wrote authoritative DWDX/DWAH dw_sku into 417 active Designtex rows in shopify_products
(base(variant_sku)=designtex_catalog.dw_sku, 1:1, 0 unmatched, 0 ambiguous). dw_sku ONLY;
mfr_sku/variant_sku/sku untouched; 0 non-Designtex rows touched. Target = the LOCAL
Kamatera dw_unified the live aggregator loads (repl_user reads it; write ran as table
owner dw_admin via .pgpass). Reversible: on-DB _backup_designtex_dwsku_20260708 +
data/backfills/*.jsonl + ROLLBACK.sql.
053a837 · 2026-07-08 · Deploy staged +Koroseal live-stock build to prod (Kamatera 45.61.58.125)
Targeted rsync of scripts/adapters/ + build-coverage.js + live-stock-coverage.json,
pm2 restart --update-env. Smoke: healthz=200, root=401, microsites=200.
Koroseal DWK-29052 authed live scrape on prod → in_stock:true, price:null,
source=koroseal-live, $0.17 (Browserbase 1.16 session_min), kill-switch counter
incremented (live-spend.json 2026-07-08:0.1739, cap $5). 13 live vendors confirmed.
27f01e1 · 2026-07-07 · Koroseal live-proven: reject synthesized catalog URLs (false-discontinued fix) + record verification
- koroseal.js: accept only a REAL catalog product_url, never resolve.js's shape-general synthesized template guess (which substituted a spec mfr code into a digital-lab pattern-slug URL -> bogus 404 -> false discontinued). Prefer koroseal.js's own mfr-code reconstruction.
- Proven live: DWK-29052 Available (live 200 PDP) / DWK-32619 Discontinued (302->/NotFound), price:null, $0.03 each
- build-coverage VERIFIED note for Koroseal
1aabc95 · 2026-07-07 · Integrate 5 vendor live-stock adapters: enable Koroseal (liveness), dim Designtex/Schumacher/Fabricut/Contrado honestly
- Register koroseal/designtex/schumacher/fabricut/contrado in adapters/index.js
- resolve.js: shape-general template-learning fallback (additive; only ADDS matches after a product_url miss, needs a recovered mfr_sku)
- koroseal.js: recover mfr_sku from shopify_products before URL reconstruction (server passes dw_sku, reconstruction keys on mfr code)
- build-coverage.js: LIVENESS_ADAPTERS (Koroseal, mfr-key resolvability gate, honest Available/Discontinued label); WIRED_DIM (Schumacher quote-only / Fabricut too-small / Contrado made-to-order); Designtex honest-dim (grid rows carry no SKU key)
- live count 12 -> 13 (+Koroseal); all 12 prior live vendors retained (no regression)
3340f23 · 2026-07-07 · live-stock: enable Thibaut in coverage (vault-cred proof landed on prod)
Proof (prod 2026-07-07): /api/livestock?sku=DWTT-70471-SAMPLE&live=1 →
in_stock:true, source:thibaut-live (real logged-in scrape, not a degrade), price:null
(public-safe), cost $0.1596; daily kill-switch $0.0605→$0.2201. Creds resolved from
dw-price-stock/.env by path — never copied into this repo or dw_unified.
a35f788 · 2026-07-07 · live-stock: vault-cred adapter for Thibaut (creds referenced in place from dw-price-stock/.env)
- scripts/adapters/creds.js: vault-first cred resolver (dw-price-stock/.env by path via
  DW_PRICE_STOCK_ENV), registry fallback; values never logged/copied
- scripts/adapters/thibaut.js: Thibaut trade-portal live-stock adapter (Shopify storefront,
  #email/#password login), PUBLIC-SAFE availability only, price null
- scripts/adapters/index.js: register thibaut
- scripts/build-coverage.js: VAULT_PORTAL_ADAPTERS map + classify branch (Thibaut only),
  subject to the resolvability gate; placed before the public-Shopify branch (stock is trade-gated)
- docs/live-stock-creds-in-place.md: design note + 8-vendor feasibility + Steve-gated expansion plan
8c24b22 · 2026-07-07 · all-dw: show Mfr # (mfr_sku) + Mfr Name (supplier_name) as card fields
Adds two toggleable card fields to the product grid, rendered only when
present. Server ships mfr_number/mfr_name in the payload and folds mfr_sku +
supplier_name into the search haystack; client registers them in FIELD_DEFS
with the h-mfrn/h-mfrname visibility system and renders them between
Vendor·Type and the facet chips. Verified against the DWQW-61447/61443 Adorn
cards (Mfr # NE50608 / NE50508).
bbcfd96 · 2026-07-07 · livestock: one-click 'Check Live 🔄' — metered vendor-portal scrape endpoint + card control
/api/livestock?sku=&live=1 spawns scripts/live-scrape.js (reuses browserbase romo-lib
session helper + documented WallQuest portal login), returns PUBLIC-SAFE availability +
our-retail price only (never cost/net). Self-gates to wired adapters (Malibu/PS Removable
-> WallQuest); dims for all others. 10-min per-SKU cache, concurrent-click coalescing,
per-IP + global-burst rate limits. Free stored-snapshot path stays $0. Card shows live
result + actual $ cost (or 'cached · $0'). Proven once live: DWQW-58220 OutOfStock, $0.0975 (logged).
9ca2518 · 2026-07-07 · internal: expand per-card Internal into Admin / Line Viewer / Check Stock grouped control
Server resolves two new public-safe side-channels per SKU: line_viewer_url (the
vendor's live microsite from the crawl artifact = its internal astek-style line
viewer) and stock (the FREE stored /livestock snapshot — in_stock/qty/lead/as-of
from stock_checks ∪ every *_catalog in_stock/last_scraped; cost & price never
selected). Grid card + list row now show Website + an 'Internal ▾' cluster that
expands inline to Shopify Admin / Line Viewer / Check Stock; each dims when its
target can't resolve; Check Stock shows the stored snapshot inline (never a metered
--live scrape on render). stopPropagation preserved so the card's website-open click
never fires from the cluster.

File tree

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

Other build journals

← Ai Workforce  ·  all 4 projects  ·  All Dw Landing →

Export

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

rendered in 8ms