Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Listen to a meeting recording and extract structured action items, decisions, and open questions. Maintains a persistent ledger across runs — previously-open actions are auto-resolved when mentioned as done in subsequent meetings. Outputs `actions.csv` (importable to Linear/Asana/Notion) + `recap.md` (paste into Slack). Use when given a meeting recording and asked for a recap or action items.
.claude/skills/skrun-dev-meeting-transcript-to-action-items/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 70% | 0% |
| case-23 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-04 | ✓→✗ | ▼ Worse | 500% | 0% |
| case-10 | ✓→✗ | ▼ Worse | 60% | 0% |
You are an executive assistant for an engineering manager. Each call hands you a meeting audio recording. Listen to it directly — your audio capability transcribes the speech internally — then extract decisions and action items, reconcile them against the running ledger of still-open actions from prior meetings, and produce two artifacts.
If this is not the first meeting, the runtime injects Previous state containing the open-actions ledger from prior runs. Shape:
json{ "open_actions": [ { "id": "act-2026-04-15-001", "text": "Write OAuth design doc", "owner": "Alice", "due": "2026-04-25", "source_meeting_date": "2026-04-15" } ], "completed_actions_count": 7, "meetings_processed_count": 3 }
If no state is provided, treat as the first meeting (open_actions: []).
attendees input as a hint to disambiguate speaker voices. If a name is unclear, infer the role from context (the person committing to the work) rather than guessing a name.{ text, owner, due }. Owner: the person committing to the work (not the requester). Due: the explicit deadline if stated; otherwise null. Be conservative — only extract genuine commitments, not casual "we should X someday" mentions.previous_state.open_actions:actions.csv — all actions touched in this run. Columns: action,owner,due,status,source_meeting,this_meeting
action: action textowner: assigned person (or empty)due: ISO date or emptystatus: new (added this meeting) | resolved (was open, now done) | cancelled | still_open (carryover, no change)source_meeting: the date when this action was first committedthis_meeting: today's meeting_date (the run's input)recap.md — narrative recap. Sections: # <meeting_title> — <meeting_date>
## Summary <2-3 sentence paragraph: what was the meeting about, what got decided>
## Decisions <bullet list — only firm decisions, not discussions>
## Action items (new) <bullet list with owner + due — bold the action text>
## Resolved this meeting <bullet list of prior actions marked done. Omit section if empty>
## Open questions <bullet list — items deferred without a decision. Omit section if empty>
write_artifact (actions.csv then recap.md).actions_added_count: number of new actions extracted in step 2actions_resolved_count: number of prior actions marked resolved in step 3actions_open_count: length of the new open ledger (carryover_still_open + actions_added - 0 since new actions are open by default)summary: the Summary paragraph from recap.md (single paragraph)_state: the new open-actions ledger (see "State you write" below)Include _state in the output JSON with the updated ledger:
json{ "_state": { "open_actions": [ ... carryover_still_open + new_actions_with_assigned_id ... ], "completed_actions_count": <prior + actions_resolved_count>, "meetings_processed_count": <prior + 1> } }
ID format for new actions: act-<meeting_date>-<NNN> where NNN is zero-padded 3-digit (e.g., act-2026-04-22-001). Use sequential numbers within the same meeting.
Carryover entries keep their original id.
Action items (new) section labeled _None this meeting._ rather than omitting it.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 13,688 | 139,431 | +919% | 1 | 1 | 0% | 2,003 | 7,599 | +279% | 0 | 0 | — |
case-02 | fail→fail | 7,160 | 32,729 | +357% | 1 | 1 | 0% | 1,246 | 4,467 | +259% | 0 | 0 | — |
case-03 | fail→fail | 7,359 | 80,030 | +988% | 1 | 1 | 0% | 1,241 | 11,742 | +846% | 0 | 0 | — |
case-04 | pass→fail | 2,710 | 19,070 | +604% | 1 | 1 | 0% | 488 | 2,926 | +500% | 0 | 0 | — |
case-05 | pass→pass | 3,522 | 2,822 | -20% | 1 | 1 | 0% | 520 | 1,741 | +235% | 0 | 0 | — |
case-06 | fail→fail | 9,187 | 38,852 | +323% | 1 | 1 | 0% | 1,798 | 5,907 | +229% | 0 | 0 | — |
case-21 | fail→fail | 3,912 | 30,209 | +672% | 1 | 1 | 0% | 540 | 5,765 | +968% | 0 | 0 | — |
case-07 | pass→pass | 3,262 | 2,793 | -14% | 1 | 1 | 0% | 548 | 1,743 | +218% | 0 | 0 | — |
case-08 | pass→pass | 5,486 | 3,443 | -37% | 1 | 1 | 0% | 891 | 1,820 | +104% | 0 | 0 | — |
case-09 | fail→pass | 7,442 | 2,624 | -65% | 1 | 1 | 0% | 1,171 | 1,678 | +43% | 0 | 0 | — |
case-10 | pass→fail | 6,837 | 1,712 | -75% | 1 | 1 | 0% | 965 | 1,540 | +60% | 0 | 0 | — |
case-11 | pass→pass | 6,538 | 2,098 | -68% | 1 | 1 | 0% | 954 | 1,569 | +64% | 0 | 0 | — |
case-12 | pass→pass | 6,045 | 2,624 | -57% | 1 | 1 | 0% | 917 | 1,678 | +83% | 0 | 0 | — |
case-13 | fail→fail | 10,572 | 36,903 | +249% | 1 | 1 | 0% | 1,448 | 4,353 | +201% | 0 | 0 | — |
case-14 | pass→pass | 2,737 | 2,429 | -11% | 1 | 1 | 0% | 476 | 1,661 | +249% | 0 | 0 | — |
case-15 | fail→fail | 5,771 | 2,885 | -50% | 1 | 1 | 0% | 831 | 1,699 | +104% | 0 | 0 | — |
case-16 | fail→fail | 6,321 | 2,507 | -60% | 1 | 1 | 0% | 851 | 1,659 | +95% | 0 | 0 | — |
case-17 | fail→pass | 9,140 | 5,730 | -37% | 1 | 1 | 0% | 1,341 | 2,277 | +70% | 0 | 0 | — |
case-18 | pass→pass | 3,237 | 4,451 | +38% | 1 | 1 | 0% | 471 | 1,947 | +313% | 0 | 0 | — |
case-19 | fail→fail | 9,106 | 56,184 | +517% | 1 | 1 | 0% | 1,262 | 6,544 | +419% | 0 | 0 | — |
case-20 | pass→pass | 7,741 | 3,671 | -53% | 1 | 1 | 0% | 1,234 | 1,842 | +49% | 0 | 0 | — |
case-22 | fail→fail | 6,651 | 44,054 | +562% | 1 | 1 | 0% | 1,010 | 4,195 | +315% | 0 | 0 | — |
case-23 | fail→pass | 11,005 | 33,101 | +201% | 1 | 1 | 0% | 1,925 | 3,033 | +58% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 14 counted toward the lift figure. The other 9 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +4 percentage points is the difference between those two pass rates over the 14 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.