Status — first calibration 2026-04-26 (Sunday)
8 thumbs-ups processed. 0 thumbs-downs. All ratings collected on a single PWA review pass on 2026-04-27 01:31–01:33 UTC, covering INFO/FYI items surfaced from Apr 23–24 inbound activity (no actual outbound drafts in this batch — these were context-flag entries that live-ea queued so Joseph could acknowledge from the PWA).
👎 Patterns Joseph has rejected (1 total, last updated 2026-05-08)
1. Trevor Pyle draft (Gmail id 19dfe060b5bea9b6, 2026-05-06) — "super AI generated and not at all in my authentic voice"
Joseph quote: "drafts in emails look super AI generated and not at all in my authentic voice. fix that"
The 8 specific things wrong:
1. Numbered list of "things I can do" ("Two things I can do right now to make this easier: 1… 2…") — Joseph never offers options as a numbered list; weave into prose.
2. "single point of contact going forward" — corporate filler
3. "stabilized revenue projection" — pitch-y; use "what 230 Buckhorn would actually do" or "the projection numbers"
4. "real numbers to weigh against any other quotes you've gotten" — presumes the prospect is shopping; condescending
5. "Whichever (or both) is useful, let me know" — robotic option-pickup
6. "I'll keep it tight" — performative brevity (just be brief, don't claim it)
7. 5 em-dashes in 154 words — 3.2 per 100w density; AI fingerprint
8. Stale signature ("SkyRun Vacation Rentals — Winter Park, Colorado") — should be "Grand County, Colorado"
Outcome: Hardwired voice_check.py linter (~/Library/Application Support/SkyRun/voice_check.py) that runs before any draft saves to Gmail. REJECTs on phrase blacklist + numbered-options structure + stale-signature fragments. WARNs on em-dash density + missing personal callback.
The Kina email (gold standard): Sent 2026-04-30 to kinacan2020@gmail.com. Specific personal callback in line 1 ("Hope the bunk-bed mattress made it from Silverthorne"), threaded prose with proper-noun details, recommendation-with-conviction, open-ended close. 119 words, 2 em-dashes — passes the linter cleanly.
Generalization: "Two things I can do" / "Whichever is useful" / "stabilized revenue projection" / "I'll keep it tight" / "single point of contact going forward" → all banned. See reference_voice_anti_patterns.md for the full anti-pattern list.
👍 Patterns Joseph approves (8 most recent, last updated 2026-04-26)
All 8 👍 items below were INFO/FYI context flags (no email body). Pattern signal: Joseph wants live-ea to surface these inbound signals as approval-queue items rather than drop them silently.
1. Inbound bounce notification (bounce-lbrenner 👍) — "INFO: Email bounce — lbrenner@centurylink.com (SmartLead cold outreach)" → flag invalid email + propose action (SmartLead removal + SoT flag).
2. Inbound bounce notification (bounce-lwidman 👍) — same pattern, lauren.widman@siegfried.com.
3. Inbound bounce notification (bounce-twebb 👍) — same pattern, twebb@kslaw.com (server-side rejection, not just bad address — note the distinction in context).
4. Rachel-shared spreadsheet alert (rachel-spreadsheet-share 👍) — "INFO: Rachel shared 'Winter Park Homeowners' spreadsheet with you" → flag the share + proposed use (DNC source, walkthrough prep).
5. Calendar update from Rachel (rachel-weber-walkthrough 👍) — "FYI: Rachel updated Weber walkthrough — Mon Apr 27, 9am–10am MDT" → no reply needed, just track on calendar.
6. Hadank follow-up flag (hadank-rachel-followup 👍) — Rachel's reply to Joseph's open-questions email summarized as a context flag.
7. Rachel "Documents" thread flag (rachel-documents-docusign 👍) — DocuSign + onboarding docs delivered.
8. Sangma extension issue flag (sangma-extension 👍) — Rachel flagging Joseph's extension getting customer-service routing.
Generalization for future drafting:
- Inbound signals (bounces, share notifications, calendar updates, Rachel context emails) are valuable as queue items — surface them as INFO/FYI entries with proposed action, not silent log-only.
- Title format
INFO:orFYI:followed by a one-sentence summary is approved. - Context paragraph should explain what happened + propose a next step in 2–3 sentences.
- These do NOT need draft bodies — they're context flags, not outbound replies.
- For bounces, distinguish "invalid address" from "server-side rejection" in the context (Joseph 👍'd both variants — the categorization is useful).
Baseline voice guidance (from memory archaeology, pre-feedback)
Until feedback data accumulates, live-ea should default to these baseline patterns observed from Joseph's actual emails:
Prospect replies (warm, brief)
- Greeting: "Andy," or "Hi Andy,"
- Opens with gratitude or a clear value statement, not preamble
- Under 150 words for routine confirmations
- Closes with "Best," or "Looking forward to [X]."
- Sign: "Joseph Bowens / Director of Business Development / SkyRun Grand County / 970-817-8700 / Joseph.Bowens@SkyRun.com"
Internal team (concise, low ceremony)
- Lowercase "i" acceptable when quick
- No sign-off block — just "— Joseph" or a first-name sign
- Often one or two sentences
Realtor correspondence (professional, warm)
- Acknowledges the context Rachel or the realtor raised
- Proposes a specific next step (coffee, call, property tour)
- Never aggressive — realtor relationships are long-game
- Full sign-off block
How to apply (for live-ea)
Before drafting ANY reply:
1. Read this full file
2. If there's a 👎 pattern that matches what you'd draft, don't draft — flag for review instead
3. If there's a 👍 pattern, lean into it but don't literally copy — generalize the voice
4. Default to the baseline voice guidance above when the feedback sections are empty
Wiring status
- ✅
feedback/{id}/{seq}KV schema defined (draft-feedback.jsPages Function) - ✅ PWA 👍/👎 buttons live on direct_drafts with
source_skill: live-ea - ✅
nightly-consolidationSection H wired to run weekly (Sundays or 7+ day gap) - ✅ First feedback data: 8 thumbs-ups received 2026-04-27 01:31–01:33 UTC
- ✅ First calibration completed: 2026-04-26 (Sunday) by
nightly-consolidationSection H