{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../../../src/core/long-horizon/adaptive/reviewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAoC,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtG,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACzC,gBAAgB,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,SAAS;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IACnC,uBAAuB,EAAE,OAAO,CAAC;IACjC,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oBAAoB,EAAE,OAAO,CAAC;CAC9B;AAED,eAAO,MAAM,4BAA4B,EAAE,mBAM1C,CAAC;AAEF,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,GACpE,YAAY,CAkCd;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE5D;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,CAIzF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,mBAAmB,EAChC,yBAAyB,EAAE,OAAO,GAChC;IAAE,eAAe,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAA;CAAE,CAO1D","sourcesContent":["/**\n * Independent reviewer role.\n *\n * A bounded reviewer that receives a structured, evidence-scoped packet (not\n * raw logs or secrets) and returns structured, addressable findings. The\n * reviewer cannot execute mutating tools by default, cannot authorize scope\n * expansion, cannot publish, cannot override deterministic readiness, and\n * cannot waive user-required criteria.\n */\n\nimport type { AcceptanceCriterion, ReviewFinding, ReviewFindingKind, ReviewReport } from \"./types.js\";\n\nexport interface ReviewPacket {\n\tobjective: string;\n\tcriteria: readonly AcceptanceCriterion[];\n\texecutionSummary: readonly { key: string; value: string }[];\n\tdiffSummary?: string;\n\tevidenceSummaries: readonly { evidenceId: string; summary: string }[];\n\twarnings: string[];\n\tbudgetState?: string;\n\tallowMutatingTools: boolean;\n}\n\nexport interface ReviewerPermissions {\n\tcanExecuteMutatingTools: boolean;\n\tcanExpandScope: boolean;\n\tcanPublish: boolean;\n\tcanWaiveCriteria: boolean;\n\tcanOverrideReadiness: boolean;\n}\n\nexport const DEFAULT_REVIEWER_PERMISSIONS: ReviewerPermissions = {\n\tcanExecuteMutatingTools: false,\n\tcanExpandScope: false,\n\tcanPublish: false,\n\tcanWaiveCriteria: false,\n\tcanOverrideReadiness: false,\n};\n\n/** Normalize raw reviewer findings into a bounded, addressable report. */\nexport function normalizeFindings(\n\tpacket: ReviewPacket,\n\traw: Array<{ kind?: string; summary?: string; references?: string[] }>,\n): ReviewReport {\n\tconst validKinds: ReadonlySet<ReviewFindingKind> = new Set([\n\t\t\"approve\",\n\t\t\"request_specific_correction\",\n\t\t\"identify_missing_evidence\",\n\t\t\"identify_contradiction\",\n\t\t\"block\",\n\t]);\n\tconst findings: ReviewFinding[] = [];\n\tfor (let i = 0; i < raw.length; i += 1) {\n\t\tconst kind = validKinds.has(raw[i].kind as ReviewFindingKind)\n\t\t\t? (raw[i].kind as ReviewFindingKind)\n\t\t\t: \"request_specific_correction\";\n\t\tif (!raw[i].summary) continue;\n\t\tfindings.push(\n\t\t\tObject.freeze({\n\t\t\t\tfindingId: `finding-${i + 1}`,\n\t\t\t\tkind,\n\t\t\t\tsummary: String(raw[i].summary),\n\t\t\t\treferences: Object.freeze([...(raw[i].references ?? [])]),\n\t\t\t}),\n\t\t);\n\t}\n\tif (findings.length === 0) {\n\t\tfindings.push(\n\t\t\tObject.freeze({\n\t\t\t\tfindingId: \"finding-1\",\n\t\t\t\tkind: \"request_specific_correction\",\n\t\t\t\tsummary: \"No actionable findings provided.\",\n\t\t\t\treferences: Object.freeze([]),\n\t\t\t}),\n\t\t);\n\t}\n\treturn { reviewId: `review-${packet.evidenceSummaries.length}`, findings: Object.freeze(findings) };\n}\n\n/** Whether the report contains an explicit approval. */\nexport function reviewsApprove(report: ReviewReport): boolean {\n\treturn report.findings.some((f) => f.kind === \"approve\");\n}\n\n/** Aggregate verdict: only explicit approvals count, never implicit. */\nexport function aggregateVerdict(report: ReviewReport): \"approve\" | \"correction\" | \"block\" {\n\tif (report.findings.some((f) => f.kind === \"block\")) return \"block\";\n\tif (report.findings.some((f) => f.kind === \"approve\")) return \"approve\";\n\treturn \"correction\";\n}\n\n/**\n * Enforce that a reviewer's findings cannot expand authority. A release\n * approval is only honored when the reviewer is explicitly permitted to publish\n * and all required criteria are satisfied.\n */\nexport function applyReviewerAuthority(\n\treport: ReviewReport,\n\tpermissions: ReviewerPermissions,\n\trequiredCriteriaSatisfied: boolean,\n): { publishApproved: boolean; authorityExpanded: boolean } {\n\tconst approve = reviewsApprove(report);\n\tconst publishApproved = approve && permissions.canPublish && requiredCriteriaSatisfied;\n\treturn {\n\t\tpublishApproved,\n\t\tauthorityExpanded: approve && !permissions.canPublish,\n\t};\n}\n"]}