
milestone-tracker
Эксперт по отслеживанию milestones. Используй для трекинга прогресса, critical path, статус-репортов и earned value.
- Installs
- 69
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/dengineproblem/agents-monorepo --skill milestone-tracker- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads milestone-tracker automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Milestone Tracker Expert
Expert in milestone tracking, project progress monitoring, and critical path analysis for comprehensive project management.
Core Principles
SMART Milestone Definition
- Specific: Clear, unambiguous deliverable
- Measurable: Quantifiable completion criteria
- Achievable: Realistic given resources and constraints
- Relevant: Aligned with project objectives
- Time-bound: Specific deadline
Milestone vs Task
distinction:
milestone:
definition: "Significant checkpoint marking phase completion"
characteristics:
- "Zero duration (point in time)"
- "Binary (complete or not)"
- "Stakeholder visible"
- "Often gates next phase"
examples:
- "Requirements approved"
- "MVP deployed to production"
- "Beta testing complete"
task:
definition: "Work item with duration"
characteristics:
- "Has duration"
- "Can be % complete"
- "May be internal only"
- "Contributes to milestones"
examples:
- "Develop user authentication"
- "Write test cases"
- "Review security requirements"
Milestone Structure Template
milestone_definition:
id: "MS-001"
name: "MVP Launch"
description: "Minimum viable product deployed to production environment"
timing:
baseline_date: "2024-06-30"
current_target: "2024-07-15"
actual_date: null
variance_days: 15
variance_status: "Yellow"
ownership:
accountable: "Product Manager"
responsible: "Engineering Lead"
consulted: ["QA Lead", "DevOps"]
informed: ["Executive Sponsor", "Stakeholders"]
dependencies:
predecessors:
- id: "MS-000"
name: "Development Complete"
type: "Finish-to-Start"
lag: 0
successors:
- id: "MS-002"
name: "Beta Program Start"
type: "Start-to-Start"
lag: 5
acceptance_criteria:
- criterion: "All P1 features functional"
verification: "Feature checklist sign-off"
verifier: "Product Manager"
status: "Pending"
- criterion: "No critical bugs"
verification: "Bug tracker query"
verifier: "QA Lead"
status: "Pending"
- criterion: "Performance benchmarks met"
verification: "Load test results"
verifier: "DevOps"
status: "Pending"
- criterion: "Security scan passed"
verification: "Security report"
verifier: "Security Team"
status: "Pending"
risks:
- risk: "Third-party API integration delay"
probability: "Medium"
impact: "High"
mitigation: "Parallel development with mock API"
owner: "Tech Lead"
- risk: "Resource availability"
probability: "Low"
impact: "Medium"
mitigation: "Cross-training team members"
owner: "Project Manager"
deliverables:
- name: "Production deployment"
type: "System"
location: "AWS Production Environment"
- name: "Release notes"
type: "Document"
location: "Confluence"
- name: "User documentation"
type: "Document"
location: "Help center"
sign_off:
required_approvers:
- role: "Product Manager"
status: "Pending"
date: null
- role: "Engineering Lead"
status: "Pending"
date: null
- role: "QA Lead"
status: "Pending"
date: null
Critical Path Analysis
CPM Algorithm Implementation
from dataclasses import dataclass
from typing import Dict, List, Optional
import heapq
@dataclass
class Activity:
id: str
name: str
duration: int # days
predecessors: List[str]
early_start: int = 0
early_finish: int = 0
late_start: int = 0
late_finish: int = 0
total_float: int = 0
free_float: int = 0
is_critical: bool = False
class CriticalPathCalculator:
def __init__(self, activities: List[Activity]):
self.activities = {a.id: a for a in activities}
self.successors: Dict[str, List[str]] = {a.id: [] for a in activities}
for activity in activities:
for pred in activity.predecessors:
self.successors[pred].append(activity.id)
def calculate(self) -> List[str]:
"""Calculate critical path and return list of critical activity IDs."""
self._forward_pass()
self._backward_pass()
self._calculate_float()
return [aid for aid, a in self.activities.items() if a.is_critical]
def _forward_pass(self):
"""Calculate early start and early finish times."""
# Topological sort
in_degree = {aid: len(a.predecessors) for aid, a in self.activities.items()}
queue = [aid for aid, d in in_degree.items() if d == 0]
while queue:
current_id = queue.pop(0)
current = self.activities[current_id]
# Early finish = Early start + Duration
current.early_finish = current.early_start + current.duration
# Update successors
for succ_id in self.successors[current_id]:
succ = self.activities[succ_id]
succ.early_start = max(succ.early_start, current.early_finish)
in_degree[succ_id] -= 1
if in_degree[succ_id] == 0:
queue.append(succ_id)
def _backward_pass(self):
"""Calculate late start and late finish times."""
# Find project duration
project_duration = max(a.early_finish for a in self.activities.values())
# Initialize late finish for activities with no successors
for aid, a in self.activities.items():
if not self.successors[aid]:
a.late_finish = project_duration
a.late_start = a.late_finish - a.duration
# Reverse topological sort
out_degree = {aid: len(self.successors[aid]) for aid in self.activities}
queue = [aid for aid, d in out_degree.items() if d == 0]
processed = set()
while queue:
current_id = queue.pop(0)
current = self.activities[current_id]
processed.add(current_id)
for pred_id in current.predecessors:
pred = self.activities[pred_id]
if pred.late_finish == 0 or current.late_start < pred.late_finish:
pred.late_finish = current.late_start
pred.late_start = pred.late_finish - pred.duration
# Check if all successors processed
if all(s in processed for s in self.successors[pred_id]):
if pred_id not in queue:
queue.append(pred_id)
def _calculate_float(self):
"""Calculate float values and identify critical activities."""
for activity in self.activities.values():
activity.total_float = activity.late_start - activity.early_start
activity.is_critical = activity.total_float == 0
# Free float calculation
if self.successors[activity.id]:
min_early_start = min(
self.activities[s].early_start
for s in self.successors[activity.id]
)
activity.free_float = min_early_start - activity.early_finish
else:
activity.free_float = activity.total_float
# Usage example
activities = [
Activity("A", "Requirements", 10, []),
Activity("B", "Design", 15, ["A"]),
Activity("C", "Development", 30, ["B"]),
Activity("D", "Testing", 10, ["C"]),
Activity("E", "Documentation", 5, ["B"]),
Activity("F", "Deployment", 5, ["D", "E"]),
]
cpm = CriticalPathCalculator(activities)
critical_path = cpm.calculate()
print("Critical Path:", critical_path)
for aid, activity in cpm.activities.items():
print(f"{activity.name}: ES={activity.early_start}, EF={activity.early_finish}, "
f"LS={activity.late_start}, LF={activity.late_finish}, "
f"TF={activity.total_float}, Critical={activity.is_critical}")
Earned Value Management
EVM Calculations
earned_value_metrics:
baseline_metrics:
BAC: "Budget at Completion - Total planned budget"
PV: "Planned Value - Budgeted cost of work scheduled"
actual_metrics:
AC: "Actual Cost - Cost incurred for work performed"
EV: "Earned Value - Budgeted cost of work performed"
variance_metrics:
CV:
formula: "EV - AC"
interpretation: "Positive = under budget"
SV:
formula: "EV - PV"
interpretation: "Positive = ahead of schedule"
performance_indices:
CPI:
formula: "EV / AC"
interpretation: "1.0 = on budget, >1.0 = under budget"
threshold:
green: ">= 0.95"
yellow: "0.85 - 0.94"
red: "< 0.85"
SPI:
formula: "EV / PV"
interpretation: "1.0 = on schedule, >1.0 = ahead"
threshold:
green: ">= 0.95"
yellow: "0.85 - 0.94"
red: "< 0.85"
forecasting:
EAC_typical:
formula: "BAC / CPI"
use_when: "Current performance expected to continue"
EAC_atypical:
formula: "AC + (BAC - EV)"
use_when: "Variance was one-time, future on plan"
EAC_composite:
formula: "AC + [(BAC - EV) / (CPI × SPI)]"
use_when: "Both cost and schedule performance impact future"
ETC:
formula: "EAC - AC"
interpretation: "Estimate to Complete remaining work"
VAC:
formula: "BAC - EAC"
interpretation: "Variance at Completion"
TCPI:
formula: "(BAC - EV) / (BAC - AC)"
interpretation: "Required performance to meet budget"
EVM Implementation
from dataclasses import dataclass
from typing import Optional
import datetime
@dataclass
class EVMSnapshot:
date: datetime.date
planned_value: float
earned_value: float
actual_cost: float
bac: float # Budget at Completion
@property
def cost_variance(self) -> float:
"""CV = EV - AC"""
return self.earned_value - self.actual_cost
@property
def schedule_variance(self) -> float:
"""SV = EV - PV"""
return self.earned_value - self.planned_value
@property
def cpi(self) -> Optional[float]:
"""Cost Performance Index = EV / AC"""
if self.actual_cost == 0:
return None
return self.earned_value / self.actual_cost
@property
def spi(self) -> Optional[float]:
"""Schedule Performance Index = EV / PV"""
if self.planned_value == 0:
return None
return self.earned_value / self.planned_value
@property
def eac_typical(self) -> Optional[float]:
"""Estimate at Completion (typical variance)"""
if self.cpi is None or self.cpi == 0:
return None
return self.bac / self.cpi
@property
def eac_composite(self) -> Optional[float]:
"""Estimate at Completion (composite)"""
if self.cpi is None or self.spi is None:
return None
if self.cpi * self.spi == 0:
return None
return self.actual_cost + (self.bac - self.earned_value) / (self.cpi * self.spi)
@property
def etc(self) -> Optional[float]:
"""Estimate to Complete"""
eac = self.eac_typical
if eac is None:
return None
return eac - self.actual_cost
@property
def vac(self) -> Optional[float]:
"""Variance at Completion"""
eac = self.eac_typical
if eac is None:
return None
return self.bac - eac
@property
def percent_complete(self) -> float:
"""Progress percentage"""
if self.bac == 0:
return 0
return (self.earned_value / self.bac) * 100
@property
def tcpi(self) -> Optional[float]:
"""To-Complete Performance Index"""
remaining_work = self.bac - self.earned_value
remaining_budget = self.bac - self.actual_cost
if remaining_budget == 0:
return None
return remaining_work / remaining_budget
def status_report(self) -> dict:
"""Generate status summary"""
return {
"date": self.date.isoformat(),
"progress": {
"percent_complete": round(self.percent_complete, 1),
"planned_value": self.planned_value,
"earned_value": self.earned_value,
"actual_cost": self.actual_cost,
},
"variances": {
"cost_variance": round(self.cost_variance, 2),
"schedule_variance": round(self.schedule_variance, 2),
"cv_status": "Under" if self.cost_variance >= 0 else "Over",
"sv_status": "Ahead" if self.schedule_variance >= 0 else "Behind",
},
"indices": {
"cpi": round(self.cpi, 2) if self.cpi else None,
"spi": round(self.spi, 2) if self.spi else None,
},
"forecasts": {
"eac_typical": round(self.eac_typical, 2) if self.eac_typical else None,
"etc": round(self.etc, 2) if self.etc else None,
"vac": round(self.vac, 2) if self.vac else None,
},
"health": self._calculate_health(),
}
def _calculate_health(self) -> str:
"""Determine overall project health"""
cpi = self.cpi or 0
spi = self.spi or 0
if cpi >= 0.95 and spi >= 0.95:
return "Green"
elif cpi >= 0.85 and spi >= 0.85:
return "Yellow"
else:
return "Red"
Status Reporting
Traffic Light System
status_indicators:
green:
criteria:
schedule: "On track or ahead (variance < 5%)"
budget: "On track or under (variance < 5%)"
scope: "No changes or approved changes only"
risks: "All risks mitigated or low impact"
action: "Continue monitoring"
yellow:
criteria:
schedule: "5-15% behind"
budget: "5-15% over"
scope: "Pending change requests"
risks: "Medium risks requiring attention"
action: "Corrective action needed"
red:
criteria:
schedule: ">15% behind"
budget: ">15% over"
scope: "Uncontrolled scope changes"
risks: "High risks threatening success"
action: "Escalation required"
Weekly Status Report Template
weekly_status_report:
header:
project_name: "Project Alpha"
report_date: "2024-03-15"
reporting_period: "2024-03-08 to 2024-03-14"
project_manager: "Jane Smith"
report_number: 12
executive_summary:
overall_status: "Yellow"
summary: |
Project is 5 days behind schedule due to third-party API
integration delays. Recovery plan in place with expected
return to schedule by March 29.
key_messages:
- "MVP features 85% complete"
- "API integration issue being resolved"
- "Additional QA resources approved"
milestone_status:
completed_this_period:
- name: "UI Design Complete"
planned: "2024-03-10"
actual: "2024-03-08"
variance: "-2 days"
upcoming_milestones:
- name: "API Integration Complete"
planned: "2024-03-15"
forecast: "2024-03-20"
variance: "+5 days"
status: "Yellow"
risk: "Dependency on vendor fix"
- name: "Beta Release"
planned: "2024-03-25"
forecast: "2024-03-29"
variance: "+4 days"
status: "Yellow"
risk: "Dependent on API completion"
progress_metrics:
schedule:
planned_progress: "75%"
actual_progress: "70%"
spi: 0.93
status: "Yellow"
budget:
planned_spend: "$150,000"
actual_spend: "$145,000"
cpi: 1.03
status: "Green"
scope:
total_requirements: 45
completed: 38
in_progress: 5
not_started: 2
status: "Green"
accomplishments:
- "Completed all frontend components"
- "Passed security audit"
- "Onboarded 2 additional developers"
- "Resolved 15 defects"
planned_next_period:
- "Complete API integration"
- "Begin end-to-end testing"
- "Finalize user documentation"
- "Prepare beta environment"
issues_and_risks:
active_issues:
- id: "ISS-023"
description: "Third-party API returning incorrect data"
severity: "High"
owner: "Tech Lead"
action: "Vendor ticket escalated, workaround in dev"
target_resolution: "2024-03-18"
risks:
- id: "RSK-012"
description: "Beta testers availability"
probability: "Medium"
impact: "Medium"
mitigation: "Recruiting backup testers"
owner: "Product Manager"
decisions_needed:
- decision: "Approve 2-week schedule extension"
deadline: "2024-03-18"
decision_maker: "Steering Committee"
resource_status:
planned_fte: 8
actual_fte: 9
changes: "+1 QA engineer added"
concerns: "None"
Agile Integration
Sprint-Milestone Alignment
agile_milestone_mapping:
release_planning:
release: "v2.0"
target_date: "2024-06-30"
sprints: 6
sprint_duration: "2 weeks"
milestones:
- milestone: "Feature Complete"
sprint: 4
date: "2024-05-17"
criteria: "All user stories in Done"
- milestone: "Code Freeze"
sprint: 5
date: "2024-05-31"
criteria: "Only bug fixes after this"
- milestone: "Release Candidate"
sprint: 6
date: "2024-06-14"
criteria: "RC deployed to staging"
- milestone: "Production Release"
sprint: 6
date: "2024-06-30"
criteria: "Deployed to production"
sprint_tracking:
sprint: 3
goal: "Complete user authentication and profile features"
story_points:
committed: 34
completed: 28
spillover: 6
velocity:
current: 28
average: 30
trend: "Stable"
burndown:
day_1: 34
day_5: 22
day_10: 6
actual_vs_ideal: "Slightly behind"
Epic Progress Tracking
epic_milestone_tracker:
epic: "User Management System"
status: "In Progress"
milestones:
- name: "User Registration Live"
target: "Sprint 2"
status: "Complete"
features:
- "Email registration"
- "Social login (Google, GitHub)"
- "Email verification"
- name: "Profile Management Live"
target: "Sprint 3"
status: "In Progress"
features:
- "View/edit profile (Done)"
- "Avatar upload (Done)"
- "Privacy settings (In Progress)"
- name: "Admin Controls Live"
target: "Sprint 4"
status: "Not Started"
features:
- "User search"
- "Role management"
- "Bulk operations"
metrics:
story_points_total: 89
story_points_done: 55
percent_complete: 62
remaining_sprints: 2
on_track: true
Tool Integration
Jira Configuration
jira_milestone_setup:
custom_fields:
- name: "Milestone"
type: "Select List (single choice)"
options:
- "MS1: Requirements Complete"
- "MS2: Design Complete"
- "MS3: Development Complete"
- "MS4: Testing Complete"
- "MS5: Release"
- name: "Milestone Date"
type: "Date Picker"
- name: "Milestone Status"
type: "Select List (single choice)"
options:
- "On Track"
- "At Risk"
- "Delayed"
- "Complete"
filters:
milestone_view:
jql: "project = PROJ AND 'Milestone' is not EMPTY ORDER BY 'Milestone Date' ASC"
at_risk_milestones:
jql: "project = PROJ AND 'Milestone Status' = 'At Risk'"
dashboard_gadgets:
- type: "Filter Results"
filter: "Upcoming Milestones"
columns: ["Key", "Summary", "Milestone", "Milestone Date", "Status"]
- type: "Two Dimensional Filter Statistics"
x_axis: "Milestone"
y_axis: "Status"
Gantt Chart Data Structure
from dataclasses import dataclass
from datetime import date
from typing import List, Optional
@dataclass
class GanttTask:
id: str
name: str
start_date: date
end_date: date
progress: float # 0-100
dependencies: List[str]
is_milestone: bool = False
color: Optional[str] = None
resource: Optional[str] = None
def generate_gantt_data(milestones: List[dict]) -> List[GanttTask]:
"""Convert milestone data to Gantt chart format."""
tasks = []
for ms in milestones:
task = GanttTask(
id=ms['id'],
name=ms['name'],
start_date=ms['baseline_date'] if ms['is_milestone']
else ms['start_date'],
end_date=ms['baseline_date'] if ms['is_milestone']
else ms['end_date'],
progress=100 if ms['status'] == 'Complete' else ms.get('progress', 0),
dependencies=ms.get('predecessors', []),
is_milestone=ms['is_milestone'],
color=_status_to_color(ms['status']),
resource=ms.get('owner')
)
tasks.append(task)
return tasks
def _status_to_color(status: str) -> str:
colors = {
'Complete': '#4CAF50',
'On Track': '#2196F3',
'At Risk': '#FFC107',
'Delayed': '#F44336',
'Not Started': '#9E9E9E'
}
return colors.get(status, '#9E9E9E')
Лучшие практики
- SMART milestones — конкретные, измеримые, достижимые, релевантные, ограниченные во времени
- Clear ownership — каждый milestone должен иметь ответственного
- Regular updates — обновляйте статус минимум еженедельно
- Earned value — используйте EVM для объективной оценки прогресса
- Critical path focus — приоритизируйте задачи на критическом пути
- Risk buffers — закладывайте contingency для сложных milestones
FAQ
What does the milestone-tracker skill do?
Эксперт по отслеживанию milestones. Используй для трекинга прогресса, critical path, статус-репортов и earned value.
How do I install milestone-tracker?
Run npx skills add https://github.com/dengineproblem/agents-monorepo --skill milestone-tracker in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/milestone-tracker/ (personal) or .claude/skills/milestone-tracker/ (project).
Which AI agents can use milestone-tracker?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is milestone-tracker safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains milestone-tracker?
It is published by dengineproblem in dengineproblem/agents-monorepo. It has 69 recorded installs.
More from dengineproblem/agents-monorepo
social-media-marketing
dengineproblem/agents-monorepo
Эксперт по SMM. Используй для стратегий в Instagram, Facebook, TikTok, LinkedIn, контент-планов и community management.
frontend-design
dengineproblem/agents-monorepo
Open the skill to read its SKILL.md instructions.
video-marketing
dengineproblem/agents-monorepo
Open the skill to read its SKILL.md instructions.
k6-load-test
dengineproblem/agents-monorepo
Open the skill to read its SKILL.md instructions.
b2b-saas-marketing
dengineproblem/agents-monorepo
Open the skill to read its SKILL.md instructions.
seo-expert
dengineproblem/agents-monorepo
Open the skill to read its SKILL.md instructions.
Popular other skills
hyperframes-cli
heygen-com/hyperframes
The HyperFrames CLI by job - scaffold, check, look at frames, edit the timeline, preview, render locally or in the cloud, publish, project history - plus reading its JSON and recovering from build or render failures.
triage
mattpocock/skills
Move issues and external PRs through a state machine of triage roles, categorise, verify, grill if needed, and write agent-ready briefs.
ask-matt
mattpocock/skills
Ask which skill or flow fits your situation. A router over the skills in this repo.
to-questionnaire
mattpocock/skills
Turn a decision you can't fully answer into a questionnaire for someone else to fill in.
loop-me
mattpocock/skills
Grill me about specs for the workflows I want to build, within this workspace.