feat: add planning-time gap analysis and parallel execution enhancements

- Add create-story-with-gap-analysis workflow for verified codebase scanning at planning time
- Fix autonomous-epic to support parallel execution (no auto-branch creation)
- Fix autonomous-epic and super-dev-story to auto-accept gap analysis in autonomous mode
- Fix push-all to support targeted file commits (safe for parallel agents)
- Update dev-story and super-dev-story to pass auto_accept_gap_analysis parameter
- Add explicit autonomous mode instructions to workflows

Breaking changes: None - all enhancements are backward compatible
This commit is contained in:
Jonah Schulte 2025-12-27 02:29:46 -05:00
parent 5b3f3479c8
commit 949a8c3236
16 changed files with 1144 additions and 69 deletions

View File

@ -96,6 +96,40 @@ autonomous_settings:
max_retry_per_story: 2 # Retry failed stories
create_git_commits: true # Commit after each story
git_branch_prefix: "auto-epic-" # Branch: auto-epic-{epic_num}
# Task-based completion verification (NEW)
completion_verification:
task_based_completion: true # Check actual tasks, not just status
process_review_with_unchecked: true # Process "review" stories with unchecked tasks
process_done_with_unchecked: true # Process "done" stories if tasks remain
verify_after_development: true # Re-check after each story
strict_epic_completion: true # Epic only done when ALL tasks complete
```
### Task-Based Completion (Important!)
**The autonomous epic workflow now uses TASK-BASED completion**, not just status-based:
| What Changed | Old Behavior | New Behavior |
|--------------|--------------|--------------|
| "review" status | ⏭️ Skipped | ✅ Processed if unchecked tasks exist |
| "done" status | ⏭️ Skipped | ✅ Verified, processed if tasks remain |
| Completion check | Status-based | Task-based (count `- [ ]`) |
| Epic marked done | When all stories "done" | When ALL tasks `- [x]` |
**Why this matters:** Code reviews often add new tasks (CR-1, CR-2, etc.) that need implementation. The old workflow would skip these stories because they were marked "review". Now we scan for actual unchecked tasks.
```
📊 Epic 4 Status (Task-Based Analysis)
By Actual Task Completion:
- ✅ Truly Done: 0 (all tasks checked, will skip)
- 🔧 Needs Work: 7 (has unchecked tasks)
4-1: 6 unchecked (CR tasks)
4-2: 4 unchecked (original work)
4-3: 7 unchecked (CR tasks)
...
- 📝 Backlog: 0 (will create + develop)
```
### Per-Epic Override

View File

@ -4,6 +4,21 @@
<critical>Communicate all responses in {communication_language}</critical>
<critical>🤖 AUTONOMOUS EPIC PROCESSING - Full automation of epic completion!</critical>
<critical>This workflow orchestrates create-story and super-dev-story for each story in an epic</critical>
<critical>TASK-BASED COMPLETION: A story is ONLY complete when it has ZERO unchecked tasks (- [ ])</critical>
<!-- AUTONOMOUS MODE INSTRUCTIONS - READ THESE CAREFULLY -->
<critical>⚡ AUTONOMOUS MODE: When auto_accept_gap_analysis=true in workflow.yaml, you MUST:
- NEVER ask the user to approve gap analysis refinements
- AUTOMATICALLY accept all gap analysis proposals
- PROCEED immediately without waiting for user input on gap analysis
- Only ask for user input at the START of the workflow (epic selection, Y/D/n choice)
</critical>
<critical>⚡ INVOKING SUB-WORKFLOWS: When you see invoke-workflow, you must:
1. Load the referenced workflow.yaml file
2. Load its instructions.xml file
3. Execute that workflow completely
4. Return to this workflow and continue
</critical>
<step n="1" goal="Initialize and validate epic">
<output>🤖 **Autonomous Epic Processing**
@ -11,8 +26,12 @@
This workflow will automatically:
1. Create each story just-in-time (using create-story)
2. Develop each story (using super-dev-story or dev-story)
3. Commit and push after each story (integrated in super-dev)
4. Generate epic completion report
3. **Verify completion** by checking ALL tasks are done (- [x])
4. Commit and push after each story (integrated in super-dev)
5. Generate epic completion report
**Key Improvement:** Stories in "review" status with unchecked tasks
WILL be processed - we check actual task completion, not just status!
**Time Estimate:** Varies by epic size
- Small epic (3-5 stories): 3-6 hours
@ -42,26 +61,45 @@
<anchor id="validate_epic" />
<action>Load {{sprint_status}} file</action>
<action>Find epic-{{epic_num}} entry</action>
<action>Count stories by status (backlog, ready-for-dev, in-progress, review, done)</action>
<action>Find epic-{{epic_num}} entry and all story entries for this epic</action>
<!-- TASK-BASED ANALYSIS: Scan actual story files for unchecked tasks -->
<action>For each story in epic:
1. Read the story file from {{story_dir}}/{{story_key}}.md
2. Count unchecked tasks: grep -c "^- \[ \]" or regex match "- \[ \]"
3. Count checked tasks: grep -c "^- \[x\]" or regex match "- \[x\]"
4. Categorize story:
- "truly_done": status=done AND unchecked_tasks=0
- "needs_work": unchecked_tasks > 0 (regardless of status)
- "backlog": status=backlog (file may not exist yet)
</action>
<output>
📊 **Epic {{epic_num}} Status**
📊 **Epic {{epic_num}} Status (Task-Based Analysis)**
Total stories: {{total_story_count}}
- Backlog: {{backlog_count}} (will create + develop)
- Ready-for-dev: {{ready_count}} (will develop)
- In-progress: {{inprogress_count}} (will resume)
- Review/Done: {{done_count}} (will skip)
**Work Remaining:** {{work_count}} stories
**By Actual Task Completion:**
- ✅ Truly Done: {{truly_done_count}} (all tasks checked, will skip)
- 🔧 Needs Work: {{needs_work_count}} (has unchecked tasks)
{{list_needs_work_with_task_counts}}
- 📝 Backlog: {{backlog_count}} (will create + develop)
**By Status (for reference):**
- done: {{done_status_count}}
- review: {{review_status_count}}
- in-progress: {{inprogress_status_count}}
- ready-for-dev: {{ready_status_count}}
- backlog: {{backlog_status_count}}
**Work Remaining:** {{work_count}} stories with {{total_unchecked_tasks}} unchecked tasks
**Estimated Time:** {{estimated_hours}} hours
**Estimated Tokens:** ~{{estimated_tokens}}K
</output>
<ask>**Proceed with autonomous processing?**
[Y] Yes - Use super-dev-story (comprehensive validation)
[Y] Yes - Use super-dev-story (comprehensive validation + code review)
[D] Dev-story - Faster, less validation
[n] No - Cancel
</ask>
@ -80,10 +118,17 @@
</check>
</step>
<step n="2" goal="Create git branch and initialize tracking">
<action>Get current branch name</action>
<action>Create new branch: auto-epic-{{epic_num}}</action>
<output>📝 Created branch: auto-epic-{{epic_num}}</output>
<step n="2" goal="Initialize tracking (optionally create branch)">
<action>Get current branch name and store as {{current_branch}}</action>
<check if="{{create_epic_branch}} == true">
<action>Create new branch: auto-epic-{{epic_num}}</action>
<output>📝 Created branch: auto-epic-{{epic_num}}</output>
</check>
<check if="{{create_epic_branch}} == false">
<output>📝 Staying on current branch: {{current_branch}} (parallel epic mode)</output>
</check>
<action>Initialize progress tracking file:
- epic_num
@ -96,23 +141,28 @@
</step>
<step n="3" goal="Process all stories in epic">
<critical>🔄 STORY LOOP - Create and develop each story</critical>
<critical>🔄 STORY LOOP - Create and develop each story until ALL tasks complete</critical>
<action>Find all stories in epic {{epic_num}} needing work</action>
<action>Sort by story number (ascending)</action>
<action>Build ordered list of stories needing work:
1. All stories with unchecked tasks (regardless of status)
2. All backlog stories
3. Sort by story number (ascending)
</action>
<action>Initialize counters: success=0, failure=0</action>
<!-- STORY LOOP -->
<loop foreach="{{stories_needing_work}}">
<action>Set {{current_story}}</action>
<action>Read story file and count unchecked tasks</action>
<output>
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Story {{counter}}/{{work_count}}: {{current_story.key}}
Status: {{current_story.status}} | Unchecked Tasks: {{unchecked_count}}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
</output>
<!-- CREATE STORY IF NEEDED -->
<!-- CREATE STORY IF NEEDED (only for backlog) -->
<check if="status == 'backlog'">
<output>📝 Creating story...</output>
@ -131,38 +181,62 @@
</catch>
</check>
<!-- DEVELOP STORY -->
<output>💻 Developing with {{dev_workflow}}...</output>
<!-- DEVELOP STORY (for any story with unchecked tasks) -->
<check if="{{unchecked_count}} > 0">
<output>💻 Developing {{unchecked_count}} remaining tasks with {{dev_workflow}}...</output>
<try>
<check if="{{dev_workflow}} == 'super-dev-story'">
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/super-dev-story/workflow.yaml">
<input name="story_file" value="{{current_story_file}}" />
<note>Includes: dev + post-gap + review + push-all</note>
</invoke-workflow>
</check>
<try>
<check if="{{dev_workflow}} == 'super-dev-story'">
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/super-dev-story/workflow.yaml">
<input name="story_file" value="{{current_story_file}}" />
<input name="auto_accept_gap_analysis" value="true" />
<note>Includes: dev + post-gap + review + push-all (auto-accepting gap analysis)</note>
</invoke-workflow>
</check>
<check if="{{dev_workflow}} == 'dev-story'">
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml">
<input name="story_file" value="{{current_story_file}}" />
</invoke-workflow>
<check if="{{dev_workflow}} == 'dev-story'">
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml">
<input name="story_file" value="{{current_story_file}}" />
<input name="auto_accept_gap_analysis" value="true" />
</invoke-workflow>
<!-- Push after dev-story -->
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/push-all/workflow.yaml">
<note>Commit and push story changes</note>
</invoke-workflow>
</check>
<!-- Extract File List from story for targeted commit -->
<action>Read story file and extract "File List" section</action>
<action>Parse all file paths, include the story file itself</action>
<action>Store as {{story_files}} - space-separated list</action>
<output>✅ Story complete and pushed</output>
<action>Increment success_count</action>
<action>Update progress file</action>
</try>
<!-- Push after dev-story (targeted to this story's files only) -->
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/push-all/workflow.yaml">
<input name="target_files" value="{{story_files}}" />
<input name="story_key" value="{{current_story.key}}" />
<note>Only commit files from this story (parallel-agent safe)</note>
</invoke-workflow>
</check>
<catch>
<output>❌ Story failed: {{error}}</output>
<action>Add to failed_stories, continue</action>
<action>Increment failure_count</action>
</catch>
<!-- VERIFY COMPLETION: Re-check for unchecked tasks -->
<action>Re-read story file and count unchecked tasks</action>
<check if="{{remaining_unchecked}} > 0">
<output>⚠️ Story still has {{remaining_unchecked}} unchecked tasks after development</output>
<action>Log incomplete tasks for review</action>
<action>Mark as partial success</action>
</check>
<check if="{{remaining_unchecked}} == 0">
<output>✅ Story complete - all tasks checked!</output>
<action>Update story status to "done" in sprint-status.yaml</action>
</check>
<action>Increment success_count</action>
<action>Update progress file</action>
</try>
<catch>
<output>❌ Story failed: {{error}}</output>
<action>Add to failed_stories with error details</action>
<action>Increment failure_count</action>
</catch>
</check>
<output>Progress: {{success_count}} ✅ | {{failure_count}} ❌ | {{remaining}} pending</output>
</loop>
@ -171,24 +245,39 @@
</step>
<step n="4" goal="Epic completion and reporting">
<!-- Final verification: scan all stories for unchecked tasks -->
<action>Re-scan all epic stories for unchecked tasks</action>
<action>Calculate: total_remaining_tasks across all stories</action>
<output>
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎉 EPIC {{epic_num}} COMPLETE!
🎉 EPIC {{epic_num}} PROCESSING COMPLETE!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
**Results:**
✅ Stories completed: {{success_count}}/{{total_count}}
✅ Stories processed: {{success_count}}/{{total_count}}
{{if_failures}}❌ Stories failed: {{failure_count}}{{endif}}
**Branch:** auto-epic-{{epic_num}}
**All changes pushed to remote**
**Task Completion:**
- Total tasks in epic: {{total_tasks}}
- Completed: {{completed_tasks}} ✅
- Remaining: {{remaining_tasks}} ⏳
{{if_all_success}}
**Epic {{epic_num}} marked complete in sprint-status.yaml**
**Branch:** {{current_branch}}
**All changes committed**
{{if_all_tasks_complete}}
✅ **All tasks complete! Epic {{epic_num}} marked done in sprint-status.yaml**
{{endif}}
{{if_tasks_remaining}}
⚠️ **{{remaining_tasks}} tasks still unchecked - epic NOT marked complete**
Stories with remaining work:
{{list_incomplete_stories}}
{{endif}}
**Next Steps:**
1. Review the work on branch auto-epic-{{epic_num}}
1. Review the work on branch {{current_branch}}
2. Run human code review
3. Merge when approved
@ -198,7 +287,7 @@
{{endif}}
</output>
<check if="{{success_count}} == {{total_count}}">
<check if="{{remaining_tasks}} == 0 AND {{failure_count}} == 0">
<action>Update sprint-status: epic-{{epic_num}} = "done"</action>
</check>

View File

@ -26,7 +26,29 @@ autonomous_settings:
halt_on_error: false # Continue even if story fails
max_retry_per_story: 2 # Retry failed stories
create_git_commits: true # Commit after each story
git_branch_prefix: "auto-epic-" # Branch name format: auto-epic-{epic_num}
create_epic_branch: false # When false, stay on current branch (good for parallel epics)
git_branch_prefix: "auto-epic-" # Branch name format: auto-epic-{epic_num} (only used if create_epic_branch=true)
# TASK-BASED COMPLETION SETTINGS (NEW)
# These settings ensure stories are truly complete, not just marked as such
completion_verification:
# Use task-based completion instead of status-based
# A story is ONLY complete when it has ZERO unchecked tasks (- [ ])
task_based_completion: true
# Include stories in "review" status if they have unchecked tasks
# This catches code review findings that were added but not implemented
process_review_with_unchecked: true
# Include stories in "done" status if they have unchecked tasks
# This catches stories incorrectly marked done
process_done_with_unchecked: true
# Verify completion after each story by re-scanning for unchecked tasks
verify_after_development: true
# Only mark epic as "done" if ALL stories have ZERO unchecked tasks
strict_epic_completion: true
standalone: true

View File

@ -0,0 +1,170 @@
# Create Story With Gap Analysis
**Custom Workflow by Jonah Schulte**
**Created:** December 24, 2025
**Purpose:** Generate stories with SYSTEMATIC codebase gap analysis (not inference-based)
---
## Problem This Solves
**Standard `/create-story` workflow:**
- ❌ Reads previous stories and git commits (passive)
- ❌ Infers what probably exists (guessing)
- ❌ Gap analysis quality varies by agent thoroughness
- ❌ Checkboxes may not reflect reality
**This custom workflow:**
- ✅ Actively scans codebase with Glob/Read tools
- ✅ Verifies file existence (not inference)
- ✅ Reads key files to check implementation depth (mocked vs real)
- ✅ Generates TRUTHFUL gap analysis
- ✅ Checkboxes are FACTS verified by file system
---
## Usage
```bash
/create-story-with-gap-analysis
# Or via Skill tool:
Skill: "create-story-with-gap-analysis"
Args: "1.9" (epic.story number)
```
**Workflow will:**
1. Load existing story + epic context
2. **SCAN codebase systematically** (Glob for files, Read to verify implementation)
3. Generate gap analysis with verified ✅/❌/⚠️ status
4. Update story file with truthful checkboxes
5. Save to docs/sprint-artifacts/
---
## What It Scans
**For each story, the workflow:**
1. **Identifies target directories** (from story title/requirements)
- Example: "admin-user-service" → apps/backend/admin-user-service/
2. **Globs for all files**
- `{target}/src/**/*.ts` - Find all TypeScript files
- `{target}/src/**/*.spec.ts` - Find all tests
3. **Checks specific required files**
- Based on ACs, check if files exist
- Example: `src/auth/controllers/bridgeid-auth.controller.ts` → ❌ MISSING
4. **Reads key files to verify depth**
- Check if mocked: Search for "MOCK" string
- Check if incomplete: Search for "TODO"
- Verify real implementation exists
5. **Checks package.json**
- Verify required dependencies are installed
- Identify missing packages
6. **Counts tests**
- How many test files exist
- Coverage for each component
---
## Output Format
**Generates story with:**
1. ✅ Standard BMAD 5 sections (Story, AC, Tasks, Dev Notes, Dev Agent Record)
2. ✅ Enhanced Dev Notes with verified gap analysis subsections:
- Gap Analysis: Current State vs Requirements
- Library/Framework Requirements (from package.json)
- File Structure Requirements (from Glob results)
- Testing Requirements (from test file count)
- Architecture Compliance
- Previous Story Intelligence
3. ✅ Truthful checkboxes based on verified file existence
---
## Difference from Standard /create-story
| Feature | /create-story | /create-story-with-gap-analysis |
|---------|---------------|--------------------------------|
| Reads previous story | ✅ | ✅ |
| Reads git commits | ✅ | ✅ |
| Loads epic context | ✅ | ✅ |
| **Scans codebase with Glob** | ❌ | ✅ SYSTEMATIC |
| **Verifies files exist** | ❌ | ✅ VERIFIED |
| **Reads files to check depth** | ❌ | ✅ MOCKED vs REAL |
| **Checks package.json** | ❌ | ✅ DEPENDENCIES |
| **Counts test coverage** | ❌ | ✅ COVERAGE |
| Gap analysis quality | Variable (agent-dependent) | Systematic (tool-verified) |
| Checkbox accuracy | Inference-based | File-existence-based |
---
## When to Use
**This workflow (planning-time gap analysis):**
- Use when regenerating/auditing stories
- Use when you want verified checkboxes upfront
- Best for stories that will be implemented immediately
- Manual verification at planning time
**Standard /create-story + /dev-story (dev-time gap analysis):**
- Recommended for most workflows
- Stories start as DRAFT, validated when dev begins
- Prevents staleness in batch planning
- Automatic verification at development time
**Use standard /create-story when:**
- Greenfield project (nothing exists yet)
- Backlog stories (won't be implemented for months)
- Epic planning phase (just sketching ideas)
**Tip:** Both approaches are complementary. You can use this workflow to regenerate stories, then use `/dev-story` which will re-validate at dev-time.
---
## Examples
**Regenerating Story 1.9:**
```bash
/create-story-with-gap-analysis
Choice: 1.9
# Workflow will:
# 1. Load existing 1-9-admin-user-service-bridgeid-rbac.md
# 2. Identify target: apps/backend/admin-user-service/
# 3. Glob: apps/backend/admin-user-service/src/**/*.ts (finds 47 files)
# 4. Check: src/auth/controllers/bridgeid-auth.controller.ts → ❌ MISSING
# 5. Read: src/bridgeid/services/bridgeid-client.service.ts → ⚠️ MOCKED
# 6. Read: package.json → axios ❌ NOT INSTALLED
# 7. Generate gap analysis with verified status
# 8. Write story with truthful checkboxes
```
**Result:** Story with verified gap analysis showing:
- ✅ 7 components IMPLEMENTED (verified file existence)
- ❌ 6 components MISSING (verified file not found)
- ⚠️ 1 component PARTIAL (file exists but contains "MOCK")
---
## Installation
This workflow is auto-discovered when BMAD is installed.
**To use:**
```bash
/bmad:bmm:workflows:create-story-with-gap-analysis
```
---
**Last Updated:** December 27, 2025
**Status:** Integrated into BMAD-METHOD

View File

@ -0,0 +1,82 @@
# Step 1: Initialize and Extract Story Requirements
## Goal
Load epic context and identify what needs to be scanned in the codebase.
## Execution
### 1. Determine Story to Create
**Ask user:**
```
Which story should I regenerate with gap analysis?
Options:
1. Provide story number (e.g., "1.9" or "1-9")
2. Provide story filename (e.g., "1-9-admin-user-service-bridgeid-rbac.md")
Your choice:
```
**Parse input:**
- Extract epic_num (e.g., "1")
- Extract story_num (e.g., "9")
- Locate story file: `docs/sprint-artifacts/{epic_num}-{story_num}-*.md`
### 2. Load Existing Story Content
```bash
Read: docs/sprint-artifacts/{epic_num}-{story_num}-*.md
```
**Extract from existing story:**
- Story title
- User story text (As a... I want... So that...)
- Acceptance criteria (the requirements, not checkboxes)
- Any existing Dev Notes or technical context
**Store for later use.**
### 3. Load Epic Context
```bash
Glob: docs/archive/planning-round-1-greenfield/epics/epic-{epic_num}-*.md
Read: [found epic file]
```
**Extract from epic:**
- Epic business objectives
- This story's original requirements
- Technical constraints
- Dependencies on other stories
### 4. Determine Target Directories
**From story title and requirements, identify:**
- Which service/app this story targets
- Which directories to scan
**Examples:**
- "admin-user-service" → `apps/backend/admin-user-service/`
- "Widget Batch 1" → `packages/widgets/`
- "POE Integration" → `apps/frontend/web/`
**Store target directories for Step 2 codebase scan.**
### 5. Ready for Codebase Scan
**Output:**
```
✅ Story Context Loaded
Story: {epic_num}.{story_num} - {title}
Target directories identified:
- {directory_1}
- {directory_2}
Ready to scan codebase for gap analysis.
[C] Continue to Codebase Scan
```
**WAIT for user to select Continue.**

View File

@ -0,0 +1,184 @@
# Step 2: Systematic Codebase Gap Analysis
## Goal
VERIFY what code actually exists vs what's missing using Glob and Read tools.
## CRITICAL
This step uses ACTUAL file system tools to generate TRUTHFUL gap analysis.
No guessing. No inference. VERIFY with tools.
## Execution
### 1. Scan Target Directories
**For each target directory identified in Step 1:**
```bash
# List all TypeScript files
Glob: {target_dir}/src/**/*.ts
Glob: {target_dir}/src/**/*.tsx
# Store file list
```
**Output:**
```
📁 Codebase Scan Results for {target_dir}
Found {count} TypeScript files:
- {file1}
- {file2}
...
```
### 2. Check for Specific Required Components
**Based on story Acceptance Criteria, check if required files exist:**
**Example for Auth Story:**
```bash
# Check for OAuth endpoints
Glob: {target_dir}/src/auth/controllers/*bridgeid*.ts
Result: ❌ MISSING (0 files found)
# Check for BridgeID client
Glob: {target_dir}/src/bridgeid/**/*.ts
Result: ✅ EXISTS (found: bridgeid-client.service.ts, bridgeid-sync.service.ts)
# Check for permission guards
Glob: {target_dir}/src/auth/guards/permissions*.ts
Result: ❌ MISSING (0 files found)
# Check for decorators
Glob: {target_dir}/src/auth/decorators/*permission*.ts
Result: ❌ MISSING (0 files found)
```
### 3. Verify Implementation Depth
**For files that exist, read them to check if MOCKED or REAL:**
```bash
# Read key implementation file
Read: {target_dir}/src/bridgeid/services/bridgeid-client.service.ts
# Search for indicators:
- Contains "MOCK" or "mock" → ⚠️ MOCKED (needs real implementation)
- Contains "TODO" → ⚠️ INCOMPLETE
- Contains real HTTP client (axios) → ✅ IMPLEMENTED
```
### 4. Check Dependencies
```bash
# Read package.json
Read: {target_dir}/package.json
# Verify required dependencies exist:
Required: axios
Found in package.json? → ❌ NO (needs to be added)
Required: @aws-sdk/client-secrets-manager
Found in package.json? → ❌ NO (needs to be added)
```
### 5. Check Test Coverage
```bash
# Find test files
Glob: {target_dir}/src/**/*.spec.ts
Glob: {target_dir}/test/**/*.test.ts
# Count tests
Found {test_count} test files
# Check for specific test coverage
Glob: {target_dir}/src/**/*bridgeid*.spec.ts
Result: ✅ EXISTS (found 3 test files)
```
### 6. Generate Truthful Gap Analysis
**Create structured gap analysis:**
```markdown
## Gap Analysis: Current State vs Requirements
**✅ IMPLEMENTED (Verified by Codebase Scan):**
1. **BridgeID Client Infrastructure** - MOCKED (needs real HTTP)
- File: src/bridgeid/services/bridgeid-client.service.ts ✅ EXISTS
- Implementation: Mock user data with circuit breaker
- Status: ⚠️ PARTIAL - Ready for real HTTP client
- Tests: 15 tests passing ✅
2. **User Synchronization Service**
- File: src/bridgeid/services/bridgeid-sync.service.ts ✅ EXISTS
- Implementation: Bulk sync BridgeID → admin_users
- Status: ✅ COMPLETE
- Tests: 6 tests passing ✅
3. **Role Mapping Logic**
- File: src/bridgeid/constants/role-mapping.constants.ts ✅ EXISTS
- Implementation: 7-tier role mapping with priority selection
- Status: ✅ COMPLETE
- Tests: 10 tests passing ✅
**❌ MISSING (Required for AC Completion):**
1. **BridgeID OAuth Endpoints**
- File: src/auth/controllers/bridgeid-auth.controller.ts ❌ NOT FOUND
- Need: POST /api/auth/bridgeid/login endpoint
- Need: GET /api/auth/bridgeid/callback endpoint
- Status: ❌ NOT IMPLEMENTED
2. **Permission Guards**
- File: src/auth/guards/permissions.guard.ts ❌ NOT FOUND
- File: src/auth/decorators/require-permissions.decorator.ts ❌ NOT FOUND
- Status: ❌ NOT IMPLEMENTED
3. **Real OAuth HTTP Client**
- Package: axios ❌ NOT in package.json
- Package: @aws-sdk/client-secrets-manager ❌ NOT in package.json
- Status: ❌ DEPENDENCIES NOT ADDED
```
### 7. Update Acceptance Criteria Checkboxes
**Based on verified gap analysis, mark checkboxes:**
```markdown
### AC1: BridgeID OAuth Integration
- [ ] OAuth login endpoint (VERIFIED MISSING - file not found)
- [ ] OAuth callback endpoint (VERIFIED MISSING - file not found)
- [ ] Client configuration (VERIFIED PARTIAL - exists but mocked)
### AC3: RBAC Permission System
- [x] Role mapping defined (VERIFIED COMPLETE - file exists, tests pass)
- [ ] Permission guard (VERIFIED MISSING - file not found)
- [ ] Permission decorator (VERIFIED MISSING - file not found)
```
**Checkboxes are now FACTS, not guesses.**
### 8. Present Gap Analysis
**Output:**
```
✅ Codebase Scan Complete
Scanned: apps/backend/admin-user-service/
Files found: 47 TypeScript files
Tests found: 31 test files
Gap Analysis Generated:
✅ 7 components IMPLEMENTED (verified)
❌ 6 components MISSING (verified)
⚠️ 1 component PARTIAL (needs completion)
Story checkboxes updated based on verified file existence.
[C] Continue to Story Generation
```
**WAIT for user to continue.**

View File

@ -0,0 +1,181 @@
# Step 3: Generate Story with Verified Gap Analysis
## Goal
Generate complete 7-section story file using verified gap analysis from Step 2.
## Execution
### 1. Load Template
```bash
Read: _bmad/custom/workflows/create-story-with-gap-analysis/template.md
```
### 2. Fill Template Variables
**Basic Story Info:**
- `{{epic_num}}` - from Step 1
- `{{story_num}}` - from Step 1
- `{{story_title}}` - from existing story or epic
- `{{priority}}` - from epic (P0, P1, P2)
- `{{effort}}` - from epic or estimate
**Story Section:**
- `{{role}}` - from existing story
- `{{action}}` - from existing story
- `{{benefit}}` - from existing story
**Business Context:**
- `{{business_value}}` - from epic context
- `{{scale_requirements}}` - from epic/architecture
- `{{compliance_requirements}}` - from epic/architecture
- `{{urgency}}` - from epic priority
**Acceptance Criteria:**
- `{{acceptance_criteria}}` - from epic + existing story
- Update checkboxes based on Step 2 gap analysis:
- [x] = Component verified EXISTS
- [ ] = Component verified MISSING
- [~] = Component verified PARTIAL (optional notation)
**Tasks / Subtasks:**
- `{{tasks_subtasks}}` - from epic + existing story
- Add "✅ DONE", "⚠️ PARTIAL", "❌ TODO" markers based on gap analysis
**Gap Analysis Section:**
- `{{implemented_components}}` - from Step 2 codebase scan (verified ✅)
- `{{missing_components}}` - from Step 2 codebase scan (verified ❌)
- `{{partial_components}}` - from Step 2 codebase scan (verified ⚠️)
**Architecture Compliance:**
- `{{architecture_patterns}}` - from architecture doc + playbooks
- Multi-tenant isolation requirements
- Caching strategies
- Error handling patterns
- Performance requirements
**Library/Framework Requirements:**
- `{{current_dependencies}}` - from Step 2 package.json scan
- `{{required_dependencies}}` - missing deps identified in Step 2
**File Structure:**
- `{{existing_files}}` - from Step 2 Glob results (verified ✅)
- `{{required_files}}` - from gap analysis (verified ❌)
**Testing Requirements:**
- `{{test_count}}` - from Step 2 test file count
- `{{required_tests}}` - based on missing components
- `{{coverage_target}}` - from architecture or default 90%
**Dev Agent Guardrails:**
- `{{guardrails}}` - from playbooks + previous story lessons
- What NOT to do
- Common mistakes to avoid
**Previous Story Intelligence:**
- `{{previous_story_learnings}}` - from Step 1 previous story Dev Agent Record
**Project Structure Notes:**
- `{{structure_alignment}}` - from architecture compliance
**References:**
- `{{references}}` - Links to epic, architecture, playbooks, related stories
**Definition of Done:**
- Standard DoD checklist with story-specific coverage target
### 3. Generate Complete Story
**Write filled template:**
```bash
Write: docs/sprint-artifacts/{{epic_num}}-{{story_num}}-{{slug}}.md
[Complete 7-section story with verified gap analysis]
```
### 4. Validate Generated Story
```bash
# Check section count
grep "^## " docs/sprint-artifacts/{{story_file}} | wc -l
# Should output: 7
# Check for gap analysis
grep -q "Gap Analysis.*Current State" docs/sprint-artifacts/{{story_file}}
# Should find it
# Run custom validation
./scripts/validate-bmad-format.sh docs/sprint-artifacts/{{story_file}}
# Update script to expect 7 sections + gap analysis subsection
```
### 5. Update Sprint Status
```bash
Read: docs/sprint-artifacts/sprint-status.yaml
# Find story entry
# Update status to "ready-for-dev" if was "backlog"
# Preserve all comments and structure
Write: docs/sprint-artifacts/sprint-status.yaml
```
### 6. Report Completion
**Output:**
```
✅ Story {{epic_num}}.{{story_num}} Regenerated with Gap Analysis
File: docs/sprint-artifacts/{{story_file}}
Sections: 7/7 ✅
Gap Analysis: VERIFIED with codebase scan
Summary:
✅ {{implemented_count}} components IMPLEMENTED (verified by file scan)
❌ {{missing_count}} components MISSING (verified file not found)
⚠️ {{partial_count}} components PARTIAL (file exists but mocked/incomplete)
Checkboxes in ACs and Tasks reflect VERIFIED status (not guesses).
Next Steps:
1. Review story file for accuracy
2. Use /dev-story to implement missing components
3. Story provides complete context for flawless implementation
Story is ready for development. 🚀
```
### 7. Cleanup
**Ask user:**
```
Story regeneration complete!
Would you like to:
[N] Regenerate next story ({{next_story_num}})
[Q] Quit workflow
[R] Review generated story first
Your choice:
```
**If N selected:** Loop back to Step 1 with next story number
**If Q selected:** End workflow
**If R selected:** Display story file, then show menu again
---
## Success Criteria
**Story generation succeeds when:**
1. ✅ 7 top-level ## sections present
2. ✅ Gap Analysis subsection exists with ✅/❌/⚠️ verified status
3. ✅ Checkboxes match codebase reality (spot-checked)
4. ✅ Dev Notes has all mandatory subsections
5. ✅ Definition of Done checklist included
6. ✅ File saved to correct location
7. ✅ Sprint status updated
---
**WORKFLOW COMPLETE - Ready to execute.**

View File

@ -0,0 +1,179 @@
# Story {{epic_num}}.{{story_num}}: {{story_title}}
**Status:** ready-for-dev
**Epic:** {{epic_num}}
**Priority:** {{priority}}
**Estimated Effort:** {{effort}}
---
## Story
As a **{{role}}**,
I want to **{{action}}**,
So that **{{benefit}}**.
---
## Business Context
### Why This Matters
{{business_value}}
### Production Reality
{{scale_requirements}}
{{compliance_requirements}}
{{urgency}}
---
## Acceptance Criteria
{{acceptance_criteria}}
---
## Tasks / Subtasks
{{tasks_subtasks}}
---
## Dev Notes
### Gap Analysis: Current State vs Requirements
**✅ IMPLEMENTED (Verified by Codebase Scan):**
{{implemented_components}}
**❌ MISSING (Required for AC Completion):**
{{missing_components}}
**⚠️ PARTIAL (Needs Enhancement):**
{{partial_components}}
### Architecture Compliance
{{architecture_patterns}}
### Library/Framework Requirements
**Current Dependencies:**
```json
{{current_dependencies}}
```
**Required Additions:**
```json
{{required_dependencies}}
```
### File Structure Requirements
**Completed Files:**
```
{{existing_files}}
```
**Required New Files:**
```
{{required_files}}
```
### Testing Requirements
**Current Test Coverage:** {{test_count}} tests passing
**Required Additional Tests:**
{{required_tests}}
**Target:** {{coverage_target}}
### Dev Agent Guardrails
{{guardrails}}
### Previous Story Intelligence
{{previous_story_learnings}}
### Project Structure Notes
{{structure_alignment}}
### References
{{references}}
---
## Definition of Done
### Code Quality (BLOCKING)
- [ ] Type check passes: `pnpm type-check` (zero errors)
- [ ] Zero `any` types in new code
- [ ] Lint passes: `pnpm lint` (zero errors in new code)
- [ ] Build succeeds: `pnpm build`
### Testing (BLOCKING)
- [ ] Unit tests: {{coverage_target}} coverage
- [ ] Integration tests: Key workflows validated
- [ ] All tests pass: New + existing (zero regressions)
### Security (BLOCKING)
- [ ] Dependency scan: `pnpm audit` (zero high/critical)
- [ ] No hardcoded secrets
- [ ] Input validation on all endpoints
- [ ] Auth checks on protected endpoints
- [ ] Audit logging on mutations
### Architecture Compliance (BLOCKING)
- [ ] Multi-tenant isolation: dealerId in all queries
- [ ] Cache namespacing: Cache keys include siteId
- [ ] Performance: External APIs cached, no N+1 queries
- [ ] Error handling: No silent failures
- [ ] Follows patterns from playbooks
### Deployment Validation (BLOCKING)
- [ ] Service starts: `pnpm dev` runs successfully
- [ ] Health check: `/health` returns 200
- [ ] Smoke test: Primary functionality verified
### Documentation (BLOCKING)
- [ ] API docs: Swagger decorators on endpoints
- [ ] Inline comments: Complex logic explained
- [ ] Story file: Dev Agent Record complete
---
## Dev Agent Record
### Agent Model Used
(To be filled by dev agent)
### Implementation Summary
(To be filled by dev agent)
### File List
(To be filled by dev agent)
### Test Results
(To be filled by dev agent)
### Completion Notes
(To be filled by dev agent)
---
**Generated by:** /create-story-with-gap-analysis
**Date:** {{date}}

View File

@ -0,0 +1,38 @@
name: create-story-with-gap-analysis
description: "Create/regenerate story with SYSTEMATIC codebase gap analysis using verified file scanning (Glob/Read tools)"
author: "Jonah Schulte"
# Critical variables from config
config_source: "{project-root}/_bmad/bmm/config.yaml"
user_name: "{config_source}:user_name"
communication_language: "{config_source}:communication_language"
date: system-generated
implementation_artifacts: "{config_source}:implementation_artifacts"
output_folder: "{implementation_artifacts}"
story_dir: "{implementation_artifacts}"
# Workflow components
installed_path: "{project-root}/_bmad/bmm/workflows/4-implementation/create-story-with-gap-analysis"
template: "{installed_path}/template.md"
instructions: "{installed_path}/step-01-initialize.md"
# Variables and inputs
variables:
sprint_status: "{implementation_artifacts}/sprint-status.yaml"
epics_file: "{output_folder}/epics.md"
prd_file: "{output_folder}/PRD.md"
# Project context
project_context: "**/project-context.md"
default_output_file: "{story_dir}/{{story_key}}.md"
# Workflow steps (processed in order)
steps:
- step-01-initialize.md
- step-02-codebase-scan.md
- step-03-generate-story.md
standalone: true
web_bundle: false

View File

@ -217,6 +217,20 @@
</output>
<!-- CHECK FOR AUTONOMOUS MODE - Skip prompt if auto_accept_gap_analysis is true -->
<check if="{{auto_accept_gap_analysis}} == true">
<output>⚡ **Auto-accepting gap analysis refinements** (autonomous mode)</output>
<action>Update story file with refined tasks in Tasks/Subtasks section</action>
<action>Add new "Gap Analysis" section to story file with findings:
- Scan timestamp
- What Exists summary
- What's Missing summary
- Task changes applied
</action>
<action>Add Change Log entry: "Tasks refined based on codebase gap analysis - auto-accepted ({{date}})"</action>
<goto step="2" />
</check>
<ask>**Approve these task updates?**
Options:

View File

@ -22,6 +22,9 @@ implementation_artifacts: "{config_source}:implementation_artifacts"
sprint_status: "{implementation_artifacts}/sprint-status.yaml"
project_context: "**/project-context.md"
# Autonomous mode settings (passed from parent workflow like autonomous-epic)
auto_accept_gap_analysis: false # When true, skip gap analysis approval prompt
standalone: true
web_bundle: false

View File

@ -2,8 +2,19 @@
<critical>The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml</critical>
<critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical>
<critical>Communicate all responses in {communication_language}</critical>
<critical>📝 PUSH-ALL - Stage, commit, and push all changes with comprehensive safety validation</critical>
<critical>⚠️ Use with caution - commits ALL repository changes</critical>
<critical>📝 PUSH-ALL - Stage, commit, and push changes with comprehensive safety validation</critical>
<!-- TARGETED vs ALL FILES MODE -->
<critical>⚡ PARALLEL AGENT MODE: When {{target_files}} is provided:
- ONLY stage and commit the specified files
- Do NOT use `git add .` or `git add -A`
- Use `git add [specific files]` instead
- This prevents committing work from other parallel agents
</critical>
<critical>📋 ALL FILES MODE: When {{target_files}} is empty:
- Stage ALL changes with `git add .`
- Original behavior for single-agent execution
</critical>
<step n="1" goal="Analyze repository changes">
<output>🔄 **Analyzing Repository Changes**
@ -257,14 +268,34 @@
</step>
<step n="4" goal="Stage changes">
<action>Execute: git add .</action>
<action>Execute: git status</action>
<!-- TARGETED MODE: Only stage specified files -->
<check if="{{target_files}} is provided and not empty">
<output>📎 **Targeted Commit Mode** (parallel agent safe)
<output>✅ **All Changes Staged**
Staging only files from this story/task:
{{target_files}}
</output>
<action>Execute: git add {{target_files}}</action>
<action>Execute: git status</action>
<output>✅ **Targeted Files Staged**
Ready for commit:
{{list_staged_files}}
</output>
Ready for commit ({{target_file_count}} files):
{{list_staged_files}}
Note: Other uncommitted changes in repo are NOT included.
</output>
</check>
<!-- ALL FILES MODE: Original behavior -->
<check if="{{target_files}} is empty or not provided">
<action>Execute: git add .</action>
<action>Execute: git status</action>
<output>✅ **All Changes Staged**
Ready for commit:
{{list_staged_files}}
</output>
</check>
</step>
<step n="5" goal="Generate commit message">

View File

@ -1,5 +1,5 @@
name: push-all
description: "Stage all changes, create commit with safety checks, and push to remote - use with caution"
description: "Stage changes, create commit with safety checks, and push to remote"
author: "BMad"
# Critical variables from config
@ -11,6 +11,12 @@ communication_language: "{config_source}:communication_language"
installed_path: "{project-root}/_bmad/bmm/workflows/4-implementation/push-all"
instructions: "{installed_path}/instructions.xml"
# Target files to commit (for parallel agent execution)
# When empty/not provided: commits ALL changes (original behavior)
# When provided: only commits the specified files (safe for parallel agents)
target_files: "" # Space-separated list of file paths, or empty for all
story_key: "" # Optional: story identifier for commit message context
standalone: true
web_bundle: false

View File

@ -75,10 +75,33 @@ development_status:
- Check: `{story_location_absolute}/{story-key}.md` (e.g., `stories/1-1-user-authentication.md`)
- If exists → upgrade status to at least `ready-for-dev`
**Story file status sync (CRITICAL):**
- If story file exists, read the `Status:` field from the story markdown header
- Common status field patterns: `Status: done`, `Status: review`, `Status: in-progress`
- If story file has a more advanced status than current sprint-status entry:
- Update sprint-status to match the story file status
- This ensures sprint-status stays in sync when stories are manually marked done
**Status priority order** (lowest to highest):
1. `backlog` (no story file)
2. `ready-for-dev` (story file exists)
3. `in-progress` (developer working)
4. `review` (code review pending)
5. `done` (story complete)
**Preservation rule:**
- If existing `{status_file}` exists and has more advanced status, preserve it
- Never downgrade status (e.g., don't change `done` to `ready-for-dev`)
- Story file status is the **source of truth** - always sync from story file to sprint-status
**Epic status auto-detection:**
- After syncing all story statuses, calculate epic status:
- If ALL stories in epic are `done` → set epic to `done`
- If ANY story is `in-progress`, `review`, or `done` → set epic to `in-progress`
- Otherwise → keep epic as `backlog`
**Status Flow Reference:**

View File

@ -33,7 +33,8 @@
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml">
<input name="story_file" value="{{story_file}}" />
<note>Pass through any user-provided story file path</note>
<input name="auto_accept_gap_analysis" value="{{auto_accept_gap_analysis}}" />
<note>Pass through any user-provided story file path and auto-accept setting</note>
</invoke-workflow>
<check if="dev-story completed successfully">
@ -113,6 +114,7 @@
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml">
<input name="story_file" value="{{story_file}}" />
<input name="auto_accept_gap_analysis" value="{{auto_accept_gap_analysis}}" />
<note>Resume with added tasks for missing work</note>
</invoke-workflow>
@ -167,6 +169,7 @@
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml">
<input name="story_file" value="{{story_file}}" />
<input name="auto_accept_gap_analysis" value="{{auto_accept_gap_analysis}}" />
<note>Fix code review issues</note>
</invoke-workflow>
@ -186,6 +189,7 @@
<action>Add review findings as tasks</action>
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml">
<input name="story_file" value="{{story_file}}" />
<input name="auto_accept_gap_analysis" value="{{auto_accept_gap_analysis}}" />
</invoke-workflow>
</check>
@ -208,16 +212,28 @@
<!-- STEP 4: PUSH ALL CHANGES (Super-Dev Enhancement) -->
<!-- ═══════════════════════════════════════════════════════════════ -->
<step n="4" goal="Commit and push all changes">
<step n="4" goal="Commit and push story changes">
<critical>📝 PUSH-ALL - Stage, commit, and push with safety validation</critical>
<critical>⚡ TARGETED COMMIT: Only commit files from THIS story's File List (safe for parallel agents)</critical>
<output>📝 **Committing and Pushing Story Changes**
<!-- Extract File List from story file -->
<action>Read story file and extract the "File List" section</action>
<action>Parse all file paths listed (relative to repo root)</action>
<action>Also include the story file itself in the list</action>
<action>Store as {{story_files}} - space-separated list of all files</action>
Running push-all workflow with safety checks...
<output>📝 **Committing Story Changes**
Files from this story:
{{story_files}}
Running push-all with targeted file list (parallel-agent safe)...
</output>
<invoke-workflow path="{project-root}/_bmad/bmm/workflows/4-implementation/push-all/workflow.yaml">
<note>Commit and push all story changes</note>
<input name="target_files" value="{{story_files}}" />
<input name="story_key" value="{{story_key}}" />
<note>Only commit files changed by this story</note>
</invoke-workflow>
<check if="push-all succeeded">

View File

@ -29,6 +29,9 @@ super_dev_settings:
fail_on_critical_issues: true
max_fix_iterations: 3
# Autonomous mode settings (passed from parent workflow like autonomous-epic)
auto_accept_gap_analysis: false # When true, skip gap analysis approval prompt
standalone: true
web_bundle: false