All Designerwallcoverings
Search the build
-
09077cc2026-07-27 auto-save: 2026-07-27T15:21:37 (1 files) — package-lock.json -
699a5fd2026-07-27 chore: v1.7.0 — async job+poll live-check feature (session close) -
26c4bba2026-07-27 astek CF-Access: env-gated service-token headers on crawler + feed proxy (TK-11, memo 260727A) -
ae33f6d2026-07-27 auto-save: 2026-07-27T14:51:27 (1 files) — server.js -
76b03722026-07-27 all.dw: raise live-scrape worker timeout 52s->75s (async/poll decoupled from proxy cap; genuine ~63s scrapes now complete) -
ad479fd2026-07-27 all.dw: async job+poll for metered live check (never 504s the proxy) -
fde98d32026-07-23 auto-save: 2026-07-23T12:20:57 (1 files) — server.js -
eb95b2f2026-07-16 auto-save: 2026-07-16T17:13:50 (1 files) — package-lock.json -
9d4985f2026-07-16 chore: v1.6.1 (session close — lint ✓ clean, refactor ✓ no-change, code verified clean as shipped) -
763b16b2026-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 -
c3f43e42026-07-16 auto-save: 2026-07-16T16:43:46 (1 files) — data/live-stock-coverage.json -
1e3c12a2026-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 -
fc6f2ba2026-07-16 all-dw: add schumacher to BANNED regex (internal-only vendor) -
81aa19f2026-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 -
8a79e7b2026-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 -
3658c7c2026-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 -
c5afd0d2026-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 -
add8bb32026-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 -
750e7f42026-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 -
f9158ab2026-07-15 Kravet family gets a $0 authoritative-price live check (kravet-db adapter, DB_AUTHORITATIVE tier) -
016fb392026-07-15 chore: vendor_contacts self-heal DDL, microsites compose validation, v1.6.0 (session close) -
3fa3f9f2026-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) -
9317a402026-07-14 chore: v1.5.0 (session close — pm2 viewer auto-discovery + /api/skus feed) -
80c128c2026-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 -
2a6cffc2026-07-14 chore: v1.4.1 (session close) — vendor facet alpha-sort -
ce9854c2026-07-14 all.dw: vendor facet sorts alphabetically by name on load (was by count) -
7e644212026-07-14 Contrarian fixes: scope crawler cred to internal hosts only; correct zuber-internal note :10105; de-mislead quadrille internalViewer (public-served) -
26c19852026-07-14 Crawler: derive membership handle + title from mfr_sku/pattern_name when feed omits them (fixes gracie/zuber 0-count) -
22ee0772026-07-14 Fix crezana internalViewer port 10104->10106; vendor-name fallback for gated 401 directory titles -
f5cefcb2026-07-13 chore: v1.4.0 — similar-pattern search feature (session close) -
80f0bae2026-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 -
301550f2026-07-09 auto-save: 2026-07-09T22:42:31 (2 files) — data/vendors.json scripts/__pycache__/ -
1fa387b2026-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) -
f37876c2026-07-09 auto-save: 2026-07-09T22:12:24 (1 files) — server.js -
9d3836e2026-07-09 microsite crawler: seed from Cloudflare zone (authoritative, self-completing) + register -internal viewers -
c22ea622026-07-09 all.dw: make microsite feed ports env-overridable (MICROSITE_FEED_PORTS) -
b2fc39c2026-07-09 all.dw: surface 4 luxury lines (Fromental/Gracie/Zuber/Crezana) via microsite full-feeds -
5def1fd2026-07-09 all.dw: register Fromental/Gracie/Zuber/Crezana brands (onboarding/staging, quote-only, import+deploy gated) -
cdc1dcf2026-07-09 chore: lint (node --check ✓), v1.3.0 (session close) -
287e09e2026-07-08 Designtex dw_sku backfill on mac3 CANONICAL dw_unified: provenance note (288 rows, artifacts durable on-disk, gitignore honored) -
fe345ea2026-07-08 all. cards: gallery count badge + hover-cycle through full Shopify image set -
08c62372026-07-08 Full Shopify image galleries: bulk-sync product_images + serve images[] in feed -
75328f42026-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 -
de111d42026-07-08 shopify-push: portable Shopify-lib resolution (env/mac3/co-located) for deploy safety -
25613cb2026-07-08 List view: add Mfr # column with DW·Shop·FM mismatch breakout -
d3b82a52026-07-08 Mismatch chip: show DW number alongside Shopify + FileMaker mfr numbers -
f088c732026-07-08 chore: v1.1.0 → v1.2.0 (session close — feed + discontinued-successor features) -
8ed57a02026-07-08 FileMaker WALLPAPER as source of truth across all./substitute/photo -
55b78db2026-07-08 Add /api/discontinued + red successor banner: dead/archived SKU resolves (dash/-SAMPLE insensitive) → links live successor -
ecdf2942026-07-08 auto-save: 2026-07-08T10:35:15 (1 files) — scripts/fm-wallpaper-sync.mjs -
949b5202026-07-08 Stop tracking data/backfills/ ops artifacts; gitignore the dir (repo hygiene) -
2ac9b382026-07-08 all.dw internal tool: default scope = all-but-archived (incl. Staged/DRAFT); fold DELETED_FROM_SHOPIFY into Archived -
02ea04b2026-07-08 env-ify Basic-Auth: support BASIC_AUTH_USER/PASS, default unchanged (admin:DW2024!) -
7d0202a2026-07-08 Enable Designtex live-stock (13→14): drop from SCHEMA_PARSE_PENDING after dw_sku backfill -
005a0482026-07-08 auto-save: 2026-07-08T09:04:55 (1 files) — scripts/build-coverage.js -
f78c6372026-07-08 Document targeted-rsync deploy guardrail (no full-tree --delete on this repo) -
104aa8f2026-07-08 Designtex dw_sku backfill on Kamatera dw_unified: backup + rollback artifacts -
aa87b852026-07-08 add internal /api/catalog-full feed (every non-archived SKU, leak-sanitized, product_id/handle/tags) for substitute + photo apps -
5dfa17e2026-07-08 deploy: infinite-scroll fix (5cdaf8a) live to all.designerwallcoverings.com (targeted public/index.html) -
053a8372026-07-08 Deploy staged +Koroseal live-stock build to prod (Kamatera 45.61.58.125) -
5cdaf8a2026-07-08 Fix stuck infinite scroll: pump on live sentinel geometry, not stale observer flag -
59f752c2026-07-07 auto-save: 2026-07-07T20:32:33 (2 files) — config/known-subdomains.json scripts/crawl-microsites.js -
27f01e12026-07-07 Koroseal live-proven: reject synthesized catalog URLs (false-discontinued fix) + record verification -
1aabc952026-07-07 Integrate 5 vendor live-stock adapters: enable Koroseal (liveness), dim Designtex/Schumacher/Fabricut/Contrado honestly -
050399a2026-07-07 all.dw: register Pierre Frey Fabrics microsite (pierrefreyfabrics, distinct vendor label so no dedup-merge with wallcovering pierre-frey) -
acfd50a2026-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) -
97594822026-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 -
3340f232026-07-07 live-stock: enable Thibaut in coverage (vault-cred proof landed on prod) -
a35f7882026-07-07 live-stock: vault-cred adapter for Thibaut (creds referenced in place from dw-price-stock/.env) -
9c2f43a2026-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) -
d0fcf532026-07-07 chore: lint + light refactor (shared adapter helpers, named consts) + v1.1.0 (session close) -
d537f752026-07-07 all.dw: register Pierre Frey microsite (slug pierrefrey, wave-19 samples viewer, staged/launch-gated) -
77f866b2026-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 -
0ccd9b92026-07-07 live-stock: tune schema-public for Designers Guild + Marburg, remap Osborne SKUs, AS Creation honest-dim (8→11 live vendors) -
3790ba82026-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 -
d1be0d22026-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 -
2c397b42026-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 -
875d3382026-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 -
5d8857a2026-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 -
803861a2026-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 -
af39b752026-07-07 live-stock adapter framework: generalized per-vendor registry (wallquest/romo/shopify-public/woo-public), coverage-driven enable+dim, live-scrape.js dispatcher -
93e37e22026-07-07 live-stock coverage audit: classify all 254 display-vendors into feasibility tiers (data/live-stock-coverage.json + scripts/build-coverage.js) -
8c24b222026-07-07 all-dw: show Mfr # (mfr_sku) + Mfr Name (supplier_name) as card fields -
94d8f0a2026-07-07 This Item deep-link: capture full per-microsite handle set + resolve by membership (kills ~15-25% dead-ends) -
97692002026-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 -
435af852026-07-07 livestock: self-contained Browserbase backend (lib/romo-lib.js) so prod can run live checks without the skills dir -
bbcfd962026-07-07 livestock: one-click 'Check Live 🔄' — metered vendor-portal scrape endpoint + card control -
ef3b79c2026-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) -
9ca25182026-07-07 internal: expand per-card Internal into Admin / Line Viewer / Check Stock grouped control -
a5f35452026-07-07 grid: Book/Series facet in left rail + Website/Internal buttons on every card & list row (graceful disable) -
3876a0d2026-07-07 api: carry series (Book) facet + website/internal_url per product -
7f71cd12026-07-06 microsites.html: density slider 1-30 with live readout + sort every field (products/name/slug/type both dirs, catalog/live/gated) -
ce4838d2026-07-06 untrack data/microsites.json (live crawl artifact) + restore .gitignore entry lost in prod reconcile -
2d9b4a72026-07-06 all.: add visible /microsites.html directory (sort + density + infinite scroll over /api/microsites) + nav links from index & vendors -
228a80f2026-07-06 reconcile local to deployed prod (5bc3e1a) + re-layer microsite crawl feature onto true prod base -
260257f2026-07-06 all.: add live *.designerwallcoverings.com microsite crawl (directory + merged products), served at /api/microsites, polled every 10 min in-process + launchd -
96f3c152026-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) -
bb41e312026-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 -
86857a52026-07-02 portable snapshot SQL: probe optional mirror-only columns (min_variant_price, online_store_published) so the same code runs on Kamatera canonical -
c8c8cd72026-07-02 banned front-facing vendor scrub on the public snapshot (Brewster/York/WallQuest/NewWall/... per build-data.py hard rule) -
0ff51f22026-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 -
455cb722026-07-02 snapshot before full-catalog rebuild (vendor directory preserved at /vendors.html) -
9e20e282026-07-02 staged one-shot go-live script (rsync + pm2 + nginx public-IP bind + CF DNS + certbot) -
cc3b3f52026-07-02 initial scaffold: front-facing vendor directory (all dw_unified vendor ids, private-label safe)
Authors
- Steve96
- steve8
Agents used
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
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
- .deploy.conf
- .gitignore
- CLAUDE.md
- config/known-subdomains.json
- data/live-stock-coverage.json
- data/vendors.json
- docs/designtex-dwsku-mac3-backfill-20260708.md
- docs/live-stock-creds-in-place.md
- lib/romo-lib.js
- package-lock.json
- package.json
- public/index.html
- public/microsites.html
- public/vendors.html
- scripts/__pycache__/build-data.cpython-314.pyc
- scripts/adapters/contrado.js
- scripts/adapters/creds.js
- scripts/adapters/designtex.js
- scripts/adapters/fabricut.js
- scripts/adapters/index.js
- scripts/adapters/koroseal.js
- scripts/adapters/kravet-db.js
- scripts/adapters/resolve.js
- scripts/adapters/romo.js
- scripts/adapters/schema-public.js
- scripts/adapters/schumacher.js
- scripts/adapters/shopify-public.js
- scripts/adapters/thibaut.js
- scripts/adapters/wallquest.js
- scripts/adapters/woo-public.js
- scripts/backfill-kravet-mfr.js
- scripts/build-coverage.js
- scripts/build-data.py
- scripts/crawl-microsites.js
- scripts/deploy-live.sh
- scripts/fm-wallpaper-sync.mjs
- scripts/live-scrape.js
- scripts/shopify-images-sync.mjs
- scripts/shopify-push.mjs
- server.js