| name | meeting-digest |
| description | Fetch the most recent Zoom meeting, extract decisions and action items, deduplicate against existing Jira issues, write a structured note to Context/Meeting Notes/, and create or update Jira tickets after Pri reviews them. |
Meeting Digest
Automatically fetch the latest Zoom meeting, produce a structured digest, save it locally, check each action item against existing Jira issues to avoid duplicates, and create or update tickets only after Pri reviews the recommendations.
Instructions
Run all steps in sequence. Do not ask for confirmation between steps unless explicitly told to pause.
Step 1 ā Fetch all undigested meetings from today
This step processes ALL undigested work meetings from today ā not just the most recent one.
-
Compute "today" as the current date in Australia/Sydney (AEST = UTC+10, AEDT = UTC+11). Set:
from = start of today AEST converted to UTC (e.g. if today is 2026-04-21 AEST, use 2026-04-20T14:00:00Z)
to = now in UTC (always use the current moment ā never a fixed earlier time)
Call mcp__9edf655b-9ecb-4911-aa24-26584c7014e0__search_meetings with this range and page_size: 20.
-
Error handling ā if the call fails or returns an error:
- Post a Slack alert: call
mcp__0deb4b0b-cc05-4ae4-8e5e-08d6c09985dd__slack_send_message with:
channel_id: C0AM6E2D4R2
message: ā ļø *Meeting digest blocked ā Zoom error*\n\n[error message]. Check the Zoom for Claude connector in Claude settings.
- Then stop.
-
Filter to work meetings only. Remove any entry where topic matches: Gym, Lunch Hour, Sacred Lunch, Home, Focus Time, club-, #club, Reflect & Plan, Recharge, or any entry with attendee_size: 0 and no meeting_uuid. Also exclude meeting_category: upcoming (not yet ended).
-
Sort chronologically (oldest first). This is the ordered list of meetings to process.
-
For each meeting in the list, run the idempotency check before fetching assets:
- First (once, before the loop): run
git -C /Users/priscila/Documents/Agents/personal-agent-main pull --ff-only to sync the working directory.
- Derive the expected notes filename:
YYYY-MM-DD - [Meeting Name].md using the meeting's topic field (same format as Step 5).
- Check if a file with that name already exists:
ls "/Users/priscila/Documents/Agents/personal-agent-main/Context/Meeting Notes/" | grep "[filename]"
- If it exists, skip this meeting and move to the next. Output: "Notes already exist for [meeting name] ā skipping."
- If it does NOT exist, proceed to fetch assets for this meeting.
-
For each undigested meeting, using the meeting_uuid:
- a. Call
mcp__9edf655b-9ecb-4911-aa24-26584c7014e0__get_meeting_assets with meetingId set to the meeting_uuid. This returns the Zoom AI summary, my notes, recording status, and participant list.
- b. If a recording exists and
processing is not true, call mcp__9edf655b-9ecb-4911-aa24-26584c7014e0__get_recording_resource with meetingId set to the meeting_uuid and types: "transcript,summary,nextStep".
- c. If neither
my_notes nor recording transcript is available, note: "[Meeting name] ā no transcript or notes available yet. Skipping." and move to the next meeting.
-
After processing all meetings, report how many were digested and how many skipped (with reasons).
Step 2 ā Read context
Before processing the transcript, read:
GOALS.md ā to understand active projects and know which Jira epics exist
Context/Memory/pri-brain.md ā to understand how Pri thinks, her vocabulary, and what she considers a decision vs. a discussion
Context/Memory/Reference/jira-epic-map.md ā epic matching reference (if it exists)
Step 3 ā Analyse the transcript
Additional signal: If get_recording_resource returned summaries or next_steps arrays (Zoom's AI-generated content), use them as supplementary cross-checks ā but do not copy them verbatim. Your job is to extract meaning through Pri's lens, not relay Zoom's output.
Extract four things from the transcript:
A. Summary
2ā3 sentences. Signal-first: what was the meeting about and what was the key outcome or shift. Not a list of topics covered ā a single coherent outcome statement. Use Pri's voice: direct, no effort framing, leads with result.
B. Decisions
Explicit commitments that changed direction, locked something in, or closed an open question. Only real decisions ā not suggestions, not maybes. Format: what was decided, and who made the call (if attributable).
C. Action items
Concrete next steps with a named owner. Apply this logic per item:
- If the transcript names a specific person as the driver with high confidence ā assign to them
- If ownership is ambiguous or shared ā assign to Pri (priscila.wagner@canva.com)
- For each item, suggest the best Jira epic match using the logic in Step 4
- Note the suggested due date if mentioned in the meeting, otherwise leave blank
D. Open questions / blockers
Unresolved questions, blockers raised, or topics parked for a future meeting. These do NOT become Jira tickets ā they go in the notes file only.
Step 4 ā Match action items to Jira epics
For each action item, determine the best Jira epic by reading the meeting context against GOALS.md. Use this matching logic:
| If the action item is about... | Suggest this epic |
|---|
| AI Help Center, HA, logged-in sessions, UVSG-614 | UVSG-614 |
| Integrated AI HC + Assistant, split panel, AI chat, UVSG-615 | UVSG-615 |
| Logged-out HA, login incentive, TIMDL | HELP-4319 |
| No-reply email help access | HELP-4340 |
| Canva AI Help + ChatGPT MCP | HELP-3785 |
| Mobile help experience, mobile UX, mobile audit | HELP-4139 |
| LLM readability, article structure for AI | HELP-3222 |
| CMS integration, in-context tutorials, Design School | HELP-3820 |
| Content pipeline, Contentful, publishing automation | Use HELP-3090 |
| Affinity, China, global/local HC | Use HELP-3090 |
| Anything else, unclear, or cross-cutting | Use HELP-3090 (default fallback) |
State your epic suggestion in the review output. Pri will confirm or override before tickets are created.
Step 5 ā Write the meeting notes file
Save the digest to Context/Meeting Notes/ using this filename format:
YYYY-MM-DD - [Meeting Name].md
Use the meeting name from the Zoom note title. Strip any Zoom-generated suffixes (e.g. "Zoom Meeting" or long IDs).
File format:
# [Meeting Name]
*[YYYY-MM-DD] | [Duration if available] | [Attendees if available]*
## Summary
[2ā3 sentence signal-first summary. What happened and what changed.]
## Decisions
- [Decision 1 ā who made it if known]
- [Decision 2]
## Action Items
| # | Task | Owner | Epic | Due |
|---|------|-------|------|-----|
| 1 | [Task description] | [Name / Pri] | [HELP-XXXX or UVSG-XXX] | [Date or ā] |
| 2 | ... | ... | ... | ... |
## Open Questions & Blockers
- [Question or blocker ā what's unresolved and why it matters]
## Context
[Any background, links, or framing from the meeting that's useful for future reference. Keep to 3ā5 bullets max.]
Before saving, add [[wiki-links]] to the note for Obsidian graph connectivity:
- All people mentioned by name ā
[[Name]]
- All Jira ticket keys (HELP-XXXX, UVSG-XXXX) ā
[[HELP-XXXX]]
- Key concepts and themes:
[[logged-out HA]], [[half-sheet]], [[HC AI mode]], [[Mobile Help UX]], [[AI-First Help Center]], [[Content Automation]], [[HCF]]
- Only link meaningful mentions ā not every word, not inside code blocks or URLs
Confirm to the user: "Meeting notes saved to Context/Meeting Notes/[filename].md"
Step 6 ā SKIP
Jira deduplication is disabled. Skip this step entirely and proceed to Step 7.
Step 7 ā SKIP
Jira review table is disabled. Skip this step entirely and proceed to Step 8.
Step 8 ā SKIP
Jira ticket creation is disabled. Skip this step entirely and proceed to Step 9.
Step 9 ā Compound on touch
After saving:
- Check if any decision or blocker from this meeting relates to an open task in
Tasks/ ā if so, note it inline.
- If a blocker was raised that already exists in
GOALS.md as a known blocker, flag it: "This blocker ([name]) was also raised in [previous context]. Consider whether it's systemic."
- If the meeting is a recurring 1:1 with a named person who has a doc in
Context/121s/, append a session log entry to their doc: date, 1-line summary, any open loops added.
Step 10 ā SKIP
Meeting notes contain personal data and are never pushed to GitHub. Skip this step entirely and proceed to Step 11.
Step 11 ā Show summary in chat
After saving notes locally, display a compact summary in chat:
š **Meeting digest complete ā [Meeting Name] ([YYYY-MM-DD])**
**Decisions:** [count] | **Action items:** [count]
[Action items as bullets: ⢠[task] ā [owner] [KEY-XXX]]
Notes saved to `Context/Meeting Notes/[filename].md`
If there are no action items: š [Meeting Name] digested ā no action items.
Do NOT call slack_send_message unless Pri explicitly asks to post to Slack.
Edge cases
- No decisions found: Write "No decisions made ā discussion/update meeting." Do not invent decisions.
- No action items found: Write "No action items." Do not create Jira tickets.
- Transcript is a standup or <5 min: Still run the digest, but keep the summary to 1 sentence and skip Jira ticket creation unless action items are explicitly present.
- Multiple meetings today: List the top 3 by recency and ask: "I found [N] meetings today ā I fetched the most recent ([name]). Is that the right one, or should I use a different one?"
- Person not found in Jira: Flag the item: "Couldn't find [name] in Jira ā assigning to Pri by default. Confirm?"