{"slug":"george-mcp","total":10,"limit":100,"offset":0,"since":null,"commits":[{"hash":"4cdbff5","date":"2026-09-10 08:03:41 -0700","author":"Steve Abrams","subject":"george-mcp: retry once on a Gmail quota error before fail-closed refusal — TK-11231","body":"Red-team finding: dedupe adds a search to every create, and fail-closed turns a\nquota blip into a hard block on legitimate drafting. The 60s id-join cache does\nnot help a burst of drafts to DIFFERENT recipients — which is exactly the\nvendor-blast pattern (Command, Maya Romanoff, Newmor back to back) that produced\nthe original backlog. Retry once with backoff on a quota/429 error, then refuse.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VTxE4MgnygQ9EY2rPZvtcK"},{"hash":"accb909","date":"2026-09-10 07:56:08 -0700","author":"Steve Abrams","subject":"george-mcp: drafts are no longer a terminal success — TK-11231","body":"Three causal failures in the record, three fixes (DTD-4 verdict, 2026-09-04):\n\n1. FALSE COMPLETION SIGNALLING (the deepest cause). create_draft returned a\n   plain success, so assistants reported the task done and tickets recorded\n   'waiting on the vendor' for 17 days while the ask had never left Drafts.\n   Draft results now carry status=awaiting_owner_send, delivered=false,\n   recipient_has_not_received_this=true and an explicit instruction not to\n   close a ticket or record waiting-on-the-other-party.\n\n2. DUPLICATE COMPOSITION. The same vendor ask was drafted twice three times\n   over (Command, Maya Romanoff, Newmor) because an agent could not see or\n   revise its own prior draft. Adds gmail_list_drafts (with age_days and an\n   agent_composed flag) and gmail_update_draft (revise in place), and makes\n   create_draft query-before-write: it REFUSES when unsent drafts to that\n   recipient already exist, handing them back with their draftIds.\n\n3. Dedupe FAILS CLOSED. Caught by live test: a Gmail per-minute quota error\n   made the check a silent no-op and a duplicate vendor draft was created\n   reporting success. An unverifiable check now refuses instead of guessing.\n\nAlso: cache the expensive drafts.list id-join (60s TTL) since calling it per\ninvocation is what exhausted the quota, and invalidate it on create/update —\nwithout that a draft created seconds earlier came back with draftId:null,\ni.e. un-updatable, reopening the duplicate hole.\n\nVerified end-to-end over real stdio JSON-RPC against live George: refusal\nfires (isError), update replaces in place leaving exactly one artifact, and\nevery test draft created was deleted (counts back to 136/41 baseline).\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VTxE4MgnygQ9EY2rPZvtcK"},{"hash":"67b3cb6","date":"2026-07-10 17:20:29 -0700","author":"Steve","subject":"chore: lint, refactor, v0.2.0 (session close)","body":""},{"hash":"d9bbb80","date":"2026-07-10 11:22:13 -0700","author":"Steve Abrams","subject":"add gmail_send_attachment tool: send email with local-file attachments via /api/send-with-attachment","body":""},{"hash":"b2cbb3d","date":"2026-07-09 08:56:46 -0700","author":"Steve Abrams","subject":"fix gmail_get_attachment: fetch raw bytes + save locally (remote George), was calling broken server-side /api/attachment-local","body":""},{"hash":"dacdbfb","date":"2026-07-07 14:14:28 -0700","author":"Steve","subject":"feat: add gmail_get_attachment MCP tool (wraps George /api/attachment-local)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"e616a1b","date":"2026-06-18 10:23:44 -0700","author":"Steve Abrams","subject":"gmail send: pass X-Send-Approval from GEORGE_EXTERNAL_SEND_TOKEN env (toggleable external-send approval; unset env to re-gate)","body":""},{"hash":"a8aaa43","date":"2026-05-18 14:48:41 -0700","author":"Steve Abrams","subject":"Add account param to all george MCP tools (5-account routing)","body":""},{"hash":"4834576","date":"2026-05-18 11:51:30 -0700","author":"Steve Abrams","subject":"george-mcp: derive BASE_PATH_PREFIX — empty for direct-port URLs, /george for reverse-proxy hostname (fixes 404 on :9850)","body":""},{"hash":"0267de5","date":"2026-05-06 10:25:19 -0700","author":"Steve Abrams","subject":"initial scaffold (gitify-all 2026-05-06)","body":""}]}