{"slug":"pitch-guard","total":29,"limit":100,"offset":0,"since":null,"commits":[{"hash":"4932ed3","date":"2026-06-30 05:58:50 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-30T05:58:45 (1 files) — server.js","body":""},{"hash":"aae4190","date":"2026-06-30 05:19:50 -0700","author":"Steve","subject":"feature: surface invoice-sent & samples-sent as warm followup signals + sort criteria","body":"- detectWarmSent(): in:sent scan for invoice/samples/swatch/memo (outbound only)\n- candidate scan tags warmSignals + sentInvoice/SamplesTs, sorts warm leads first\n- assessRisk now blocks only paid/shipped/ordered (an unpaid invoice we SENT is a\n  warm lead, not a closed sale) — Samantha tripwire (paid/shipped/order) intact\n- UI: green INVOICE SENT / SAMPLES SENT chips on candidate rows + Invoice-sent /\n  Samples-sent sort options"},{"hash":"ca01242","date":"2026-06-30 05:18:33 -0700","author":"Steve","subject":"Pitch Guard: auto-remove a draft from the list once its followup sends successfully (trash + drop card)","body":""},{"hash":"bb14d71","date":"2026-06-30 05:15:23 -0700","author":"Steve","subject":"snapshot before invoice/samples-sent followup-signal feature","body":""},{"hash":"7e21c18","date":"2026-06-23 09:50:58 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-23T09:50:51 (1 files) — server.js.tmp","body":""},{"hash":"9b5953d","date":"2026-06-18 15:56:47 -0700","author":"Steve Abrams","subject":"PitchGuard: explicitly send/draft from info@designerwallcoverings.com","body":"Pin From to 'Designer Wallcoverings <info@designerwallcoverings.com>' on\nboth /api/send and /api/followup/create so outbound can never fall back to\na Gmail default. (Sends already resolved to info@ via George's account\nmapping; this makes it explicit and override-proof.)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"1e95bac","date":"2026-06-18 15:48:31 -0700","author":"Steve Abrams","subject":"PitchGuard: red 'already sent' alert + 4th Already-Sent column","body":"When a followup was already sent to the selected contact, show a red alert\n(with the exact date+time it went out) in the Pitch verdict, and add a 4th\npanel on the right listing every letter already sent to that contact —\ndate+time stamped, the matched followup flagged red. Layout bumped to v2 so\nexisting users pick up the new column.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"bcb6aaa","date":"2026-06-18 15:42:21 -0700","author":"Steve Abrams","subject":"Fix Send followup: pass George external-send approval token","body":"George's externalSendGuard 403-blocks all sends to external (customer)\nrecipients unless the request carries the human-approval token. PitchGuard's\nauthenticated Send-followup click IS that approval, so include\nsend_approval_token (from GEORGE_EXTERNAL_SEND_TOKEN) on every /api/send.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"75b161a","date":"2026-06-18 13:18:19 -0700","author":"SteveStudio2","subject":"Add Designer Wallcoverings logo to header; (GEORGE_URL fixed to Tailscale MagicDNS HTTPS in .env — gitignored)","body":""},{"hash":"7308e45","date":"2026-06-16 14:53:13 -0700","author":"SteveStudio2","subject":"Refine: never bother clients who already transacted or were already followed up","body":"Root cause (2026-06-16): the paid/shipped risk-gate lived ONLY in the UI Send\nbutton, so a native Gmail-web send bypassed it — already-closed clients\n(incl. one PAID+ORDERED+SHIPPED) got pitched a quote followup.\n\n- assessRisk() + alreadyFollowedUp() shared probes\n- candidate scanner now EXCLUDES level>=2 (ORDERED/INVOICED/PAID/SHIPPED) and\n  anyone followed up in last 21d — they never become candidates, so never drafted\n- /api/followup/create refuses to draft a transacted contact (defense-in-depth)\n- swept + trashed today's followup drafts to transacted clients (gsmsriedel/louie/\n  nicole/jgarner/sis9lives/tmmd44/daddydas) + duplicate drafts to already-sent ones"},{"hash":"0d9ee55","date":"2026-06-16 14:12:52 -0700","author":"SteveStudio2","subject":"Fix non-deterministic followup-candidate scanner: single-flight lock + serve cache on reload, retry throttled Gmail checks instead of silently dropping (over-include w/ 'uncertain' flag), full paginated sent scan (80 contacts). Count now stable across reloads (was 11→10→6)","body":""},{"hash":"bd41631","date":"2026-06-16 14:09:45 -0700","author":"Steve Abrams","subject":"pitch-guard: persist dates+letters sent per person (durable ledger) + surface George's SENT mail per contact","body":""},{"hash":"c3d6f36","date":"2026-05-31 16:56:04 -0700","author":"SteveStudio2","subject":"Link favicon.svg in head (use branded SVG, not .ico fallback)","body":""},{"hash":"9e6d276","date":"2026-05-31 16:32:36 -0700","author":"SteveStudio2","subject":"Add per-site favicon (kills /favicon.ico 404)","body":""},{"hash":"e610e4d","date":"2026-05-19 17:34:05 -0700","author":"SteveStudio2","subject":"Broaden .gitignore to exclude .bak / .pre- snapshot files","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"88b1ce4","date":"2026-05-19 17:33:47 -0700","author":"SteveStudio2","subject":"Add 404-guard middleware so .bak/.pre- snapshot files never serve from static root","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"b193fc5","date":"2026-05-19 17:33:29 -0700","author":"SteveStudio2","subject":"Add rel=noreferrer to target=_blank link (mechanical safety pass)","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"30852ed","date":"2026-05-19 11:32:32 -0700","author":"Steve","subject":"Move George URL + auth to gitignored .env (was hardcoded in server.js); add .env.example","body":""},{"hash":"a2e4c2f","date":"2026-05-19 11:16:23 -0700","author":"Steve","subject":"Followup scanner now auto-runs: warms on startup + daily, candidates auto-load on page open","body":""},{"hash":"b5dbc8d","date":"2026-05-19 10:13:30 -0700","author":"Steve","subject":"Send no_source_tag to George so customer emails skip the From-job banner","body":""},{"hash":"bfffaf9","date":"2026-05-19 10:09:55 -0700","author":"Steve","subject":"Pitch panel: Edit/Preview HTML toggle + Open-as-page; strip George From-job banner","body":""},{"hash":"164394a","date":"2026-05-19 09:59:35 -0700","author":"Steve","subject":"Add 5-day followup candidate scanner (dry-run) — Followup Candidates section + per-candidate Draft-it","body":""},{"hash":"0bd7aef","date":"2026-05-19 09:28:07 -0700","author":"Steve","subject":"Fix recent-followup detection — broad regex for all followup templates + body fallback when snippet misses","body":""},{"hash":"e7305dd","date":"2026-05-19 09:22:09 -0700","author":"Steve","subject":"Add Delete draft button to the Pitch panel footer","body":""},{"hash":"fba50d0","date":"2026-05-19 09:19:13 -0700","author":"Steve","subject":"Add recent-followup signal, draft delete (trash), and sort by name/date/subject/risk","body":""},{"hash":"e6f61db","date":"2026-05-19 09:08:58 -0700","author":"Steve","subject":"Split drafts into Clients + collapsible Vendors section (vendor classifier from dw_unified)","body":""},{"hash":"5c43a5e","date":"2026-05-19 08:59:45 -0700","author":"Steve","subject":"Pitch Guard: resizable / collapsible / reorderable / pop-out panels","body":""},{"hash":"dd9f2df","date":"2026-05-19 08:43:41 -0700","author":"Steve","subject":"move Pitch Guard to port 8123","body":""},{"hash":"7b30caa","date":"2026-05-19 08:13:27 -0700","author":"Steve","subject":"Pitch Guard — draft + correspondence viewer for info@ with pre-send risk gate","body":""}]}