# Voc Source Notes

> Pull customer signal from AI meeting notes (Granola, Fathom, Otter, Fireflies notes, Notion meeting docs). Covers the conversations your call recorder missed — in-person meetings, conferences, calls on a personal phone. Trigger on /voc-source-notes, "pull my meeting notes", "what came up in meetings this week".

- Skill: `aatirar/voc-source-notes` (Agent Skill)
- Install (CLI): `npx skillmds@latest add aatirar/voc-source-notes`
- Raw SKILL.md: https://api.skillmd.com/api/skills/aatirar/voc-source-notes/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: aatirar (https://skillmd.com/u/aatirar)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/aatirar/voc-source-notes

---


# /voc-source-notes — Mine Meeting Notes

Your call recorder captures scheduled video calls on a work account. It misses the conference
hallway conversation, the in-person QBR, the dial-in from a phone, and the meeting someone
forgot to admit the bot to. Meeting-notes apps catch a different slice, and the two sets overlap
less than people assume.

Notes are lower fidelity than transcripts — summarized, not verbatim. Treat them accordingly and
the pipeline will weight them correctly.

## Requires

| What | Value |
|---|---|
| Notes MCP server or export | Granola, Fathom, Otter, Fireflies, or a Notion database of meeting docs |
| Config | `context/product-context.md` → `notes_source`, `internal_meeting_patterns` |
| Cost | Free on most plans. |

### Wiring the tools

**Tool names are not hardcoded here on purpose.** Run `/mcp` to see what your notes server
exposes, then add those names to `allowed-tools`. A skill that declares a tool from a different
product entirely will fail silently at its first call, which is exactly the class of bug this
repo is trying not to ship.

No MCP server for your notes app? Most export to markdown. Point `notes_source` at the export
directory and this skill reads the files directly with Glob and Read.

---

## Execution

### Step 1 — Find customer-facing meetings

Pull meetings in the window, then **exclude internal ones**. Default exclusion patterns —
extend them in your context file:

`standup` · `1:1` · `1-1` · `retro` · `planning` · `all hands` · `allhands` · `sync` ·
`interview` · `review` (when no external domain is present) · `team` · `offsite`

The reliable test is the attendee list: if every attendee is on an internal domain, it is an
internal meeting regardless of the title. Use the title patterns only when attendees are missing.

### Step 2 — Extract signal, not summary

A meeting note is already a summary. Summarizing it again produces mush. Instead, pull only:

| What | Rule |
|---|---|
| Quoted customer statements | Notes apps mark these with quotation marks or a "they said" construction. **These are your only true verbatims from this source.** |
| Stated pains and blockers | Usually under a "concerns" or "challenges" heading |
| Requests and asks | Under "action items" or "follow-ups" — filter for things the *customer* asked for, not tasks your team assigned itself |
| Competitor mentions | Any named vendor |
| Decision criteria | "They need X before they can move forward" |

Everything else — agenda, attendees, next steps for your own team — is not VoC.

### Step 3 — Mark fidelity honestly

Every signal from this source carries `fidelity: "summarized"` unless it is inside quotation
marks in the original note, in which case `fidelity: "verbatim"`.

This matters more than it sounds. A summarized signal is fine for detecting a pattern and
**unusable as a published quote**. Downstream, `/voc-dispatch` will refuse to put a summarized
signal in a testimonial, and it can only do that if this field is honest.

### Step 4 — Write

`outputs/voc/sources/notes/<date>-<slug>.json`:

```json
{
  "channel": "notes",
  "verbatim": "...",
  "fidelity": "summarized",
  "company": "...",
  "attendee_roles": ["VP Marketing", "RevOps Manager"],
  "meeting_title": "...",
  "meeting_date": "2026-04-22",
  "signal_type": "pain",
  "source_link": "..."
}
```

Report: meetings scanned, internal excluded, customer-facing analyzed, signals extracted, and
the verbatim-to-summarized split.

---

## Overlap with call transcripts

If both this skill and `/voc-source-calls` cover the same meeting, you will double-count it —
and since they are different *channels*, the confirmation rule will treat one conversation as two
independent sources. That is the single most damaging failure mode in this pipeline, because it
manufactures confidence out of nothing.

**Deduplicate on company plus date plus approximate title** before profiling. When both exist,
**keep the transcript and drop the note.** Verbatim beats summarized every time.

The synthesis step cannot catch this for you. It has to happen here.

---

## What this gets wrong

- **Notes are one attendee's reconstruction**, shaped by what the AI notetaker's model found
  salient. Two notetakers on the same meeting produce different notes.
- **Quotation marks in notes are not always verbatim.** Some tools add them stylistically. Spot
  check a few against a recording before trusting the fidelity flag completely.
- **Coverage is uneven.** People remember to run a notetaker for important meetings and forget
  for routine ones, which biases the corpus toward high-stakes conversations.
- **In-person notes are the thinnest.** Typed after the fact, from memory, usually the shortest
  and least reliable records in the set.

