Before writing any email on Joseph's behalf, do all of this first — no exceptions:
1. Pull sent mail history with that recipient (from:joseph.bowens@skyrun.com to:[email]) and read actual messages to absorb his voice, cadence, and what's already been said
2. Read the full inbound thread — not just the snippet, the full body of every message
3. Read any documents in play — don't speculate about what they contain, open and read them
4. Read relevant transcripts — if there's a meeting in context, read it before writing
5. Only then write — with specific details from the above, not generic structure
Why: Joseph was frustrated that drafts read like "an AI agent just puked words on the page that were generic and kinda not relevant." The root cause was drafting off summaries and assumptions instead of the actual source material.
Voice patterns observed from actual sent mail to Rachel:
- Opens with "Hey Rachel," (warm, casual — not "Hi Rachel," and not just "Rachel,")
- Short declarative sentences, no padding
- Conversational asks embedded in paragraphs — not bulleted question lists
- Specific proper nouns and details (names, addresses, dollar amounts, dates)
- "Here's where my head is at" / "Want to make sure we keep that energy going" / "Ring a bell?" — his natural phrasing
- Closes with "Anything I'm missing?" or "Let me know your thoughts" — not formal sign-offs
- Signs "— Joseph" internally, no title block
- Bullets only when genuinely listing multiple discrete items; prefers paragraphs for connected thoughts
How to apply: Every draft, no matter how simple, starts with pulling real emails. If context isn't there yet, get it before writing — not after.
⛔ HARDWIRED 2026-05-08 — VOICE LINTER GATE (mandatory)
After the Trevor Pyle draft (Gmail id 19dfe060b5bea9b6, 2026-05-06) was rejected by Joseph as "super AI generated and not at all in my authentic voice," every draft now must pass voice_check.py before save/send.
Required workflow:
1. Pull sent history + transcripts (existing rule)
2. Compose the draft
3. Pipe the body through ~/Library/Application Support/SkyRun/voice_check.py
4. If REJECT (exit 1) → fix and re-run before saving
5. If WARN → review each warning before saving
6. Only when CLEAN (exit 0) → create the Gmail draft
The Trevor draft (canonical "what NOT to write"):
- Numbered list of "things I can do" (
1. Send you a stabilized revenue projection... 2. Walk you through the agreement...) - "single point of contact going forward"
- "stabilized revenue projection ... real numbers to weigh against any other quotes you've gotten"
- "Whichever (or both) is useful, let me know"
- "I'll keep it tight"
- 5 em-dashes in 154 words (3.2 per 100w density — well above the 2 cap)
- Stale signature ("Winter Park, Colorado" — should be "Grand County, Colorado")
- Zero personal callback (no detail from Trevor's actual context)
The Kina email (canonical voice that PASSES):
- Specific personal callback: "Hope the bunk-bed mattress made it from Silverthorne."
- Long flowing paragraphs threaded with proper-noun details (welcome book, Tabernash honey, Fraser Valley moose, friend's spices from Morrison)
- "Two thoughts that came up on my side after the call, neither urgent, both for you to use however helps:" — followed by PROSE, not bullets
- Recommendation with conviction: "Either works — I lean toward open-with-guardrails because…"
- Open-ended close: "Whenever you're up here next, I'd love to come by"
- 119 words, 2 em-dashes — passes linter
Anti-pattern blacklist: see reference_voice_anti_patterns.md for the full list of phrases + structures that auto-REJECT.