Skip to content

Quality Gates

Saros Industries edited this page Jun 28, 2025 · 1 revision

🚦 Quality Gates

Quality Gates in BMAD Enterprise ensure business model integrity and compliance through automated and manual validation processes integrated with the framework's quality assurance system.

Quality Gate Pipeline

class BMADQualityGates {
  constructor(framework) {
    this.framework = framework;
    this.validator = framework.getValidator();
    this.qualityEngine = framework.getQualityEngine();
    this.setupGates();
  }

  setupGates() {
    // Register BMAD-specific quality gates
    this.qualityEngine.registerGate('bmad.business_model.validation', {
      stage: 'pre_approval',
      validator: this.validateBusinessModel.bind(this),
      blocking: true
    });

    this.qualityEngine.registerGate('bmad.stakeholder.analysis', {
      stage: 'analysis',
      validator: this.validateStakeholderAnalysis.bind(this),
      blocking: false
    });

    this.qualityEngine.registerGate('bmad.financial.consistency', {
      stage: 'financial_review',
      validator: this.validateFinancialConsistency.bind(this),
      blocking: true
    });

    this.qualityEngine.registerGate('bmad.compliance.check', {
      stage: 'compliance',
      validator: this.validateCompliance.bind(this),
      blocking: true
    });
  }

  async validateBusinessModel(model, context) {
    const results = {
      passed: true,
      warnings: [],
      errors: [],
      metrics: {}
    };

    // Canvas completeness check
    const canvasResults = await this.validateCanvas(model.canvas);
    results.metrics.canvas_completeness = canvasResults.completeness;

    if (canvasResults.completeness < 0.8) {
      results.errors.push('Business Model Canvas is incomplete (< 80%)');
      results.passed = false;
    }

    // Value proposition validation
    const vpResults = await this.validateValuePropositions(model.canvas.value_propositions);
    results.metrics.value_proposition_clarity = vpResults.clarity_score;

    if (vpResults.clarity_score < 0.7) {
      results.warnings.push('Value propositions need clarification');
    }

    // Market fit analysis
    const marketResults = await this.validateMarketFit(model);
    results.metrics.market_fit_confidence = marketResults.confidence;

    if (marketResults.confidence < 0.6) {
      results.errors.push('Market fit confidence too low');
      results.passed = false;
    }

    return results;
  }

  async validateStakeholderAnalysis(stakeholders, context) {
    const results = {
      passed: true,
      warnings: [],
      errors: [],
      metrics: {}
    };

    // Stakeholder coverage check
    const coverage = this.calculateStakeholderCoverage(stakeholders);
    results.metrics.stakeholder_coverage = coverage;

    if (coverage < 0.85) {
      results.warnings.push('Stakeholder analysis may be incomplete');
    }

    // Influence mapping validation
    const influenceResults = await this.validateInfluenceMapping(stakeholders);
    results.metrics.influence_mapping_accuracy = influenceResults.accuracy;

    // Engagement plan completeness
    const engagementResults = await this.validateEngagementPlans(stakeholders);
    results.metrics.engagement_plan_completeness = engagementResults.completeness;

    if (engagementResults.completeness < 0.75) {
      results.errors.push('Engagement plans incomplete for key stakeholders');
      results.passed = false;
    }

    return results;
  }

  async validateFinancialConsistency(financials, context) {
    const results = {
      passed: true,
      warnings: [],
      errors: [],
      metrics: {}
    };

    // Revenue stream validation
    const revenueConsistency = await this.validateRevenueStreams(financials);
    results.metrics.revenue_consistency = revenueConsistency.score;

    if (revenueConsistency.score < 0.8) {
      results.errors.push('Revenue projections inconsistent with business model');
      results.passed = false;
    }

    // Cost structure analysis
    const costAnalysis = await this.validateCostStructure(financials);
    results.metrics.cost_structure_realism = costAnalysis.realism_score;

    if (costAnalysis.realism_score < 0.7) {
      results.warnings.push('Cost structure may be unrealistic');
    }

    // Break-even analysis
    const breakEvenResults = await this.validateBreakEvenAnalysis(financials);
    results.metrics.break_even_timeline = breakEvenResults.timeline_months;

    if (breakEvenResults.timeline_months > 36) {
      results.warnings.push('Break-even timeline exceeds 3 years');
    }

    return results;
  }

  async validateCompliance(model, context) {
    const results = {
      passed: true,
      warnings: [],
      errors: [],
      metrics: {}
    };

    // Industry-specific compliance
    const industryCompliance = await this.checkIndustryCompliance(model);
    results.metrics.industry_compliance_score = industryCompliance.score;

    if (industryCompliance.score < 0.9) {
      results.errors.push('Industry compliance requirements not met');
      results.passed = false;
    }

    // Data privacy compliance
    const privacyCompliance = await this.checkDataPrivacyCompliance(model);
    results.metrics.privacy_compliance_score = privacyCompliance.score;

    // Regulatory requirements
    const regulatoryCompliance = await this.checkRegulatoryCompliance(model);
    results.metrics.regulatory_compliance_score = regulatoryCompliance.score;

    if (regulatoryCompliance.critical_issues.length > 0) {
      results.errors.push(...regulatoryCompliance.critical_issues);
      results.passed = false;
    }

    return results;
  }
}

