UNPKG

claude-flow-novice

Version:

Claude Flow Novice - Advanced orchestration platform for multi-agent AI workflows with CFN Loop architecture Includes Local RuVector Accelerator and all CFN skills for complete functionality.

237 lines (207 loc) 6.2 kB
/** * CFN Loop Validation Framework * Multi-layer validation system for CFN Loop outputs */ export interface ValidationRule { name: string; description: string; validate: (input: any) => ValidationResult; } export interface ValidationResult { passed: boolean; score: number; // 0-100 errors: string[]; warnings: string[]; metadata?: Record<string, any>; } export interface ValidationLayer { name: string; rules: ValidationRule[]; weight: number; // Weight for overall score calculation } export interface ValidationReport { overallScore: number; passed: boolean; layers: LayerResult[]; summary: { totalRules: number; passedRules: number; failedRules: number; warnings: number; }; } export interface LayerResult { name: string; score: number; passed: boolean; ruleResults: ValidationResult[]; } /** * Validation Framework Class */ export class ValidationFramework { private layers: ValidationLayer[] = []; /** * Add validation layer */ addLayer(layer: ValidationLayer): void { this.layers.push(layer); } /** * Validate input against all layers */ async validate(input: any): Promise<ValidationReport> { const layerResults: LayerResult[] = []; let totalWeightedScore = 0; let totalWeight = 0; let totalRules = 0; let passedRules = 0; let warnings = 0; for (const layer of this.layers) { const ruleResults: ValidationResult[] = []; let layerScore = 0; for (const rule of layer.rules) { const result = rule.validate(input); ruleResults.push(result); totalRules++; if (result.passed) { passedRules++; layerScore += result.score; } warnings += result.warnings.length; } // Calculate average score for layer const avgScore = layer.rules.length > 0 ? layerScore / layer.rules.length : 0; const layerResult: LayerResult = { name: layer.name, score: avgScore, passed: avgScore >= 70, // 70% threshold ruleResults }; layerResults.push(layerResult); // Add to weighted total totalWeightedScore += avgScore * layer.weight; totalWeight += layer.weight; } // Calculate overall score const overallScore = totalWeight > 0 ? totalWeightedScore / totalWeight : 0; const passed = overallScore >= 80; // 80% overall threshold return { overallScore, passed, layers: layerResults, summary: { totalRules, passedRules, failedRules: totalRules - passedRules, warnings } }; } /** * Get all layers */ getLayers(): ValidationLayer[] { return [...this.layers]; } /** * Clear all layers */ clear(): void { this.layers = []; } } /** * Common validation rules */ export const CommonRules = { /** * Check if deliverables exist */ hasDeliverables: (): ValidationRule => ({ name: 'has-deliverables', description: 'Validates that deliverables are present', validate: (input: any): ValidationResult => { const hasDeliverables = input.deliverables && Array.isArray(input.deliverables) && input.deliverables.length > 0; return { passed: hasDeliverables, score: hasDeliverables ? 100 : 0, errors: hasDeliverables ? [] : ['No deliverables found'], warnings: [] }; } }), /** * Check if confidence threshold is met */ meetsConfidenceThreshold: (threshold: number = 0.8): ValidationRule => ({ name: 'confidence-threshold', description: `Validates confidence meets ${threshold * 100}% threshold`, validate: (input: any): ValidationResult => { const confidence = input.confidence || 0; const passed = confidence >= threshold; return { passed, score: passed ? 100 : (confidence / threshold) * 100, errors: passed ? [] : [`Confidence ${confidence} below threshold ${threshold}`], warnings: confidence < 0.9 && confidence >= threshold ? [`Confidence ${confidence} is close to threshold`] : [] }; } }), /** * Check if test results meet pass rate */ meetsTestPassRate: (threshold: number = 0.95): ValidationRule => ({ name: 'test-pass-rate', description: `Validates test pass rate meets ${threshold * 100}% threshold`, validate: (input: any): ValidationResult => { const testResults = input.testResults; if (!testResults) { return { passed: false, score: 0, errors: ['No test results provided'], warnings: [] }; } const passRate = testResults.passRate || 0; const passed = passRate >= threshold; return { passed, score: passRate * 100, errors: passed ? [] : [`Test pass rate ${passRate} below threshold ${threshold}`], warnings: passRate < 0.98 && passRate >= threshold ? [`Test pass rate ${passRate} could be improved`] : [] }; } }), /** * Check for critical blockers */ noCriticalBlockers: (): ValidationRule => ({ name: 'no-critical-blockers', description: 'Validates no critical blockers exist', validate: (input: any): ValidationResult => { const blockers = input.blockers || []; const hasCritical = blockers.some((b: string) => b.toLowerCase().includes('critical') || b.toLowerCase().includes('security') || b.toLowerCase().includes('fatal') ); return { passed: !hasCritical, score: hasCritical ? 0 : 100, errors: hasCritical ? ['Critical blockers detected'] : [], warnings: blockers.length > 0 ? [`Found ${blockers.length} non-critical blockers`] : [] }; } }) }; // Export types export type { ValidationRule, ValidationResult, ValidationLayer, ValidationReport, LayerResult };