Meetings aren't the problem.
Untracked action items are the problem.
If you've ever ended a call with:
- "Cool, we'll follow up."
- "Someone should look into that."
- "Let's circle back."
…then you know how work disappears.
Here's a workflow that turns messy notes into:
- action items (with owners + due dates)
- decisions
- risks / open questions
- a short status update you can paste into Slack
And you can automate the boring parts with a tiny script.
Step 1: capture raw notes (don't overthink it)
Your input can be:
- bullet notes you typed during the meeting
- a transcript
- a doc someone shared
The quality of the notes matters less than having them in one place.
Step 2: use a structured extraction prompt
The trick is to force output structure.
You are my project ops assistant.
Given the meeting notes below, extract:
- decisions
- action_items (each with owner, due_date, description)
- risks
- open_questions
Rules:
- If an owner is missing, set owner to "TBD".
- If a due date is missing, propose one (and mark it as "proposed").
- Keep descriptions short and specific.
Output STRICT JSON with this schema:
{
"decisions": ["string"],
"action_items": [{"owner":"string","due_date":"string","due_date_is_proposed":true,"description":"string"}],
"risks": ["string"],
"open_questions": ["string"]
}
Meeting notes:
<PASTE>
Now you can validate and store it.
Step 3: generate the human-friendly summary
Once you have JSON, generate the message you'll actually send.
Turn this JSON into a concise update for the team.
Format:
- Decisions (bullets)
- Action items (checkbox list)
- Risks / blockers
- Open questions
Keep it under 15 lines.
JSON:
<PASTE>
Step 4 (optional): automate with a script
You don't need a full workflow platform.
Here's a minimal Node script concept:
import fs from 'node:fs/promises'
const notes = await fs.readFile(process.argv[2], 'utf8')
const prompt = `...your JSON extraction prompt...\n\nMeeting notes:\n${notes}`
const json = await llm(prompt) // call your model here
await fs.writeFile('out/meeting.json', json)
const summaryPrompt = `Turn this JSON into a concise update...\n${json}`
const summary = await llm(summaryPrompt)
await fs.writeFile('out/summary.md', summary)
console.log(summary)
The win isn't the code.
The win is that every meeting produces the same artifacts:
-
meeting.json(machine-readable) -
summary.md(shareable)
Practical tips
- Keep "action items" extremely specific ("Add retry with idempotency key") instead of vague ("Improve reliability").
- Assign owners. "Team" is not an owner.
- If the model proposes due dates, treat them as suggestions and adjust.
- Store action items somewhere real (Jira/GitHub/Notion). The model is not your source of truth.
If you want more templates like this (AI workflows, prompt chains, review prompts, debugging playbooks), I'm building a Prompt Engineering Cheatsheet at Nova Press.
Free sample: https://getnovapress.gumroad.com
Top comments (0)