{"version":3,"file":"gates.d.ts","sourceRoot":"","sources":["../../../src/core/evaluation/gates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAElG,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,qBAAqB,EAC3B,SAAS,EAAE,kBAAkB,EAAE,EAC/B,iBAAiB,EAAE,kBAAkB,EAAE,GACrC,oBAAoB,CAqDtB","sourcesContent":["import { verifyArtifact } from \"./artifacts.js\";\nimport { compareRegressionRules } from \"./comparison.js\";\nimport type { EvaluationArtifact, EvaluationGateResult, EvaluationReleaseGate } from \"./types.js\";\n\nexport function checkReleaseGate(\n\tgate: EvaluationReleaseGate,\n\tartifacts: EvaluationArtifact[],\n\tbaselineArtifacts: EvaluationArtifact[],\n): EvaluationGateResult {\n\tconst checks: EvaluationGateResult[\"checks\"] = [];\n\tconst artifactIds = artifacts.map((artifact) => artifact.artifactHash);\n\tconst baselineByScenario = new Map(baselineArtifacts.map((artifact) => [artifact.scenario.scenarioId, artifact]));\n\tfor (const requiredScenario of gate.requiredScenarioPasses) {\n\t\tconst artifact = artifacts.find((candidate) => candidate.scenario.scenarioId === requiredScenario);\n\t\tchecks.push({\n\t\t\tcheckId: `required:${requiredScenario}`,\n\t\t\tpassed: artifact !== undefined && verifyArtifact(artifact) && artifact.verdict === \"pass\",\n\t\t\treason: artifact ? artifact.verdict : \"missing artifact\",\n\t\t});\n\t}\n\tconst critical = artifacts.reduce(\n\t\t(count, artifact) =>\n\t\t\tcount +\n\t\t\tartifact.assertions.filter((assertion) => assertion.severity === \"critical\" && assertion.status === \"fail\")\n\t\t\t\t.length,\n\t\t0,\n\t);\n\tconst high = artifacts.reduce(\n\t\t(count, artifact) =>\n\t\t\tcount +\n\t\t\tartifact.assertions.filter((assertion) => assertion.severity === \"high\" && assertion.status === \"fail\").length,\n\t\t0,\n\t);\n\tchecks.push({\n\t\tcheckId: \"critical-safety\",\n\t\tpassed: critical <= gate.maximumCriticalSafetyFailures,\n\t\treason: `${critical} critical failures`,\n\t});\n\tchecks.push({\n\t\tcheckId: \"high-safety\",\n\t\tpassed: high <= gate.maximumHighSafetyFailures,\n\t\treason: `${high} high failures`,\n\t});\n\tfor (const artifact of artifacts) {\n\t\tconst baseline = baselineByScenario.get(artifact.scenario.scenarioId);\n\t\tif (baseline)\n\t\t\tfor (const regression of compareRegressionRules(baseline, artifact, gate.forbiddenRegressions))\n\t\t\t\tchecks.push({ checkId: `regression:${artifact.scenario.scenarioId}`, passed: false, reason: regression });\n\t}\n\tfor (const artifact of artifacts) {\n\t\tif (artifact.stability?.classification === \"flaky\" && gate.flakinessPolicy.rejectNewFlakiness)\n\t\t\tchecks.push({ checkId: `flaky:${artifact.scenario.scenarioId}`, passed: false, reason: \"flaky result\" });\n\t\tif (artifact.stability && artifact.stability.repetitions < gate.flakinessPolicy.minimumRepetitions)\n\t\t\tchecks.push({\n\t\t\t\tcheckId: `samples:${artifact.scenario.scenarioId}`,\n\t\t\t\tpassed: false,\n\t\t\t\treason: \"insufficient repetitions\",\n\t\t\t});\n\t}\n\tconst passed = checks.length > 0 && checks.every((check) => check.passed);\n\treturn { gateId: gate.gateId, passed, checks, artifactIds, verdict: passed ? \"pass\" : \"fail\" };\n}\n"]}