--- title: "UAT Workflow Implementation Gaps & Required Fixes" --- # UAT Workflow Implementation Gaps & Required Fixes ## Executive Summary The UAT validation workflow and epic chain report generator have been designed and partially implemented, but several critical components are missing to make them production-ready. This document outlines the gaps, required fixes, and context needed to complete the implementation. **Current State:** Workflow definitions, templates, and agent triggers exist **Missing:** Shell orchestration, metrics collection, step files, and integration points --- ## Architecture Context ### How BMAD Workflows Achieve Context Isolation Native BMAD workflows use a **shell script orchestration pattern** to isolate Claude contexts: ``` ┌─────────────────────────────────────────────────────────────────────┐ │ BMAD CONTEXT ISOLATION PATTERN │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Shell Script (epic-execute.sh / epic-chain.sh) │ │ │ │ │ ├──► claude -p "Phase 1 prompt..." ──► Fresh Context A │ │ │ │ │ │ │ └──► Git staging / Story file (state transfer) │ │ │ │ │ ├──► claude -p "Phase 2 prompt..." ──► Fresh Context B │ │ │ │ │ │ │ └──► Git staging / Story file (state transfer) │ │ │ │ │ └──► claude -p "Phase 3 prompt..." ──► Fresh Context C │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` **Key Files:** - `scripts/epic-execute.sh` - 600+ lines, handles dev→review→commit→UAT phases - `scripts/epic-chain.sh` - Handles multi-epic execution with handoffs **State Transfer Mechanisms:** 1. **Git staging** - Code changes pass between contexts via `git add` 2. **Story files** - Dev Agent Record and Code Review Record sections 3. **Handoff documents** - Cross-epic context transfer 4. **Completion signals** - `IMPLEMENTATION COMPLETE: {id}`, `REVIEW PASSED: {id}` --- ## Gap 1: Missing Shell Orchestration Script ### Problem The UAT validation self-healing loop requires context isolation: ``` UAT Validate (Quinn) → Fix Context → Quick Dev (Barry) → Re-validate (Quinn) ``` Without a shell script, these phases would run in the same Claude context, defeating the purpose of fresh-eyes validation after fixes. ### Required: `scripts/uat-validate.sh` **Location:** `scripts/uat-validate.sh` **Responsibilities:** 1. Load UAT document for specified epic 2. Execute automatable scenarios via shell commands 3. Collect pass/fail results with evidence 4. On failure: Generate fix context document 5. Spawn fresh Claude session for quick-dev fixes 6. Re-validate in fresh context 7. Loop until pass or max retries 8. Output final gate result **Interface:** ```bash # Usage ./scripts/uat-validate.sh [options] # Options --gate-mode=quick|full|skip # Which scenarios to run --max-retries=2 # Fix attempts before halt --skip-manual # Skip manual-only scenarios --verbose # Detailed output # Output signals (for epic-chain.sh to parse) UAT_GATE_RESULT: PASS|FAIL UAT_FIX_ATTEMPTS: N UAT_SCENARIOS_PASSED: X/Y ``` **Context Flow:** ``` ┌─────────────────────────────────────────────────────────────────────┐ │ uat-validate.sh Flow │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 1. Load UAT doc: docs/uat/epic-{id}-uat.md │ │ │ │ 2. Classify scenarios (automatable / semi-auto / manual) │ │ │ │ 3. Execute automatable scenarios via shell: │ │ for scenario in automatable: │ │ result = execute_command(scenario.command) │ │ record_result(scenario.id, result) │ │ │ │ 4. Evaluate gate: │ │ if all_passed: │ │ echo "UAT_GATE_RESULT: PASS" │ │ exit 0 │ │ │ │ 5. On failure (attempt < max_retries): │ │ a. Generate fix context document │ │ b. Spawn fresh Claude for quick-dev: │ │ claude -p "Load fix context, implement fixes..." │ │ c. Increment attempt counter │ │ d. Go to step 3 (re-validate) │ │ │ │ 6. On max retries exceeded: │ │ echo "UAT_GATE_RESULT: FAIL" │ │ echo "UAT_MAX_RETRIES: true" │ │ exit 2 │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` **Reference Implementation:** See `scripts/epic-execute.sh` lines 289-438 for how dev and review phases spawn isolated Claude sessions. --- ## Gap 2: Metrics Collection Not Instrumented ### Problem The report generator expects metrics at `{metrics_folder}/epic-{id}-metrics.yaml`, but `epic-execute.sh` doesn't write these files. ### Required: Metrics Instrumentation in `epic-execute.sh` **Location:** Modify `scripts/epic-execute.sh` **Add at epic start (~line 520):** ```bash # Initialize metrics EPIC_START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") METRICS_FILE="$SPRINT_ARTIFACTS/metrics/epic-${EPIC_ID}-metrics.yaml" mkdir -p "$SPRINT_ARTIFACTS/metrics" # Initialize metrics file cat > "$METRICS_FILE" << EOF epic_id: "$EPIC_ID" epic_name: "$EPIC_NAME" execution: start_time: "$EPIC_START_TIME" end_time: "" duration_seconds: 0 stories: total: ${#STORIES[@]} completed: 0 failed: 0 skipped: 0 validation: gate_executed: false gate_status: "PENDING" fix_attempts: 0 issues: [] EOF ``` **Add after each story (~line 595):** ```bash # Update metrics after story completion update_story_metrics() { local status="$1" # completed | failed | skipped local story_id="$2" # Increment appropriate counter case "$status" in completed) yq -i '.stories.completed += 1' "$METRICS_FILE" ;; failed) yq -i '.stories.failed += 1' "$METRICS_FILE" ;; skipped) yq -i '.stories.skipped += 1' "$METRICS_FILE" ;; esac } ``` **Add at epic end (~line 620):** ```bash # Finalize metrics EPIC_END_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") DURATION=$(($(date +%s) - $(date -d "$EPIC_START_TIME" +%s))) yq -i ".execution.end_time = \"$EPIC_END_TIME\"" "$METRICS_FILE" yq -i ".execution.duration_seconds = $DURATION" "$METRICS_FILE" ``` **Template Reference:** `src/modules/bmm/workflows/4-implementation/epic-chain/templates/epic-metrics-template.yaml` --- ## Gap 3: UAT Gate Not Integrated Into epic-chain.sh ### Problem `epic-chain.sh` executes epics but doesn't call UAT validation between them. ### Required: Add UAT Gate Phase to `epic-chain.sh` **Location:** Modify `scripts/epic-chain.sh` **Add configuration variables (~line 50):** ```bash # UAT Gate Configuration UAT_GATE_ENABLED="${UAT_GATE_ENABLED:-true}" UAT_GATE_MODE="${UAT_GATE_MODE:-quick}" UAT_MAX_RETRIES="${UAT_MAX_RETRIES:-2}" UAT_BLOCKING="${UAT_BLOCKING:-false}" ``` **Add after epic completion (~line 480, after `run_epic_execute`):** ```bash # Run UAT validation if enabled if [ "$UAT_GATE_ENABLED" = true ]; then log "Running UAT validation for Epic $epic_id..." uat_result=$(./scripts/uat-validate.sh "$epic_id" \ --gate-mode="$UAT_GATE_MODE" \ --max-retries="$UAT_MAX_RETRIES" 2>&1) # Parse result if echo "$uat_result" | grep -q "UAT_GATE_RESULT: PASS"; then log "✓ UAT validation passed for Epic $epic_id" # Update metrics yq -i '.validation.gate_executed = true' "$METRICS_FILE" yq -i '.validation.gate_status = "PASS"' "$METRICS_FILE" else log_error "✗ UAT validation failed for Epic $epic_id" yq -i '.validation.gate_executed = true' "$METRICS_FILE" yq -i '.validation.gate_status = "FAIL"' "$METRICS_FILE" if [ "$UAT_BLOCKING" = true ]; then log_error "UAT blocking enabled - halting chain" exit 1 else log_warn "UAT blocking disabled - continuing to next epic" fi fi fi ``` **Add CLI flag parsing (~line 120):** ```bash --uat-gate=*) UAT_GATE_MODE="${1#*=}" ;; --uat-blocking) UAT_BLOCKING=true ;; --no-uat) UAT_GATE_ENABLED=false ;; ``` --- ## Gap 4: Step Files Not Following BMAD Pattern ### Problem The UAT validation workflow has `instructions.md` but not the step-file architecture used by epic-execute: - `step-01-init.md` - `step-02-dev-story.md` - `step-03-code-review.md` - etc. ### Required: Create Step Files for UAT Validation **Location:** `src/modules/bmm/workflows/5-validation/uat-validate/steps/` **Files to create:** | File | Purpose | |------|---------| | `step-01-load-uat.md` | Load UAT document, parse scenarios | | `step-02-classify-scenarios.md` | Categorize as automatable/semi-auto/manual | | `step-03-execute-scenarios.md` | Run automatable scenarios via shell | | `step-04-evaluate-gate.md` | Determine pass/fail, generate fix context if needed | | `step-05-report-results.md` | Update metrics, output signals | **Step File Template (from epic-execute pattern):** ```markdown # Step N: {Title} ## Purpose {What this step accomplishes} ## Inputs | Input | Source | Required | |-------|--------|----------| | ... | ... | Yes/No | ## Process ### N.1 {Sub-step} {Detailed instructions} ### N.2 {Sub-step} {Detailed instructions} ## Outputs | Output | Location | Description | |--------|----------|-------------| | ... | ... | ... | ## Completion Signal ``` {SIGNAL_NAME}: {value} ``` ## Error Handling | Error | Action | |-------|--------| | ... | ... | ``` --- ## Gap 5: Fix Context Not Integrated With Handoff Pattern ### Problem The fix context template exists but isn't written to the handoff directory or loaded by quick-dev. ### Required: Integrate Fix Context With Handoff Flow **Fix context location should follow handoff pattern:** ``` docs/sprint-artifacts/ ├── handoffs/ │ ├── epic-1-to-2-handoff.md │ └── epic-2-to-3-handoff.md ├── uat-fixes/ # NEW │ ├── epic-1-fix-context-1.md │ └── epic-2-fix-context-1.md └── metrics/ ├── epic-1-metrics.yaml └── epic-2-metrics.yaml ``` **In `uat-validate.sh`, write fix context:** ```bash generate_fix_context() { local epic_id="$1" local attempt="$2" local failed_scenarios="$3" local fix_dir="$SPRINT_ARTIFACTS/uat-fixes" mkdir -p "$fix_dir" local fix_file="$fix_dir/epic-${epic_id}-fix-context-${attempt}.md" # Render template with variables sed -e "s/{epic_id}/$epic_id/g" \ -e "s/{attempt}/$attempt/g" \ -e "s/{timestamp}/$(date -u +"%Y-%m-%dT%H:%M:%SZ")/g" \ "$WORKFLOW_PATH/uat-fix-context-template.md" > "$fix_file" # Append failed scenarios echo "" >> "$fix_file" echo "## Failed Scenarios" >> "$fix_file" echo "$failed_scenarios" >> "$fix_file" echo "$fix_file" } ``` **In quick-dev fix session, load context:** ```bash run_quick_dev_fix() { local fix_context_file="$1" local fix_prompt="You are Barry, the Quick Flow Solo Dev. Load and process this fix context document: $fix_context_file Your task: 1. Read the failed scenarios and error details 2. Analyze root cause for each failure 3. Implement targeted fixes 4. Run the failing commands to verify fixes 5. Commit with message: fix(epic-{id}): UAT fix #{attempt} Constraints: - Only fix the identified failures - Do not refactor unrelated code - Run tests after fixes When done, output: FIX_COMPLETE: {number_fixed}/{total_failures} " # Fresh Claude context for fixes claude --dangerously-skip-permissions -p "$fix_prompt" } ``` --- ## Gap 6: Report Generator Missing Chain Integration ### Problem Step 10 (generate report) exists but isn't called automatically by `epic-chain.sh`. ### Required: Add Report Generation to `epic-chain.sh` **Add after all epics complete (~line 550):** ```bash # Generate chain execution report if [ "$GENERATE_REPORT" = true ]; then log "Generating chain execution report..." # Invoke report generation via Claude report_prompt="You are Bob, the Scrum Master. Execute the chain report generation workflow: - Load: $INSTALLED_PATH/steps/step-10-generate-report.md - Metrics folder: $SPRINT_ARTIFACTS/metrics - Chain plan: $CHAIN_PLAN_FILE - Output to: $CHAIN_REPORT_FILE Generate the complete execution report." claude --dangerously-skip-permissions -p "$report_prompt" if [ -f "$CHAIN_REPORT_FILE" ]; then log "✓ Report generated: $CHAIN_REPORT_FILE" else log_error "Report generation failed" fi fi ``` --- ## Implementation Priority | Priority | Gap | Effort | Impact | |----------|-----|--------|--------| | **P0** | Create `uat-validate.sh` | High | Critical - self-healing loop won't work without it | | **P0** | Add metrics instrumentation to `epic-execute.sh` | Medium | Critical - report generator needs data | | **P1** | Integrate UAT gate into `epic-chain.sh` | Medium | High - enables automated validation | | **P1** | Integrate report generation into `epic-chain.sh` | Low | High - automates report creation | | **P2** | Create step files for UAT validation | Medium | Medium - improves maintainability | | **P2** | Integrate fix context with handoff pattern | Low | Medium - cleaner file organization | --- ## File Reference ### Existing Files (Created) | File | Status | Purpose | |------|--------|---------| | `src/modules/bmm/agents/uat-validator.agent.yaml` | ✅ Complete | Quinn agent definition | | `src/modules/bmm/workflows/5-validation/uat-validate/workflow.yaml` | ✅ Complete | Workflow configuration | | `src/modules/bmm/workflows/5-validation/uat-validate/instructions.md` | ✅ Complete | Execution instructions | | `src/modules/bmm/workflows/5-validation/uat-validate/uat-fix-context-template.md` | ✅ Complete | Fix context template | | `src/modules/bmm/workflows/4-implementation/epic-chain/templates/chain-report-template.md` | ✅ Complete | Report template | | `src/modules/bmm/workflows/4-implementation/epic-chain/templates/epic-metrics-template.yaml` | ✅ Complete | Metrics schema | | `src/modules/bmm/workflows/4-implementation/epic-chain/steps/step-10-generate-report.md` | ✅ Complete | Report generation step | ### Files to Create | File | Priority | Purpose | |------|----------|---------| | `scripts/uat-validate.sh` | P0 | Shell orchestration for UAT validation | | `src/modules/bmm/workflows/5-validation/uat-validate/steps/step-01-load-uat.md` | P2 | Step file | | `src/modules/bmm/workflows/5-validation/uat-validate/steps/step-02-classify-scenarios.md` | P2 | Step file | | `src/modules/bmm/workflows/5-validation/uat-validate/steps/step-03-execute-scenarios.md` | P2 | Step file | | `src/modules/bmm/workflows/5-validation/uat-validate/steps/step-04-evaluate-gate.md` | P2 | Step file | | `src/modules/bmm/workflows/5-validation/uat-validate/steps/step-05-report-results.md` | P2 | Step file | ### Files to Modify | File | Priority | Changes | |------|----------|---------| | `scripts/epic-execute.sh` | P0 | Add metrics collection | | `scripts/epic-chain.sh` | P1 | Add UAT gate phase, report generation | --- ## Testing Plan ### Unit Tests 1. **uat-validate.sh** - Test scenario classification, command execution, signal output 2. **Metrics collection** - Verify YAML structure matches template 3. **Report generation** - Verify all placeholders replaced ### Integration Tests 1. **Self-healing loop** - Intentionally fail a scenario, verify fix + re-validate 2. **Epic chain with UAT** - Run full chain, verify UAT runs after each epic 3. **Report accuracy** - Compare report metrics to actual execution ### Manual Verification 1. Run `epic-chain 1-3` on test project 2. Verify metrics files created 3. Verify UAT validation runs 4. Verify report generated with accurate data --- ## Conclusion The UAT validation and report generation workflows are architecturally sound but missing the shell orchestration layer that makes BMAD workflows production-ready. The highest priority items are: 1. **Create `uat-validate.sh`** - Without this, context isolation doesn't happen 2. **Instrument `epic-execute.sh`** - Without this, reports have no data Once these are complete, the full flow will work: ``` epic-chain → epic-execute → UAT validate → (fix loop if needed) → next epic → report ```