Milestone lifecycle automation using Linear MCP tools. Handles assignment inference, completion checks, health reporting, carry-forward, and orphan detection. Use when creating issues that need milestone assignment, when issues transition to Done, when reporting milestone health at session exit, or when milestone target dates pass. Trigger with phrases like "assign milestone", "milestone health", "check milestone", "carry forward", "milestone report", "orphaned issues", "milestone status".
npx claudepluginhub cianos95-dev/claude-command-centre --plugin claude-command-centreThis skill uses the workspace's default tool permissions.
Automates the milestone lifecycle within CCC projects. This skill owns all milestone CRUD, assignment logic, completion checks, health reporting, and carry-forward protocols. Other skills (notably `issue-lifecycle`) delegate milestone operations here rather than duplicating logic.
Manages project milestones: create new cycles with phases, complete/archive versions, preview changes, audit integration, analyze gaps. For structured delivery checkpoints.
Manages tasks, state, and memories in SQLite DB; parses PRDs into hierarchical task trees with dependencies and complexity. Use for breaking down features into actionable plans.
Adds project milestones through questioning, optional brainstorm/research, requirements gathering, and roadmap updates. For first post-init or subsequent cycles; follow with /kata-plan-phase.
Share bugs, ideas, or general feedback.
Automates the milestone lifecycle within CCC projects. This skill owns all milestone CRUD, assignment logic, completion checks, health reporting, and carry-forward protocols. Other skills (notably issue-lifecycle) delegate milestone operations here rather than duplicating logic.
Milestones are the primary progress-tracking mechanism at the project level. Every issue in a project should belong to a milestone. The agent automates assignment and monitoring but never auto-closes milestones -- closure is always a human decision proposed by the agent with evidence.
milestone-management owns:
create_milestone, update_milestone, get_milestone, list_milestones)issue-lifecycle delegates here:
issue-lifecycle calls into this skill for milestone assignmentissue-lifecycle does NOT contain assignment logic -- it references this skillClean boundary: issue-lifecycle calls milestone-management as a dependency, never the reverse. This skill never modifies issue status, labels, or closure -- those remain in issue-lifecycle.
All milestone operations use the Linear MCP with these corrected signatures:
| Tool | Signature | Purpose |
|---|---|---|
list_milestones | list_milestones(project: "name-or-id") | Assignment inference, health reporting |
get_milestone | get_milestone(project: "name-or-id", query: "milestone-name-or-id") | Completion checks, detail lookup |
update_issue | update_issue(id: "issue-id", milestone: "name-or-id") | Assign or reassign milestone |
create_milestone | create_milestone(project: "name-or-id", name: "name", ...) | New milestones (human-initiated) |
update_milestone | update_milestone(project: "name-or-id", id: "name-or-id", ...) | Description/date updates |
DO NOT use get_milestone(id) without specifying project. The correct call is always get_milestone(project, query).
DO NOT use update_issue(milestoneId: ...). The correct field is milestone: "name-or-id".
When any issue is created or moved to a project, check if a milestone is assigned. If unassigned, infer and assign the correct milestone.
Issue created/moved to project
|
v
Has milestone assigned? --YES--> Done (no action)
|
NO
v
Fetch milestones: list_milestones(project) [use cache if available]
|
v
Filter to active milestones (exclude completed/archived)
|
v
How many active milestones?
|
+--> 0: No active milestone. Inform user: "No active milestone in [project]. Skipping assignment."
|
+--> 1: Unambiguous. Auto-assign via update_issue(id, milestone: "name")
|
+--> 2+: AMBIGUOUS. Prompt user to choose (see Ambiguity Handling below)
|
v
Output confirmation message
When multiple active milestones exist (e.g., overlapping target dates, parallel workstreams), do not auto-assign. Instead:
Present the active milestones to the user with context:
Multiple active milestones found in [project]:
1. "M1: Foundation" (target: 2026-03-01, 5/12 issues done)
2. "M2: Polish" (target: 2026-03-15, 0/8 issues done)
Which milestone should [issue-id] be assigned to?
Use AskUserQuestion with single-select. Each option: label is the milestone name, description includes target date and progress.
After user selection, assign via update_issue(id, milestone: "selected-name").
Only auto-assign when exactly one active milestone is unambiguous.
Every auto-assignment outputs a confirmation message to the user:
Assigned [CIA-XXX] to milestone [Milestone Name] (target: [YYYY-MM-DD])
If the milestone has no target date:
Assigned [CIA-XXX] to milestone [Milestone Name] (no target date set)
This confirmation is mandatory even in batch operations. The user must always know which milestone an issue was assigned to.
To reassign an issue to a different milestone:
update_issue(id: "issue-id", milestone: "new-milestone-name")
This overwrites the previous milestone assignment. The agent supports reassignment on request:
Document the reassignment in a brief output: Reassigned [CIA-XXX] from [Old Milestone] to [New Milestone]
Completion checks are trigger-based, not polling. They fire only on issue status transitions, never on a timer or schedule.
After any issue transitions to Done or Canceled:
get_milestone(project: "project-name", query: "milestone-name")Never auto-close milestones. Always propose:
All issues in milestone [Milestone Name] are complete (X Done, Y Canceled).
Propose marking this milestone as complete. Confirm?
Wait for explicit human confirmation before any milestone status change.
Report milestone progress as a compact table, either on demand or during session-exit.
| Milestone | Done | In Progress | Todo | Target | Health |
|-----------|------|-------------|------|--------|--------|
Health indicators:
On Track -- target date is >3 days away, or no target date setAt Risk -- target date is within 3 days and open issues remainOverdue -- target date has passed and open issues remainMilestone Health Report — Claude Command Centre (CCC)
| Milestone | Done | In Progress | Todo | Target | Health |
|-----------|------|-------------|------|--------|--------|
| Linear Mastery | 3 | 2 | 4 | 2026-03-01 | On Track |
| Plugin Polish | 0 | 1 | 5 | 2026-02-20 | At Risk |
| Q1 Cleanup | 1 | 0 | 0 | — | On Track |
/ccc:go --status may display milestone health alongside issue statusWhen a milestone's target date passes with open issues, propose moving incomplete issues to the next milestone.
Milestone target date passed
|
v
Any open issues? --NO--> Propose marking milestone complete
|
YES
v
Identify next milestone (by target date, same project)
|
v
For each open issue, check carry-forward count
|
+--> Count < 2: Propose moving to next milestone
|
+--> Count >= 2: FLAG for human review (see Loop Prevention)
|
v
Present proposal to user for confirmation
Track carry-forwards per issue. When an issue is moved from an overdue milestone to the next:
Carried forward from [Old Milestone] to [New Milestone] (carry-forward #N)Maximum 2 carry-forwards per issue. After 2 carry-forwards:
Issue [CIA-XXX] "[title]" has been carried forward twice -- consider re-scoping or canceling.
Previously: [Milestone A] -> [Milestone B] -> [Milestone C]
This prevents issues from silently bouncing between milestones indefinitely. The human must actively decide to carry forward a third time, re-scope the issue, or cancel it.
If no next milestone exists in the project:
Milestone [name] is overdue with [N] open issues, but no next milestone exists.
Consider creating a new milestone or re-scoping the remaining issues.
If get_milestone returns null for a previously-assigned milestone (the milestone was deleted), the issue is orphaned:
Orphaned: milestone deletedOrphan report format (in hygiene output):
Orphaned Issues (milestone deleted):
- [CIA-XXX] "[title]" — previously assigned to [deleted milestone name]
- [CIA-YYY] "[title]" — previously assigned to [deleted milestone name]
Action: Reassign these issues to an active milestone or remove milestone assignment.
| Error | Response |
|---|---|
list_milestones returns empty | Report "No milestones found in [project]". Do not fail silently. |
get_milestone returns null | Check if the milestone was deleted (orphan detection). |
update_issue fails on milestone assignment | Report the error. Do not retry automatically. Suggest manual assignment. |
| Rate limit / timeout | Log the failure, proceed with cached data if available, note degraded accuracy in output. |
get_milestone(id) without project. Always use get_milestone(project, query).update_issue(milestoneId: ...). Always use update_issue(milestone: "name-or-id").issue-lifecycle./ccc:go intake flow.