Daily Briefing
You produce a comprehensive morning briefing by pulling from all available sources and presenting a prioritized view of the day. Output as a Canvas.
The user's input is: $ARGUMENTS
Skill Composition
This skill composes existing tools and patterns:
| Source | Tool / Method | What it provides |
|---|---|---|
| Calendar | user-google-workspace MCP: calendar_get_events |
Today's schedule |
| Tasks | user-google-workspace MCP: calendar_get_events, drive_search |
Google Tasks |
user-google-workspace MCP: gmail_list_messages |
Unread emails | |
| Slack | <YOUR_SLACK_MCP_SERVER> MCP: search_messages |
Active threads, saved items |
| Jira | user-atlassian MCP: getMyIssues |
Sprint items, blockers |
| Repo activity | task-dispatch scripts: scan_repos.py |
Git commits, agent sessions, task replies |
| Agent replies | task-dispatch scripts: dispatch_task.py --check-replies |
Unread cross-agent messages |
| Second Brain KB | second-brain-checkup Steps 1, 3-6 |
Rolling context, reconciled pending actions, quick wins |
Read-Only Constraint
This skill MUST NEVER write, create, update, or modify data in any external
system. All MCP tool calls must be read-only operations. The one exception
is second-brain-checkup, which does write to the local KB files
(~/second-brain/*.md) as part of its own job -- that's local state Evan
owns, not an external system, and it's second-brain-checkup's explicit
responsibility, not something this skill does directly.
Autonomy Principle
This skill runs fully autonomously after invocation. No user prompts during data gathering. If a source fails, log it silently and continue.
Workflow
Step 1: Check current time
Run date in the shell to get the current time and day.
If the user said "tomorrow", use days_ahead=1 for calendar. Otherwise
use days_ahead=0.
Step 2: Gather data (all in parallel)
Fire all of these simultaneously:
2a. Calendar events
Server: user-google-workspace
calendar_get_events(days_ahead = 0, max_results = 25)
2b. Unread emails
Server: user-google-workspace
gmail_list_messages(query = "is:unread", max_results = 15)
Also check for Gemini meeting notes from the past few days:
gmail_list_messages(
query = "(from:gemini-notes OR from:meetings-noreply) after:<3 days ago>",
max_results = 10
)
2c. Slack activity
Server: <YOUR_SLACK_MCP_SERVER>
search_messages(query = "from:me", sort = "timestamp", limit = 20)
Also check saved items:
search_messages(query = "is:saved", limit = 10)
2d. Jira sprint status
Server: user-atlassian
getMyIssues(
cloudId = "<YOUR_ATLASSIAN_CLOUD_ID>",
status = "In Progress,To Do"
)
2e. Cross-repo activity
Run in shell:
python3 .cursor/skills/task-dispatch/scripts/scan_repos.py \
--repos-dir ~/Desktop/ --days 3
2f. Agent replies
Run in shell:
python3 .cursor/skills/task-dispatch/scripts/dispatch_task.py \
--check-replies --repos-dir ~/Desktop/
2g. Second Brain KB
Invoke second-brain-checkup Steps 1 and 3-6 (reconcile pending-actions,
refresh rolling-context, score quick wins) -- skip its Step 7 chat
presentation and AskQuestion call. If it surfaces anything genuinely
ambiguous, fold a one-line "needs your input: X" note into this briefing's
Priority Actions section instead of stopping to ask -- the morning briefing
is meant to run fully autonomously, per this skill's own Autonomy Principle.
Step 3: Classify meetings
For each calendar event, classify its type to determine prep depth:
| Type | Signals | Prep Depth |
|---|---|---|
| 1:1 | 2 attendees, "1:1", "Name / Name" | Deep -- DMs, shared topics, open loops |
| Decision | "review", "approve", "prioritize", "strategy" | Deep -- options, stakeholder positions |
| Presentation | "readout", "demo", "showcase", "walkthrough" | Medium -- content preview |
| Standup | "standup", "sync", "check-in", recurring daily | Quick -- blockers only |
| Large | 10+ attendees, "all hands", "town hall" | Quick -- agenda only |
| Standard | Everything else | Medium -- recent discussion context |
Step 4: Build Canvas
Read the Canvas skill and follow its instructions to create:
~/.cursor/projects/<YOUR_WORKSPACE_PROJECT_ID>/canvases/daily-briefing.canvas.tsx
Canvas sections:
- Header -- "Daily Briefing -- [Day], [Date]", current time
- Schedule -- Table of today's meetings with type classification, time, title, and prep flags. Highlight meetings needing deep prep.
- Agent Replies -- Unread replies from dispatched tasks across repos. Show repo name, task, and agent's message. Flag as needing response.
- Priority Actions -- Numbered list of suggested priorities with time estimates. Combine the most urgent items from all sources, including Quick Wins from the Second Brain KB (2g) -- these belong near the top since they build morning momentum.
- Jira Sprint -- Current sprint items grouped by status (In Progress, To Do). Show ticket key, summary, and priority.
- Slack Threads -- Notable active threads with context. Group by topic, attribute to channel/person.
- Emails -- Emails worth noting (not spam/newsletters). Show sender, subject, and whether action is needed.
- Repo Activity -- Recent git commits and agent sessions across projects. Show what was being worked on.
- Second Brain --
rolling-context.md's "Right Now" and "Top Open Threads" (from 2g), plus any pending actions reconciled as newly resolved or newly stale. Omit if the KB was empty (per its minimum-evidence gate). - Coverage Footer -- Which sources contributed data and which failed.
Canvas rules:
- Import only from
cursor/canvas. No npm packages, no fetch calls. - Use
useHostTheme()tokens for all colors. No hardcoded hex. - No emojis, no gradients, no box-shadows.
- Default-export the top-level component.
- Omit sections with no data.
Step 5: Summarize in chat
Alongside the canvas, provide a brief text summary:
- Number of meetings today (with types breakdown)
- Top 3 priority items
- Any unread agent replies that need attention
- Which sources were unavailable
Fallback Behavior
| Source | Fallback |
|---|---|
| Calendar | "Calendar unavailable -- schedule not shown" |
| Skip email section | |
| Slack | Skip Slack section |
| Jira | Skip Jira section; note in footer |
| Repo scan | Skip activity section; note in footer |
| Agent replies | Skip replies section; note in footer |
| Second Brain KB | Skip Second Brain section and Quick Wins; note in footer |
Always report which sources were unavailable.
What NOT to Do
- Don't ask questions during data gathering. Run fully autonomously.
- Don't write to any external system. Read-only.
- Don't include meeting content from past meetings (that's
meeting-prep). Just classify and flag which ones need deep prep. - Don't generate the full prep for each meeting. Just flag type and depth.
The user can invoke
/meeting-prepfor specific meetings. - Don't skip the repo scan. The cross-agent awareness is what makes this briefing different from just checking calendar and email.