feat: add value-based milestone planning capability
Add capability for organizing backlog into shippable business capabilities using value-based milestones (not time-based phases). Components: - milestone-planning skill: Value-based framework, vertical slice test, one active milestone - create-milestones skill: Orchestrator (Haiku) for analyzing and grouping issues - milestone-planner agent: Groups issues into capabilities autonomously (Haiku) Core Principles: - Milestone = shippable business capability (not phase) - One active milestone at a time (preserves focus) - 5-25 issues per milestone (right-sized) - Value labels: value/high, value/medium, value/low - Risk labels: risk/high (optional) - Vertical slice test (can be demoed independently) - No dates (capability-based, not time-based) Workflow: /create-milestones reads existing Gitea issues → analyzes capability boundaries → groups into milestones → creates in Gitea → assigns issues → applies labels → user manually activates ONE milestone Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
319
agents/milestone-planner/AGENT.md
Normal file
319
agents/milestone-planner/AGENT.md
Normal file
@@ -0,0 +1,319 @@
|
|||||||
|
---
|
||||||
|
name: milestone-planner
|
||||||
|
description: >
|
||||||
|
Analyzes existing Gitea issues and groups them into value-based milestones
|
||||||
|
representing shippable business capabilities. Applies vertical slice test
|
||||||
|
and assigns value/risk labels.
|
||||||
|
model: claude-haiku-4-5
|
||||||
|
skills: milestone-planning, gitea
|
||||||
|
---
|
||||||
|
|
||||||
|
You are a milestone-planner that organizes issues into value-based milestones.
|
||||||
|
|
||||||
|
## Your Role
|
||||||
|
|
||||||
|
Analyze existing issues and group into milestones:
|
||||||
|
1. Read all issue details
|
||||||
|
2. Identify capability boundaries
|
||||||
|
3. Group issues that deliver one capability
|
||||||
|
4. Apply vertical slice test
|
||||||
|
5. Size check (5-25 issues)
|
||||||
|
6. Assign value/risk labels
|
||||||
|
|
||||||
|
**Output:** Milestone definitions with issue assignments
|
||||||
|
|
||||||
|
## When Invoked
|
||||||
|
|
||||||
|
You receive:
|
||||||
|
- **Issues**: List of issue numbers with titles
|
||||||
|
|
||||||
|
You produce:
|
||||||
|
- Milestone definitions
|
||||||
|
- Issue assignments per milestone
|
||||||
|
- Value/risk labels per issue
|
||||||
|
|
||||||
|
## Process
|
||||||
|
|
||||||
|
### 1. Read All Issue Details
|
||||||
|
|
||||||
|
For each issue number provided:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tea issues <number>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Extract:**
|
||||||
|
- Title and description
|
||||||
|
- User story (if present)
|
||||||
|
- Acceptance criteria
|
||||||
|
- Bounded context (from labels or description)
|
||||||
|
- DDD guidance (aggregate, commands, events)
|
||||||
|
- Existing labels
|
||||||
|
|
||||||
|
### 2. Identify Capability Boundaries
|
||||||
|
|
||||||
|
**Look for natural groupings:**
|
||||||
|
|
||||||
|
**By bounded context:**
|
||||||
|
- Issues in same context often work together
|
||||||
|
- Check bounded-context labels
|
||||||
|
- Check DDD guidance sections
|
||||||
|
|
||||||
|
**By aggregate:**
|
||||||
|
- Issues working on same aggregate
|
||||||
|
- Commands for one aggregate
|
||||||
|
- Events from one aggregate
|
||||||
|
|
||||||
|
**By user journey:**
|
||||||
|
- Issues that complete one user flow
|
||||||
|
- From trigger to outcome
|
||||||
|
- End-to-end capability
|
||||||
|
|
||||||
|
**By dependency:**
|
||||||
|
- Issues that must work together
|
||||||
|
- Command → event → read model → UI
|
||||||
|
- Natural sequencing
|
||||||
|
|
||||||
|
### 3. Define Capabilities
|
||||||
|
|
||||||
|
For each grouping, define a capability:
|
||||||
|
|
||||||
|
**Capability = What user can do**
|
||||||
|
|
||||||
|
**Format:** "[Persona] can [action] [outcome]"
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
- "Customer can register and authenticate"
|
||||||
|
- "Order can be placed and paid"
|
||||||
|
- "Admin can manage products"
|
||||||
|
- "User can view order history"
|
||||||
|
|
||||||
|
**Test each capability:**
|
||||||
|
- Can it be demoed independently?
|
||||||
|
- Does it deliver observable value?
|
||||||
|
- Is it useful on its own?
|
||||||
|
|
||||||
|
If NO → regroup issues or split capability.
|
||||||
|
|
||||||
|
### 4. Group Issues into Milestones
|
||||||
|
|
||||||
|
For each capability, list issues that deliver it:
|
||||||
|
|
||||||
|
**Typical grouping:**
|
||||||
|
- Aggregate implementation (if new)
|
||||||
|
- Commands for this capability
|
||||||
|
- Domain rules/invariants
|
||||||
|
- Events published
|
||||||
|
- Read models for visibility
|
||||||
|
- UI/API to trigger
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
Capability: Customer can register and authenticate
|
||||||
|
|
||||||
|
Issues:
|
||||||
|
- #42: Implement User aggregate (aggregate)
|
||||||
|
- #43: Add RegisterUser command (command)
|
||||||
|
- #44: Publish UserRegistered event (event)
|
||||||
|
- #45: Add LoginUser command (command)
|
||||||
|
- #46: Enforce unique email invariant (rule)
|
||||||
|
- #47: Create UserSession read model (read model)
|
||||||
|
- #48: Build registration form (UI)
|
||||||
|
- #49: Build login form (UI)
|
||||||
|
- #50: Add session middleware (infrastructure)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Size Check
|
||||||
|
|
||||||
|
For each milestone:
|
||||||
|
- **5-25 issues:** Good size
|
||||||
|
- **< 5 issues:** Too small, might not need milestone (can be just labels)
|
||||||
|
- **> 25 issues:** Too large, split into multiple capabilities
|
||||||
|
|
||||||
|
**If too large, split by:**
|
||||||
|
- Sub-capabilities (register vs login)
|
||||||
|
- Phases (basic then advanced)
|
||||||
|
- Risk (risky parts first)
|
||||||
|
|
||||||
|
### 6. Apply Vertical Slice Test
|
||||||
|
|
||||||
|
For each milestone, verify:
|
||||||
|
|
||||||
|
**Can this be demoed independently?**
|
||||||
|
|
||||||
|
Questions:
|
||||||
|
- Can user interact with this end-to-end?
|
||||||
|
- Does it produce observable results?
|
||||||
|
- Is it useful on its own?
|
||||||
|
- Can we ship this and get feedback?
|
||||||
|
|
||||||
|
**If NO:**
|
||||||
|
- Missing UI? Add it
|
||||||
|
- Missing commands? Add them
|
||||||
|
- Missing read models? Add them
|
||||||
|
- Incomplete flow? Extend it
|
||||||
|
|
||||||
|
### 7. Assign Value Labels
|
||||||
|
|
||||||
|
For each milestone, determine business value:
|
||||||
|
|
||||||
|
**value/high:**
|
||||||
|
- Core user need
|
||||||
|
- Enables revenue
|
||||||
|
- Competitive differentiator
|
||||||
|
- Blocks other work
|
||||||
|
|
||||||
|
**value/medium:**
|
||||||
|
- Important but not critical
|
||||||
|
- Enhances existing capability
|
||||||
|
- Improves experience
|
||||||
|
|
||||||
|
**value/low:**
|
||||||
|
- Nice to have
|
||||||
|
- Edge case
|
||||||
|
- Minor improvement
|
||||||
|
|
||||||
|
**Apply to all issues in milestone.**
|
||||||
|
|
||||||
|
### 8. Identify Risk
|
||||||
|
|
||||||
|
For each issue, check for technical risk:
|
||||||
|
|
||||||
|
**risk/high markers:**
|
||||||
|
- New technology/pattern
|
||||||
|
- External integration
|
||||||
|
- Complex algorithm
|
||||||
|
- Performance concerns
|
||||||
|
- Security-sensitive
|
||||||
|
- Data migration
|
||||||
|
|
||||||
|
**Apply risk/high label** to flagged issues.
|
||||||
|
|
||||||
|
### 9. Structure Output
|
||||||
|
|
||||||
|
Return complete milestone plan:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Milestone Plan
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
[Number of milestones, total issues covered]
|
||||||
|
|
||||||
|
## Milestones
|
||||||
|
|
||||||
|
### Milestone 1: [Capability Name]
|
||||||
|
|
||||||
|
**Description:** [What user can do]
|
||||||
|
|
||||||
|
**Value:** [high | medium | low]
|
||||||
|
|
||||||
|
**Issue count:** [N]
|
||||||
|
|
||||||
|
**Issues:**
|
||||||
|
- #42: [Title] (labels: value/high)
|
||||||
|
- #43: [Title] (labels: value/high, risk/high)
|
||||||
|
- #44: [Title] (labels: value/high)
|
||||||
|
...
|
||||||
|
|
||||||
|
**Vertical slice test:**
|
||||||
|
- ✓ Can be demoed end-to-end
|
||||||
|
- ✓ Delivers observable value
|
||||||
|
- ✓ Useful independently
|
||||||
|
|
||||||
|
**Dependencies:** [Other milestones this depends on, if any]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Milestone 2: [Capability Name]
|
||||||
|
|
||||||
|
[... same structure]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Unassigned Issues
|
||||||
|
|
||||||
|
[Issues that don't fit into any milestone]
|
||||||
|
- Why: [Reason - exploratory, refactoring, unclear scope]
|
||||||
|
|
||||||
|
## Recommendations
|
||||||
|
|
||||||
|
**Activate first:** [Milestone name]
|
||||||
|
- Reasoning: [Highest value, enables others, derisk early, etc.]
|
||||||
|
|
||||||
|
**Sequence:**
|
||||||
|
1. [Milestone 1] - [Why first]
|
||||||
|
2. [Milestone 2] - [Why second]
|
||||||
|
3. [Milestone 3] - [Why third]
|
||||||
|
|
||||||
|
**Notes:**
|
||||||
|
- [Any concerns or clarifications]
|
||||||
|
- [Suggested splits or regroupings]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Guidelines
|
||||||
|
|
||||||
|
**Think in capabilities:**
|
||||||
|
- Not technical layers
|
||||||
|
- Not phases
|
||||||
|
- Not dates
|
||||||
|
- What can user DO?
|
||||||
|
|
||||||
|
**Cross-cutting is normal:**
|
||||||
|
- Capability spans multiple aggregates
|
||||||
|
- That's how value works
|
||||||
|
- Group by user outcome, not by aggregate
|
||||||
|
|
||||||
|
**Size matters:**
|
||||||
|
- Too small → just use labels
|
||||||
|
- Too large → split capabilities
|
||||||
|
- Sweet spot: 5-25 issues
|
||||||
|
|
||||||
|
**Value is explicit:**
|
||||||
|
- Every issue gets value label
|
||||||
|
- Based on business priority
|
||||||
|
- Not effort or complexity
|
||||||
|
|
||||||
|
**Risk is optional:**
|
||||||
|
- Flag uncertainty
|
||||||
|
- Helps sequencing (derisk early)
|
||||||
|
- Not all issues have risk
|
||||||
|
|
||||||
|
**Vertical slices:**
|
||||||
|
- Always testable end-to-end
|
||||||
|
- Always demoable
|
||||||
|
- Always useful on own
|
||||||
|
|
||||||
|
## Anti-Patterns
|
||||||
|
|
||||||
|
**Technical groupings:**
|
||||||
|
- ✗ "Backend" milestone
|
||||||
|
- ✗ "API layer" milestone
|
||||||
|
- ✗ "Database" milestone
|
||||||
|
|
||||||
|
**Phase-based:**
|
||||||
|
- ✗ "MVP" (what capability?)
|
||||||
|
- ✗ "Phase 1" (what ships?)
|
||||||
|
|
||||||
|
**Too granular:**
|
||||||
|
- ✗ One aggregate = one milestone
|
||||||
|
- ✓ Multiple aggregates = one capability
|
||||||
|
|
||||||
|
**Too broad:**
|
||||||
|
- ✗ "Order management" with 50 issues
|
||||||
|
- ✓ Split into "place order", "track order", "cancel order"
|
||||||
|
|
||||||
|
**Missing UI:**
|
||||||
|
- Capability needs user interface
|
||||||
|
- Without UI, can't demo
|
||||||
|
- Include UI issues in milestone
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
- Start with DDD context boundaries
|
||||||
|
- Group issues that complete one user journey
|
||||||
|
- Verify demo-ability (vertical slice test)
|
||||||
|
- Size check (5-25 issues)
|
||||||
|
- Assign value based on business priority
|
||||||
|
- Flag technical risk
|
||||||
|
- Sequence by value and risk
|
||||||
|
- One milestone = one capability
|
||||||
235
skills/create-milestones/SKILL.md
Normal file
235
skills/create-milestones/SKILL.md
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
---
|
||||||
|
name: create-milestones
|
||||||
|
description: >
|
||||||
|
Analyze existing Gitea issues and group into value-based milestones. Creates
|
||||||
|
milestones, assigns issues, applies value/risk labels. Use when organizing
|
||||||
|
backlog by capability, or when user says /create-milestones.
|
||||||
|
model: claude-haiku-4-5
|
||||||
|
argument-hint:
|
||||||
|
user-invocable: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Create Milestones
|
||||||
|
|
||||||
|
@~/.claude/skills/milestone-planning/SKILL.md
|
||||||
|
@~/.claude/skills/gitea/SKILL.md
|
||||||
|
|
||||||
|
Analyze existing issues and organize into value-based milestones (shippable capabilities).
|
||||||
|
|
||||||
|
## Process
|
||||||
|
|
||||||
|
### 1. Fetch Existing Issues
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tea issues --state open -o json
|
||||||
|
```
|
||||||
|
|
||||||
|
Get all open issues from current repository.
|
||||||
|
|
||||||
|
Verify issues exist. If none:
|
||||||
|
```
|
||||||
|
No open issues found. Create issues first using /vision-to-backlog or /ddd-breakdown.
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Analyze Issues
|
||||||
|
|
||||||
|
Read issue details for each:
|
||||||
|
```bash
|
||||||
|
tea issues <number>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Look for:**
|
||||||
|
- Issue titles and descriptions
|
||||||
|
- Bounded context labels (if present)
|
||||||
|
- Capability labels (if present)
|
||||||
|
- User stories
|
||||||
|
- Acceptance criteria
|
||||||
|
- DDD guidance (aggregates, commands, events)
|
||||||
|
|
||||||
|
### 3. Spawn Milestone Planner
|
||||||
|
|
||||||
|
Use Task tool to spawn `milestone-planner` agent:
|
||||||
|
|
||||||
|
```
|
||||||
|
Analyze these issues and group into value-based milestones.
|
||||||
|
|
||||||
|
Issues: [list of issue numbers with titles]
|
||||||
|
|
||||||
|
For each issue, you have access to:
|
||||||
|
- Full issue description
|
||||||
|
- Labels
|
||||||
|
- DDD context
|
||||||
|
|
||||||
|
Group issues into milestones that represent shippable business capabilities.
|
||||||
|
|
||||||
|
Follow milestone-planning skill principles:
|
||||||
|
- Milestone = capability user can demo
|
||||||
|
- 5-25 issues per milestone
|
||||||
|
- Cross-cutting (commands + events + reads + UI)
|
||||||
|
- Vertical slice test
|
||||||
|
|
||||||
|
Output:
|
||||||
|
- Milestone definitions
|
||||||
|
- Issue assignments
|
||||||
|
- Value/risk labels per issue
|
||||||
|
|
||||||
|
Follow milestone-planner agent instructions.
|
||||||
|
```
|
||||||
|
|
||||||
|
Agent returns grouped milestones.
|
||||||
|
|
||||||
|
### 4. Review Grouped Milestones
|
||||||
|
|
||||||
|
Present agent output to user:
|
||||||
|
|
||||||
|
```
|
||||||
|
## Proposed Milestones
|
||||||
|
|
||||||
|
### Milestone: Customer can register and authenticate
|
||||||
|
**Description:** User registration, login, and session management
|
||||||
|
**Issues:** 8
|
||||||
|
**Value:** high
|
||||||
|
**Issues:**
|
||||||
|
- #42: Implement User aggregate
|
||||||
|
- #43: Add RegisterUser command
|
||||||
|
- #44: Publish UserRegistered event
|
||||||
|
- #45: Add LoginUser command
|
||||||
|
- #46: Create UserSession read model
|
||||||
|
- #47: Build registration form
|
||||||
|
- #48: Build login form
|
||||||
|
- #49: Add session middleware
|
||||||
|
|
||||||
|
### Milestone: Order can be placed and paid
|
||||||
|
**Description:** Complete order placement with payment processing
|
||||||
|
**Issues:** 12
|
||||||
|
**Value:** high
|
||||||
|
**Issues:**
|
||||||
|
- #50: Implement Order aggregate
|
||||||
|
- #51: Add PlaceOrder command
|
||||||
|
...
|
||||||
|
|
||||||
|
[... more milestones]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ask user:**
|
||||||
|
- Approve these milestones?
|
||||||
|
- Modify any groupings?
|
||||||
|
- Change value/risk labels?
|
||||||
|
|
||||||
|
### 5. Ensure Labels Exist
|
||||||
|
|
||||||
|
Before creating milestones, ensure labels exist in Gitea:
|
||||||
|
|
||||||
|
**Check for labels:**
|
||||||
|
```bash
|
||||||
|
tea labels list
|
||||||
|
```
|
||||||
|
|
||||||
|
**Create missing labels:**
|
||||||
|
```bash
|
||||||
|
# Value labels
|
||||||
|
tea labels create "value/high" --color "#d73a4a" --description "Highest business value"
|
||||||
|
tea labels create "value/medium" --color "#fbca04" --description "Moderate business value"
|
||||||
|
tea labels create "value/low" --color "#0075ca" --description "Nice to have"
|
||||||
|
|
||||||
|
# Risk label
|
||||||
|
tea labels create "risk/high" --color "#e99695" --description "Technical risk or uncertainty"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Create Milestones in Gitea
|
||||||
|
|
||||||
|
For each approved milestone:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tea milestones create \
|
||||||
|
--title "<milestone title>" \
|
||||||
|
--description "<milestone description>"
|
||||||
|
```
|
||||||
|
|
||||||
|
Capture milestone ID/title for issue assignment.
|
||||||
|
|
||||||
|
### 7. Assign Issues to Milestones
|
||||||
|
|
||||||
|
For each issue in each milestone:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tea issues edit <issue-number> --milestone "<milestone-title>"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8. Apply Value/Risk Labels
|
||||||
|
|
||||||
|
For each issue:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tea issues edit <issue-number> --labels "<existing-labels>,<value-label>"
|
||||||
|
|
||||||
|
# If has risk
|
||||||
|
tea issues edit <issue-number> --labels "<existing-labels>,<value-label>,risk/high"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Preserve existing labels** (bounded-context, capability, etc.)
|
||||||
|
|
||||||
|
### 9. Report Results
|
||||||
|
|
||||||
|
Show created milestones with links:
|
||||||
|
|
||||||
|
```
|
||||||
|
## Milestones Created
|
||||||
|
|
||||||
|
### Customer can register and authenticate (8 issues)
|
||||||
|
- Value: high
|
||||||
|
- Issues: #42, #43, #44, #45, #46, #47, #48, #49
|
||||||
|
- Link: [view milestone](https://git.flowmade.one/owner/repo/milestone/1)
|
||||||
|
|
||||||
|
### Order can be placed and paid (12 issues)
|
||||||
|
- Value: high
|
||||||
|
- Issues: #50-#61
|
||||||
|
- Link: [view milestone](https://git.flowmade.one/owner/repo/milestone/2)
|
||||||
|
|
||||||
|
[... more milestones]
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
1. **Review milestones** in Gitea
|
||||||
|
2. **Activate ONE milestone** (the current value focus)
|
||||||
|
3. **Close milestone** when capability is demoable
|
||||||
|
4. **Pick next milestone** to activate
|
||||||
|
|
||||||
|
Remember: Only one open/active milestone at a time!
|
||||||
|
```
|
||||||
|
|
||||||
|
## Guidelines
|
||||||
|
|
||||||
|
**Value slices:**
|
||||||
|
- Each milestone is a shippable capability
|
||||||
|
- Can be demoed independently
|
||||||
|
- User sees observable value
|
||||||
|
|
||||||
|
**One active milestone:**
|
||||||
|
- User manually activates ONE
|
||||||
|
- This workflow doesn't activate automatically
|
||||||
|
- Forces focus and completion
|
||||||
|
|
||||||
|
**Label strategy:**
|
||||||
|
- Every issue gets value label
|
||||||
|
- High-risk issues get risk/high label
|
||||||
|
- Preserves existing labels (context, capability)
|
||||||
|
|
||||||
|
**Sizing:**
|
||||||
|
- 5-25 issues per milestone
|
||||||
|
- If larger, agent should split
|
||||||
|
- If smaller, might not need milestone
|
||||||
|
|
||||||
|
**No dates:**
|
||||||
|
- Milestones are capability-based
|
||||||
|
- Not time-based
|
||||||
|
- Ship when done, not by deadline
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
- Run after creating issues from /vision-to-backlog
|
||||||
|
- Re-run if backlog grows and needs reorganization
|
||||||
|
- Agent groups by capability boundaries (aggregates, contexts)
|
||||||
|
- Review groupings - agent might miss domain nuance
|
||||||
|
- Adjust value/risk labels based on business context
|
||||||
|
- Keep one milestone open at all times
|
||||||
192
skills/milestone-planning/SKILL.md
Normal file
192
skills/milestone-planning/SKILL.md
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
---
|
||||||
|
name: milestone-planning
|
||||||
|
description: >
|
||||||
|
Value-based milestone planning: milestones as shippable capabilities, not phases.
|
||||||
|
One active milestone, vertical slices, value/risk labels. Use when planning
|
||||||
|
milestones or organizing backlog by capability.
|
||||||
|
user-invocable: false
|
||||||
|
---
|
||||||
|
|
||||||
|
# Milestone Planning
|
||||||
|
|
||||||
|
Value-driven milestone framework: milestones represent shippable business capabilities, not time-based phases.
|
||||||
|
|
||||||
|
## Core Principle
|
||||||
|
|
||||||
|
**If you don't deliver by date, milestones must represent value slices, not time.**
|
||||||
|
|
||||||
|
**Milestone = A shippable business capability**
|
||||||
|
|
||||||
|
Not a phase. Not "MVP". Not "Auth".
|
||||||
|
|
||||||
|
## What Makes a Good Milestone
|
||||||
|
|
||||||
|
Each milestone should answer one business question:
|
||||||
|
|
||||||
|
**"What new capability exists for the user once this is done?"**
|
||||||
|
|
||||||
|
### Good Examples
|
||||||
|
|
||||||
|
✓ Customer can register and authenticate
|
||||||
|
✓ Order can be placed and paid
|
||||||
|
✓ Admin can manage products
|
||||||
|
✓ Audit trail exists for all state changes
|
||||||
|
|
||||||
|
### Bad Examples
|
||||||
|
|
||||||
|
✗ MVP (what capability?)
|
||||||
|
✗ Backend (technical layer, not user value)
|
||||||
|
✗ Auth improvements (vague, no completion criteria)
|
||||||
|
✗ Phase 1 (time-based, not value-based)
|
||||||
|
|
||||||
|
**Test:** If it can't be demoed independently, it's too vague.
|
||||||
|
|
||||||
|
## Mapping DDD Issues to Milestones
|
||||||
|
|
||||||
|
**DDD building blocks → issues**
|
||||||
|
- Aggregates
|
||||||
|
- Commands
|
||||||
|
- Events
|
||||||
|
- Read models
|
||||||
|
- Policies
|
||||||
|
|
||||||
|
**End-to-end capability → milestone**
|
||||||
|
- Spans multiple aggregates
|
||||||
|
- Commands + invariants + events
|
||||||
|
- Read models for visibility
|
||||||
|
- Maybe UI/API glue
|
||||||
|
|
||||||
|
**Value is cross-cutting by nature.**
|
||||||
|
|
||||||
|
A milestone usually includes:
|
||||||
|
- Multiple aggregates working together
|
||||||
|
- Commands that achieve user goal
|
||||||
|
- Events connecting aggregates
|
||||||
|
- Read models for user feedback
|
||||||
|
- UI/API to trigger capability
|
||||||
|
|
||||||
|
## One Active Milestone at a Time
|
||||||
|
|
||||||
|
**Rule:** Exactly one open milestone = current value focus
|
||||||
|
|
||||||
|
**Why:**
|
||||||
|
- Preserves focus
|
||||||
|
- Avoids parallel half-value
|
||||||
|
- Forces completion
|
||||||
|
- Makes priority explicit
|
||||||
|
|
||||||
|
**Practice:**
|
||||||
|
- Everything else stays unassigned
|
||||||
|
- When done → close it → pick next highest-value milestone
|
||||||
|
- Multiple open milestones = accidental roadmap
|
||||||
|
|
||||||
|
## Priority Without Dates
|
||||||
|
|
||||||
|
Since Gitea milestones have no ordering, use labels:
|
||||||
|
|
||||||
|
**Minimal label set:**
|
||||||
|
- `value/high` - Highest business value
|
||||||
|
- `value/medium` - Moderate business value
|
||||||
|
- `value/low` - Nice to have
|
||||||
|
- `risk/high` - Technical risk or uncertainty
|
||||||
|
|
||||||
|
**Issues have:**
|
||||||
|
- Always: value label
|
||||||
|
- Sometimes: risk label
|
||||||
|
|
||||||
|
**You now have:**
|
||||||
|
- **Milestone** → what capability
|
||||||
|
- **Label** → why now
|
||||||
|
|
||||||
|
## Sizing Guidelines
|
||||||
|
|
||||||
|
A value milestone should:
|
||||||
|
- Be completable in days to a few weeks
|
||||||
|
- Deliver observable user value
|
||||||
|
- Contain 5-25 issues
|
||||||
|
|
||||||
|
**If it keeps growing:**
|
||||||
|
- You discovered multiple capabilities
|
||||||
|
- Split into separate milestones
|
||||||
|
|
||||||
|
## Vertical Slice Test
|
||||||
|
|
||||||
|
Before creating a milestone, verify:
|
||||||
|
|
||||||
|
**Can this be demoed independently?**
|
||||||
|
|
||||||
|
Test questions:
|
||||||
|
- Can a user interact with this capability end-to-end?
|
||||||
|
- Does it produce observable results?
|
||||||
|
- Is it useful on its own (not just foundation)?
|
||||||
|
- Can we ship this and get feedback?
|
||||||
|
|
||||||
|
If NO to any → not a value slice yet.
|
||||||
|
|
||||||
|
## Label Strategy
|
||||||
|
|
||||||
|
**Value labels (always):**
|
||||||
|
- Reflect business priority
|
||||||
|
- Based on user impact, revenue, strategic alignment
|
||||||
|
- Applied to every issue in milestone
|
||||||
|
|
||||||
|
**Risk labels (optional):**
|
||||||
|
- Flag technical uncertainty
|
||||||
|
- Flag new patterns/technologies
|
||||||
|
- Flag complex integrations
|
||||||
|
- Helps sequence work (derisk early)
|
||||||
|
|
||||||
|
## Anti-Patterns
|
||||||
|
|
||||||
|
**"We just deliver highest value first"**
|
||||||
|
Only works if:
|
||||||
|
- Value is explicit (labels)
|
||||||
|
- Scope is bounded (milestones)
|
||||||
|
- Work is finishable (vertical slices)
|
||||||
|
|
||||||
|
Without milestones, "value-first" quietly becomes "interesting-first".
|
||||||
|
|
||||||
|
**Multiple open milestones:**
|
||||||
|
- Splits focus
|
||||||
|
- Encourages context switching
|
||||||
|
- Hides incomplete work
|
||||||
|
- Prevents shipping
|
||||||
|
|
||||||
|
**Technical milestones:**
|
||||||
|
- "Backend" is not a capability
|
||||||
|
- "API layer" is not demoable
|
||||||
|
- "Database migration" might be necessary but not a milestone
|
||||||
|
|
||||||
|
**Phase-based milestones:**
|
||||||
|
- "MVP" → what can user do?
|
||||||
|
- "Phase 1" → what capability?
|
||||||
|
- "Q1 goals" → what ships?
|
||||||
|
|
||||||
|
## When NOT to Use Milestones
|
||||||
|
|
||||||
|
**Don't use milestones when:**
|
||||||
|
- Single capability with <5 issues (just label it)
|
||||||
|
- Exploratory work (use spike label instead)
|
||||||
|
- Refactoring without user-visible change (use technical debt label)
|
||||||
|
- Everything ships together (waterfall project)
|
||||||
|
|
||||||
|
**Milestones enforce discipline around value slices.**
|
||||||
|
|
||||||
|
## Workflow Summary
|
||||||
|
|
||||||
|
1. **Issues exist** (from DDD analysis or backlog)
|
||||||
|
2. **Group by capability** (milestone-planner agent)
|
||||||
|
3. **One milestone open** (current value slice)
|
||||||
|
4. **Label for priority** (value/risk)
|
||||||
|
5. **No dates** (capability-based, not time-based)
|
||||||
|
6. **Close ruthlessly** (finish before starting next)
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
- Start with 3-5 milestones defined, 1 active
|
||||||
|
- Keep unassigned issues in backlog
|
||||||
|
- Move issues between milestones if capability boundaries change
|
||||||
|
- Split milestones that grow beyond 25 issues
|
||||||
|
- Close milestone when capability is demoable
|
||||||
|
- Review value/risk labels regularly
|
||||||
|
- Active milestone = team's current focus
|
||||||
Reference in New Issue
Block a user