Shared
Search the build
-
a9e4e022026-07-26 auto-save: 2026-07-26T20:15:38 (1 files) — fleet-registry -
489ac802026-07-18 snapshot: bump submodule pointer(s) -
f6a215b2026-07-17 auto-save: 2026-07-17T19:47:29 (1 files) — fleet-registry -
f63fb282026-07-10 auto-save: 2026-07-10T14:39:00 (2 files) — fleet-registry scripts/run-guard.sh -
2dbe0182026-07-07 auto-save: 2026-07-07T08:56:34 (3 files) — fleet-registry designer-personas/ dust2026-carwash-usage-review.md -
934e7d72026-07-05 Dust2026 full-backlog sweep: manifest + prestige owned-media seed -
dfe23f82026-07-03 corner-nav: move login to its own hamburger in upper-left (panel slides from left) -
20c8a972026-07-03 add shared ollama-enrich.mjs (local vision enrichment helper) -
95c62b62026-07-03 chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew) -
90a4d322026-07-01 auto-save: 2026-07-01T14:36:50 (1 files) — fleet-registry -
7df0d182026-06-25 auto-save: 2026-06-25T16:05:06 (1 files) — fleet-registry -
bc008002026-06-24 auto-save: 2026-06-24T17:28:32 (1 files) — fleet-registry -
969afef2026-06-24 auto-save: 2026-06-24T16:58:22 (1 files) — fleet-registry -
b8f975e2026-06-24 auto-save: 2026-06-24T16:28:13 (1 files) — fleet-registry/ -
3ecfa012026-06-20 promo-banner: auto-contrast ink (fix white-on-light-accent invisibility) + fix template-literal regex escape-collapse in parseRGB -
5f885912026-06-19 Tier B promo strip: _universal-promo-banner.js drop-in — serves /dw-promo-banner.js + injects the script into every static-served HTML page (buffers res.write/end to catch express.static), identical 'New · <product> →' strip from /api/products?sort=newest; no per-site index.html edits -
8408a2b2026-06-16 Track decade-palettes.mjs (shared decade-palette script, created 2026-06-01, previously untracked) -
c678c4d2026-06-16 Track dw-theme-nav.js (shared theme nav component, created 2026-06-01, previously untracked) -
b4fbe6f2026-06-16 image-proxy: add CONSUMERS header documenting the 5 live dependents (not dead code — load-bearing for the /img vendor-redaction proxy fleet-wide) -
1c94a842026-06-16 api-vendor-redact: add non-mutating warm(products) export to pre-warm the /img token map at boot (closes cold-start 404 window; additive, sites that don't call it are unaffected) -
71532842026-06-14 Add pm2-restart.sh wrapper (sources .env + --update-env) + stale-env audit (113 bare offenders) -
3a4346d2026-06-11 rail-match: add optional synonyms layer + shared default synonym map -
044f4582026-06-09 step2 codemod: deterministic dual-key /sample + handle_display fleet edit script -
d78332a2026-06-09 gitleaks allowlist: secrets-audit report files (placeholder DSN templates are the findings, not leaks) -
4011e2b2026-06-03 api-vendor-redact: wire redactVendorText to scrub vendor names from displayed sku + emit vendor-scrubbed handle_display (raw handle left intact for buy-links) — text-leak Step 1 -
25b9a002026-06-03 add vendor-text-redact.js (PROVEN-offline concatenated+bare vendor handle/sku scrubber; NOT yet wired — awaiting Steve go on deploy approach per DTD verdict C) -
be9b8d82026-06-03 api-vendor-redact: also proxy image_url/images CDN urls -> /img/<token> (kills vendor-name-in-filename leak on client-rendered sites); serve /img/:token from the same middleware with map-miss fall-through -
60cdadd2026-06-03 Add fleet vendor-leak scan + scrub tooling (task 41; reuses api-vendor-redact) -
90f45c02026-06-03 Add image-proxy.js: vendor-neutral /img/<token> proxy module for standalone sister-site storefronts (imgToken/proxyImg/scrubProduct/mount) -
c3f9ad52026-06-02 scripts: pm2-daily-fleet.sh — daily cron wrapper for safe batched fleet restart -
11595c22026-06-02 scripts: pm2-batch-restart.cjs — safe staged fleet restart (batches of 6, never mass-reload) -
36212852026-06-01 api-vendor-redact: export redact(body) (=walk) for non-Express raw-http servers -
c72e0112026-06-01 api-vendor-redact: export scrubTitle + isVendorTag for reuse (fliepaper data pre-scrub) -
34b54902026-06-01 api-vendor-redact: drop Brand_/Vendor_/Color_ metadata tags + normalize underscores + optional and/& connector (Brand_Lincrusta, farrow-ball) -
78173f02026-06-01 api-vendor-redact: fall back to house brand when vendor was the entire product name (Lincrusta); global vendor strip -
fa0646c2026-06-01 api-vendor-redact: accept & as well as 'and' in multi-word vendors (Clarke & Clarke etc) -
003d5302026-06-01 api-vendor-redact: comprehensive 100-vendor denylist from dw_unified (adds Malibu/AS Creation/China Seas/Rebel/Mind the Gap/Newmor/1838/etc; keeps house brands + William Morris) -
e8d93322026-06-01 api-vendor-redact: strip mid-title vendor tokens (Golden Versace.../Shimmer 1 Arte...) the lead/suffix passes missed -
1d89e442026-06-01 api-vendor-redact: scrub vendor names from tags[] arrays (display chips) — Schumacher/Maya Romanoff/Harlequin/Arte etc; keep house brands -
66ed6722026-06-01 eyebrow scripts: apply claude-codex confirmed findings #1-#3,#5 -
b4569232026-06-01 fix-eyebrow-surgical: harden per claude-codex DTD (FIX 1/2/5) -
4d7745e2026-06-01 hero-bg deploy script -
10fa91b2026-06-01 deploy-hero-ideas: comment-aware verify (sed couldn't strip comments containing >, caused 28 false VERIFY-FAILs; all 51 actually deployed clean) -
8c0fcb32026-06-01 fix-eyebrow-surgical: resolve prod path per site (var/www OR /root/Projects) -
a2dbff92026-06-01 add fix-eyebrow-surgical.sh — in-place prod eyebrow collapse (no clobber of prod-only drift) -
e1f28352026-06-01 hero/ideas fleet deploy script -
61380c52026-06-01 add deploy-fleet-eyebrow.sh — dry-run-by-default prod deploy for the Ideas-eyebrow fix -
215d4f82026-06-01 Big Red: removal fanout + safe left-move redeploy (rsync-only, no reload) -
0ffff422026-06-01 TODO: mark PoppyPetitions audit-events table done (77c4ca8) -
45ce0fd2026-06-01 gitleaks: scrub literal password names from explanatory comment too -
2c29d652026-06-01 gitleaks: drop literal-password rules, use generic hardcoded-credential pattern (no live secret in scanner config) -
9d0095e2026-05-31 gitleaks: escape dw-postgres-password literal regex (was crashing gitleaks fleet-wide — invalid repetition operator) -
9ff529e2026-05-31 Add rendered contact-sheet.png (181 favicons, live-href version) -
92e485f2026-05-31 Contact sheet: clickable live-site hrefs (92/181 mapped via site.config + nginx/pm2), dim local-only tiles -
bafce0a2026-05-31 Regenerate favicon contact sheet (181 favicons, post-href pass) -
e546ef12026-05-31 Add add-favicon-href.js — insert favicon <link> into sites that have favicon.svg but no head reference -
f1fb28d2026-05-31 Add favicon contact-sheet generator + rendered grid of all fleet favicons -
e80c8d22026-05-31 Add gen-fleet-favicons.js — per-site branded favicon generator (kills /favicon.ico 404 fleet-wide, non-clobbering) -
22d34612026-05-30 debriefs: add gitignore for mp4s; mark session-debrief item 20 done -
01246412026-05-30 TODO reconciliation: mark multi-tenancy cutover WON'T-DO (parked by design, no demand) -
4926af62026-05-30 TODO: mark item 22 done (peer-survey) -
6f865052026-05-30 add grant peer survey — competitive intel on Instrumentl/GrantStation/FDO/Submittable + pricing rec -
a0c9c4f2026-05-30 TODO: mark item 21 done (Grant landing mockups already shipped) -
3238ace2026-05-30 TODO: mark item 19 Petition Pulse done (Patty ca02103) -
cc8e0602026-05-30 TODO: check off Federal Register integration (Grant 4256838) -
d521bf42026-05-30 TODO: mark P1-E + P1-F done (PoppyPetitions session-binding + NULL race) -
76c5e742026-05-30 wave3-radar + TODO: mark Freddy middleware/gemini port done -
9fe01b12026-05-30 wave3-radar: add info@ mailbox row per 'every site needs info@' rule -
dc7284c2026-05-30 todo: mark items 12+13 done — secret-strip Norma + DW commerce sweeps (CNCP follow-through) -
c7b937a2026-05-30 TODO: check off PoppyPetitions P1-B length caps (already shipped 7f44f02) -
c7041022026-05-30 TODO: record gitleaks secret-scan hooks installed fleet-wide (305 repos) -
4ed0ea82026-05-30 Add gitleaks pre-commit secret-scan tooling (CNCP _shared Lane B) -
502888c2026-05-26 sku-redact: shared display-only vendor scrubber for product identifiers (card meta/list/detail) -
47e8b212026-05-26 api-vendor-redact: stripLeadVendor — strip vendor baked into head of product name (Kravet/Versace/Nina Campbell/Fentucci/etc.), bare names fall back to 'Designer Wallcovering' (DTD X+P, Steve go) -
d8a636a2026-05-26 docs: staged proposal for 46 residual vendor-name-leads-product-name renames (31 auto + 15 manual); not applied -
e040ac12026-05-26 rail-match: export productInRail (tag-aware facet filter) + ledger: regression fix + batch-3 revert -
0a289e92026-05-26 ledger: editorial-label + zero-firing deploy to Kamatera (38 sites live) -
a5fba912026-05-26 ledger: 9 rail-fixed sites DEPLOYED to Kamatera (helper-first ordering, all 200 + 5-6 rails live) -
4e4a2352026-05-26 ledger: batch-2 rail-helper fixes (fabric/healthcare/1900s/silkwallcoverings) + loop convergence note -
d7201c12026-05-26 rail-match: shared read-time tag rail builder (hybrid, DTD verdict D) + ledger resolution for 5 degenerate sites -
069ad2e2026-05-26 api-vendor-redact: scrubTitle keeps leading product name only, drops all vendor/collection/category suffix segments + 'By <vendor>' attributions, preserves DW house brands (Steve sign-off, structural approach) -
513cc612026-05-26 api-vendor-redact: keep Hollywood house brand + drop york/romo/stout/knoll raw tokens (Steve sign-off); real vendors still caught by category word -
c3f64672026-05-26 ledger: zero-firing-rails fix (3 repointed) + 6 thin-catalog sites flagged -
b92fe9d2026-05-26 api-vendor-redact: scrub vendor-name suffix from title/imageAlt/description (DTD verdict A; sku/handle left for data-layer pass; STAGED, not deployed) -
b4ecb7a2026-05-26 ledger: fleet-wide editorial-label extension (36 sites) + zero-firing-rails finding -
1b0168b2026-05-26 rails sweep: add fleet-rails audit script + deploy-log record (35 sites rails-rendering, 3 pairs consolidated) -
24184b82026-05-26 ledger: follow-up #1 (editorial rail labels) done on 8 sites -
b81776d2026-05-26 fleet-rails-sweep: close-out — all 4 slices DONE, 10 trailing config-rails fixes committed, follow-ups logged -
f70c5522026-05-26 fanout-rails-deploy: also force-ship data/products.json when server.js reads it (customdigitalmurals empty rails fix) -
36a05fc2026-05-26 fanout-rails-deploy: auto-detect path via pm2 describe + skip redirects/lander + ship runtime deps (hollywood site.config.json hotfix) -
08b6f952026-05-26 consolidate-fleet-sweep.sh — post-sweep audit: verdict counts, per-site commits, pattern-divergence check (hollywood vs retrowalls canonical), sort+density coverage -
df5d1612026-05-26 backfill-hollywood-tags.js — paginated /products.json scrape → bulk-UPDATE microsite_products.tags by handle, single tx. Reports tag-vocabulary frequency so rails can be picked from real catalog vocab -
757bc472026-05-26 merge-tags-into-products-json.js — overlay PG microsite_products.tags/aesthetic onto a site's static data/products.json (handle-keyed, lossless, preserves dw_sku/mfr_sku/retail_price/metafields/image_url). Dry-run by default; --apply writes with .bak-<ts> backup. First user: hollywood-wallcoverings (3224/3224 matched) -
cb542182026-05-25 add api-vendor-redact middleware — strips vendor names from /api/* responses -
b31eed92026-05-25 rebucket: add --safe flag + SITE_BASES env + slug-with-hyphen resolver -
267170f2026-05-25 add retag-aesthetics-from-pg.js — fleet-wide aesthetic backfill -
dca05e52026-05-25 fix(microsite-aesthetic): match hyphenated rails like art-nouveau, arts-crafts -
993096a2026-05-19 fix-card-title-wrap script — fleet-wide overflow-wrap on .card .pat (long-token clip prevention) -
447e50e2026-05-19 fix-theme-toggle script — null-guard the dead #theme-toggle reference fleet-wide -
c76ca1a2026-05-19 backfill-microsite-images — fill image_url from images[] for wallsandfabrics + customdigitalmurals -
332c2b32026-05-19 stage2-followups script — slug-collision re-migration + thin-catalog pull from DW master -
140643f2026-05-19 admin-catalog: drag products from grid into collections (clone), ×-remove chips -
d3722ad2026-05-19 connect to dw_unified via unix-socket peer auth (no password) -
2af30972026-05-19 fleet admin catalog — schema, classifier, migration, mountable admin-catalog module -
d30d4102026-05-14 fleet: tossed-domains list — recycledwallpaper.com (expired, intentional drop) -
a53a5842026-05-14 hero-4grid: fetch /hero-4grid.json from /public/ not /data/ -
85e480d2026-05-13 fleet-status: surface host loadavg from build-pages /api/health -
827c21e2026-05-13 corner-nav: title-case lowercase brand sources -
7d8bfe02026-05-13 corner-nav: titleCase helper for brand display -
c194a292026-05-13 fleet-status: append fleet velocity (commits in last 24h + last 7d) -
3f5dffc2026-05-13 _shared: ns-contact-modal-fanout.js — patch ns-modal CSS+HTML to any DW site missing it -
69011612026-05-13 scripts: dw-bigred-embed-fanout — Big Red widget on every DW microsite -
d3f121d2026-05-13 scripts: dw-chip-details-fanout — vendor redact + chip-click→openDetails across all DW microsites -
9149dcf2026-05-13 status-loop: include build-pages in deployed-versions + latest-commits stanzas -
4fdf9152026-05-13 fleet-smoke: include build-pages (3rd site, 23 assertions) -
e24500c2026-05-13 fleet-status: include build-pages (3rd site, .counts.projects) -
55b6f242026-05-13 snapshot: backup uncommitted work (1 files) -
eb6dc392026-05-13 status-loop: log deployed git SHA + started_at per site (via /api/version) -
bb3f55f2026-05-13 scripts: add fleet-status.sh — at-a-glance health digest from /api/{health,version} -
77f67e42026-05-13 fleet-smoke: show git SHA per site (pulled from /api/version) -
3988b8c2026-05-13 snapshot: 1 file(s) changed, ~1 modified -
a9b79832026-05-13 fleet-smoke.sh — one-command smoke across asim + sod with combined tally. --json mode for monitoring. -
61a091c2026-05-13 status-loop MAX_ITERS 60→720 (2h→24h). Multi-day YOLO sessions were repeatedly outliving the 2h ceiling and requiring re-arms. 24h covers overnight+workday. -
826ec4c2026-05-12 status-loop.sh: also surface sod /api/stats each tick — designers/firms/claimed/candidates JSON alongside the asim spotted block -
6f762d12026-05-12 status-loop.sh: bump MAX_ITERS 10→60 (20min→2h to outlive multi-hour YOLO runs), surface /api/spotted/stats JSON each tick, +http timeout 2→5s for cold-cache hits. First-time tracked into _shared. -
69733872026-05-12 deploy.sh: honor RSYNC_EXTRA_EXCLUDES from project .deploy.conf -
65384af2026-05-12 shared color-isolate — add closenessBand(de, kind) + attach to nearestSW + coordinatingDesigns results. +12 unit tests. Consumed by wallco-ai R2 + thesetdecorator isolate modal. -
22410e12026-05-11 add archive-guard: hard block on re-activating intentionally-archived SKUs -
9195b5b2026-05-06 initial snapshot — gitify all builds (CLAUDE.md rule 2026-05-06)
Authors
- Steve129
Agents used
Skills used
- /products7
- /www3
- /aesthetic2
- /sku2
- /push2
- /version2
- /stats2
- /run-guard1
- /npm1
- /npx1
- /homebrew1
- /dw-promo-banner1
- /end1
- /minimal1
- /sample1
- /images1
- /mount1
- /local1
- /reload1
- /suffix1
- /skip1
- /verify1
- /else1
- /grep1
- /theoretical1
- /backup1
- /ideas1
- /pm21
- /favicon1
- /metric1
Creative ideas + design notes
3ecfa01 · 2026-06-20 · promo-banner: auto-contrast ink (fix white-on-light-accent invisibility) + fix template-literal regex escape-collapse in parseRGB
pickInk() reads the resolved accent luminance and flips ink white<->#111 to whichever wins WCAG, with a scrim shadow on borderline accents; deferred via double-rAF so the accent stylesheet is painted first. Root-cause fix: the client script is a template literal so \( \s \) regex escapes were collapsing to bare ( s ) — corrupting parseRGB to return NaN and silently defeating the contrast pick. 17/28 fleet accents (incl 6 white + 4 light-pink sites) were rendering white-on-light and were unreadable; now all pass. Verified headless on cork(#FF4F00 5.73), vinyl(#000 21.0), silkwallcoverings(#FFF 18.88).
3a4346d · 2026-06-11 · rail-match: add optional synonyms layer + shared default synonym map
productInRail/buildRails/railFacets now accept an optional {key:[aliases]} map
so a rail fires when a product tag/aesthetic equals the rail key OR a declared
synonym. Backward compatible (synonyms arg optional). New rail-synonyms.json
ships conservative defaults (modernist->modern/minimal, brutalist->concrete,
patina->distressed, etc.) for sites whose curated rail names don't appear
verbatim in the post-PG-retag tag vocab.
c3f9ad5 · 2026-06-02 · scripts: pm2-daily-fleet.sh — daily cron wrapper for safe batched fleet restart
resurrect -> pm2-batch-restart.cjs (batched, never mass-reload) -> save. Cron-safe PATH (node=/usr/local/bin, pm2=/usr/bin). Installed on Kamatera as a 05:00 UTC daily cron. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
11595c2 · 2026-06-02 · scripts: pm2-batch-restart.cjs — safe staged fleet restart (batches of 6, never mass-reload)
Restarts the ~187-app Kamatera pm2 fleet in small batches with sleeps so memory settles between waves; auto-resurrects if a batch trips the God daemon. Codifies the 'never pm2 restart/reload all' rule (mass-reload OOMs the daemon -> whole-fleet 502). Run on the fleet host: node pm2-batch-restart.cjs (BATCH/SLEEP_MS env-tunable). Used 2026-06-02 to restart the fleet: 183/183 servers online, 4 norma-* cron jobs correctly idle. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
66ed672 · 2026-06-01 · eyebrow scripts: apply claude-codex confirmed findings #1-#3,#5
fix-eyebrow-surgical.sh: - #1/#2 count MATCHES not lines: eyecount/live_eyecount use grep -o 'class= "rail-eyebrow"' | wc -l, so a minified one-line homepage can't fake count=1 across the eligibility/skip/verify gates. - #2 minification-proof eyebrow-only gate: replaced the line-based diff|grep -v with strip_hash() — sha256 of each file with all eyebrow divs + whitespace stripped; abort unless orig==work (only eyebrows changed). - #3 function replacer in the node transform: section body with $&/$1/$` or a price like $1.99 no longer consumed as String.replace tokens. deploy-fleet-eyebrow.sh: - #5 superseded: refuses to run (whole-file overwrite clobbers prod-only drift + curl-blip-to-clobber); ALLOW_OVERWRITE_DEPLOY=1 to override. Use surgical. All verified: surgical dry-run clean (0 dup, 0 abort), guard refuses, syntax OK.
b456923 · 2026-06-01 · fix-eyebrow-surgical: harden per claude-codex DTD (FIX 1/2/5)
DTD verdict (Claude+Codex, high confidence) → apply 3, skip 5: - #1 explicit failure counting: backup/push now in an if/else; a failed scp or ssh increments abort and prints FAIL — can never report silent success. - #2 TOCTOU guard: sha256 re-check of prod right before overwrite; abort if it drifted since the pull (relevant — a background deployer was active mid-run). - #5 set -euo pipefail, with explicit guards on the legitimately-non-zero commands (eyecount/live_eyecount helpers wrap grep -c; diff/grep pipeline guarded; transform rc captured via '|| rc=$?'; read heredoc '|| true'; trap-based TMP cleanup). SKIPPED (panel): #3 validation, #4 'injection' (own config, not untrusted), #6 regex-vs-DOM parse, #7 new Function nuances, #8 OOM — noise/theoretical on tooling that already ran and won't be extended. Dry-run still clean, fleet 0 duplicates, 0 aborts.
8c0fcb3 · 2026-06-01 · fix-eyebrow-surgical: resolve prod path per site (var/www OR /root/Projects)
The fleet uses two path conventions; ffepurchasing + hospitalitywallcoverings live at /root/Projects/<site>/ not /var/www/<domain>/. Resolve the actual path via ssh before pull/backup/push instead of assuming. Dry-run now: would-fix=2 (ffepurchasing, retrowalls), 0 aborted.
a2dbff9 · 2026-06-01 · add fix-eyebrow-surgical.sh — in-place prod eyebrow collapse (no clobber of prod-only drift)
Pulls each prod index.html, collapses the duplicated #ideas rail-eyebrows on THAT file, verifies the only changed lines are eyebrow lines (aborts otherwise), then pushes back. Avoids the bidirectional-drift clobber risk of a local->prod overwrite. Dry-run by default; --go to apply.
22d3461 · 2026-05-30 · debriefs: add gitignore for mp4s; mark session-debrief item 20 done
cncp-marathon-20260530.mp4 — 31MB / 4:58 / 1920×1080 H.264 + AAC. Built via the session-debrief skill: 7 task cards (auto-resume daemon, Freddy port, info@ row, P1-E session-binding, P1-F NULL race, Petition Pulse, peer-survey), Steve avatar PIP narrating each card, wave3-radar.html as the LEFT app pane, investor-lens value/metric/rail framing per task. MP4 kept out of git (31MB binary) via debriefs/.gitignore. The TODO ledger records the file path + provenance for future reference.
4ed0ea8 · 2026-05-30 · Add gitleaks pre-commit secret-scan tooling (CNCP _shared Lane B)
gitleaks 8.30.1 + custom rules for secrets that leaked in the 2026-05-30 incident: dw_admin PG pw, DWSecure2024! basic-auth, Gemini keys, inline db-url passwords, nohup-tmp-launcher backdoor pattern. install-secret-hook.sh wires it into any repo (or --all). Smoke-tested: blocks staged leak, passes clean. Hook NOT yet installed into repos (awaiting Steve OK).
cb54218 · 2026-05-25 · add api-vendor-redact middleware — strips vendor names from /api/* responses
Standing rule: DW vendor names NEVER in customer-facing UI. The HTML side is already locked down, but 6+ sister sites surfaced during the 2026-05-25 fleet refactor sweep (ticks 013/019/020 confirmed; 014/015 had vendor renders that got scrubbed; 018 chinois clean by accident) leak the vendor field via /api/facets and /api/products JSON responses. This middleware: - Wraps res.json on /api/* paths and walks the body, replacing each `vendor` field with the literal 'Designer Wallcoverings' and dropping any top-level `vendors` facet map - Strips ?vendor= from req.query so downstream handlers can't filter by it (dormant feature on most sites, no UI uses it, prevents future scraper abuse) DTD verdict A, 3/3 unanimous (claude/codex/qwen) — fleet-wide systemic patch beats per-site whack-a-mole. Add the require to each affected site's server.js as the ticks pass through them; backfill 013/014/015/019/020 at sweep end. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
b31eed9 · 2026-05-25 · rebucket: add --safe flag + SITE_BASES env + slug-with-hyphen resolver
--safe refuses to overwrite a richer existing bucket value with the 'all' fallback. Without it, rails-mismatch sites would have their existing PG buckets clobbered by a classifier that finds no rail match. With it, only genuine wins (existing-all → specific-rail) are applied; richer-existing buckets are protected. SITE_BASES (colon-separated) lets the script run on Kamatera where DW sites live under /var/www/<slug>.com, /root/Projects/<slug>, or /root/public-projects/<slug>. Falls back to $HOME/Projects. Slug resolver now tries the hyphenated form (e.g. PG slug hollywoodwallcoverings → filesystem hollywood-wallcoverings).
267170f · 2026-05-25 · add retag-aesthetics-from-pg.js — fleet-wide aesthetic backfill
Reads correct multi-bucket aesthetic tagging from dw_unified.microsite_products
and writes it INTO each DW sister-site's local data/products.json. Fixes the
"aesthetic:'all' degenerate single-bucket facet" issue surfaced by the 2026-05-25
fleet sweep (DTD verdict B, 2/3 vote — codex + qwen, dissent claude).
Behavior:
- Discovers DW sister sites by site.config.json + data/products.json
- Per-site PG query, handle/sku join, atomic JSON write, git commit
- Idempotent: skips already-matching, PG-degraded ('all'/null), no-PG sites
- Dry-run by default, --write to commit, --site=<name> for one
- Auto-commits per logical change (steve@designerwallcoverings.com)
First run: 59 sites updated, 59 per-site commits.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dca05e5 · 2026-05-25 · fix(microsite-aesthetic): match hyphenated rails like art-nouveau, arts-crafts
The whole-word classifier never matched multi-token rails because a tag
like 'Art Nouveau' tokenizes to {art, nouveau, 'art nouveau'} but the rail
'art-nouveau' was looked up verbatim against that word set, missing every
form. Fix accepts either the space-joined form or all-tokens-present.
Re-bucket script applies the corrected classifier across PG (dw_unified
microsite_products) and reports per-site before/after. Initial fleet run
re-bucketed 516 rows across 6 sites (1890/1900/1920/1930swallpaper,
apartmentwallpaper, handcraftedwallpaper).
6973387 · 2026-05-12 · deploy.sh: honor RSYNC_EXTRA_EXCLUDES from project .deploy.conf
Lets projects opt-out specific paths from rsync without forking the shared script. Critical for projects with prod-side runtime state (JSON datastores, user uploads, generated artifacts) where the local working copy isn't authoritative — rsync --delete was clobbering Butlr's prod calls.json with local test fixtures. Space-separated patterns in conf become --exclude='<pat>' flags. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
22410e1 · 2026-05-11 · add archive-guard: hard block on re-activating intentionally-archived SKUs
- archive-guard.js exports isProtected / assertNotProtected / filterProtected / addToList - data/never-unarchive.json seeded with LEC-50650 (the regression that triggered the rule) - scripts/sync-archive-list-from-shopify.js nightly-runnable, idempotent additions only - ALLOW_UNARCHIVE=1 escape hatch when an unarchive is intentional
File tree
- .gitignore
- README.md
- TODO.md
- _universal-promo-banner.js
- admin-catalog.js
- api-vendor-redact.js
- archive-guard.js
- color-isolate.js
- color-isolate.test.js
- component/dw-theme-nav.js
- corner-nav.js
- data/dw-tossed-domains.json
- data/fleet-rails-sweep/DEPLOY-LOG.txt
- data/fleet-rails-sweep/LEDGER.md
- data/never-unarchive.json
- debriefs/.gitignore
- designer-personas/credentials.json
- designer-personas/generate-portraits.js
- designer-personas/personas.json
- designer-personas/portraits/atelier-solene.png
- designer-personas/portraits/bellamy-house.png
- designer-personas/portraits/casa-lumo.png
- designer-personas/portraits/cirrus-studio.png
- designer-personas/portraits/house-of-jill.png
- designer-personas/portraits/indigo-field.png
- designer-personas/portraits/juniper-lane.png
- designer-personas/portraits/marlowe-finch.png
- designer-personas/portraits/nordheim-design.png
- designer-personas/portraits/oleander-oak.png
- designer-personas/portraits/peony-pine.png
- designer-personas/portraits/studio-fernwood.png
- designer-personas/portraits/studio-mesa.png
- designer-personas/portraits/verre-noir.png
- designer-personas/portraits/wren-wilder.png
- docs/2026-05-05-cleartext-scrub-summary.md
- docs/2026-05-05-dream-team-answers.md
- docs/2026-05-05-yolo-session-handoff.md
- docs/pg-rotation-runbook.md
- docs/residual-vendor-name-renames-20260526.md
- docs/residual_proposal.json
- dust2026-carwash-usage-review.md
- dust2026-prestige-media-seed.json
- dust2026-task-manifest.md
- favicon-contact-sheet/contact-sheet.png
- favicon-contact-sheet/fleet-urls.json
- favicon-contact-sheet/index.html
- fleet-registry
- grant-peer-survey.md
- grants-demo.html
- hero-4grid.js
- image-proxy.js
- last-deploy-meta.js
- microsite-aesthetic.js
- ollama-enrich.mjs
- package-lock.json
- package.json
- rail-match.js
- rail-synonyms.json
- routing-fingerprints.json
- scripts/add-favicon-href.js
- scripts/audit-fleet-rails.js
- scripts/backfill-hollywood-tags.js
- scripts/backfill-microsite-images.js
- scripts/bigred-leftmove-deploy.sh
- scripts/consolidate-fleet-sweep.sh
- scripts/decade-palettes.mjs
- scripts/deploy-fleet-eyebrow.sh
- scripts/deploy-hero-bg.sh
- scripts/deploy-hero-ideas.sh
- scripts/deploy.sh
- scripts/dw-bigred-embed-fanout.js
- scripts/dw-bigred-embed-remove.js
- scripts/dw-chip-details-fanout.js
- scripts/fanout-rails-deploy.sh
- scripts/fix-card-title-wrap.js
- scripts/fix-eyebrow-surgical.sh
- scripts/fix-hero-ideas.mjs
- scripts/fix-theme-toggle.js
- scripts/fleet-smoke.sh
- scripts/fleet-status.sh
- scripts/ga4-deploy-cheatsheet.sh
- scripts/gen-fleet-favicons.js
- scripts/gitleaks.toml
- scripts/install-secret-hook.sh
- scripts/make-favicon-contact-sheet.js
- scripts/merge-tags-into-products-json.js
- scripts/migrate-all-microsites.js
- scripts/migrate-microsite-products.js
- scripts/ns-contact-modal-fanout.js
- scripts/pm2-batch-restart.cjs
- scripts/pm2-daily-fleet.sh
- scripts/pm2-restart-audit.md
- scripts/pm2-restart.sh
- scripts/pre-commit-secret-scan.sh
- scripts/pre-deploy-check.sh
- scripts/rebucket-microsite-aesthetic.js
- scripts/retag-aesthetics-from-pg.js
- scripts/rotate-pg-scoped.sh
- scripts/run-guard.sh
- scripts/stage2-followups.js
- scripts/step2-handle-codemod.js
- scripts/sync-archive-list-from-shopify.js
- scripts/vendor-leak-scan.js
- scripts/vendor-leak-scrub.js
- scripts/verify-routing.sh
- scripts/wave3-snapshot.sh
- scripts/yolo-rate-limit-watcher.sh
- scripts/yolo-tick.sh
- site-config.js
- sku-redact.js
- sql/microsite-catalog-schema.sql
- status-loop.sh
- sw-colors.json
- vendor-text-redact.js
- wave3-radar.html
- wave3-snapshot.json