meeting-intelligence-system-skill
About meeting-intelligence-system-skill
A skill for turning Epiphan-internal meeting transcripts or notes into structured summaries, decisions, action items, blockers, and follow-up drafts. It checks that a meeting is internal and routes prospect or customer calls to a separate skill.
Key features
- 01Internal-meeting scope check
- 02Decision and action-item extraction
- 03Blocker, risk, and sentiment capture
- 04Gmail follow-up draft creation
- 05Optional follow-up calendar event
Use cases
- 01Extracting owners and deadlines from a standup
- 02Recording decisions from a planning meeting
- 03Drafting follow-ups after internal meetings
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ scientiacapital/ skills --skill meeting-intelligence-system-skillAfter installing, type/meeting-intelligence-system-skillin Claude Code to confirm it loaded.
Bundled filesconfig.json
Details
From the project READMEMeeting Intelligence System
Turn an internal meeting transcript or set of notes into a structured record (decisions with owners and rationale, action items with owner/deadline/priority, blockers, open questions, sentiment) and a follow-up email that lands as a Gmail draft, not pasted text. Scope is Epiphan-internal meetings only; a transcript that turns out to be a prospect or customer call is routed to the sales-call skills instead of analyzed here. Keywords: `meeting minutes`, `action items`, `standup`, `retro`, `planning meeting`, `follow-up email`<quick_start>
Trigger: "analyze this meeting" / "extract action items from this standup" / "follow-up email from these notes".
Input: pasted transcript or notes, a Google Drive file (read_file_content), or a Clari call id for an internally recorded meeting (clari_get_call with the transcript).
Tool order:
- Scope check — if attendees include a non-Epiphan domain or the content is discovery/demo/pricing with a prospect, stop and route: "This is a sales call; use call-recording-analyzer-skill." Do not summarize it here.
- Get the transcript — pasted text,
read_file_content(Drive), orclari_get_call(internal recording). - Extract metadata, decisions, action items, blockers, sentiment, open questions (sections below).
- Follow-up email —
create_draft(Gmail) from the Tim mailbox to the attendees, subjectAction items: [meeting] - [date]. Internal recipients need no brand gate; if any recipient is outside Epiphan, runget_writing_style+check_my_copyfirst. Never send. - Optional, confirm-first:
create_event(Google Calendar) for a follow-up the meeting asked for. </quick_start>
<success_criteria>
- Scope check performed; sales/prospect transcripts routed, not analyzed
- All explicit decisions extracted with owner, rationale, and final-vs-tentative status
- Action items in a table with owner, deadline, priority; ownerless or dateless items flagged
- Blockers and risks listed with the needed action or mitigation
- Follow-up email created as a Gmail draft (draft id returned), not pasted in chat
- Outcome sidecar and run-log line written </success_criteria>
Stage 0 — Scope check
Internal only. Signals that this is a sales call: external email domain among attendees, words like demo, pricing, quote, PO, competitor names, a HubSpot deal mentioned. On any of these, respond with the routing line and the sibling skill name, write a sidecar with status: success and metrics.routed_to, and stop.
Stage 1 — Transcript
- Pasted notes: use as-is.
- Drive file:
search_filesthenread_file_content. - Clari (internal recording):
clari_list_calls/search_callsto find it,clari_get_callwith the transcript,clari_get_call_summaryfor key moments. - Unparseable or empty after one retry →
error(stage: transcript), ask for the text.
Stage 2 — Extraction
- Metadata — title/topic, attendees, date, meeting type (standup, planning, retro, 1:1, all-hands).
- Decisions — every explicit decision; who made it; rationale if stated; final vs tentative; needs-approval flag.
- Action items — task, owner, deadline, priority, dependencies. Owner unclear →
owner: UNASSIGNEDand a note. No date →deadline: TBD. - Blockers and risks — blocker, impact, needed action; risks with mitigation; escalation flags; resource constraints.
- Sentiment — overall tone (productive / tense / confused / aligned), agreement vs disagreement areas, morale indicators, tension points with a short quote.
- Key topics and open questions — main discussion points, questions raised with who will answer.
Stage 3 — Output
# Meeting Summary: [Title]
**Date**: [date] | **Type**: [standup/planning/retro/1:1] | **Attendees**: [names]
## Executive summary
[2-3 sentences: purpose and outcome]
## Decisions
1. **[Decision]** — Owner: [name] — Rationale: [why] — Status: Final | Tentative | Needs approval
## Action items
| Priority | Action | Owner | Deadline | Depends on |
|---|---|---|---|---|
| High | [task] | [name or UNASSIGNED] | [date or TBD] | [item or -] |
## Blockers and risks
1. **[Blocker]** — Impact: [..] — Needs: [action] — Escalate: [yes/no]
## Key discussion points
- [Topic]: [summary]
## Open questions
1. [Question] — Owner: [who answers]
## Sentiment
Tone: [..] · Alignment: [high/medium/low] · Concerns: [summary]
## Follow-up email
Gmail draft id: [id] · To: [attendees] · Subject: Action items: [title] - [date]
Stage 4 — Follow-up email (Gate D)
Body template, filled from the extraction:
Hi all,
Thanks for joining [meeting] today. Outcomes:
Decisions
- [decision] ([owner])
Action items
- [owner]: [task] by [date]
Blockers
- [blocker] — [needed action]
Next meeting: [date/time or TBD]
Tim
create_draft (Gmail) from the Tim mailbox. Return the draft id. External recipient present → get_writing_style + check_my_copy before creating the draft. Never send_message.
Stage 5 — Emit outcome sidecar + run log
Write ~/.claude/skill-analytics/last-outcome-meeting-intelligence-system-skill.json:
{"ts":"[UTC ISO8601]","skill":"meeting-intelligence-system-skill","version":"<frontmatter version>","variant":"default",
"status":"[success|partial|error]","runtime_ms":[estimated ms from start],
"metrics":{"meetings_analyzed":[n],"decisions_captured":[n],"action_items_extracted":[n],"unassigned_items":[n],"blockers":[n],"draft_created":[true|false],"routed_to":[null|"call-recording-analyzer-skill"]},
"error":null,"session_id":"[YYYY-MM-DD]"}
status partial/error must name the failing stage in error. Append one line to ~/.claude/skill-runs/meeting-intelligence-system-skill.jsonl.
<self_healing>
partial = summary produced but a stage degraded: Clari or Drive fetch failed after retry (ask for pasted text, continue), owners unidentifiable (items marked UNASSIGNED and counted), create_draft failed (email body returned in chat with a flag). error = no transcript obtainable, or the content is a sales call (routed, not analyzed). Ladder per ~/.claude/skills/epiphan-house-rules-skill/reference/self-healing.md: retry once → degrade with a flag → tell Tim in chat → halt.
</self_healing>
<anti_patterns>
- Summarizing a prospect call here; the Clari scorecard skills own those.
- Pasting the follow-up email in chat instead of creating the Gmail draft.
- Vague action items ("look into X"); every item has a verb, an owner or UNASSIGNED, a date or TBD.
- Treating a proposal as a decision; mark tentative items. </anti_patterns>
<reference_guides>
- Siblings:
call-recording-analyzer-skill(prospect calls, MEDDIC scorecard),sdr-call-coaching(SDR dial coaching),internal-email-composer(standalone internal emails) ~/.claude/skills/epiphan-house-rules-skill/reference/self-healing.md— failure ladder and run-log format </reference_guides>