plugins/meeting-hygiene/skills/meeting-cleanup/SKILL.md
Batch process multiple meetings from a single day. Consolidates action items and insights across meetings.
npx skillsauth add coalesce-labs/catalyst meeting-cleanupInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Upload or paste all of today's meeting transcripts, and I'll:
Shortcut: Just paste your transcripts and say /meeting-cleanup -- I'll handle the rest.
Process all your meetings in one batch at the end of the day using AI.
Automatic Context Checks: When this skill is invoked, immediately check:
| Source | Files/Folders | Search Terms | What to Extract |
| -------------------- | -------------------------------------------------------------------- | --------------------------------- | ---------------------------------------------------- |
| Business Info | thoughts/shared/pm/context/business-info-template.md | company, product, team | Company context for interpreting discussions |
| Stakeholder Profiles | thoughts/shared/pm/context/stakeholder-template.md | attendees' names | Communication preferences, roles, decision authority |
| Active PRDs | thoughts/shared/pm/prds/*.md | features discussed | Link action items to active PRDs |
| Previous Meetings | thoughts/shared/product/meeting-notes/ | same meeting name, same attendees | Carry-over items, open questions from last time |
| Strategy | thoughts/shared/pm/frameworks/*.md | strategic pillars, OKRs | Align decisions to strategic context |
| Decisions | thoughts/shared/product/decisions/*.md | related decisions | Check for conflicts with past decisions |
Context Priority:
Tools: transcription tool or Lindy + Claude When: End of day with 3+ meetings
From transcription tool:
From Zoom/Meet/Teams:
claude "Process these meeting transcripts:
[upload all transcripts]
For each meeting:
1. Summary (3 bullets)
2. Decisions made
3. Action items (with owners)
4. Open questions
5. Follow-up needed
Then: Consolidated action item list across ALL meetings"
For each meeting processed, verify:
thoughts/shared/pm/frameworks/ when relevantUsing Lindy or Relay:
Trigger: End of day (6pm)
Actions:
Setup once, runs forever.
# Meeting Cleanup - [Date]
## Quick Stats
- Meetings attended: [X]
- Total time in meetings: [Y hours]
- Action items generated: [Z]
## Meeting 1: [Title] ([Time])
**Attendees:** [Names]
**Summary:** [3 bullets]
**Decisions:**
- [Decision 1]
- [Decision 2]
**Action Items:**
- [ ] [Action] - Owner: [Name] - Due: [Date]
- [ ] [Action] - Owner: [Name] - Due: [Date]
**Follow-up:** [Schedule next meeting? Send docs?]
---
[Repeat for each meeting]
---
## My Action Items (Consolidated)
1. [ ] [Action from Meeting 1]
2. [ ] [Action from Meeting 3]
3. [ ] [Action from Meeting 5]
## Waiting On Others
1. [Name] to [action] by [date]
2. [Name] to [action] by [date]
## Parking Lot (Questions/Ideas)
- [Question raised but not resolved]
- [Idea mentioned for later discussion]
---
## Cross-Meeting Intelligence
### Recurring Topics (with Priority Tags)
Tag each recurring topic with severity:
- **HIGH** -- Topic involves: CPO/CEO escalation, revenue-impacting deadline, at-risk OKR, or blocker affecting multiple teams
- **NORMAL** -- Topic involves: standard progress tracking, routine decisions, information sharing
- **LOW** -- Topic involves: nice-to-have discussions, future planning without urgency
Format: "[HIGH] [Topic]" came up in [Meeting 1] and [Meeting 3] -- consider scheduling a dedicated session
Example: "[HIGH] D30 Retention -- discussed in 3/4 meetings this week, CPO escalating to CEO"
### Stakeholder Load
[Who has the most action items across all meetings?]
| Person | Action Items | Meetings Involved |
|--------|-------------|-------------------|
| [Name] | [Count] | [Meeting list] |
| [Name] | [Count] | [Meeting list] |
**Overloaded?** If someone has 5+ action items across meetings, flag: "Consider whether [Name] can realistically deliver all of these by their deadlines."
### Timeline Conflicts
[Are any deadlines unrealistic given the workload?]
- [Name] has items due [Date A] (from Meeting 1) and [Date A] (from Meeting 3) -- are both achievable?
- [Feature] has conflicting timelines: Meeting 2 said "end of sprint" but Meeting 4 said "next quarter"
### Missing Follow-Ups
[Check previous weeks' meeting notes for action items that should have been discussed today but weren't]
- From [Date]: "[Action item]" assigned to [Name] -- not mentioned in today's meetings. Still open?
### Decisions Summary
[All decisions made across all meetings in one place]
| Decision | Made In | Owner | Strategic Alignment |
|----------|---------|-------|-------------------|
| [Decision] | [Meeting] | [Name] | [Pillar/OKR] |
### Cross-Meeting Conflict Detection
When the same topic or deliverable is discussed in multiple meetings, check for conflicts:
**Timeline conflicts:** Meeting A says "2 weeks" but Meeting B says "3 weeks" for the same deliverable
-> Flag: "CONFLICT: [Deliverable] timeline -- [Person A] estimated [X] (Meeting 1) vs [Y] (Meeting 2). Confirm which is accurate."
**Scope conflicts:** Meeting A scoped feature as X, but Meeting B expanded to X+Y without noting the change
-> Flag: "CONFLICT: Feature scope expanded in Meeting 2 without updating the original agreement from Meeting 1."
**Owner conflicts:** Meeting A assigned task to Person X, Meeting B assigned the same task to Person Y
-> Flag: "CONFLICT: Task '[Task name]' assigned to both [Person X] (Meeting 1) and [Person Y] (Meeting 2). Confirm owner."
**Priority conflicts:** Meeting A called feature P0, Meeting B called same feature P1
-> Flag: "CONFLICT: Feature priority downgraded from P0 (Meeting 1) to P1 (Meeting 2). Was this intentional?"
Always surface conflicts with the format:
"WARNING -- CONFLICT DETECTED: [description] -- Requires resolution by [suggested owner]"
Action items tracked: 100% Follow-through rate: +40%
When the PM uses /meeting-cleanup, I automatically:
Source: All meeting transcripts provided
Source: All meeting transcripts
/decision-doc if significantSource: Linear MCP, Linear MCP, task management systems
Source: All transcripts analyzed together
Source: MCPs if task management connected
Routing logic:
/decision-doc for formal documentationBefore delivering the meeting cleanup, verify:
thoughts/shared/product/meeting-notes/cleanup-[date].mdIf any check fails, revise before delivering.
testing
Phase-agent that fixes a failing verify verdict so the pipeline self-heals instead of stalling to needs-human (CTL-653). Reads `${ORCH_DIR}/workers/<ticket>/verify.json`, fixes the `findings[]` (every severity:"high" plus the regression_risk drivers) directly via Edit/Write, commits the remediation, and emits `phase.remediate.complete.<ticket>`. The scheduler's router then re-dispatches `verify` to re-check (the verify⇄remediate cycle, cap 3). Dispatched as a `claude --bg` job by `phase-agent-dispatch`, which invokes it via slash command — hence `user-invocable: true`.
tools
--- name: phase-triage description: Phase agent that triages a Linear ticket — expands acronyms, classifies (feature/bug/docs/refactor/chore), identifies genuine blockers (a semantic second-pass over the backlog — NOT a prose scrape; CTL-838), estimates scope, writes triage.json, and posts a triage analysis comment to Linear. Triage completion is signaled by that comment plus the local triage.json — there is no `triaged` label. Emits phase.triage.complete.<TICKET> on success and phase.triage.fai
tools
Phase agent for the research step of the 9-phase orchestrator pipeline (CTL-450). Wraps /catalyst-dev:research-codebase and produces thoughts/shared/research/<date>-<ticket>.md, then emits phase.research.complete.<ticket>. Reads triage.json from the worker dir as its prior-phase artifact. Spawned via plugins/dev/scripts/phase-agent-dispatch, which invokes it via slash command — hence `user-invocable: true`.
development
Phase-agent wrapper that opens the pull request after implementation completes (CTL-449 Initiative 1 Phase 3). Delegates to `/catalyst-dev:create-pr` (which already auto-runs `describe-pr` and transitions Linear to `inReview`), then writes the PR number + URL into the phase signal file so the downstream `phase-monitor-merge` agent can read it without re-querying GitHub. Dispatched as a `claude --bg` job by `phase-agent-dispatch`, which invokes it via slash command — hence `user-invocable: true`.