feat(projman): add RFC system for feature tracking

Implement wiki-based Request for Comments system for capturing,
reviewing, and tracking feature ideas through their lifecycle.

New commands:
- /rfc-create: Create RFC from conversation or clarified spec
- /rfc-list: List RFCs grouped by status
- /rfc-review: Submit Draft RFC for review
- /rfc-approve: Approve RFC for sprint planning
- /rfc-reject: Reject RFC with documented reason

RFC lifecycle: Draft → Review → Approved → Implementing → Implemented

Integration:
- /sprint-plan detects approved RFCs and offers selection
- /sprint-close updates RFC status on completion
- clarity-assist suggests /rfc-create for feature ideas

New MCP tool: allocate_rfc_number

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-01 12:38:02 -05:00
parent f0f4369eac
commit 16acc0609e
18 changed files with 1441 additions and 13 deletions

View File

@@ -1,6 +1,6 @@
---
name: input-detection
description: Detect planning input source (file, wiki, or conversation)
description: Detect planning input source (RFC, file, wiki, or conversation)
---
# Input Source Detection
@@ -20,12 +20,56 @@ Defines how to detect where planning input is coming from and how to handle each
| Priority | Source | Detection | Action |
|----------|--------|-----------|--------|
| 0 | Approved RFC | RFC-Index has entries in "Approved" section | Offer RFC selection or new work |
| 1 | Local file | `docs/changes/*.md` exists | Parse frontmatter, migrate to wiki, delete local |
| 2 | Existing wiki | `Change VXX.X.X: Proposal` exists | Use as-is, create implementation page |
| 3 | Conversation | Neither exists | Create wiki from discussion context |
---
## RFC Detection (Priority 0)
Before checking for local files or wiki proposals, check for approved RFCs.
### Detection Steps
1. **Fetch RFC-Index:**
```python
get_wiki_page(page_name="RFC-Index", repo="org/repo")
```
2. **Parse Approved Section:**
- Find "## Approved" section
- Extract RFC entries from table
3. **If Approved RFCs Exist:**
```
Approved RFCs available for implementation:
| RFC | Title | Champion |
|-----|-------|----------|
| RFC-0003 | Feature X | @user |
| RFC-0007 | Enhancement Y | @user |
Options:
[1] Implement RFC-0003: Feature X
[2] Implement RFC-0007: Enhancement Y
[3] Describe new work (skip RFCs)
Select an option:
```
4. **If RFC Selected:**
- Use RFC content as planning input
- Status will transition to Implementing after planning approval
- Skip local file and wiki proposal detection
5. **If "New Work" Selected:**
- Continue with normal Priority 1-3 detection
- Optionally offer: "Would you like to create an RFC first? (y/n)"
---
## Local File Format
```yaml

View File

@@ -40,10 +40,18 @@ Execute in order:
### 3. Detect Input Source
Follow `skills/input-detection.md`:
1. Check for `docs/changes/*.md` files
2. Check for existing wiki proposal
3. If neither: use conversation context
4. If ambiguous: ask user
1. **Check for approved RFCs** (Priority 0)
2. Check for `docs/changes/*.md` files
3. Check for existing wiki proposal
4. If neither: use conversation context
5. If ambiguous: ask user
### 3a. RFC Status Update (if RFC selected)
If input source is an RFC:
1. **Note the RFC number** for later status update
2. RFC status update happens AFTER sprint approval (Step 11)
3. The RFC provides the planning context - use its Summary, Motivation, and Design sections
### 4. Search Relevant Lessons Learned
@@ -110,6 +118,31 @@ Follow `skills/sprint-approval.md`:
- Wait for explicit user approval
- Record approval in milestone description
### 12. Update RFC Status (if applicable)
If planning input was an RFC:
1. **Fetch RFC page:**
```python
get_wiki_page(page_name="RFC-NNNN:-Title", repo="org/repo")
```
2. **Update RFC page:**
- Change status: Approved → Implementing
- Add Sprint reference to frontmatter
- Add Implementation section with sprint details and issue links
```python
update_wiki_page(
page_name="RFC-NNNN:-Title",
content="[updated content with Implementing status]",
repo="org/repo"
)
```
3. **Update RFC-Index:**
- Remove from "## Approved" section
- Add to "## Implementing" section with sprint reference
---
## Cleanup After Planning

View File

@@ -0,0 +1,380 @@
---
name: rfc-templates
description: RFC page templates and frontmatter format specifications
---
# RFC Templates
## Purpose
Provides templates for RFC wiki pages and defines the required/optional sections for complete RFC documentation.
## When to Use
- **Commands**: `/rfc-create` when generating new RFC pages
- **Integration**: Referenced by `rfc-workflow.md` for page structure
---
## RFC Page Frontmatter
Every RFC page starts with a metadata block using blockquote format:
```markdown
> **RFC:** 0001
> **Title:** Short Descriptive Title
> **Status:** Draft
> **Author:** @username
> **Created:** 2026-01-25
> **Updated:** 2026-01-25
> **Champion:** (unassigned)
> **Sprint:** (none)
> **Superseded-By:** (none)
```
### Frontmatter Fields
| Field | Required | Description |
|-------|----------|-------------|
| `RFC` | Yes | 4-digit RFC number (e.g., 0001) |
| `Title` | Yes | Short descriptive title |
| `Status` | Yes | Current lifecycle status |
| `Author` | Yes | Original RFC author |
| `Created` | Yes | Creation date (YYYY-MM-DD) |
| `Updated` | Yes | Last update date (YYYY-MM-DD) |
| `Champion` | No | Assigned reviewer/sponsor |
| `Sprint` | No | Sprint reference when implementing |
| `Superseded-By` | No | RFC number if superseded |
---
## Full RFC Page Template
```markdown
> **RFC:** NNNN
> **Title:** [Short Title]
> **Status:** Draft
> **Author:** @[username]
> **Created:** YYYY-MM-DD
> **Updated:** YYYY-MM-DD
> **Champion:** (unassigned)
> **Sprint:** (none)
> **Superseded-By:** (none)
# RFC-NNNN: [Full Title]
## Summary
A brief (2-3 paragraph) explanation of the proposed change. This should be understandable by someone unfamiliar with the codebase.
**What:** What is being proposed?
**Why:** Why is this change needed?
**Impact:** What will be different after this is implemented?
## Motivation
### Problem Statement
Describe the problem this RFC addresses. Include:
- Current pain points or limitations
- User stories or use cases
- Why existing solutions are insufficient
### Goals
- [ ] Goal 1: Specific, measurable outcome
- [ ] Goal 2: Another specific outcome
- [ ] Goal 3: Third outcome
### Non-Goals
What is explicitly out of scope for this RFC:
- Non-goal 1
- Non-goal 2
## Detailed Design
### Overview
High-level description of the solution approach.
### Architecture
Describe the technical architecture:
- Components involved
- Data flow
- Integration points
### Implementation Details
#### Component 1
Detailed implementation for component 1.
#### Component 2
Detailed implementation for component 2.
### API/Interface Changes
If applicable, describe any API or interface changes:
```python
# Example new API
def new_function(param1: str, param2: int) -> dict:
"""Description of new function."""
pass
```
### Database/Storage Changes
If applicable, describe any data model changes.
### Configuration Changes
If applicable, describe any new configuration options.
## Alternatives Considered
### Alternative 1: [Name]
**Description:** Brief description of this alternative.
**Pros:**
- Pro 1
- Pro 2
**Cons:**
- Con 1
- Con 2
**Why not chosen:** Explanation.
### Alternative 2: [Name]
**Description:** Brief description of this alternative.
**Pros:**
- Pro 1
**Cons:**
- Con 1
**Why not chosen:** Explanation.
## Unresolved Questions
Questions that need to be answered before or during implementation:
1. **Question 1:** Description of open question
- Possible answer A
- Possible answer B
2. **Question 2:** Description of another open question
## Dependencies
- Dependency 1: Description and status
- Dependency 2: Description and status
## Security Considerations
Describe any security implications:
- Authentication/authorization impacts
- Data privacy considerations
- Potential attack vectors and mitigations
## Testing Strategy
How will this be tested:
- Unit tests
- Integration tests
- Manual testing checklist
## Rollout Plan
How will this be deployed:
- Feature flags
- Phased rollout
- Rollback strategy
---
## Review Notes
*(Added during Review phase)*
### Review Discussion
Summary of review feedback and discussions.
### Changes Made
List of changes made in response to review feedback.
---
## Decision
*(Added when Approved or Rejected)*
**Decision:** [Approved/Rejected]
**Date:** YYYY-MM-DD
**Decided By:** @[username]
**Rationale:**
Explanation of the decision.
---
## Implementation
*(Added during Implementing phase)*
**Sprint:** [Sprint reference]
**Started:** YYYY-MM-DD
**Issues:**
- #123: Issue title
- #124: Another issue
### Progress Notes
Updates during implementation.
---
## Completion
*(Added when Implemented)*
**Completed:** YYYY-MM-DD
**Release:** vX.Y.Z
**Lessons Learned:** [Link to lessons wiki page]
### Final Notes
Summary of what was implemented and any deviations from the original design.
```
---
## Section Requirements by Status
### Draft (Minimum)
- Summary (complete)
- Motivation (at least Problem Statement)
- Detailed Design (at least Overview)
### Review (Required)
All Draft sections plus:
- Alternatives Considered (at least 1)
- Unresolved Questions (can be empty if none)
### Approved (Required)
All Review sections plus:
- Decision section with approval
### Implementing (Required)
All Approved sections plus:
- Implementation section with Sprint and Issues
### Implemented (Required)
All Implementing sections plus:
- Completion section
---
## RFC-Index Entry Format
### Draft Section Entry
```markdown
| [RFC-0005](RFC-0005:-Idea-Z) | Idea Z | @user | 2026-01-25 |
```
### Review Section Entry
```markdown
| [RFC-0004](RFC-0004:-Feature-Y) | Feature Y | @user | 2026-01-20 |
```
### Approved Section Entry
```markdown
| [RFC-0003](RFC-0003:-Feature-X) | Feature X | @champion | 2026-01-15 |
```
### Implementing Section Entry
```markdown
| [RFC-0002](RFC-0002:-Feature-W) | Feature W | Sprint 18 | 2026-01-22 |
```
### Implemented Section Entry
```markdown
| [RFC-0001](RFC-0001:-Initial-Feature) | Initial Feature | 2026-01-10 | v5.0.0 |
```
### Rejected Section Entry
```markdown
| [RFC-0006](RFC-0006:-Rejected-Idea) | Rejected Idea | Out of scope | 2026-01-18 |
```
---
## Minimal RFC Template (Quick Start)
For rapid RFC creation from conversation:
```markdown
> **RFC:** NNNN
> **Title:** [Title]
> **Status:** Draft
> **Author:** @[username]
> **Created:** YYYY-MM-DD
> **Updated:** YYYY-MM-DD
> **Champion:** (unassigned)
> **Sprint:** (none)
> **Superseded-By:** (none)
# RFC-NNNN: [Title]
## Summary
[Brief description of the proposal]
## Motivation
### Problem Statement
[What problem does this solve?]
### Goals
- [ ] [Primary goal]
## Detailed Design
### Overview
[High-level approach]
## Alternatives Considered
*(To be added during review)*
## Unresolved Questions
- [Any open questions?]
```
---
## Creating RFC from Clarified Spec
When `/clarify` provides a clarified specification, map sections:
| Clarify Output | RFC Section |
|----------------|-------------|
| Problem/Context | Motivation > Problem Statement |
| Goals/Outcomes | Motivation > Goals |
| Scope/Requirements | Detailed Design > Overview |
| Constraints | Detailed Design or Non-Goals |
| Success Criteria | Testing Strategy |

View File

@@ -0,0 +1,308 @@
---
name: rfc-workflow
description: RFC lifecycle management, state transitions, and wiki page conventions
---
# RFC Workflow
## Purpose
Defines the Request for Comments (RFC) system for capturing, reviewing, and tracking feature ideas through their lifecycle from initial proposal to implementation.
## When to Use
- **Planner agent**: When detecting approved RFCs for sprint planning
- **Commands**: `/rfc-create`, `/rfc-list`, `/rfc-review`, `/rfc-approve`, `/rfc-reject`
- **Integration**: With `/sprint-plan` to select approved RFCs for implementation
---
## RFC Lifecycle States
```
┌──────────────────────────────────────────────┐
│ │
▼ │
┌─────────┐ ┌─────────┐ ┌──────────┐ ┌──────────────┐ │
│ Draft │───▶│ Review │───▶│ Approved │───▶│ Implementing │────┤
└─────────┘ └─────────┘ └──────────┘ └──────────────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌─────────────┐ │
│ │ │ Implemented │ │
│ │ └─────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────┐ ┌────────────┐ │
│ │ Rejected │ │ Superseded │ │
│ └──────────┘ └────────────┘ │
│ │
▼ │
┌─────────┐ │
│ Stale │────────────────────────────────────────────────────────┘
└─────────┘ (revived → Draft)
```
---
## State Definitions
| Status | Meaning | Valid Transitions |
|--------|---------|-------------------|
| `Draft` | Idea captured, needs refinement | → Review, → Stale |
| `Review` | Being evaluated by maintainers | → Approved, → Rejected, → Draft |
| `Approved` | Ready for sprint planning | → Implementing |
| `Rejected` | Declined with documented reason | (terminal) |
| `Implementing` | Active sprint work in progress | → Implemented, → Draft (if blocked) |
| `Implemented` | Completed, links to release | → Superseded |
| `Stale` | Draft with no activity >90 days | → Draft (if revived) |
| `Superseded` | Replaced by newer RFC | (terminal) |
---
## State Transition Rules
### Draft → Review
- **Who can transition**: RFC author or any maintainer
- **Requirements**: RFC has complete Summary, Motivation, and Detailed Design sections
- **Action**: Update status, optionally assign champion
### Review → Approved
- **Who can transition**: Maintainer or designated reviewer
- **Requirements**: Review discussion complete, no blocking concerns
- **Action**: Update status, add Decision section with approval reason
### Review → Rejected
- **Who can transition**: Maintainer or designated reviewer
- **Requirements**: Reason must be documented
- **Action**: Update status, add Decision section with rejection reason
### Approved → Implementing
- **Who can transition**: Planner agent via `/sprint-plan`
- **Requirements**: RFC selected for sprint
- **Action**: Update status, add Sprint reference, update RFC-Index
### Implementing → Implemented
- **Who can transition**: Orchestrator agent via `/sprint-close`
- **Requirements**: Sprint completed successfully
- **Action**: Update status, add completion date, link to lessons learned
### Implementing → Draft
- **Who can transition**: Any maintainer
- **Requirements**: Implementation blocked, needs rework
- **Action**: Update status, add Implementation Notes explaining why
### Draft → Stale
- **Automatic**: No activity for 90 days
- **Action**: Update status in RFC-Index
### Stale → Draft
- **Who can transition**: Anyone
- **Requirements**: Renewed interest, updated content
- **Action**: Update status, add Revival Notes
### Implemented → Superseded
- **Who can transition**: Any maintainer
- **Requirements**: New RFC replaces functionality
- **Action**: Update status, add Superseded-By reference
---
## Wiki Page Naming
| Page Type | Naming Convention | Example |
|-----------|-------------------|---------|
| RFC Page | `RFC-NNNN: Short Title` | `RFC-0001: RFC System Implementation` |
| Index Page | `RFC-Index` | `RFC-Index` |
**Number Format:**
- 4-digit zero-padded (0001, 0002, 0003, ...)
- Sequential, never reused
- Allocated via `allocate_rfc_number` MCP tool
---
## Number Allocation Logic
```python
# Pseudocode for allocate_rfc_number
async def allocate_rfc_number(repo):
pages = await list_wiki_pages(repo)
rfc_pages = [p for p in pages if p['title'].startswith('RFC-')]
if not rfc_pages:
return {'next_number': 1, 'formatted': 'RFC-0001'}
numbers = []
for page in rfc_pages:
# Extract number from "RFC-NNNN: Title"
match = re.match(r'RFC-(\d{4})', page['title'])
if match:
numbers.append(int(match.group(1)))
next_num = max(numbers) + 1 if numbers else 1
return {
'next_number': next_num,
'formatted': f'RFC-{next_num:04d}'
}
```
---
## RFC-Index Page Format
The RFC-Index page organizes RFCs by status:
```markdown
# RFC Index
## Approved
RFCs ready for implementation in upcoming sprints.
| RFC | Title | Champion | Created |
|-----|-------|----------|---------|
| [RFC-0003](RFC-0003:-Feature-X) | Feature X | @user | 2026-01-15 |
## In Review
RFCs currently being evaluated.
| RFC | Title | Author | Created |
|-----|-------|--------|---------|
| [RFC-0004](RFC-0004:-Feature-Y) | Feature Y | @user | 2026-01-20 |
## Draft
RFCs in early development.
| RFC | Title | Author | Created |
|-----|-------|--------|---------|
| [RFC-0005](RFC-0005:-Idea-Z) | Idea Z | @user | 2026-01-25 |
## Implementing
RFCs currently being implemented.
| RFC | Title | Sprint | Started |
|-----|-------|--------|---------|
| [RFC-0002](RFC-0002:-Feature-W) | Feature W | Sprint 18 | 2026-01-22 |
## Implemented
Completed RFCs.
| RFC | Title | Completed | Release |
|-----|-------|-----------|---------|
| [RFC-0001](RFC-0001:-Initial-Feature) | Initial Feature | 2026-01-10 | v5.0.0 |
## Rejected
RFCs that were declined.
| RFC | Title | Reason | Date |
|-----|-------|--------|------|
| [RFC-0006](RFC-0006:-Rejected-Idea) | Rejected Idea | Out of scope | 2026-01-18 |
## Stale
Inactive RFCs (no updates >90 days).
| RFC | Title | Last Updated |
|-----|-------|--------------|
```
---
## Creating RFC-Index
If RFC-Index doesn't exist when creating first RFC:
```python
create_wiki_page(
repo="org/repo",
title="RFC-Index",
content="""# RFC Index
## Approved
RFCs ready for implementation in upcoming sprints.
| RFC | Title | Champion | Created |
|-----|-------|----------|---------|
## In Review
RFCs currently being evaluated.
| RFC | Title | Author | Created |
|-----|-------|--------|---------|
## Draft
RFCs in early development.
| RFC | Title | Author | Created |
|-----|-------|--------|---------|
## Implementing
RFCs currently being implemented.
| RFC | Title | Sprint | Started |
|-----|-------|--------|---------|
## Implemented
Completed RFCs.
| RFC | Title | Completed | Release |
|-----|-------|-----------|---------|
## Rejected
RFCs that were declined.
| RFC | Title | Reason | Date |
|-----|-------|--------|------|
## Stale
Inactive RFCs (no updates >90 days).
| RFC | Title | Last Updated |
|-----|-------|--------------|
"""
)
```
---
## Updating RFC-Index
When RFC status changes:
1. Fetch current RFC-Index content
2. Parse sections by status header
3. Remove RFC entry from old section (if present)
4. Add RFC entry to new section
5. Update wiki page
**Example status change (Draft → Review):**
1. Remove from "## Draft" section
2. Add to "## In Review" section
---
## Integration Points
| Component | How It Uses RFC System |
|-----------|------------------------|
| `/rfc-create` | Creates RFC page + updates RFC-Index |
| `/rfc-list` | Reads and displays RFC-Index |
| `/rfc-review` | Transitions Draft → Review |
| `/rfc-approve` | Transitions Review → Approved |
| `/rfc-reject` | Transitions Review/Draft → Rejected |
| `/sprint-plan` | Detects Approved RFCs, transitions to Implementing |
| `/sprint-close` | Transitions Implementing → Implemented |
| `clarity-assist` | Suggests `/rfc-create` for feature ideas |