/meeting-ingestion
Ingest meeting transcripts from ANY meeting recorder into brain pages with attendee enrichment, entity propagation, and timeline merge. One unified pipeline: normalize the source into a standard transcript record, split multi-meeting recordings, resolve speakers by evidence,
Claude Code
$ npx -y skills add garrytan/gbrain --skill meeting-ingestion --agent claude-code
Codex
$ npx skills add garrytan/gbrain --skill meeting-ingestion -a codex -y
Cursor
$ npx skills add garrytan/gbrain --skill meeting-ingestion -a cursor -y
Gemini CLI
$ npx skills add garrytan/gbrain --skill meeting-ingestion -a gemini-cli -y
GitHub Copilot
$ npx skills add garrytan/gbrain --skill meeting-ingestion -a github-copilot -y
OpenCode
$ npx skills add garrytan/gbrain --skill meeting-ingestion -a opencode -y
Windsurf
$ npx skills add garrytan/gbrain --skill meeting-ingestion -a windsurf -y
SKILL.md
meeting-ingestion.SKILL.mdname: meeting-ingestion
version: 2.2.0
description: |
Ingest meeting transcripts from ANY meeting recorder into brain pages with
attendee enrichment, entity propagation, and timeline merge. One unified
pipeline: normalize the source into a standard transcript record, split
multi-meeting recordings, resolve speakers by evidence, create the page,
pass every surprising claim through the consistency check (transcript +
brain + plausibility), enrich every entity, then run the verification
checklist — substance AND sequence. A meeting is NOT fully ingested until
the enrich skill has processed every entity AND the verification checklist
passes, including the sequence verify (PASS or explicit user waive).
triggers:
- "meeting transcript"
- "process this meeting"
- "meeting notes"
- "meeting recorder"
- "ingest this recording"
- "capture meetings"
- "audit this meeting"
- "check the sequence"
- "did I get the order right"
- meeting transcript received
tools:
- search
- query
- get_page
- put_page
- add_link
- add_timeline_entry
- get_timeline
- chronicle_day
mutating: true
writes_pages: true
writes_to:
- meetings/
- people/
- companies/
upstream:
- meeting-ingestion@fc834ee
- meeting-gold-standard@fc834ee
- chronology-guard@fc834ee
Meeting Ingestion Skill — Unified Pipeline
> **Filing rule:** Read `skills/_brain-filing-rules.md` before creating any new page.
> **Convention:** See `skills/conventions/quality.md` for Iron Law back-linking, and > `skills/conventions/brain-first.md` for the lookup chain — resolve every name > against the brain BEFORE reaching for external lookups.
Contract
This skill guarantees:
- Works with ANY meeting recorder — AI notetaker export, webhook payload, share
link, raw audio transcription, or manual paste. The normalized transcript record (below) is the contract; per-source fetch/parse is the host agent's job
- One brain page per REAL meeting — multi-meeting recordings are split first
- Meeting page created with attendees, summary, key decisions, action items,
notable quotes
- Speakers resolved by evidence, never by guess
- Recorder auto-summaries treated as CLAIMS, not facts — every surprising claim
passes the consistency check before it touches an entity page
- EVERY attendee gets a people page (created or updated)
- EVERY company discussed gets entity propagation
- Timeline entries on ALL mentioned entities (timeline merge)
- Back-links created bidirectionally
- Meeting is NOT fully ingested until enrich runs for every entity
- The meeting is never REPORTED as ingested until the verification checklist
(below) passes — every quote grounded, every slug backed by a page and a timeline backlink, every speaker resolved or flagged
- The narrated SEQUENCE is verified independently of substance: a sequence
contradiction BLOCKS ingestion until fixed or explicitly waived by the user
Every attendee and company mentioned MUST get a back-link from their page to the meeting page. An unlinked mention is a broken brain.
Any recorder, one pipeline
Meeting content arrives from many sources: an AI notetaker (Granola and Circleback are common examples), a phone voice memo, a video-call transcript export, or a transcript the user pastes directly. Do NOT build per-vendor pipelines or paraphrase this skill in ad-hoc instructions — normalize whatever the source provides into the transcript record below, then run the shared phases. Source-specific logic ends at normalization.
The normalized transcript record
Before running the pipeline, reduce the input to this shape (mentally or as a scratch file — it does not get written to the brain as-is):
source: "<recorder name, or 'manual'>"
source_id: "<unique recording id from the source, if any>"
title: "Meeting Title"
date: YYYY-MM-DD
time: "HH:MM TZ" # null if unknown
duration: "45m" # null if unknown
attendees: # the SOURCE'S notion of who was there —
- name: "..." # may need correction during speaker resolution
email: "..." # only if the source provides it
role: "..." # only if known
transcript_segments: # structured form when the source diarizes
- speaker: "..." # resolved name OR "UNKNOWN_N" if unresolved
speaker_raw: "..." # the source's raw speaker label, for traceability
text: "..."
raw_transcript_text: "..." # the complete transcript. NEVER truncate.
source_summary: "..." # the recorder's AI summary if present — a CLAIM, not a FACT
source_url: "..." # link back to the source platform, if any**Invariants:**
- `raw_transcript_text` is complete and untruncated. Always.
- `attendees` is a claim by the source. People invited ≠ people present.
- `source_summary` is TWO lossy layers deep (speech-to-text, then AI
summarization). Both layers confabulate. Verify before writing anything from it into the brain.
Retain the raw transcript when the source provides one: file it as a sidecar page with `type: source` at `sources/meetings/YYYY-MM-DD-{slug}-transcript` (the default pack files raw evidence as `source` under `sources/`; never invent `meeting-transcript`, and don't write the `transcript` alias) or keep the source file reachable, and link it from the meeting page. The transcript is the canonical evidence for every quote and claim check downstream. Put `facts_backstop: false` in the sidecar's frontmatter: automatic fact extraction would otherwise mine the raw transcript, garbles and banter included, beside the verified meeting page (Phase 5).
**Redact before you retain.** A raw transcript routinely captures pasted secrets and PII (a read-aloud API key, a screen-shared token, a private phone number). Before writing the sidecar, scan for secret-shaped strings (`sk-…`, `ghp_…`, `AKIA…`, bearer tokens, long hex/base64 blobs) and PII, and redact matches to
Read more
name: meeting-ingestion version: 2.2.0 description: | Ingest meeting transcripts from ANY meeting recorder into brain pages with attendee enrichment, entity propagation, and timeline merge. One unified pipeline: normalize the source into a standard transcript record, split multi-meeting recordings, resolve speakers by evidence, create the page, pass every surprising claim through the consistency check (transcript + brain + plausibility), enrich every entity, then run the verification checklist — substance AND sequence. A meeting is NOT fully ingested until the enrich skill has processed every entity AND the verification checklist passes, including the sequence verify (PASS or explicit user waive). triggers: - "meeting transcript" - "process this meeting" - "meeting notes" - "meeting recorder" - "ingest this recording" - "capture meetings" - "audit this meeting" - "check the sequence" - "did I get the order right" - meeting transcript received tools: - search - query - get_page - put_page - add_link - add_timeline_entry - get_timeline - chronicle_day mutating: true writes_pages: true writes_to: - meetings/ - people/ - companies/ upstream: - meeting-ingestion@fc834ee - meeting-gold-standard@fc834ee - chronology-guard@fc834ee
Meeting Ingestion Skill — Unified Pipeline
> **Filing rule:** Read `skills/_brain-filing-rules.md` before creating any new page.
> **Convention:** See `skills/conventions/quality.md` for Iron Law back-linking, and > `skills/conventions/brain-first.md` for the lookup chain — resolve every name > against the brain BEFORE reaching for external lookups.
Contract
This skill guarantees:
- Works with ANY meeting recorder — AI notetaker export, webhook payload, share
link, raw audio transcription, or manual paste. The normalized transcript record (below) is the contract; per-source fetch/parse is the host agent's job
- One brain page per REAL meeting — multi-meeting recordings are split first
- Meeting page created with attendees, summary, key decisions, action items,
notable quotes
- Speakers resolved by evidence, never by guess
- Recorder auto-summaries treated as CLAIMS, not facts — every surprising claim
passes the consistency check before it touches an entity page
- EVERY attendee gets a people page (created or updated)
- EVERY company discussed gets entity propagation
- Timeline entries on ALL mentioned entities (timeline merge)
- Back-links created bidirectionally
- Meeting is NOT fully ingested until enrich runs for every entity
- The meeting is never REPORTED as ingested until the verification checklist
(below) passes — every quote grounded, every slug backed by a page and a timeline backlink, every speaker resolved or flagged
- The narrated SEQUENCE is verified independently of substance: a sequence
contradiction BLOCKS ingestion until fixed or explicitly waived by the user
Every attendee and company mentioned MUST get a back-link from their page to the meeting page. An unlinked mention is a broken brain.
Any recorder, one pipeline
Meeting content arrives from many sources: an AI notetaker (Granola and Circleback are common examples), a phone voice memo, a video-call transcript export, or a transcript the user pastes directly. Do NOT build per-vendor pipelines or paraphrase this skill in ad-hoc instructions — normalize whatever the source provides into the transcript record below, then run the shared phases. Source-specific logic ends at normalization.
The normalized transcript record
Before running the pipeline, reduce the input to this shape (mentally or as a scratch file — it does not get written to the brain as-is):
source: "<recorder name, or 'manual'>"
source_id: "<unique recording id from the source, if any>"
title: "Meeting Title"
date: YYYY-MM-DD
time: "HH:MM TZ" # null if unknown
duration: "45m" # null if unknown
attendees: # the SOURCE'S notion of who was there —
- name: "..." # may need correction during speaker resolution
email: "..." # only if the source provides it
role: "..." # only if known
transcript_segments: # structured form when the source diarizes
- speaker: "..." # resolved name OR "UNKNOWN_N" if unresolved
speaker_raw: "..." # the source's raw speaker label, for traceability
text: "..."
raw_transcript_text: "..." # the complete transcript. NEVER truncate.
source_summary: "..." # the recorder's AI summary if present — a CLAIM, not a FACT
source_url: "..." # link back to the source platform, if any**Invariants:**
- `raw_transcript_text` is complete and untruncated. Always.
- `attendees` is a claim by the source. People invited ≠ people present.
- `source_summary` is TWO lossy layers deep (speech-to-text, then AI
summarization). Both layers confabulate. Verify before writing anything from it into the brain.
Retain the raw transcript when the source provides one: file it as a sidecar page with `type: source` at `sources/meetings/YYYY-MM-DD-{slug}-transcript` (the default pack files raw evidence as `source` under `sources/`; never invent `meeting-transcript`, and don't write the `transcript` alias) or keep the source file reachable, and link it from the meeting page. The transcript is the canonical evidence for every quote and claim check downstream. Put `facts_backstop: false` in the sidecar's frontmatter: automatic fact extraction would otherwise mine the raw transcript, garbles and banter included, beside the verified meeting page (Phase 5).
**Redact before you retain.** A raw transcript routinely captures pasted secrets and PII (a read-aloud API key, a screen-shared token, a private phone number). Before writing the sidecar, scan for secret-shaped strings (`sk-…`, `ghp_…`, `AKIA…`, bearer tokens, long hex/base64 blobs) and PII, and redact matches to
Other skills on gbrain.
More skills from other plugins.
agent-cost-report
Believable agent cost report for any period, default the last 7 full days PT, not counting today. Measured tokens from Claude…
bot-handoff
Keep a durable record of work passed between Bots in the shared Hindsight memory bank. Use when handing work to another Bot, when…
mempalace
Install, configure, and operate MemPalace, including a private local palace, a shared-brain hub, or a client joining an existing…
mempalace
Install, configure, and operate MemPalace, including a private local palace, a shared-brain hub, or a client joining an existing…
Questions about meeting-ingestion.
- Which coding agents can use meeting-ingestion?
- meeting-ingestion installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

