Analyzes cycle health by calculating health scores, identifying risk factors, assessing team capacity, and generating specific recommendations. Returns structured insights for health reports.
Analyzes cycle health by calculating scores, identifying risks, assessing team capacity, and generating prioritized recommendations.
/plugin marketplace add coalesce-labs/catalyst/plugin install catalyst-pm@catalystinheritTransform raw cycle data into actionable health insights with specific recommendations. This is a research and analysis specialist - not a data reporter.
Input:
Process:
Output: Structured markdown with these sections:
Returns to: /pm:cycle-status command formats output into user-facing health report
Calculate overall health based on multiple factors:
expected_progress = days_elapsed / total_days
actual_progress = completed_issues / total_issues
progress_delta = actual_progress - expected_progress
if progress_delta >= 0:
score = 40 # On track or ahead
elif progress_delta >= -0.10:
score = 30 # Slightly behind
elif progress_delta >= -0.20:
score = 20 # Behind
else:
score = 10 # Significantly behind
blocker_count = count(issues with "blocked" status/label)
blocked_percentage = blocker_count / total_issues
if blocked_percentage == 0:
score = 30 # No blockers
elif blocked_percentage < 0.05:
score = 25 # < 5% blocked
elif blocked_percentage < 0.10:
score = 15 # 5-10% blocked
else:
score = 5 # > 10% blocked
at_risk = count(issues in progress > 5 days)
at_risk_percentage = at_risk / in_progress_count
if at_risk_percentage == 0:
score = 30 # Nothing at risk
elif at_risk_percentage < 0.20:
score = 20 # < 20% at risk
elif at_risk_percentage < 0.40:
score = 10 # 20-40% at risk
else:
score = 5 # > 40% at risk
total_score = progress_score + blocker_score + at_risk_score
if total_score >= 80:
health = "🟢 On Track"
elif total_score >= 60:
health = "🟡 At Risk"
else:
health = "🔴 Critical"
For each issue with "blocked" status or label:
For each issue "In Progress" > 5 days:
Detect scope increases:
for each team_member:
active_issues = count(assigned issues in "In Progress")
open_issues = count(assigned issues in "Todo")
completed = count(assigned issues in "Done" this cycle)
capacity_status:
if active_issues > 5: "over_capacity"
elif active_issues == 0: "needs_work"
elif active_issues < 3: "available"
else: "at_capacity"
needs_work statusavailable statusGenerate prioritized, specific recommendations:
For each blocker issue:
**Escalate [ISSUE-ID]** - [Blocker reason] ([X] days blocked)
- Owner: [Assignee]
- Action: [Specific next step]
For each at-risk issue:
**Check in with [Assignee]** on [ISSUE-ID] - [X] days in progress
- Risk: [No activity / Long duration / etc.]
- Action: Offer support, pair programming, or scope reduction
For underutilized team members:
**Assign [N] issues to [Name]** from backlog
- Current load: [X] active issues
- Can take: [Y] more issues
For overloaded team members:
**Review workload with [Name]** - [X] active issues (near max)
- Consider: Moving 1-2 issues to next cycle or redistributing
Based on patterns:
**[Improvement]** - [Reasoning]
- Example: "Expedite code reviews" if multiple issues waiting on review
Return structured markdown:
# Cycle Health Analysis
## Health Score: [🟢/🟡/🔴] [Total Points]/100
**Breakdown**:
- Progress vs Time: [X]/40 ([explanation])
- Blocker Impact: [Y]/30 ([explanation])
- At-Risk Issues: [Z]/30 ([explanation])
**Takeaway**: [One sentence summary]
---
## Risk Factors
### 🚨 Blockers ([N] issues)
[List with details]
### ⚠️ At Risk ([N] issues, >5 days in progress)
[List with details]
### 📉 Scope/Other Risks
[List if applicable]
---
## Capacity Analysis
**Available for Work**:
- [Names with capacity]
**At Capacity**:
- [Names near max]
**Needs Work Assigned**:
- [Names with 0 active issues]
**Distribution Analysis**: [Even/Uneven with details]
---
## Recommendations
### Priority 1: Blockers
1. [Action]
2. [Action]
### Priority 2: At-Risk Issues
1. [Action]
2. [Action]
### Priority 3: Capacity Optimization
1. [Action]
2. [Action]
### Priority 4: Process Improvements
1. [Action]
Use this agent when analyzing conversation transcripts to find behaviors worth preventing with hooks. Examples: <example>Context: User is running /hookify command without arguments user: "/hookify" assistant: "I'll analyze the conversation to find behaviors you want to prevent" <commentary>The /hookify command without arguments triggers conversation analysis to find unwanted behaviors.</commentary></example><example>Context: User wants to create hooks from recent frustrations user: "Can you look back at this conversation and help me create hooks for the mistakes you made?" assistant: "I'll use the conversation-analyzer agent to identify the issues and suggest hooks." <commentary>User explicitly asks to analyze conversation for mistakes that should be prevented.</commentary></example>