| name | retro |
| description | Analyze epic execution and generate improvement recommendations. Reads telemetry data, calculates efficiency score, and proposes workflow improvements. Use after epic completion or to review recent executions. |
Retro Skill
Purpose
Analyze completed epic executions and generate actionable recommendations for workflow improvement. The retrospective process:
- Reads execution telemetry from TelemetryService
- Calculates an efficiency score based on debug loops and blocked tasks
- Generates specific recommendations for agent prompts, debug knowledge, and workflow config
- Requires user approval before applying any changes
- Archives the retrospective for future reference
When to Use
- User invokes
/retro <epic-id> directly
- User invokes
/retro --recent [n] to review recent epics
- User selects Option 2 at
/run-tasks Step 10 (epic completion)
- After any epic with debug loops or blocked tasks
- Periodically to review accumulated patterns
Entry Points
| Invocation | Description |
|---|
/retro <epic-id> | Analyze a specific epic by ID |
/retro <epic-id> --dry-run | Preview analysis without modifying files |
/retro --recent [n] | Analyze most recent n epics (default: 1) |
/retro --recent [n] --dry-run | Preview recent epics analysis without modifying files |
/run-tasks Step 10, Option 2 | Triggered from epic completion flow |
Arguments
| Flag | Description |
|---|
--dry-run | Run analysis and generate recommendations without applying any changes. Skips file modifications, archiving, and insights updates. Useful for previewing what a retrospective would recommend. |
Process
Step 0: Path Detection
Determine the location of discovery.db to support both new .parade/ structure and legacy project root:
if [ -f ".parade/discovery.db" ]; then
DISCOVERY_DB=".parade/discovery.db"
else
DISCOVERY_DB="./discovery.db"
fi
All subsequent database operations in this skill use $DISCOVERY_DB instead of hardcoded discovery.db.
Step 1: Resolve Epic Context
Determine which epic(s) to analyze based on invocation:
For /retro <epic-id>:
bd show <epic-id> --json
Validate the epic exists and has status closed or all child tasks closed.
For /retro --recent [n]:
bd list -t epic --status closed --json | head -n <n>
From /run-tasks Step 10:
Epic ID is passed from the completion context.
Step 2: Check for Sufficient Data
Before proceeding, verify telemetry exists:
const summary = TelemetryService.getEpicSummary(epicId);
If no telemetry data exists:
## Retrospective: <epic-id>
Insufficient data for analysis.
The telemetry file `.claude/metrics/<epic-id>.json` was not found or contains no execution data.
This can happen if:
- The epic was created before telemetry was enabled
- Execution was interrupted before metrics were captured
- The metrics file was manually deleted
Options:
1. Skip retrospective and close epic
2. Generate a basic summary from beads data only
If user selects option 2, proceed with limited analysis using only beads data.
Step 3: Gather Context (Token-Efficient)
Read only essential data (~500 tokens total):
const telemetry = TelemetryService.getEpicSummary(epicId);
const tasks = await exec('bd list --parent <epic-id> --json');
const patterns = await glob('.claude/debug-knowledge/*.md');
const insights = await readIfExists('.claude/retrospectives/INSIGHTS.md');
Do NOT:
- Re-read source code files
- Re-read full task descriptions
- Load agent output files
- Read git history beyond summary
Step 4: Calculate Efficiency Score
Base Score: 10
Apply adjustments:
-1 per debug loop (task required debug-agent spawn)
-2 per blocked task (task ended in blocked status)
+1 if all tasks passed on first attempt (no debug loops)
Minimum score: 1
function calculateEfficiencyScore(summary: EpicSummary): number {
let score = 10;
score -= summary.totalDebugLoops;
score -= summary.blockedTasks * 2;
if (summary.totalDebugLoops === 0 && summary.blockedTasks === 0) {
score += 1;
}
return Math.max(1, score);
}
Step 5: Analyze Patterns
Identify recurring issues from telemetry:
interface AnalysisResult {
debugPatterns: DebugPattern[];
agentIssues: AgentIssue[];
workflowFriction: FrictionPoint[];
}
function analyzePatterns(summary: EpicSummary): AnalysisResult {
const patterns: DebugPattern[] = [];
for (const debug of summary.debugSessions) {
const existing = patterns.find(p => p.errorType === debug.errorType);
if (existing) {
existing.count++;
existing.tasks.push(debug.taskId);
} else {
patterns.push({
errorType: debug.errorType,
count: 1,
tasks: [debug.taskId],
resolution: debug.resolution
});
}
}
return { debugPatterns: patterns, agentIssues: [], workflowFriction: [] };
}
Step 6: Generate Recommendations
Create structured recommendations in three categories:
6a. Agent Prompt Improvements
For each agent that had failures:
### Agent Prompt: <agent-type>
**Issue**: <description of failure pattern>
**Frequency**: <N> occurrences
**Suggested Addition**:
```diff
# .claude/agents/<agent-type>.md
+ ## Common Pitfalls
+ - <specific warning based on failure>
#### 6b. Debug Knowledge Entries
For each new pattern discovered:
```markdown
### Debug Knowledge: <pattern-name>
**Pattern**: <slug-for-filename>
**Symptom**: <error message or behavior>
**Cause**: <root cause from debug resolution>
**Fix**: <solution that worked>
**Suggested File**: `.claude/debug-knowledge/<pattern>.md`
6c. Workflow Config Updates
For systemic issues:
### Workflow Config
**Issue**: <systemic problem>
**Recommendation**: <config change>
**Suggested Update**:
```yaml
# project.yaml
workflow:
<setting>: <new-value>
### Step 7: Present Report for Approval
Display the complete analysis:
```markdown
## Retrospective Analysis: <epic-id>
### Executive Summary
- **Epic**: <title>
- **Tasks**: <completed>/<total> (<blocked> blocked)
- **Debug Loops**: <count>
- **Efficiency Score**: <score>/10
### Analysis
#### What Went Well
- <positive observation 1>
- <positive observation 2>
#### Areas for Improvement
- <issue 1>: <brief description>
- <issue 2>: <brief description>
### Recommendations
<recommendations from Step 6>
---
**Approval Required**
Which changes should be applied?
1. Apply all recommendations
2. Apply selectively (I'll specify which)
3. Skip all changes (archive report only)
4. Cancel retrospective
Dry Run Mode
When --dry-run is specified, present the report and then skip to completion:
---
**DRY RUN: No files were modified**
This was a preview of the retrospective analysis. To apply changes, run:
`/retro <epic-id>` (without --dry-run)
In dry-run mode:
- Skip Step 8 (Apply Approved Changes)
- Skip Step 9 (Archive Retrospective)
- Skip Step 10 (Update Accumulated Insights)
No approval prompt is shown since no changes will be applied.
Step 8: Apply Approved Changes
For each approved change:
Agent Prompt Updates
cat >> .claude/agents/<agent-type>.md << 'EOF'
- <new pitfall warning>
EOF
Debug Knowledge Entries
cat > .claude/debug-knowledge/<pattern>.md << 'EOF'
<symptom description>
<root cause>
<solution>
Discovered during epic: <epic-id>
EOF
Workflow Config Updates
Require explicit confirmation before modifying project.yaml.
Step 9: Archive Retrospective
Write the full retrospective to archive:
mkdir -p .claude/retrospectives
cat > .claude/retrospectives/<epic-id>.md << 'EOF'
**Date**: <date>
**Efficiency Score**: <score>/10
- Tasks: <completed>/<total>
- Debug Loops: <count>
- Blocked: <count>
<analysis content>
- [ ] <change 1> - Applied/Skipped
- [ ] <change 2> - Applied/Skipped
<any skipped recommendations for future consideration>
EOF
Step 10: Update Accumulated Insights
Append to the insights file:
cat >> .claude/retrospectives/INSIGHTS.md << 'EOF'
- **Score**: <score>/10
- **Key Learning**: <one-line summary>
- **Patterns Added**: <list of new debug-knowledge entries>
EOF
If INSIGHTS.md doesn't exist, create with header:
# Workflow Insights
Accumulated learnings from epic retrospectives.
---
Output Format
Retrospective Report
# Retrospective: <epic-id>
**Date**: YYYY-MM-DD
**Efficiency Score**: N/10
## Executive Summary
| Metric | Value |
|--------|-------|
| Tasks Completed | X/Y |
| Tasks Blocked | Z |
| Debug Loops | N |
| Token Estimate | ~NK |
## Task Breakdown
| Task | Status | Attempts | Notes |
|------|--------|----------|-------|
| <id> | closed | 1 | First try |
| <id> | closed | 2 | Debug: null check |
| <id> | blocked | 3 | Max attempts |
## Patterns Identified
### <Pattern Name>
- **Occurrences**: N
- **Resolution**: <how it was fixed>
- **Prevention**: <how to avoid in future>
## Recommendations
### Immediate
- [ ] <actionable item>
### For Future Epics
- [ ] <consideration for similar work>
## Changes Applied
- <list of files modified>
Handling Edge Cases
Insufficient Data
When telemetry is missing or incomplete:
## Retrospective: <epic-id>
**Limited Analysis Mode**
Telemetry data unavailable. Analysis based on beads data only.
### Available Information
- Tasks: <from bd list>
- Final status: <from bd show>
### Unable to Determine
- Debug loop count
- Token usage
- Failure patterns
Recommendation: Enable telemetry capture for future epics.
No Issues Found
When execution was flawless:
## Retrospective: <epic-id>
**Efficiency Score**: 11/10 (Perfect execution bonus)
All tasks completed on first attempt with no debug loops or blocked tasks.
### Analysis
No issues to address. Current workflow configuration is working well for this type of feature.
### Optional
- Archive this as a reference for similar features
- Note the task structure for reuse
Multiple Epics (--recent)
When analyzing multiple epics:
## Retrospective Summary: Last N Epics
| Epic | Score | Debug | Blocked | Key Issue |
|------|-------|-------|---------|-----------|
| <id> | 8/10 | 2 | 0 | State binding |
| <id> | 10/10 | 0 | 0 | Clean |
| <id> | 6/10 | 3 | 1 | Type errors |
### Cross-Epic Patterns
- <pattern> appeared in N epics
- <agent> had issues in N epics
### Consolidated Recommendations
<merged recommendations addressing multiple epics>
Token Budget
Target: ~2000 tokens total for retrospective
| Component | Budget |
|---|
| Read telemetry | ~300 |
| Read beads summary | ~200 |
| Read existing patterns | ~200 |
| Analysis prompt | ~300 |
| Generate report | ~500 |
| Apply changes | ~300 |
| Archive | ~200 |
Efficiency principle: The 2K token investment should prevent 5-10K in future debug loops.
Example Interactions
Example 1: Standard Retrospective
User: /retro bd-x7y8
Claude:
## Retrospective Analysis: bd-x7y8
### Executive Summary
- **Epic**: Athlete Experience Tracking
- **Tasks**: 4/5 completed (1 blocked)
- **Debug Loops**: 2
- **Efficiency Score**: 5/10
### Analysis
#### What Went Well
- Database schema task completed first try
- UI components rendered correctly
#### Areas for Improvement
- SwiftUI state binding caused 2 debug loops
- TypeScript null check missing in edge function
### Recommendations
#### Agent Prompt: swift-agent
**Issue**: State binding errors in child views
**Suggested Addition**:
```diff
+ ## Common Pitfalls
+ - Use @Binding in child views, not @State
+ - Initialize state before view body
Debug Knowledge: swiftui-state-binding
Pattern: swiftui-state-binding
Symptom: View not updating on state change
Cause: @State used in child view instead of @Binding
Fix: Change @State to @Binding, pass from parent
Approval Required
Which changes should be applied?
- Apply all recommendations
- Apply selectively
- Skip all (archive only)
- Cancel
**User:** 1
**Claude:**
Applying changes...
- Updated: .claude/agents/swift-agent.md
- Created: .claude/debug-knowledge/swiftui-state-binding.md
- Archived: .claude/retrospectives/bd-x7y8.md
- Updated: .claude/retrospectives/INSIGHTS.md
Retrospective complete.
### Example 2: Clean Execution
**User:** /retro bd-a1b2
**Claude:**
```markdown
## Retrospective Analysis: bd-a1b2
### Executive Summary
- **Epic**: Task List Filter
- **Tasks**: 3/3 completed
- **Debug Loops**: 0
- **Efficiency Score**: 11/10
All tasks completed on first attempt. No issues to address.
Options:
1. Archive this retrospective
2. Skip (no archive)
Example 3: From /run-tasks Completion
Claude (at Step 10):
All tasks for "User Authentication" are complete.
Completed: 6 tasks
Blocked: 0 tasks
Debug loops: 3
Options:
1. Merge and close epic
2. Merge and close with retrospective (recommended - debug loops detected)
3. Keep open for manual review
User: 2
Claude: [Proceeds with retrospective flow, then merge]
Example 4: Insufficient Data
User: /retro bd-old1
Claude:
## Retrospective: bd-old1
**Limited Analysis Mode**
Telemetry data not found for this epic. This epic may predate telemetry capture.
### Available Information (from beads)
- Tasks: 4 total, 4 closed
- Created: 2024-01-15
- Type: Epic
### Recommendation
For future epics, ensure telemetry capture is enabled in project.yaml:
```yaml
workflow:
retrospective:
capture_metrics: true
Options:
- Generate basic summary from beads only
- Skip retrospective
### Example 5: Dry Run Preview
**User:** /retro bd-x7y8 --dry-run
**Claude:**
```markdown
## Retrospective Analysis: bd-x7y8
### Executive Summary
- **Epic**: Athlete Experience Tracking
- **Tasks**: 4/5 completed (1 blocked)
- **Debug Loops**: 2
- **Efficiency Score**: 5/10
### Analysis
#### What Went Well
- Database schema task completed first try
- UI components rendered correctly
#### Areas for Improvement
- SwiftUI state binding caused 2 debug loops
- TypeScript null check missing in edge function
### Recommendations
#### Agent Prompt: swift-agent
**Issue**: State binding errors in child views
**Suggested Addition**:
```diff
+ ## Common Pitfalls
+ - Use @Binding in child views, not @State
+ - Initialize state before view body
Debug Knowledge: swiftui-state-binding
Pattern: swiftui-state-binding
Symptom: View not updating on state change
Cause: @State used in child view instead of @Binding
Fix: Change @State to @Binding, pass from parent
DRY RUN: No files were modified
This was a preview of the retrospective analysis. To apply changes, run:
/retro bd-x7y8 (without --dry-run)
---
## Files Modified
This skill may create or modify:
| Path | Action | Approval |
|------|--------|----------|
| `.claude/retrospectives/<epic-id>.md` | Create | Automatic |
| `.claude/retrospectives/INSIGHTS.md` | Append | Automatic |
| `.claude/debug-knowledge/<pattern>.md` | Create | Required |
| `.claude/agents/<agent>.md` | Append | Required |
| `project.yaml` | Modify | Required |
---
## Configuration
```yaml
# project.yaml
workflow:
retrospective:
# Trigger conditions
prompt_frequency: 3 # Offer every N epics
prompt_on_debug: true # Always offer if debug loops
prompt_on_blocked: true # Always offer if blocked tasks
# Data capture (during /run-tasks)
capture_metrics: true
capture_token_estimates: true
# Storage locations
metrics_dir: .claude/metrics
retrospectives_dir: .claude/retrospectives
insights_file: .claude/retrospectives/INSIGHTS.md
# Auto-apply (vs require approval)
auto_apply:
debug_knowledge: true # New pattern files
agent_prompts: false # Require approval
workflow_config: false # Require approval
Integration with /run-tasks
The retrospective skill is invoked from /run-tasks Step 10 when user selects Option 2:
if user_choice == 2:
await invoke_skill('retro', epic_id)
await merge_and_close_epic(epic_id)
The retrospective runs inline, allowing the user to review and approve changes before the epic is finalized.