agentic-qe 3.3.2 → 3.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/.claude/helpers/statusline-v3.cjs +96 -27
  2. package/README.md +6 -3
  3. package/package.json +1 -1
  4. package/scripts/sync-claude-flow.cjs +99 -0
  5. package/v3/CHANGELOG.md +87 -0
  6. package/v3/README.md +9 -5
  7. package/v3/dist/cli/bundle.js +43386 -37651
  8. package/v3/dist/coordination/consensus/domain-findings.d.ts +202 -0
  9. package/v3/dist/coordination/consensus/domain-findings.d.ts.map +1 -0
  10. package/v3/dist/coordination/consensus/domain-findings.js +66 -0
  11. package/v3/dist/coordination/consensus/domain-findings.js.map +1 -0
  12. package/v3/dist/coordination/consensus/index.d.ts +2 -0
  13. package/v3/dist/coordination/consensus/index.d.ts.map +1 -1
  14. package/v3/dist/coordination/consensus/index.js +4 -0
  15. package/v3/dist/coordination/consensus/index.js.map +1 -1
  16. package/v3/dist/coordination/index.d.ts +1 -0
  17. package/v3/dist/coordination/index.d.ts.map +1 -1
  18. package/v3/dist/coordination/index.js +4 -0
  19. package/v3/dist/coordination/index.js.map +1 -1
  20. package/v3/dist/coordination/mixins/consensus-enabled-domain.d.ts +225 -0
  21. package/v3/dist/coordination/mixins/consensus-enabled-domain.d.ts.map +1 -0
  22. package/v3/dist/coordination/mixins/consensus-enabled-domain.js +466 -0
  23. package/v3/dist/coordination/mixins/consensus-enabled-domain.js.map +1 -0
  24. package/v3/dist/coordination/mixins/index.d.ts +14 -0
  25. package/v3/dist/coordination/mixins/index.d.ts.map +1 -0
  26. package/v3/dist/coordination/mixins/index.js +28 -0
  27. package/v3/dist/coordination/mixins/index.js.map +1 -0
  28. package/v3/dist/coordination/mixins/mincut-aware-domain.d.ts +227 -0
  29. package/v3/dist/coordination/mixins/mincut-aware-domain.d.ts.map +1 -0
  30. package/v3/dist/coordination/mixins/mincut-aware-domain.js +368 -0
  31. package/v3/dist/coordination/mixins/mincut-aware-domain.js.map +1 -0
  32. package/v3/dist/coordination/queen-coordinator.d.ts +10 -0
  33. package/v3/dist/coordination/queen-coordinator.d.ts.map +1 -1
  34. package/v3/dist/coordination/queen-coordinator.js +40 -0
  35. package/v3/dist/coordination/queen-coordinator.js.map +1 -1
  36. package/v3/dist/coordination/task-executor.d.ts +21 -1
  37. package/v3/dist/coordination/task-executor.d.ts.map +1 -1
  38. package/v3/dist/coordination/task-executor.js +222 -5
  39. package/v3/dist/coordination/task-executor.js.map +1 -1
  40. package/v3/dist/domains/chaos-resilience/coordinator.d.ts +92 -0
  41. package/v3/dist/domains/chaos-resilience/coordinator.d.ts.map +1 -1
  42. package/v3/dist/domains/chaos-resilience/coordinator.js +241 -1
  43. package/v3/dist/domains/chaos-resilience/coordinator.js.map +1 -1
  44. package/v3/dist/domains/chaos-resilience/plugin.js +1 -1
  45. package/v3/dist/domains/chaos-resilience/plugin.js.map +1 -1
  46. package/v3/dist/domains/chaos-resilience/services/chaos-engineer.d.ts +29 -2
  47. package/v3/dist/domains/chaos-resilience/services/chaos-engineer.d.ts.map +1 -1
  48. package/v3/dist/domains/chaos-resilience/services/chaos-engineer.js +62 -3
  49. package/v3/dist/domains/chaos-resilience/services/chaos-engineer.js.map +1 -1
  50. package/v3/dist/domains/code-intelligence/coordinator.d.ts +112 -0
  51. package/v3/dist/domains/code-intelligence/coordinator.d.ts.map +1 -1
  52. package/v3/dist/domains/code-intelligence/coordinator.js +221 -0
  53. package/v3/dist/domains/code-intelligence/coordinator.js.map +1 -1
  54. package/v3/dist/domains/code-intelligence/services/knowledge-graph.d.ts +66 -2
  55. package/v3/dist/domains/code-intelligence/services/knowledge-graph.d.ts.map +1 -1
  56. package/v3/dist/domains/code-intelligence/services/knowledge-graph.js +253 -3
  57. package/v3/dist/domains/code-intelligence/services/knowledge-graph.js.map +1 -1
  58. package/v3/dist/domains/contract-testing/coordinator.d.ts +89 -1
  59. package/v3/dist/domains/contract-testing/coordinator.d.ts.map +1 -1
  60. package/v3/dist/domains/contract-testing/coordinator.js +222 -1
  61. package/v3/dist/domains/contract-testing/coordinator.js.map +1 -1
  62. package/v3/dist/domains/contract-testing/interfaces.d.ts +29 -1
  63. package/v3/dist/domains/contract-testing/interfaces.d.ts.map +1 -1
  64. package/v3/dist/domains/contract-testing/plugin.js +1 -1
  65. package/v3/dist/domains/contract-testing/plugin.js.map +1 -1
  66. package/v3/dist/domains/contract-testing/services/contract-validator.d.ts +29 -2
  67. package/v3/dist/domains/contract-testing/services/contract-validator.d.ts.map +1 -1
  68. package/v3/dist/domains/contract-testing/services/contract-validator.js +58 -3
  69. package/v3/dist/domains/contract-testing/services/contract-validator.js.map +1 -1
  70. package/v3/dist/domains/coverage-analysis/coordinator.d.ts +95 -2
  71. package/v3/dist/domains/coverage-analysis/coordinator.d.ts.map +1 -1
  72. package/v3/dist/domains/coverage-analysis/coordinator.js +274 -6
  73. package/v3/dist/domains/coverage-analysis/coordinator.js.map +1 -1
  74. package/v3/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts +119 -3
  75. package/v3/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts.map +1 -1
  76. package/v3/dist/domains/coverage-analysis/services/coverage-analyzer.js +267 -5
  77. package/v3/dist/domains/coverage-analysis/services/coverage-analyzer.js.map +1 -1
  78. package/v3/dist/domains/coverage-analysis/services/gap-detector.d.ts +111 -2
  79. package/v3/dist/domains/coverage-analysis/services/gap-detector.d.ts.map +1 -1
  80. package/v3/dist/domains/coverage-analysis/services/gap-detector.js +231 -3
  81. package/v3/dist/domains/coverage-analysis/services/gap-detector.js.map +1 -1
  82. package/v3/dist/domains/defect-intelligence/coordinator.d.ts +80 -1
  83. package/v3/dist/domains/defect-intelligence/coordinator.d.ts.map +1 -1
  84. package/v3/dist/domains/defect-intelligence/coordinator.js +262 -7
  85. package/v3/dist/domains/defect-intelligence/coordinator.js.map +1 -1
  86. package/v3/dist/domains/defect-intelligence/interfaces.d.ts +17 -0
  87. package/v3/dist/domains/defect-intelligence/interfaces.d.ts.map +1 -1
  88. package/v3/dist/domains/defect-intelligence/services/defect-predictor.d.ts +91 -2
  89. package/v3/dist/domains/defect-intelligence/services/defect-predictor.d.ts.map +1 -1
  90. package/v3/dist/domains/defect-intelligence/services/defect-predictor.js +274 -7
  91. package/v3/dist/domains/defect-intelligence/services/defect-predictor.js.map +1 -1
  92. package/v3/dist/domains/defect-intelligence/services/root-cause-analyzer.d.ts +79 -2
  93. package/v3/dist/domains/defect-intelligence/services/root-cause-analyzer.d.ts.map +1 -1
  94. package/v3/dist/domains/defect-intelligence/services/root-cause-analyzer.js +259 -3
  95. package/v3/dist/domains/defect-intelligence/services/root-cause-analyzer.js.map +1 -1
  96. package/v3/dist/domains/domain-interface.d.ts +155 -0
  97. package/v3/dist/domains/domain-interface.d.ts.map +1 -1
  98. package/v3/dist/domains/domain-interface.js +140 -0
  99. package/v3/dist/domains/domain-interface.js.map +1 -1
  100. package/v3/dist/domains/learning-optimization/coordinator.d.ts +88 -0
  101. package/v3/dist/domains/learning-optimization/coordinator.d.ts.map +1 -1
  102. package/v3/dist/domains/learning-optimization/coordinator.js +227 -1
  103. package/v3/dist/domains/learning-optimization/coordinator.js.map +1 -1
  104. package/v3/dist/domains/learning-optimization/index.d.ts +1 -1
  105. package/v3/dist/domains/learning-optimization/index.d.ts.map +1 -1
  106. package/v3/dist/domains/learning-optimization/index.js.map +1 -1
  107. package/v3/dist/domains/learning-optimization/interfaces.d.ts +4 -0
  108. package/v3/dist/domains/learning-optimization/interfaces.d.ts.map +1 -1
  109. package/v3/dist/domains/learning-optimization/plugin.js +1 -1
  110. package/v3/dist/domains/learning-optimization/plugin.js.map +1 -1
  111. package/v3/dist/domains/learning-optimization/services/learning-coordinator.d.ts +54 -2
  112. package/v3/dist/domains/learning-optimization/services/learning-coordinator.d.ts.map +1 -1
  113. package/v3/dist/domains/learning-optimization/services/learning-coordinator.js +90 -3
  114. package/v3/dist/domains/learning-optimization/services/learning-coordinator.js.map +1 -1
  115. package/v3/dist/domains/quality-assessment/coordinator.d.ts +104 -0
  116. package/v3/dist/domains/quality-assessment/coordinator.d.ts.map +1 -1
  117. package/v3/dist/domains/quality-assessment/coordinator.js +354 -6
  118. package/v3/dist/domains/quality-assessment/coordinator.js.map +1 -1
  119. package/v3/dist/domains/quality-assessment/interfaces.d.ts +22 -0
  120. package/v3/dist/domains/quality-assessment/interfaces.d.ts.map +1 -1
  121. package/v3/dist/domains/quality-assessment/services/deployment-advisor.d.ts +61 -2
  122. package/v3/dist/domains/quality-assessment/services/deployment-advisor.d.ts.map +1 -1
  123. package/v3/dist/domains/quality-assessment/services/deployment-advisor.js +213 -5
  124. package/v3/dist/domains/quality-assessment/services/deployment-advisor.js.map +1 -1
  125. package/v3/dist/domains/quality-assessment/services/quality-analyzer.d.ts +59 -4
  126. package/v3/dist/domains/quality-assessment/services/quality-analyzer.d.ts.map +1 -1
  127. package/v3/dist/domains/quality-assessment/services/quality-analyzer.js +195 -3
  128. package/v3/dist/domains/quality-assessment/services/quality-analyzer.js.map +1 -1
  129. package/v3/dist/domains/requirements-validation/coordinator.d.ts +78 -0
  130. package/v3/dist/domains/requirements-validation/coordinator.d.ts.map +1 -1
  131. package/v3/dist/domains/requirements-validation/coordinator.js +189 -0
  132. package/v3/dist/domains/requirements-validation/coordinator.js.map +1 -1
  133. package/v3/dist/domains/requirements-validation/interfaces.d.ts +4 -0
  134. package/v3/dist/domains/requirements-validation/interfaces.d.ts.map +1 -1
  135. package/v3/dist/domains/requirements-validation/services/requirements-validator.d.ts +106 -2
  136. package/v3/dist/domains/requirements-validation/services/requirements-validator.d.ts.map +1 -1
  137. package/v3/dist/domains/requirements-validation/services/requirements-validator.js +263 -3
  138. package/v3/dist/domains/requirements-validation/services/requirements-validator.js.map +1 -1
  139. package/v3/dist/domains/security-compliance/coordinator.d.ts +56 -1
  140. package/v3/dist/domains/security-compliance/coordinator.d.ts.map +1 -1
  141. package/v3/dist/domains/security-compliance/coordinator.js +241 -17
  142. package/v3/dist/domains/security-compliance/coordinator.js.map +1 -1
  143. package/v3/dist/domains/security-compliance/interfaces.d.ts +2 -0
  144. package/v3/dist/domains/security-compliance/interfaces.d.ts.map +1 -1
  145. package/v3/dist/domains/security-compliance/services/security-scanner.d.ts +33 -2
  146. package/v3/dist/domains/security-compliance/services/security-scanner.d.ts.map +1 -1
  147. package/v3/dist/domains/security-compliance/services/security-scanner.js +107 -3
  148. package/v3/dist/domains/security-compliance/services/security-scanner.js.map +1 -1
  149. package/v3/dist/domains/test-execution/coordinator.d.ts +89 -0
  150. package/v3/dist/domains/test-execution/coordinator.d.ts.map +1 -1
  151. package/v3/dist/domains/test-execution/coordinator.js +259 -2
  152. package/v3/dist/domains/test-execution/coordinator.js.map +1 -1
  153. package/v3/dist/domains/test-execution/services/test-executor.d.ts +30 -2
  154. package/v3/dist/domains/test-execution/services/test-executor.d.ts.map +1 -1
  155. package/v3/dist/domains/test-execution/services/test-executor.js +64 -3
  156. package/v3/dist/domains/test-execution/services/test-executor.js.map +1 -1
  157. package/v3/dist/domains/test-generation/coordinator.d.ts +97 -0
  158. package/v3/dist/domains/test-generation/coordinator.d.ts.map +1 -1
  159. package/v3/dist/domains/test-generation/coordinator.js +237 -0
  160. package/v3/dist/domains/test-generation/coordinator.js.map +1 -1
  161. package/v3/dist/domains/test-generation/interfaces.d.ts +2 -0
  162. package/v3/dist/domains/test-generation/interfaces.d.ts.map +1 -1
  163. package/v3/dist/domains/test-generation/services/test-generator.d.ts +32 -0
  164. package/v3/dist/domains/test-generation/services/test-generator.d.ts.map +1 -1
  165. package/v3/dist/domains/test-generation/services/test-generator.js +158 -3
  166. package/v3/dist/domains/test-generation/services/test-generator.js.map +1 -1
  167. package/v3/dist/domains/visual-accessibility/coordinator.d.ts +77 -0
  168. package/v3/dist/domains/visual-accessibility/coordinator.d.ts.map +1 -1
  169. package/v3/dist/domains/visual-accessibility/coordinator.js +210 -2
  170. package/v3/dist/domains/visual-accessibility/coordinator.js.map +1 -1
  171. package/v3/dist/domains/visual-accessibility/plugin.d.ts.map +1 -1
  172. package/v3/dist/domains/visual-accessibility/plugin.js +3 -3
  173. package/v3/dist/domains/visual-accessibility/plugin.js.map +1 -1
  174. package/v3/dist/domains/visual-accessibility/services/visual-tester.d.ts +47 -2
  175. package/v3/dist/domains/visual-accessibility/services/visual-tester.d.ts.map +1 -1
  176. package/v3/dist/domains/visual-accessibility/services/visual-tester.js +87 -3
  177. package/v3/dist/domains/visual-accessibility/services/visual-tester.js.map +1 -1
  178. package/v3/dist/learning/experience-capture-middleware.d.ts +119 -0
  179. package/v3/dist/learning/experience-capture-middleware.d.ts.map +1 -0
  180. package/v3/dist/learning/experience-capture-middleware.js +416 -0
  181. package/v3/dist/learning/experience-capture-middleware.js.map +1 -0
  182. package/v3/dist/mcp/bundle.js +60723 -54421
  183. package/v3/dist/mcp/handlers/domain-handlers.d.ts +12 -13
  184. package/v3/dist/mcp/handlers/domain-handlers.d.ts.map +1 -1
  185. package/v3/dist/mcp/handlers/index.d.ts +1 -1
  186. package/v3/dist/mcp/handlers/index.d.ts.map +1 -1
  187. package/v3/dist/mcp/handlers/index.js +2 -2
  188. package/v3/dist/mcp/handlers/index.js.map +1 -1
  189. package/v3/dist/mcp/handlers/wrapped-domain-handlers.d.ts +30 -0
  190. package/v3/dist/mcp/handlers/wrapped-domain-handlers.d.ts.map +1 -0
  191. package/v3/dist/mcp/handlers/wrapped-domain-handlers.js +75 -0
  192. package/v3/dist/mcp/handlers/wrapped-domain-handlers.js.map +1 -0
  193. package/v3/dist/mcp/tools/chaos-resilience/inject.js +1 -1
  194. package/v3/dist/mcp/tools/chaos-resilience/inject.js.map +1 -1
  195. package/v3/dist/mcp/tools/contract-testing/validate.js +1 -1
  196. package/v3/dist/mcp/tools/contract-testing/validate.js.map +1 -1
  197. package/v3/dist/mcp/tools/learning-optimization/optimize.js +1 -1
  198. package/v3/dist/mcp/tools/learning-optimization/optimize.js.map +1 -1
  199. package/v3/dist/mcp/tools/visual-accessibility/index.js +2 -2
  200. package/v3/dist/mcp/tools/visual-accessibility/index.js.map +1 -1
  201. package/v3/dist/routing/qe-agent-registry.d.ts +1 -1
  202. package/v3/dist/routing/qe-agent-registry.d.ts.map +1 -1
  203. package/v3/dist/routing/qe-agent-registry.js +20 -1
  204. package/v3/dist/routing/qe-agent-registry.js.map +1 -1
  205. package/v3/dist/sync/claude-flow-bridge.d.ts +63 -0
  206. package/v3/dist/sync/claude-flow-bridge.d.ts.map +1 -0
  207. package/v3/dist/sync/claude-flow-bridge.js +320 -0
  208. package/v3/dist/sync/claude-flow-bridge.js.map +1 -0
  209. package/v3/package.json +1 -1
