meetings-prep

SkillProductivity

Interactive meeting preparation — builds a relationship brief and talking points before a call. Use when the user says "prep me for my call with", "I'm meeting with X", "prepare me for", "what should I bring up with", "meeting prep", "get ready for my call", or wants to review history with someone before a meeting.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the meetings-prep skill

What this skill tells your AI

The instructions your AI receives, as published by flonat/flonat-research in skills/meetings-prep/SKILL.md and read by ahel’s review.

Interactive meeting preparation that searches your entire conversation history with someone, synthesizes a relationship brief, and produces talking points — before you walk into the room.

How it works

This is a multi-phase interactive flow, not a single command. Walk the user through each phase using the available structured-question mechanism, pushing back on vague answers.

Phase 0: Calendar auto-detect (optional, runs first)

Before asking who the user is meeting with, check if upcoming meetings are available from any calendar source. Try these in order — use the first that works:

1. Calendar connector (preferred): If the active client has a calendar connector, use its list-events operation to query today's remaining events:

gcal_list_events(
  timeMin: "<now ISO, e.g. 2026-03-19T14:00:00>",
  timeMax: "<end of day, e.g. 2026-03-19T23:59:59>",
  condenseEventDetails: false
)

Do NOT hardcode a timezone — let the connector use the user's calendar default. Parse attendees, event titles, and times to find the next upcoming meeting with other people (skip all-day events and events with no attendees).

2. gog CLI (if installed):

gog calendar list --today --json -a <account> 2>/dev/null

3. Apple Calendar (osascript) (every Mac, zero install):

osascript -e 'tell application "Calendar" to get {summary, start date} of (every event of every calendar whose start date >= (current date) and start date < ((current date) + 1 * days))'

4. None available — skip to Phase 1 and ask manually.

If upcoming meetings are found: Present via the available structured-question mechanism: "I see you have these meetings coming up today:

  • [time] — [title] with [attendees]
  • [time] — [title] with [attendees]

Which one are you prepping for?"

Options: list each meeting + "None of these — I want to prep for something else"

If the user picks a meeting, auto-populate the person name and skip Phase 1. Pull attendee names from the calendar event directly.

If no upcoming meetings or calendar unavailable: Silently skip to Phase 1. Don't error or apologize — just ask manually.

Phase 1: Who are you meeting with?

If Phase 0 already identified the person, skip this phase.

Otherwise, ask via the available structured-question mechanism: "Who are you meeting with?"

If the answer is specific (a name like "Alex" or "Case"): → Search all past meetings:

minutes search "<name>" --limit 50

Also search common variations — first name, last name, nickname.

If the answer is vague ("the team", "everyone", "my usual meeting"): → Push back: "Be specific. Name one person who'll be in the room. I'll search everything you've discussed with them."

If the answer is a topic ("the pricing meeting", "the Q2 planning call"): → Adapt to topic-based prep:

minutes search "<topic>" --limit 20

Skip the relationship brief and go straight to a topic brief instead.

Phase 2: Relationship brief

Step 1: Check persistent relationship file. Before searching all meetings, check for an existing relationship file:

cat ~/.minutes/relationships/{first-name}.md 2>/dev/null

If it exists, read it — it contains cumulative intelligence from all past prep/debrief cycles with this person. Use it as a head start (skip re-deriving information already captured). If the file is >30 days old, supplement with a fresh meeting search.

Step 2: Search meeting history. (Skip if relationship file is <7 days old and comprehensive.)

minutes search "<name>" --limit 50

Read each matching meeting file with Read. Build a relationship brief:

Meeting history:

  • Total meetings with this person, first and most recent dates
  • Meeting frequency trend (increasing/decreasing/stable)

Recurring topics:

  • Topics that come up across multiple meetings
  • Topic trending: which topics are appearing MORE recently (↑) vs fading (↓)
  • Flag any topic that appeared 3+ times in the last 2 weeks — "Something's on their mind"

Open commitments:

  • Items YOU owe THEM (from action_items where assignee matches the user)
  • Items THEY owe YOU (from action_items where assignee matches the other person)
  • Flag any overdue items (due date in the past, status still open)