Automated Quality Metrics

class BMADQualityMetrics {
  constructor(framework) {
    this.framework = framework;
    this.metricsEngine = framework.getMetricsEngine();
    this.initializeMetrics();
  }

  initializeMetrics() {
    // Register BMAD quality metrics
    this.metricsEngine.registerMetric('bmad.model.completeness', {
      calculator: this.calculateModelCompleteness.bind(this),
      threshold: { warning: 0.8, error: 0.6 },
      frequency: 'on_change'
    });

    this.metricsEngine.registerMetric('bmad.stakeholder.engagement', {
      calculator: this.calculateStakeholderEngagement.bind(this),
      threshold: { warning: 0.7, error: 0.5 },
      frequency: 'daily'
    });

    this.metricsEngine.registerMetric('bmad.financial.accuracy', {
      calculator: this.calculateFinancialAccuracy.bind(this),
      threshold: { warning: 0.85, error: 0.7 },
      frequency: 'weekly'
    });
  }

  async calculateModelCompleteness(modelId) {
    const model = await this.framework.bmad.getModel(modelId);
    
    const sections = [
      'value_propositions',
      'customer_segments', 
      'channels',
      'customer_relationships',
      'revenue_streams',
      'key_resources',
      'key_activities',
      'key_partnerships',
      'cost_structure'
    ];

    const completedSections = sections.filter(section => 
      model.canvas[section] && 
      model.canvas[section].length > 0 &&
      model.canvas[section].every(item => item.validated === true)
    );

    return {
      value: completedSections.length / sections.length,
      details: {
        completed: completedSections,
        missing: sections.filter(s => !completedSections.includes(s)),
        total_sections: sections.length
      }
    };
  }

  async generateQualityReport(modelId, timeRange = '30d') {
    const metrics = await this.metricsEngine.getMetrics([
      'bmad.model.completeness',
      'bmad.stakeholder.engagement',
      'bmad.financial.accuracy'
    ], modelId, timeRange);

    const qualityGateResults = await this.framework.qualityEngine.getResults(
      modelId, 
      timeRange
    );

    return {
      overall_score: this.calculateOverallQualityScore(metrics),
      metrics,
      quality_gates: qualityGateResults,
      trends: this.calculateQualityTrends(metrics, timeRange),
      recommendations: await this.generateQualityRecommendations(metrics)
    };
  }
}

πŸš€ Getting Started


🧠 Core Concepts


⚑ Features


πŸ“– Guides


πŸ“‹ Reference


πŸ”Œ Advanced

MCP Integration

BMAD Enterprise


πŸ”§ Troubleshooting

Quick Navigation

🚨 Emergency Procedures

πŸ“‹ Common Issues

Installation & Setup

  • Installation Issues
    • Node.js Version Compatibility
    • Package Installation Failures
    • Framework Dependencies Missing
    • Database Connection Issues
    • Port Conflicts
    • Environment Setup Issues
    • Build and Development Issues
    • Framework CLI Issues

Configuration & Runtime

  • Configuration & Runtime Issues
    • Framework Configuration Problems
    • Runtime Performance Issues
    • Module Loading and Plugin Issues
    • Database and Storage Issues
    • Memory Leaks and High Memory Usage
    • High CPU Usage

BMAD Module

  • BMAD Module Issues
    • BMAD Module Initialization Problems
    • Business Model Canvas Issues
    • Stakeholder Management Issues
    • Analytics and Reporting Issues
    • Performance Optimization

Database & API

  • Database & API Issues
    • Database Connection Problems
    • Database Migration Issues
    • API Performance and Reliability Issues
    • Data Consistency Issues
    • Transaction Problems

Performance & Memory

Security & Authentication

  • Security & Authentication Issues
    • Authentication Failures
    • Authorization Problems
    • JWT Token Issues
    • Session Management
    • CORS and Security Headers
    • SSL/TLS Configuration

Deployment & Production

  • Deployment & Production Issues
    • Production Deployment Failures
    • Environment Configuration
    • Load Balancing Issues
    • Monitoring and Logging
    • Backup and Recovery

Information to Gather

When reporting issues, please include:

  • Framework version (npm list @cursoriper/core)
  • Node.js version (node --version)
  • Operating system and version
  • Error messages and stack traces
  • Steps to reproduce the issue
  • Configuration files (sanitized)
  • Recent changes or deployments

Tech Docs & Suport


πŸ“ž Support & Community


πŸ“‹ Release Notes

Last Updated: June 28, 2025
Framework Version: CursorRIPER.sigma v1.0+

For the original verbose framework, see CursorRIPER

← Back to Home

Clone this wiki locally