@@ -6,6 +6,10 @@
6
6
  * - ActorCritic RL: Quality gate threshold tuning
7
7
  * - QESONA: Quality pattern learning
8
8
  * - QEFlashAttention: Similarity computations for quality reports
9
+ *
10
+ * V3 Integrations (ADR-047, CONSENSUS-MIXIN-001):
11
+ * - MinCutAwareDomainMixin: Topology-aware routing and health monitoring
12
+ * - ConsensusEnabledMixin: Multi-model consensus for high-stakes quality decisions
9
13
  */
10
14
  import { v4 as uuidv4 } from 'uuid';
11
15
  import { ok, err } from '../../shared/types';
@@ -19,6 +23,11 @@ import { createPersistentSONAEngine } from '../../integrations/ruvector/sona-per
19
23
  import { createQEFlashAttention, } from '../../integrations/ruvector/wrappers';
20
24
  // V3 Integration: ClaimVerifier for report verification (Phase 4)
21
25
  import { createClaimVerifierService, } from '../../agents/claim-verifier/index.js';
26
+ // V3 Integration: MinCut Awareness (ADR-047)
27
+ import { createMinCutAwareMixin, } from '../../coordination/mixins/mincut-aware-domain';
28
+ // V3 Integration: Consensus Verification (CONSENSUS-MIXIN-001)
29
+ import { createConsensusEnabledMixin, } from '../../coordination/mixins/consensus-enabled-domain';
30
+ import { createDomainFinding, } from '../../coordination/consensus/domain-findings';
22
31
  const DEFAULT_CONFIG = {
23
32
  maxConcurrentWorkflows: 5,
24
33
  defaultTimeout: 60000,
@@ -29,6 +38,14 @@ const DEFAULT_CONFIG = {
29
38
  enableFlashAttention: true,
30
39
  // V3: ClaimVerifier enabled by default
31
40
  enableClaimVerification: true,
41
+ // V3: MinCut Awareness enabled by default
42
+ enableMinCutAwareness: true,
43
+ topologyHealthThreshold: 0.5,
44
+ // V3: Consensus enabled by default for quality decisions
45
+ enableConsensus: true,
46
+ consensusThreshold: 0.7,
47
+ consensusMinModels: 2,
48
+ borderlineMargin: 0.05, // 5% margin for borderline detection
32
49
  };
33
50
  /**
34
51
  * Quality Assessment Coordinator
@@ -38,6 +55,10 @@ const DEFAULT_CONFIG = {
38
55
  * - ActorCritic RL: Quality gate threshold tuning
39
56
  * - QESONA: Quality pattern learning
40
57
  * - QEFlashAttention: Similarity computations for quality reports
58
+ *
59
+ * V3 Integrations (ADR-047, CONSENSUS-MIXIN-001):
60
+ * - MinCutAwareDomainMixin: Topology-aware routing and health monitoring
61
+ * - ConsensusEnabledMixin: Multi-model consensus for high-stakes quality decisions
41
62
  */
42
63
  export class QualityAssessmentCoordinator {
43
64
  eventBus;
@@ -55,6 +76,10 @@ export class QualityAssessmentCoordinator {
55
76
  flashAttention;
56
77
  // V3 Integration: ClaimVerifier for report verification
57
78
  claimVerifier;
79
+ // V3 Integration: MinCut Awareness (ADR-047)
80
+ minCutMixin;
81
+ // V3 Integration: Consensus Verification (CONSENSUS-MIXIN-001)
82
+ consensusMixin;
58
83
  // Quality domain name for SONA
59
84
  domain = 'quality-assessment';
60
85
  // Cache of recent dream insights for quality assessment enhancement
@@ -67,10 +92,36 @@ export class QualityAssessmentCoordinator {
67
92
  this.qualityGate = new QualityGateService(memory);
68
93
  this.qualityAnalyzer = new QualityAnalyzerService(memory);
69
94
  this.deploymentAdvisor = new DeploymentAdvisorService(memory);
95
+ // V3 Integration: Initialize MinCut Awareness Mixin (ADR-047)
96
+ this.minCutMixin = createMinCutAwareMixin(this.domain, {
97
+ enableMinCutAwareness: this.config.enableMinCutAwareness,
98
+ topologyHealthThreshold: this.config.topologyHealthThreshold,
99
+ pauseOnCriticalTopology: false, // Quality assessment continues even in degraded topology
100
+ monitoredDomains: [], // Monitor all domains
101
+ });
102
+ // V3 Integration: Initialize Consensus Mixin (CONSENSUS-MIXIN-001)
103
+ // Configured for quality-assessment specific finding types
104
+ this.consensusMixin = createConsensusEnabledMixin({
105
+ enableConsensus: this.config.enableConsensus,
106
+ consensusThreshold: this.config.consensusThreshold,
107
+ minModels: this.config.consensusMinModels,
108
+ // Quality-specific finding types that require consensus
109
+ verifyFindingTypes: [
110
+ 'gate-verdict', // Pass/fail quality gate decisions
111
+ 'tech-debt-classification', // Critical vs acceptable tech debt
112
+ 'release-readiness', // Go/no-go deployment decisions
113
+ 'risk-scoring', // High-risk deployment detection
114
+ ],
115
+ strategy: 'weighted',
116
+ modelTimeout: 60000,
117
+ verifySeverities: ['critical', 'high'],
118
+ enableLogging: false,
119
+ });
70
120
  }
71
121
  /**
72
122
  * Initialize the coordinator
73
123
  * Sets up Ruvector integrations: ActorCritic, QESONA, QEFlashAttention
124
+ * V3: Also initializes MinCut awareness and Consensus verification
74
125
  */
75
126
  async initialize() {
76
127
  if (this.initialized)
@@ -96,6 +147,10 @@ export class QualityAssessmentCoordinator {
96
147
  if (this.config.enableClaimVerification) {
97
148
  await this.initializeClaimVerifier();
98
149
  }
150
+ // V3 Integration: Initialize Consensus Engine (CONSENSUS-MIXIN-001)
151
+ if (this.config.enableConsensus) {
152
+ await this.initializeConsensus();
153
+ }
99
154
  this.initialized = true;
100
155
  }
101
156
  catch (error) {
@@ -103,8 +158,25 @@ export class QualityAssessmentCoordinator {
103
158
  throw new Error(errorMsg);
104
159
  }
105
160
  }
161
+ /**
162
+ * V3 Integration: Initialize the consensus engine for multi-model verification
163
+ * @private
164
+ */
165
+ async initializeConsensus() {
166
+ try {
167
+ // The mixin handles provider registration and engine creation
168
+ await this.consensusMixin.initializeConsensus();
169
+ console.log('[quality-assessment] Consensus engine initialized for quality gate decisions');
170
+ }
171
+ catch (error) {
172
+ // Log and continue - consensus is enhancement, not critical
173
+ console.warn('[quality-assessment] Failed to initialize consensus engine:', error);
174
+ console.warn('[quality-assessment] Continuing without multi-model consensus verification');
175
+ }
176
+ }
106
177
  /**
107
178
  * Dispose and cleanup
179
+ * V3: Also disposes MinCut mixin and Consensus engine
108
180
  */
109
181
  async dispose() {
110
182
  await this.saveWorkflowState();
@@ -115,6 +187,10 @@ export class QualityAssessmentCoordinator {
115
187
  await this.qesona.close();
116
188
  this.qesona = undefined;
117
189
  }
190
+ // V3 Integration: Dispose MinCut mixin (ADR-047)
191
+ this.minCutMixin.dispose();
192
+ // V3 Integration: Dispose Consensus engine (CONSENSUS-MIXIN-001)
193
+ await this.consensusMixin.disposeConsensus();
118
194
  this.workflows.clear();
119
195
  this.initialized = false;
120
196
  }
@@ -125,16 +201,90 @@ export class QualityAssessmentCoordinator {
125
201
  return Array.from(this.workflows.values()).filter((w) => w.status === 'running' || w.status === 'pending');
126
202
  }
127
203
  // ============================================================================
204
+ // V3 Integration: MinCut Awareness (ADR-047)
205
+ // ============================================================================
206
+ /**
207
+ * Set the MinCut bridge for topology awareness
208
+ * Uses dependency injection pattern for testability
209
+ *
210
+ * @param bridge - The QueenMinCutBridge instance
211
+ */
212
+ setMinCutBridge(bridge) {
213
+ this.minCutMixin.setMinCutBridge(bridge);
214
+ }
215
+ /**
216
+ * Check if the overall topology is healthy
217
+ * Returns true if status is not 'critical'
218
+ */
219
+ isTopologyHealthy() {
220
+ return this.minCutMixin.isTopologyHealthy();
221
+ }
222
+ /**
223
+ * Get domains that are healthy for routing
224
+ * Filters out weak domains from routing candidates
225
+ */
226
+ getHealthyRoutingDomains() {
227
+ return this.minCutMixin.getHealthyRoutingDomains();
228
+ }
229
+ /**
230
+ * Check if this domain itself is a weak point in the topology
231
+ */
232
+ isDomainWeakPoint() {
233
+ return this.minCutMixin.isDomainWeakPoint();
234
+ }
235
+ /**
236
+ * Get weak vertices belonging to this domain
237
+ * Per ADR-047: Identifies agents that are single points of failure
238
+ */
239
+ getDomainWeakVertices() {
240
+ return this.minCutMixin.getDomainWeakVertices();
241
+ }
242
+ /**
243
+ * Get topology-aware routing for cross-domain coordination
244
+ * Per ADR-047: Routes to healthy domains, avoiding weak points
245
+ */
246
+ getTopologyBasedRouting(targetDomains) {
247
+ return this.minCutMixin.getTopologyBasedRouting(targetDomains);
248
+ }
249
+ // ============================================================================
250
+ // V3 Integration: Consensus Verification (CONSENSUS-MIXIN-001)
251
+ // ============================================================================
252
+ /**
253
+ * Get consensus statistics
254
+ */
255
+ getConsensusStats() {
256
+ return this.consensusMixin.getConsensusStats();
257
+ }
258
+ /**
259
+ * Check if consensus verification is available
260
+ */
261
+ isConsensusAvailable() {
262
+ return this.consensusMixin.isConsensusAvailable();
263
+ }
264
+ // ============================================================================
128
265
  // QualityAssessmentAPI Implementation
129
266
  // ============================================================================
130
267
  /**
131
268
  * Evaluate a quality gate
132
269
  * Uses Actor-Critic RL for intelligent threshold tuning when enabled
270
+ * V3: Uses consensus verification for borderline gate decisions
133
271
  */
134
272
  async evaluateGate(request) {
135
273
  const workflowId = uuidv4();
136
274
  try {
137
275
  this.startWorkflow(workflowId, 'gate-evaluation');
276
+ // Self-healing: Check if operations should be paused due to critical topology
277
+ if (this.minCutMixin.shouldPauseOperations()) {
278
+ console.warn('[quality-assessment] Quality gate evaluation paused: topology is in critical state');
279
+ this.failWorkflow(workflowId, 'Topology is in critical state');
280
+ return err(new Error('Quality gate evaluation paused: topology is in critical state'));
281
+ }
282
+ // V3 Integration: Check topology health before proceeding (ADR-047)
283
+ // Apply stricter thresholds when topology is degraded
284
+ if (!this.isTopologyHealthy()) {
285
+ console.warn('[quality-assessment] Topology degraded - applying stricter thresholds for quality gate');
286
+ // Continue evaluation but with heightened caution - quality gates are critical
287
+ }
138
288
  // Spawn quality gate agent if available
139
289
  const agentResult = await this.spawnQualityGateAgent(workflowId, request);
140
290
  if (agentResult.success) {
@@ -161,22 +311,31 @@ export class QualityAssessmentCoordinator {
161
311
  this.failWorkflow(workflowId, 'Evaluation failed');
162
312
  return result;
163
313
  }
314
+ // V3 Integration: Use consensus for borderline cases (CONSENSUS-MIXIN-001)
315
+ // Borderline cases are pass/fail decisions where metrics are close to thresholds
316
+ let finalResult = result.value;
317
+ if (this.config.enableConsensus && this.isBorderlineGateResult(request.metrics, request.thresholds, result.value)) {
318
+ const consensusResult = await this.verifyGateVerdictWithConsensus(effectiveRequest, result.value);
319
+ if (consensusResult) {
320
+ finalResult = consensusResult;
321
+ }
322
+ }
164
323
  // Success path
165
324
  this.completeWorkflow(workflowId);
166
325
  // Store quality pattern in SONA if enabled
167
326
  if (this.config.enableSONAPatternLearning && this.qesona) {
168
- await this.storeQualityPattern(effectiveRequest, result.value);
327
+ await this.storeQualityPattern(effectiveRequest, finalResult);
169
328
  }
170
329
  // Train Actor-Critic with the result
171
330
  if (this.config.enableRLThresholdTuning && this.actorCritic) {
172
- await this.trainActorCritic(effectiveRequest, result.value);
331
+ await this.trainActorCritic(effectiveRequest, finalResult);
173
332
  }
174
333
  // Publish event
175
334
  if (this.config.publishEvents) {
176
- await this.publishQualityGateEvaluated(result.value);
335
+ await this.publishQualityGateEvaluated(finalResult);
177
336
  }
178
337
  // V3: Verify claims before returning (Phase 4)
179
- const verifiedResult = await this.verifyGateResultClaims(result.value);
338
+ const verifiedResult = await this.verifyGateResultClaims(finalResult);
180
339
  return ok(verifiedResult);
181
340
  }
182
341
  catch (error) {
@@ -184,14 +343,118 @@ export class QualityAssessmentCoordinator {
184
343
  return err(error instanceof Error ? error : new Error(String(error)));
185
344
  }
186
345
  }
346
+ /**
347
+ * V3 Integration: Check if a gate result is a borderline case
348
+ * A borderline case is when any metric is within the configured margin of its threshold
349
+ *
350
+ * @param metrics - The quality metrics being evaluated
351
+ * @param thresholds - The threshold configuration
352
+ * @param result - The gate result
353
+ * @returns true if this is a borderline case requiring consensus
354
+ */
355
+ isBorderlineGateResult(metrics, thresholds, result) {
356
+ const margin = this.config.borderlineMargin;
357
+ // Check each metric against its threshold
358
+ const metricsToCheck = [
359
+ { metricKey: 'coverage', thresholdKey: 'coverage', isMin: true },
360
+ { metricKey: 'testsPassing', thresholdKey: 'testsPassing', isMin: true },
361
+ { metricKey: 'criticalBugs', thresholdKey: 'criticalBugs', isMin: false },
362
+ { metricKey: 'codeSmells', thresholdKey: 'codeSmells', isMin: false },
363
+ { metricKey: 'securityVulnerabilities', thresholdKey: 'securityVulnerabilities', isMin: false },
364
+ { metricKey: 'technicalDebt', thresholdKey: 'technicalDebt', isMin: false },
365
+ { metricKey: 'duplications', thresholdKey: 'duplications', isMin: false },
366
+ ];
367
+ for (const { metricKey, thresholdKey, isMin } of metricsToCheck) {
368
+ const metricValue = metrics[metricKey];
369
+ const thresholdConfig = thresholds[thresholdKey];
370
+ if (thresholdConfig === undefined)
371
+ continue;
372
+ const threshold = isMin
373
+ ? thresholdConfig.min
374
+ : thresholdConfig.max;
375
+ if (threshold === undefined || threshold === 0)
376
+ continue;
377
+ // Calculate relative distance from threshold
378
+ const relativeDistance = Math.abs(metricValue - threshold) / threshold;
379
+ // If any metric is within margin of threshold, it's borderline
380
+ if (relativeDistance < margin) {
381
+ console.log(`[quality-assessment] Borderline detected: ${metricKey}=${metricValue} (threshold=${threshold}, distance=${(relativeDistance * 100).toFixed(1)}%)`);
382
+ return true;
383
+ }
384
+ }
385
+ return false;
386
+ }
387
+ /**
388
+ * V3 Integration: Verify a gate verdict with multi-model consensus
389
+ *
390
+ * @param request - The gate evaluation request
391
+ * @param initialResult - The initial gate result
392
+ * @returns The potentially modified result with consensus verification, or null if consensus unavailable
393
+ */
394
+ async verifyGateVerdictWithConsensus(request, initialResult) {
395
+ // Create a domain finding for the gate verdict
396
+ const finding = createDomainFinding({
397
+ id: `gate-verdict-${uuidv4()}`,
398
+ type: 'gate-verdict',
399
+ confidence: initialResult.overallScore / 100,
400
+ description: `Quality gate '${request.gateName}' verdict: ${initialResult.passed ? 'PASSED' : 'FAILED'} (borderline case)`,
401
+ payload: {
402
+ metrics: request.metrics,
403
+ thresholds: request.thresholds,
404
+ initialResult,
405
+ },
406
+ detectedBy: 'quality-assessment-coordinator',
407
+ severity: initialResult.passed ? 'medium' : 'high',
408
+ });
409
+ // Check if this finding requires consensus
410
+ if (!this.consensusMixin.requiresConsensus(finding)) {
411
+ return null;
412
+ }
413
+ try {
414
+ const consensusResult = await this.consensusMixin.verifyFinding(finding);
415
+ if (!consensusResult.success) {
416
+ console.warn('[quality-assessment] Consensus verification failed:', consensusResult.error);
417
+ return null;
418
+ }
419
+ const consensus = consensusResult.value;
420
+ console.log(`[quality-assessment] Consensus for gate '${request.gateName}': ` +
421
+ `verdict=${consensus.verdict}, confidence=${(consensus.confidence * 100).toFixed(1)}%`);
422
+ // Return result with consensus information
423
+ return {
424
+ ...initialResult,
425
+ // Add consensus metadata (extends GateResult)
426
+ consensusVerified: true,
427
+ consensusConfidence: consensus.confidence,
428
+ consensusVerdict: consensus.verdict,
429
+ };
430
+ }
431
+ catch (error) {
432
+ console.error('[quality-assessment] Consensus verification error:', error);
433
+ return null;
434
+ }
435
+ }
187
436
  /**
188
437
  * Analyze code quality
189
438
  * Uses QEFlashAttention for similarity-based recommendations when enabled
439
+ * V3: Includes topology-aware behavior based on MinCut health
190
440
  */
191
441
  async analyzeQuality(request) {
192
442
  const workflowId = uuidv4();
193
443
  try {
194
444
  this.startWorkflow(workflowId, 'quality-analysis');
445
+ // Self-healing: Check if operations should be paused due to critical topology
446
+ if (this.minCutMixin.shouldPauseOperations()) {
447
+ console.warn('[quality-assessment] Quality analysis paused: topology is in critical state');
448
+ this.failWorkflow(workflowId, 'Topology is in critical state');
449
+ return err(new Error('Quality analysis paused: topology is in critical state'));
450
+ }
451
+ // V3 Integration: Check topology health and adjust behavior (ADR-047)
452
+ const topologyHealthy = this.isTopologyHealthy();
453
+ if (!topologyHealthy) {
454
+ console.warn('[quality-assessment] Topology degraded during quality analysis');
455
+ // Could adjust analysis depth or timeouts in degraded state
456
+ // For now, we proceed but could be extended to reduce analysis scope
457
+ }
195
458
  // Spawn quality analyzer agent
196
459
  const agentResult = await this.spawnQualityAnalyzerAgent(workflowId, request);
197
460
  if (agentResult.success) {
@@ -236,11 +499,22 @@ export class QualityAssessmentCoordinator {
236
499
  }
237
500
  /**
238
501
  * Get deployment recommendation
502
+ * V3: Uses consensus verification for high-risk deployment decisions
239
503
  */
240
504
  async getDeploymentAdvice(request) {
241
505
  const workflowId = uuidv4();
242
506
  try {
243
507
  this.startWorkflow(workflowId, 'deployment-advice');
508
+ // Self-healing: Check if operations should be paused due to critical topology
509
+ if (this.minCutMixin.shouldPauseOperations()) {
510
+ console.warn('[quality-assessment] Deployment advice paused: topology is in critical state');
511
+ this.failWorkflow(workflowId, 'Topology is in critical state');
512
+ return err(new Error('Deployment advice paused: topology is in critical state'));
513
+ }
514
+ // V3 Integration: Check topology health (ADR-047)
515
+ if (!this.isTopologyHealthy()) {
516
+ console.warn('[quality-assessment] Topology degraded during deployment advice generation');
517
+ }
244
518
  // Spawn deployment advisor agent
245
519
  const agentResult = await this.spawnDeploymentAdvisorAgent(workflowId, request);
246
520
  if (agentResult.success) {
@@ -256,19 +530,83 @@ export class QualityAssessmentCoordinator {
256
530
  this.failWorkflow(workflowId, 'Evaluation failed');
257
531
  return result;
258
532
  }
533
+ // V3 Integration: Use consensus for high-risk deployment decisions (CONSENSUS-MIXIN-001)
534
+ let finalAdvice = result.value;
535
+ if (this.config.enableConsensus && this.isHighRiskDeployment(request, result.value)) {
536
+ const consensusAdvice = await this.verifyDeploymentAdviceWithConsensus(request, result.value);
537
+ if (consensusAdvice) {
538
+ finalAdvice = consensusAdvice;
539
+ }
540
+ }
259
541
  // Success path
260
542
  this.completeWorkflow(workflowId);
261
543
  // Publish deployment decision event
262
544
  if (this.config.publishEvents) {
263
- await this.publishDeploymentDecision(result.value, request.releaseCandidate);
545
+ await this.publishDeploymentDecision(finalAdvice, request.releaseCandidate);
264
546
  }
265
- return result;
547
+ return ok(finalAdvice);
266
548
  }
267
549
  catch (error) {
268
550
  this.failWorkflow(workflowId, String(error));
269
551
  return err(error instanceof Error ? error : new Error(String(error)));
270
552
  }
271
553
  }
554
+ /**
555
+ * V3 Integration: Check if a deployment is high-risk
556
+ * High-risk deployments include blocked deployments or low risk tolerance with warnings
557
+ */
558
+ isHighRiskDeployment(request, advice) {
559
+ // Blocked deployments are always high-risk
560
+ if (advice.decision === 'blocked') {
561
+ return true;
562
+ }
563
+ // Warning with low risk tolerance is high-risk
564
+ if (advice.decision === 'warning' && request.riskTolerance === 'low') {
565
+ return true;
566
+ }
567
+ // High risk score (>0.7) with any decision is high-risk
568
+ if (advice.riskScore > 0.7) {
569
+ return true;
570
+ }
571
+ return false;
572
+ }
573
+ /**
574
+ * V3 Integration: Verify deployment advice with multi-model consensus
575
+ */
576
+ async verifyDeploymentAdviceWithConsensus(request, initialAdvice) {
577
+ const finding = createDomainFinding({
578
+ id: `release-readiness-${uuidv4()}`,
579
+ type: 'release-readiness',
580
+ confidence: initialAdvice.confidence,
581
+ description: `Release readiness for '${request.releaseCandidate}': ${initialAdvice.decision} (risk: ${(initialAdvice.riskScore * 100).toFixed(0)}%)`,
582
+ payload: { request, initialAdvice },
583
+ detectedBy: 'quality-assessment-coordinator',
584
+ severity: initialAdvice.decision === 'blocked' ? 'critical' : 'high',
585
+ });
586
+ if (!this.consensusMixin.requiresConsensus(finding)) {
587
+ return null;
588
+ }
589
+ try {
590
+ const consensusResult = await this.consensusMixin.verifyFinding(finding);
591
+ if (!consensusResult.success) {
592
+ console.warn('[quality-assessment] Consensus verification for deployment failed:', consensusResult.error);
593
+ return null;
594
+ }
595
+ const consensus = consensusResult.value;
596
+ console.log(`[quality-assessment] Consensus for deployment '${request.releaseCandidate}': ` +
597
+ `verdict=${consensus.verdict}, confidence=${(consensus.confidence * 100).toFixed(1)}%`);
598
+ return {
599
+ ...initialAdvice,
600
+ consensusVerified: true,
601
+ consensusConfidence: consensus.confidence,
602
+ consensusVerdict: consensus.verdict,
603
+ };
604
+ }
605
+ catch (error) {
606
+ console.error('[quality-assessment] Consensus verification error:', error);
607
+ return null;
608
+ }
609
+ }
272
610
  /**
273
611
  * Analyze code complexity
274
612
  */
@@ -276,6 +614,16 @@ export class QualityAssessmentCoordinator {
276
614
  const workflowId = uuidv4();
277
615
  try {
278
616
  this.startWorkflow(workflowId, 'complexity-analysis');
617
+ // Self-healing: Check if operations should be paused due to critical topology
618
+ if (this.minCutMixin.shouldPauseOperations()) {
619
+ console.warn('[quality-assessment] Complexity analysis paused: topology is in critical state');
620
+ this.failWorkflow(workflowId, 'Topology is in critical state');
621
+ return err(new Error('Complexity analysis paused: topology is in critical state'));
622
+ }
623
+ // V3 Integration: Check topology health (ADR-047)
624
+ if (!this.isTopologyHealthy()) {
625
+ console.warn('[quality-assessment] Topology degraded during complexity analysis');
626
+ }
279
627
  // Spawn complexity analyzer agent
280
628
  const agentResult = await this.spawnComplexityAnalyzerAgent(workflowId, request);
281
629
  if (agentResult.success) {