← back to Secrets Manager

yolo-overnight-log.md

444 lines

# Yolo Overnight Sessions — Running Log

Append-only ledger of every overnight yolo build session. Newest at top.
Each entry also emailed to steve@designerwallcoverings.com via George (`POST localhost:9850/api/send`).

---

## 2026-05-07 — 9-domain batch: Group A microsites + Group B typo redirects

**Scope:** 4 Group A microsites (Kamatera origin) + 5 Group B typo-defender redirects → designerwallcoverings.com
**Method:** GoDaddy API (direct curl sso-key auth), nginx on Kamatera, certbot LE

**NS swaps completed:**
- chinoiseriewallpaper.com: NS1/2.GREENDOMAINBROKERS.COM → ns09/10.domaincontrol.com
- naturaltextilewallpaper.com: ns5/6.afternic.com → ns53/54.domaincontrol.com (Afternic listing voided)

**A records set (all → 45.61.58.125):**
- All 9 domains: @ and www A records confirmed at authoritative GoDaddy NS

**LE certs issued (all 2026-05-07, ~90-day expiry):**
- customdigitalmurals.com, carmelwallpapers.com, chinoiseriewallpaper.com, naturaltextilewallpaper.com
- designerwallcover.com, designerwallcovering.com, 1800wallcoverings.com, 1800wallpapers.com, 800wallpaper.com

**Live verify (from Kamatera):**
- Group A: all 4 return HTTP 200
- Group B: all 5 return HTTP 301 → https://www.designerwallcoverings.com → 200

**Rollback log:** ~/Projects/_domain-recon/rollback-2026-05-07.json (pre/post state for all 9)
**CNCP:** all 9 entries updated, CNCP restarted :3333

**Blocked-on-prop:** None — both NS-swap domains had GoDaddy zone files already active; public prop verified before certbot

---

## 2026-05-07 — chinoiseriewallpaper.com onboard

**Domain:** chinoiseriewallpaper.com (GoDaddy ACTIVE, expiry 2027-06-21)
**Goal:** blank → DW-spec Hermès-aesthetic chinoiserie microsite on Kamatera

**Completed:**
- Project scaffold at ~/Projects/chinoiseriewallpaper/ — git init, 2 commits
- 1,193 chinoiserie products pulled from DW Shopify /products.json (paginated 40 pages × curl)
- Aesthetic breakdown: chinoiserie 808, imperial 180, scenic 136, botanica 34, garden 20, avian 13, handpainted 2
- Express server :9853 deployed to /var/www/chinoiseriewallpaper.com/ on Kamatera
- pm2 id 225 "chinoiseriewallpaper" online, 0 restarts
- nginx vhost /etc/nginx/sites-available/chinoiseriewallpaper.com created from novasuede.com template (CF IP real_ip block, proxy_pass :9853)
- Nginx routing verified: Host-header test → HTTP 200
- Dark/light toggle (sun/moon SVG, localStorage, anti-flash inline script)
- Grid search (live filter by title/vendor/tag), sort dropdown, density slider (1–4 cols)
- Memo-sample CTA on every product card ("Order Memo Sample (free)")
- Hermès visual template: Cormorant Garamond serif, lacquer black/gold/crimson palette
- finish_dns.sh written for automated post-gate DNS/certbot/CF-proxy sequence
- CNCP updated: ip=45.61.58.125, statusLabel="Building — DNS pending CF zone"

**MANUAL GATES REQUIRED (blocking for HTTPS):**
1. Add chinoiseriewallpaper.com zone in Cloudflare dashboard → dash.cloudflare.com → Add Site
2. Run: bash ~/Projects/chinoiseriewallpaper/finish_dns.sh (handles NS swap, certbot, CF proxy, email DNS)
3. Add chinoiseriewallpaper.com to Purelymail dashboard (addDomain API consistently times out) → create info@ mailbox → save password via /secrets

**Not yet done:**
- SSL cert (requires CF zone first)
- CF orange-cloud proxy (requires cert first)
- info@chinoiseriewallpaper.com Purelymail mailbox (requires dashboard)
- GA4 property (left for analytics-agent pass per spec)

**Origin verified:** curl http://127.0.0.1:9853/health → {"status":"ok","count":1193}

---

## 2026-05-07 — overnight crash-cluster fix

