---
name: meetings-prep
description: "📅 MEETINGS: Prep — full multi-source brief before any meeting. Finds the meeting in Google Calendar, then scans Fireflies, Slack, Jira, Gmail & Confluence to produce a structured prep card: what was decided last time, recent threads, suggested talking points, attendee context, and open blockers. Use whenever asked to prepare for a meeting by name or timing. Triggers include: \"prepare me for [meeting]\", \"prep for my call with [person/client]\", \"I have a meeting with X in 30 minutes\", \"what should I know before [meeting]\", \"przygotuj mnie na [spotkanie]\", \"mam call za 30 minut\", \"co powinienem wiedzieć przed spotkaniem z [klientem]\", \"przygotuj mnie na rozmowę z [osobą]\", \"brief me before [meeting]\", or any variation of wanting context before a specific meeting. Also trigger proactively when someone mentions an upcoming meeting or call and seems to want to be prepared. Always ask to confirm which meeting before scanning if there's any ambiguity."
---

# Meeting Prep Skill

## Purpose

Produce a structured, medium-length prep card before any meeting — sourced from Fireflies,
Slack, Jira, Gmail, and Confluence. Output is shown in chat only, never written anywhere.

Tone: Direct. Like a prepared EA handing you a briefing note 10 minutes before the room.
Length: **Under 500 words.** Structured sections. Every line must trace to a real source.
Priority order: Last session context → Recent Slack threads → Talking points → Attendees → Blockers.

---

## Key Constants

- **Jira / Confluence Cloud ID:** use the Cloud ID from the user's project context (e.g. `yourorg.atlassian.net`). If not provided, ask the user before querying Jira/Confluence.
- **Default Fireflies scan window:** last 60 days (find most recent session with same attendees/title)
- **Default Slack scan window:** last 7 days

---

## Step 0: Resolve the meeting

### From the user's message, extract:
- **Meeting name / title** (e.g. "weekly sync", "call with client", "refinement")
- **Timing signal** — if the user said "in 30 minutes", "in an hour", etc., use that to look up the next calendar event in that window
- **People mentioned** — names, emails, or client names that narrow down which meeting

### Calendar lookup

Always look up Google Calendar to anchor to a real event:

```
Google Calendar:list_events(
  startTime: "<now>",
  endTime: "<now + 24h>",   // extend to 48h if nothing found in 24h
  timeZone: "<user's local timezone, e.g. Europe/Warsaw, America/New_York>",
  orderBy: "startTime"
)
```

**If the user gave a meeting name:** find the event whose title best matches.
**If the user said "in N minutes/hours":** find the next event starting within that window.
**If multiple matches exist:** show them as a quick-tap list and ask the user to pick one. Do NOT proceed without confirming.
**If no calendar event is found:** ask "I couldn't find this on your calendar — can you confirm the meeting title or paste the invite details?"

Once the meeting is confirmed, extract:
- **title**, **start time**, **attendees** (names + emails)
- **description / agenda** from the calendar event itself (if any)
- **Derived project keyword** — strip meeting-type words ("daily", "refinement", "call", "sync", "weekly") and use what's left (e.g. "Acme daily" → `Acme`, "ProjectX Refinement" → `ProjectX`)

---

## Step 1: Scan all sources in parallel

Run all of the following simultaneously. Don't wait for one before starting another.

### 1a. Fireflies — last session with same title or attendees

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

If title-based search returns nothing, retry with attendee email:
```
fireflies_get_transcripts(
  participantEmail: "<attendee email>",
  limit: 3
)
```

Call `fireflies_get_summary` on the most recent result. Extract:
- Overall outcome / what was discussed
- Decisions made
- Action items assigned to the user (unresolved ones only)
- Open questions that weren't resolved

If no transcript found: mark as "No previous session found" — do NOT invent content.

### 1b. Slack — recent threads about this topic

**Tip:** If channel IDs are known (e.g. from a project prompt), use them directly — don't search by name. Querying by ID is faster and more reliable.

```
slack_search_public_and_private(
  query: "<project keyword> after:<7-days-ago>",
  limit: 10,
  sort: "timestamp"
)
```

Also scan the channel directly if a channel ID is known:
```
slack_read_channel(channel_id: "<proj-channel-id>", oldest: <7d-unix-ts>, limit: 30)
```

For any message that looks like it has a reply thread (indicated by thread_ts), read the full thread to get the complete context — decisions and answers are often in replies, not in the original message:
```
slack_read_thread(channel_id: "<channel-id>", thread_ts: "<ts>")
```

Extract: unresolved questions, blockers, decisions made in Slack (not in Jira), any messages directed at the user that haven't been resolved.

### 1c. Jira — open tickets for this project

Derive Jira project key from the project keyword (look up if not known):
```
JQL: project = "<KEY>" AND status NOT IN (Done, Closed) ORDER BY priority DESC
fields: summary, status, assignee, priority, issuetype
maxResults: 10
```

Focus on: Blocked tickets, High/Critical priority, items In Review awaiting feedback, anything assigned to the user. Skip routine In-Progress tickets unless they're relevant to the meeting topic.

