name: ‘step-01-validate’ description: ‘Validate workflow outputs against checklist’ outputFile: ‘{test_artifacts}/ci-validation-report.md’
Validate outputs using the workflow checklist and record findings.
{communication_language}{validationChecklist}{outputFile}CRITICAL: Follow this sequence exactly.
Read {validationChecklist} and list all criteria.
Evaluate outputs against each checklist item.
Scan all generated YAML workflow files for unsafe interpolation patterns inside run: blocks.
Unsafe patterns to flag (FAIL):
${{ inputs.* }} — all workflow inputs are user-controllable${{ github.event.* }} — treat the entire event namespace as unsafe by default (includes PR titles, issue bodies, comment bodies, label names, etc.)${{ github.head_ref }} — PR source branch name (user-controlled)Detection method: For each run: block in generated YAML, check if any of the above expressions appears in the run script body. If found, flag as FAIL with the exact line and recommend converting to the safe env: intermediary pattern (pass through env:, reference as double-quoted "$ENV_VAR").
Safe patterns to ignore (exempt from flagging): ${{ steps.*.outputs.* }}, ${{ matrix.* }}, ${{ runner.os }}, ${{ github.sha }}, ${{ github.ref }}, ${{ secrets.* }}, ${{ env.* }} — these are safe from GitHub expression injection when used in run: blocks.
Write a validation report to {outputFile} with PASS/WARN/FAIL per section.
Run: python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete
If the resolver succeeds and returns a non-empty workflow.on_complete, execute that value as the final terminal instruction before exiting.
If the resolver fails, returns no output, or resolves an empty value, skip the hook and exit normally.