BMAD-METHOD/src/modules/bmm/workflows/5-validation/uat-validate/steps/step-04-evaluate-gate.md

5.5 KiB

Step 4: Evaluate Gate

Purpose

Determine overall pass/fail status based on execution results. If failed and self-healing is enabled, generate fix context and trigger the quick-dev fix loop.

Inputs

Input Source Required
results Step 3 Yes
passed_count Step 3 Yes
failed_count Step 3 Yes
failed_details Step 3 Yes
max_retries CLI Yes (default: 2)
current_attempt State Yes (starts at 0)
self_heal_enabled Config Yes (default: true)

Process

4.1 Check All Results

if failed_count == 0:
    gate_status = PASS
    → Skip to Step 5 (Report Results)
else:
    gate_status = FAIL
    → Continue to 4.2

4.2 Evaluate Retry Eligibility

if current_attempt >= max_retries:
    → Max retries exceeded, halt
    exit_code = 2

if self_heal_enabled == false:
    → Self-healing disabled, report failure
    exit_code = 1

→ Continue to 4.3 (Generate Fix Context)

4.3 Generate Fix Context Document

Create fix context document at:

{sprint_artifacts}/uat-fixes/epic-{epic_id}-fix-context-{attempt}.md

4.3.1 Load Template

Load from: {workflow_path}/uat-fix-context-template.md

If template not found, use inline default structure.

4.3.2 Populate Template Variables

Variable Value
{epic_id} Epic ID being validated
{attempt} Current fix attempt number
{timestamp} ISO 8601 timestamp
{max_retries} Maximum retry limit
{next_attempt} attempt + 1
{failure_count} Number of failed scenarios
{passed} Number of passed scenarios
{total} Total scenarios executed

4.3.3 Append Failed Scenario Details

For each failed scenario:

### Scenario {id}: {name}

**Command Executed:**
```bash
{command}

Expected Result: {expected_result}

Actual Result:

{actual_output}

Error Output:

{stderr}

Exit Code: {exit_code}

Related Story: {story_id} (if determinable)

Root Cause Hint: {analyze_error_for_hints}



#### 4.3.4 Add Fix Instructions

```markdown
## Fix Instructions

Address the failures above in priority order. For each fix:

1. **Analyze** - Understand why the scenario failed
2. **Locate** - Find the relevant code files
3. **Fix** - Implement the minimum change to resolve
4. **Verify** - Run the scenario command locally
5. **Commit** - Use: `fix(epic-{epic_id}): {description}`

### Constraints

- Only fix identified failures
- Do not refactor unrelated code
- Run tests after fixes: `npm test`

4.4 Trigger Quick-Dev Fix

Spawn a fresh Claude session for fixes:

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. Stage changes: git add -A
6. Commit: fix(epic-{epic_id}): UAT fix #{attempt}

Constraints:
- Only fix identified failures
- Do not refactor unrelated code
- Run tests after fixes

When done, output:
FIX_COMPLETE: {fixed_count}/{failure_count}"

claude --dangerously-skip-permissions -p "$fix_prompt"

4.5 Increment and Re-validate

After fix session completes:

  1. Increment current_attempt
  2. Return to Step 3 (Execute Scenarios)
  3. Re-run validation with fresh results
current_attempt += 1
→ Go to Step 3: Execute Scenarios
→ Then return to Step 4: Evaluate Gate

4.6 Gate Decision Flowchart

┌─────────────────┐
│ Execute Results │
└────────┬────────┘
         │
         ▼
    ┌─────────┐
    │All Pass?│──Yes──▶ GATE_PASS (exit 0)
    └────┬────┘
         │No
         ▼
    ┌──────────────┐
    │ Retries Left?│──No──▶ GATE_FAIL (exit 2)
    └──────┬───────┘        Max retries exceeded
           │Yes
           ▼
    ┌──────────────┐
    │Self-Heal On? │──No──▶ GATE_FAIL (exit 1)
    └──────┬───────┘        Fixable but disabled
           │Yes
           ▼
    ┌──────────────┐
    │Generate Fix  │
    │Context Doc   │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │Spawn Quick-  │
    │Dev Fix       │
    └──────┬───────┘
           │
           ▼
    ┌──────────────┐
    │Re-validate   │──────▶ (Back to Execute)
    └──────────────┘

Outputs

Output Location Description
gate_status State PASS or FAIL
fix_context_file Path Generated fix context (if failed)
fix_attempt State Current attempt number

Completion Signal

GATE_EVALUATED: PASS

or

GATE_EVALUATED: FAIL
FIX_CONTEXT: {fix_context_file}
FIX_ATTEMPT: {attempt}/{max_retries}

Error Handling

Error Action
Template not found Use inline default template
Fix context write fails Log error, continue without self-healing
Claude session fails Log output, count as failed attempt
Fix didn't resolve issue Increment attempt, retry if allowed