All Designerwallcoverings

repo: ~/Projects/all-designerwallcoverings · 104 commits · 6 in last 24h, 7 in last 7d · ▂ █

Search the build

104 commits indexed

  1. 09077cc 2026-07-27 auto-save: 2026-07-27T15:21:37 (1 files) — package-lock.json
  2. 699a5fd 2026-07-27 chore: v1.7.0 — async job+poll live-check feature (session close)
  3. 26c4bba 2026-07-27 astek CF-Access: env-gated service-token headers on crawler + feed proxy (TK-11, memo 260727A)
  4. ae33f6d 2026-07-27 auto-save: 2026-07-27T14:51:27 (1 files) — server.js
  5. 76b0372 2026-07-27 all.dw: raise live-scrape worker timeout 52s->75s (async/poll decoupled from proxy cap; genuine ~63s scrapes now complete)
  6. ad479fd 2026-07-27 all.dw: async job+poll for metered live check (never 504s the proxy)
  7. fde98d3 2026-07-23 auto-save: 2026-07-23T12:20:57 (1 files) — server.js
  8. eb95b2f 2026-07-16 auto-save: 2026-07-16T17:13:50 (1 files) — package-lock.json
  9. 9d4985f 2026-07-16 chore: v1.6.1 (session close — lint ✓ clean, refactor ✓ no-change, code verified clean as shipped)
  10. 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
  11. c3f43e4 2026-07-16 auto-save: 2026-07-16T16:43:46 (1 files) — data/live-stock-coverage.json
  12. 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
  13. fc6f2ba 2026-07-16 all-dw: add schumacher to BANNED regex (internal-only vendor)
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. f9158ab 2026-07-15 Kravet family gets a $0 authoritative-price live check (kravet-db adapter, DB_AUTHORITATIVE tier)
  21. 016fb39 2026-07-15 chore: vendor_contacts self-heal DDL, microsites compose validation, v1.6.0 (session close)
  22. 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)
  23. 9317a40 2026-07-14 chore: v1.5.0 (session close — pm2 viewer auto-discovery + /api/skus feed)
  24. 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
  25. 2a6cffc 2026-07-14 chore: v1.4.1 (session close) — vendor facet alpha-sort
  26. ce9854c 2026-07-14 all.dw: vendor facet sorts alphabetically by name on load (was by count)
  27. 7e64421 2026-07-14 Contrarian fixes: scope crawler cred to internal hosts only; correct zuber-internal note :10105; de-mislead quadrille internalViewer (public-served)
  28. 26c1985 2026-07-14 Crawler: derive membership handle + title from mfr_sku/pattern_name when feed omits them (fixes gracie/zuber 0-count)
  29. 22ee077 2026-07-14 Fix crezana internalViewer port 10104->10106; vendor-name fallback for gated 401 directory titles
  30. f5cefcb 2026-07-13 chore: v1.4.0 — similar-pattern search feature (session close)
  31. 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
  32. 301550f 2026-07-09 auto-save: 2026-07-09T22:42:31 (2 files) — data/vendors.json scripts/__pycache__/
  33. 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)
  34. f37876c 2026-07-09 auto-save: 2026-07-09T22:12:24 (1 files) — server.js
  35. 9d3836e 2026-07-09 microsite crawler: seed from Cloudflare zone (authoritative, self-completing) + register -internal viewers
  36. c22ea62 2026-07-09 all.dw: make microsite feed ports env-overridable (MICROSITE_FEED_PORTS)
  37. b2fc39c 2026-07-09 all.dw: surface 4 luxury lines (Fromental/Gracie/Zuber/Crezana) via microsite full-feeds
  38. 5def1fd 2026-07-09 all.dw: register Fromental/Gracie/Zuber/Crezana brands (onboarding/staging, quote-only, import+deploy gated)
  39. cdc1dcf 2026-07-09 chore: lint (node --check ✓), v1.3.0 (session close)
  40. 287e09e 2026-07-08 Designtex dw_sku backfill on mac3 CANONICAL dw_unified: provenance note (288 rows, artifacts durable on-disk, gitignore honored)
  41. fe345ea 2026-07-08 all. cards: gallery count badge + hover-cycle through full Shopify image set
  42. 08c6237 2026-07-08 Full Shopify image galleries: bulk-sync product_images + serve images[] in feed
  43. 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
  44. de111d4 2026-07-08 shopify-push: portable Shopify-lib resolution (env/mac3/co-located) for deploy safety
  45. 25613cb 2026-07-08 List view: add Mfr # column with DW·Shop·FM mismatch breakout
  46. d3b82a5 2026-07-08 Mismatch chip: show DW number alongside Shopify + FileMaker mfr numbers
  47. f088c73 2026-07-08 chore: v1.1.0 → v1.2.0 (session close — feed + discontinued-successor features)
  48. 8ed57a0 2026-07-08 FileMaker WALLPAPER as source of truth across all./substitute/photo
  49. 55b78db 2026-07-08 Add /api/discontinued + red successor banner: dead/archived SKU resolves (dash/-SAMPLE insensitive) → links live successor
  50. ecdf294 2026-07-08 auto-save: 2026-07-08T10:35:15 (1 files) — scripts/fm-wallpaper-sync.mjs
  51. 949b520 2026-07-08 Stop tracking data/backfills/ ops artifacts; gitignore the dir (repo hygiene)
  52. 2ac9b38 2026-07-08 all.dw internal tool: default scope = all-but-archived (incl. Staged/DRAFT); fold DELETED_FROM_SHOPIFY into Archived
  53. 02ea04b 2026-07-08 env-ify Basic-Auth: support BASIC_AUTH_USER/PASS, default unchanged (admin:DW2024!)
  54. 7d0202a 2026-07-08 Enable Designtex live-stock (13→14): drop from SCHEMA_PARSE_PENDING after dw_sku backfill
  55. 005a048 2026-07-08 auto-save: 2026-07-08T09:04:55 (1 files) — scripts/build-coverage.js
  56. f78c637 2026-07-08 Document targeted-rsync deploy guardrail (no full-tree --delete on this repo)
  57. 104aa8f 2026-07-08 Designtex dw_sku backfill on Kamatera dw_unified: backup + rollback artifacts
  58. aa87b85 2026-07-08 add internal /api/catalog-full feed (every non-archived SKU, leak-sanitized, product_id/handle/tags) for substitute + photo apps
  59. 5dfa17e 2026-07-08 deploy: infinite-scroll fix (5cdaf8a) live to all.designerwallcoverings.com (targeted public/index.html)
  60. 053a837 2026-07-08 Deploy staged +Koroseal live-stock build to prod (Kamatera 45.61.58.125)
  61. 5cdaf8a 2026-07-08 Fix stuck infinite scroll: pump on live sentinel geometry, not stale observer flag
  62. 59f752c 2026-07-07 auto-save: 2026-07-07T20:32:33 (2 files) — config/known-subdomains.json scripts/crawl-microsites.js
  63. 27f01e1 2026-07-07 Koroseal live-proven: reject synthesized catalog URLs (false-discontinued fix) + record verification
  64. 1aabc95 2026-07-07 Integrate 5 vendor live-stock adapters: enable Koroseal (liveness), dim Designtex/Schumacher/Fabricut/Contrado honestly
  65. 050399a 2026-07-07 all.dw: register Pierre Frey Fabrics microsite (pierrefreyfabrics, distinct vendor label so no dedup-merge with wallcovering pierre-frey)
  66. 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)
  67. 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
  68. 3340f23 2026-07-07 live-stock: enable Thibaut in coverage (vault-cred proof landed on prod)
  69. a35f788 2026-07-07 live-stock: vault-cred adapter for Thibaut (creds referenced in place from dw-price-stock/.env)
  70. 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)
  71. d0fcf53 2026-07-07 chore: lint + light refactor (shared adapter helpers, named consts) + v1.1.0 (session close)
  72. d537f75 2026-07-07 all.dw: register Pierre Frey microsite (slug pierrefrey, wave-19 samples viewer, staged/launch-gated)
  73. 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
  74. 0ccd9b9 2026-07-07 live-stock: tune schema-public for Designers Guild + Marburg, remap Osborne SKUs, AS Creation honest-dim (8→11 live vendors)
  75. 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
  76. 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
  77. 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
  78. 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
  79. 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
  80. 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
  81. 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
  82. 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)
  83. 8c24b22 2026-07-07 all-dw: show Mfr # (mfr_sku) + Mfr Name (supplier_name) as card fields
  84. 94d8f0a 2026-07-07 This Item deep-link: capture full per-microsite handle set + resolve by membership (kills ~15-25% dead-ends)
  85. 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
  86. 435af85 2026-07-07 livestock: self-contained Browserbase backend (lib/romo-lib.js) so prod can run live checks without the skills dir
  87. bbcfd96 2026-07-07 livestock: one-click 'Check Live 🔄' — metered vendor-portal scrape endpoint + card control
  88. 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)
  89. 9ca2518 2026-07-07 internal: expand per-card Internal into Admin / Line Viewer / Check Stock grouped control
  90. a5f3545 2026-07-07 grid: Book/Series facet in left rail + Website/Internal buttons on every card & list row (graceful disable)
  91. 3876a0d 2026-07-07 api: carry series (Book) facet + website/internal_url per product
  92. 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)
  93. ce4838d 2026-07-06 untrack data/microsites.json (live crawl artifact) + restore .gitignore entry lost in prod reconcile
  94. 2d9b4a7 2026-07-06 all.: add visible /microsites.html directory (sort + density + infinite scroll over /api/microsites) + nav links from index & vendors
  95. 228a80f 2026-07-06 reconcile local to deployed prod (5bc3e1a) + re-layer microsite crawl feature onto true prod base
  96. 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
  97. 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)
  98. 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
  99. 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
  100. c8c8cd7 2026-07-02 banned front-facing vendor scrub on the public snapshot (Brewster/York/WallQuest/NewWall/... per build-data.py hard rule)
  101. 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
  102. 455cb72 2026-07-02 snapshot before full-catalog rebuild (vendor directory preserved at /vendors.html)
  103. 9e20e28 2026-07-02 staged one-shot go-live script (rsync + pm2 + nginx public-IP bind + CF DNS + certbot)
  104. 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
  • /zuber3
  • /style3
  • /type3
  • /livestock3
  • /nginx2
  • /live-stock-coverage2
  • /kravet-db2
  • /live-spend2
  • /skus2
  • /color2
  • /crezana2
  • /gracie2
  • /facets2
  • /substitute2
  • /fm-wallpaper-sync2
  • /backfills2
  • /romo2
  • /byte-identical1
  • /poll1
  • /exhaustion1
  • /backfill-kravet-mfr1
  • /vendor-contact1
  • /vendor-inquiry1
  • /similar1

Creative ideas + design notes

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

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

40 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 0ms