{"slug":"site-factory","total":16,"limit":100,"offset":0,"since":null,"commits":[{"hash":"f1b409f","date":"2026-07-03 08:08:17 -0700","author":"Steve","subject":"chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)","body":""},{"hash":"5bd4ae3","date":"2026-06-21 18:53:07 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-21T18:53:00 (12 files) — logs/cncp-panel.out logs/hawk.log logs/sf-admin.err.log logs/sf-admin.out.log logs/sf-critic.err.log","body":""},{"hash":"04da464","date":"2026-05-19 22:01:13 -0700","author":"SteveStudio2","subject":"site-factory: real stage 2/3/4 runners + stage 8 idempotency","body":"* stages/runners.js — replace stub bodies for brand/UX/UI with real\n  local-only runners that produce committable artifacts:\n    stage 2 (brand) → sites/<d>/brand/brand-spec.md\n    stage 3 (UX)    → sites/<d>/brand/sitemap.md\n    stage 4 (UI)    → sites/<d>/app/styles/brand-tokens.css\n\n* stages/runners.js stage 8 idempotency — check site_factory.stages for\n  an existing ga4_property_id BEFORE calling create_property.py. Previous\n  pipeline re-runs created 4 duplicate GA4 properties (538344557 +\n  538360131 + 538390749 + 538356405) that had to be soft-deleted\n  manually. Subtle bug — initial fix filtered status='done' but runStage\n  flips status to 'running' before invoking the runner, so the row never\n  matched. Now filters on the presence of ga4_* fields in output_json,\n  which only get written by a real successful run.\n\n* sites/{wholivedthere,bubbesblock,claimmyaddress}.com/brand/{brand-spec,sitemap}.md\n  and sites/.../app/styles/brand-tokens.css — the first 9 real artifacts\n  produced by the now-real pipeline. Each one is keyed to the site's\n  rotating palette (Chanel / Hermès / Gucci).\n\nSmoke: re-ran stage 8 on all 3 sites after the fix — all returned\nreused=true with the original property IDs, no new properties created\nin GA admin."},{"hash":"417327d","date":"2026-05-19 21:53:52 -0700","author":"SteveStudio2","subject":"bubbesblock + claimmyaddress: ship live GA4 (backfill from stage-8 pipeline pass)","body":"* sites/bubbesblock.com/app/lib/gtag.js   — G-CBE5QSCLXW (property 537957623)\n* sites/claimmyaddress.com/app/lib/gtag.js — G-WVSFP6J11J (property 538392114)\n\nGenerated by the now-fixed stages/runners.js audit-trail flow — both\nruns landed 11 rows each in site_factory.actions_log, confirming the\npostJSON BASIC_AUTH fix from commit fa82160. Pipeline state for all 3\nsites is now current_stage=11 (all stages done, status=intake at the\noverall-lifecycle level)."},{"hash":"fa82160","date":"2026-05-19 21:52:37 -0700","author":"SteveStudio2","subject":"wholivedthere.com: ship live GA4 + fix audit-trail postJSON","body":"* sites/wholivedthere.com/app/lib/gtag.js — measurement id G-VV80JM88WB\n  (GA4 property 538258118, created via stage 8 `/analytics` skill)\n\n* stages/runners.js — postJSON to /actions and /findings now forwards\n  the orchestrator's BASIC_AUTH credential. Was silently 401'ing every\n  audit-trail write (req.on('error') swallowed it), so site 1's first\n  full pipeline pass landed 0 rows in actions_log. Smoke-tested by\n  re-running stage 0: actions_log went 0 → 1 with the expected row."},{"hash":"e27fd4f","date":"2026-05-19 21:23:43 -0700","author":"SteveStudio2","subject":"sf-cncp-panel: launchd → pm2 cron_restart (gui/$UID domain unreachable)","body":"The com.steve.sf-cncp-panel launchd plist still exists at\n~/Library/LaunchAgents/ but can't be loaded from non-Aqua shells\n(launchctl bootstrap gui/$UID returns error 125 'Domain does not\nsupport specified action'). The launchd job was throttled to oblivion\nafter the May-7 freeze and never came back.\n\nSame script (scripts/cncp-panel-data.js), now run by pm2 with\ncron_restart='*/1 * * * *' + autorestart:false. Verified: cron fires\n~30s past every minute boundary, JSON file mtime advances, runs exit 0.\n\nLegacy plist left in place but inert — safe to delete once Steve\nconfirms nothing else references it."},{"hash":"5a1cbc4","date":"2026-05-19 21:11:41 -0700","author":"SteveStudio2","subject":"sf-viewer: add missing BASIC_AUTH env (same fix as sf-orchestrator)","body":""},{"hash":"1b587d3","date":"2026-05-19 21:10:52 -0700","author":"SteveStudio2","subject":"sf-orchestrator: unwedge from May-7 schema-missing freeze","body":"- apply db/schema.sql (palettes/sites/stages/manager_findings/actions_log/analytics_events all missing)\n- seed 20 fashion-house palettes via scripts/seed-palettes.js\n- add global error middleware + express-async-errors so async pg throws no longer leave responses hanging\n- wire BASIC_AUTH into ecosystem.config.js env (was unset → process.exit(1) on every restart → max-restart kill → silent absence)\n- smoke: GET /health 200, GET /sites {sites:[]}, GET /palettes count=20"},{"hash":"5af85e2","date":"2026-05-19 11:35:50 -0700","author":"Steve","subject":"snapshot — gitify backup 2026-05-19","body":""},{"hash":"a0c5fbe","date":"2026-05-13 12:16:24 -0700","author":"SteveStudio2","subject":"snapshot: backup live runtime state (1 files)","body":""},{"hash":"46c59ff","date":"2026-05-13 12:14:27 -0700","author":"SteveStudio2","subject":"snapshot: backup uncommitted work (7 files)","body":""},{"hash":"e6f32b5","date":"2026-05-13 08:58:01 -0700","author":"Steve","subject":"snapshot: 27 file(s) changed, +2 new, ~25 modified","body":""},{"hash":"f693138","date":"2026-05-11 10:02:30 -0700","author":"SteveStudio2","subject":"security: untrack .env (still present on disk, just not in git)","body":".env was committed before .gitignore exclusion was in place. File remains\non disk and functional; this stops future commits and prevents the next\ngit push (if any remote is ever added) from leaking secrets.\nNo remote currently configured, so no public exposure occurred."},{"hash":"9523023","date":"2026-05-07 12:29:54 -0700","author":"Steve","subject":"untrack node_modules per standing rule (was tracking 804 files; files preserved on disk)","body":""},{"hash":"8e367ce","date":"2026-05-07 12:29:31 -0700","author":"Steve","subject":"tighten .gitignore: add missing standing-rule patterns (tmp/ build/)","body":""},{"hash":"5b2b1e1","date":"2026-05-04 00:49:03 -0700","author":"SteveStudio2","subject":"[overnight] pre-debate baseline","body":""}]}