18 KiB
| 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 phasesscripts/epic-chain.sh- Handles multi-epic execution with handoffs
State Transfer Mechanisms:
- Git staging - Code changes pass between contexts via
git add - Story files - Dev Agent Record and Code Review Record sections
- Handoff documents - Cross-epic context transfer
- 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:
- Load UAT document for specified epic
- Execute automatable scenarios via shell commands
- Collect pass/fail results with evidence
- On failure: Generate fix context document
- Spawn fresh Claude session for quick-dev fixes
- Re-validate in fresh context
- Loop until pass or max retries
- Output final gate result
Interface:
# 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):
# 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):
# 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):
# 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):
# 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):
# 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):
--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.mdstep-02-dev-story.mdstep-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):
# 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:
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:
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):
# 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
- uat-validate.sh - Test scenario classification, command execution, signal output
- Metrics collection - Verify YAML structure matches template
- Report generation - Verify all placeholders replaced
Integration Tests
- Self-healing loop - Intentionally fail a scenario, verify fix + re-validate
- Epic chain with UAT - Run full chain, verify UAT runs after each epic
- Report accuracy - Compare report metrics to actual execution
Manual Verification
- Run
epic-chain 1-3on test project - Verify metrics files created
- Verify UAT validation runs
- 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:
- Create
uat-validate.sh- Without this, context isolation doesn't happen - 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