Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Draft email replies for Gonto's Gmail accounts (m@gon.to, gonto@hypergrowthpartners.com). Handles intro acceptances, scheduling intent, thanks/ack, and positive short replies. Use when user asks to draft or reply to an email, or when Gmail webhook triggers arrive for auto-draft classification. Draft-only mode — never sends automatically.
.claude/skills/jeremylongshore-email-drafting/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 324% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 434% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 114% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 162% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 47% | 0% |
Read ../config/user.json (resolves to ~/executive-assistant-skills/config/user.json). Extract and use throughout:
primary_email, work_email — Gmail accountsscheduling_cc — scheduling assistant email (CC on all scheduling emails, mention in body)scheduling_silent_cc — silent CC for scheduling visibility (do NOT mention in email body)signature — sign-off for all drafts (e.g. "--gonto")name — short name for contextDo not proceed until you have these values.
Read ../config/DEBUG_LOGGING.md for the full convention. Use python3 {user.workspace}/scripts/skill_log.py email-drafting <level> "<message>" ['<details>'] at every key step. Log BEFORE and AFTER every external call (gog gmail, mcporter, todoist-cli). On any error, log the full command and stderr before continuing.
Auto-draft and manually-requested email drafts for {user.primary_email} and {user.work_email}.
{user.signature}~/executive-assistant-skills/humanizer/SKILL.md. Remove AI-writing markers: inflated symbolism, promotional tone, em-dash overuse, "delve"/"leverage"/"foster" vocabulary, rule-of-three patterns. Email-specific rules (no dashes, signature, brevity) take precedence over humanizer suggestions if they conflict.{user.scheduling_cc} and {user.scheduling_silent_cc} for scheduling{user.scheduling_silent_cc} in the email body — silent CC onlyaccount + one-line intent + draft link📧 Draft ({user.primary_email} → John): intro acceptance. https://mail.google.com/...After creating a draft via gog, extract the draft ID from the response. Gmail draft URL format: https://mail.google.com/mail/u/?authuser={account_email}#drafts?compose={message_id} Use authuser=m@gon.to or authuser=gonto@hypergrowthpartners.com as appropriate.
intro, introduction, meet, connecting you, looping in, cc'ingfind a time, schedule, availability, next week, calendaragendar, agenda una, tenés unos minutosthanks, got it, appreciate it, status updatesworks for me, sounds good, perfect, greatOnly auto-draft when ALL are true:
Otherwise: ask user.
When drafting follow-up emails from meetings, Grain transcript is the primary source (not Granola):
mcporter call grain.list_attended_meetings --args '{"limit": 5}'mcporter call grain.fetch_meeting_transcript --args '{"meeting_id": "<id>"}'Read {user.workspace}/style/EMAIL_STYLE.md for the full writing style guide (derived from 200+ real sent emails). Read {user.workspace}/style/FEEDBACK_LOG.md for user corrections — latest overrides win.
Key points:
{user.signature}{user.workspace}/style/EMAIL_TEMPLATES.md — pattern templates (intros, follow-ups, VC, etc.){user.workspace}/style/email-templates.md — HGP business templates. Use only for HGP-specific business contexts. Primary templates take precedence on conflicts.After every external action, log it:
python3 {user.workspace}/scripts/audit_log.py log email_drafted "<recipient>" success '{"account": "<account>", "subject": "<subject>", "type": "<trigger_class>"}'python3 {user.workspace}/scripts/audit_log.py log email_sent "<recipient>" success '{"account": "<account>", "subject": "<subject>"}'python3 {user.workspace}/scripts/audit_log.py log email_draft_skipped "<recipient>" skipped '{"reason": "<reason>"}'--to <sender> explicitly when creating draftsEvery time a draft is created automatically (via Gmail hook or any automated trigger), you MUST send a WhatsApp notification to {user.whatsapp} with:
✏️ *Auto-draft created*
*To:* <recipient name> (<email>)
*Subject:* <subject>
*Account:* <account>
*Trigger:* <intro/scheduling/thanks/positive reply>
*Draft text:*
> <full draft body — include the complete text so user can review without opening Gmail>
🔗 <Gmail draft link>
Reply "send" to send, or edit in Gmail.This is non-optional. The user must be able to read and approve the draft from WhatsApp without opening Gmail.
gog CLI configured with both Gmail accounts (primary and work)mcporter with Grain MCP connection for meeting transcript accessskill_log.py and audit_log.py scripts{user.workspace}/style/EMAIL_STYLE.md~/executive-assistant-skills/humanizer/SKILL.mdSee the Execution, Trigger Detection, and Drafting Principles sections above for the full workflow. The skill detects trigger class (intro, scheduling, thanks/ack, positive reply), applies confidence gate, drafts via gog, and notifies via WhatsApp.
See the Skip Conditions and Confidence Gate sections above. Low-confidence triggers are not drafted. Errors in external calls (gog, mcporter) are logged via skill_log.py before continuing.
bash# Auto-draft trigger: intro email detected in inbox # Output: Gmail draft with intro acceptance, introducer moved to BCC, # scheduling assistant CC'd, WhatsApp notification with full draft text # "Draft (m@gon.to -> John): intro acceptance. [Gmail link]"
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 11,017 | 13,726 | +25% | 1 | 1 | 0% | 1,456 | 3,619 | +149% | 0 | 0 | — |
case-02 | fail→fail | 9,702 | 8,929 | -8% | 1 | 1 | 0% | 1,220 | 3,444 | +182% | 0 | 0 | — |
case-03 | fail→pass | 6,403 | 16,549 | +158% | 1 | 1 | 0% | 1,100 | 4,660 | +324% | 0 | 0 | — |
case-04 | pass→fail | 5,251 | 12,502 | +138% | 1 | 1 | 0% | 787 | 4,255 | +441% | 0 | 0 | — |
case-05 | fail→fail | 8,488 | 9,770 | +15% | 1 | 1 | 0% | 1,145 | 3,628 | +217% | 0 | 0 | — |
case-06 | pass→fail | 9,584 | 8,157 | -15% | 1 | 1 | 0% | 1,283 | 3,367 | +162% | 0 | 0 | — |
case-07 | fail→fail | 2,780 | 5,435 | +96% | 1 | 1 | 0% | 428 | 3,925 | +817% | 0 | 0 | — |
case-08 | pass→fail | 10,515 | 10,617 | +1% | 1 | 1 | 0% | 1,558 | 3,619 | +132% | 0 | 0 | — |
case-09 | fail→pass | 5,933 | 8,125 | +37% | 1 | 1 | 0% | 779 | 4,159 | +434% | 0 | 0 | — |
case-10 | pass→pass | 11,690 | 6,053 | -48% | 1 | 1 | 0% | 1,484 | 3,914 | +164% | 0 | 0 | — |
case-11 | fail→pass | 13,671 | 14,724 | +8% | 1 | 1 | 0% | 1,932 | 4,131 | +114% | 0 | 0 | — |
case-12 | fail→fail | 8,900 | 3,422 | -62% | 1 | 1 | 0% | 1,641 | 3,728 | +127% | 0 | 0 | — |
case-13 | fail→fail | 6,671 | 8,756 | +31% | 1 | 1 | 0% | 1,013 | 3,590 | +254% | 0 | 0 | — |
case-14 | pass→pass | 10,911 | 4,205 | -61% | 1 | 1 | 0% | 1,373 | 3,576 | +160% | 0 | 0 | — |
case-15 | fail→fail | 2,604 | 3,070 | +18% | 1 | 1 | 0% | 262 | 3,459 | +1220% | 0 | 0 | — |
case-16 | pass→pass | 9,446 | 4,162 | -56% | 1 | 1 | 0% | 1,148 | 3,534 | +208% | 0 | 0 | — |
case-17 | fail→pass | 11,268 | 4,674 | -59% | 1 | 1 | 0% | 1,391 | 3,641 | +162% | 0 | 0 | — |
case-18 | pass→pass | 5,722 | 4,848 | -15% | 1 | 1 | 0% | 897 | 3,696 | +312% | 0 | 0 | — |
case-19 | fail→pass | 15,272 | 3,666 | -76% | 1 | 1 | 0% | 2,533 | 3,727 | +47% | 0 | 0 | — |
case-20 | fail→pass | 8,853 | 11,671 | +32% | 1 | 1 | 0% | 1,183 | 4,922 | +316% | 0 | 0 | — |
case-21 | fail→fail | 19,571 | 7,891 | -60% | 1 | 1 | 0% | 424 | 3,380 | +697% | 0 | 0 | — |
case-22 | fail→fail | 7,993 | 9,324 | +17% | 1 | 1 | 0% | 359 | 3,608 | +905% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 13 counted toward the lift figure. The other 9 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +14 percentage points is the difference between those two pass rates over the 13 comparable cases. 5 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.