UNPKG

aios-core

Version:

Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework

1,225 lines (1,010 loc) 30.7 kB
# QA Review Build: 10-Phase Quality Assurance Review > **Phase:** QA Review > **Owner Agent:** @qa > **Epic:** Epic 6 - QA Evolution > **Command:** `*review-build {story-id}` --- ## Purpose Execute a structured 10-phase quality assurance review of a completed build. This comprehensive review validates implementation against spec, runs automated tests, performs browser/database verification, conducts code review, checks for regressions, and produces a detailed QA report with clear APPROVE/REJECT signal. --- ## autoClaude ```yaml autoClaude: version: '3.0' pipelinePhase: qa-review-build elicit: false deterministic: true composable: true inputs: - name: storyId type: string required: true description: Story ID in format {epic}.{story} (e.g., "6.1") - name: spec type: file path: docs/stories/{storyId}/spec/spec.md required: true - name: implementation type: file path: docs/stories/{storyId}/implementation/implementation.yaml required: false - name: storyFile type: file path: docs/stories/{storyId}*.md required: true outputs: - name: qa_report.md type: file path: docs/stories/{storyId}/qa/qa_report.md schema: qa-report-schema - name: status.json type: file path: .aios/status.json update: true verification: type: gate blocking: true verdict_field: signal contextRequirements: projectContext: true filesContext: true implementationPlan: true spec: true ``` --- ## 10 Review Phases ### Phase 0: Load Context ```yaml phase: 0 name: 'Load Context' description: 'Load all relevant artifacts to understand what was built' blocking: true actions: - id: load-spec action: read_file path: docs/stories/{storyId}/spec/spec.md required: true - id: load-implementation action: read_file path: docs/stories/{storyId}/implementation/implementation.yaml required: false - id: load-story action: read_file path: docs/stories/{storyId}*.md required: true - id: load-requirements action: read_file path: docs/stories/{storyId}/spec/requirements.json required: false - id: load-previous-qa action: read_file path: docs/stories/{storyId}/qa/qa_report.md required: false description: 'Check for previous QA reports' output: context: spec: '{spec content}' implementation: '{implementation yaml}' story: '{story content}' requirements: '{requirements json}' previousReview: '{previous qa report if exists}' validation: - spec.md exists and is readable - Story file exists and contains acceptance criteria ``` ### Phase 1: Verify Subtasks Completed ```yaml phase: 1 name: 'Verify Subtasks Completed' description: 'Ensure all implementation subtasks are marked complete' blocking: true subphases: # Phase 1.2: Evidence Requirements (Absorbed from Auto-Claude) - id: 1.2 name: 'Evidence Requirements Check' description: 'Verify required evidence is present for PR type' task: qa-evidence-requirements.md blocking: false actions: - id: detect-pr-type action: detect_pr_type sources: [story_title, commit_messages, acceptance_criteria] types: [bug_fix, feature, refactor, performance, security, documentation] - id: evaluate-evidence action: evaluate_evidence_checklist sources: [story_file, qa_report, test_results, screenshots, commits] checks: - id: minimum-score condition: 'evidence_score >= minimum_for_type' severity: HIGH message: 'Insufficient evidence for ${pr_type}' - id: no-blocking-missing condition: 'no CRITICAL evidence items missing' severity: CRITICAL message: 'Missing critical evidence: ${missing_items}' output: evidenceCheck: prType: '{detected_type}' score: '{X/Y}' passed: true|false missing: '[list of missing items]' actions: - id: parse-subtasks action: extract_checklist source: implementation.yaml pattern: 'subtasks[].status' - id: verify-commits action: git_log filter: 'storyId:{storyId}' description: 'Check commits exist for this story' - id: check-file-list action: extract_section source: story.md section: 'File List' description: 'Verify File List section is populated' checks: - id: subtasks-complete condition: 'all subtasks have status: completed' severity: HIGH message: 'All subtasks must be completed before QA review' - id: commits-exist condition: 'git log contains commits referencing storyId' severity: HIGH message: 'No commits found for this story' - id: files-documented condition: 'File List section is not empty' severity: MEDIUM message: 'File List section should document all changed files' output: subtasks: total: '{count}' completed: '{count}' pending: '[list of pending subtasks]' commits: count: '{count}' latest: '{latest commit hash and message}' filesDocumented: true|false ``` ### Phase 2: Initialize Environment ```yaml phase: 2 name: 'Initialize Environment' description: 'Prepare environment for testing - install deps, build project' blocking: true actions: - id: install-deps action: execute_command command: 'npm install' timeout: 120000 description: 'Install project dependencies' - id: build-project action: execute_command command: 'npm run build' timeout: 300000 description: 'Build the project' - id: check-env action: verify_environment checks: - node_version: '>=18.0.0' - npm_version: '>=9.0.0' - env_file_exists: '.env or .env.local' checks: - id: deps-installed condition: 'npm install exits with code 0' severity: HIGH message: 'Failed to install dependencies' - id: build-success condition: 'npm run build exits with code 0' severity: HIGH message: 'Build failed - cannot proceed with QA' - id: no-typescript-errors condition: 'build output contains no type errors' severity: HIGH message: 'TypeScript compilation errors detected' output: environment: nodeVersion: '{version}' npmVersion: '{version}' buildStatus: 'success|failure' buildTime: '{duration in ms}' errors: '[list of errors if any]' ``` ### Phase 3: Automated Testing ```yaml phase: 3 name: 'Automated Testing' description: 'Run all automated test suites' blocking: true actions: - id: run-unit-tests action: execute_command command: 'npm run test' timeout: 300000 description: 'Run unit tests' - id: run-integration-tests action: execute_command command: 'npm run test:integration' timeout: 600000 optional: true description: 'Run integration tests if available' - id: run-e2e-tests action: execute_command command: 'npm run test:e2e' timeout: 900000 optional: true description: 'Run end-to-end tests if available' - id: collect-coverage action: parse_output source: 'test output' pattern: 'coverage summary' checks: - id: unit-tests-pass condition: 'npm run test exits with code 0' severity: HIGH message: 'Unit tests failed' - id: integration-tests-pass condition: 'npm run test:integration exits with code 0 OR command not found' severity: MEDIUM message: 'Integration tests failed' - id: e2e-tests-pass condition: 'npm run test:e2e exits with code 0 OR command not found' severity: MEDIUM message: 'E2E tests failed' - id: coverage-threshold condition: 'coverage >= 80% OR project has no coverage threshold' severity: LOW message: 'Test coverage below threshold' output: testing: unit: status: 'pass|fail|skip' passed: '{count}' failed: '{count}' skipped: '{count}' duration: '{ms}' integration: status: 'pass|fail|skip|not_available' passed: '{count}' failed: '{count}' e2e: status: 'pass|fail|skip|not_available' passed: '{count}' failed: '{count}' coverage: lines: '{percentage}' branches: '{percentage}' functions: '{percentage}' ``` ### Phase 4: Browser Verification ```yaml phase: 4 name: 'Browser Verification' description: 'Manual or automated browser-based verification' blocking: false conditional: 'project has UI components' subphases: # Phase 4.2: Browser Console Check (Absorbed from Auto-Claude) - id: 4.2 name: 'Browser Console Check' description: 'Detect runtime errors in browser console' task: qa-browser-console-check.md blocking: true actions: - id: start-dev-server action: detect_dev_server fallback: 'npm run dev' wait_for: 'ready|compiled|listening' timeout: 60000 - id: capture-console action: playwright_console_listener capture: [error, warn, uncaught_exception, unhandled_rejection] pages: auto_detect_from_changes - id: check-network action: playwright_network_listener capture: ['status >= 400', 'timeout', 'failed'] checks: - id: no-critical-errors condition: 'no Uncaught Error, TypeError, ReferenceError' severity: CRITICAL message: 'Critical console errors detected - BLOCKING' - id: no-network-failures condition: 'no 5xx errors, no failed requests' severity: HIGH message: 'Network failures detected' output: browserConsole: critical: '{count}' high: '{count}' medium: '{count}' blocking: true|false actions: - id: detect-ui-changes action: analyze_diff filter: '**/*.tsx,**/*.jsx,**/*.vue,**/*.html,**/*.css' description: 'Detect if UI files were changed' - id: run-playwright action: execute_command command: 'npx playwright test' timeout: 600000 optional: true condition: 'playwright.config exists' - id: visual-regression action: compare_screenshots baseline: 'docs/qa/screenshots/baseline' current: 'docs/qa/screenshots/current' optional: true - id: accessibility-check action: execute_command command: 'npx axe-core' optional: true checks: - id: ui-renders condition: 'no console errors during render' severity: MEDIUM message: 'UI rendering errors detected' - id: responsive-design condition: 'UI works on mobile/tablet/desktop viewports' severity: LOW message: 'Responsive design issues detected' - id: accessibility condition: 'no critical accessibility violations' severity: MEDIUM message: 'Accessibility violations found' output: browser: applicable: true|false playwrightStatus: 'pass|fail|skip|not_configured' visualRegression: status: 'pass|fail|skip' diffs: '[list of differing screenshots]' accessibility: violations: '{count}' criticalCount: '{count}' ``` ### Phase 5: Database Validation ```yaml phase: 5 name: 'Database Validation' description: 'Verify database schema and data integrity' blocking: false conditional: 'project has database components' subphases: # Phase 5.3: False Positive Detection (Absorbed from Auto-Claude) - id: 5.3 name: 'False Positive Detection' description: 'Critical thinking to prevent confirmation bias' task: qa-false-positive-detection.md blocking: false conditional: 'pr_type in [bug_fix, security]' actions: - id: 4-step-protocol action: run_verification_protocol steps: - revert_test: 'Can we remove change and see problem return?' - baseline_failure: 'Did we test OLD code actually fails?' - success_verification: 'Did we test NEW code actually succeeds?' - independent_variables: 'Problem doesnt fix itself independently?' - id: bias-check action: check_confirmation_bias criteria: - negative_cases_tested - independent_verification_possible - mechanism_explained - alternatives_ruled_out checks: - id: minimum-confidence condition: 'confidence in [HIGH, MEDIUM]' severity: HIGH message: 'Low confidence in fix effectiveness' - id: no-critical-failures condition: 'no step has FAIL with severity CRITICAL' severity: CRITICAL message: 'Critical verification step failed' output: falsePositiveCheck: confidence: 'HIGH|MEDIUM|LOW' falsePositiveRisk: 'LOW|MEDIUM|HIGH' recommendations: '[list]' actions: - id: detect-db-changes action: analyze_diff filter: '**/migrations/**,**/schema/**,**/*.sql,**/prisma/**' description: 'Detect if database files were changed' - id: check-migrations action: execute_command command: 'npm run db:migrate:status' optional: true description: 'Check migration status' - id: validate-schema action: execute_command command: 'npm run db:validate' optional: true description: 'Validate schema consistency' - id: check-seeds action: verify_file_exists path: '**/seeds/**' optional: true description: 'Check if seed data exists' checks: - id: migrations-applied condition: 'all pending migrations are applied' severity: HIGH message: 'Pending database migrations exist' - id: schema-valid condition: 'schema validation passes' severity: HIGH message: 'Database schema validation failed' - id: no-data-loss condition: "migrations don't cause data loss" severity: HIGH message: 'Migration may cause data loss' output: database: applicable: true|false migrationsStatus: 'up-to-date|pending|not_applicable' pendingMigrations: '[list]' schemaValid: true|false dataIntegrity: 'verified|unverified|not_applicable' ``` ### Phase 6: Code Review (Enhanced with Auto-Claude Absorption) ```yaml phase: 6 name: 'Code Review' description: 'Security review, pattern adherence, code quality, library validation' blocking: true # Phase 6.0: Library Validation (Absorbed from Auto-Claude) subphases: - id: 6.0 name: 'Library Validation' description: 'Validate third-party library usage via Context7' task: qa-library-validation.md blocking: false actions: - id: extract-imports action: grep_imports patterns: - 'import.*from [''"]([^''"./][^''"]*)[''"]' - "require\\(['\"]([^'\"./][^'\"]*)['\"]\\)" description: 'Extract all third-party imports' - id: validate-context7 action: context7_validation for_each: 'extracted_imports' steps: - resolve_library_id - query_docs - validate_signatures - check_deprecated description: 'Validate each library against Context7 docs' checks: - id: api-usage-correct condition: 'all library APIs used correctly' severity: CRITICAL message: 'Incorrect library API usage detected' - id: no-deprecated condition: 'no deprecated APIs used' severity: MAJOR message: 'Deprecated API usage detected' output: libraryValidation: checked: '{count}' issues: '[list]' unresolved: '[list]' # Phase 6.1: Security Checklist (Absorbed from Auto-Claude) - id: 6.1 name: 'Security Checklist' description: '8-point security vulnerability scan' task: qa-security-checklist.md blocking: true actions: - id: check-eval action: grep_pattern pattern: 'eval\\(|new Function\\(' severity: CRITICAL description: 'Check for eval() and dynamic code execution' - id: check-innerHTML action: grep_pattern pattern: '\\.innerHTML\\s*=|\\.outerHTML\\s*=' severity: CRITICAL description: 'Check for innerHTML XSS vectors' - id: check-dangerouslySetInnerHTML action: grep_pattern pattern: 'dangerouslySetInnerHTML' severity: CRITICAL description: 'Check for React XSS vectors' - id: check-shell-true action: grep_pattern pattern: 'shell\\s*=\\s*True|os\\.system\\(|os\\.popen\\(' severity: CRITICAL description: 'Check for Python command injection' - id: check-hardcoded-secrets action: grep_pattern pattern: 'api[_-]?key\\s*[=:]\\s*[''"][^''"]{10,}|password\\s*[=:]\\s*[''"][^''"]+' severity: CRITICAL description: 'Check for hardcoded secrets' - id: check-sql-injection action: grep_pattern pattern: 'query\\s*\\(\\s*[''"`].*\\$\\{|execute\\s*\\(.*\\.format\\(' severity: CRITICAL description: 'Check for SQL injection patterns' - id: check-input-validation action: grep_pattern pattern: 'req\\.body\\.[a-zA-Z]+[^?]|req\\.query\\.[a-zA-Z]+[^?]' severity: HIGH description: 'Check for missing input validation' - id: check-cors action: grep_pattern pattern: 'origin:\\s*[''"]\\*[''"]|Access-Control-Allow-Origin.*\\*' severity: HIGH description: 'Check for insecure CORS' checks: - id: no-critical-security condition: 'no CRITICAL security issues' severity: CRITICAL message: 'Critical security vulnerability detected - BLOCKING' - id: no-high-security condition: 'no HIGH security issues' severity: HIGH message: 'High severity security issue detected' output: securityChecklist: critical: '{count}' high: '{count}' issues: '[detailed list]' blocking: true|false # Phase 6.2: Migration Validation (Absorbed from Auto-Claude) - id: 6.2 name: 'Migration Validation' description: 'Validate database migrations for schema changes' task: qa-migration-validation.md blocking: false conditional: 'schema_changes_detected' actions: - id: detect-framework action: detect_db_framework frameworks: - supabase - prisma - drizzle - django - rails - sequelize - id: validate-migrations action: validate_migrations checks: - migration_exists - migration_matches_schema - migration_reversible - rls_policies_exist checks: - id: migrations-exist condition: 'migration file exists for each schema change' severity: CRITICAL message: 'Missing migration for schema change' - id: rls-policies condition: 'RLS policies exist for new tables (Supabase)' severity: HIGH message: 'Missing RLS policies for new table' output: migrationValidation: framework: '{detected}' schemaChanges: '{count}' migrationsFound: '{count}' missing: '[list]' issues: '[list]' # Original Phase 6 actions (now Phase 6.3) - id: 6.3 name: 'Code Quality & Patterns' description: 'CodeRabbit, linting, dependency audit' blocking: true actions: - id: security-scan action: execute_coderabbit type: 'security' description: 'Run security vulnerability scan' - id: pattern-check action: analyze_patterns rules: - no_hardcoded_secrets - no_console_logs_in_production - proper_error_handling - consistent_naming - id: dependency-audit action: execute_command command: 'npm audit' description: 'Check for vulnerable dependencies' - id: lint-check action: execute_command command: 'npm run lint' description: 'Run linter' checks: - id: no-secrets condition: 'no hardcoded API keys, passwords, or tokens' severity: HIGH message: 'Hardcoded secrets detected' - id: no-vulnerabilities condition: 'no high/critical npm audit vulnerabilities' severity: HIGH message: 'Security vulnerabilities in dependencies' - id: patterns-followed condition: 'code follows project patterns' severity: MEDIUM message: 'Code pattern violations detected' - id: lint-clean condition: 'npm run lint exits with code 0' severity: MEDIUM message: 'Linting errors present' output: codeReview: # Phase 6.0 - Library Validation libraryValidation: checked: '{count}' issues: '[list]' unresolved: '[list]' # Phase 6.1 - Security Checklist securityChecklist: critical: '{count}' high: '{count}' issues: '[detailed list]' # Phase 6.2 - Migration Validation migrationValidation: framework: '{detected}' issues: '[list]' # Phase 6.3 - Code Quality security: secrets: '[list of potential secrets]' vulnerabilities: critical: '{count}' high: '{count}' medium: '{count}' low: '{count}' patterns: violations: '[list of violations]' suggestions: '[list of improvements]' lint: errors: '{count}' warnings: '{count}' ``` ### Phase 7: Regression Testing ```yaml phase: 7 name: 'Regression Testing' description: 'Verify existing features still work' blocking: true actions: - id: identify-affected-areas action: analyze_dependencies source: 'changed files' description: 'Identify areas potentially affected by changes' - id: run-smoke-tests action: execute_command command: 'npm run test:smoke' optional: true description: 'Run smoke tests for critical paths' - id: check-breaking-changes action: analyze_api_diff description: 'Check for breaking API changes' - id: verify-backwards-compat action: verify_compatibility description: 'Verify backwards compatibility' checks: - id: no-regressions condition: 'smoke tests pass' severity: HIGH message: 'Regression detected in existing functionality' - id: api-stable condition: 'no breaking API changes without version bump' severity: HIGH message: 'Breaking API changes detected' - id: deps-compatible condition: "dependency updates don't break existing features" severity: MEDIUM message: 'Dependency compatibility issues' output: regression: affectedAreas: '[list of affected modules/components]' smokeTestStatus: 'pass|fail|skip' breakingChanges: '[list of breaking changes]' regressionRisk: 'low|medium|high' ``` ### Phase 8: Generate Report ```yaml phase: 8 name: 'Generate Report' description: 'Compile findings into comprehensive QA report' blocking: true actions: - id: aggregate-findings action: compile_results sources: - phase_0_context - phase_1_subtasks - phase_2_environment - phase_3_testing - phase_4_browser - phase_5_database - phase_6_code_review - phase_7_regression - id: categorize-issues action: categorize categories: - CRITICAL: 'Security vulnerabilities, data loss, breaking changes' - HIGH: 'Test failures, build errors, major bugs' - MEDIUM: 'Code quality, pattern violations, minor bugs' - LOW: 'Suggestions, optimizations, style issues' - id: generate-markdown action: render_template template: qa-report-template.md output: docs/stories/{storyId}/qa/qa_report.md template: | # QA Review Report: Story {storyId} **Review Date:** {timestamp} **Reviewed By:** Quinn (Test Architect) **Signal:** {APPROVE|REJECT} --- ## Executive Summary {summary_paragraph} ## Phase Results ### Phase 0: Context Loaded - Spec: {loaded|not_found} - Implementation Plan: {loaded|not_found} - Story File: {loaded|not_found} ### Phase 1: Subtasks Verification - Total Subtasks: {count} - Completed: {count} - Pending: {count} - Commits Found: {count} ### Phase 2: Environment - Dependencies: {installed|failed} - Build: {success|failed} - TypeScript: {clean|errors} ### Phase 3: Automated Tests - Unit Tests: {passed}/{total} ({percentage}%) - Integration Tests: {status} - E2E Tests: {status} - Coverage: {percentage}% ### Phase 4: Browser Verification - Applicable: {yes|no} - Playwright: {status} - Visual Regression: {status} - Accessibility: {violations} violations ### Phase 5: Database Validation - Applicable: {yes|no} - Migrations: {status} - Schema: {valid|invalid} ### Phase 6: Code Review - Security Issues: {count} - Pattern Violations: {count} - Lint Errors: {count} ### Phase 7: Regression Testing - Affected Areas: {count} - Smoke Tests: {status} - Breaking Changes: {count} --- ## Issues Found ### Critical Issues {list_critical_issues} ### High Priority Issues {list_high_issues} ### Medium Priority Issues {list_medium_issues} ### Low Priority Issues {list_low_issues} --- ## Recommendations ### Must Fix Before Approval {must_fix_list} ### Suggested Improvements {suggestions_list} --- ## Signal: {APPROVE|REJECT} **Reason:** {signal_reason} **Next Actions:** {next_actions_list} --- *Generated by Quinn (@qa) via qa-review-build task* output: report: path: docs/stories/{storyId}/qa/qa_report.md generated: true ``` ### Phase 9: Update Implementation Plan ```yaml phase: 9 name: 'Update Implementation Plan' description: 'Mark story as reviewed, add issues to implementation plan' blocking: false actions: - id: update-status-json action: update_json path: .aios/status.json updates: - path: 'stories.{storyId}.qaReviewed' value: true - path: 'stories.{storyId}.qaSignal' value: '{APPROVE|REJECT}' - path: 'stories.{storyId}.qaReviewedAt' value: '{timestamp}' - id: update-implementation action: update_yaml path: docs/stories/{storyId}/implementation/implementation.yaml updates: - path: 'qa.reviewed' value: true - path: 'qa.signal' value: '{APPROVE|REJECT}' - path: 'qa.issues' value: '{issues_list}' - id: create-fix-requests action: create_issues condition: 'signal == REJECT' issues: '{critical_and_high_issues}' format: fix-request output: updates: statusJson: 'updated' implementationYaml: 'updated' fixRequestsCreated: '{count}' ``` ### Phase 10: Signal Completion ```yaml phase: 10 name: 'Signal Completion' description: 'Emit final APPROVE or REJECT signal' blocking: true actions: - id: calculate-signal action: determine_verdict rules: REJECT: - any_critical_issues: true - any_high_issues_unfixed: true - build_failed: true - unit_tests_failed: true APPROVE: - all_above_false: true - subtasks_complete: true - id: notify-completion action: emit_signal signal: '{APPROVE|REJECT}' metadata: storyId: '{storyId}' reviewedBy: 'Quinn' reviewedAt: '{timestamp}' reportPath: 'docs/stories/{storyId}/qa/qa_report.md' - id: update-story-status action: recommend_status condition: 'signal == APPROVE' recommendation: 'Ready for Done' checks: - id: signal-clear condition: 'signal is definitively APPROVE or REJECT' severity: HIGH message: 'Unable to determine clear signal' output: signal: 'APPROVE|REJECT' reason: '{detailed_reason}' nextSteps: APPROVE: - 'Story ready for Done status' - 'PR can be merged' - 'Deploy to staging/production' REJECT: - 'Review issues in qa_report.md' - 'Fix critical and high priority issues' - 'Re-run *review-build {storyId}' ``` --- ## Signal Logic ```yaml signal_rules: APPROVE: condition: | - No CRITICAL issues - No HIGH issues (or all HIGH issues resolved) - Build succeeds - Unit tests pass - All subtasks completed meaning: 'Build is ready for production' next_action: 'Proceed to deployment' REJECT: condition: | - Any CRITICAL issue present OR - Any HIGH issue unresolved OR - Build fails OR - Unit tests fail OR - Subtasks incomplete meaning: 'Build requires fixes before approval' next_action: 'Return to @dev with fix requests' ``` --- ## Command Integration ```yaml command: name: '*review-build' syntax: '*review-build {story-id} [--quick] [--skip-browser] [--skip-db]' agent: qa flags: --quick: 'Skip optional phases (4, 5)' --skip-browser: 'Skip Phase 4 (Browser Verification)' --skip-db: 'Skip Phase 5 (Database Validation)' examples: - '*review-build 6.1' - '*review-build 6.1 --quick' - '*review-build 6.1 --skip-browser' ``` --- ## Output Files ### Primary Output: qa_report.md ```yaml location: docs/stories/{storyId}/qa/qa_report.md format: markdown contents: - executive_summary - phase_results (all 10 phases) - issues_by_severity - recommendations - signal_with_reason ``` ### Secondary Output: status.json ```yaml location: .aios/status.json updates: - stories.{storyId}.qaReviewed: true - stories.{storyId}.qaSignal: 'APPROVE|REJECT' - stories.{storyId}.qaReviewedAt: '{ISO-8601}' - stories.{storyId}.qaIssues: '[issue_ids]' ``` --- ## Error Handling ```yaml errors: - id: spec-not-found condition: 'spec.md does not exist' action: 'HALT - Cannot review without specification' blocking: true - id: build-timeout condition: 'npm run build exceeds timeout' action: 'Log timeout, mark build as FAILED' blocking: true - id: test-timeout condition: 'tests exceed timeout' action: 'Log timeout, continue with partial results' blocking: false - id: phase-failure condition: 'blocking phase fails' action: 'Stop review, generate partial report with REJECT signal' blocking: true ``` --- ## Integration with QA Agent This task is automatically triggered by the `*review-build` command in the @qa agent: ```yaml agent_integration: command: '*review-build {story-id}' task_file: qa-review-build.md agent: qa pre_requisites: - Story exists in docs/stories/ - Story status is "Review" or "In Progress" - Spec file exists post_actions: - Update QA Results section in story file - Create/update gate file in qa.qaLocation/gates - Emit signal to status.json ``` --- ## Metadata ```yaml metadata: story: '6.1' epic: 'Epic 6 - QA Evolution' created: '2026-01-29' author: '@architect' version: '1.0.0' tags: - qa-evolution - review-build - 10-phase-review - quality-gate - automated-testing ```