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`
|
||||
|
||||
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:
|
||||
return []RequiredSection{
|
||||
{Heading: "## Success Criteria", Hint: "Define high-level success criteria"},
|
||||
{Heading: "## Working Model", Hint: "Owner role (coordinator/implementer), delegation target, review process"},
|
||||
}
|
||||
default:
|
||||
// Chore and custom types have no required sections
|
||||
|
||||
@@ -579,7 +579,7 @@ func TestIssueTypeRequiredSections(t *testing.T) {
|
||||
{TypeBug, 2, "## Steps to Reproduce"},
|
||||
{TypeFeature, 1, "## Acceptance Criteria"},
|
||||
{TypeTask, 1, "## Acceptance Criteria"},
|
||||
{TypeEpic, 1, "## Success Criteria"},
|
||||
{TypeEpic, 2, "## Success Criteria"},
|
||||
{TypeChore, 0, ""},
|
||||
// Gas Town types are now custom and have no required sections
|
||||
{IssueType("message"), 0, ""},
|
||||
|
||||
@@ -97,19 +97,34 @@ Widget displays correctly`,
|
||||
|
||||
// Epic type tests
|
||||
{
|
||||
name: "epic with success criteria",
|
||||
name: "epic with all sections",
|
||||
issueType: types.TypeEpic,
|
||||
description: `Big project
|
||||
|
||||
## Success Criteria
|
||||
- Project ships
|
||||
- Users happy`,
|
||||
- Users happy
|
||||
|
||||
## Working Model
|
||||
- Owner role: Coordinator
|
||||
- Delegation target: Polecats
|
||||
- Review process: Refinery MQ`,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "epic missing success criteria",
|
||||
name: "epic missing all sections",
|
||||
issueType: types.TypeEpic,
|
||||
description: "Do everything",
|
||||
wantErr: true,
|
||||
wantMissing: 2,
|
||||
},
|
||||
{
|
||||
name: "epic missing working model",
|
||||
issueType: types.TypeEpic,
|
||||
description: `Big project
|
||||
|
||||
## Success Criteria
|
||||
- Project ships`,
|
||||
wantErr: true,
|
||||
wantMissing: 1,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user