skills/process-meeting-notes/SKILL.md
Process meeting transcripts from Fireflies and Plaud with mandatory full transcript analysis, extract action items from ALL participants, create GitHub issues with smart repo routing, run deterministic verification gates, and generate EOS Level 10 Meeting summaries. When invoked bare (no arguments), scans both sources for unprocessed meetings and walks through them one by one. Use after team meetings or when the user mentions meetings, Fireflies, Plaud, L10, or action item extraction.
npx skillsauth add skinnyandbald/fish-skills process-meeting-notesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
<essential_principles>
This skill processes meeting transcripts from Fireflies and Plaud with mandatory full transcript analysis — not just automated summaries. It extracts action items from ALL participants, routes GitHub issues to the correct repository via smart detection, and runs a deterministic verification script to ensure no items are dropped. It works with any repository you're currently in.
Fetch meeting data from the appropriate source:
Fireflies MCP:
mcp__fireflies__fireflies_search to find meetingsmcp__fireflies__fireflies_get_summary for action items, keywords, overviewmcp__fireflies__fireflies_get_transcript — ALWAYS fetch the full transcript; it is mandatory, not optionalPlaud MCP (optional):
mcp__plaud__list_files to browse/find recordingsmcp__plaud__get_transcript for timestamped transcript with speaker labelsDo NOT use mcp__plaud__get_note. The skill generates its own structured
summary and action items by analyzing the full transcript — Plaud's built-in
AI notes are lower quality than what this skill produces. The only Plaud tools
needed are list_files (to find recordings) and get_transcript (to get raw
dialogue).
Plaud tools are optional. If Plaud MCP is not configured in the current environment, skip Plaud steps gracefully and process Fireflies-only. Do not fail or error when Plaud tools are unavailable.
For both sources: a subagent must read the entire transcript to extract action items, decisions, and key discussion points. The skill generates all summaries itself from the raw transcript — never from a third-party AI summary.
When saving transcripts to the vault, ALL transcripts MUST use normalized Fireflies format regardless of source:
Speaker Name: Content of what they said in this segment.
Speaker Name: Next thing they said.
Other Person: Their response.
Rules:
Speaker Name: content — no timestamps, no bold, no bracketsspeaker field or Fireflies attribution)[MM:SS - MM:SS] timestamps, NO **Speaker:** bold formattingFor Plaud specifically:
get_transcript (NOT get_note) to populate the transcript file{content, speaker, start_time, end_time}{speaker}: {content}get_note output (AI summary) to the transcripts folder — that goes in the structured meeting note onlyFor Fireflies:
fireflies_get_transcript — it natively outputs in the correct speaker-attributed formatEvery transcript file MUST include the source recording ID in YAML frontmatter:
plaud_id: <file_id from Plaud>fireflies_id: <transcriptId from Fireflies>source: pasted): exempt — no provider ID existsThis is the deduplication key for the unprocessed inbox workflow. Never skip it for Plaud or Fireflies sources.
At workflow start, detect the current repository:
gh repo viewgh label listNever hardcode repo-specific values. Always detect dynamically.
Before creating new GitHub issues:
For each potential GitHub issue:
All meeting summaries follow the Level 10 Meeting structure:
Action items MUST always use markdown checkbox format — never tables or plain bullets:
- [ ] Action description -- **Owner Name** (due date)
This enables Obsidian task tracking and interactive checkboxes.
After saving to vault (Step 7), detect whether the meeting is CRM-relevant (sales, discovery, client, or diagnostic). If so, check Attio for existing deals, propose stage transitions and task updates, and execute only after user confirmation.
Detection uses short-circuit evaluation to avoid unnecessary API calls:
attio_deal_id in frontmatter — signal 4 (validate deal exists before trusting)meeting_type (sales/discovery/client/diagnostic) — signal 1, local, no APIKey constraints:
create_record cannot create deals (owner field unsupported). Use REST API via curl when deal creation is needed.attio-task-scope.md). Everything else stays as GitHub issues.See references/attio-crm-integration.md for deal stages, task templates,
MCP tool inventory, and REST API curl template.
When a meeting produces 2+ action items for the same source (meeting, project, participant cluster), do NOT create N flat standalone issues. Apply hierarchy:
Creating sub-issues via API:
CHILD_ID=$(gh api repos/OWNER/REPO/issues/$CHILD_NUM --jq '.id')
echo "{\"sub_issue_id\": $CHILD_ID}" | gh api repos/OWNER/REPO/issues/$PARENT_NUM/sub_issues --method POST --input -
Critical: sub_issue_id is the REST API id (large integer), NOT the issue
number. -f sends strings and causes 422 — pipe JSON with --input -.
Cross-repo and cross-org both work. Because sub_issue_id is the
globally-unique REST id, a parent can attach a child in any repo you can
access — same owner (skinnyandbald/SecondBrain ↔ skinnyandbald/distil) or a
different owner/org. There is no same-owner restriction. The only cause of a
422 here is the wrong id (the issue number or node_id instead of the integer
id, or -f string encoding) — both covered above. (Verified against the live
GitHub API on 2026-06-01: a cross-owner attach returns 201 Created.)
See the Issue Hierarchy decision tree in the
workflows/process-recent-meeting.md (Step 5.75) for the full grouping logic and
parent body format.
</essential_principles>
If you want meeting notes and transcripts saved to a personal knowledge base (Obsidian vault, SecondBrain, etc.), set these environment variables or define them in your project's CLAUDE.md:
| Variable | Purpose | Example |
|----------|---------|---------|
| MEETING_NOTES_DIR | Where structured meeting notes are saved | ~/SecondBrain/02_Areas/notes |
| MEETING_TRANSCRIPTS_DIR | Where raw transcripts are archived | ~/SecondBrain/02_Areas/notes/transcripts |
If not set: The skill will only generate GitHub issues and L10 summaries without saving to a vault. It will ask the user where to save if they request it.
If set: The skill automatically saves:
$MEETING_NOTES_DIR/YYYY-MM-DD - Entity - Topic.md$MEETING_TRANSCRIPTS_DIR/YYYY-MM-DD - Source - Topic.mdNotes: YYYY-MM-DD - Entity - Topic.md (e.g., 2026-03-13 - Hampton - Core Meeting.md)
Transcripts: YYYY-MM-DD - Source - Topic.md (e.g., 2026-03-13 - Fireflies - Hampton Core Meeting.md)
---
date: YYYY-MM-DD
type: transcript
source: fireflies | pasted | plaud
fireflies_id: <transcript_id> # required when source: fireflies
plaud_id: <file_id> # required when source: plaud
meeting_type: sales | internal | peer-advisory | other
attendees: [...]
processed_note: "YYYY-MM-DD - Entity - Topic.md"
---
The processed_note field links the raw transcript to its structured meeting note.
</configuration>
If invoked with no arguments, default to option 0.
Wait for response before proceeding. </intake>
<routing> | Response | Workflow | |----------|----------| | 0, no args, "unprocessed", "inbox" | `workflows/process-unprocessed-inbox.md` | | 1, "recent", "latest", "today" | `workflows/process-recent-meeting.md` | | 2, "search", "find", "specific" | `workflows/search-meeting.md` | | 3, "create", "notes", "issues" | `workflows/create-issues-from-notes.md` | | 4, "summary", "L10", "EOS" | `workflows/generate-l10-summary.md` |After reading the workflow, follow it exactly. </routing>
<reference_index>
All domain knowledge in references/:
EOS Framework: eos-level-10-format.md GitHub Integration: github-project-config.md (dynamic detection patterns) Attio CRM Integration: attio-crm-integration.md (deal stages, MCP tools, task templates, REST API) </reference_index>
<workflows_index> | Workflow | Purpose | |----------|---------| | process-unprocessed-inbox.md | Scan Fireflies + Plaud for unprocessed meetings, present queue, walk through each | | process-recent-meeting.md | Full workflow: detect context → fetch → compare → create issues → L10 summary | | search-meeting.md | Find specific meeting by criteria | | create-issues-from-notes.md | Convert provided notes to GitHub issues | | generate-l10-summary.md | Create L10 summary from existing analysis | </workflows_index>
<templates_index> | Template | Purpose | |----------|---------| | l10-meeting-summary.md | EOS Level 10 Meeting summary structure | | github-issue-checklist.md | Issue body with implementation checklist | </templates_index>
development
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
tools
Verify worktree plugin patches are intact after plugin updates. Checks compound-engineering and superpowers skills for Claude Code launch instructions.
development
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
development
Reviews the feature you just built and adds missing test coverage. Focuses on behavior that matters — not coverage metrics. Use after completing a feature to identify untested code paths, edge cases, and risk areas.