Create burndown chart data
Creates burndown chart data by querying sprint progress, calculating remaining work, and formatting data for visualization. Helps teams visualize sprint progress and identify if they're on track.
Burndown charts make progress visible.
Visualizing sprint progress helps teams understand if they're on track, identify trends early, and adjust course if needed. Burndown charts transform abstract progress into concrete visuals, grounded in love for transparency, truth in data, and beauty in clarity.
Before generating burndown, ensure:
pm-configuration skill)Placeholder content for Process to satisfy validation.
Determine which sprint to generate burndown for:
"I'll help you generate a burndown chart. Which sprint?
A) Current active sprint: {SPRINT_NAME}
B) Specific sprint: {SPRINT_ID or SPRINT_NAME}
C) Last completed sprint: {SPRINT_NAME}
D) All active sprints
[If user doesn't specify, default to current sprint]"
Fetch sprint details and items:
Backend Operation: getSprint
Parameters:
{
"sprintId": "{SPRINT_ID}"
}
Backend Operation: getBurndown
Parameters:
{
"sprintId": "{SPRINT_ID}"
}
If backend doesn't have getBurndown, calculate manually:
Backend Operation: listItems
Parameters:
{
"sprintId": "{SPRINT_ID}",
"projectId": "{PROJECT_ID}"
}
Process data to generate burndown points:
Calculation Logic:
def calculate_burndown(sprint, items):
# Sprint dates
start_date = sprint['startDate']
end_date = sprint['endDate']
total_days = (end_date - start_date).days
# Initial points
initial_points = sum(item['estimate'] for item in items)
# Daily data points
burndown_data = []
for day in range(total_days + 1):
current_date = start_date + timedelta(days=day)
# Calculate remaining points
completed_items = [
item for item in items
if item['status'] == 'Done' and item['completedAt'] <= current_date
]
completed_points = sum(item['estimate'] for item in completed_items)
remaining_points = initial_points - completed_points
# Ideal burndown (linear)
ideal_remaining = initial_points * (1 - day / total_days)
burndown_data.append({
'date': current_date,
'remaining': remaining_points,
'ideal': ideal_remaining,
'completed': completed_points
})
return burndown_data
Format data for visualization:
JSON Format:
{
"sprint": {
"id": "{SPRINT_ID}",
"name": "{SPRINT_NAME}",
"startDate": "{START_DATE}",
"endDate": "{END_DATE}",
"totalPoints": {TOTAL_POINTS}
},
"burndown": [
{
"date": "{DATE_1}",
"remaining": {REMAINING_POINTS},
"ideal": {IDEAL_POINTS},
"completed": {COMPLETED_POINTS}
},
{
"date": "{DATE_2}",
"remaining": {REMAINING_POINTS},
"ideal": {IDEAL_POINTS},
"completed": {COMPLETED_POINTS}
}
],
"summary": {
"currentRemaining": {CURRENT_REMAINING},
"idealRemaining": {IDEAL_REMAINING},
"variance": {VARIANCE},
"onTrack": true/false,
"completionRate": {PERCENTAGE}
}
}
CSV Format:
Date,Remaining Points,Ideal Points,Completed Points,Variance
2026-02-03,25,25,0,0
2026-02-04,23,23.3,2,-0.3
2026-02-05,21,21.6,4,-0.6
...
Markdown Table Format:
| Date | Remaining | Ideal | Completed | Variance | Status |
||--|-|--|-|--|
| 2026-02-03 | 25 | 25.0 | 0 | 0.0 | ✅ On Track |
| 2026-02-04 | 23 | 23.3 | 2 | -0.3 | ✅ On Track |
| 2026-02-05 | 21 | 21.6 | 4 | -0.6 | ✅ On Track |
| ... | ... | ... | ... | ... | ... |
Provide progress analysis:
"📊 **Burndown Analysis: {SPRINT_NAME}**
**Sprint Details:**
- **Dates:** {START_DATE} to {END_DATE}
- **Total Points:** {TOTAL_POINTS} pts
- **Days Elapsed:** {DAYS_ELAPSED} / {TOTAL_DAYS}
- **Days Remaining:** {DAYS_REMAINING}
**Current Status:**
- **Remaining Points:** {REMAINING_POINTS} pts
- **Ideal Remaining:** {IDEAL_REMAINING} pts
- **Variance:** {VARIANCE} pts ({PERCENTAGE}%)
- **On Track:** {ON_TRACK_STATUS}
**Progress:**
- **Completed:** {COMPLETED_POINTS} pts ({PERCENTAGE}%)
- **Remaining:** {REMAINING_POINTS} pts ({PERCENTAGE}%)
- **Completion Rate:** {COMPLETION_RATE} pts/day
- **Required Rate:** {REQUIRED_RATE} pts/day
**Trend Analysis:**
- {TREND_DESCRIPTION}
- {TREND_INSIGHT}
**Recommendations:**
- {RECOMMENDATION_1}
- {RECOMMENDATION_2}
"
If visualization tools available:
"**Burndown Chart Visualization:**
Remaining Points 25 |●─────────────────────────────── Ideal | ● 20 | ● | ● 15 | ● | ● 10 | ● | ● 5 | ● | ● 0 |____________________● Actual └───────────────────── 0 2 4 6 8 10 12 14 Days
**Chart Interpretation:**
- **Ideal Line:** Expected progress (linear burndown)
- **Actual Line:** Real progress (may vary)
- **Above Ideal:** Behind schedule ⚠️
- **Below Ideal:** Ahead of schedule ✅
- **On Ideal:** On track ✅
"
Deliver formatted data:
"✅ Burndown chart data generated!
**Sprint:** {SPRINT_NAME}
**Format:** {FORMAT} (JSON/CSV/Markdown)
**Chart Data:**
{CHART_DATA}
**Summary:**
- Total Points: {TOTAL_POINTS} pts
- Current Remaining: {REMAINING_POINTS} pts
- On Track: {ON_TRACK_STATUS}
**Next Steps:**
1. Visualize data using your preferred tool
2. Share with team during standup
3. Use for sprint review
4. Track trends over multiple sprints
**Visualization Tools:**
- Excel/Google Sheets (import CSV)
- Chart.js (use JSON data)
- Python matplotlib (use JSON data)
- Online chart tools
Burndown data is ready!"
User: "Generate burndown for current sprint"
Agent: [Queries sprint, calculates burndown, formats data]
Output:
✅ Burndown chart data generated!
**Sprint:** Sprint 6 - Payment Integration Phase 2
**Format:** JSON
**Chart Data:**
```json
{
"sprint": {
"id": "SPRINT-789",
"name": "Sprint 6 - Payment Integration Phase 2",
"startDate": "2026-02-03",
"endDate": "2026-02-14",
"totalPoints": 25
},
"burndown": [
{"date": "2026-02-03", "remaining": 25, "ideal": 25.0, "completed": 0},
{"date": "2026-02-04", "remaining": 23, "ideal": 23.3, "completed": 2},
{"date": "2026-02-05", "remaining": 21, "ideal": 21.6, "completed": 4},
{"date": "2026-02-06", "remaining": 18, "ideal": 20.0, "completed": 7},
{"date": "2026-02-07", "remaining": 15, "ideal": 18.3, "completed": 10},
{"date": "2026-02-10", "remaining": 12, "ideal": 15.0, "completed": 13},
{"date": "2026-02-11", "remaining": 8, "ideal": 13.3, "completed": 17},
{"date": "2026-02-12", "remaining": 5, "ideal": 11.6, "completed": 20},
{"date": "2026-02-13", "remaining": 2, "ideal": 10.0, "completed": 23},
{"date": "2026-02-14", "remaining": 0, "ideal": 8.3, "completed": 25}
],
"summary": {
"currentRemaining": 0,
"idealRemaining": 8.3,
"variance": -8.3,
"onTrack": true,
"completionRate": 100
}
}
Summary:
### Example 2: Burndown Analysis
**User:** "Show burndown analysis for SPRINT-790"
**Agent:** [Generates burndown with analysis]
**Output:**
📊 Burndown Analysis: Sprint 7 - User Portal Enhancements
Sprint Details:
Current Status:
Progress:
Trend Analysis:
Recommendations:
### Example 3: CSV Format Burndown
**User:** "Generate burndown CSV for current sprint"
**Agent:** [Generates CSV format]
**Output:**
✅ Burndown chart data generated!
Sprint: Sprint 8 - API Redesign Format: CSV
Chart Data:
Date,Remaining Points,Ideal Points,Completed Points,Variance,Status
2026-03-03,25,25.0,0,0.0,On Track
2026-03-04,23,23.3,2,-0.3,On Track
2026-03-05,20,21.6,5,-1.6,Ahead
2026-03-06,18,20.0,7,-2.0,Ahead
2026-03-07,15,18.3,10,-3.3,Ahead
2026-03-10,12,15.0,13,-3.0,Ahead
2026-03-11,8,13.3,17,-5.3,Ahead
2026-03-12,5,11.6,20,-6.6,Ahead
2026-03-13,2,10.0,23,-8.0,Ahead
2026-03-14,0,8.3,25,-8.3,Ahead
Summary:
Next Steps:
## Backend Operations Reference
### Required Operations
| Operation | Interface | Purpose |
|--|--||
| `getSprint` | `planning.getSprint` | Get sprint details |
| `getBurndown` | `metrics.getBurndown` | Get burndown data (if backend supports) |
| `listItems` | `workItems.listItems` | Query sprint items (for manual calculation) |
### Operation Details
**getSprint:**
- **Parameters:** `sprintId` (required)
- **Returns:** Sprint details with dates, items
- **Error Handling:** Validate sprintId exists
**getBurndown:**
- **Parameters:** `sprintId` (required)
- **Returns:** Burndown data points
- **Error Handling:** Handle if backend doesn't support, fall back to manual calculation
**listItems:**
- **Parameters:** `sprintId` (required), `projectId`
- **Returns:** List of items with estimates and completion dates
- **Error Handling:** Handle empty sprints, unestimated items
## Burndown Calculation Details
### Ideal Burndown
Linear burndown assumes constant velocity:
ideal_remaining = initial_points * (1 - days_elapsed / total_days)
### Actual Burndown
Based on completed work:
actual_remaining = initial_points - sum(completed_item_points)
### Variance
Difference between ideal and actual:
variance = actual_remaining - ideal_remaining
### On Track Assessment
- **On Track:** Variance within ±10%
- **Ahead:** Variance < -10%
- **Behind:** Variance > +10%
## Fallback Procedures
| Condition | Action |
|--|--|
| PM backend not configured | Guide user to run `pm-configuration` skill first |
| Sprint not found | List available sprints, ask user to select |
| Sprint hasn't started | Warn user, show planned burndown instead |
| No items in sprint | Show empty burndown, suggest adding items |
| Items unestimated | Warn user, use count instead of points |
| Backend doesn't support getBurndown | Calculate manually from sprint items |
| Incomplete data | Use available data, note missing dates |
## Integration with Other Skills
### Integration with plan-sprint Skill
After planning:
"After planning sprint, I can generate burndown charts to track progress using the generate-burndown skill."
### Integration with run-standup Skill
During sprint:
"During standups, I can show current burndown status to help team understand progress."
### Integration with close-sprint Skill
After closure:
"After closing sprint, I can generate final burndown chart for retrospective analysis."
## Important Rules
1. **Calculate accurately** - Use actual completion dates, not estimates
2. **Handle unestimated items** - Warn if items lack estimates
3. **Support multiple formats** - JSON, CSV, Markdown for flexibility
4. **Provide analysis** - Include progress insights and recommendations
5. **Visualize when possible** - Generate charts if tools available
6. **Track trends** - Compare across sprints for patterns
7. **Ground in reality** - Use actual data, not projections
8. **Make it actionable** - Provide recommendations based on burndown
## CLI Quick Reference
```bash
# Generate burndown via CLI (if implemented)
python cli/factory_cli.py --generate-burndown \
--sprint-id "SPRINT-789" \
--format "json" \
--output "burndown.json"
# Generate CSV burndown
python cli/factory_cli.py --generate-burndown \
--sprint-id "SPRINT-789" \
--format "csv" \
--output "burndown.csv"
# Show burndown analysis
python cli/factory_cli.py --burndown-analysis --sprint-id "SPRINT-789"
patterns/products/pm-system/adapters/adapter-interface.json - Backend adapter interfaceknowledge/workflow-patterns.json - Workflow patterns for burndown trackingknowledge/best-practices.json - Best practices for burndown charts.agent/skills/pm/plan-sprint/SKILL.md - Sprint planning skill.agent/skills/pm/close-sprint/SKILL.md - Sprint closure skill.agent/skills/pm/run-standup/SKILL.md - Standup reporting skillGenerated by Antigravity Agent Factory Skill: generate-burndown v1.0.0 Grounded in Axiom 0: Love, Truth, and Beauty
Placeholder content for Best Practices.
Google Workspace CLI for Gmail, Calendar, Drive, Contacts, Sheets, and Docs.
Manage Apple Notes via the `memo` CLI on macOS (create, view, edit, delete, search, move, and export notes). Use when a user asks OpenClaw to add a note, list notes, search notes, or manage note folders.
Work with Obsidian vaults (plain Markdown notes) and automate via obsidian-cli.
Use when you need to control Slack from OpenClaw via the slack tool, including reacting to messages or pinning/unpinning items in Slack channels or DMs.
Manage Apple Reminders via remindctl CLI (list, add, edit, complete, delete). Supports lists, date filters, and JSON/plain output.
Manage Trello boards, lists, and cards via the Trello REST API.
Category:productivity