Triggered by morning stand-up flagging 6 active crash clusters. State at start was worse than report — ventura-claw cluster had also joined. Two debugger agents dispatched in parallel.

**Fixed:**

1. **ventura-claw-leads (Kamatera)** — REAL BUG. 5 tables (`businesses`, `business_invitations`, `business_interest`, `business_views`, `session`) owned by `postgres` had no GRANT to `vcl` app role. `connect-pg-simple` touches `session` on every request → permission-denied → unhandled-rejection → Node 22 exit. Fix: migration `011_grant_vcl_missing_tables.sql` granting SELECT/INSERT/UPDATE/DELETE + sequence USAGE/SELECT/UPDATE. Committed `c38666c`. Crash loop stopped.
2. **ventura-claw-leads (Mac2)** — RSS-spike OOM kills from `/api/businesses.geo` (~549KB/response, no cache). Bumped `max_memory_restart` 300M→600M and added 120s in-process cache. Commits `602dc99` + `f62acb4`.
3. **ventura-claw-leads (Kamatera)** — same RSS fix mirrored. Commits `f3b9d0e` + `11834b8`.

**Diagnosed-as-non-issue:**

- `ventura-corridor` (87 restarts) — `hawk-local.sh` calls `pm2 restart` every 30 min as a watchdog. Not a real loop. Same PID since 03:29.
- 8 Mac2 wallpaper sites at ~21 restarts — historical from May 5 20:44 npm install race (`Cannot find module 'express'` window during dotenv install). All have express now. Cluster healthy.
- Kamatera bulk ~25 wallpaper sites at exactly 5 restarts/12-min uptime — pm2 deploy-aftermath signature, zero error log entries.
- `corkwallcovering` (Kamatera) 13 restarts — deploy aftermath, clean logs.
- `momentum-crawler` 17 restarts — by design (`autorestart: true` on a 12-min batch script that exits 0).
- `dw-universe`, `fleet-tv`, `george-gmail` — high counts but uptime 16-25h = stable.

**Open items for Steve:**

- `ventura-claw` (Mac2) needs `CC_SECRET` restored to `.env` to re-enable connector credential decryption (currently `loadCredentials()` catches decrypt error and returns `{}`, so connectors show as disconnected). Non-fatal.
- Hawk-local.sh policy: 30-min `pm2 restart` cycle on `ventura-corridor` is noisy and inflates restart counters. Consider `pm2 reload` (zero-downtime) or skip-if-uptime-fresh logic. Non-urgent.
- Carryover from yesterday: george-gmail OAuth rotation, Doctor `apply-templates.js` go/no-go, Gemini key rotation #1+#2, PG `dw_admin` rotation. All blocked on Steve.

**Iteration:** 2 parallel debugger agents, ~17 min total wall time. 5 commits across Mac2 + Kamatera. No destructive ops. No DNS/secrets/dw_unified/Shopify touched.

---

## 2026-05-06 — lawyer-build-nightly missing George creds env

- `com.steve.lawyer-build-nightly` was silently exit-1'ing every 8 PM run. Both `nightly.err` and `nightly.out` were empty (set -u early failure before any echo).
- Root cause: `nightly-email.sh` uses `: "${GEORGE_AUTH_PASSWORD:?required}"` to require George creds, but the plist's EnvironmentVariables block only exposed `PATH` + `HOME`. Under `set -euo pipefail`, missing env → instant exit 1 with no log.
- Fixed: added `GEORGE_AUTH_USERNAME=admin` and `GEORGE_AUTH_PASSWORD=DWSecure2024!` to the plist's EnvironmentVariables (creds match the value already in `~/Projects/secrets-manager/.env`'s `GEORGE_AUTH=Basic …` Base64-decoded).
- `plutil -lint` OK. bootout + bootstrap done. Smoke-tested with the same env-check pattern the script uses — passes.
- Did NOT kickstart — would send an actual email to Steve. Will fire on next 20:00 PDT scheduled run.
- Backup at `~/Library/LaunchAgents/com.steve.lawyer-build-nightly.plist.bak.20260506-george`.
- Audited the other 2 George-using plists (`morning-review-email`, `animals-debug-loop`) — both last-exit-0, no fix needed.

---

## 2026-05-06 — lacountyeats-frontpage missing schema (same pattern as site-factory)

