Email Drafting Skill
Config — read before starting
Read ../config/user.json (resolves to ~/executive-assistant-skills/config/user.json).
Extract and use throughout:
primary_email, work_email — Gmail accounts
scheduling_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 context
Do not proceed until you have these values.
Debug Logging (MANDATORY)
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.
Overview
Auto-draft and manually-requested email drafts for {user.primary_email} and {user.work_email}.
When to Use
- Gmail hook detects a trigger (intro, scheduling, thanks/ack, positive reply)
- User asks to draft/reply/send an email
- Action items cron identifies email follow-ups needed
Architecture
- Detects triggers and creates Gmail drafts
- Handles all scheduling (slot-finding, conflict checking, calendar ops)
- NEVER proposes specific dates/times or creates calendar events
Execution
- "Reply" always means Reply All — include all original To + CC recipients. Only exclude if user explicitly says to reply to one person. Exception: intro handling moves the introducer to BCC per the intro sequence below.
- After sending any email/draft, check if it fulfills an open Todoist task (send deck, intro, follow-up, etc.). If yes → complete the task immediately and confirm.
- Hook/cron triggers: Always run via isolated sub-agent (prevents memory/context contamination)
- Direct user requests ("draft a reply to X"): Main agent may execute directly, but must still follow all style rules and must NOT read MEMORY.md or daily memory files
Rules (non-negotiable)
Core
- Draft-only mode — never send automatically
- Mirror inbound language — match the language of the most recent non-automated message in the thread. If the thread has mixed languages, default to the language of the message you're replying to.
- Always sign — end every draft with
{user.signature}
- Low confidence — don't draft; ask user for guidance
- No dash punctuation — no em-dash/en-dash in bodies. Use commas/periods.
- Humanize — before finalizing any draft, review it against
~/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.
Intro Handling (required sequence)
- Thank introducer first
- Move introducer to BCC
- Reply to introduced contact directly
- CC
{user.scheduling_cc} and {user.scheduling_silent_cc} for scheduling
- Include one line like: "Connecting {user.scheduling_cc_name} to find a time."
- Do NOT mention
{user.scheduling_silent_cc} in the email body — silent CC only
Scheduling Drafts
- ALWAYS CC {user.scheduling_cc} AND {user.scheduling_silent_cc}
- NEVER propose specific dates or times
- Just confirm willingness to meet + mention scheduling assistant will coordinate
- Example: "Connecting Alfred to find a time that works"
- Do NOT mention {user.scheduling_silent_cc} in the email body — she's CC'd silently for visibility
Allowed Auto-Draft Classes
- Thanks/ack
- Scheduling intent
- Positive short replies
- Intro acceptance
Notification Format
account + one-line intent + draft link
- Example:
📧 Draft ({user.primary_email} → John): intro acceptance. https://mail.google.com/...
Draft Links
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.
Trigger Detection
A) Intro
- Cues:
intro, introduction, meet, connecting you, looping in, cc'ing
- At least 2 external participants + clear handoff language
- Apply intro sequence exactly
B) Scheduling Intent
- Cues:
find a time, schedule, availability, next week, calendar
- Spanish cues:
agendar, agenda una, tenés unos minutos
- CC scheduling contacts, don't propose times
C) Thanks/Ack
- Cues:
thanks, got it, appreciate it, status updates
- Short acknowledgment + optional one-line next step
D) Positive Short Reply
- Cues:
works for me, sounds good, perfect, great
- Short affirmative + close
Skip Conditions (do NOT auto-draft)
- Confidence low / intent ambiguous
- User already replied in the thread (SENT message exists)
- Legal, financial, security, hiring-final, sensitive conflict topics
- Multi-question strategic asks
- Automated/system/calendar notifications
- Messages requiring attachments, deep verification, or policy commitments
- Language unclear or unmirrorable
- Scheduling confirmations — NEVER auto-draft emails that simply confirm a scheduled time or acknowledge a calendar invite. The scheduling assistant (Alfred/Howie) handles all scheduling coordination. Auto-drafting "confirming our call at X" creates noise and duplicates the scheduler's work. This includes: confirming times proposed by the scheduler, acknowledging calendar invites, and "looking forward to our call" type replies to scheduling threads.
Confidence Gate
Only auto-draft when ALL are true:
- Trigger class is one of the 4 allowed
- Language confidently detected and mirrorable
- Clear recipient intent and next step
- No skip condition present
Otherwise: ask user.
Drafting Principles
- Keep it SHORT — drafts are always brief. 2-3 short paragraphs max.
- No over-explaining — state the point, don't elaborate unless necessary
- When promising intros: before drafting the intro, search sent emails for previous intros to that person/company, copy the format and tone, and use the same email address
- When recommending a person/company: use your own words from past emails about them rather than inventing new descriptions
- Deck/one-pager: say "Hypergrowth Partners deck" (not "our one-pager" or "our deck"). When attaching, frame WHY it's useful (e.g. "where we explain what Hypergrowth is and how we help companies")
- Future availability: frame as an opportunity, not a brush-off. Position it warmly: "I'd love to reconnect then to explore working together if the timing still makes sense" rather than blunt "let's connect closer to June"
- Offers of help should use meeting context: read Granola notes from the call and reference specific things discussed. The draft should feel like it came from someone who was in the meeting.
- No generic "Great meeting today" unless it's explicitly a first meeting (first VC call or first dealflow call).
- Proposal-first rule: if the commitment is to build/provide a proposal first, do not draft outbound email yet; create TODO only.
Use Grain as primary source for meeting-based drafts
When drafting follow-up emails from meetings, Grain transcript is the primary source (not Granola):
- Find the meeting in Grain:
mcporter call grain.list_attended_meetings --args '{"limit": 5}'
- Fetch transcript:
mcporter call grain.fetch_meeting_transcript --args '{"meeting_id": "<id>"}'
- Search transcript for email commitments: "I'll send", "I'll email", "I'll share", "let me intro", "I'll follow up", "I'll connect you", etc.
- Draft from the transcript — use your actual words and the real conversation context, not Granola's summary.
- Fall back to Granola only if Grain has no recording for that meeting.
Style
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:
- Friendly, concise, action-oriented. Warm but not fluffy.
- 1–4 short paragraphs, ~6–7 word sentences
- Context-first openings, straight to point
- Common opens: "Hey ,", "Thanks…", "Perfect…", "Great…"
- Sign off:
{user.signature}
- No dash punctuation (no em-dash/en-dash)
- Do: be brief, clear, warm, decisive, include draft link in notification
- Don't: over-explain, corporate fluff, long formal prose
Templates
- Primary:
{user.workspace}/style/EMAIL_TEMPLATES.md — pattern templates (intros, follow-ups, VC, etc.)
- Legacy (HGP v1):
{user.workspace}/style/email-templates.md — HGP business templates. Use only for HGP-specific business contexts. Primary templates take precedence on conflicts.
Audit Logging (MANDATORY)
After every external action, log it:
- Draft created:
python3 {user.workspace}/scripts/audit_log.py log email_drafted "<recipient>" success '{"account": "<account>", "subject": "<subject>", "type": "<trigger_class>"}'
- Email sent:
python3 {user.workspace}/scripts/audit_log.py log email_sent "<recipient>" success '{"account": "<account>", "subject": "<subject>"}'
- Draft skipped (low confidence):
python3 {user.workspace}/scripts/audit_log.py log email_draft_skipped "<recipient>" skipped '{"reason": "<reason>"}'
Auto-Draft Constraints
- NEVER create calendar events — only the scheduling assistant handles that
- Only create email drafts
- Include
--to <sender> explicitly when creating drafts
Auto-Draft WhatsApp Notification (MANDATORY)
Every 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.
Notification Policy
- No routine "no change" notifications
- Alert on: meaningful changes, breakages, time-sensitive items, auto-drafted emails
- Time-sensitive: approvals, meeting changes, 2FA codes, security, travel changes
- Evaluate Promotions, suppress Spam/Junk/Trash
Prerequisites
gog CLI configured with both Gmail accounts (primary and work)
mcporter with Grain MCP connection for meeting transcript access
- OpenClaw workspace with
skill_log.py and audit_log.py scripts
- Email style guide at
{user.workspace}/style/EMAIL_STYLE.md
- Humanizer skill at
~/executive-assistant-skills/humanizer/SKILL.md
Instructions
See 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.
Output
- Gmail draft created on the correct account (never sent automatically)
- WhatsApp notification with full draft text, Gmail draft link, and trigger class
- Audit log entry for each draft created, sent, or skipped
Error Handling
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.
Examples
# 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]"
Resources
Source: jeremylongshore/claude-code-plugins-plus-skills → skills/.curated/email-drafting/SKILL.md
Also appears in: jeremylongshore/claude-code-plugins-plus-skills/plugins/business-tools/executive-assistant-skills/skills/email-drafting/SKILL.md
1---2name: email-drafting3description: "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 \u2014 never sends automatically."4---5
6# Email Drafting Skill
7
8## Config — read before starting
9
10Read `../config/user.json` (resolves to `~/executive-assistant-skills/config/user.json`).
11Extract and use throughout:
12
13- `primary_email`, `work_email` — Gmail accounts
14- `scheduling_cc` — scheduling assistant email (CC on all scheduling emails, mention in body)
15- `scheduling_silent_cc` — silent CC for scheduling visibility (do NOT mention in email body)
16- `signature` — sign-off for all drafts (e.g. "--gonto")
17- `name` — short name for context
18
19Do not proceed until you have these values.
20
21## Debug Logging (MANDATORY)
22
23Read `../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.
24
25## Overview
26
27Auto-draft and manually-requested email drafts for {user.primary_email} and {user.work_email}.
28
29## When to Use
30
31- Gmail hook detects a trigger (intro, scheduling, thanks/ack, positive reply)
32- User asks to draft/reply/send an email
33- Action items cron identifies email follow-ups needed
34
35## Architecture
36
37- Detects triggers and creates Gmail drafts
38- Handles all scheduling (slot-finding, conflict checking, calendar ops)
39- NEVER proposes specific dates/times or creates calendar events
40
41## Execution
42
43- **"Reply" always means Reply All** — include all original To + CC recipients. Only exclude if user explicitly says to reply to one person. Exception: intro handling moves the introducer to BCC per the intro sequence below.
44- **After sending any email/draft**, check if it fulfills an open Todoist task (send deck, intro, follow-up, etc.). If yes → complete the task immediately and confirm.
45- **Hook/cron triggers**: Always run via isolated sub-agent (prevents memory/context contamination)
46- **Direct user requests** ("draft a reply to X"): Main agent may execute directly, but must still follow all style rules and must NOT read MEMORY.md or daily memory files
47
48## Rules (non-negotiable)
49
50### Core
51
521. **Draft-only mode** — never send automatically
532. **Mirror inbound language** — match the language of the most recent non-automated message in the thread. If the thread has mixed languages, default to the language of the message you're replying to.
543. **Always sign** — end every draft with `{user.signature}`
554. **Low confidence** — don't draft; ask user for guidance
565. **No dash punctuation** — no em-dash/en-dash in bodies. Use commas/periods.
576. **Humanize** — before finalizing any draft, review it against `~/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.
58
59### Intro Handling (required sequence)
60
611. Thank introducer first
622. Move introducer to BCC
633. Reply to introduced contact directly
644. CC `{user.scheduling_cc}` and `{user.scheduling_silent_cc}` for scheduling
655. Include one line like: "Connecting {user.scheduling_cc_name} to find a time."
666. **Do NOT mention `{user.scheduling_silent_cc}` in the email body** — silent CC only
67
68### Scheduling Drafts
69
70- **ALWAYS CC {user.scheduling_cc} AND {user.scheduling_silent_cc}**
71- **NEVER propose specific dates or times**
72- Just confirm willingness to meet + mention scheduling assistant will coordinate
73- Example: "Connecting Alfred to find a time that works"
74- **Do NOT mention {user.scheduling_silent_cc} in the email body** — she's CC'd silently for visibility
75
76### Allowed Auto-Draft Classes
77
78- Thanks/ack
79- Scheduling intent
80- Positive short replies
81- Intro acceptance
82
83### Notification Format
84
85- `account + one-line intent + draft link`
86- Example: `📧 Draft ({user.primary_email} → John): intro acceptance. https://mail.google.com/...`
87
88## Draft Links
89
90After creating a draft via `gog`, extract the draft ID from the response.
91Gmail draft URL format: `https://mail.google.com/mail/u/?authuser={account_email}#drafts?compose={message_id}`
92Use `authuser=m@gon.to` or `authuser=gonto@hypergrowthpartners.com` as appropriate.
93
94## Trigger Detection
95
96### A) Intro
97
98- Cues: `intro`, `introduction`, `meet`, `connecting you`, `looping in`, `cc'ing`
99- At least 2 external participants + clear handoff language
100- Apply intro sequence exactly
101
102### B) Scheduling Intent
103
104- Cues: `find a time`, `schedule`, `availability`, `next week`, `calendar`
105- Spanish cues: `agendar`, `agenda una`, `tenés unos minutos`
106- CC scheduling contacts, don't propose times
107
108### C) Thanks/Ack
109
110- Cues: `thanks`, `got it`, `appreciate it`, status updates
111- Short acknowledgment + optional one-line next step
112
113### D) Positive Short Reply
114
115- Cues: `works for me`, `sounds good`, `perfect`, `great`
116- Short affirmative + close
117
118## Skip Conditions (do NOT auto-draft)
119
120- Confidence low / intent ambiguous
121- User already replied in the thread (SENT message exists)
122- Legal, financial, security, hiring-final, sensitive conflict topics
123- Multi-question strategic asks
124- Automated/system/calendar notifications
125- Messages requiring attachments, deep verification, or policy commitments
126- Language unclear or unmirrorable
127- **Scheduling confirmations** — NEVER auto-draft emails that simply confirm a scheduled time or acknowledge a calendar invite. The scheduling assistant (Alfred/Howie) handles all scheduling coordination. Auto-drafting "confirming our call at X" creates noise and duplicates the scheduler's work. This includes: confirming times proposed by the scheduler, acknowledging calendar invites, and "looking forward to our call" type replies to scheduling threads.
128
129## Confidence Gate
130
131Only auto-draft when ALL are true:
132
133- Trigger class is one of the 4 allowed
134- Language confidently detected and mirrorable
135- Clear recipient intent and next step
136- No skip condition present
137
138Otherwise: ask user.
139
140## Drafting Principles
141
142- **Keep it SHORT** — drafts are always brief. 2-3 short paragraphs max.
143- **No over-explaining** — state the point, don't elaborate unless necessary
144- **When promising intros**: before drafting the intro, search sent emails for previous intros to that person/company, copy the format and tone, and use the same email address
145- **When recommending a person/company**: use your own words from past emails about them rather than inventing new descriptions
146- **Deck/one-pager**: say "Hypergrowth Partners deck" (not "our one-pager" or "our deck"). When attaching, frame WHY it's useful (e.g. "where we explain what Hypergrowth is and how we help companies")
147- **Future availability**: frame as an opportunity, not a brush-off. Position it warmly: "I'd love to reconnect then to explore working together if the timing still makes sense" rather than blunt "let's connect closer to June"
148- **Offers of help should use meeting context**: read Granola notes from the call and reference specific things discussed. The draft should feel like it came from someone who was in the meeting.
149- **No generic "Great meeting today"** unless it's explicitly a first meeting (first VC call or first dealflow call).
150- **Proposal-first rule**: if the commitment is to build/provide a proposal first, do not draft outbound email yet; create TODO only.
151
152## Use Grain as primary source for meeting-based drafts
153
154When drafting follow-up emails from meetings, **Grain transcript is the primary source** (not Granola):
155
1561. Find the meeting in Grain: `mcporter call grain.list_attended_meetings --args '{"limit": 5}'`
1572. Fetch transcript: `mcporter call grain.fetch_meeting_transcript --args '{"meeting_id": "<id>"}'`
1583. Search transcript for email commitments: "I'll send", "I'll email", "I'll share", "let me intro", "I'll follow up", "I'll connect you", etc.
1594. **Draft from the transcript** — use your actual words and the real conversation context, not Granola's summary.
1605. Fall back to Granola only if Grain has no recording for that meeting.
161
162## Style
163
164Read `{user.workspace}/style/EMAIL_STYLE.md` for the full writing style guide (derived from 200+ real sent emails).
165Read `{user.workspace}/style/FEEDBACK_LOG.md` for user corrections — latest overrides win.
166
167Key points:
168
169- Friendly, concise, action-oriented. Warm but not fluffy.
170- 1–4 short paragraphs, ~6–7 word sentences
171- Context-first openings, straight to point
172- Common opens: "Hey <Name>,", "Thanks…", "Perfect…", "Great…"
173- Sign off: `{user.signature}`
174- No dash punctuation (no em-dash/en-dash)
175- **Do:** be brief, clear, warm, decisive, include draft link in notification
176- **Don't:** over-explain, corporate fluff, long formal prose
177
178## Templates
179
180- **Primary**: `{user.workspace}/style/EMAIL_TEMPLATES.md` — pattern templates (intros, follow-ups, VC, etc.)
181- **Legacy (HGP v1)**: `{user.workspace}/style/email-templates.md` — HGP business templates. Use only for HGP-specific business contexts. Primary templates take precedence on conflicts.
182
183## Audit Logging (MANDATORY)
184
185After every external action, log it:
186
187- **Draft created**: `python3 {user.workspace}/scripts/audit_log.py log email_drafted "<recipient>" success '{"account": "<account>", "subject": "<subject>", "type": "<trigger_class>"}'`
188- **Email sent**: `python3 {user.workspace}/scripts/audit_log.py log email_sent "<recipient>" success '{"account": "<account>", "subject": "<subject>"}'`
189- **Draft skipped** (low confidence): `python3 {user.workspace}/scripts/audit_log.py log email_draft_skipped "<recipient>" skipped '{"reason": "<reason>"}'`
190
191## Auto-Draft Constraints
192
193- **NEVER create calendar events** — only the scheduling assistant handles that
194- Only create email drafts
195- Include `--to <sender>` explicitly when creating drafts
196
197## Auto-Draft WhatsApp Notification (MANDATORY)
198
199Every time a draft is created automatically (via Gmail hook or any automated trigger), you MUST send a WhatsApp notification to {user.whatsapp} with:
200
201```
202✏️ *Auto-draft created*
203
204*To:* <recipient name> (<email>)
205*Subject:* <subject>
206*Account:* <account>
207*Trigger:* <intro/scheduling/thanks/positive reply>
208
209*Draft text:*
210> <full draft body — include the complete text so user can review without opening Gmail>
211
212🔗 <Gmail draft link>
213
214Reply "send" to send, or edit in Gmail.
215```
216
217This is non-optional. The user must be able to read and approve the draft from WhatsApp without opening Gmail.
218
219## Notification Policy
220
221- No routine "no change" notifications
222- Alert on: meaningful changes, breakages, time-sensitive items, **auto-drafted emails**
223- Time-sensitive: approvals, meeting changes, 2FA codes, security, travel changes
224- Evaluate Promotions, suppress Spam/Junk/Trash
225
226## Prerequisites
227
228- `gog` CLI configured with both Gmail accounts (primary and work)
229- `mcporter` with Grain MCP connection for meeting transcript access
230- OpenClaw workspace with `skill_log.py` and `audit_log.py` scripts
231- Email style guide at `{user.workspace}/style/EMAIL_STYLE.md`
232- Humanizer skill at `~/executive-assistant-skills/humanizer/SKILL.md`
233
234## Instructions
235
236See 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.
237
238## Output
239
240- Gmail draft created on the correct account (never sent automatically)
241- WhatsApp notification with full draft text, Gmail draft link, and trigger class
242- Audit log entry for each draft created, sent, or skipped
243
244## Error Handling
245
246See 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.
247
248## Examples
249
250```bash
251# Auto-draft trigger: intro email detected in inbox
252# Output: Gmail draft with intro acceptance, introducer moved to BCC,
253# scheduling assistant CC'd, WhatsApp notification with full draft text
254# "Draft (m@gon.to -> John): intro acceptance. [Gmail link]"
255```
256
257## Resources
258
259- [Gmail API](https://developers.google.com/gmail/api)
260- Grain API
261- [Gmail Draft URL format](https://mail.google.com/mail/u/?authuser={email}#drafts)
262
263---
264
265**Source:** [`jeremylongshore/claude-code-plugins-plus-skills`](https://github.com/jeremylongshore/claude-code-plugins-plus-skills) → `skills/.curated/email-drafting/SKILL.md`
266
267**Also appears in:** `jeremylongshore/claude-code-plugins-plus-skills/plugins/business-tools/executive-assistant-skills/skills/email-drafting/SKILL.md`