George Mcp
repo: ~/Projects/george-mcp · 10 commits · 0 in last 24h, 0 in last 7d ·
Skills used
- /claude2
- /code2
- /attachment-local2
- /update1
- /send-with-attachment1
- /george1
Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
4cdbff5 · 2026-09-10 · george-mcp: retry once on a Gmail quota error before fail-closed refusal — TK-11231
Red-team finding: dedupe adds a search to every create, and fail-closed turns a
quota blip into a hard block on legitimate drafting. The 60s id-join cache does
not help a burst of drafts to DIFFERENT recipients — which is exactly the
vendor-blast pattern (Command, Maya Romanoff, Newmor back to back) that produced
the original backlog. Retry once with backoff on a quota/429 error, then refuse.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VTxE4MgnygQ9EY2rPZvtcK
accb909 · 2026-09-10 · george-mcp: drafts are no longer a terminal success — TK-11231
Three causal failures in the record, three fixes (DTD-4 verdict, 2026-09-04):
1. FALSE COMPLETION SIGNALLING (the deepest cause). create_draft returned a
plain success, so assistants reported the task done and tickets recorded
'waiting on the vendor' for 17 days while the ask had never left Drafts.
Draft results now carry status=awaiting_owner_send, delivered=false,
recipient_has_not_received_this=true and an explicit instruction not to
close a ticket or record waiting-on-the-other-party.
2. DUPLICATE COMPOSITION. The same vendor ask was drafted twice three times
over (Command, Maya Romanoff, Newmor) because an agent could not see or
revise its own prior draft. Adds gmail_list_drafts (with age_days and an
agent_composed flag) and gmail_update_draft (revise in place), and makes
create_draft query-before-write: it REFUSES when unsent drafts to that
recipient already exist, handing them back with their draftIds.
3. Dedupe FAILS CLOSED. Caught by live test: a Gmail per-minute quota error
made the check a silent no-op and a duplicate vendor draft was created
reporting success. An unverifiable check now refuses instead of guessing.
Also: cache the expensive drafts.list id-join (60s TTL) since calling it per
invocation is what exhausted the quota, and invalidate it on create/update —
without that a draft created seconds earlier came back with draftId:null,
i.e. un-updatable, reopening the duplicate hole.
Verified end-to-end over real stdio JSON-RPC against live George: refusal
fires (isError), update replaces in place leaving exactly one artifact, and
every test draft created was deleted (counts back to 136/41 baseline).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VTxE4MgnygQ9EY2rPZvtcK
File tree
4 files tracked. Click any to browse the source at HEAD.
rendered in 1ms