.do
Evaluate

Evaluate

Evaluate code quality, performance, and business metrics with automated analysis and reporting

Evaluate code quality, performance, security, and business impact with automated analysis, metrics, and continuous monitoring.

Overview

The Evaluate phase ensures your Business-as-Code meets quality standards across technical and business dimensions. Through automated analysis, metrics tracking, and continuous evaluation, you maintain high standards while moving fast.

This phase emphasizes:

  • Code Quality: Maintainability, complexity, test coverage
  • Performance: Speed, efficiency, resource usage
  • Security: Vulnerabilities, compliance, best practices
  • Business Impact: Revenue, user satisfaction, KPIs
  • Team Velocity: Deployment frequency, lead time, MTTR

Evaluation Primitives

Code Quality Metrics

Automated code quality analysis:

// Track code quality metrics
on($.Code.committed, async (commit, $) => {
  const analysis = await $.CodeQuality.analyze(commit, {
    metrics: ['complexity', 'duplication', 'coverage', 'maintainability'],
  })

  // Store metrics
  await db.create($.CodeMetrics, {
    commitId: commit.id,
    complexity: analysis.complexity,
    duplication: analysis.duplication,
    coverage: analysis.coverage,
    maintainability: analysis.maintainability,
    score: analysis.overall,
  })

  // Alert on quality issues
  if (analysis.overall < 70) {
    await send($.Alert.send, {
      type: 'code-quality',
      severity: 'medium',
      message: `Code quality score: ${analysis.overall}/100`,
      details: analysis,
    })
  }
})

// Track test coverage
on($.Tests.completed, async (results, $) => {
  await $.Metrics.record('test_coverage', {
    lines: results.coverage.lines,
    branches: results.coverage.branches,
    functions: results.coverage.functions,
  })

  if (results.coverage.lines < 80) {
    await send($.Alert.send, {
      type: 'low-coverage',
      message: `Test coverage: ${results.coverage.lines}% (target: 80%)`,
    })
  }
})

Performance Evaluation

Monitor performance metrics:

// Performance benchmarking
on($.Deploy.completed, async (deployment, $) => {
  // Run performance benchmarks
  const benchmarks = await $.Performance.benchmark({
    endpoints: ['/api/products', '/api/orders', '/api/users'],
    duration: '5 minutes',
    concurrency: 100,
  })

  // Compare with baseline
  for (const endpoint of benchmarks) {
    const baseline = await $.Performance.getBaseline(endpoint.path)

    const regression = ((endpoint.p95 - baseline.p95) / baseline.p95) * 100

    if (regression > 20) {
      await send($.Alert.send, {
        type: 'performance-regression',
        endpoint: endpoint.path,
        current: endpoint.p95,
        baseline: baseline.p95,
        regression: `${regression.toFixed(1)}%`,
      })
    }
  }
})

// Real-time performance tracking
on($.Request.completed, async (request, $) => {
  await $.Metrics.record('api_latency', {
    endpoint: request.path,
    method: request.method,
    duration: request.duration,
    status: request.status,
  })
})

Security Evaluation

Continuous security scanning:

// Dependency vulnerability scanning
on($.Dependencies.updated, async (changes, $) => {
  const vulnerabilities = await $.Security.scanDependencies({
    packages: changes.packages,
  })

  for (const vuln of vulnerabilities) {
    await db.create($.Vulnerability, {
      package: vuln.package,
      version: vuln.version,
      severity: vuln.severity,
      cve: vuln.cve,
      fixedIn: vuln.fixedIn,
    })

    if (vuln.severity === 'critical' || vuln.severity === 'high') {
      await send($.Alert.send, {
        type: 'security-vulnerability',
        severity: vuln.severity,
        package: vuln.package,
        cve: vuln.cve,
      })
    }
  }
})

