plugins/pm/skills/analyze-cycle/SKILL.md
Analyze cycle health and generate comprehensive report with actionable insights, risk analysis, capacity assessment, and specific recommendations
npx skillsauth add coalesce-labs/catalyst analyze-cycleInstall 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.
Generates a comprehensive health report (not just data) for the current Linear cycle.
Reports Include:
Philosophy: Provide insights and recommendations, not just data dumps. PMs should know exactly what action to take after reading the report.
First, verify all required tools and systems:
# 1. Validate thoughts system (REQUIRED)
if [[ -f "scripts/validate-thoughts-setup.sh" ]]; then
./scripts/validate-thoughts-setup.sh || exit 1
else
# Inline validation if script not found
if [[ ! -d "thoughts/shared" ]]; then
echo "❌ ERROR: Thoughts system not configured"
echo "Run: ./scripts/humanlayer/init-project.sh . {project-name}"
exit 1
fi
fi
# 2. Determine script directory with fallback
if [[ -n "${CLAUDE_PLUGIN_ROOT}" ]]; then
SCRIPT_DIR="${CLAUDE_PLUGIN_ROOT}/scripts"
else
# Fallback: resolve relative to this command file
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts"
fi
# 3. Check PM plugin prerequisites
if [[ -f "${SCRIPT_DIR}/check-prerequisites.sh" ]]; then
"${SCRIPT_DIR}/check-prerequisites.sh" || exit 1
else
echo "⚠️ Prerequisites check skipped (script not found at: ${SCRIPT_DIR})"
fi
# Determine script directory with fallback (if not already set)
if [[ -z "${SCRIPT_DIR}" ]]; then
if [[ -n "${CLAUDE_PLUGIN_ROOT}" ]]; then
SCRIPT_DIR="${CLAUDE_PLUGIN_ROOT}/scripts"
else
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts"
fi
fi
source "${SCRIPT_DIR}/pm-utils.sh"
TEAM_KEY=$(get_team_key)
CONFIG_FILE=".catalyst/config.json"
[[ ! -f "$CONFIG_FILE" ]] && CONFIG_FILE=".claude/config.json"
Spawn multiple research agents in parallel to gather data:
Task 1 - Get Active Cycle:
Use Task tool with catalyst-dev:linear-research agent:
Prompt: "Get the active cycle for team ${TEAM_KEY} with all issues"
Model: haiku (fast data gathering)
Task 2 - Get Team Workload:
Use Task tool with catalyst-dev:linear-research agent:
Prompt: "List all in-progress issues for team ${TEAM_KEY}"
Model: haiku (fast data gathering)
Wait for both tasks to complete
Use Task tool with cycle-analyzer agent:
Input:
Agent returns: Structured markdown with health assessment, risks, capacity, recommendations
Format the agent's analysis into a user-facing health report:
Report Structure:
# Cycle Health Report: [Cycle Name]
## 🟢/🟡/🔴 Health Assessment
**Takeaway**: [One-sentence summary of cycle health and key concern]
**Current State**: [Concise statement with specific numbers]
- Progress: X% complete (Y/Z issues done)
- Time: N days remaining of M total
- Projected completion: X% (based on current velocity)
- Risk level: [Explanation]
---
## 📊 Progress Data
**Cycle**: Sprint 2025-W04 (Jan 20-26) **Progress**: ████████░░ 45% (18/40 issues)
| Status | Count | Percentage |
| -------------- | ----- | ---------- |
| ✅ Done | 18 | 45% |
| 🔄 In Progress | 12 | 30% |
| 📋 Todo | 10 | 25% |
**By Assignee**:
- Alice: 15 issues (8 done, 5 in progress, 2 todo)
- Bob: 12 issues (6 done, 4 in progress, 2 todo)
- Charlie: 8 issues (4 done, 2 in progress, 2 todo)
- Unassigned: 5 issues
---
## 👥 Team Capacity Analysis
**Available for Work**:
- Bob: 2 active issues, can take 1-2 more
- Charlie: 2 active issues, can take 1 more
**At Capacity**:
- Alice: 5 active issues (near max capacity)
**Needs Attention**:
- Dave: No active issues (assign work)
---
## ⚠️ Risks & Blockers
**🚨 Blockers** (2 issues):
- TEAM-461: External API approval (blocked 6 days)
- Owner: Alice
- Blocker: Waiting on partner team response
- TEAM-462: Dependency conflict (blocked 4 days)
- Owner: Bob
- Blocker: Upstream library bug
**⚠️ At Risk** (3 issues, >5 days in progress):
- TEAM-463: Complex refactor (7 days, Alice)
- Risk: No commits in 3 days
- TEAM-464: Database migration (6 days, Bob)
- Risk: Scope increased mid-work
- TEAM-465: API redesign (5 days, Charlie)
- Risk: Waiting on code review
---
## 💡 Recommendations
**Priority Actions** (do these today):
1. **Escalate TEAM-461** - Partner team blocking for 6 days, needs PM intervention
2. **Pair Bob with senior dev** on TEAM-462 - Dependency issue may need architectural change
3. **Check in with Alice** on TEAM-463 - 3 days no activity, may need help
**Capacity Optimization**:
1. **Assign 2 issues to Dave** from backlog (currently no active work)
2. **Assign 1 issue to Bob** once TEAM-462 unblocked (has capacity)
**Review Needed**:
1. **TEAM-464**: Scope changed mid-cycle, consider moving to next cycle
2. **TEAM-465**: Waiting on review for 2 days, expedite review process
---
## 📈 Velocity Projection
**Current Velocity**: 2.25 issues/day (18 done in 8 days) **Remaining Work**: 22 issues **Days
Left**: 3
**Projection**: At current pace, will complete ~7 more issues = 63% total completion
**To Hit 80%**: Need to complete 14 more issues in 3 days (4.7/day) - requires addressing blockers
immediately
IMPORTANT: Document Storage Rules
thoughts/shared/pm/reports/thoughts/searchable/ — this is a read-only search indexWrite report to thoughts/shared/pm/reports/YYYY-MM-DD-cycle-N-status.md
REPORT_DIR="thoughts/shared/pm/reports"
mkdir -p "$REPORT_DIR"
REPORT_FILE="$REPORT_DIR/$(date +%Y-%m-%d)-cycle-${cycle_number}-status.md"
# Write formatted report to file
cat > "$REPORT_FILE" << EOF
# Cycle Status Report - ${cycle_name}
**Generated**: $(date +"%Y-%m-%d %H:%M")
**Cycle**: ${cycle_number} (${cycle_starts} → ${cycle_ends})
[... formatted report content ...]
EOF
echo "✅ Report saved: $REPORT_FILE"
# Update workflow context
if [[ -f "${SCRIPT_DIR}/workflow-context.sh" ]]; then
"${SCRIPT_DIR}/workflow-context.sh" add reports "$REPORT_FILE" "${TICKET_ID:-null}"
fi
Present concise summary to user with health assessment:
🟡 Cycle Health: Sprint 2025-W04 - At Risk
Takeaway: Cycle is 45% complete with 3 days remaining. We're tracking
slightly behind (projected 63% completion). Main risks: 2 blocked issues
and Dave has no assigned work.
Progress: ████████░░ 45% (18/40 issues)
Days Remaining: 3 of 10
Priority Actions:
1. Escalate TEAM-461 blocker (external dependency, 6 days)
2. Pair Bob with senior dev on TEAM-462 (dependency conflict)
3. Assign 2 backlog issues to Dave (no active work)
Status:
✅ Done: 18 | 🔄 In Progress: 12 | 📋 Todo: 10
🚨 Blocked: 2 | ⚠️ At Risk: 3 (>5 days)
Full health report: thoughts/shared/pm/reports/2025-01-27-cycle-4-health.md
./scripts/check-prerequisites.shdevelopment
Migrate a single-harness repo to the dual-harness layout so both Claude Code and Codex load the same instructions and skills — AGENTS.md as the portable canonical doc, a thin CLAUDE.md `@AGENTS.md` bridge, and a `.agents/skills` dir with a `.claude/skills` symlink onto it. Use when asked to migrate to dual-harness, make this repo work in both Claude and Codex, or for agent metadata cleanup.
tools
Goal-driven senior-engineer pipeline-unstick sweep (CTL-1176 rung 3). Given the stuck/failed/needs-human set (or ONE ticket handed by the recovery router), its GOAL is to get the pipeline MOVING again — not to fix one ticket's review findings (that is phase-remediate). It runs AFTER the eyes (diagnostician evidence) and the hands (deterministic unstuck-sweep seams) have already tried, and it CONSUMES their output from a recovery-pass.json brief rather than re-diagnosing or redoing their narrow work. It acts like a senior engineer with full tool access — it resolves merge conflicts, rebases, force-pushes, merges green PRs, and re-dispatches stalled phases AUTONOMOUSLY — and escalates to the operator ONLY for a genuine value judgment / something that degrades other functionality / a real cost-benefit trade-off / a serious architecture change / an ADR conflict. On escalation it AUTHORS the operator inbox row + the push notification (executive-voiced). Dispatched as a `claude --bg` job by phase-agent-dispatch via slash command, AND invocable bare by the operator as a sweep — hence `user-invocable: true`. Ships behind CATALYST_RECOVERY_PASS (off by default — no live behavior change until shadow/enforce).
tools
Diagnose and fix Catalyst setup issues. Validates tools, database, config, OTel, direnv, and thoughts. Automatically fixes what it can — creates directories, initializes the database, sets WAL mode, runs migrations. Use for new installs, upgrades, or when something isn't working.
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