### 1d. Gmail — recent emails about this meeting or project

```
search_threads(
  query: "<project keyword> OR <attendee email> after:<YYYY/MM/DD 7 days ago>",
  maxResults: 10
)
```

Extract: anything with "action required", decisions communicated via email, open threads awaiting the user's reply, anything relevant to this meeting's agenda.

### 1e. Confluence — relevant documentation or decisions

```
searchConfluenceUsingCql(
  cql: "text ~ \"<project keyword>\" AND lastmodified >= \"<14-days-ago>\" ORDER BY lastmodified DESC",
  limit: 5
)
```

Also try:
```
cql: "title ~ \"<project keyword>\" ORDER BY lastmodified DESC"
limit: 3
```

Extract: recent page updates, decision logs, specs, or architecture docs that are relevant to what's likely to come up.

---

## Step 2: Synthesise

Cross-reference all sources. Build the talking points section like this:

**Sourced talking points** — items that directly emerge from Fireflies/Slack/Jira/Gmail/Confluence:
- Unresolved action item from last session → raise it
- Blocked ticket → flag it
- Open Slack question → resolve it
- Email thread waiting for input → address it

**AI-inferred talking points** *(labelled clearly)* — based on the meeting type and context, what a prepared PM would logically raise:
- For a daily/standup: what's the sprint velocity, any impediments?
- For a refinement: are requirements clear, any edge cases?
- For a client call: what did we commit to last time, what's the status?
- For a 1:1: any feedback loops, blockers, career/team topics?

Label all AI-inferred points with `💡 suggested:` so the user knows they're not sourced.

---

## Output Format

```
📅 Meeting Prep — [Meeting Title]
🕙 [HH:MM today / date if not today] · [Duration if known] · [Location/link if in calendar]
👥 [Attendee 1, Attendee 2, + N others]

---

**🗣️ Last session** *(Fireflies — [date])*
• [1–2 sentence outcome summary]
• [Decision made: ...]
• ✅ Your open item from last time: [action item — if any]
• ❓ Unresolved question: [if any]

**💬 Recent Slack** *(last 7 days)*
• [Unresolved thread or message — from whom, about what]
• [Another one if relevant]

**📋 Jira** *(open items)*
• 🔴 [PROJ-123] [Blocked ticket title]
• ⚠️ [PROJ-456] [High priority item]

**📧 Email**
• [Thread subject] — [what's pending]

**📝 Confluence**
• [Page title] updated [date] — [1-line relevance note]

---

**🎯 Talking points**
• [Sourced: raise unresolved action item X]
• [Sourced: address blocked ticket PROJ-123]
• 💡 suggested: [AI-inferred point — clearly labelled]
• 💡 suggested: [another inferred point]

---

**👥 Who's in the room**
• [Name] — [role / what they own on this project, if known from Slack/Jira/Fireflies]
```

---

## Section Rules

**🗣️ Last session** — mandatory if Fireflies found anything. One session only (most recent). Max 4 bullets. If no transcript: `No previous session found in Fireflies.`

**💬 Recent Slack** — only unresolved threads or direct questions. Skip emoji reactions, casual banter, resolved threads. If nothing: omit section.

**📋 Jira** — only Blocked, High/Critical, or In Review items. Skip routine In-Progress. If nothing relevant: omit section.

**📧 Email** — only threads awaiting action or directly about this meeting. If nothing: omit.

**📝 Confluence** — only if a page update is directly relevant to what's likely to come up. If nothing recent: omit.

**🎯 Talking points** — always present. Minimum 2 bullets. Max 6. Sourced ones first, `💡 suggested:` ones last. Never fabricate sourced bullets — if you can't point to a source, label it as suggested.

**👥 Who's in the room** — list attendees from the calendar event. Add role/context only if found in Slack, Jira, or Fireflies. Never invent roles. If there are only two attendees: skip section (already obvious).

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

---

## Step 3: Proactive follow-up suggestions

After presenting the prep card, always append a short block:

```
---
**💬 Want me to:**
• [ ] Create a Jira ticket for [unresolved item]?
• [ ] Draft a Slack message to [attendee] about [open question]?
• [ ] Pull the full Fireflies transcript from last session?
• [ ] Search Confluence for [topic] in more depth?
```

Only suggest actions that are grounded in what was actually found. Don't invent suggestions.
Max 3–4 suggestions. If nothing actionable: skip this block.

---

## Scan Caveats

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

If the meeting is more than 2 hours away, add a note:
`*(Prep generated [X] hours before the meeting — Slack/email may update before then.)*`

---

## Quality Checks

Before presenting, verify:
- [ ] Every sourced bullet traces to a real tool result
- [ ] All AI-inferred points are labelled `💡 suggested:`
- [ ] No section says "Nothing found" — omit instead
- [ ] Talking points section always present, min 2 bullets
- [ ] Total under 500 words
- [ ] Follow-up suggestions are grounded, not generic
- [ ] Meeting confirmed from calendar before scanning (never prepped from name alone)