- `com.steve.lacountyeats-frontpage` was failing every cron with `relation "front_page_audits" does not exist` — same shape as the site_factory issue, just on a different DB.
- DB: `restaurant_professional_directory` (38,292 facility rows present, but migration 003 never applied).
- Applied `migrations/003_front_page_crawl.sql` (idempotent: `CREATE TABLE IF NOT EXISTS`, `ADD COLUMN IF NOT EXISTS`).
- New table `public.front_page_audits` + 2 indexes + 2 columns on `facility_enrichment` (ad_signals, signals_updated_at).
- Did NOT kickstart — would be a real 300-restaurant crawl. Will fire cleanly on next 03:00 PDT scheduled run.
- Reversible: `DROP TABLE public.front_page_audits` + `ALTER TABLE facility_enrichment DROP COLUMN ad_signals, DROP COLUMN signals_updated_at`.

---

## 2026-05-06 — lacountyeats plists XML invalid (same bug pattern)

- Found 2 more launchd plists with identical literal-`&&` XML invalidity: `com.steve.lacountyeats-cuisine-sync` and `com.steve.lacountyeats-weekly`.
- Same fix: replaced `&&` with `&amp;&amp;` inside the `<string>` shell command. `plutil -lint` OK on both.
- Bootout + bootstrap done. Backups at `*.bak.20260506-amp`.
- Did NOT kickstart cuisine-sync to verify — it would push to Kamatera prod. Will fire on its 4hr StartInterval schedule.
- Full-fleet rescan: `plutil -lint` clean across all `~/Library/LaunchAgents/com.steve.*.plist` (no remaining XML errors).

---

## 2026-05-06 — animals-recrawl plist XML invalid

- `com.steve.animals-recrawl` was failing every scheduled run with `bash: 1: command not found` + `bash: amp: ambiguous redirect`. Last exit 127.
- Root cause: plist had a literal `&&` (XML-invalid) AND already-escaped `&amp;&amp;` mixed in the same `<string>`, so `xmllint` rejected the whole doc and launchd's lenient fallback parser was passing `&amp;` through to bash literally.
- Fixed: re-escaped the entire shell command properly (`&amp;&amp;`, `&gt;&gt;`, `2&gt;&amp;1`). `plutil -lint` now OK; decoded args show clean `&& ... 2>&1 && ...`.
- bootout + bootstrap done. Backup at `~/Library/LaunchAgents/com.steve.animals-recrawl.plist.bak.20260506-amp`. Next scheduled fire: 22:15 PDT.
- Reversible: `cp .bak.20260506-amp` → original; `launchctl bootout` + bootstrap.

---

## 2026-05-06 — sf-cncp-panel error spam fixed

- Launchd job `com.steve.sf-cncp-panel` was logging `Unexpected token 'a', "auth required" is not valid JSON` every 60s and leaking hung `node` processes (14 stuck spawns piled up since 8:49 PM yesterday).
- Tracked through: my prior Basic-auth patch on `cncp-panel-data.js` was correct. Real root cause: `sf-orchestrator` `/sites` route does `SELECT … FROM site_factory.sites …` but the schema only had `subscriptions` — missing 6 tables (`palettes`, `sites`, `stages`, `manager_findings`, `actions_log`, `analytics_events`).
- Applied `db/schema.sql` to local PG (idempotent `IF NOT EXISTS`). All 7 tables now present.
- `/sites` returns 200 in 18ms (was hanging 5s+).
- Killed 14 hung `node cncp-panel-data.js` procs.
- Manual test: panel now writes `cncp-site-factory.json` with `wrote … (0 sites)` exit 0.
- Reversible: `DROP TABLE site_factory.{palettes,sites,stages,manager_findings,actions_log,analytics_events}` if ever needed (subscriptions left untouched).

---

## 2026-05-05 → 2026-05-06 (overnight #1)

Started ~19:48 PDT 2026-05-05, ran through morning. Conserve+local-LLM mode.

### Mutations applied (all reversible)

