Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Turn meeting notes into an accountable register — extract decisions, actions and open questions, flag ownerless items, track follow-through. Use when commitments get dropped or a recurring meeting decides nothing.
.claude/skills/borghei-meeting-analyzer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 136% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 706% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 183% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 172% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 138% | 0% |
Meetings fail at the seam between talking and tracking. The decision gets made and nobody records who approved it; the action gets stated and nobody's name lands on it; the same topic returns for the seventh week because discussing it feels productive and deciding it feels risky. This skill closes that seam with deterministic extraction — pattern rules, no model calls — and then follows the commitments across meetings to see which ones actually close.
This is the accountability lens on meetings, not the summary lens. It extracts and tracks; it does not write the polished recap. Use it on notes that already exist, across a series, when the question is "did anything we said we would do actually happen?"
reappear three weeks later, or never do
churn measured before proposing to cancel it
buried in prose that nobody can find or count
decision owner and a deadline
meeting show which rituals produce work that gets done
past notes reconstructs why the system looks the way it does
carry-over count (the parser bootstraps this from notes)
an agenda was posted and notes published, and the topics covered
brainstorms, incident reviews legitimately decide little)
Before generating, confirm these inputs. If any is unknown or vague, ASK — do not assume:
Stop rule: ask only the 2-3 that most change the output. If the user says "just draft it," proceed and list your assumptions at the top of the artifact.
actions and open questions, and pulls owner and due date from each action.
produced intentions, not commitments.
"who owns this?" a week later means reconstructing a conversation nobody remembers, and the answer becomes whoever feels most guilty.
the thing that gets fixed.
--strict in CI over a notes directory to fail the build when a meetinglands actions with no owner or date.
bashpython3 project-management/meeting-analyzer/scripts/meeting_notes_parser.py \ --input project-management/meeting-analyzer/assets/sample_notes.md \ --format text --strict
assets/sample_commitments.json shape, keeping created, due, owner, status and carried_over.
--as-of so the report is reproducible.meeting. Per-owner comes last and never first.
auto-closed at 30 days that genuinely mattered gets re-opened within a week; one that nobody notices did not matter.
carried_over >= 3: re-commitwith a date the owner states out loud, or drop it. There is no fourth carry.
bashpython3 project-management/meeting-analyzer/scripts/commitment_tracker.py \ --input project-management/meeting-analyzer/assets/sample_commitments.json \ --as-of 2026-07-21 --format text
notes compliance, and the topics covered.
trend, and a KEEP / RESTRUCTURE / ASYNC / KILL verdict with a prescription.
design and should be removed from the input, not accommodated by lowering the floor.
can actually decide this? The answer picks the fix.
been tried as a well-run meeting.
bashpython3 project-management/meeting-analyzer/scripts/meeting_series_diagnostic.py \ --input project-management/meeting-analyzer/assets/sample_series.json \ --churn-threshold 3 --format text
| Has owner | Has date | Verdict | |-----------|----------|---------| | Yes | Yes (ISO) | Tracked | | Yes | Vague ("soon", "next sprint") | Gap — the owner believes they committed; nobody else does | | Yes | None | Gap — reads as "someday" | | No | Either | Gap — an action owned by "the team" is owned by nobody |
we, the team, someone, everyone and TBD are never owners, even when they occupy the grammatical slot. Accepting them launders the gap instead of surfacing it.
| Metric | Healthy | Warning | Broken | |--------|---------|---------|--------| | Completion rate | 75%+ | 50-75% | under 50% | | Owner and date present | 90%+ | 70-90% | under 70% | | On-time closure | 70%+ | 50-70% | under 50% | | Open beyond 30 days | 0-1 | 2-4 | 5+ | | Average carry-over | under 1 | 1-2 | 3+ |
Carry-over predicts abandonment better than age. An item carried three times has usually been silently deprioritised by its owner but never formally dropped.
Density = decisions produced / person-hours consumed.
| Density | Verdict | Action | |---------|---------|--------| | 0.35+ | KEEP | Healthy: a 60-min meeting of 5 produces 2+ decisions | | 0.15-0.35 | RESTRUCTURE | Cut duration 25%; trim to the people who hold the decision | | under 0.15 | ASYNC | Move standing content to a written update | | under 0.15 and 40%+ empty occurrences | KILL | Cancel; replace with a written update and a comment window |
Exclude retros, brainstorms, incident reviews and onboarding — they decide little by design. Exclude them explicitly rather than lowering the floor, or the floor stops catching the status meetings it exists to catch.
Low follow-through has four common causes and only one of them is the person: over-assignment (one owner holding 40%+ of open actions), deadlines set by someone other than the owner, an unclearable blocking dependency, or a meeting generating more actions than the team has capacity for. When every owner looks bad, the meeting is the problem — see the diagnostic table and per-owner interpretation guidance in references/accountability-and-series-health.md.
Mistake: Filling in a plausible owner or date for an action the notes left blank, so the register looks complete. Why it happens: An incomplete register feels like a failure of the extraction, and a model will happily supply a name. Completeness is mistaken for quality. Instead: Leave it flagged. The gap is the finding — an unowned action is genuinely unowned, and surfacing it is the entire value. Rules under-extract and models over-extract; a fabricated due date enters the tracker looking legitimate and nobody ever questions it again.
Mistake: Maintaining a meticulous action list that is reviewed by reading every row aloud at the next meeting, and never acted on. Why it happens: The register becomes a performance of diligence. Reading it all feels thorough, and cutting the review feels like letting standards slip. Instead: Review overdue items and third carry-overs only — under five minutes. Everything on track needs no airtime. A register that consumes twenty minutes a week to change nothing is more expensive than having no register.
Mistake: Opening a team meeting with the per-owner follow-through table and asking the bottom name to explain themselves. Why it happens: The data looks like performance data, and it is right there, ranked. Instead: Share follow-through in aggregate with the team and per-person only in a 1:1, as a question rather than a verdict. When every owner looks bad, the meeting is over-generating actions — treating that as several simultaneous performance problems is both wrong and expensive, and it teaches people to accept fewer actions rather than to close more.
Mistake: Running the series diagnostic across the whole calendar and proposing to cancel the retro because it produced two decisions in ten weeks. Why it happens: The metric is clean and comparable, which makes it tempting to apply universally. Instead: Exclude retros, brainstorms, incident reviews and onboarding before scoring. Their output is shared understanding, not convergence. Excluding them keeps the floor sharp enough to catch the status meeting it was built for.
Mistake: Killing a low-density meeting that never had an agenda or published notes. Why it happens: The density number is damning and cancellation is a satisfying, visible action. Instead: Fix hygiene first — agenda-or-cancel plus published notes — and re-measure over four occurrences. A series at 30% agenda compliance has not been tried as a well-run meeting yet, and cancelling it moves the same unresolved topics somewhere less visible.
| File | Purpose | |------|---------| | scripts/meeting_notes_parser.py | Extracts decisions, actions and questions from notes; detects owners and dates; flags gaps; --strict exits 1 | | scripts/commitment_tracker.py | Ageing, completion and on-time rates, carry-over, per-owner and per-meeting breakdowns, deterministic --as-of | | scripts/meeting_series_diagnostic.py | Decision density, churning topics, attendance decay, hygiene compliance, KEEP/RESTRUCTURE/ASYNC/KILL verdict | | references/extraction-rules-and-note-conventions.md | Cue catalogue, owner/date detection, reflow, source-format handling, deduplication, note conventions, failure modes | | references/accountability-and-series-health.md | Commitment lifecycle, benchmarks, per-owner interpretation, decision density, topic churn, action caps, escalation ladder | | assets/action_register_template.md | Register: open actions, third-carry-over gate, decision log, open questions, health snapshot | | assets/sample_notes.md | Wrapped markdown notes, mixed-quality actions (extracts at 33% completeness) | | assets/sample_notes_transcript.txt | Labelled transcript (extracts at 100%) — the contrast shows what note conventions buy | | assets/sample_commitments.json | 18-action register across 5 meetings and 7 weeks | | assets/sample_series.json | 10 occurrences of a weekly alignment meeting |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→pass | 11,382 | 6,844 | -40% | 1 | 1 | 0% | 1,730 | 4,082 | +136% | 0 | 0 | — |
case-01 | fail→pass | 3,555 | 9,736 | +174% | 1 | 1 | 0% | 591 | 4,764 | +706% | 0 | 0 | — |
case-02 | fail→fail | 5,041 | 26,389 | +423% | 1 | 1 | 0% | 207 | 7,294 | +3424% | 0 | 0 | — |
case-03 | fail→fail | 8,438 | 26,014 | +208% | 1 | 1 | 0% | 247 | 7,512 | +2941% | 0 | 0 | — |
case-04 | fail→fail | 6,780 | 6,961 | +3% | 1 | 1 | 0% | 1,041 | 4,193 | +303% | 0 | 0 | — |
case-09 | fail→pass | 7,894 | 3,571 | -55% | 1 | 1 | 0% | 1,278 | 3,613 | +183% | 0 | 0 | — |
case-05 | fail→fail | 5,005 | 9,158 | +83% | 1 | 1 | 0% | 754 | 4,453 | +491% | 0 | 0 | — |
case-06 | fail→fail | 11,912 | 9,638 | -19% | 1 | 1 | 0% | 1,646 | 4,460 | +171% | 0 | 0 | — |
case-07 | fail→pass | 8,052 | 4,111 | -49% | 1 | 1 | 0% | 1,355 | 3,683 | +172% | 0 | 0 | — |
case-08 | fail→pass | 8,290 | 2,814 | -66% | 1 | 1 | 0% | 1,436 | 3,417 | +138% | 0 | 0 | — |
case-10 | fail→fail | 10,987 | 8,293 | -25% | 1 | 1 | 0% | 1,704 | 4,452 | +161% | 0 | 0 | — |
case-12 | fail→pass | 10,122 | 5,703 | -44% | 1 | 1 | 0% | 1,695 | 3,951 | +133% | 0 | 0 | — |
case-13 | pass→pass | 7,916 | 4,082 | -48% | 1 | 1 | 0% | 1,141 | 3,630 | +218% | 0 | 0 | — |
case-14 | pass→pass | 14,804 | 7,157 | -52% | 1 | 1 | 0% | 2,040 | 4,047 | +98% | 0 | 0 | — |
case-15 | fail→pass | 8,368 | 5,337 | -36% | 1 | 1 | 0% | 1,374 | 3,855 | +181% | 0 | 0 | — |
case-16 | fail→pass | 7,439 | 5,525 | -26% | 1 | 1 | 0% | 1,104 | 3,738 | +239% | 0 | 0 | — |
case-17 | fail→pass | 13,782 | 8,330 | -40% | 1 | 1 | 0% | 2,108 | 4,199 | +99% | 0 | 0 | — |
case-18 | fail→pass | 10,099 | 3,292 | -67% | 1 | 1 | 0% | 1,498 | 3,551 | +137% | 0 | 0 | — |
case-19 | pass→pass | 11,874 | 6,212 | -48% | 1 | 1 | 0% | 1,788 | 4,019 | +125% | 0 | 0 | — |
case-20 | fail→pass | 12,615 | 11,774 | -7% | 1 | 1 | 0% | 1,798 | 4,793 | +167% | 0 | 0 | — |
case-21 | pass→pass | 11,905 | 20,980 | +76% | 1 | 1 | 0% | 1,665 | 4,602 | +176% | 0 | 0 | — |
case-22 | fail→pass | 14,195 | 7,075 | -50% | 1 | 1 | 0% | 2,130 | 4,159 | +95% | 0 | 0 | — |
case-23 | fail→pass | 11,268 | 2,829 | -75% | 1 | 1 | 0% | 1,779 | 3,361 | +89% | 0 | 0 | — |
case-24 | pass→pass | 14,098 | 9,487 | -33% | 1 | 1 | 0% | 2,074 | 4,424 | +113% | 0 | 0 | — |
case-25 | fail→pass | 13,137 | 7,980 | -39% | 1 | 1 | 0% | 1,984 | 4,192 | +111% | 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. 25 cases were attempted, and 23 counted toward the lift figure. The other 2 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 +56 percentage points is the difference between those two pass rates over the 23 comparable cases.
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.