Decision history:

  • Recent decisions involving this person (from decisions: frontmatter)
  • Any volatile decisions (changed 2+ times) — flag as "still in flux"

Present the relationship brief to the user. Don't ask for approval — just show it and move to Phase 3.

If there are zero past meetings AND no relationship file: Say: "I don't have any recorded meetings with [name]. This will be your first meeting on record. What's the context — how do you know them?"

Then skip the relationship brief and go straight to Phase 3 with whatever context the user provides.

Phase 3: What do you want to accomplish?

Ask via the available structured-question mechanism: "What's the one thing you'd regret not discussing in this meeting?"

If the answer is specific ("finalize the pricing at monthly billing", "get a commitment on the hire"): → Frame talking points around that goal. Connect it to relationship data — e.g., "Alex's mentioned pricing 3 times recently. She's ready for this conversation."

If the answer is vague ("just catch up", "the usual"): → Push back with evidence: "Based on your last 3 meetings with Alex, these topics are active: [list]. Which one matters most today?"

If the user skips ("I don't know yet" / "nothing specific"): → Accept it. Frame as an open-ended catch-up. Still produce talking points based on open items and recent topics.

Phase 4: Save prep file

Save the prep brief to ~/.minutes/preps/ for later pickup by meetings-debrief:

mkdir -p ~/.minutes/preps

Write the file as ~/.minutes/preps/YYYY-MM-DD-{person-first-name}.prep.md with this structure:

---
person: {full name}
date: {today ISO}
goal: {what they want to accomplish}
meeting_count: {total past meetings}
---

## Relationship Brief
{the brief from Phase 2}

## Talking Points
{the talking points}

## Goal
{their stated goal, quoted}

Set permissions to 0600:

chmod 600 ~/.minutes/preps/YYYY-MM-DD-{slug}.prep.md

Use the person's first name (lowercase) as the slug — e.g., sarah, not sarah-chen — because transcript attendee names are often abbreviated.

Phase 5: Closing ritual

End with three beats:

  1. Signal reflection — Quote a specific thing the user said during the session. "You said '[exact quote from their structured-question answers]' — that's your north star for this call."

  2. Assignment — One concrete real-world action before the meeting. Not "go build it" — something specific. Examples: "Text Alex before your call that you want to finalize pricing." "Review the competitor grid Case sent you — it's still in your action items."

  3. Next skill nudge — "After your call, run meetings-debrief to capture what you decided and compare it to what you planned."

Gotchas

  • Calendar auto-detect is best-effort — If no calendar source is available, silently fall back to asking manually. Never error or nag the user about calendar setup. Use the active client's registered calendar connector when present.
  • Calendar attendee names may differ from meeting transcript names — Calendar says "Alex Chen (sarah@company.com)" but transcripts say "Alex" or "SPEAKER_0". Match on first name.
  • Skip all-day events and solo events — Only show events with 2+ attendees as prep candidates. All-day events and events where the user is the only attendee aren't meetings.
  • Push back on vague answers — This is the most important pattern. Vague prep = useless prep. "Everyone" → "Name one person." "Catch up" → "What would you regret not discussing?"
  • First-name slug for prep files — Use sarah not sarah-chen. Transcript attendees are often abbreviated. Debrief matches on first name.
  • Zero past meetings is not an error — It's a first meeting. Adjust the flow, don't apologize.
  • Don't hallucinate meeting history — If you searched and found nothing, say so. Never invent meetings or conversations that don't appear in the search results.
  • Prep files are sensitive — They contain relationship intelligence. Always 0600 permissions.
  • Multiple people in the meeting — If the user names 2-3 people, search for each and combine the briefs. For >3, suggest picking the most important person to focus on.
  • Stale prep files — meetings-debrief ignores preps older than 48 hours. The user can prep the day before and still get the debrief connection.

Signals

GitHub stars
133
Forks
24
Last commit
Aug 2026
Advanced
Catalog kind
skill
Gateway key
meetings-prep
Source
github.com/flonat/flonat-research