274 lines
8.9 KiB
Markdown
274 lines
8.9 KiB
Markdown
---
|
||
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
|