// Code security analysis
on($.Code.committed, async (commit, $) => {
  const issues = await $.Security.scan(commit, {
    checks: ['sql-injection', 'xss', 'secrets', 'authentication'],
  })

  if (issues.length > 0) {
    await send($.Team.security, {
      type: 'security-issues-detected',
      commit: commit.id,
      issues,
    })
  }
})

Business Impact Evaluation

Measure business outcomes:

// Feature impact analysis
on($.Feature.deployed, async (feature, $) => {
  // Track for 30 days
  await $.Schedule.create({
    trigger: '+30 days',
    action: async () => {
      const impact = await $.Analytics.featureImpact({
        feature: feature.name,
        period: '30 days',
        metrics: ['adoption', 'engagement', 'revenue', 'retention'],
      })

      await db.create($.FeatureImpact, {
        featureId: feature.id,
        adoption: impact.adoption,
        engagement: impact.engagement,
        revenue: impact.revenue,
        retention: impact.retention,
        success: impact.adoption > 0.4 && impact.engagement > 0.6,
      })

      // Report to team
      await send($.Team.product, {
        type: 'feature-impact-report',
        feature: feature.name,
        impact,
      })
    },
  })
})

// Revenue impact tracking
on($.Experiment.graduated, async (experiment, $) => {
  const revenueImpact = await calculateRevenueImpact(experiment.id)

  await $.Metrics.record('experiment_revenue_impact', {
    experiment: experiment.name,
    incrementalRevenue: revenueImpact.incremental,
    roi: revenueImpact.roi,
  })
})

Team Velocity Metrics

Track development efficiency:

// DORA metrics tracking
const DORAMetrics = {
  // Deployment Frequency
  trackDeployment: async (deployment) => {
    await $.Metrics.increment('deployments', {
      environment: deployment.environment,
      timestamp: new Date(),
    })
  },

  // Lead Time for Changes
  trackLeadTime: async (pr) => {
    const leadTime = pr.mergedAt - pr.firstCommitAt

    await $.Metrics.record('lead_time', {
      duration: leadTime,
      pr: pr.number,
    })
  },

  // Mean Time to Recovery
  trackIncident: async (incident) => {
    if (incident.status === 'resolved') {
      const mttr = incident.resolvedAt - incident.createdAt

      await $.Metrics.record('mttr', {
        duration: mttr,
        incident: incident.id,
      })
    }
  },

  // Change Failure Rate
  trackDeploymentFailure: async (deployment) => {
    if (deployment.status === 'failed' || deployment.rolledBack) {
      await $.Metrics.increment('deployment_failures')
    }
  },
}

// Calculate DORA metrics
on($.Schedule.weekly, async () => {
  const dora = await calculateDORAMetrics()

  await send($.Dashboard.update, {
    dashboard: 'engineering',
    metrics: {
      deployment_frequency: dora.deploymentFrequency,
      lead_time: dora.leadTime,
      mttr: dora.mttr,
      change_failure_rate: dora.changeFailureRate,
      elite: dora.isElite, // Elite team: deploy daily, <1hr lead time, <1hr MTTR, <15% failure
    },
  })
})

Evaluation Dashboards

Engineering Health Dashboard

Comprehensive engineering metrics:

const engineeringDashboard = {
  quality: {
    testCoverage: await $.Metrics.current('test_coverage'),
    codeComplexity: await $.Metrics.average('code_complexity', '30d'),
    technicalDebt: await calculateTechnicalDebt(),
    bugs: await $.Metrics.count('bugs', { status: 'open' }),
  },

  performance: {
    p50Latency: await $.Metrics.percentile('api_latency', 50),
    p95Latency: await $.Metrics.percentile('api_latency', 95),
    p99Latency: await $.Metrics.percentile('api_latency', 99),
    errorRate: await $.Metrics.rate('errors', '24h'),
    uptime: await $.Metrics.uptime('30d'),
  },

  velocity: {
    deploymentsPerDay: await $.Metrics.rate('deployments', '7d'),
    leadTime: await $.Metrics.median('lead_time', '30d'),
    cycleTime: await $.Metrics.median('cycle_time', '30d'),
    throughput: await $.Metrics.count('prs_merged', '7d'),
  },

  security: {
    vulnerabilities: await $.Metrics.count('vulnerabilities'),
    criticalVulns: await $.Metrics.count('vulnerabilities', { severity: 'critical' }),
    daysToRemediate: await $.Metrics.average('remediation_time'),
  },
}

