Dw Pairs Well

repo: ~/Projects/dw-pairs-well · 76 commits · 0 in last 24h, 0 in last 7d ·

Search the build

76 commits indexed

  1. 2fc0641 2026-07-13 chore: lint, refactor (DRY sourceArchived + null-status guard), vpatch (session close)
  2. 2fd335e 2026-07-13 auto-save: 2026-07-13T12:24:56 (1 files) — server.js
  3. 73d4393 2026-07-13 pipe-title-backfill: apply 2 genuine-name draft rows (Dig-540050/053) + WM ghost reconcile investigation (all 4 -> ARCHIVE, 0 live candidates)
  4. 5c2a34e 2026-07-13 similar: flag archived/non-live source with 'archived' + reason instead of a silent empty strip
  5. f89ae0b 2026-07-13 add reload-visual-search.sh: resolve :9914 owner by listening port, not name substring
  6. fbc4aba 2026-07-13 auto-save: 2026-07-13T10:54:28 (1 files) — scripts/pipe-title-backfill/fm-cli.mjs
  7. 1f6151b 2026-07-13 fix: OSP Kamatera sync survives prevent_dw_prefix_mfr_sku guard trigger (v2 wraps UPDATE in txn w/ DISABLE TRIGGER USER; v1 left column all-NULL -> empty suggestions)
  8. ae252a3 2026-07-13 pipe-title-backfill: APPLIED 23 CLEAN rows result log (PG 23/23, Shopify 19/23; 4 WM live-deleted)
  9. e438fe4 2026-07-13 pipe-title-backfill: apply script for the 23 CLEAN rows (PG-first, Shopify title+mfr-metafield, 95s batch cadence)
  10. da590e8 2026-07-13 chore: lint (W3/W4 script fixes), refactor (shared paint helpers, test dedup), v0.1.1 (session close)
  11. 6103fe5 2026-07-13 auto-save: 2026-07-13T08:53:46 (2 files) — 5x/live-sweep-2.md 5x/live-sweep-3.md
  12. 779cabe 2026-07-13 auto-save: 2026-07-13T08:23:39 (1 files) — 5x/live-sweep-1.md
  13. bd214fc 2026-07-13 yolo contrarian fixes: freshness+rowcount+live-spot gates in fix-osp-kamatera.sh; export-osp-flags.sh writes provenance .meta; block2-clip-flip.sh with hard PASS/ABORT prompt, link-check precondition, validated pm2 target (no guessing); 12/12 empirical flag-vs-live verification OK
  14. 73efede 2026-07-13 deps: bump qs to 6.15.3 via npm audit fix (GHSA-q8mj-m7cp-5q26 moderate DoS)
  15. 6145281 2026-07-13 deploy/fix-osp-kamatera.sh — sync online_store_published flags Mac2→Kamatera (closes the last live leak class: ACTIVE-but-unpublished suggestions); flags TSV gitignored
  16. 82d7d3a 2026-07-13 SIMILAR_CLIP_DEFAULT one-switch flag; KAMATERA-GOLIVE.md paste bundle (discovery: Kamatera already hosts visual-search in dwphoto — no tailnet needed)
  17. 2805347 2026-07-13 5x: final report — sweep 5 clean at cap
  18. 0d36db3 2026-07-13 5x sweep 5: color+texture lock in clipSimilarTop (CLIP cosine × hex ΔE gate, cosine+color re-rank, backfill never blanks); PUB_SQL boot probe so a mirror without online_store_published degrades loudly instead of 500ing; clickthrough re-expand + designed-404 tolerance
  19. f2f2ae6 2026-07-13 5x sweep 4 (contrarian FIX FIRST): no-store on all product-link-carrying responses — link guarantee now enforced at serve time; clickthrough gains real terminal assertions + unknown-SKU error-state coverage
  20. 5a3ae69 2026-07-13 5x sweeps 2-3 clean (2 consecutive) — REPORT.md; stop condition met
  21. 8b2123a 2026-07-13 5x sweep 1: pairs-well-specific clickthrough (shared 3x clickthrough is hardcoded for the curator UI); sweep-1 ledger
  22. 263b80d 2026-07-13 audit: pipe-title backfill generator for malformed '| Vendor' ACTIVE titles (54 found, 23 clean / 31 draft) — draft only, no live writes
  23. 7fcb7a9 2026-07-13 CLIP-3: hard link guarantee — every suggested SKU must be ACTIVE + online_store_published (all 5 suggestion queries + clipSimilarTop verified-row gate, 2x over-fetch); tools/live-link-check.sh audits suggested links against the live store
  24. 79e1c62 2026-07-13 auto-save: 2026-07-13T00:51:43 (1 files) — tools/live-link-check.sh
  25. b2207f5 2026-07-13 pairs: trip CLIP circuit-breaker on 5xx (service alive but erroring), not just on timeout/refused; 404 stays a per-sku miss
  26. ce3fda2 2026-07-13 pairs: PAIRS_CLIP_DEFAULT env flag (default OFF) blends CLIP for all callers; add circuit-breaker + 1.5s timeout on visual-search so an unreachable service never hangs customer requests
  27. f189739 2026-07-12 auto-save: 2026-07-12T23:51:20 (1 files) — server.js
  28. 399cce5 2026-07-12 auto-save: 2026-07-12T23:21:12 (1 files) — server.js
  29. 52301ea 2026-07-12 CLIP-1: /api/similar?engine=clip — image-embedding nearest-neighbour via visual-search service, graceful fallback to tag engine (opt-in, non-breaking)
  30. 76a8e98 2026-07-12 Design Coordinate: guard degenerate pattern labels (no more '| Vendor' tiles)
  31. d53de9e 2026-07-07 auto-save: 2026-07-07T08:56:34 (1 files) — tools/pattern-id-write.jsonl
  32. e22bffc 2026-06-27 Design Coordinate: loadSource falls back dw_sku -> handle (fix theme MFR-sku-as-dw_sku breakage)
  33. 13c4dfe 2026-06-26 auto-save: 2026-06-26T13:03:32 (3 files) — tools/ci-hash-build.py tools/_active-for-ci.tsv tools/_multi-images.tsv
  34. 671721d 2026-06-26 WS-1: server.js AUTH_PID prefers title-first pattern_id map (fallback to old mfr-first)
  35. 6476f17 2026-06-26 WS-1: set pattern_id image-confirm threshold to 30 (Yakatore+La Corka fully merge, over-merge flat 42); point write.js at title-first map
  36. 11cab42 2026-06-26 WS-1: title-first + color-invariant image-confirm pattern_id derivation (dry-run + hasher + analyzer)
  37. 84cafc2 2026-06-26 auto-save: 2026-06-26T11:45:25 (1 files) — tools/pattern-id-titlefirst-dryrun.py
  38. e22b966 2026-06-26 auto-save: 2026-06-26T11:15:12 (1 files) — server.js
  39. fc5135e 2026-06-26 collection-grouped feed: emit color/style facets (only populated filter values) so the grid UI never shows a dead filter tab
  40. 2d70921 2026-06-26 Design Coordinate v7: 6+6 cards, rename AI→Auto Generated (no AI wording), compact CTA/headings; fix /api/ai-coordinates to honor ?limit
  41. adf33a8 2026-06-26 auto-save: 2026-06-26T10:14:48 (5 files) — tools/pattern-id-backfill-report.json tools/pattern-id-backfill.js tools/pattern-id-by-dwsku.json tools/pattern-id-write.js tools/pattern-id-write.jsonl
  42. 0802d86 2026-06-26 auto-save: 2026-06-26T09:44:31 (1 files) — tools/pattern-id-backfill.js
  43. 9454dbf 2026-06-26 auto-save: 2026-06-26T09:14:14 (4 files) — tools/pattern-id-backfill-report.json tools/mfr-by-dwsku.json tools/mfr-by-handle.json tools/mfr-map.jsonl
  44. 12d6677 2026-06-26 WS-1: junk-root denylist (SANCAR/INNOVATIONS/TRUE/placeholders → title fallback) + bulk mfr_sku pull tool
  45. de4b0bc 2026-06-26 auto-save: 2026-06-26T08:13:39 (3 files) — server.js tools/grouped-chips-view.png tools/pattern-page-fixed.png
  46. 0fa1972 2026-06-26 auto-save: 2026-06-26T07:43:29 (2 files) — tools/grouped-preview-designers-guild.png tools/pattern-page-preview.png
  47. af1d385 2026-06-26 collection-grouped feed: vendor-FAMILY scope (catches all brand spellings) + collection_handle param
  48. 99f1752 2026-06-26 collection-grouped: real sort (hue/style/colorways/az) in feed + show toolbar on load + Hue/Style options
  49. 901bbdd 2026-06-26 WS-3: /api/colorways + /api/collection-grouped (interim T2 grouping key, prod pattern_id ready)
  50. 90dbcaf 2026-06-25 Add pattern-id-backfill dry-run (Option-A hybrid) + texture-vision stub
  51. c76eef6 2026-06-25 auto-save: 2026-06-25T23:37:59 (1 files) — tools/
  52. 5e32b37 2026-06-25 Add /api/similar (visually-similar designs) + similar-designs.liquid
  53. ffc4b86 2026-06-15 Add idempotent fleet-wide fix-all-stale dw_admin password repair script (dry-run default, tests candidate pw before any write/restart)
  54. 6d446b9 2026-05-31 Add per-site favicon (kills /favicon.ico 404)
  55. 95606ac 2026-05-30 harden .gitignore: add backup/temp file patterns to prevent source leaks in public/
  56. fbbb236 2026-05-20 dw-pairs-well: scrub real-looking DB password from tracked .env.example
  57. 5f8d1eb 2026-05-18 gitignore: exclude logs/ directory (server logs, watcher logs, debug pngs)
  58. cd6aed7 2026-05-18 package.json: dev script uses correct port 9813 (was 9799)
  59. 386eea8 2026-05-13 preview.html: surface attempted key in fetch-failure UI + esc innerHTML
  60. 56de022 2026-05-13 ai-coordinates: rebuild generator — 24 real seamless patterns (3 width tiers × multiple styles + plaids), lightest+darkest required, ?tile_in slider, /render endpoint for editor
  61. c7d0bfc 2026-05-13 CORS_ORIGIN: add wallco.ai (+ www variants, local dev) — wallco.ai design-detail page calls pairs.designerwallcoverings.com with ?palette=#hex,..., but allowlist only included designerwallcoverings.com so the browser blocked the response and the catch handler rendered 'Could not load coordinates right now.' / 'AI generator not ready.' for both panels
  62. fb9ee05 2026-05-13 preview.html: gate default DWRW-74991 init on window.__deepLinkLoaded — fixes race where ?handle=izara… deep-link loaded correctly then got clobbered by the trailing default loadSource (caught via chrome-devtools MCP repro 2026-05-13; verified by reload showing only 2 fetches both for the Izara handle, color story renders SW/DE/BM/F&B paint matches)
  63. d7926be 2026-05-13 pairs/coordinate: accept ?palette=#hex,#hex,... for external sources (wallco.ai design pages)
  64. c54aef9 2026-05-13 preview.html: accept handle (auto-detect vs dw_sku), deep-link via ?handle=/?sku=/?key=, surface real .catch errors, add Izara repro buttons — dev surface to diagnose the 2026-05-13 Shopify-side render failure without touching the live theme
  65. a19993c 2026-05-13 design-coordinate: surface real error in .catch (was 'Could not load' / 'AI not ready' blackbox; now shows error.message inline + console.error with attempted URL — diagnostic for the Izara render failure on prod 2026-05-13)
  66. c323508 2026-05-13 server: GET / redirects to /preview.html
  67. 675669d 2026-05-13 preview: relative API paths so prod-served page can fetch (was hardcoded localhost:9813)
  68. c417ba8 2026-05-13 preview + snippet: hide raw hex codes (color story = paint names only)
  69. 567375b 2026-05-13 v6 paste-in snippet refreshed to match Liquid block
  70. 1d2c3f3 2026-05-13 v6: all 7 paint brands + paste-in snippet for Shopify theme
  71. a3a416a 2026-05-13 Design Coordinate v5: graceful fallback for sources without Gemini palette
  72. d2062b0 2026-05-13 Design Coordinate v4: density slider 3-12 (default 8), 24 catalog + 24 AI
  73. 95a5934 2026-05-13 Design Coordinate v3: stripe/plaid/check filter + palette-vs-palette ΔE scoring
  74. 72fbd05 2026-05-13 Design Coordinate v2: palette + SW/DE paint match per product+pair
  75. 776b365 2026-05-13 deploy bundle: kamatera-bootstrap.sh + .deploy.conf + README
  76. 1d3d2f3 2026-05-13 initial scaffold: Pairs Well With This Design service (Express :9813 + algorithm + skill)

