( summary: DiscoverySummaryType, comparatorName: string, protocol: DiscoveryBenchmarkProtocol, comparatorEvidence: DiscoveryComparatorEvidence | undefined )
| 367 | } |
| 368 | |
| 369 | function evaluateComparatorGate( |
| 370 | summary: DiscoverySummaryType, |
| 371 | comparatorName: string, |
| 372 | protocol: DiscoveryBenchmarkProtocol, |
| 373 | comparatorEvidence: DiscoveryComparatorEvidence | undefined |
| 374 | ): DiscoveryComparatorGateResult { |
| 375 | const tolerancePercent = protocol.shipGate.comparators.tolerancePercent; |
| 376 | const comparatorMetrics = comparatorEvidence?.[comparatorName]; |
| 377 | const comparisons = protocol.shipGate.comparators.usefulnessMetrics.map((metric) => |
| 378 | compareMetricWithinTolerance( |
| 379 | getDiscoveryMetricValue(summary, metric), |
| 380 | getDiscoveryMetricValue(comparatorMetrics, metric), |
| 381 | metric, |
| 382 | tolerancePercent |
| 383 | ) |
| 384 | ); |
| 385 | const missingMetrics = comparisons |
| 386 | .filter((comparison) => comparison.comparatorValue === null) |
| 387 | .map((comparison) => comparison.metric); |
| 388 | |
| 389 | return { |
| 390 | comparatorName, |
| 391 | status: |
| 392 | missingMetrics.length > 0 |
| 393 | ? 'pending_evidence' |
| 394 | : comparisons.every((comparison) => comparison.passes) |
| 395 | ? 'passed' |
| 396 | : 'failed', |
| 397 | tolerancePercent, |
| 398 | missingMetrics, |
| 399 | comparisons |
| 400 | }; |
| 401 | } |
| 402 | |
| 403 | export function combineDiscoverySummaries(summaries: DiscoverySummaryType[]): DiscoverySummaryType { |
| 404 | return summarizeDiscoveryResults(summaries.flatMap((summary) => summary.results)); |
no test coverage detected