diff --git a/src/modules/bmm/agents/dev.agent.yaml b/src/modules/bmm/agents/dev.agent.yaml
index 50201eea..0033feda 100644
--- a/src/modules/bmm/agents/dev.agent.yaml
+++ b/src/modules/bmm/agents/dev.agent.yaml
@@ -55,3 +55,11 @@ agent:
- trigger: CR or fuzzy match on code-review
workflow: "{project-root}/_bmad/bmm/workflows/4-implementation/code-review/workflow.yaml"
description: "[CR] Perform a thorough clean context code review (Highly Recommended, use fresh context and different LLM)"
+
+ - trigger: RVS or fuzzy match on revalidate-story
+ workflow: "{project-root}/_bmad/bmm/workflows/4-implementation/revalidate-story/workflow.yaml"
+ description: "[RVS] Revalidate Story - clear checkboxes and re-verify against codebase (detect ghost features and gaps)"
+
+ - trigger: RVE or fuzzy match on revalidate-epic
+ workflow: "{project-root}/_bmad/bmm/workflows/4-implementation/revalidate-epic/workflow.yaml"
+ description: "[RVE] Revalidate Epic - batch revalidation of all stories in an epic with semaphore pattern"
diff --git a/src/modules/bmm/agents/sm.agent.yaml b/src/modules/bmm/agents/sm.agent.yaml
index 0bffebf4..7b1000ef 100644
--- a/src/modules/bmm/agents/sm.agent.yaml
+++ b/src/modules/bmm/agents/sm.agent.yaml
@@ -49,3 +49,15 @@ agent:
- trigger: CC or fuzzy match on correct-course
workflow: "{project-root}/_bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml"
description: "[CC] Execute correct-course task (When implementation is off-track)"
+
+ - trigger: RVS or fuzzy match on revalidate-story
+ workflow: "{project-root}/_bmad/bmm/workflows/4-implementation/revalidate-story/workflow.yaml"
+ description: "[RVS] Revalidate Story - clear checkboxes and verify against codebase reality (find gaps and ghost features)"
+
+ - trigger: RVE or fuzzy match on revalidate-epic
+ workflow: "{project-root}/_bmad/bmm/workflows/4-implementation/revalidate-epic/workflow.yaml"
+ description: "[RVE] Revalidate Epic - batch revalidation of all stories with semaphore pattern"
+
+ - trigger: GFD or fuzzy match on ghost-features
+ workflow: "{project-root}/_bmad/bmm/workflows/4-implementation/detect-ghost-features/workflow.yaml"
+ description: "[GFD] Ghost Feature Detector - find orphaned code with no stories (reverse gap analysis)"
diff --git a/src/modules/bmm/workflows/4-implementation/detect-ghost-features/instructions.md b/src/modules/bmm/workflows/4-implementation/detect-ghost-features/instructions.md
new file mode 100644
index 00000000..dc113271
--- /dev/null
+++ b/src/modules/bmm/workflows/4-implementation/detect-ghost-features/instructions.md
@@ -0,0 +1,625 @@
+# Detect Ghost Features - Reverse Gap Analysis (Who You Gonna Call?)
+
+The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml
+You MUST have already loaded and processed: {installed_path}/workflow.yaml
+
+
+
+
+ Determine scan scope based on parameters:
+
+
+ Read {sprint_status}
+ Filter stories starting with "{{epic_number}}-"
+ Store as: stories_in_scope
+
+
+
+
+ Read {sprint_status}
+ Get ALL story keys (exclude epics and retrospectives)
+ Store as: stories_in_scope
+
+
+
+
+ Set stories_in_scope = ALL stories found in {sprint_artifacts}
+
+
+
+ For each story in stories_in_scope:
+ Read story file
+ Extract documented artifacts:
+ - File List (all paths mentioned)
+ - Tasks (all file/component/service names mentioned)
+ - ACs (all features/functionality mentioned)
+ Store in: documented_artifacts[story_key] = {files, components, services, apis, features}
+
+
+
+
+
+
+
+
+
+ Use Glob to find component files:
+ - **/*.component.{tsx,jsx,ts,js,vue} (Angular/Vue pattern)
+ - **/components/**/*.{tsx,jsx} (React pattern)
+ - **/src/**/*{Component,View,Screen,Page}.{tsx,jsx} (Named pattern)
+
+ For each found component file:
+ Extract component name from filename or export
+ Check file size (ignore <50 lines as trivial)
+ Read file to determine if it's a significant feature
+
+ Store as: codebase_components = [{name, path, size, purpose}]
+
+
+
+
+
+
+
+ Use Glob to find API files:
+ - **/api/**/*.{ts,js} (Next.js/Express pattern)
+ - **/*.controller.{ts,js} (NestJS pattern)
+ - **/routes/**/*.{ts,js} (Generic routes)
+
+ Use Grep to find endpoint definitions:
+ - @Get|@Post|@Put|@Delete decorators (NestJS)
+ - export async function GET|POST|PUT|DELETE (Next.js App Router)
+ - router.get|post|put|delete (Express)
+ - app.route (Flask/FastAPI if Python)
+
+ For each endpoint found:
+ Extract: HTTP method, path, handler name
+ Read file to understand functionality
+
+ Store as: codebase_apis = [{method, path, handler, file}]
+
+
+
+
+
+
+
+ Use Glob to find schema files:
+ - **/prisma/schema.prisma (Prisma)
+ - **/*.entity.{ts,js} (TypeORM)
+ - **/models/**/*.{ts,js} (Mongoose/Sequelize)
+ - **/*-table.ts (Custom)
+
+ Use Grep to find table definitions:
+ - model (Prisma)
+ - @Entity (TypeORM)
+ - createTable (Migrations)
+
+ For each table found:
+ Extract: table name, columns, relationships
+
+ Store as: codebase_tables = [{name, file, columns}]
+
+
+
+
+
+
+
+ Use Glob to find service files:
+ - **/*.service.{ts,js}
+ - **/services/**/*.{ts,js}
+ - **/*Service.{ts,js}
+
+ For each service found:
+ Extract: service name, key methods, dependencies
+ Ignore trivial services (<100 lines)
+
+ Store as: codebase_services = [{name, file, methods}]
+
+
+
+
+
+
+
+
+
+ Initialize: orphaned_features = []
+
+
+ For each component in codebase_components:
+
+ Search all stories for mentions of:
+ - Component name in File Lists
+ - Component name in Task descriptions
+ - Component file path in File Lists
+ - Feature described by component in ACs
+
+
+ Add to orphaned_features:
+
+ type: "component"
+ name: {{component.name}}
+ path: {{component.path}}
+ size: {{component.size}} lines
+ purpose: {{inferred_purpose_from_code}}
+ severity: "HIGH" # Significant orphan
+
+
+
+
+
+
+
+
+
+
+ For each API in codebase_apis:
+
+ Search all stories for mentions of:
+ - Endpoint path (e.g., "/api/users")
+ - HTTP method + resource (e.g., "POST users")
+ - Handler file in File Lists
+ - API functionality in ACs (e.g., "Users can create account")
+
+
+ Add to orphaned_features:
+
+ type: "api"
+ method: {{api.method}}
+ path: {{api.path}}
+ handler: {{api.handler}}
+ file: {{api.file}}
+ severity: "CRITICAL" # APIs are critical functionality
+
+
+
+
+
+
+ For each table in codebase_tables:
+
+ Search all stories for mentions of:
+ - Table name
+ - Migration file in File Lists
+ - Data model in Tasks
+
+
+ Add to orphaned_features:
+
+ type: "database"
+ name: {{table.name}}
+ file: {{table.file}}
+ columns: {{table.columns.length}}
+ severity: "HIGH" # Database changes are significant
+
+
+
+
+
+
+ For each service in codebase_services:
+
+ Search all stories for mentions of:
+ - Service name or class name
+ - Service file in File Lists
+ - Service functionality in Tasks/ACs
+
+
+ Add to orphaned_features:
+
+ type: "service"
+ name: {{service.name}}
+ file: {{service.file}}
+ methods: {{service.methods.length}}
+ severity: "MEDIUM" # Services are business logic
+
+
+
+
+
+
+
+
+
+ Group orphans by type and severity:
+
+ - critical_orphans (APIs, auth, payment)
+ - high_orphans (Components, DB tables, services)
+ - medium_orphans (Utilities, helpers)
+ - low_orphans (Config files, constants)
+
+
+ Estimate complexity for each orphan:
+ Based on file size, dependencies, test coverage
+
+ Suggest epic assignment based on functionality:
+ - Auth components โ Epic focusing on authentication
+ - UI components โ Epic focusing on frontend
+ - API endpoints โ Epic for that resource type
+
+
+
+
+
+
+
+ Jump to Step 7 (Generate Report)
+
+
+
+
+ Jump to Step 7
+
+
+
+
+ For each orphaned feature (prioritized by severity):
+
+
+ Analyze orphan to understand functionality:
+ - Read implementation code
+ - Identify dependencies and related files
+ - Determine what it does (infer from code)
+ - Find tests (if any) to understand use cases
+
+ Generate story draft:
+
+Story Title: "Document existing {{name}} {{type}}"
+
+Story Description:
+This is a BACKFILL STORY documenting existing functionality found in the codebase
+that was not tracked in any story (likely vibe-coded or manually added).
+
+Business Context:
+{{inferred_business_purpose_from_code}}
+
+Current State:
+โ
**Implementation EXISTS:** {{file}}
+- {{description_of_what_it_does}}
+- {{key_features_or_methods}}
+{{#if has_tests}}โ
Tests exist: {{test_files}}{{else}}โ No tests found{{/if}}
+
+Acceptance Criteria:
+{{#each inferred_acs_from_code}}
+- [ ] {{this}}
+{{/each}}
+
+Tasks:
+- [x] {{name}} implementation (ALREADY EXISTS - {{file}})
+{{#if missing_tests}}- [ ] Add tests for {{name}}{{/if}}
+{{#if missing_docs}}- [ ] Add documentation for {{name}}{{/if}}
+- [ ] Verify functionality works as expected
+- [ ] Add to relevant epic or create new epic for backfills
+
+Definition of Done:
+- [x] Implementation exists and works
+{{#if has_tests}}- [x] Tests exist{{else}}- [ ] Tests added{{/if}}
+- [ ] Documented in story (this story)
+- [ ] Assigned to appropriate epic
+
+Story Type: BACKFILL (documenting existing code)
+
+
+
+
+
+
+
+ Create backfill story automatically
+
+
+
+
+
+Create backfill story for {{name}}?
+
+**Type:** {{type}}
+**File:** {{file}}
+**Suggested Epic:** {{suggested_epic}}
+**Complexity:** {{complexity_estimate}}
+
+[Y] Yes - Create this backfill story
+[A] Auto - Create this and all remaining backfill stories
+[E] Edit - Let me adjust the story draft first
+[S] Skip - Don't create story for this orphan
+[H] Halt - Stop backfill story creation
+
+Your choice:
+
+
+
+ Create backfill story file: {sprint_artifacts}/backfill-{{type}}-{{name}}.md
+ Add to backfill_stories_created list
+
+
+
+
+ Set auto_create = true
+ Create this story and auto-create remaining
+
+
+
+ Provide your adjusted story content or instructions for modifications:
+ Apply user's edits to story draft
+ Create modified backfill story
+
+
+
+ Add to skipped_backfills list
+
+
+
+
+ Exit backfill story creation loop
+ Jump to Step 6
+
+
+
+
+
+ Load {sprint_status} file
+
+ For each created backfill story:
+ Add entry: {{backfill_story_key}}: backlog # BACKFILL - documents existing {{name}}
+
+ Save sprint-status.yaml
+
+
+
+
+
+
+
+
+
+ Group backfill stories by suggested epic:
+
+ For each suggested_epic:
+
+
+
+
+ How should backfill stories be organized?
+
+
+ Create epic-backfill.md in epics directory
+ Update sprint-status.yaml with epic-backfill entry
+ Assign all backfill stories to epic-backfill
+
+
+
+ For each backfill story:
+ Assign to suggested_epic in sprint-status.yaml
+ Update story_key to match epic (e.g., 2-11-backfill-userprofile)
+
+
+
+ Leave stories in backlog
+
+
+
+
+
+
+ Write report to: {sprint_artifacts}/ghost-features-report-{{timestamp}}.md
+
+ Report structure:
+
+# Ghost Features Report (Reverse Gap Analysis)
+
+**Generated:** {{timestamp}}
+**Scope:** {{scan_scope}} {{#if epic_number}}(Epic {{epic_number}}){{/if}}
+
+## Executive Summary
+
+**Codebase Artifacts Scanned:** {{total_artifacts_scanned}}
+**Stories Cross-Referenced:** {{stories_in_scope.length}}
+**Orphaned Features Found:** {{orphaned_features.length}}
+**Documentation Coverage:** {{documented_pct}}%
+**Backfill Stories Created:** {{backfill_stories_created.length}}
+
+## Orphaned Features Detail
+
+### CRITICAL Orphans ({{critical_orphans.length}})
+[Full list with files, purposes, risks]
+
+### HIGH Priority Orphans ({{high_orphans.length}})
+[Full list]
+
+### MEDIUM Priority Orphans ({{medium_orphans.length}})
+[Full list]
+
+## Backfill Stories Created
+
+{{#each backfill_stories_created}}
+- {{story_key}}: {{story_file}}
+{{/each}}
+
+## Recommendations
+
+[Epic assignment suggestions, next steps]
+
+## Appendix: Scan Methodology
+
+[How detection worked, patterns used, confidence levels]
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/bmm/workflows/4-implementation/detect-ghost-features/workflow.yaml b/src/modules/bmm/workflows/4-implementation/detect-ghost-features/workflow.yaml
new file mode 100644
index 00000000..e5c9f6cb
--- /dev/null
+++ b/src/modules/bmm/workflows/4-implementation/detect-ghost-features/workflow.yaml
@@ -0,0 +1,56 @@
+name: detect-ghost-features
+description: "Reverse gap analysis: Find functionality in codebase that has no corresponding story (vibe-coded or undocumented features). Propose backfill stories."
+author: "BMad"
+version: "1.0.0" # Who you gonna call? GHOST-FEATURE-BUSTERS! ๐ป
+
+# Critical variables from config
+config_source: "{project-root}/_bmad/bmm/config.yaml"
+output_folder: "{config_source}:output_folder"
+sprint_artifacts: "{output_folder}/sprint-artifacts"
+sprint_status: "{output_folder}/sprint-status.yaml"
+
+# Input parameters
+epic_number: "{epic_number}" # Optional: Limit to specific epic (e.g., "2")
+scan_scope: "sprint" # "sprint" | "epic" | "codebase"
+create_backfill_stories: true # Propose backfill stories for orphans
+
+# Detection settings
+detection:
+ scan_for:
+ components: true # React/Vue/Angular components
+ api_endpoints: true # Routes, controllers, handlers
+ database_tables: true # Migrations, schema
+ services: true # Services, modules, utilities
+ models: true # Data models, entities
+ ui_pages: true # Pages, screens, views
+
+ ignore_patterns:
+ - "**/node_modules/**"
+ - "**/dist/**"
+ - "**/build/**"
+ - "**/*.test.*"
+ - "**/*.spec.*"
+ - "**/migrations/**" # Migrations are referenced collectively, not per-story
+
+ # What counts as "documented"?
+ documented_if:
+ mentioned_in_file_list: true # Story File List mentions it
+ mentioned_in_tasks: true # Task description mentions it
+ mentioned_in_acs: true # AC mentions the feature
+ file_committed_in_story_commit: true # Git history shows it in story commit
+
+# Backfill story settings
+backfill:
+ auto_create: false # Require confirmation before creating each
+ add_to_sprint_status: true # Add to sprint as "backlog"
+ mark_as_backfill: true # Add note: "Backfill story documenting existing code"
+ run_gap_analysis: false # Don't run gap (we know it exists)
+ estimate_effort: true # Estimate how complex the feature is
+
+# Output settings
+output:
+ create_report: true # Generate orphaned-features-report.md
+ group_by_category: true # Group by component/api/db/etc
+ suggest_epic_assignment: true # Suggest which epic orphans belong to
+
+standalone: true
diff --git a/src/modules/bmm/workflows/4-implementation/revalidate-epic/instructions.md b/src/modules/bmm/workflows/4-implementation/revalidate-epic/instructions.md
new file mode 100644
index 00000000..e229e944
--- /dev/null
+++ b/src/modules/bmm/workflows/4-implementation/revalidate-epic/instructions.md
@@ -0,0 +1,273 @@
+# Revalidate Epic - Batch Story Revalidation with Semaphore Pattern
+
+The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml
+You MUST have already loaded and processed: {installed_path}/workflow.yaml
+
+
+
+
+ Verify epic_number parameter provided
+
+
+
+ HALT
+
+
+ Read {sprint_status} file
+ Parse development_status map
+
+ Filter stories starting with "{{epic_number}}-" (e.g., "2-1-", "2-2-", etc.)
+ Exclude epics (keys starting with "epic-") and retrospectives
+
+ Store as: epic_stories (list of story keys)
+
+
+
+ HALT
+
+
+
+
+ Proceed with revalidation? (yes/no):
+
+
+
+ Exit workflow
+
+
+
+
+
+
+ Initialize worker pool state:
+
+ - story_queue = epic_stories
+ - active_workers = {}
+ - completed_stories = []
+ - failed_stories = []
+ - verification_results = {}
+ - next_story_index = 0
+ - max_workers = {{max_concurrent}}
+
+
+ Fill initial worker slots:
+
+ While next_story_index < min(max_workers, story_queue.length):
+
+
+ story_key = story_queue[next_story_index]
+ story_file = {sprint_artifacts}/{{story_key}}.md # Try multiple naming patterns if needed
+ worker_id = next_story_index + 1
+
+ Spawn Task agent:
+ - subagent_type: "general-purpose"
+ - description: "Revalidate story {{story_key}}"
+ - prompt: "Execute revalidate-story workflow for {{story_key}}.
+
+ CRITICAL INSTRUCTIONS:
+ 1. Load workflow: _bmad/bmm/workflows/4-implementation/revalidate-story/workflow.yaml
+ 2. Parameters: story_file={{story_file}}, fill_gaps={{fill_gaps}}
+ 3. Clear all checkboxes
+ 4. Verify each AC/Task/DoD against codebase
+ 5. Re-check verified items
+ 6. Report gaps
+ {{#if fill_gaps}}7. Fill gaps and commit{{/if}}
+ 8. Return verification summary"
+ - run_in_background: true
+
+ Store in active_workers[worker_id]:
+ story_key: {{story_key}}
+ task_id: {{returned_task_id}}
+ started_at: {{timestamp}}
+
+
+ Increment next_story_index
+
+
+
+
+
+ SEMAPHORE PATTERN: Keep {{max_workers}} agents running continuously
+
+ While active_workers.size > 0 OR next_story_index < story_queue.length:
+
+ Poll for completed workers (non-blocking):
+
+ For each worker_id in active_workers:
+
+ Check worker status using TaskOutput(task_id, block=false)
+
+
+ Get verification results from worker output
+ Parse: verified_pct, gaps_found, gaps_filled
+
+ Store in verification_results[story_key]
+ Add to completed_stories
+ Remove from active_workers
+
+
+
+
+ Refill slot with next story (same pattern as batch-super-dev)
+
+
+
+
+
+ Add to failed_stories with error
+ Remove from active_workers
+
+
+
+ Refill slot despite failure
+
+
+
+ Display live progress every 30 seconds:
+
+
+ Sleep 5 seconds before next poll
+
+
+
+ Aggregate verification results across all stories:
+
+ epic_total_items = sum of all items across stories
+ epic_verified = sum of verified items
+ epic_partial = sum of partial items
+ epic_missing = sum of missing items
+ epic_gaps_filled = sum of gaps filled
+
+ epic_verified_pct = (epic_verified / epic_total_items) ร 100
+
+
+ Group stories by verification percentage:
+
+ - complete_stories (โฅ95% verified)
+ - mostly_complete_stories (80-94% verified)
+ - partial_stories (50-79% verified)
+ - incomplete_stories (<50% verified)
+
+
+
+
+
+ Write epic summary to: {sprint_artifacts}/revalidation-epic-{{epic_number}}-{{timestamp}}.md
+
+
+
+
+ Update sprint-status.yaml with revalidation timestamp and results
+ Add comment to epic entry: # Revalidated: {{epic_verified_pct}}% verified ({{timestamp}})
+
+
+
+
diff --git a/src/modules/bmm/workflows/4-implementation/revalidate-epic/workflow.yaml b/src/modules/bmm/workflows/4-implementation/revalidate-epic/workflow.yaml
new file mode 100644
index 00000000..38b7de23
--- /dev/null
+++ b/src/modules/bmm/workflows/4-implementation/revalidate-epic/workflow.yaml
@@ -0,0 +1,44 @@
+name: revalidate-epic
+description: "Batch revalidation of all stories in an epic. Clears checkboxes and re-verifies against codebase with semaphore pattern."
+author: "BMad"
+version: "1.0.0"
+
+# Critical variables from config
+config_source: "{project-root}/_bmad/bmm/config.yaml"
+output_folder: "{config_source}:output_folder"
+sprint_artifacts: "{output_folder}/sprint-artifacts"
+sprint_status: "{output_folder}/sprint-status.yaml"
+
+# Input parameters
+epic_number: "{epic_number}" # Required: Epic number (e.g., "2" for Epic 2)
+fill_gaps: false # Optional: Fill missing items after verification
+max_concurrent: 3 # Optional: Max concurrent revalidation agents (default: 3)
+
+# Verification settings (inherited by story revalidations)
+verification:
+ verify_acceptance_criteria: true
+ verify_tasks: true
+ verify_definition_of_done: true
+ check_for_stubs: true
+ require_tests: true
+
+# Gap filling settings
+gap_filling:
+ max_gaps_per_story: 10 # Safety limit per story
+ require_confirmation_first_story: true # Ask on first story, then auto for rest
+ run_tests_after_each: true
+ commit_strategy: "per_gap" # "per_gap" | "per_story" | "all_at_once"
+
+# Execution settings
+execution:
+ use_semaphore_pattern: true # Constant concurrency (not batch-and-wait)
+ continue_on_failure: true # Keep processing if one story fails
+ display_live_progress: true # Show progress updates every 30s
+
+# Output settings
+output:
+ create_epic_report: true # Generate epic-level summary
+ create_story_reports: true # Generate per-story reports
+ update_sprint_status: true # Update progress in sprint-status.yaml
+
+standalone: true
diff --git a/src/modules/bmm/workflows/4-implementation/revalidate-story/instructions.md b/src/modules/bmm/workflows/4-implementation/revalidate-story/instructions.md
new file mode 100644
index 00000000..f5135606
--- /dev/null
+++ b/src/modules/bmm/workflows/4-implementation/revalidate-story/instructions.md
@@ -0,0 +1,510 @@
+# Revalidate Story - Verify Checkboxes Against Codebase Reality
+
+The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml
+You MUST have already loaded and processed: {installed_path}/workflow.yaml
+
+
+
+
+ Verify story_file parameter provided
+
+
+
+ HALT
+
+
+ Read COMPLETE story file: {{story_file}}
+ Parse sections: Acceptance Criteria, Tasks/Subtasks, Definition of Done, Dev Agent Record
+
+ Extract story_key from filename (e.g., "2-7-image-file-handling")
+
+ Create backup of current checkbox state:
+ Count currently checked items:
+ - ac_checked_before = count of [x] in Acceptance Criteria
+ - tasks_checked_before = count of [x] in Tasks/Subtasks
+ - dod_checked_before = count of [x] in Definition of Done
+ - total_checked_before = sum of above
+
+
+
+
+
+
+
+
+ Use Edit tool to replace all [x] with [ ] in Acceptance Criteria section
+ Use Edit tool to replace all [x] with [ ] in Tasks/Subtasks section
+ Use Edit tool to replace all [x] with [ ] in Definition of Done section
+
+ Save story file with all boxes unchecked
+
+
+
+
+
+
+
+ Extract all AC items from Acceptance Criteria section
+
+ For each AC item:
+
+
+ Extract AC description and identify artifacts:
+ - File mentions (e.g., "UserProfile component")
+ - Function names (e.g., "updateUser function")
+ - Features (e.g., "dark mode toggle")
+ - Test requirements (e.g., "unit tests covering edge cases")
+
+
+
+
+
+
+ Use Glob to find relevant files:
+ - If AC mentions specific file: glob for that file
+ - If AC mentions component: glob for **/*ComponentName*
+ - If AC mentions feature: glob for files in related directories
+
+
+ Use Grep to search for symbols/functions/features
+
+ Read found files to verify:
+ - NOT a stub (check for "TODO", "Not implemented", "throw new Error")
+ - Has actual implementation (not just empty function)
+ - Tests exist (search for *.test.* or *.spec.* files)
+ - Tests pass (if --fill-gaps mode, run tests)
+
+
+
+
+ verification_status = VERIFIED
+ Check box [x] in story file for this AC
+ Record evidence: "โ
VERIFIED: {{files_found}}, tests: {{test_files}}"
+
+
+
+
+ verification_status = PARTIAL
+ Check box [~] in story file for this AC
+ Record gap: "๐ถ PARTIAL: {{what_exists}}, missing: {{what_is_missing}}"
+
+ Add to gaps_list with details
+
+
+
+ verification_status = MISSING
+ Leave box unchecked [ ] in story file
+ Record gap: "โ MISSING: No implementation found for {{ac_description}}"
+
+ Add to gaps_list with details
+
+
+
+ Save story file after each AC verification
+
+
+
+
+
+
+
+ Extract all Task items from Tasks/Subtasks section
+
+ For each Task item (same verification logic as ACs):
+
+ Parse task description for artifacts
+ Search codebase with Glob/Grep
+ Read and verify (check for stubs, tests)
+ Determine status: VERIFIED | PARTIAL | MISSING
+ Update checkbox: [x] | [~] | [ ]
+ Record evidence or gap
+ Save story file
+
+
+
+
+
+
+
+ Extract all DoD items from Definition of Done section
+
+ For each DoD item:
+
+ Parse DoD requirement:
+ - "Type check passes" โ Run type checker
+ - "Unit tests 90%+ coverage" โ Run coverage report
+ - "Linting clean" โ Run linter
+ - "Build succeeds" โ Run build
+ - "All tests pass" โ Run test suite
+
+
+ Execute verification for this DoD item
+
+
+ Check box [x]
+ Record: "โ
VERIFIED: {{verification_result}}"
+
+
+
+ Leave unchecked [ ] or partial [~]
+ Record gap if applicable
+
+
+
+
+
+
+ Calculate overall completion:
+
+ total_verified = ac_verified + tasks_verified + dod_verified
+ total_partial = ac_partial + tasks_partial + dod_partial
+ total_missing = ac_missing + tasks_missing + dod_missing
+ total_items = ac_total + tasks_total + dod_total
+
+ verified_pct = (total_verified / total_items) ร 100
+ completion_pct = ((total_verified + total_partial) / total_items) ร 100
+
+
+
+
+
+ Write detailed report to: {sprint_artifacts}/revalidation-{{story_key}}-{{timestamp}}.md
+ Include: verification results, gaps list, evidence for each item, recommendations
+
+
+
+
+
+
+
+ Exit workflow
+
+
+
+
+ Exit workflow
+
+
+
+
+
+ HALT
+
+
+
+
+ Continue to Step 8
+
+
+
+
+ For each gap in gaps_list:
+
+
+
+
+Fill this gap?
+
+**Item:** {{item_description}}
+**Type:** {{item_type}} ({{section}})
+**Missing:** {{what_is_missing}}
+
+[Y] Yes - Implement this item
+[A] Auto-fill - Implement this and all remaining gaps without asking
+[S] Skip - Leave this gap unfilled
+[H] Halt - Stop gap filling
+
+Your choice:
+
+
+
+ Set require_confirmation = false (auto-fill remaining)
+
+
+
+ Continue to next gap
+
+
+
+ Exit gap filling loop
+ Jump to Step 9 (Summary)
+
+
+
+
+
+
+
+ Load story context (Technical Requirements, Architecture Compliance, Dev Notes)
+ Implement missing item following story specifications
+ Write tests if required
+ Run tests to verify implementation
+ Verify linting/type checking passes
+
+
+ Check box [x] for this item in story file
+ Update File List with new/modified files
+ Add to Dev Agent Record: "Gap filled: {{item_description}}"
+
+
+
+ Stage files for this gap
+ Commit: "fix({{story_key}}): fill gap - {{item_description}}"
+
+
+
+
+
+
+ Leave box unchecked
+ Record failure in gaps_list
+ Add to failed_gaps
+
+
+
+ After all gaps processed:
+
+
+
+
+
+
+
+ For each filled gap:
+ Re-run verification for that item
+ Ensure still VERIFIED after all changes
+
+
+
+
+ Calculate final completion:
+
+ final_verified = count of [x] across all sections
+ final_partial = count of [~] across all sections
+ final_missing = count of [ ] across all sections
+ final_pct = (final_verified / total_items) ร 100
+
+
+
+ Stage all changed files
+ Commit: "fix({{story_key}}): fill {{gaps_filled}} gaps from revalidation"
+
+
+
+
+ Load {sprint_status} file
+ Update entry with current progress:
+ Format: {{story_key}}: {{current_status}} # Revalidated: {{final_verified}}/{{total_items}} ({{final_pct}}%) verified
+ Save sprint-status.yaml
+
+
+
+
+ Add to Dev Agent Record in story file:
+
+## Revalidation Record ({{timestamp}})
+
+**Revalidation Mode:** {{#if fill_gaps}}Verify & Fill{{else}}Verify Only{{/if}}
+
+**Results:**
+- Verified: {{final_verified}}/{{total_items}} ({{final_pct}}%)
+- Gaps Found: {{total_missing}}
+- Gaps Filled: {{gaps_filled}}
+
+**Evidence:**
+{{#each verification_evidence}}
+- {{item}}: {{evidence}}
+{{/each}}
+
+{{#if gaps_filled > 0}}
+**Gaps Filled:**
+{{#each filled_gaps}}
+- {{item}}: {{what_was_implemented}}
+{{/each}}
+{{/if}}
+
+{{#if failed_gaps.length > 0}}
+**Failed to Fill:**
+{{#each failed_gaps}}
+- {{item}}: {{error}}
+{{/each}}
+{{/if}}
+
+ Save story file
+
+
+
+
+
+
+
+
diff --git a/src/modules/bmm/workflows/4-implementation/revalidate-story/workflow.yaml b/src/modules/bmm/workflows/4-implementation/revalidate-story/workflow.yaml
new file mode 100644
index 00000000..ecc23f56
--- /dev/null
+++ b/src/modules/bmm/workflows/4-implementation/revalidate-story/workflow.yaml
@@ -0,0 +1,37 @@
+name: revalidate-story
+description: "Clear checkboxes and re-verify story against actual codebase implementation. Identifies gaps and optionally fills them."
+author: "BMad"
+version: "1.0.0"
+
+# Critical variables from config
+config_source: "{project-root}/_bmad/bmm/config.yaml"
+output_folder: "{config_source}:output_folder"
+sprint_artifacts: "{output_folder}/sprint-artifacts"
+
+# Input parameters
+story_file: "{story_file}" # Required: Full path to story file
+fill_gaps: false # Optional: Fill missing items after verification (default: verify-only)
+auto_commit: false # Optional: Auto-commit filled gaps (default: prompt)
+
+# Verification settings
+verification:
+ verify_acceptance_criteria: true
+ verify_tasks: true
+ verify_definition_of_done: true
+ check_for_stubs: true # Reject stub implementations (TODO, Not implemented, etc.)
+ require_tests: true # Require tests for code items
+
+# Gap filling settings (only used if fill_gaps=true)
+gap_filling:
+ max_gaps_to_fill: 10 # Safety limit - HALT if more gaps than this
+ require_confirmation: true # Ask before filling each gap (false = auto-fill all)
+ run_tests_after_each: true # Verify each filled gap works
+ commit_strategy: "per_gap" # "per_gap" | "all_at_once" | "none"
+
+# Output settings
+output:
+ create_report: true # Generate revalidation-report.md
+ update_dev_agent_record: true # Add revalidation notes to story
+ update_sprint_status: true # Update progress in sprint-status.yaml
+
+standalone: false