Prowrit / prompt engineering studio
pipeline · 3 steps

The Meeting Ledger — the workflow, engineered

You want: every decision and commitment from the meeting on record, a name and a date on each — nothing quietly dropped.

why this shape extraction and writing fail differently — the extractor's temptation is to smooth over unclaimed work, the writer's is to editorialize — so the table becomes the single source of truth and a fresh-eyes check walks the transcript for anything commitment-shaped that escaped

✓ Reviewed before you saw it passed all 5 checks — an automated, fresh-context review

how this was engineeredanalyzed 2 assumptions surfaceddesigned 3 steps · 1 gatereviewed 5/5 checks ✓

3 chat runs · 1 thing you paste in · quality-checked (retries ≤2×)

you start withthe full meeting transcript↓ the meeting record: numbered decisions (OPE…↓ the summary and the ready-to-send follow-up…↓ ✓ pass — continuesyou geta decision record, an action table where every row has anowner or a visible flag, and a follow-up email ready to…1agentExtractorpull decisions and commitments out of the transcriptin two passes, flagging unowned and undated items2agentFollow-up Writerturn the decision record and action table into asummary and a follow-up email — the table is the…3quality checkCoverage Checkwalk the transcript against the record and the email— nothing commitment-shaped escapes, no owner gets…↩ fix-list — back to 1. Extractor · ≤2×

The Meeting Ledger — the workflow in words

Shape: pipeline. 3 steps, in this order.

  1. Step 1 of 3: Extractor — Agent. pull decisions and commitments out of the transcript in two passes, flagging unowned and undated items. Takes the material you supply. Produces the meeting record: numbered decisions (OPEN items marked) and the four-column action table.
  2. Step 2 of 3: Follow-up Writer — Agent. turn the decision record and action table into a summary and a follow-up email — the table is the only source. Takes Extractor. Produces the summary and the ready-to-send follow-up email, flags intact.
  3. Step 3 of 3: Coverage Check — Quality check. walk the transcript against the record and the email — nothing commitment-shaped escapes, no owner gets invented. Takes Follow-up Writer. Produces PASS, or a numbered fix-list traced to transcript lines. On failure, sends its fix-list back to Extractor, up to 2 times.

Final output: a decision record, an action table where every row has an owner or a visible flag, and a follow-up email ready to send

in plain words The Extractor combs your transcript twice — once for decisions in the words the room used, once for commitments into a task-owner-due table that flags anything unclaimed; the Follow-up Writer turns that table into the summary and email; the Coverage Check walks the transcript line by line to catch any commitment that escaped.

What you'll walk away with — an excerpt from a real run of this workflow

FROM THE ACTION TABLE (5 items extracted, 2 flagged):

TASK: Stripe webhook migration — rewrite retry logic
OWNER: (UNASSIGNED — flagged)   DUE: before Aug 2 audit (inferred — needs confirmation)

TASK: Onboarding cohort analysis (61→54% activation drop)
OWNER: Priya   DUE: next Wednesday (stated explicitly)

TASK: SOC 2 prep — walk last year's runbook, flag what changed
OWNER: (UNASSIGNED — flagged)   DUE: before Aug 2 (inferred)

A DECISION, CAPTURED WITH ITS NUANCE:
"No rollback of the pricing page change pending Priya's cohort analysis…
NOTE: Priya's position was not full agreement — this is a procedural hold,
not a settled disagreement."

THE COVERAGE CHECK: PASS — "Riskiest item to chase first: webhook migration
ownership… every day this stays unowned is a day of margin burned on the
highest-consequence technical task in the set."

What I assumed — if a guess is wrong, fix the brief and rerun

  • assumed the transcript is pasteable text with recognizable speakers (a recorder export, chat log, or typed notes) — not audio
  • assumed 'who owns what' means owners the meeting actually produced — unclaimed items get flagged, never guessed

Would sharpen the result

  • the attendee list with roles — it sharpens owner attribution when the transcript uses first names or initials

Run it — 3 steps, in this order

Extractor reads the transcript → Follow-up Writer works only from the table → Coverage Check re-reads the transcript against both; a fix-list goes back to the Extractor, then re-run the Writer on the corrected table. Any text with speakers works — a recorder export (most tools: meeting → Transcript → copy), a chat log, or your own running notes.

  1. 1

    Extractor

    Agent◆ your strongest model

    pull decisions and commitments out of the transcript in two passes, flagging unowned and undated items

    give it your material — whatever this step's {{PLACEHOLDER}} asks for it returns the meeting record: numbered decisions (OPEN items marked) and the four-column action table
    Show the prompt for this step
    ## Role
    You are a meeting analyst turning a raw transcript into a record people can be held to. Loose talk gets recorded precisely; anything left hanging gets flagged, never smoothed over.
    
    ## The transcript
    ```
    {{PASTE_THE_FULL_MEETING_TRANSCRIPT_HERE}}
    ```
    
    ## Pass 1 — decisions
    1. Read the whole transcript before extracting anything — decisions get revisited, and only the last word counts.
    2. A decision is a question the room resolved. Record each as: DECISION (wording as close to what was actually said as the transcript allows) · DECIDED BY (who said it, and who agreed) · CONTEXT (one line on why).
    3. Disagreement without resolution is not a decision. Record it as OPEN with each position in one line — never invent a consensus the room didn't reach.
    
    ## Pass 2 — action items (start only after pass 1 is complete)
    Sweep the transcript again for commitments and put every one into a fixed four-column table: TASK · OWNER · DUE · DEPENDENCY. Rules for the ways these go wrong:
    1. Nobody claimed it → OWNER is "(UNASSIGNED — flagged)". Never default to the person who raised the topic; raising a problem is not volunteering for it.
    2. The date was vague ('soonish', 'after launch', 'next sprint') → DUE is "inferred: <your best reading>, needs confirmation". Never print a bare date the transcript doesn't state.
    3. A soft claim ('I can take a look') is still a claim — record that owner, and note the softness in DEPENDENCY if it matters.
    4. No dependency → write "—", so an empty cell is never ambiguous.
    
    ## Output contract
    Two sections and nothing else: DECISIONS (numbered; decision · decided by · context; unresolved items marked OPEN with positions), then ACTION TABLE (exactly the four columns above, one row per commitment). No summary, no email — that's the next step's job.
    copy & open in: ·
  2. 2

    Follow-up Writer

    Agent◆ your strongest model

    turn the decision record and action table into a summary and a follow-up email — the table is the only source

    give it the output of Extractor it returns the summary and the ready-to-send follow-up email, flags intact
    Show the prompt for this step
    ## Role
    You write the follow-up that makes a meeting real. Your only source is the decision record and action table below — not the meeting, not your instincts about meetings like it.
    
    ## The decision record and action table
    ```
    {{PASTE_THE_DECISIONS_AND_ACTIONS_OUTPUT_HERE}}
    ```
    
    ## Instructions
    1. Work strictly from the pasted record. Never re-derive from the transcript, add a task, or soften a flag — the table is the source of truth, and a flag that vanishes between table and email is how things fall through the cracks.
    2. Open with the decisions, one line each, so a skimmer knows what changed before who-does-what.
    3. Group action items by owner. Put every "(UNASSIGNED — flagged)" row first, under its own heading 'Needs an owner' — visibility at the top of the email is how unowned work gets claimed.
    4. Keep the "inferred: …, needs confirmation" wording on every uncertain date, verbatim — laundering it into a clean date manufactures a commitment nobody made.
    5. Give OPEN items a short 'Still open' section: the question and the standing positions, one line each.
    6. Tone: neutral and brief — a record, not a press release. Attendees should recognize the meeting they were in.
    
    ## Output contract
    SUMMARY (≤120 words: decisions plus the single most at-risk item), then FOLLOW-UP EMAIL: a subject line naming the meeting and date, and a body with decisions · 'Needs an owner' · per-owner tasks with due dates · 'Still open' · one closing line asking owners of flagged items and inferred dates to confirm by reply.
    copy & open in: ·
  3. 3

    Coverage Check

    Quality check◆ your strongest model↩ on fail, back to Extractor (≤2×)

    walk the transcript against the record and the email — nothing commitment-shaped escapes, no owner gets invented

    give it the output of Follow-up Writer it returns PASS, or a numbered fix-list traced to transcript lines
    Show the prompt for this step
    ## Role
    You are the person who gets blamed when something falls through the cracks. Fresh eyes: you were not in the meeting and did not write these documents, and you don't trust them yet.
    
    ## The original transcript
    ```
    {{PASTE_THE_FULL_MEETING_TRANSCRIPT_HERE}}
    ```
    
    ## The decision record and action table
    ```
    {{PASTE_THE_DECISIONS_AND_ACTIONS_OUTPUT_HERE}}
    ```
    
    ## The summary and follow-up email
    ```
    {{PASTE_THE_FOLLOW_UP_WRITER_OUTPUT_HERE}}
    ```
    
    ## Rubric — fail if ANY of these holds
    1. Coverage: walk the transcript line by line; any commitment-sounding line ('I'll…', 'can you…', 'let's…', 'we should…', someone accepting a task) that is neither in the action table nor explicitly excluded with a reason is a miss. Quote each missed line.
    2. Any owner in the table the transcript doesn't support — nobody claimed the task and nobody assigned it by name. Silence is not assignment; that row must read (UNASSIGNED — flagged).
    3. Any bare due date where the transcript was vague — the 'inferred: …, needs confirmation' marker was dropped somewhere between transcript and email.
    4. The email adds, drops, or softens anything relative to the table — a task missing, a flag laundered away, or a 'Needs an owner' item buried instead of leading. Grouping by owner with decisions first is the email's required shape, not a violation.
    5. Any disagreement the transcript leaves unresolved is presented as decided.
    
    ## Output contract
    Either exactly `PASS` plus the single riskiest UNASSIGNED or OPEN item to chase first — or `FAIL` plus a numbered fix-list, each item quoting the transcript line, table row, or email line at fault and stating what must change — the record gets corrected first, then the email is rewritten from it.
    copy & open in: ·
Worth keeping: The '(UNASSIGNED — flagged)' rows are the whole point — an action item without an owner is a wish, and hiding it is exactly how it slips.
copy & open in: ·
take it with you — 7 files — the workflow, AGENTS.md, the eval suite, and a README saying where each one goes
install in your tool —
test it yourself — 3 promptfoo configs, one per step + a README · built from this workflow's own output contracts