{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../../src/core/long-horizon/adaptive/readiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACzC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,wBAAwB,EAAE,OAAO,CAAC;IAClC,2BAA2B,EAAE,OAAO,CAAC;IACrC,0BAA0B,EAAE,OAAO,CAAC;IACpC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,6BAA6B,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,cAAc,GAAG,mBAAmB,CAwDtF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACtC,iBAAiB,EAAE,OAAO,EAC1B,SAAS,EAAE,mBAAmB,GAC5B,mBAAmB,CAGrB","sourcesContent":["/**\n * Independent completion-readiness gate.\n *\n * A deterministic evaluator that aggregates success criteria, budget state,\n * transaction state, test state, job state, provider state, stall state,\n * unresolved risks, and review/release state into a single\n * `CompletionReadiness`. Completion is blocked if any required criterion is\n * pending/failed, a required transaction is unconfirmed, authoritative tests\n * failed, required jobs are unresolved, release artifacts are unverified,\n * accounting is inconsistent, required review is absent, or the final-response\n * reserve is unavailable.\n *\n * A model reviewer may add findings but can never force readiness to true.\n */\n\nimport { criterionSummary } from \"./criteria.js\";\nimport type { AcceptanceCriterion, CompletionReadiness } from \"./types.js\";\n\nexport interface ReadinessInput {\n\tcriteria: readonly AcceptanceCriterion[];\n\tsatisfiedCriterionIds: string[];\n\ttransactionConfirmed: boolean;\n\trequiredTransaction: boolean;\n\ttestsFailed: boolean;\n\tjobsResolved: boolean;\n\trequiredJobs: boolean;\n\treleaseArtifactsVerified: boolean;\n\trequiredReleaseVerification: boolean;\n\tbudgetAccountingConsistent: boolean;\n\trequiredReviewPresent: boolean;\n\trequiredReview: boolean;\n\tfinalResponseReserveAvailable: boolean;\n\twarnings?: string[];\n\tevidenceIds?: string[];\n}\n\nexport function evaluateCompletionReadiness(input: ReadinessInput): CompletionReadiness {\n\tconst blockers: string[] = [];\n\tconst warnings = [...(input.warnings ?? [])];\n\tconst evidenceIds = [...(input.evidenceIds ?? [])];\n\n\tconst summary = criterionSummary({ criteria: input.criteria });\n\n\tfor (const c of input.criteria) {\n\t\tif (c.required && (c.status === \"pending\" || c.status === \"failed\")) {\n\t\t\tblockers.push(`REQUIRED_CRITERION_${c.status.toUpperCase()}:${c.criterionId}`);\n\t\t}\n\t\tif (c.status === \"blocked\") {\n\t\t\tblockers.push(`CRITERION_BLOCKED:${c.criterionId}`);\n\t\t}\n\t\tif (c.status === \"waived\" && (!c.waiverAuthority || c.waiverAuthority === \"model\")) {\n\t\t\tblockers.push(`CRITERION_WAIVED_NO_AUTHORITY:${c.criterionId}`);\n\t\t}\n\t}\n\n\tif (input.requiredTransaction && !input.transactionConfirmed) {\n\t\tblockers.push(\"REQUIRED_TRANSACTION_UNCONFIRMED\");\n\t}\n\tif (input.testsFailed) {\n\t\tblockers.push(\"AUTHORITATIVE_TESTS_FAILED\");\n\t}\n\tif (input.requiredJobs && !input.jobsResolved) {\n\t\tblockers.push(\"REQUIRED_JOB_UNRESOLVED\");\n\t}\n\tif (input.requiredReleaseVerification && !input.releaseArtifactsVerified) {\n\t\tblockers.push(\"RELEASE_ARTIFACTS_UNVERIFIED\");\n\t}\n\tif (!input.budgetAccountingConsistent) {\n\t\tblockers.push(\"BUDGET_ACCOUNTING_INCONSISTENT\");\n\t}\n\tif (input.requiredReview && !input.requiredReviewPresent) {\n\t\tblockers.push(\"REQUIRED_INDEPENDENT_REVIEW_ABSENT\");\n\t}\n\tif (!input.finalResponseReserveAvailable) {\n\t\tblockers.push(\"FINAL_RESPONSE_RESERVE_UNAVAILABLE\");\n\t}\n\n\tconst satisfiedCriteria = input.criteria.filter((c) => c.status === \"satisfied\").map((c) => c.criterionId);\n\tconst pendingCriteria = input.criteria.filter((c) => c.status === \"pending\").map((c) => c.criterionId);\n\n\tif (summary.satisfied === 0 && input.criteria.length === 0) {\n\t\tblockers.push(\"NO_CRITERIA_DEFINED\");\n\t}\n\n\treturn {\n\t\tready: blockers.length === 0,\n\t\tblockers: Object.freeze([...blockers]),\n\t\twarnings: Object.freeze([...warnings]),\n\t\tsatisfiedCriteria: Object.freeze([...satisfiedCriteria]),\n\t\tpendingCriteria: Object.freeze([...pendingCriteria]),\n\t\tevidenceIds: Object.freeze([...evidenceIds]),\n\t};\n}\n\n/**\n * A model reviewer can add findings but cannot force readiness to true. The\n * readiness output is recomputed deterministically from state each time.\n */\nexport function cannotOverrideReadiness(\n\t_modelForcedReady: boolean,\n\tevaluated: CompletionReadiness,\n): CompletionReadiness {\n\t// Ignore any model assertion; the deterministic evaluation is authoritative.\n\treturn evaluated;\n}\n"]}