**dw_unified replication — fully restored**
1. Added Mac2 tailnet IP `100.65.187.120/32 scram-sha-256` to Kamatera `pg_hba.conf` (backup `.bak.20260505-mac2ip`). Existing entry was for stale `100.111.38.111`.
2. Patched 13 schema-drift columns on `public.wallquest_catalog` (publisher had added them per "ALTER TABLE on Local before Kamatera" rule violation).
3. archive_alerts row-conflict: TRUNCATE on Mac2 + COPY backfill 64,372 rows from publisher via staging table + ON CONFLICT DO NOTHING.
4. `GRANT SELECT ON ALL TABLES IN SCHEMA public TO repl_user` on Kamatera + `ALTER DEFAULT PRIVILEGES`.
5. Dropped 28 stale inactive tablesync slots on Kamatera (was at 30/30 limit).
6. TRUNCATE 27 tables on Mac2 stuck in 'd' state to break PK conflicts → tablesync re-copied all clean.
7. **Final state: 459/459 tables ready, 1+1 slots, apply worker streaming live (~0s lag).**

**DW microsite fleet (30 sites)**

8. GEORGE_AUTH fanned out via secrets-manager (added 30 destinations to routes.json, ran `cli.js sync` — 110 writes total).
9. Generated 30 unique ADMIN_PASS values (urlsafe_b64 18 bytes), wrote each to per-site .env (chmod 600), saved manifest to `~/Projects/secrets-manager/admin-passes.json`.
10. Patched all 30 server.js to load dotenv: `try { require('dotenv').config({ path: require('path').join(__dirname, '.env') }); } catch (e) {}` (1900swallpaper had wrong cwd).
11. Bulk `npm install dotenv` across all 30 sites.
12. Wired 4 previously-unwired sites (apartment/blockprinted/screenprinted/selfadhesive wallpaper) — copied `_universal-contact.js` + `_universal-auth.js` from agedwallpaper, generated niche-specific site.config.json, injected cfg + 2 require lines into server.js.
13. Verified `30/30 sites` admin auth: `/admin` → 401, `/admin` with per-site password → 200.

**commerce-claw**

14. Removed twilio entry from `server/connectors.json` (vault has no twilio creds; was 401-ing every 30 min). Backup `.bak.20260505`.

**Garrett (godaddy-agent)**

15. Patched `server.js:449` so pm2-not-online + HTTP-ok no longer marks domain critical (was always firing for 6 Kamatera-hosted sites since Garrett checks local pm2). Now degrades to warning.

**sf-cncp-panel**

16. Patched `cncp-panel-data.js` to send Basic auth header to sf-orchestrator on :9880 (was getting "auth required" plain text → JSON parse error every 60s).

**Cleanup**

17. Removed ghost launchctl entry `com.steve.sf-nginx-watchdog` (no plist on disk).
18. Deleted stray `com.steve.pd-mockups-nightly.plist.v3-bak`.
19. Created `~/kamatera-mirror/.claude/SESSION-LEARNINGS.md` placeholder (was ENOENT-ing for blog-agent).
20. AI Factory: marked 2 stuck "running" tasks (5+ days old) as 'abandoned'.
21. Visual Factory: 10 awaiting_activation queue restored after I bumped them through `approved` (not a valid pipeline state — reverted).
22. brew cleanup -s + pip3 cache purge → ~570 MB freed.

### Open items (need your input)

- **Q4 Twilio:** vault has no twilio creds. Connector now disabled. Provide SID+token to re-enable, or leave disabled.
- **gdrive-backup:** rclone has no `gdrive:` remote. Daily PG backups silently failing since 2026-05-03. Run `rclone config` interactively.
- **Mac2 disk 94%** (`/dev/disk3s5` → `/System/Volumes/Data`, 460G total / 391G used / 24G free). Biggest hogs: `~/Projects/Kamatera` (35G mirror), `~/Library/Application Support/Claude` (9.1G), `~/Library/Caches/Google` (4.6G).

### Memories saved
- `feedback_yolo_overnight_rules.md`
- `feedback_conserve_claude_budget.md`
- `feedback_4_microsites_unwired.md` (resolved same session)
- `feedback_visual_factory_states.md` — never UPDATE runs.status to non-canonical values

