SuperAPI AI Directory

reports-morning-briefing

Office & productivity

View repository

Updated 10-15 23:49

About this skill

Morning Briefing Skill

Purpose

Produce a scannable "morning coffee" catch-up covering everything important the user needs to know before starting work. No project scope required — this is a personal digest.

Tone: Direct. Warm but not chatty. Like a trusted colleague summarising things for you. Length: As long as it needs to be, as short as it can be. Every bullet must earn its place. Format: Scannable sections, bullet points, bold for urgency only.


Step 0: Check for user-specified context (optional)

Do NOT ask before scanning — go straight to Step 1.

Only pause if the user's message explicitly specifies a scope or window (e.g. "catch me up since Monday", "only check Slack and Jira", "what happened in the last 3 days"). In that case, use those constraints directly — no confirmation needed.

If the user says "morning briefing" or similar with no other context — skip elicitation entirely and scan everything with the defaults below.

Optional — only if the user explicitly asks to customise scope: Use ask_user_input_v0 with a single Focus question (multi-select):

  • Slack messages & mentions
  • Jira tickets
  • Meetings (Fireflies)
  • Emails (Gmail)
  • Today's meetings & prep

Default when no focus is specified: scan all sources.


Step 1: Scan all sources in parallel

Run all of the following simultaneously. Each source has its own window logic — there is no single global cutoff date.

Slack — recent activity & mentions

Window logic:

  • If today is Monday or the day after a public holiday → use a cutoff date covering roughly the last 3 days
  • Otherwise → use a cutoff date covering roughly the last 1 day
  • If user specified a window → use that instead
slack_search_public_and_private(
  query="to:<@USERID> after:YYYY-MM-DD",
  limit=30, sort="timestamp"
)

Also search for high-signal keywords across all channels:

slack_search_public_and_private(
  query="urgent OR blocker OR asap OR help after:YYYY-MM-DD",
  limit=20
)

For any message where the user was @mentioned or that contains high-signal keywords, read the full thread — replies often contain the resolution:

slack_read_thread(channel_id="<id>", thread_ts="<ts>")

Extract: anything requiring a response, decisions made without the user, blockers raised, key announcements.

Jira — recently updated & newly assigned tickets

Window logic: Two queries, both with a 48h window:

# Recently updated tickets assigned to the user
JQL: assignee = currentUser()
     AND updated >= "-2d"
     AND status NOT IN (Done, Closed)
     ORDER BY updated DESC
fields: summary, status, priority, issuetype, updated
maxResults: 30
# Newly assigned tickets (catches tickets assigned but not yet touched)
JQL: assignee = currentUser()
     AND created >= "-2d"
     ORDER BY created DESC
fields: summary, status, priority, issuetype, created
maxResults: 10

If user specified a custom window → substitute "-2d" with the appropriate value.

Extract: newly assigned work, meaningful status changes, anything blocked or high-priority, anything with an approaching deadline. Skip routine "still In Progress, nothing changed" items.

Fireflies — recent meetings

Window logic: Last 7 days. If user specified a shorter window, use that.

fireflies_get_transcripts(
  fromDate: "<7-days-ago>",
  limit: 10
)

For each meeting where the user was a participant (check attendee list), call fireflies_get_summary and extract: decisions made, action items assigned to the user, open questions, anything requiring follow-up.

Skip meetings where the user was not an attendee and had no action items.

Gmail — unread inbox

Window logic: All unread messages in inbox, no date filter.

search_threads(
  query="is:unread in:inbox",
  maxResults: 30
)

Skim subject lines and senders. Flag: anything from a client, anything with "urgent" / "action required" / "deadline" in subject, direct replies awaiting response, calendar invitations requiring a decision.

Ignore: newsletters, automated notifications with no action needed, marketing emails.

Grouping rule: Multiple emails of the same low-priority type (e.g. job applications, CI build notifications, calendar accept/decline replies) → collapse into one grouped bullet.


Step 1b: Google Calendar — today's meetings

Always run this step. Not gated on any user selection.

Fetch all meetings for today:

Google Calendar:list_events(
  startTime: "<today>T00:00:00",
  endTime: "<today>T23:59:59",
  timeZone: "<user's local timezone, e.g. Europe/Warsaw>",
  orderBy: "startTime"
)

Filter out: all-day events, events the user declined, solo/no-attendee blocks.

For each remaining meeting, note: title, start time, attendees (names preferred over emails).

Then, for each meeting, run these lookups in parallel — strictly source-based, no fabrication:

a) Fireflies — last session with same title or overlapping attendees:

fireflies_get_transcripts(keyword="<meeting title or project keyword>", scope="title", limit=3)

Call fireflies_get_summary on the most recent result. Extract:

  • 1-sentence outcome summary
  • Any action items assigned to the user that appear unresolved

b) Jira — open tickets for the implied project: Derive a project keyword from the meeting title (e.g. "Acme daily" → Acme, "ProjectX Refinement" → ProjectX). Search:

JQL: project = "<key>" AND status NOT IN (Done, Closed)
     AND (assignee = currentUser() OR comment ~ currentUser())
     ORDER BY priority DESC
maxResults: 5

Surface: Blocked tickets, High/Critical priority, items In Review. Skip routine In-Progress.

c) Slack — recent thread for this project (last 3 days):

slack_search_public_and_private(
  query="<project name> after:<3-days-ago>",
  limit=5, sort="timestamp"
)

Extract only: unresolved questions, blockers, or messages directed at the user.

If all three lookups return nothing — show the meeting bare (time + title + attendees) with note: "No prior context found." Do NOT invent talking points or summaries.


Step 2: Synthesise

Cross-reference all sources. Apply this priority filter:

Include:

  • Action items assigned to the user
  • Decisions made that affect the user's work
  • Messages / emails awaiting a response from the user
  • Ticket changes that are meaningful (new assignment, status shift, blocked, urgent)
  • Meetings with relevant outcomes or action items for the user
  • Anything with a deadline in the next 48 hours
  • Any notable context the user needs before today's meetings

Exclude:

  • Routine updates with no user impact
  • Tickets that changed status but need no action
  • Slack noise (emoji reactions, "thanks", casual banter)
  • FYI emails with no required action
  • Meeting summaries where the user had no action items

Grouping rule: Multiple low-priority items of the same type → one grouped bullet. Example: "4 new (Senior) Delivery Manager applications — Iurii Klova, Magdalena Nowak, Sebastian Markowicz, Michał Olędzki. Review in Elevato."

No bullet caps. Include every item that passes the filter above. When in doubt about an item's importance: omit. Signal only.


Output Format

☕ Morning Briefing — [Day, Date]

**🔴 Needs your attention**
• [Urgent item — what it is, who it's from, what's needed]
• [Another item requiring action or response]

**📬 Messages & emails**
• [Slack/email requiring response — from whom, about what]

**📋 Your tickets**
• [PROJ-123] [Title] — [status or why it matters]

**🗣️ While you were away**
• [Meeting name] ([date]) — [1-sentence outcome or action item]

**📅 Coming up today**
• [Deadline or time-sensitive item]

**🗓️ Today's meetings**
[One block per meeting — see format below]

Section Rules

🔴 Needs your attention — blockers, urgent requests, overdue items, anything explicitly asking for the user's input. No bullet cap. If nothing urgent: omit this section.

📬 Messages & emails — Slack threads or emails awaiting a response. Write as: [Person] asked about [topic] in [#channel / email]. Group batches of similar low-priority emails into one line. If nothing actionable: omit.

📋 Your tickets — only tickets updated or created in the last 48h that changed meaningfully. Skip routine "still in progress" items. No bullet cap. If nothing: omit.

🗣️ While you were away — meetings in the last 7 days where the user was a participant and outcomes or action items exist. One bullet per meeting, one sentence max. Skip meetings with no relevant outcomes. Omit section if nothing qualifies.

📅 Coming up today — concrete deadlines or time-sensitive items due today or tomorrow. Omit if nothing found.

🗓️ Today's meetings — always shown if there are meetings today. Render one block per meeting, in chronological order:

🕙 [HH:MM] [Meeting Title]
👥 [Attendee 1, Attendee 2, + N others]
📝 Last time: [1-sentence Fireflies summary — or "No transcript found."]
✅ Your open items: [unresolved action items from last session — omit if none]
🔴 Blocked ticket: [PROJ-123 title — only if blocked/critical — omit if none]
💬 Slack: [1-line unresolved thread — omit if nothing relevant]

Rules:

  • Never invent summaries, action items, or talking points. Every line traces to a tool result.
  • Attendees: use display names, not raw emails. Max 3 named + "+ N others".
  • Meeting blocks with no context show bare title/time/attendees + "No prior context found."

Sections with nothing to report are omitted entirely — never write "Nothing to report."


Scan Caveats

If a source returns no results or fails, skip it silently and note briefly at the bottom: *(Gmail not scanned — no access)*

If scanning reveals a long absence (5+ days), add one line: *(Extended absence — some older items may have been resolved. Check manually if unsure.)*


Quality Checks

Before presenting, verify:

  • No section says "Nothing to report" — omit instead
  • Every bullet is specific and sourced (no vague "there was activity")
  • Every bullet is genuinely actionable or contextually important — if not, cut it
  • Action items are clearly worded — what to do, not just what happened
  • No duplicates across sections (same item in Slack + Jira → pick one, cross-reference)
  • Low-priority batches are grouped, not listed individually
  • Urgent items lead (🔴 section appears first, or absent if nothing urgent)
  • Meeting prep section: zero fabricated summaries — every line traces to a real tool result
  • Meetings with no context show "No transcript found." — not invented talking points

After Presenting

If any items are ambiguous, offer to pull more detail: "Want me to pull up [the thread / that ticket / the meeting notes] for more context?"

Never post, reply, or action anything automatically. Briefing is read-only.