{"version":3,"file":"completion-gate.d.ts","sourceRoot":"","sources":["../../../src/core/reliability/completion-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,EAAE,wBAAwB,GACzC,oBAAoB,CAgDtB","sourcesContent":["/**\n * Completion Gate — Jensen-owned completion decision.\n *\n * The model proposes FINAL_CANDIDATE; this gate decides ACCEPT or REJECT from\n * durable ledger state and authoritative evidence. A model cannot mark a\n * missing criterion as passed by asserting it: criterion state is derived from\n * the Requirement Ledger, where SATISFIED requires authoritative evidence from\n * a trusted (Jensen-held) context.\n */\n\nimport type { MissionContractV1, RequirementLedgerV1 } from \"../long-horizon/index.js\";\nimport { deriveRequirementLedgerSummary } from \"../long-horizon/index.js\";\nimport type { TrustedValidationContext } from \"../long-horizon/trusted-context.js\";\nimport type { CompletionGateResult } from \"./types.js\";\n\nexport function evaluateCompletionGate(\n\tcontract: MissionContractV1,\n\tledger: RequirementLedgerV1,\n\tvalidationContext: TrustedValidationContext,\n): CompletionGateResult {\n\tconst summary = deriveRequirementLedgerSummary(contract, ledger, validationContext);\n\n\tif (summary.completionCandidate) {\n\t\treturn {\n\t\t\tdecision: \"accept\",\n\t\t\treasons: [\"all acceptance criteria satisfied with authoritative evidence\"],\n\t\t\tmissingCriterionIds: [],\n\t\t\tblockedBy: [],\n\t\t\tcompletedCriterionIds: contract.requirements.map((r) => r.id),\n\t\t};\n\t}\n\n\tconst completedCriterionIds: string[] = [];\n\tconst missingCriterionIds: string[] = [];\n\n\tfor (const requirement of contract.requirements) {\n\t\tconst entry = ledger.requirements.find((r) => r.requirementId === requirement.id);\n\t\tif (!entry || entry.initialNotApplicable) continue;\n\t\tif (entry.status === \"SATISFIED\") {\n\t\t\tcompletedCriterionIds.push(requirement.id);\n\t\t} else {\n\t\t\tmissingCriterionIds.push(requirement.id);\n\t\t}\n\t}\n\n\t// A SATISFIED requirement without authoritative evidence is still incomplete.\n\tfor (const requirement of contract.requirements) {\n\t\tconst entry = ledger.requirements.find((r) => r.requirementId === requirement.id);\n\t\tif (!entry || entry.status !== \"SATISFIED\") continue;\n\t\tconst hasAuthoritative = ledger.evidence.some(\n\t\t\t(ev) =>\n\t\t\t\tev.requirementIds.includes(requirement.id) &&\n\t\t\t\tev.effectiveAuthority !== \"agent-claim\" &&\n\t\t\t\tev.status === \"pass\",\n\t\t);\n\t\tif (!hasAuthoritative && !missingCriterionIds.includes(requirement.id)) {\n\t\t\tmissingCriterionIds.push(requirement.id);\n\t\t}\n\t}\n\n\treturn {\n\t\tdecision: \"reject\",\n\t\treasons: summary.completionBlockers ?? [\"completion not ready\"],\n\t\tmissingCriterionIds,\n\t\tblockedBy: [...summary.blockedRequirements, ...summary.failedRequirements],\n\t\tcompletedCriterionIds,\n\t};\n}\n"]}