. The inline basic-auth credential\n(\"admin:DWSecure2024!\") was already in this file at lines 60 + 66 before\nthis commit and is unchanged by it. Credential rotation across the fleet\nis tracked separately (cred is also in dozens of sibling repos per MEMORY).\n\nSurfaced by tick 169 session #102 Teal mechanical refactor pass; that\npass deferred the fix because the diff touches the cred line, but the\nLIVE-BROKEN production UI takes precedence — fixing now, rotation later.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) "},{"h":"941feb1","d":"2026-05-19","s":"Snapshot-files cleanup: untrack server.js.bak-*, broaden .gitignore, add 404 guard","b":"- Untrack the 7-month-old server.js.bak-20260421-094351 snapshot that was\n tracked in the repo (still present on disk, now ignored).\n- Broaden .gitignore to cover *.bak.*, *.bak-*, *.pre-*, *.orig, *.rej,\n *.swp, *~ so future snapshots don't slip back in.\n- Add a static-snapshot 404 guard middleware that runs before\n express.static('public'); any URL matching .bak, .bak-*, .pre-*, .orig,\n .rej, .swp, or trailing ~ returns 404 regardless of disk state.\n Defense-in-depth on top of the existing basic-auth gate.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) "},{"h":"c2bdfca","d":"2026-05-19","s":"add trash-fleet-mailtests.js — one-off cleanup of 89 fleet delivery-test emails (modeled on trash-redfin-zillow.js)","b":""},{"h":"ab70d2e","d":"2026-05-19","s":"George: make the 'From job:' provenance banner opt-out (no_source_tag flag / x-george-no-tag header) so customer-facing sends can be banner-free","b":"Co-Authored-By: Claude Opus 4.7 (1M context) "},{"h":"fd1481e","d":"2026-05-19","s":"Fleet auto-responder: stop logging non-fleet mail to UI run-log (run-log tracks fleet inquiries only)","b":""},{"h":"8f310af","d":"2026-05-19","s":"Fleet auto-responder: update usage docstring (daemon/force flags, HTML reply, UI)","b":""},{"h":"2f343b5","d":"2026-05-19","s":"Fleet auto-responder: fix scan query (bare deliveredto:steve+ never matches in Gmail) + probe-subject safety guard (RETEST/FLEETMAILTEST/DTEST/PMRCV)","b":""},{"h":"e9fdf0f","d":"2026-05-19","s":"Fleet auto-responder: --daemon self-scheduling mode (pm2-managed, 3-min interval); UI on port 9768","b":""},{"h":"9c7a470","d":"2026-05-19","s":"fleet-autoresponder UI: move port 9766→9768 (9766 reserved for agent-architect mindmap viewer)","b":""},{"h":"d6e30ce","d":"2026-05-19","s":"Fleet auto-responder: pm2 ecosystem config — 3-min cron schedule + UI process","b":""},{"h":"fb57ee9","d":"2026-05-19","s":"Fleet auto-responder admin UI dashboard (Express viewer, port 9766, pm2-managed)","b":""},{"h":"13d4e3b","d":"2026-05-19","s":"Fleet auto-responder: multipart/alternative HTML+plain reply, structured run-log + state","b":""},{"h":"7d77cad","d":"2026-05-19","s":"Fleet auto-responder: deliveredto query fix + --only-ids scoped-test flag","b":"Tested live on barwallpaper.com + grassclothwallcovering.com (2-domain test):\n- Gmail does not match plus-tags via to:; switched candidate query to\n deliveredto: and rely on Delivered-To header parsing for domain recovery.\n- Added --only-ids flag so a scoped test does not touch the inbox backlog\n of unrelated probe mail.\n- Verified: reply sent from info@designerwallcoverings.com landed in the\n recipient INBOX (not Spam), correct per-domain sign-off, no loop, label\n + 7-day ledger dedup both idempotent on re-run.\n\nLedger (data/fleet-autoresponder-ledger.json) gitignored — runtime state.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) "},{"h":"d135118","d":"2026-05-19","s":"Add fleet auto-responder for the 44 dw-domain-fleet domains","b":"Sends one warm acknowledgment from info@designerwallcoverings.com to genuine\nnew customer inquiries arriving at info@ (forwarded into the\nsteve-office Gmail via Purelymail catch-all + plus-tag). Reply-To is set to\ninfo@ so customer replies route back to the right site.\n\nSpam-safety: skips Spam, no-reply/bounce senders, bulk/auto/list mail, and any\nmail from designerwallcoverings.com or a fleet domain (loop guard). One reply\nper sender per rolling 7-day window (persisted ledger). Marks every processed\nmessage with the 'fleet-autoreplied' Gmail label — idempotent on re-run.\n\nReuses George's DW-MCP/.env OAuth credentials; no prod deploy needed.\nNot yet scheduled — run manually with: node fleet-autoresponder.js\n\nCo-Authored-By: Claude Opus 4.7 (1M context) "},{"h":"02ef28b","d":"2026-05-18","s":"Make /api/profile honor ?account= param like the other 31 routes","b":""},{"h":"2cbc311","d":"2026-05-18","s":"remove bogus stevesclaude account from George — theagentabrams@gmail.com (agentabrams) is the real AI account; also exempt /auth/agentabrams from basic auth","b":""},{"h":"23979b0","d":"2026-05-18","s":"Add agentabrams (theagentabrams@gmail.com) as 5th george account slot","b":""},{"h":"ec801aa","d":"2026-05-18","s":"george /auth honors ?account= — dispatches to per-account re-auth routes","b":""},{"h":"a4d0448","d":"2026-05-12","s":"fix(george): ENV_PATH portable across Mac2/Kamatera","b":"ENV_PATH was hardcoded to /root/Projects/Designer-Wallcoverings/DW-MCP/.env\nwhich only exists on Kamatera. On Mac2 the same .env lives at\n~/Projects/Designer-Wallcoverings/DW-MCP/.env. The readFileSync would\nquietly fail in the try/catch upstream, INFO_REFRESH_TOKEN stayed empty,\nand the boot log said 'Info@ not configured' even though the token IS\nin the Mac2 .env.\n\nFix: try $DW_MCP_ENV then $HOME/Projects/.../DW-MCP/.env then the\nlegacy /root/ path. First readable wins.\n\nSymptom that exposed this: GET /api/search?account=info returned\n'unknown account: info' because infoGmail was never built. After\nrestart with the fix, log says 'Info@ account initialized (full\nWorkspace)' and /api/search returns the real DW inbox (201 messages\nfor a Shopify-orders query, including 'New Order on the New DW')."},{"h":"facbb3b","d":"2026-05-06","s":"initial scaffold (gitify-all 2026-05-06)","b":""}];
const q = document.getElementById('q');
const list = document.getElementById('bp-commits');
const tally = document.getElementById('bp-tally');
function applyFilter() {
const term = q.value.toLowerCase().trim();
let shown = 0;
for (const li of list.children) {
const match = !term || li.dataset.blob.includes(term);
li.style.display = match ? '' : 'none';
if (match) shown++;
}
tally.textContent = term ? `${shown} / ${DATA.length} match "${q.value}"` : `${DATA.length} commits indexed`;
// Reflect search state in URL so a filtered view is shareable. Use
// replaceState so the back button still escapes the project page.
const url = new URL(window.location.href);
if (term) url.searchParams.set('q', q.value); else url.searchParams.delete('q');
history.replaceState(null, '', url);
}
q.addEventListener('input', applyFilter);
// Apply the initial ?q= from the server-rendered value field.
if (q.value) applyFilter();
build-pages
George Gmail
repo: ~/Projects/george-gmail · 70 commits · 2 in last 24h, 14 in last 7d · ███████
c4c9ba42026-07-15bridge: every-6-day 1-click renewal email to steve-office for the 2 consumer accounts (CADENCE mode) + dead-token safety net stays on 8/2/8
a2eaa2d2026-07-15bridge: nudge to renew at day 5 (2-day runway before the 7-day expiry)
23d49a62026-06-24send-with-attachment: resolve any account (steve-personal/agentabrams), not just office/info
2626a502026-06-24Add DELETE /api/drafts/:id route + make GET /api/drafts account-aware (was always steve-office)
a42bc742026-06-17George external-send guard: block outbound sends to non-Steve recipients unless human-approval token present (X-Send-Approval / send_approval_token); fail-closed. Born from autonomous-worker auto-send incident 2026-06-17. NOTE: must also deploy to the Kamatera george (the instance MCP actually uses).
918647c2026-06-17Add launchd KeepAlive supervisor for george-gmail :9850 (durable fix for the unsupervised-death outage)
8c22e562026-06-12secret-strip george-gmail: env-first the hardcoded George basic-auth cred (server) + remove browser-embedded copy (client)
cf272722026-06-12Add scoped one-shot trash for benign cron-drift alert flood in info@
8599fb22026-05-31Link favicon.svg in head (use branded SVG, not .ico fallback)
c2bdfca2026-05-19add trash-fleet-mailtests.js — one-off cleanup of 89 fleet delivery-test emails (modeled on trash-redfin-zillow.js)
ab70d2e2026-05-19George: make the 'From job:' provenance banner opt-out (no_source_tag flag / x-george-no-tag header) so customer-facing sends can be banner-free
fd1481e2026-05-19Fleet auto-responder: stop logging non-fleet mail to UI run-log (run-log tracks fleet inquiries only)
8f310af2026-05-19Fleet auto-responder: update usage docstring (daemon/force flags, HTML reply, UI)
2f343b52026-05-19Fleet auto-responder: fix scan query (bare deliveredto:steve+ never matches in Gmail) + probe-subject safety guard (RETEST/FLEETMAILTEST/DTEST/PMRCV)
e9fdf0f2026-05-19Fleet auto-responder: --daemon self-scheduling mode (pm2-managed, 3-min interval); UI on port 9768
9c7a4702026-05-19fleet-autoresponder UI: move port 9766→9768 (9766 reserved for agent-architect mindmap viewer)
fb57ee92026-05-19Fleet auto-responder admin UI dashboard (Express viewer, port 9766, pm2-managed)
13d4e3b2026-05-19Fleet auto-responder: multipart/alternative HTML+plain reply, structured run-log + state
7d77cad2026-05-19Fleet auto-responder: deliveredto query fix + --only-ids scoped-test flag
d1351182026-05-19Add fleet auto-responder for the 44 dw-domain-fleet domains
02ef28b2026-05-18Make /api/profile honor ?account= param like the other 31 routes
2cbc3112026-05-18remove bogus stevesclaude account from George — theagentabrams@gmail.com (agentabrams) is the real AI account; also exempt /auth/agentabrams from basic auth
23979b02026-05-18Add agentabrams (theagentabrams@gmail.com) as 5th george account slot
ec801aa2026-05-18george /auth honors ?account= — dispatches to per-account re-auth routes
a4d04482026-05-12fix(george): ENV_PATH portable across Mac2/Kamatera
Commits with substantial prose (≥120 chars) — the rationale behind each move.
7b49e78 · 2026-07-15 · feat(bridge): painless George token renewal — WARN/CRIT accounts get a one-click re-consent email (DTD verdict B, 2026-07-15)
token-age-warn.mjs computed WARN/CRIT but never alerted. token-bridge.mjs reads its latest.json and emails Steve a "Renew now" button (George /auth/<account>) for each aging/dead token, throttled 1/20h per account, +CNCP card. 3x/day launchd plist runs monitor then bridge. Verified: emailed 4 accounts (steve-personal dead, calendar dead, steve@/info@ aging).
Adds a service-account/JWT impersonation path alongside the existing OAuth refresh-token
path so the Workspace pair (steve@ + info@) can drop off the ~7-day Testing-mode token
treadmill. Fully DORMANT by default: with no GOOGLE_SA_KEYFILE set, saAuthFor() returns
null and the SA-override block is a no-op — every account keeps its refresh-token client
byte-for-byte. Arm via GOOGLE_SA_KEYFILE + GEORGE_SA_ACCOUNTS=steve-office,info (Workspace
only; consumer gmail keys can never be SA-backed). resolveAccount() reads the module-level
service-client vars per request, so it transparently picks up the SA clients when armed.
Verified by boot tests: dormant -> 0 SA lines + all accounts on refresh tokens; armed w/
missing or bogus keyfile -> clear warn + safe fallback + still boots. Live JWT impersonation
awaits Steve's gated console work (SA creation + domain-wide delegation authorization).
Arming checklist + rollback in PLAN-OAUTH-DURABILITY.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Council #3 — end the weekly-token treadmill. Read-only token-age-warn.mjs probes each
refresh token against Google's token endpoint (idempotent refresh, never writes creds) and
combines validity with a hash-tracked age; WARNs ~1d before the 7d Testing-mode expiry,
CRIT on invalid_grant. Alerts on worsening transition only (CNCP + George email via run.sh).
First run surfaced a live finding: GOOGLE_CALENDAR_REFRESH_TOKEN is DEAD (appointments push
silently broken). Migration paths (service-account/DWD or Internal user-type) in
PLAN-OAUTH-DURABLE-TOKENS.md — those steps are Steve-gated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
918647c · 2026-06-17 · Add launchd KeepAlive supervisor for george-gmail :9850 (durable fix for the unsupervised-death outage)
Tracked plist + install note. Not bootstrapped here — Steve runs the bootstrap
(starts the email service + touches launchd). RunAtLoad+KeepAlive so the :9850
send service self-respawns; daily-overnight-skus + idea-loop-digest were only
failing because this send path died.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
xfetch was sitting OUTSIDE any <script> tag, wedged between the
react.production.min.js and react-dom.production.min.js script tags.
Browsers parsed it as text content → xfetch was undefined → every
api()/apiPost() call (lines 67-74, 88, 96, 105, 113) threw ReferenceError
on page load. George admin inbox UI was unusable in any browser.
Pure positional fix — wrapped the existing one-line function in
<script>...</script>. The inline basic-auth credential
("admin:DWSecure2024!") was already in this file at lines 60 + 66 before
this commit and is unchanged by it. Credential rotation across the fleet
is tracked separately (cred is also in dozens of sibling repos per MEMORY).
Surfaced by tick 169 session #102 Teal mechanical refactor pass; that
pass deferred the fix because the diff touches the cred line, but the
LIVE-BROKEN production UI takes precedence — fixing now, rotation later.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Untrack the 7-month-old server.js.bak-20260421-094351 snapshot that was
tracked in the repo (still present on disk, now ignored).
- Broaden .gitignore to cover *.bak.*, *.bak-*, *.pre-*, *.orig, *.rej,
*.swp, *~ so future snapshots don't slip back in.
- Add a static-snapshot 404 guard middleware that runs before
express.static('public'); any URL matching .bak, .bak-*, .pre-*, .orig,
.rej, .swp, or trailing ~ returns 404 regardless of disk state.
Defense-in-depth on top of the existing basic-auth gate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tested live on barwallpaper.com + grassclothwallcovering.com (2-domain test):
- Gmail does not match plus-tags via to:; switched candidate query to
deliveredto: and rely on Delivered-To header parsing for domain recovery.
- Added --only-ids flag so a scoped test does not touch the inbox backlog
of unrelated probe mail.
- Verified: reply sent from info@designerwallcoverings.com landed in the
recipient INBOX (not Spam), correct per-domain sign-off, no loop, label
+ 7-day ledger dedup both idempotent on re-run.
Ledger (data/fleet-autoresponder-ledger.json) gitignored — runtime state.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
d135118 · 2026-05-19 · Add fleet auto-responder for the 44 dw-domain-fleet domains
Sends one warm acknowledgment from info@designerwallcoverings.com to genuine
new customer inquiries arriving at info@<fleet-domain> (forwarded into the
steve-office Gmail via Purelymail catch-all + plus-tag). Reply-To is set to
info@<fleet-domain> so customer replies route back to the right site.
Spam-safety: skips Spam, no-reply/bounce senders, bulk/auto/list mail, and any
mail from designerwallcoverings.com or a fleet domain (loop guard). One reply
per sender per rolling 7-day window (persisted ledger). Marks every processed
message with the 'fleet-autoreplied' Gmail label — idempotent on re-run.
Reuses George's DW-MCP/.env OAuth credentials; no prod deploy needed.
Not yet scheduled — run manually with: node fleet-autoresponder.js
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
a4d0448 · 2026-05-12 · fix(george): ENV_PATH portable across Mac2/Kamatera
ENV_PATH was hardcoded to /root/Projects/Designer-Wallcoverings/DW-MCP/.env
which only exists on Kamatera. On Mac2 the same .env lives at
~/Projects/Designer-Wallcoverings/DW-MCP/.env. The readFileSync would
quietly fail in the try/catch upstream, INFO_REFRESH_TOKEN stayed empty,
and the boot log said 'Info@ not configured' even though the token IS
in the Mac2 .env.
Fix: try $DW_MCP_ENV then $HOME/Projects/.../DW-MCP/.env then the
legacy /root/ path. First readable wins.
Symptom that exposed this: GET /api/search?account=info returned
'unknown account: info' because infoGmail was never built. After
restart with the fix, log says 'Info@ account initialized (full
Workspace)' and /api/search returns the real DW inbox (201 messages
for a Shopify-orders query, including 'New Order on the New DW').
File tree
28 files tracked. Click any to browse the source at HEAD.