daymade/meeting-minutes-taker
> Transforms raw meeting transcripts into high-fidelity, structured meeting minutes (notes / summaries). Use when (1) a meeting transcript is provided and meeting minutes, notes, or a summary are requested; (2) multiple versions of minutes must be merged without losing content; (3) existing minutes need review against the original transcript for missing items; (4) the transcript has anonymous speakers like "Speaker 1/2/3" or "发言人1" that need identifying (optionally mapped via a context.md team directory). Triggers on 会议纪要 / 会议记录 / 整理纪要 / 妙记转纪要, "write meeting minutes", "summarize this meeting", "merge these minutes", "what's missing from these notes". For fixing ASR/STT recognition errors in the raw transcript first, use transcript-fixer; this skill structures clean transcripts into minutes.
npx skills add https://github.com/daymade/claude-code-skills --skill meeting-minutes-taker
Transform raw meeting transcripts into comprehensive, evidence-based meeting minutes through iterative review.
Pre-processing (Optional but Recommended):
doc-to-markdown skill to convert .docx/.pdf to Markdown first (preserves tables/images)transcript-fixer skill to fix ASR/STT errors if transcript quality is poorcontext.md with team directory for accurate speaker identificationCore Workflow:
Auto-generate output filename from transcript content:
Pattern: YYYY-MM-DD-<topic>-<type>.md
| Component | Source | Examples |
|-----------|--------|----------|
| Date | Transcript metadata or first date mention | 2026-01-25 |
| Topic | Main discussion subject (2-4 words, kebab-case) | api-design, product-roadmap |
| Type | Meeting category | review, sync, planning, retro, kickoff |
Examples:
2026-01-25-order-api-design-review.md2026-01-20-q1-sprint-planning.md2026-01-18-onboarding-flow-sync.mdAsk user to confirm the suggested filename before writing.
Copy this checklist and track progress:
Meeting Minutes Progress:
- [ ] Step 0 (Optional): Pre-process transcript with transcript-fixer
- [ ] Step 1: Read and analyze transcript
- [ ] Step 1.5: Speaker identification (if transcript has "Speaker 1/2/3")
- [ ] Phase 0 FIRST: ask user to label speakers on the source platform (Feishu Minutes / Tencent Meeting), re-export, use labeled transcript
- [ ] Fallback only (source labeling unavailable or declined by user):
- [ ] Analyze speaker features (word count, style, topic focus)
- [ ] Match against context.md team directory (if provided)
- [ ] Present speaker mapping with per-speaker evidence to user for confirmation
- [ ] Step 1.6: Generate intelligent filename, confirm with user
- [ ] Step 1.7: Quality assessment (optional, affects processing depth)
- [ ] Step 2: Multi-turn generation (PARALLEL subagents with Task tool)
- [ ] Create transcript-specific dir: <output_dir>/intermediate/<transcript-name>/
- [ ] Launch 3 Task subagents IN PARALLEL (single message, 3 Task tool calls)
- [ ] Subagent 1 → <output_dir>/intermediate/<transcript-name>/version1.md
- [ ] Subagent 2 → <output_dir>/intermediate/<transcript-name>/version2.md
- [ ] Subagent 3 → <output_dir>/intermediate/<transcript-name>/version3.md
- [ ] Merge: UNION all versions, AGGRESSIVELY include ALL diagrams → draft_minutes.md
- [ ] Final: Compare draft against transcript, add omissions
- [ ] Step 3: Self-review for completeness
- [ ] Step 3.5: Retrieval Self-Test (consumption-side verification)
- [ ] Fresh-context subagent extracts future-query claims list from transcript ONLY (never sees draft) → intermediate/<transcript-name>/retrieval-claims.md
- [ ] Hit-test each claim against retrievable layer (Key Decisions / Action Items / Parking Lot / Open Questions), by component, with lexical anchors
- [ ] Revocation scan before ANY promotion; promote with [self-test promoted] tag + greppable verbatim quote; uncertain → Open Questions
- [ ] Report "enumerated N / hits M / promoted K / uncertain list" (never a binary pass); fail-open with visible NOT-RUN note if extraction fails
- [ ] Step 4: Present draft to user for human review
- [ ] Step 5: Cross-AI comparison (if human provides external AI output)
- [ ] Step 6: Iterate on human feedback (expect multiple rounds)
- [ ] Step 7: Human approves final version
Note: <output_dir> = directory where final meeting minutes will be saved (e.g., project-docs/meeting-minutes/)
Note: <transcript-name> = name derived from transcript file (e.g., 2026-01-15-product-api-design)
Analyze the transcript to identify:
Trigger: Transcript only has generic labels like "Speaker 1", "Speaker 2", "发言人1", etc.
When the transcript comes from a platform that supports manual speaker labeling (Feishu Minutes 飞书妙记, Tencent Meeting 腾讯会议, or any tool with a diarization-editing page), stop and ask the user to label the speakers at the source, then re-export/re-ingest the labeled transcript before generating minutes. Send the user the source page link — it is usually in the transcript's frontmatter (minute_url, meeting URL).
Why this beats inference:
[inferred] markers everywhere plus a per-speaker human review round; source labeling produces clean ground truth once.Fall back to Phase A–C below only when: (a) the user explicitly says to proceed by inference, or (b) the source cannot be labeled (raw audio file with no platform page, no edit permission). In the fallback, every mapping must carry evidence and a confidence level, unresolved labels stay as-is (never force-assign), and when the user later labels the source, go back and correct the minutes.
Fallback approach (inspired by Anker Skill):
For each speaker, analyze:
| Feature | What to Look For |
|---------|-----------------|
| Word count | Total words spoken (high = senior/lead, low = observer) |
| Segment count | Number of times they speak (frequent = active participant) |
| Avg segment length | Average words per turn (long = presenter, short = responder) |
| Filler ratio | % of filler words (对/嗯/啊/就是/然后) - low = prepared speaker |
| Speaking style | Formal/informal, technical depth, decision authority |
| Topic focus | Areas they discuss most (backend, frontend, product, etc.) |
| Interaction pattern | Do others ask them questions? Do they assign tasks? |
Example analysis output:
Speaker Analysis:
┌──────────┬────────┬──────────┬─────────────┬─────────────┬────────────────────────┐
│ Speaker │ Words │ Segments │ Avg Length │ Filler % │ Role Guess │
├──────────┼────────┼──────────┼─────────────┼─────────────┼────────────────────────┤
│ 发言人1 │ 41,736 │ 93 │ 449 chars │ 3.6% │ 主讲人 (99% of content)│
│ 发言人2 │ 101 │ 8 │ 13 chars │ 4.0% │ 对话者 (short responses)│
└──────────┴────────┴──────────┴─────────────┴─────────────┴────────────────────────┘
Inference rules:
- 占比 > 70% + 平均长度 > 100字 → 主讲人
- 平均长度 < 50字 → 对话者/响应者
- 语气词占比 < 5% → 正式/准备充分
- 语气词占比 > 10% → 非正式/即兴发言
When user provides a project context file (e.g., context.md):
Context file should include:
## Team Directory
| Name | Role | Communication Style |
|------|------|---------------------|
| Alice | Backend Lead | Technical, decisive, assigns backend tasks |
| Bob | PM | Product-focused, asks requirements questions |
| Carol | TPM | Process-focused, tracks timeline/resources |
CRITICAL: Never silently assume speaker identity.
Present analysis summary to user:
Speaker Analysis:
- Speaker 1 → Alice (Backend Lead) - 80% confidence based on: technical focus, task assignment pattern
- Speaker 2 → Bob (PM) - 75% confidence based on: product questions, requirements discussion
- Speaker 3 → Carol (TPM) - 70% confidence based on: timeline concerns, resource tracking
Please confirm or correct these mappings before I proceed.
After user confirmation, apply mappings consistently throughout the document.
Evaluate transcript quality to determine processing depth:
Scoring Criteria (1-10 scale):
| Factor | Score Impact |
|--------|-------------|
| Content volume | >10k chars: +2, 5-10k: +1, <2k: cap at 3 |
| Filler word ratio | <5%: +2, 5-10%: +1, >10%: -1 |
| Speaker clarity | Main speaker >80%: +1 (clear presenter) |
| Technical depth | High technical content: +1 |
Quality Tiers:
| Score | Tier | Processing Approach |
|-------|------|---------------------|
| ≥8 | High | Full structured minutes with all sections, diagrams, quotes |
| 5-7 | Medium | Standard minutes, focus on key decisions and action items |
| <5 | Low | Summary only - brief highlights, skip detailed transcription |
Example assessment:
📊 Transcript Quality Assessment:
- Content: 41,837 chars (+2)
- Filler ratio: 3.6% (+2)
- Main speaker: 99% (+1)
- Technical depth: High (+1)
→ Quality Score: 10/10 (High)
→ Recommended: Full structured minutes with diagrams
User decision point: If quality is Low (<5), ask user:
> "Transcript quality is low (碎片对话/噪音较多). Generate full minutes or summary only?"
A single pass will absolutely lose content. Use multi-turn generation with redundant complete passes:
Each pass generates COMPLETE minutes (all sections) from the full transcript. Multiple passes with isolated context catch different details. UNION merge consolidates all findings.
❌ WRONG: Narrow-focused passes (wastes tokens, causes bias)
Pass 1: Only extract decisions
Pass 2: Only extract action items
Pass 3: Only extract discussion
✅ CORRECT: Complete passes with isolated context
Pass 1: Generate COMPLETE minutes (all sections) → version1.md
Pass 2: Generate COMPLETE minutes (all sections) with fresh context → version2.md
Pass 3: Generate COMPLETE minutes (all sections) with fresh context → version3.md
Merge: UNION all versions, consolidate duplicates → draft_minutes.md
Pass 1: Read transcript → Generate complete minutes → Write to: <output_dir>/intermediate/version1.md
Pass 2: Fresh context → Read transcript → Generate complete minutes → Write to: <output_dir>/intermediate/version2.md
Pass 3: Fresh context → Read transcript → Generate complete minutes → Write to: <output_dir>/intermediate/version3.md
Merge: Read all versions → UNION merge (consolidate duplicates) → Write to: draft_minutes.md
Final: Compare draft against transcript → Add any remaining omissions → final_minutes.md
MUST use the Task tool to spawn multiple subagents with isolated context, each generating complete minutes:
Implementation using Task tool:
// Launch ALL 3 subagents in PARALLEL (single message, multiple Task tool calls)
Task(subagent_type="general-purpose", prompt="Generate complete meeting minutes from transcript...", run_in_background=false) → version1.md
Task(subagent_type="general-purpose", prompt="Generate complete meeting minutes from transcript...", run_in_background=false) → version2.md
Task(subagent_type="general-purpose", prompt="Generate complete meeting minutes from transcript...", run_in_background=false) → version3.md
// After all complete:
Main Agent: Read all versions → UNION merge, consolidate duplicates → draft_minutes.md
CRITICAL: Subagent Prompt Must Include:
Why multiple complete passes work:
Why isolated context matters:
Critical: Write each pass output to files, not conversation context.
Path Convention: All intermediate files should be created in a transcript-specific subdirectory under <output_dir>/intermediate/ to avoid conflicts between different transcripts being processed.
CRITICAL: Use transcript-specific subdirectory structure:
<output_dir>/intermediate/<transcript-name>/version1.md
<output_dir>/intermediate/<transcript-name>/version2.md
<output_dir>/intermediate/<transcript-name>/version3.md
Example: If final minutes will be project-docs/meeting-minutes/2026-01-14-api-design.md, then:
project-docs/meeting-minutes/intermediate/2026-01-14-api-design/version1.mdintermediate/ folder should be added to .gitignore (temporary working files)// Create transcript-specific subdirectory first
mkdir: <output_dir>/intermediate/<transcript-name>/
// Launch all 3 subagents IN PARALLEL (must be single message with 3 Task tool calls)
Task 1 → Write to: <output_dir>/intermediate/<transcript-name>/version1.md (complete minutes)
Task 2 → Write to: <output_dir>/intermediate/<transcript-name>/version2.md (complete minutes)
Task 3 → Write to: <output_dir>/intermediate/<transcript-name>/version3.md (complete minutes)
Merge Phase:
Read: <output_dir>/intermediate/<transcript-name>/version1.md
Read: <output_dir>/intermediate/<transcript-name>/version2.md
Read: <output_dir>/intermediate/<transcript-name>/version3.md
→ UNION merge, consolidate duplicates, INCLUDE ALL DIAGRAMS → Write to: draft_minutes.md
Final Review:
Read: draft_minutes.md
Read: original_transcript.md
→ Compare & add omissions → Write to: final_minutes.md
Benefits of file-based context offloading:
IMPORTANT: Always preserve intermediate versions in transcript-specific subdirectory:
<output_dir>/intermediate/<transcript-name>/version1.md, version2.md, version3.md - Each subagent outputintermediate/ to .gitignore - These are temporary working files, not final deliverablesmeeting-media/<meeting-name>/ folder and embed inline using !description syntax; include brief descriptions with the visuals - this creates "next level" human-readable minutes where readers understand what was discussed before reading the discussionAfter initial generation, immediately review against transcript:
Completeness Checklist:
- [ ] All discussion topics covered?
- [ ] All decisions have supporting quotes?
- [ ] All speakers attributed correctly?
- [ ] All action items have specific owners?
- [ ] Numerical values preserved (ranges, counts)?
- [ ] Entity relationships captured?
- [ ] State machines complete (all states listed)?
If gaps found, add missing content silently without mentioning what was missed.
Why this step exists. The three generation subagents share one prompt and one implicit model of "what a decision looks like" — their errors are correlated, so UNION merge protects against content *loss* but not against a shared blind spot. Step 3's checklist verifies the decisions you already identified; it cannot find what none of the passes classified as a decision. Meanwhile, minutes are consumed by *retrieval*: weeks later someone asks "did X ever say we must do Y?" and scans the Key Decisions / Action Items tables. A directive that lives only in Discussion prose fails that query even though no content was "lost". This step tests that terminal property directly. (Honest scope: it is a second, partially-decorrelated recall layer — not an oracle. Known blind spots it does NOT cover: assertions whose pragmatic force contradicts their phrasing ("fine, do it without load-testing, just don't say I didn't warn you" = an on-record objection), and silent-consent moments that produce no utterance at all.)
Procedure (after merge, before presenting the draft):
> Imagine project members returning 1–8 weeks from now to verify: "did [person] ever instruct / promise / decide / veto / commit-a-number on X?" Enumerate every such claim. Each claim = who + type (instruction / promise / decision / veto / number-commitment / conditional-consensus) + content + scope (+ expiry condition if any) + timestamp. Include only claims with a clear owner; skip opinions and background narration.
For long transcripts (roughly > 60k characters or > 90 minutes), extract in overlapping chunks and merge — a single pass inherits lost-in-the-middle attention decay exactly where long meetings bury directives. Write the list to <output_dir>/intermediate/<transcript-name>/retrieval-claims.md (auditable evidence that the check ran, and reviewable by the human later).
[self-test promoted], with a verbatim quote + timestamp that can be grepped back to the transcript (a promotion without a greppable quote is rejected — this caps hallucinated-claim risk).enumerated N / hits M / promoted K / uncertain list and show it alongside the draft. Promoted rows are exactly what the human should review hardest — unlike Step 3's silent gap-filling, promotions are never silent.Present the complete minutes as a draft for human review. Emphasize:
User may:
When human provides output from another AI tool (e.g., Gemini, ChatGPT, etc.):
This step is valuable because:
Comparison Process:
Example findings from cross-AI comparison:
When user requests deeper review ("deep review", "check again", "anything missing"):
When user provides another version to merge:
Merge Principle: UNION, never remove
During merge phase, MUST aggressively include ALL diagrams from ALL versions.
Diagrams are high-value content that took effort to generate. Different subagents may produce different diagrams based on what they focused on. Missing a diagram during merge is a significant loss.
Merge diagram strategy:
Common diagram types to look for:
Example: Missed diagram from v3
If v3 has a flowchart for "Status Query Mechanism" but v1/v2 don't have it, that flowchart MUST appear in the merged output. Don't assume it's covered by other diagrams.
| File | When to Load |
|------|--------------|
| meeting_minutes_template.md | First generation - Contains template structure |
| completeness_review_checklist.md | During review steps - Contains completeness checks |
| context_file_template.md | When helping user create context.md - Contains team directory template |
| Project context file (user-provided) | When user provides project-specific context (team directory, terminology, conventions) |
Full pipeline for .docx transcripts:
Step 0: doc-to-markdown # Convert .docx → Markdown (preserves tables/images)
↓
Step 0.5: transcript-fixer # Fix ASR errors (optional, if quality is poor)
↓
Step 1+: meeting-minutes-taker # Generate structured minutes
Commands:
# 1. Install markitdown (one-time)
uv tool install "markitdown[pdf]"
# 2. Convert .docx to markdown
markitdown "录音转写.docx" -o transcript.md
# 3. Then use meeting-minutes-taker on transcript.md
Benefits of combo workflow:
Diagrams elevate meeting minutes beyond pure text. They make complex discussions immediately understandable for human reviewers. Always look for opportunities to add visual diagrams.
sequenceDiagram
participant FE as Frontend
participant BE as Backend
participant SVC as External Service
participant DB as Database
FE->>BE: Click "Submit Order"
BE->>SVC: POST /process (send data)
SVC-->>BE: Return {status}
BE->>DB: Save result
BE-->>FE: Return success
erDiagram
ORDER ||--o{ ORDER_ITEM : "1:N"
ORDER {
uuid id PK
string customer_name
decimal total_amount
}
ORDER_ITEM {
uuid id PK
uuid order_id FK
int quantity
}
sequenceDiagram
participant User
participant System
Note over System: Current: V2 Active
User->>System: Create V3 (inactive)
User->>System: Set V2 inactive
User->>System: Set V3 active
Note over System: New: V3 Active
Quotes MUST use proper markdown blockquote format on separate lines:
❌ WRONG: Inline quote format
* **Quote:** > "This is wrong" - **Speaker**
✅ CORRECT: Blockquote on separate lines
* **Quote:**
> "This is the correct format" - **Speaker**
✅ CORRECT: Multiple quotes
* **Quote:**
> "First quote from the discussion" - **Speaker1**
> "Second quote supporting the same decision" - **Speaker2**
Key formatting rules:
* Quote: on its own line (no quote content on this line)* Quote:> prefix- SpeakerName### 2.X [Category] Decision Title
* **Decision:** Specific decision made
* **Logic:**
* Reasoning point 1
* Reasoning point 2
* **Quote:**
> "Exact quote from transcript" - **Speaker Name**
Items with keywords like "defer to later", "Phase 2", "not in MVP" go to Parking Lot with context.
Meeting minutes are not one-shot outputs. High-quality minutes emerge through multiple review cycles:
Round 1: Initial generation
└─ Human review: "Check original transcript for missing items"
Round 2: Deep transcript review, add omitted content
└─ Human review: "UserProfile conflicts with existing Account entity naming"
Round 3: Update terminology to use "CustomerProfile" instead
└─ Human review: "Note field conflicts with existing Comment system"
Round 4: Update to use "Annotation" instead of "Note"
└─ Human approval: Final version ready
The AI generates the first draft; humans refine to the final version. Never assume the first output is complete or uses correct terminology. Always encourage human review and be ready for multiple iteration cycles.
intermediate/<transcript-name>/ to avoid conflicts> "quote"doc.md); use plain text for external/local documents not in the repositoryAfter structuring meeting minutes, suggest exporting:
Meeting minutes complete: [N] decisions, [M] action items captured.
Options:
A) Export as PDF — run /daymade-docs:pdf-creator (Recommended for sharing)
B) Export as slides — run /daymade-docs:ppt-creator (for presentation)
C) No thanks — the markdown is sufficient
Take daymade/meeting-minutes-taker from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.