### Active dev (left alone — Steve was editing in parallel)
- national-paper-hangers (Stripe Connect work — 30+ restarts during session)
- ventura-corridor (try/catch on WWW-Authenticate — stabilized 00:49 after Steve's fix)
- dw-universe (public/index.html edited within last hour)

### Iteration cadence
~18 iterations, 30-min wake intervals via ScheduleWakeup. Final 9 iterations no-op steady-state monitoring once backlog cleared.

---

## 2026-05-06 — NCW cleanup (Designer Wallcoverings)
- 227 duplicate Nina Campbell products archived (DWC-NCW####-XX + DWC-1001### — kept EUR-80### as the only canonical series per Steve)
- 1 DRAFT dupe (DWC-NCW4301-03 Silver Sage) archived for cleanliness
- 295 EUR products got `Color: <bucket>` tag (Azure→Blue, Greige→Beige, Onyx→Black, etc.)
- 156 EUR products got `custom.manufacturer_sku` + `dwc.manufacturer_sku` normalized to `NCW####-##` form (148 already correct)
- 4 malformed mfr_sku values fixed (extra spaces, slashes): NCW4182, NCW4270, NCW4273
- Future +10 increment confirmed: max NCW EUR id = 80463 → next NCW pattern colorway #1 = EUR-80473
- Scripts: `~/Projects/Designer-Wallcoverings/scripts/ncw-cleanup/{audit-and-fix.js, fix-stragglers.js, final-cleanup.js, verify.js}`
- Final live state: 318 active NCW, 237 archived, 0 missing Color tag, 0 with bad mfr_sku
- Errors across 894 mutations: 0

### 2026-05-06 — NCW variant SKU rename (continuation)
- Initial v1 used deprecated `productVariantUpdate` — Shopify silently no-op'd, 298 "successes" didn't actually persist
- Detected via spot-check: Estella 01 still showed `DWC-NCW4202` after "successful" run
- Fixed: switched to 2024-10's `productVariantsBulkUpdate` with `inventoryItem.sku` field
- v2 result: 297 variants renamed, 21 already correct, 0 errors → **318/318 active NCW products now have unique EUR-80###-Sample variant SKU**
- Estella (NCW4202) verified: 01→EUR-80224, 02→EUR-80225, 03→EUR-80226, 04→EUR-80227, 05→EUR-80228, 06→EUR-80229
- Lesson: when Shopify shows zero `userErrors` but `productVariants.sku` doesn't reflect the input, that's a deprecated-mutation silent no-op — always read back the returned sku

### 2026-05-06 — Phillipe Romano dedupe
- Identified: 54 SKUs each duplicated across 2 ACTIVE products (Mar 3 + Mar 4 2026 import ran twice)
- Archived 54 later (Mar 4) copies, kept 54 earlier originals
- 0 errors, postgres mirror updated
- Audit: ~/Projects/Designer-Wallcoverings/scripts/ncw-cleanup/audit-pr-dedupe-*.json
- Live verification: zero remaining shared-SKU active pairs for Phillipe Romano

### 2026-05-06 — AS Creation dedupe + The Cabinet shipped
- 20 AS Creation dup pairs cleaned (Apr 13 less-enriched copies archived, Apr 14 kept)
- The Cabinet built: agent-architect + 6 VPs + Mermaid viewer at :9766
- Cabinet drift fixed (44/44 skill+subagent refs all on disk; phantom prism + dw-site-build subagent ref removed)
- Files: ~/Projects/agent-cabinet/{cabinet.yaml,server.js,mindmap.html}
- Cumulative session: 1,317 mutations across NCW+PR+AS+Cabinet, 0 errors

### 2026-05-06 — Session wrap
**Built (1,317 mutations, 0 errors):**
1. NCW (Nina Campbell) full cleanup — 318 active w/ unique EUR-80###-Sample variant SKUs, all Color: tags, all NCW####-## mfr_sku metafields; 237 dupes archived.
2. Phillipe Romano dedup — 54 Mar-4 dupe imports archived.
3. AS Creation dedup — 20 Apr-13 dupes archived (kept Apr-14 better-data copies).
4. The Cabinet shipped — agent-architect + 6 VPs (vp-operations, vp-dw-commerce, vp-directories, vp-engineering, vp-research-content, vp-compliance-policy) at ~/.claude/agents/.
5. Cabinet viewer at :9766 (pm2 agent-cabinet) — Mermaid flowchart at /, Game Mode at /game w/ avatars + stats + synergies for 134 directors.
6. Two FigJam boards generated: https://www.figma.com/board/W30XZWAKYf68mLgeX23J2A (initial) and https://www.figma.com/board/eakk7m5js2T1waJ9qsyixH (full 134-director roster).
7. Email sent to info@designerwallcoverings.com via George with old→new SKU mapping table.

**Files of note:**
- ~/Projects/agent-cabinet/{cabinet.yaml, server.js, mindmap.html} — git-tracked, 4 commits
- ~/Projects/Designer-Wallcoverings/scripts/ncw-cleanup/ — 4 audit JSONs + 4 run logs + ncw-active-full-table.{md,csv}
- ~/.claude/agents/agent-architect.md + 6 vp-*.md

**Pending backlog (not run):**
- DW Bespoke Studio (32 dup pairs, declined)
- Mind the Gap (11), Arte International (6), Graham & Brown (5) — same dedup pattern available

pm2 saved. No active monitors. No scheduled wakeups.

---
## 2026-05-06 13:08 — Plaintext-creds audit (autonomous tick)

Scanning ~/Projects for credential antipatterns (banner + hardcoded). Findings:

**Critical: hardcoded PG password in 252 source files.**
- Literal `DW2024SecurePass` appears 254 times across 252 .js files
- All connect to `127.0.0.1:5432/dw_unified` (or `:15432/dw_unified` via tunnel) — *not externally reachable*
- BUT: hard to rotate (mass edit), leaks instantly if any of these files goes to a public git remote, and password reuse — same pw is also used for `bertha_betting`, `sdcc` databases
- Recommended fix: introduce `DW_UNIFIED_URL` env-var pattern (some files already use `process.env.DW_UNIFIED_URL || 'postgresql://...'` fallback — codify across all 252)
- Reversible mass-rewrite plan: sed replace literal → env-var read; add to /secrets routes.json so it fans out to all 252 .env files

**Clear: no other "Demo · email / pw" banner antipattern found in public HTML.**
- venturaclaw.com was the only project that publicly advertised credentials on a login page
- Pulled this morning (2026-05-06)

**Lower priority:**
- `dear-bubbe-nextjs/archived/social-posters/x-*.js` — old hardcoded Twitter/X auth tokens. Project says "archived" so not in active use, but tokens may still be valid → rotate if Steve still has X account access

**Status:** Findings logged, no autonomous fix applied. The 252-file PG-pw rewrite is reversible but high-blast-radius (would touch many production-running pm2 processes); deferring for explicit approval.


---
## 2026-05-06 13:25 — pm2 cross-reference for the 252 PG-pw files

Better numbers after exact-path mapping:
- 247 files = one-shot scripts / scrapers / one-time tools — sed-rewrite needs NO restart
- 6 files inside 5 active pm2 processes — restart these 5 only:
  - `pm2 restart vendor-discount-agent` (2 files)
  - `pm2 restart archive-agent` (ecosystem.config.js — actually a literal here, careful)
  - `pm2 restart timeout-agent`
  - `pm2 restart 1980swallpaper`
  - `pm2 restart sku-check-skill`

**Proposed rotation flow** when Steve approves:
1. Pick new strong pw, save via `/secrets` as `DW_UNIFIED_PG_PASSWORD`
2. `ALTER USER dw_admin WITH PASSWORD '<new>';` on local PG (5432) and Kamatera mirror (15432)
3. `find ~/Projects -name "*.js" | xargs sed -i '' 's/dw_admin:DW2024SecurePass@/dw_admin:'"$NEW_PW"'@/g'` — but better: replace the literal connection string with `process.env.DW_UNIFIED_URL || '<placeholder>'` pattern, then set `DW_UNIFIED_URL` in each pm2's .env via secrets-manager fan-out
4. Restart the 5 pm2 processes
5. Verify each is reading from PG cleanly

Mac1 Ollama also confirmed reachable as of 13:25 — 9 models loaded including all 4 the 8-way debate panel needs (mistral:7b, gpt-oss:20b, phi4:14b, deepseek-r1:14b).

## 2026-05-07 · DW fleet rebrand night

10 ticks. Built per-site brand identity system from scratch and applied to 47 sites.

**Done:**
- 47 sites rebranded (each = unique brand, palette, font, voice; mapped to 1 of 20 fashion-house templates)
- 0 visible DW touchpoints anywhere on the fleet (only About-Us pages mention DW)
- Light-paper templates (Hermès / Loewe / Chanel / etc.) default to LIGHT mode; dark-monochrome (Saint Laurent / Balenciaga) stay DARK
- Sort + density slider on every site (CLAUDE.md standing rule + dw-site-build skill)
- Hero pulls dynamically from products[0].image_url + Shopify URL upscale (no more blurry full-page heroes)
- HD/MED/SD badges + 'HD only' filter in dw-collections-viewer admin
- New skill: dw-fashion-templates (referenced from ui-ux-designer agent)
- New patcher scripts: generate-brands · apply-brand-fleet · patch-hero-fleet · patch-sort-fleet · deploy-fleet-brands
- NPH /find now shows 524 installers (was 5)
- dw-collections-viewer admin fixed (HTML tokenizer was breaking script tag)

**Pending Steve:**
- Run `bash ~/Projects/_dw-batch/deploy-fleet-brands.sh` — 46 sites staged, idempotent, .bak'd, rollback-ready
- Pick a/b/c for fleet-wide magic-link fix (auth.agentabrams.com → Kamatera can't reach George)
- 4 prod-only sites need scp pull before rebrand (glassbeaded, flocked, grasscloth, goldleaf)
- Regex tightening — 41% product overlap is the real SEO smoking gun

**Full debrief:** ~/Projects/_dw-batch/SESSION-DEBRIEF-2026-05-07.md


## 2026-05-07 — goldleafwallpaper.com DW-spec rebuild

**What shipped:**
- Full site rebuild: Bottega Veneta aesthetic (forest green / near-black / burnished gold), Cormorant Garamond serif, single-column editorial feel
- Product catalog: 1,957 gold-leaf / foil / metallic / lacquer / mica products from `dw_unified.shopify_products` (filtered, vendor-safe — no Command54 exposure)
- Dark/light sun-moon toggle with anti-flash inline script + localStorage persistence
- Grid density slider (3–10 cols), sort select, vendor/type filter chips, full-text search
- Memo Sample CTA on every card → `designerwallcoverings.com/products/{handle}#sample`
- GA4 existing `G-NP93HLD33N` wired in (NOT a new property)
- `/health` endpoint returning JSON
- SEO meta: service-voice (free samples, trade service, 1,900+ patterns)
- JSON-LD Organization schema
- pm2 `goldleafwallpaper-website` (id 73) restarted on Kamatera :9890
- Nginx vhost + LE SSL already live; CF zone not yet added (manual gate pending)
- CNCP updated: domain expires 2026-05-09 — RENEW IMMEDIATELY

**Manual gates still needed (cannot be automated):**
1. CF zone: `dash.cloudflare.com/?to=/:account/add-site` → add `goldleafwallpaper.com`
2. GoDaddy NS swap to CF nameservers (after zone added)
3. Domain renewal: expires 2026-05-09 — renew in GoDaddy NOW

**Verified:** `https://goldleafwallpaper.com/` → HTTP 200, SSL valid, /health → `{"ok":true}`


---
## 2026-05-07 — Three Day-of-Week Microsites Deployed

| Domain | URL | Port | Accent | This Week's Pick | Archive | SSL Exp |
|---|---|---|---|---|---|---|
| fabricfriday.com | https://fabricfriday.com | 9898 | Saffron #e09b3e | Entoto Stripe — Lee Jofa | 12 picks | 2026-08-05 |
| textiletuesday.com | https://textiletuesday.com | 9899 | Indigo #3a5a78 | Boutique Floral — Lee Jofa x Sarah Bartholomew | 12 picks | 2026-08-05 |
| wallpaperwednesday.com | https://wallpaperwednesday.com | 9900 | Botanical Green #5a7a52 | Agra Okra — Arte International Indienne | 12 picks | 2026-08-05 |

Stack: Express + static HTML, pm2 ids 227/228/229, nginx vhosts with CF real_ip_from, GoDaddy A records -> 45.61.58.125, LE certs via certbot webroot.

Local source: ~/Projects/fabricfriday, ~/Projects/textiletuesday, ~/Projects/wallpaperwednesday
Kamatera mirror: /root/Projects/{fabricfriday,textiletuesday,wallpaperwednesday}

Note: textiletuesday.com cert covers root domain only; www CNAME TTL was stale at issuance. Expand cert once www TTL fully flushes (run: certbot certonly --webroot -w /var/www/html -d textiletuesday.com -d www.textiletuesday.com --expand).

---
## 2026-05-07: 4 DW Reference Microsites Deployed

| Domain | Port | Accent | Font | Content | Status |
|--------|------|--------|------|---------|--------|
| wallpaperdictionary.com | 9904 | Imperial Gold #c9a14b | Cormorant Garamond | 26 A-Z entries, 5 image breaks | LIVE |
| wallpaperdefinitions.com | 9901 | Sage Green #7a9b6e | Playfair Display | 20 plain-language definitions | LIVE |
| wallpaperglossary.com | 9902 | Burgundy #8b1a3a | Tenor Sans | 30 trade-jargon entries, 2-col layout | LIVE |
| wallpaperhistory.com | 9903 | Sepia #a78651 | EB Garamond | 12 timeline milestones, 1509–present | LIVE |

All: GoDaddy DNS → 45.61.58.125, LE cert via certbot, nginx proxy, pm2 persistence, dark/light toggle, liquid-glass surfaces, Shopify CDN imagery.

## 2026-05-07 — microsite-hawk shipped

- Built `~/Projects/_microsite-hawk/` watchdog for 24 microsites
- Files: `hawk.sh`, `probe.js`, `enrich.js`, `daily-summary.sh`, `sites.json`
- Launchd: `com.steve.microsite-hawk` (every 5 min at :07/:17/:27/:37/:47/:57), `com.steve.microsite-hawk-daily` (9:07 AM)
- Fixed macOS `mktemp` suffix bug (`.jsonl` suffix prevents XXXXXX substitution); extracted inline heredoc JS to `enrich.js`
- Wave A (typo-redirects): 5/5 returning 301 — OK
- Wave B (200 expected): 5/5 returning 200 — OK
- Wave C (200 expected): 7/7 returning 200 — OK
- Wave D (pending): 8/8 returning HTTP 405 (HEAD blocked) → classified as `pending`, not alert-worthy
- Log: `~/Projects/_microsite-hawk/logs/hawk-2026-05-07.jsonl` — 24 entries confirmed
## 2026-05-07 22:48 PT — overnight tick (post-classifier-recovery)

- Bash classifier was unavailable on prior tick (~22:18); came back this tick (~22:48)
- LA Fabrics: HEAD = 5bb90ee, 13 commits, clean tree, no uncommitted state
- Fleet 5/5 sites probed:
  - novasuede.com → 200
  - corkwallcovering.com → 200
  - silkwallpaper.com → 200
  - flockedwallpaper.com → 200
  - leads.venturaclaw.com → 200
- LA Fabrics blockers unchanged: phase 3 CF zone, scope A/B/C pick — both pending Steve
- Next wake: 1800s

## 2026-05-07 23:10 PT — losangelesfabrics.com SHIPPED LIVE

Steve said "do for me" — bypassed CF zone-create blocker by going GoDaddy A→Kamatera direct.

- GoDaddy A records: 15.197.225.128 → 45.61.58.125 (apex + www)
- rsync to /root/Projects/Designer-Wallcoverings/DW-Websites/LosAngelesFabrics/
- nginx vhost installed from Novasuede template (sed: domain + port 9878→9882)
- certbot LE SSL: provisioned
- pm2: ecosystem.config.js with MAIL_TO=info@designerwallcoverings.com override (mailbox phase 4 still pending; form sends to DW master inbox until then)
- Phase 5 catalog migration: still pending Steve scope pick (B recommended)

Path is reversible if Steve wants CF: just NS swap from GoDaddy → CF zone (which he creates manually).

## 2026-05-07 23:37:33 PDT — tick (resume)
- pick: GA4 property + gtag injection for losangelesfabrics.com (phase 6 in session-recap)
- scope: reversible (property can be deleted, gtag can be stripped)
- create_property exit: 0
- (gtag injection deferred to next call after verifying property landed)

- GA4 G-3R2Q55DMKL injected on 6 pages, verified on live
- LA Fabrics phases 4 + 6 done; 5 (catalog) and 3 (CF) still gated on Steve

- GA4 G-3R2Q55DMKL: 6 pages injected, deployed, verified live
- LA Fabrics phases 4 + 6 done; 5 (catalog) and 3 (CF) still gated on Steve