◇ Meeting Notes → Actions Agent Python · Whisper · pyannote · Claude · Slack Project Blueprint
Meeting Follow-Through

Everyone leaves knowing what they own.

Drop in a recording or a transcript. It writes the summary, pulls out every commitment that was made, works out who owns each one and when it's due, then sends each person a message containing only their items. Anything it can't confidently assign is flagged before a single task goes out.

Below, the run, what comes out, and how it's built.
01

From Meeting to Assigned Work

Two ways in, two agents running at once, and a check for unowned work before anyone is told to do anything.

Recording any meeting audio 🎤 Transcribe and tell voices apart 💬 📄 Transcript already text? skip ahead one transcript two agents, at once Summary & decisions Action items kept & searchable Meeting record Owner + deadline all owners clear? personal messages Owner A — 3 items Owner B — 1 item Owner C — 2 items Unassigned → flagged before anything is sent
you drop it in runs automatically needs a person

two ways in

recording → transcribed, speakers identified
transcript → straight in

then, on one transcript

📝
Summarise
Topics, context, and the decisions made.
Extract actions
Every task, commitment, and follow-up said out loud.
📅
Owner + deadline
Who owns it, and "next Tuesday" as a real date.
every item owned → each person gets only their own
anything unassigned → flagged before sending
↓ the meeting record is kept — summary, actions, and decisions, searchable per owner
02

Inside Each Step

🎤

01 Bring the meeting in

A recording from whatever platform the team already uses, or a raw transcript if one exists. Both are accepted, which matters more than it sounds — the moment a tool requires a particular calendar integration or a bot invited to every call, half the meetings stop going through it.

audio file or transcript · no per-meeting setup
💬

02 Transcribe, and tell the voices apart

Audio becomes text, and speaker diarisation separates who said what. That second half is not a transcript nicety — it's the thing that makes ownership assignable later. A transcript that knows a commitment came from a specific speaker is a task; one that doesn't is a paragraph.

Whisper API · pyannote.audio speaker diarisation
📝

03 Two agents read it at once

One writes the summary — the topics, the context, and the decisions, in plain English for someone who wasn't in the room. The other goes looking for commitments: every task, promise, and follow-up that was actually said out loud. They run simultaneously because they're answering different questions about the same hour.

Claude API · summary writer + action extractor
📅

04 Owner, deadline, decision

Each action item gets matched to a known team member by name, role, or the way people actually refer to each other mid-conversation. Timeframes get resolved into real dates, so "by end of week" and "before the launch" become something a calendar can hold. Formal decisions are captured separately from tasks, because a decision isn't work — it's the record of why the work exists.

Claude API · owner matching · deadline parsing · decision log

05 The check for unowned work

If every item has a clear owner, the run proceeds on its own. If any item doesn't, a warning goes out flagging exactly which ones need a human decision before tasks are created. Orphaned work is the specific failure this whole system exists to prevent, so quietly assigning an item to a best guess would defeat the point.

owner validation gate · flagged before dispatch
📩

06 Everyone gets only their own

Each owner receives a direct message listing their items, each with its deadline and enough meeting context to make sense of it a day later. Nobody scrolls a shared document looking for their name. The complete record — summary, all items, decisions — is persisted, so the meeting stays searchable and each person's outstanding work can be pulled up on its own.

Slack direct messages · Postgres meeting record
Why diarisation is not optional

"I'll take that" is only useful if you know who said it.

Most of the commitments in a real meeting are made in the first person and never repeat the speaker's name. Strip the speaker labels out and you're left with a wall of text containing genuine obligations and no way to route any of them — which is precisely the state an unprocessed meeting already leaves you in. Knowing who was talking is what turns transcription into assignment.

03

What Comes Out of an Hour

Five distinct outputs, kept separate on purpose — they're read by different people at different times.

SUMMARY
What the meeting was about

Topics, context, and the reasoning, written for someone who wasn't there. This is the artefact that replaces "can you catch me up?" the following morning.

ACTIONS
Every commitment that was made

Not just the ones written on a whiteboard — the ones said in passing, which are the items that historically evaporate the moment the call ends.

OWNERS
Who each item belongs to

Matched to real team members rather than to whatever name appeared nearest in the text. Where the match isn't confident, the item is held back rather than mis-assigned.

DEADLINES
Vague timing, resolved to dates

"Next week", "before the launch", "end of month" all become actual dates. A deadline that can't be sorted or reminded on isn't a deadline.

DECISIONS
The record, kept separately

Decisions are logged apart from tasks because they serve a different purpose — nobody needs to do them, but in three months someone will need to know they were made and why.

04

Architecture

Transcription in, a fan of agents across the middle, and a gate before anything reaches a person.

Intake and transcription

Whisper API · pyannote.audio

Audio becomes text with speaker labels attached. A supplied transcript skips this tier entirely and joins the run at the same point.

In parallel

Summary writer

Claude API

Produces the readable account of the meeting — topics, context, and the decisions reached.

In parallel

Action extractor

Claude API

Finds every commitment in the conversation, including the ones made in passing and never written down.

Downstream

Enrichment agents

owner · deadline · decision log

Attach an owner and a real date to each item, and split formal decisions out into their own record.

Validation and delivery

owner gate · Slack direct messages · Postgres

Holds the run if anything is unowned, then splits the item list per person so each message contains one person's work. The full record is persisted for search and per-owner views.

05

How It's Built

Six modular blocks. The meeting source and the notification channel swap per client; the gate and the per-owner split don't.

01

Transcriber

audio to text

Turns any recording into a usable transcript.

02

Speaker ID

attribution

Separates who said what, so items can be owned.

03

Summariser

the record

Writes the account for people who weren't there.

04

Extractor

commitments

Finds every task actually promised out loud.

05

Assigner

owner + date

Matches people, resolves vague timing to real dates.

06

Notifier

delivery

One message per person, containing only their work.

06

Stack

Python Whisper API pyannote.audio Claude API PostgreSQL Supabase Slack