email-drafting
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.
Best use case
email-drafting is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
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.
Teams using email-drafting should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/email-drafting/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How email-drafting Compares
| Feature / Agent | email-drafting | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
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.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
Related Guides
AI Agents for Marketing
Discover AI agents for marketing workflows, from SEO and content production to campaign research, outreach, and analytics.
Best AI Agents for Marketing
A curated list of the best AI agents and skills for marketing teams focused on SEO, content systems, outreach, and campaign execution.
AI Agent for Cold Email Generation
Discover AI agent skills for cold email generation, outreach copy, lead personalization, CRM support, and sales-adjacent messaging workflows.
SKILL.md Source
# 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
1. **Draft-only mode** — never send automatically
2. **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.
3. **Always sign** — end every draft with `{user.signature}`
4. **Low confidence** — don't draft; ask user for guidance
5. **No dash punctuation** — no em-dash/en-dash in bodies. Use commas/periods.
6. **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)
1. Thank introducer first
2. Move introducer to BCC
3. Reply to introduced contact directly
4. CC `{user.scheduling_cc}` and `{user.scheduling_silent_cc}` for scheduling
5. Include one line like: "Connecting {user.scheduling_cc_name} to find a time."
6. **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):
1. Find the meeting in Grain: `mcporter call grain.list_attended_meetings --args '{"limit": 5}'`
2. Fetch transcript: `mcporter call grain.fetch_meeting_transcript --args '{"meeting_id": "<id>"}'`
3. 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.
4. **Draft from the transcript** — use your actual words and the real conversation context, not Granola's summary.
5. 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 <Name>,", "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
```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]"
```
## Resources
- [Gmail API](https://developers.google.com/gmail/api)
- [Grain API](https://grain.com/docs)
- [Gmail Draft URL format](https://mail.google.com/mail/u/?authuser={email}#drafts)Related Skills
email-template-generator
Email Template Generator - Auto-activating skill for Business Automation. Triggers on: email template generator, email template generator Part of the Business Automation skill category.
email-parser
Email Parser - Auto-activating skill for Business Automation. Triggers on: email parser, email parser Part of the Business Automation skill category.
schema-optimization-orchestrator
Multi-phase schema optimization workflow orchestrator. Creates session directories, spawns phase agents sequentially, validates outputs, aggregates results. Trigger: "run schema optimization", "optimize schema workflow", "execute schema phases"
test-skill
Test skill for E2E validation. Trigger with "run test skill" or "execute test". Use this skill when testing skill activation and tool permissions.
example-skill
Brief description of what this skill does and when the model should activate it. Use when [describe the user's intent or situation]. Trigger with "example phrase", "another trigger", "/example-skill".
testing-visual-regression
Detect visual changes in UI components using screenshot comparison. Use when detecting unintended UI changes or pixel differences. Trigger with phrases like "test visual changes", "compare screenshots", or "detect UI regressions".
generating-unit-tests
Test automatically generate comprehensive unit tests from source code covering happy paths, edge cases, and error conditions. Use when creating test coverage for functions, classes, or modules. Trigger with phrases like "generate unit tests", "create tests for", or "add test coverage".
generating-test-reports
Generate comprehensive test reports with metrics, coverage, and visualizations. Use when performing specialized testing. Trigger with phrases like "generate test report", "create test documentation", or "show test metrics".
orchestrating-test-execution
Test coordinate parallel test execution across multiple environments and frameworks. Use when performing specialized testing. Trigger with phrases like "orchestrate tests", "run parallel tests", or "coordinate test execution".
managing-test-environments
Test provision and manage isolated test environments with configuration and data. Use when performing specialized testing. Trigger with phrases like "manage test environment", "provision test env", or "setup test infrastructure".
generating-test-doubles
Generate mocks, stubs, spies, and fakes for dependency isolation. Use when creating mocks, stubs, or test isolation fixtures. Trigger with phrases like "generate mocks", "create test doubles", or "setup stubs".
generating-test-data
Generate realistic test data including edge cases and boundary conditions. Use when creating realistic fixtures or edge case test data. Trigger with phrases like "generate test data", "create fixtures", or "setup test database".