Business Health Dashboard

Business outcome metrics:

const businessDashboard = {
  growth: {
    mrr: await $.Metrics.current('mrr'),
    arr: await $.Metrics.current('arr'),
    growth: await $.Metrics.growth('mrr', '30d'),
    newCustomers: await $.Metrics.count('customers', { period: '30d', status: 'new' }),
  },

  retention: {
    churn: await $.Metrics.rate('churn', '30d'),
    retention: await $.Metrics.rate('retention', '30d'),
    nps: await $.Metrics.average('nps'),
    csat: await $.Metrics.average('csat'),
  },

  product: {
    dau: await $.Metrics.count('active_users', '1d'),
    mau: await $.Metrics.count('active_users', '30d'),
    engagement: await $.Metrics.average('engagement_score'),
    activation: await $.Metrics.rate('activation'),
  },

  economics: {
    ltv: await $.Metrics.average('customer_ltv'),
    cac: await $.Metrics.average('customer_cac'),
    ltvCacRatio: await $.Metrics.ratio('ltv', 'cac'),
    payback: await $.Metrics.median('cac_payback_months'),
  },
}

Automated Quality Gates

Block deployments that don't meet standards:

// Quality gate checks
const qualityGates = {
  preDeployment: async (deployment) => {
    const checks = await Promise.all([
      // Test coverage
      checkTestCoverage({ minimum: 80 }),

      // No critical bugs
      checkOpenBugs({ severity: ['critical', 'high'], max: 0 }),

      // Performance benchmarks
      checkPerformance({ p95Threshold: 200 }),

      // Security scan
      checkSecurity({ allowedSeverities: ['low', 'medium'] }),

      // Code quality
      checkCodeQuality({ minimumScore: 70 }),
    ])

    const passed = checks.every((c) => c.passed)

    if (!passed) {
      const failures = checks.filter((c) => !c.passed)

      await send($.Alert.send, {
        type: 'quality-gate-failed',
        deployment: deployment.id,
        failures,
      })

      // Block deployment
      return { allowed: false, failures }
    }

    return { allowed: true }
  },
}

// Apply quality gates
on($.Deployment.requested, async (deployment, $) => {
  const result = await qualityGates.preDeployment(deployment)

  if (!result.allowed) {
    await db.update($.Deployment, deployment.id, {
      status: 'blocked',
      blockReason: 'quality-gates-failed',
      failures: result.failures,
    })
  } else {
    await send($.Deployment.approved, deployment)
  }
})

Best Practices

Do's

  1. Automate evaluation - Continuous, not manual
  2. Track trends - Not just snapshots
  3. Set clear thresholds - Know what's acceptable
  4. Act on insights - Metrics without action are waste
  5. Balance dimensions - Quality, speed, and cost
  6. Celebrate wins - Recognize improvements

Don'ts

  1. Don't track vanity metrics - Focus on actionable data
  2. Don't ignore context - Metrics need interpretation
  3. Don't optimize locally - Consider system-wide impact
  4. Don't punish with metrics - Use for learning
  5. Don't set too many metrics - Focus on key indicators

CLI Tools

# Evaluate code quality
do evaluate quality

# Run performance benchmarks
do evaluate performance

# Security scan
do evaluate security

# Business metrics
do evaluate business --period 30d

# Team velocity
do evaluate velocity --dora

# Generate full report
do evaluate report --comprehensive

Next Steps


Evaluation Tip: You improve what you measure. Choose metrics that drive the behavior you want.