BMAD-METHOD/docs/improvements/uat-workflow-implementation...

532 lines
18 KiB
Markdown

---
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 <epic_id> [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
```