feat(epic): add Working Model as required section for epics
Epics now require a "Working Model" section in their description, in addition to "Success Criteria". This provides clear guidance on HOW the epic will be executed: - Owner role: Coordinator vs Implementer - Delegation target: Polecats, crew, external - Review process: Approval gates Closes gt-0lp Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -24,3 +24,25 @@ Manage epics (large features composed of multiple issues).
|
|||||||
4. Auto-close when done: `bd epic close-eligible`
|
4. Auto-close when done: `bd epic close-eligible`
|
||||||
|
|
||||||
Epics use parent-child dependencies to track subtasks.
|
Epics use parent-child dependencies to track subtasks.
|
||||||
|
|
||||||
|
## Epic Template Sections
|
||||||
|
|
||||||
|
Epics require two sections in their description:
|
||||||
|
|
||||||
|
### Success Criteria
|
||||||
|
Define high-level criteria for epic completion. What does "done" look like?
|
||||||
|
|
||||||
|
### Working Model
|
||||||
|
Define HOW the epic will be executed:
|
||||||
|
|
||||||
|
- **Owner role**: Is the assignee a Coordinator (decomposes and delegates) or Implementer (does hands-on work)?
|
||||||
|
- **Delegation target**: Who does the work? Polecats? Other crew? External contributors?
|
||||||
|
- **Review process**: Who approves completed subtasks? What gates must pass?
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```markdown
|
||||||
|
## Working Model
|
||||||
|
- **Owner role**: Coordinator - decompose into subtasks and sling to polecats
|
||||||
|
- **Delegation target**: Polecat swarm (3-5 workers)
|
||||||
|
- **Review process**: Refinery MQ for each subtask, owner approval for epic closure
|
||||||
|
```
|
||||||
|
|||||||
@@ -560,6 +560,7 @@ func (t IssueType) RequiredSections() []RequiredSection {
|
|||||||
case TypeEpic:
|
case TypeEpic:
|
||||||
return []RequiredSection{
|
return []RequiredSection{
|
||||||
{Heading: "## Success Criteria", Hint: "Define high-level success criteria"},
|
{Heading: "## Success Criteria", Hint: "Define high-level success criteria"},
|
||||||
|
{Heading: "## Working Model", Hint: "Owner role (coordinator/implementer), delegation target, review process"},
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
// Chore and custom types have no required sections
|
// Chore and custom types have no required sections
|
||||||
|
|||||||
@@ -579,7 +579,7 @@ func TestIssueTypeRequiredSections(t *testing.T) {
|
|||||||
{TypeBug, 2, "## Steps to Reproduce"},
|
{TypeBug, 2, "## Steps to Reproduce"},
|
||||||
{TypeFeature, 1, "## Acceptance Criteria"},
|
{TypeFeature, 1, "## Acceptance Criteria"},
|
||||||
{TypeTask, 1, "## Acceptance Criteria"},
|
{TypeTask, 1, "## Acceptance Criteria"},
|
||||||
{TypeEpic, 1, "## Success Criteria"},
|
{TypeEpic, 2, "## Success Criteria"},
|
||||||
{TypeChore, 0, ""},
|
{TypeChore, 0, ""},
|
||||||
// Gas Town types are now custom and have no required sections
|
// Gas Town types are now custom and have no required sections
|
||||||
{IssueType("message"), 0, ""},
|
{IssueType("message"), 0, ""},
|
||||||
|
|||||||
@@ -97,19 +97,34 @@ Widget displays correctly`,
|
|||||||
|
|
||||||
// Epic type tests
|
// Epic type tests
|
||||||
{
|
{
|
||||||
name: "epic with success criteria",
|
name: "epic with all sections",
|
||||||
issueType: types.TypeEpic,
|
issueType: types.TypeEpic,
|
||||||
description: `Big project
|
description: `Big project
|
||||||
|
|
||||||
## Success Criteria
|
## Success Criteria
|
||||||
- Project ships
|
- Project ships
|
||||||
- Users happy`,
|
- Users happy
|
||||||
|
|
||||||
|
## Working Model
|
||||||
|
- Owner role: Coordinator
|
||||||
|
- Delegation target: Polecats
|
||||||
|
- Review process: Refinery MQ`,
|
||||||
wantErr: false,
|
wantErr: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "epic missing success criteria",
|
name: "epic missing all sections",
|
||||||
issueType: types.TypeEpic,
|
issueType: types.TypeEpic,
|
||||||
description: "Do everything",
|
description: "Do everything",
|
||||||
|
wantErr: true,
|
||||||
|
wantMissing: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "epic missing working model",
|
||||||
|
issueType: types.TypeEpic,
|
||||||
|
description: `Big project
|
||||||
|
|
||||||
|
## Success Criteria
|
||||||
|
- Project ships`,
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
wantMissing: 1,
|
wantMissing: 1,
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user