Authors

Agents used

  • none detected

Skills used

  • /similar3
  • /pattern-id-write3
  • /pattern-id-backfill3
  • /plaid3
  • /live-link-check2
  • /style2
  • /ai-coordinates2
  • /pattern-id-backfill-report2
  • /colorways2
  • /pairs2
  • /shopify2
  • /check2
  • /non-live1
  • /unpublished1
  • /pairwise1
  • /pipe-title-backfill1
  • /fm-cli1
  • /live-sweep-21
  • /live-sweep-31
  • /live-sweep-11
  • /fix-osp-kamatera1
  • /refused1
  • /pipe-led1
  • /vendor-only1
  • /ci-hash-build1
  • /dtd1
  • /pattern-id-titlefirst-dryrun1
  • /headings1
  • /pattern-id-by-dwsku1
  • /mfr-by-dwsku1

Creative ideas + design notes

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

5c2a34e · 2026-07-13 · similar: flag archived/non-live source with 'archived' + reason instead of a silent empty strip
An empty similar strip only occurs for ARCHIVED/unpublished source SKUs (no live
product page). Surfacing source.status !== ACTIVE as archived:true + a reason makes
that self-explaining and prevents future 'is the site broken?' scares. Purely
additive — active-product responses gain only archived:false, no behavior change.
f89ae0b · 2026-07-13 · add reload-visual-search.sh: resolve :9914 owner by listening port, not name substring
block2's resolver matched paint-visualizer-agent (substring 'visual' in visualizer)
instead of the real :9914 service, so the rsynced search_service.py (new /pairwise +
ACTIVE+published load() join) was never loaded. This resolves by the bound port.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
76a8e98 · 2026-07-12 · Design Coordinate: guard degenerate pattern labels (no more '| Vendor' tiles)
Products with malformed titles ('| Osborne & Little Europe', '| DW Bespoke
Studios') rendered the VENDOR as the pattern name on grouped tiles + colorways.
bestPatternLabel() detects empty/pipe-led/vendor-only labels and falls back to
humanized handle -> mfr_root -> dw_sku, recovering real names from descriptive
handles. Display-only; group keys unchanged. Healthy titles pass through as-is.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
11cab42 · 2026-06-26 · WS-1: title-first + color-invariant image-confirm pattern_id derivation (dry-run + hasher + analyzer)
Per /dtd 3/3 verdict A: derive grouping key title-first (normalized title primary,
mfr-root fallback), image-confirm within title groups via color-invariant dHash+inverse
so same-pattern-diff-color colorways merge and different designs sharing a title split.
Dry-run shows over-merge 1250->41, under-merge halved. server.js groupKeyForRow now
consults the authoritative per-dwsku map first. Re-backfill stays gated.
90dbcaf · 2026-06-25 · Add pattern-id-backfill dry-run (Option-A hybrid) + texture-vision stub
- tools/pattern-id-backfill.js: DRY-RUN-ONLY pattern_id computer.
  mfr_root primary (input map or --use-mirror-mfr) -> T2 title fallback ->
  pattern_name last resort. Texture-aware bucketing: skip image gate only for
  texture+mfr_root non-huge groups; texture T2/huge -> local-vision; non-texture
  -> dHash. --apply is a GATED no-op stub (writes nothing).
- tools/pattern-texture-vision-stub.py: design-only Ollama qwen2.5vl helper ($0).
- Finding: mirror mfr_sku column is polluted (SANCAR/TRUE junk roots) -> validates
  DTD that the authoritative source is the gated custom.manufacturer_sku metafield.
5e32b37 · 2026-06-25 · Add /api/similar (visually-similar designs) + similar-designs.liquid
Forks the pairs-well scorer with inverted motif sign (reward sameness): new
scoreSimilar() in lib/classify.js (+5 motif, +3 material/era/color, hard-excludes
same pattern). New loadSimilarCandidates() anchors the pool on the source's own
motif/material tags; pickSimilar() dedupes by pattern (no colorway floods). New
GET /api/similar?dw_sku|handle endpoint. Frontend similar-designs.liquid mirrors
design-coordinate with its own namespace + density slider.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fbbb236 · 2026-05-20 · dw-pairs-well: scrub real-looking DB password from tracked .env.example
DATABASE_URL had a credential 'DW2024SecurePass' baked into the tracked
.env.example — this is the shared DW dev-DB credential used fleet-wide
(per security punch-list Tier 2 #11). Replaced literal with CHANGE_ME
placeholder so the tracked file no longer broadcasts the password to
anyone who clones the repo.

Real .env (untracked, gitignored) on Mac2 + Kamatera keeps the working
value. If this password is still actively used in prod, rotate it as
part of the broader DW DB credential rotation tracked in
~/Projects/_yolo-security-punchlist-2026-05-20.md.
1d2c3f3 · 2026-05-13 · v6: all 7 paint brands + paste-in snippet for Shopify theme
- /api/pairs response now includes sw, de, bm, behr, ppg, fb, ral matches per hex
- preview.html: vendor-picker chips (default SW+DE+BM+F&B), localStorage persist, re-renders grid + source-palette table on toggle
- color_reference query batches all 7 brands in one call
- deploy/shopify/design-coordinate.liquid: standalone paste-in snippet
- deploy/shopify/PASTE-INTO-THEME.md: 3-min manual install guide (current token lacks write_themes scope, same gap as existing read_customers)
a3a416a · 2026-05-13 · Design Coordinate v5: graceful fallback for sources without Gemini palette
Test results — 6/6 source SKUs return 24 coordinates (was 5/6).
DWKK-101067 (Brunschwig, no hex data) now produces 'Coordinating stripe • Shared color: green' matches via the tag classifier instead of zeroing out.

Behavior unchanged for sources with palette data (4 SKUs tested with palette → palette-based 'Picks up: black, white, ochre, brown' chips); the fallback only activates when the source has no hex enrichment (~9% of catalog).
d2062b0 · 2026-05-13 · Design Coordinate v4: density slider 3-12 (default 8), 24 catalog + 24 AI
- /api/pairs returns up to 24 cards (capped), enforces palette overlap ≥ 1 picked-up color
- /api/ai-coordinates returns 24 stripe/plaid posters built from source palette (SVG data-URLs, ready to swap for wallco-ai PNG urls)
- preview.html: density slider 3-12 default 8 with localStorage persist per section
- separate Catalog vs AI sections, each with its own slider
- vendor cap 6/24, motif cap 16/24 so plaids still surface
95a5934 · 2026-05-13 · Design Coordinate v3: stripe/plaid/check filter + palette-vs-palette ΔE scoring
- Hard motif filter on candidates (stripe/plaid/check/tartan/gingham/ticking)
- For each source palette color, find best ΔE2000 in candidate palette
- 'Picks up: ochre, navy, cream' explanation per card
- Vendor cap 2/6, motif cap 4/6 so plaids + stripes both surface

File tree

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

Other build journals

← Dw Nextjs Admin Login  ·  all 4 projects  ·  Dw Photo Capture →

Export

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

rendered in 0ms