Rule
Before stating an email is sent, drafted, scheduled, bounced, or in any specific delivery state — the agent MUST run a fresh Gmail MCP query that proves the state. No exceptions.
Required verification pattern
For "is this email sent?":
1. Run list_drafts filtered by recipient/subject — if the message ID is in the result, the email is UNSENT (still a draft).
2. Run search_threads with in:sent and the same filter — message ID appearing here is the only acceptable proof of delivery.
3. If the same message ID appears in BOTH (rare but possible during certain Gmail edge cases), treat it as UNSENT until confirmed otherwise.
If you cannot run those queries in the current context, say "I can't verify this without Gmail access" — never substitute inference for verification.
Why
On 2026-04-30, Joseph caught a false claim. The agent said an Adam Fleckles email (thread 19dd050a7abf8719, msg 19ddb3b7ab1de4fd, dated Apr 29 21:53 UTC) was "sent yesterday." It was sitting in drafts. Joseph's quote: "You're supposed to be resourceful and all knowing... lazy mistake."
Root cause:
- The transcript-scan note
notes/2026-04-29_joseph-adam-post-call-consolidation_followup.txtdescribed the email in past tense ("Joseph→Adam consolidation reply sent ~108 min after the verbatim 'Ambient system' call wrapped"). - transcript-scan captures email CONTENT, not delivery status. It does not distinguish between the Drafts folder and the Sent folder.
- The agent treated the note's prose as ground truth and skipped the verify step.
This was not a parsing edge case — it was a habit of trusting a derivative source over the primary one. That's the lazy mistake Joseph called out.
How to apply
- Universal: applies to all 7 Cowork personas + main SkyRun agent + all scheduled tasks (live-ea, transcript-scan, gmail-deep-scan, qb-quarterback, etc.). No persona is exempt.
- No inference allowed: words like "sent," "delivered," "shipped," "went out" must be either (a) verified live, or (b) hedged with explicit uncertainty ("the queue says it was sent but I haven't verified").
- transcript-scan files cannot prove sent state: when summarizing an email captured by transcript-scan, use language like "indexed by transcript-scan" or "captured in the archive" — never "sent."
- Queue entries cannot prove sent state: pending_drafts.jsonl, meeting_action_items.jsonl, commitments.jsonl can all hold stale or imprecise records about whether an email actually went out.
- When status MATTERS (e.g., "should I send this?" / "is this overdue?" / "what was sent to X?"): always run the live Gmail check first, then answer.
- Memory note: when summarizing thread history, distinguish between (a) messages confirmed sent via Gmail in:sent, (b) drafts I observed in the drafts folder, (c) email content I read from transcripts/notes.
Skill maintenance flag
The transcript-scan skill should be updated to:
1. Mark every captured email with a delivery_status field: sent_confirmed, draft, or unknown.
2. Set unknown when the capture comes from a self-paste, a forward, or an Otter/Gemini summary — these don't authoritatively indicate the source folder.
3. Stop using past-tense delivery language in followup summary files unless delivery_status: sent_confirmed.
4. When an Otter/Gemini transcript captures content from a draft (e.g., voice-recorded conversation that's later transcribed and dropped into a draft), label delivery_status: draft not sent.
Tracked in project_skill_maintenance_flags.md as item: "transcript-scan email-delivery-status field needed; pass-37 false-sent-claim incident as forcing function."