Initial commit
This commit is contained in:
273
skills/ln-223-story-replanner/SKILL.md
Normal file
273
skills/ln-223-story-replanner/SKILL.md
Normal file
@@ -0,0 +1,273 @@
|
||||
---
|
||||
name: ln-223-story-replanner
|
||||
description: Replans Stories when Epic requirements change. Compares IDEAL vs existing, categorizes operations (KEEP/UPDATE/OBSOLETE/CREATE), executes in Linear.
|
||||
---
|
||||
|
||||
# Story Replanner
|
||||
|
||||
Universal replanner worker for updating Stories in Epic when requirements change. Invoked by ln-220-story-coordinator (count ≥ 1).
|
||||
|
||||
## When Invoked
|
||||
|
||||
**ln-220-story-coordinator REPLAN MODE (Phase 5b):**
|
||||
- Epic has existing Stories (Linear query count ≥ 1)
|
||||
- IDEAL plan generated (Phase 3)
|
||||
- Standards Research completed by ln-221 (Phase 2, may be updated)
|
||||
- Epic requirements changed (AC modified, features added/removed, standards updated)
|
||||
- Parameters: `epicData`, `idealPlan`, `standardsResearch`, `existingStoryIds`, `teamId`, `autoApprove`
|
||||
|
||||
## Input Parameters
|
||||
|
||||
**From ln-220-story-coordinator:**
|
||||
|
||||
```javascript
|
||||
{
|
||||
epicData: {id, title, description},
|
||||
idealPlan: [{number, title, statement, ac, technicalNotes, estimatedHours, testCounts}],
|
||||
standardsResearch: "OAuth 2.0 (RFC 6749)...", // May differ from existing
|
||||
existingStoryIds: ["STORY-123", "STORY-124"], // Metadata only
|
||||
teamId: "team-id",
|
||||
autoApprove: true
|
||||
}
|
||||
```
|
||||
|
||||
## Workflow
|
||||
|
||||
### Phase 1: Load Existing Stories
|
||||
|
||||
**Progressive Loading for token efficiency:**
|
||||
|
||||
**Step 1:** Orchestrator provides Story metadata (ID, title, status)
|
||||
|
||||
**Step 2:** Load FULL descriptions ONE BY ONE
|
||||
```javascript
|
||||
for each story_id:
|
||||
get_issue(id=story_id) // ~5,000 tokens per Story
|
||||
```
|
||||
|
||||
**Token Rationale:** 10 Stories × 5,000 = 50,000 tokens. Load sequentially to manage context.
|
||||
|
||||
**Step 3:** Parse 8 sections for each Story
|
||||
- Story Statement (persona, capability, value)
|
||||
- Context
|
||||
- Acceptance Criteria (3-5 GWT)
|
||||
- Test Strategy
|
||||
- Technical Notes (**Standards Research** in Library Research subsection)
|
||||
- Definition of Done
|
||||
- Dependencies
|
||||
|
||||
**Step 4:** Extract metadata
|
||||
- ID, number, title, status
|
||||
- Persona, capability, value
|
||||
- AC scenarios
|
||||
- Standards Research (from Technical Notes)
|
||||
|
||||
**Output:** Array of N existing Story structures ready for comparison.
|
||||
|
||||
### Phase 2: Compare IDEAL vs Existing
|
||||
|
||||
**Algorithm:** See [replan_algorithm_stories.md](references/replan_algorithm_stories.md)
|
||||
|
||||
**Match by goal, persona, capability:**
|
||||
|
||||
For EACH Story in IDEAL:
|
||||
- Extract: Title, Persona, Capability
|
||||
- Search existing: Fuzzy match title, check persona/capability overlap
|
||||
- Result: Match → KEEP/UPDATE | No match → CREATE
|
||||
|
||||
For EACH existing Story:
|
||||
- Extract: Title, Persona, Capability (from Story Statement)
|
||||
- Search IDEAL: Fuzzy match
|
||||
- Result: Match → KEEP/UPDATE | No match → OBSOLETE
|
||||
|
||||
**Categorize operations:**
|
||||
|
||||
| Operation | Criteria | Status Constraint | Action |
|
||||
|-----------|----------|-------------------|--------|
|
||||
| **KEEP** | Goal + Persona + Capability + AC + Standards Research same | Any | None |
|
||||
| **UPDATE** | Match + (AC OR Standards Research OR Technical Notes changed) | Backlog/Todo ✅<br>In Progress/Review ⚠️<br>Done ❌ | `update_issue` |
|
||||
| **OBSOLETE** | No match + Feature removed | Backlog/Todo ✅<br>In Progress/Review ⚠️<br>Done ❌ | `update_issue(state="Canceled")` |
|
||||
| **CREATE** | In IDEAL + No match + New requirement | N/A | Generate doc + `create_issue` |
|
||||
|
||||
**Edge Cases:**
|
||||
|
||||
| Case | Action |
|
||||
|------|--------|
|
||||
| **In Progress OBSOLETE** | ⚠️ NO auto-cancel, show warning |
|
||||
| **Done conflicts** | Preserve Done, CREATE follow-up |
|
||||
| **Story Split** (1 → 2+) | ⚠️ UPDATE first + CREATE new |
|
||||
| **Story Merge** (2+ → 1) | ⚠️ UPDATE first + OBSOLETE rest |
|
||||
| **Ambiguous match** (>70% similarity) | Show all, select highest |
|
||||
|
||||
**Details:** [replan_algorithm_stories.md](references/replan_algorithm_stories.md)
|
||||
|
||||
### Phase 3: Show Operations Summary
|
||||
|
||||
```
|
||||
REPLAN SUMMARY for Epic 7: OAuth Authentication
|
||||
|
||||
IDEAL PLAN:
|
||||
1. US004: Register OAuth client (Persona: Third-party developer)
|
||||
2. US005: Request access token ← AC5 ADDED! ← RFC 7636 PKCE ADDED!
|
||||
3. US006: Validate access token
|
||||
4. US009: Token scope management (NEW!)
|
||||
|
||||
EXISTING STORIES:
|
||||
|
||||
✓ US004 - Status: Done - KEEP
|
||||
⚠ US005 - Status: Todo - UPDATE
|
||||
Changes: Add AC5, Add RFC 7636 to Technical Notes, Add 2 Integration tests
|
||||
Diff (AC): + AC5 "Given public client, When request with PKCE..."
|
||||
Diff (Technical Notes): + RFC 7636 (PKCE)
|
||||
✗ US008 - Status: Todo - OBSOLETE (feature removed)
|
||||
+ US009 - NEW (14h, 20 tests, OAuth 2.0 Scope standard)
|
||||
|
||||
OPERATIONS: 2 keep, 1 update, 1 cancel, 1 create
|
||||
|
||||
WARNINGS:
|
||||
- ⚠️ US005 (Todo): AC changed, Standards Research updated
|
||||
- ⚠️ US008 (Todo): Feature removed - check dependencies
|
||||
|
||||
Type "confirm" to execute.
|
||||
```
|
||||
|
||||
**Diffs show:**
|
||||
- AC changes (line-by-line)
|
||||
- Standards Research changes (added/removed RFCs)
|
||||
- Test Strategy changes (test counts)
|
||||
|
||||
**Warnings for:**
|
||||
- Status conflicts (In Progress/Review affected)
|
||||
- Story Split/Merge detected
|
||||
- Ambiguous matches
|
||||
|
||||
### Phase 4: User Confirmation
|
||||
|
||||
**If autoApprove=true:** Skip → Phase 5
|
||||
**Otherwise:** Wait for "confirm"
|
||||
|
||||
**Adjustment:** User can request changes → Recategorize → Show updated summary → Loop until "confirm"
|
||||
|
||||
### Phase 5: Execute Operations
|
||||
|
||||
**Sequence:** UPDATE → OBSOLETE → CREATE → Update kanban
|
||||
|
||||
**UPDATE operations:**
|
||||
1. Generate new Story document (story_template_universal.md from ln-222/references/)
|
||||
2. Validate INVEST (same as ln-222-story-creator Phase 2)
|
||||
3. `update_issue(id, description=new_description)`
|
||||
4. Add comment: "Story updated: AC changed (AC5 added), Standards Research updated (RFC 7636)"
|
||||
|
||||
**OBSOLETE operations:**
|
||||
1. `update_issue(id, state="Canceled")`
|
||||
2. Add comment: "Story canceled: Feature removed from Epic Scope In. Reason: [details]"
|
||||
|
||||
**CREATE operations:**
|
||||
1. Generate Story document (same as ln-222-story-creator Phase 1)
|
||||
2. Validate INVEST
|
||||
3. `create_issue({title, description, project=Epic, team, labels=["user-story"], state="Backlog"})`
|
||||
|
||||
**Update kanban_board.md:**
|
||||
|
||||
**DELETE (OBSOLETE):** Remove canceled Story lines, remove task lines if any, remove Epic header if empty
|
||||
|
||||
**CREATE (NEW):** Find `### Backlog` → Search Epic group → Add Stories (2-space indent)
|
||||
|
||||
**UPDATE Epic Story Counters:** Last Story, Next Story
|
||||
|
||||
**Return:**
|
||||
```
|
||||
REPLAN EXECUTED for Epic 7
|
||||
|
||||
OPERATIONS SUMMARY:
|
||||
✓ Kept: 2 Stories
|
||||
✓ Updated: 1 Story (AC/Standards Research changed)
|
||||
✓ Canceled: 1 Story (feature removed)
|
||||
✓ Created: 1 Story (new requirement)
|
||||
|
||||
UPDATED: [ID: US005](url) - AC5 added, RFC 7636 PKCE added
|
||||
CANCELED: US008 Custom token formats
|
||||
NEW: [ID: US009](url) - Token scope management
|
||||
|
||||
WARNINGS: US005 (Todo) AC changed
|
||||
|
||||
✓ kanban_board.md updated
|
||||
✓ Standards Research updates: RFC 7636 PKCE added to US005
|
||||
|
||||
NEXT STEPS:
|
||||
1. Review warnings
|
||||
2. Run ln-320-story-validator on updated/created Stories
|
||||
3. Use ln-310-story-decomposer to create/replan tasks
|
||||
```
|
||||
|
||||
## Critical Rules
|
||||
|
||||
| Rule | Description |
|
||||
|------|-------------|
|
||||
| **Status Constraints** | UPDATE/OBSOLETE: Backlog/Todo ✅, In Progress/Review ⚠️, Done ❌ |
|
||||
| **Preserve Done** | Never update/cancel Done Stories (CREATE follow-up if conflicts) |
|
||||
| **Story Split/Merge** | Detect 1→2+ OR 2+→1, show warnings (complex, impacts Tasks) |
|
||||
| **Clear Diffs** | Show before/after for UPDATE (AC, Standards Research, Technical Notes) |
|
||||
| **Meaningful Comments** | Explain why updated/canceled (reference removed capabilities) |
|
||||
| **Conservative Updates** | Prefer CREATE over UPDATE when in doubt |
|
||||
| **Progressive Loading** | Load Stories ONE BY ONE (not all at once, token efficiency) |
|
||||
|
||||
## Definition of Done
|
||||
|
||||
**✅ Phase 1:**
|
||||
- [ ] Existing Story IDs queried
|
||||
- [ ] FULL descriptions fetched ONE BY ONE
|
||||
- [ ] 8 sections parsed
|
||||
- [ ] Metadata extracted (persona, capability, AC, Standards Research)
|
||||
|
||||
**✅ Phase 2:**
|
||||
- [ ] Stories matched by goal/persona/capability
|
||||
- [ ] Operations categorized (KEEP/UPDATE/OBSOLETE/CREATE)
|
||||
- [ ] Edge cases detected (Split/Merge, Ambiguous)
|
||||
|
||||
**✅ Phase 3:**
|
||||
- [ ] Operations summary shown
|
||||
- [ ] Diffs shown for UPDATE (AC, Standards Research, Technical Notes)
|
||||
- [ ] Warnings shown
|
||||
|
||||
**✅ Phase 4:**
|
||||
- [ ] autoApprove=true OR user confirmed
|
||||
|
||||
**✅ Phase 5:**
|
||||
- [ ] All operations executed (UPDATE/OBSOLETE/CREATE)
|
||||
- [ ] kanban_board.md updated
|
||||
- [ ] Summary returned (URLs + warnings)
|
||||
|
||||
## Reference Files
|
||||
|
||||
### replan_algorithm_stories.md
|
||||
|
||||
**Location:** `references/` (owned by this skill)
|
||||
**Purpose:** Detailed comparison logic for REPLAN mode (Story level)
|
||||
**Contents:** KEEP/UPDATE/OBSOLETE/CREATE rules, Match criteria, Status constraints, Edge cases, Examples
|
||||
**Usage:** Applied in Phase 2
|
||||
|
||||
### story_template_universal.md
|
||||
|
||||
**Location:** `ln-222-story-creator/references/` (ln-222 ownership)
|
||||
**Purpose:** Universal Story template (8 sections)
|
||||
**Usage:** Read when generating updated Story documents for UPDATE/CREATE operations
|
||||
|
||||
## Integration
|
||||
|
||||
**Called by:** ln-220-story-coordinator (Phase 5b, count ≥ 1)
|
||||
|
||||
**Returns:**
|
||||
- Success: Operations summary + URLs + warnings
|
||||
- Error: "Story USXXX violates INVEST: [details]"
|
||||
|
||||
**Worker does NOT:**
|
||||
- Query Linear for Epic (already in context)
|
||||
- Analyze Epic complexity (orchestrator Phase 3)
|
||||
- Research standards (orchestrator Phase 2)
|
||||
- Build IDEAL plan (receives from orchestrator)
|
||||
|
||||
---
|
||||
|
||||
**Version:** 1.0.0
|
||||
**Last Updated:** 2025-11-20
|
||||
111
skills/ln-223-story-replanner/diagram.html
Normal file
111
skills/ln-223-story-replanner/diagram.html
Normal file
@@ -0,0 +1,111 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>ln-223-story-replanner Workflow</title>
|
||||
<link rel="stylesheet" href="../shared/css/diagram.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
|
||||
<script>
|
||||
mermaid.initialize({
|
||||
startOnLoad: true,
|
||||
theme: 'base',
|
||||
themeVariables: {
|
||||
primaryColor: '#4A90E2',
|
||||
primaryTextColor: '#fff',
|
||||
primaryBorderColor: '#2E5C8A',
|
||||
lineColor: '#5C6BC0',
|
||||
secondaryColor: '#7E57C2',
|
||||
tertiaryColor: '#26A69A'
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>ln-223-story-replanner: Story Replanner</h1>
|
||||
|
||||
<div class="diagram-section">
|
||||
<h2>Workflow Diagram</h2>
|
||||
<div class="mermaid">
|
||||
graph TD
|
||||
Start([Input: epicData, idealPlan, standardsResearch, existingCount]) --> Phase1[Phase 1: Load Existing Stories]
|
||||
|
||||
Phase1 --> LoadLoop[Progressive Loading:<br/>For EACH Story ONE BY ONE<br/>get_issue with full description]
|
||||
LoadLoop --> Phase2[Phase 2: Compare IDEAL vs Existing]
|
||||
|
||||
Phase2 --> CompareAll[Match IDEAL to Existing<br/>Fuzzy match: title, persona, capability]
|
||||
CompareAll --> Categorize[Categorize Operations:<br/>KEEP, UPDATE, OBSOLETE, CREATE]
|
||||
Categorize --> CheckEdge{Edge cases?}
|
||||
CheckEdge -->|Split/Merge| DetectComplex[⚠️ Story Split 1→2+<br/>⚠️ Story Merge 2+→1]
|
||||
CheckEdge -->|Status conflicts| CheckStatus[⚠️ In Progress/Review<br/>❌ Done]
|
||||
CheckEdge -->|No| Phase3[Phase 3: Show Replan Summary]
|
||||
|
||||
DetectComplex --> Phase3
|
||||
CheckStatus --> Phase3
|
||||
|
||||
Phase3 --> ShowSummary[Display:<br/>IDEAL Plan changes<br/>Operations breakdown<br/>Diffs AC/Standards Research<br/>Warnings status/splits/merges]
|
||||
ShowSummary --> Phase4[Phase 4: User Confirmation]
|
||||
|
||||
Phase4 --> CheckApprove{autoApprove?}
|
||||
CheckApprove -->|true| Phase5
|
||||
CheckApprove -->|false| WaitConfirm[Wait for 'confirm']
|
||||
WaitConfirm --> Phase5[Phase 5: Execute Operations]
|
||||
|
||||
Phase5 --> ExecKeep[KEEP: Skip N Stories unchanged]
|
||||
Phase5 --> ExecUpdate[UPDATE: update_issue<br/>new description Backlog/Todo only]
|
||||
Phase5 --> ExecObsolete[OBSOLETE: update_issue<br/>state=Canceled + comment Backlog/Todo]
|
||||
Phase5 --> ExecCreate[CREATE: Generate doc<br/>create_issue project=Epic labels=user-story]
|
||||
|
||||
ExecKeep --> UpdateKanban[Update kanban_board.md:<br/>Add NEW Stories ONLY<br/>Epic Grouping Algorithm<br/>Update Epic Story Counters]
|
||||
ExecUpdate --> UpdateKanban
|
||||
ExecObsolete --> UpdateKanban
|
||||
ExecCreate --> UpdateKanban
|
||||
|
||||
UpdateKanban --> Summary[Display Summary:<br/>Operations executed<br/>URLs Warnings<br/>Next Steps]
|
||||
Summary --> End([Done])
|
||||
|
||||
style Start fill:#4A90E2,stroke:#2E5C8A,color:#fff
|
||||
style End fill:#26A69A,stroke:#1B5E20,color:#fff
|
||||
style Phase1 fill:#7E57C2,stroke:#4A148C,color:#fff
|
||||
style Phase2 fill:#7E57C2,stroke:#4A148C,color:#fff
|
||||
style Phase3 fill:#7E57C2,stroke:#4A148C,color:#fff
|
||||
style Phase4 fill:#7E57C2,stroke:#4A148C,color:#fff
|
||||
style Phase5 fill:#26A69A,stroke:#1B5E20,color:#fff
|
||||
style CheckEdge fill:#FF9800,stroke:#E65100,color:#fff
|
||||
style CheckApprove fill:#FF9800,stroke:#E65100,color:#fff
|
||||
style DetectComplex fill:#F44336,stroke:#B71C1C,color:#fff
|
||||
style CheckStatus fill:#F44336,stroke:#B71C1C,color:#fff
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-section">
|
||||
<h2>Key Information</h2>
|
||||
<ul>
|
||||
<li><strong>Type:</strong> Worker (L3)</li>
|
||||
<li><strong>Phases:</strong> 5 (Load → Compare → Summary → Confirm → Execute)</li>
|
||||
<li><strong>Invoked by:</strong> ln-220-story-coordinator (Phase 5b, REPLAN MODE)</li>
|
||||
<li><strong>Input:</strong> epicData, idealPlan (5-10 Stories), standardsResearch, existingCount ≥1, teamId, autoApprove</li>
|
||||
<li><strong>Output:</strong> Operations executed (KEEP/UPDATE/OBSOLETE/CREATE) + kanban_board.md updated</li>
|
||||
<li><strong>Edge Cases:</strong> Story Split (1→2+), Story Merge (2+→1), Status conflicts (In Progress/Review/Done)</li>
|
||||
<li><strong>Version:</strong> 1.0.0</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="notes-section">
|
||||
<h2>Important Notes</h2>
|
||||
<ul>
|
||||
<li><strong>Phase 1:</strong> Progressive Loading - load existing Stories ONE BY ONE with FULL descriptions (token efficiency: 10 Stories × 5,000 tokens = 50,000 tokens)</li>
|
||||
<li><strong>Phase 2:</strong> Match IDEAL to existing via fuzzy match (title, persona, capability), categorize KEEP/UPDATE/OBSOLETE/CREATE, detect Story Split (1→2+), Story Merge (2+→1)</li>
|
||||
<li><strong>Phase 3:</strong> Show replan summary with IDEAL Plan changes, operations breakdown (N keep, N update, N cancel, N create), diffs (AC, Standards Research), warnings (status conflicts, splits, merges)</li>
|
||||
<li><strong>Phase 4:</strong> autoApprove=true (automation mode) skips user confirmation, otherwise wait for "confirm"</li>
|
||||
<li><strong>Phase 5:</strong> Execute operations - UPDATE/OBSOLETE only Backlog/Todo (warnings for In Progress/Review, never touch Done), CREATE new Stories (project=Epic, labels=user-story, state=Backlog), update kanban_board.md (add NEW Stories ONLY via Epic Grouping Algorithm)</li>
|
||||
<li><strong>Status Constraints:</strong> UPDATE/OBSOLETE allowed for Backlog/Todo ✅, warnings for In Progress/Review ⚠️, never touch Done ❌ (preserve work, create follow-up Stories instead)</li>
|
||||
<li><strong>Standards Research:</strong> UPDATE Stories when Epic standards change (new RFCs added/removed), insert updated research in Technical Notes → Library Research (Backlog/Todo only)</li>
|
||||
<li><strong>Story Split Detection:</strong> 1 existing → 2+ IDEAL (same persona, split capabilities) → UPDATE first + CREATE new with warnings</li>
|
||||
<li><strong>Story Merge Detection:</strong> 2+ existing → 1 IDEAL (combined capabilities) → UPDATE first + OBSOLETE rest with warnings</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,176 @@
|
||||
# Story Replan Algorithm
|
||||
|
||||
Comparison logic for ln-223-story-replanner REPLAN MODE. Determines operations (KEEP/UPDATE/OBSOLETE/CREATE) when existing Stories found for Epic.
|
||||
|
||||
## Overview
|
||||
|
||||
**Key Principle:** IDEAL plan (from ln-220 Phase 3) = source of truth. Compare existing Stories against IDEAL.
|
||||
|
||||
**Inputs:**
|
||||
- IDEAL Story Plan: 5-10 Stories, vertical slices, AC 3-5 each, Standards Research from ln-221
|
||||
- Existing Stories: Linear issues (Story Statement, AC, Technical Notes with Standards Research, status)
|
||||
|
||||
## Comparison Algorithm
|
||||
|
||||
### Match Criteria
|
||||
|
||||
**For EACH Story in IDEAL:**
|
||||
- Extract: Title, Persona, Capability, Value
|
||||
- Search existing: Fuzzy match title, check persona overlap, check capability overlap
|
||||
- Result: Match found → KEEP/UPDATE candidate | No match → CREATE
|
||||
|
||||
**For EACH existing Story:**
|
||||
- Extract: Title, Persona, Capability, Value (from Story Statement)
|
||||
- Search IDEAL: Fuzzy match
|
||||
- Result: Match found → KEEP/UPDATE candidate | No match → OBSOLETE
|
||||
|
||||
### Operations Matrix
|
||||
|
||||
| Operation | Criteria | Status Constraint | Action |
|
||||
|-----------|----------|-------------------|--------|
|
||||
| **KEEP** | Goal match + Persona same + Capability same + AC same + Standards Research same | Any | None |
|
||||
| **UPDATE** | Goal match + (AC changed OR Standards Research changed OR Technical Notes changed) | Backlog/Todo ✅<br>In Progress/Review ⚠️<br>Done ❌ | `update_issue(description)` |
|
||||
| **OBSOLETE** | No goal match + Feature removed from Epic Scope In | Backlog/Todo ✅<br>In Progress/Review ⚠️<br>Done ❌ | `update_issue(state="Canceled")` + comment |
|
||||
| **CREATE** | In IDEAL + No existing match + New Epic requirement | N/A | Generate doc + `create_issue()` |
|
||||
|
||||
### Edge Cases
|
||||
|
||||
| Case | Condition | Action |
|
||||
|------|-----------|--------|
|
||||
| **In Progress OBSOLETE** | Story not in IDEAL + status In Progress/Review | ⚠️ NO auto-cancel, show warning |
|
||||
| **Done conflicts** | IDEAL differs from Done Stories | Preserve Done, CREATE follow-up |
|
||||
| **Story Split** | 1 existing → 2+ IDEAL (same persona, split capabilities) | ⚠️ UPDATE first + CREATE new |
|
||||
| **Story Merge** | 2+ existing → 1 IDEAL (combined capabilities) | ⚠️ UPDATE first + OBSOLETE rest |
|
||||
| **Ambiguous match** | >1 existing matches IDEAL (>70% similarity) | Show all, select highest |
|
||||
| **Standards Research changed** | Epic standards updated (new RFCs added/removed) | UPDATE all affected Stories (Backlog/Todo only) |
|
||||
|
||||
## Example Scenarios
|
||||
|
||||
### Scenario 1: AC + Standards Research Update
|
||||
|
||||
**Change:** AC5 "PKCE flow" added to US005, RFC 7636 added to Epic
|
||||
|
||||
**IDEAL:** US005 (AC1-AC5, OAuth 2.0 + RFC 7636 PKCE)
|
||||
**Existing:** US005 (AC1-AC4, OAuth 2.0 ONLY)
|
||||
|
||||
**Operation:** UPDATE US005
|
||||
- Add AC5: "Given public client, When request token with PKCE, Then validate code_challenge"
|
||||
- Update Technical Notes → Library Research: Add RFC 7636 (PKCE)
|
||||
- Update Test Strategy: Add 2 Integration tests
|
||||
|
||||
### Scenario 2: Feature Removed
|
||||
|
||||
**Change:** Custom token formats removed from Epic Scope In
|
||||
|
||||
**IDEAL:** 5 Stories (US004-US008, standard OAuth 2.0 only)
|
||||
**Existing:** 6 Stories (US004-US009, US009 = custom tokens)
|
||||
|
||||
**Operation:** OBSOLETE US009
|
||||
- Comment: "Custom token formats removed from Epic Scope In per Epic v2.0.0. Simplified to standard OAuth 2.0 only."
|
||||
|
||||
### Scenario 3: New Story Added
|
||||
|
||||
**Change:** NEW capability "Token scope management" added to Epic
|
||||
|
||||
**IDEAL:** 6 Stories (US004-US009, US009 = token scopes NEW)
|
||||
**Existing:** 5 Stories (US004-US008)
|
||||
|
||||
**Operation:** CREATE US009
|
||||
- Persona: API client
|
||||
- Capability: Request tokens with specific scopes (read, write, admin)
|
||||
- AC: 4 scenarios
|
||||
- Standards Research: OAuth 2.0 Scope (RFC 6749 Section 3.3)
|
||||
|
||||
### Scenario 4: Story Split (1 → 2+)
|
||||
|
||||
**Change:** US004 "User authentication" split into 3 focused Stories
|
||||
|
||||
**IDEAL:** US004 "Login" + US005 "Password reset" + US006 "Session"
|
||||
**Existing:** US004 "User authentication" (AC1-AC9: login + password + session)
|
||||
|
||||
**Detection:** US004 existing matches US004 IDEAL (70%), US005 IDEAL (60%), US006 IDEAL (55%)
|
||||
|
||||
**Operations:**
|
||||
- UPDATE US004: Narrow to "Login" only (keep AC1-AC3, remove AC4-AC9)
|
||||
- CREATE US005: "Password reset" (AC4-AC6 from old US004)
|
||||
- CREATE US006: "Session management" (AC7-AC9 from old US004)
|
||||
|
||||
⚠️ Warning: "Story Split detected: US004 'User authentication' → US004 'Login' (update) + US005 'Password reset' (create) + US006 'Session management' (create)"
|
||||
|
||||
### Scenario 5: Story Merge (2+ → 1)
|
||||
|
||||
**Change:** US004 "Product list" + US005 "Product search" merged into US004 "Product catalog"
|
||||
|
||||
**IDEAL:** US004 "Product catalog" (list + search combined)
|
||||
**Existing:** US004 "Product list" (AC1-AC3) + US005 "Product search" (AC4-AC6)
|
||||
|
||||
**Detection:** (US004 + US005 existing) matches US004 IDEAL (85% similarity)
|
||||
|
||||
**Operations:**
|
||||
- UPDATE US004: Expand to "Product catalog" (add AC4-AC6 from US005)
|
||||
- OBSOLETE US005: Comment "Merged into US004 Product catalog for vertical slicing"
|
||||
|
||||
⚠️ Warning: "Story Merge detected: US004 'Product list' + US005 'Product search' → US004 'Product catalog' (update US004, obsolete US005)"
|
||||
|
||||
## Status Constraints
|
||||
|
||||
| Status | UPDATE | OBSOLETE |
|
||||
|--------|--------|----------|
|
||||
| **Backlog/Todo** | ✅ Allowed | ✅ Allowed |
|
||||
| **In Progress/To Review** | ⚠️ Warning, manual review | ⚠️ Warning, manual review |
|
||||
| **Done** | ❌ Never (preserve work) | ❌ Never (preserve history) |
|
||||
|
||||
**Done Story conflicts:** Keep Done, CREATE follow-up Story to address discrepancy.
|
||||
|
||||
Example: Done US005 "Request token" (without PKCE) + IDEAL "Request token with PKCE" → KEEP US005, CREATE US010 "Add PKCE support"
|
||||
|
||||
## Best Practices
|
||||
|
||||
| Practice | Rationale |
|
||||
|----------|-----------|
|
||||
| **Conservative Updates** | Prefer CREATE over UPDATE when in doubt (preserves existing work) |
|
||||
| **Respect Status** | Never auto-update/cancel In Progress/Review/Done Stories |
|
||||
| **Preserve History** | Use state="Canceled" for obsolete Stories (don't delete) |
|
||||
| **Clear Diffs** | Show before/after for UPDATE (AC, Standards Research, Technical Notes) |
|
||||
| **Meaningful Comments** | Explain why canceled (reference removed capabilities, reason) |
|
||||
| **Split/Merge Detection** | Show warnings for structural changes (complex, impacts Tasks) |
|
||||
| **Vertical Slicing** | Ensure IDEAL plan uses vertical slices (complete user journeys) |
|
||||
| **Standards Consistency** | UPDATE all affected Stories when Epic standards change (Backlog/Todo only) |
|
||||
|
||||
## Output Format
|
||||
|
||||
```
|
||||
REPLAN SUMMARY for Epic 7: OAuth Authentication
|
||||
|
||||
IDEAL PLAN:
|
||||
1. US004: Register OAuth client (Persona: Third-party developer)
|
||||
2. US005: Request access token ← AC5 ADDED! ← RFC 7636 PKCE ADDED!
|
||||
3. US006: Validate access token
|
||||
4. US007: Refresh expired token
|
||||
5. US009: Token scope management (NEW!)
|
||||
|
||||
EXISTING STORIES:
|
||||
|
||||
✓ US004: Register OAuth client - Status: Done - KEEP
|
||||
⚠ US005: Request access token - Status: Todo - UPDATE
|
||||
Changes: Add AC5, Add RFC 7636 to Technical Notes, Add 2 Integration tests
|
||||
Diff (AC): + AC5 "Given public client, When request with PKCE..."
|
||||
Diff (Technical Notes): + RFC 7636 (PKCE)
|
||||
✓ US006: Validate access token - Status: Backlog - KEEP
|
||||
✓ US007: Refresh expired token - Status: In Progress - KEEP
|
||||
✗ US008: Custom token formats - Status: Todo - OBSOLETE (feature removed)
|
||||
+ US009: Token scope management - NEW (14h, 20 tests)
|
||||
|
||||
OPERATIONS: 3 keep, 1 update, 1 cancel, 1 create
|
||||
|
||||
WARNINGS:
|
||||
- ⚠️ US005 (Todo): AC changed, Standards Research updated
|
||||
- ⚠️ US008 (Todo): Feature removed - check dependencies
|
||||
|
||||
Type "confirm" to execute.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Version:** 1.0.0
|
||||
**Last Updated:** 2025-11-20
|
||||
Reference in New Issue
Block a user