$npx -y skills add mgonto/executive-assistant-skills --skill executive-digestGenerate the daily executive digest — a single WhatsApp summary of everything needing attention: stalled scheduling, pending intros, unanswered emails, promised follow-ups, open Todoist tasks, and upcoming calendar events. Use when running the daily digest cron, or when user asks
| 1 | # Daily Executive Digest |
| 2 | |
| 3 | ## Config — read before starting |
| 4 | Read `../config/user.json` (resolves to `~/executive-assistant-skills/config/user.json`). |
| 5 | Extract and use throughout: |
| 6 | - `primary_email`, `work_email` — both Gmail accounts to check |
| 7 | - `whatsapp` — for delivery |
| 8 | - `workspace` — absolute path to OpenClaw workspace |
| 9 | |
| 10 | Do not proceed until you have these values. |
| 11 | |
| 12 | ## Debug Logging (MANDATORY) |
| 13 | Read `../config/DEBUG_LOGGING.md` for the full convention. Use `python3 {user.workspace}/scripts/skill_log.py exec-digest <level> "<message>" ['<details>']` at every key step. Log BEFORE and AFTER every external call (gog, mcporter, todoist-cli). On any error, log the full command and stderr before continuing. |
| 14 | |
| 15 | ## Steps |
| 16 | |
| 17 | ### 1. Read rules and state |
| 18 | - Read `{user.workspace}/style/DIGEST_RULES.md` for format and rules |
| 19 | - Read state files: |
| 20 | - `{user.workspace}/state/scheduling-threads.json` — stalled threads (>3 days since proposed) |
| 21 | - `{user.workspace}/state/decisions-memory.json` — context on people/companies |
| 22 | - `{user.workspace}/state/digest-state.json` — avoid repeating items |
| 23 | |
| 24 | Schema: `{"lastRun": "ISO date", "surfacedItems": [{"id": "<thread_id|task_id>", "type": "intro|followup|draft|task|calendar", "surfacedAt": "ISO date"}]}`. Use consistent IDs: Gmail thread IDs for email items, Todoist task IDs for tasks, calendar event IDs for calendar items. Do NOT use semantic strings like "calendar:golf-mar5" — always use the actual service ID. An item is "repeated" if its ID appeared in the last digest run. Re-surface only if its status changed since then. |
| 25 | |
| 26 | ### Error handling |
| 27 | If any data source (Gmail, Calendar, Todoist, Granola) fails or times out: |
| 28 | - Log the error, note it in the digest as "⚠️ [Source] unavailable — skipped" |
| 29 | - Continue with remaining sources — never halt the entire digest for one failure |
| 30 | - If BOTH Gmail accounts fail, abort and notify: "⚠️ Digest failed — Gmail unreachable" |
| 31 | |
| 32 | ### 2. Check Todoist |
| 33 | ```bash |
| 34 | source {user.workspace}/.env |
| 35 | todoist-cli review |
| 36 | ``` |
| 37 | Include: overdue tasks, today's tasks, inbox (needs triage). |
| 38 | Format as "📋 Open Tasks" section: task name, due date, priority. |
| 39 | Highlight overdue first. Skip no-due-date tasks unless in inbox. |
| 40 | |
| 41 | ### 3. Check calendar (next 7 days) — BOTH accounts MANDATORY |
| 42 | ```bash |
| 43 | gog --account {user.primary_email} --no-input calendar list primary --from "<today>T00:00:00-03:00" --to "<today+7>T00:00:00-03:00" --json |
| 44 | gog --account {user.work_email} --no-input calendar list primary --from "<today>T00:00:00-03:00" --to "<today+7>T00:00:00-03:00" --json |
| 45 | ``` |
| 46 | Use actual ISO8601 dates with ART timezone offset (-03:00). Relative dates like 'today' and '+7 days' are not supported by gog. |
| 47 | **CRITICAL: You MUST run BOTH commands and merge ALL events from both calendars into a single timeline.** Events live on different calendars — showing only one gives an incomplete picture. Deduplicate by time+title if the same event appears on both. Look for OOO, travel, vacation blocks, back-to-back conflicts, and double-bookings across calendars. |
| 48 | |
| 49 | **RSVP check:** For each upcoming meeting with external attendees, check the `attendees[].responseStatus` field. If NO attendee (other than Gonto) has `accepted`, flag it in the digest and suggest pinging them to confirm attendance. Frame as: "⚠️ [Meeting] — nobody accepted yet. Ping [names] to confirm?" |
| 50 | |
| 51 | ### 4. Check Gmail for pending items — BOTH accounts |
| 52 | |
| 53 | **Universal rule (applies to ALL sub-steps below):** Before surfacing ANY email item, check the FULL thread for replies from Gonto's team (Gonto, Alfred/Howie, or Giulia — see team-handled threads check in §4a). If ANY team member already replied → skip the item. If a draft exists for an already-replied thread → delete the draft silently (`gog gmail drafts delete <draftId> --force`). This prevents surfacing stale items. |
| 54 | |
| 55 | Use `gog --account {email} --no-input gmail search "query" --json` for all searches. Run each query against BOTH accounts. |
| 56 | |
| 57 | #### 4a. Pending intros and follow-ups |
| 58 | - Recent intros not actioned: `subject:(intro OR introduction OR connecting) newer_than:7d` |
| 59 | - Follow-ups from others: `(following up OR checking in OR circling back) newer_than:7d` |
| 60 | - Drafts awaiting send |
| 61 | |
| 62 | **Team-handled threads (MANDATORY check):** |
| 63 | Before flagging ANY intro, follow-up, or email item as "pending" or "no reply", check the FULL thread for replies from Gonto's team. ANY reply from the following people counts as the item being handled: |
| 64 | - Gonto himself (m@gon.to, gonto@hypergrowthpartners.com) |
| 65 | - Alfred/Howie — scheduling assistant (alfred@hypergrowthpartners.com, alfred@hybridautopilotrun.com) |
| 66 | - Giulia (giulia@growth |