{"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../../src/core/evaluation/semantic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE;QACf,MAAM,EAAE,wBAAwB,CAAC;QACjC,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,GAAG,GAAG,GAAG,CAAC;KAC1B,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9G;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC9C,MAAM,EAAE,wBAAwB,CAAC;IACjC,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,2BAA2B,CAAC;IACxC,UAAU,EAAE,yBAAyB,EAAE,CAAC;CACxC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAwCpC","sourcesContent":["import type {\n\tEvaluationAssertionResult,\n\tEvaluationCandidateIdentity,\n\tSemanticEvaluationResult,\n\tSemanticEvaluationRubric,\n} from \"./types.js\";\n\nexport interface SemanticJudge {\n\treadonly judgeId: string;\n\tevaluate(input: {\n\t\trubric: SemanticEvaluationRubric;\n\t\tevidence: string;\n\t\tcandidateLabel: \"A\" | \"B\";\n\t}): Promise<{ status: \"pass\" | \"fail\" | \"uncertain\"; dimensions: Record<string, number>; rationale: string }>;\n}\n\nexport async function evaluateSemantics(input: {\n\trubric: SemanticEvaluationRubric;\n\tjudge: SemanticJudge;\n\tevidence: string;\n\tcandidate?: EvaluationCandidateIdentity;\n\tassertions: EvaluationAssertionResult[];\n}): Promise<SemanticEvaluationResult> {\n\tif (\n\t\tinput.assertions.some(\n\t\t\t(assertion) =>\n\t\t\t\t(assertion.severity === \"critical\" || assertion.severity === \"high\") && assertion.status === \"fail\",\n\t\t)\n\t)\n\t\treturn unavailable(input.rubric, input.judge.judgeId, \"deterministic safety failure takes precedence\");\n\tconst boundedEvidence = input.evidence.slice(0, 32_000);\n\ttry {\n\t\tconst judged = await input.judge.evaluate({\n\t\t\trubric: input.rubric,\n\t\t\tevidence: boundedEvidence,\n\t\t\tcandidateLabel: \"A\",\n\t\t});\n\t\tconst dimensions: Record<string, number | undefined> = {};\n\t\tfor (const dimension of input.rubric.dimensions) {\n\t\t\tconst value = judged.dimensions[dimension.name];\n\t\t\tdimensions[dimension.name] =\n\t\t\t\ttypeof value === \"number\" && value >= dimension.minimum && value <= dimension.maximum ? value : undefined;\n\t\t}\n\t\tif (Object.values(dimensions).some((value) => value === undefined))\n\t\t\treturn unavailable(input.rubric, input.judge.judgeId, \"judge output failed rubric bounds\");\n\t\treturn {\n\t\t\trubricId: input.rubric.rubricId,\n\t\t\trubricVersion: input.rubric.version,\n\t\t\tjudgeId: input.judge.judgeId,\n\t\t\tstatus: judged.status,\n\t\t\tdimensions,\n\t\t\trationale: judged.rationale.slice(0, 2_000),\n\t\t\tcandidateIdentityHidden: true,\n\t\t\ttoolExecutionAllowed: false,\n\t\t};\n\t} catch (error) {\n\t\treturn unavailable(\n\t\t\tinput.rubric,\n\t\t\tinput.judge.judgeId,\n\t\t\terror instanceof Error ? error.message : \"judge unavailable\",\n\t\t);\n\t}\n}\n\nfunction unavailable(rubric: SemanticEvaluationRubric, judgeId: string, rationale: string): SemanticEvaluationResult {\n\treturn {\n\t\trubricId: rubric.rubricId,\n\t\trubricVersion: rubric.version,\n\t\tjudgeId,\n\t\tstatus: \"unavailable\",\n\t\tdimensions: Object.fromEntries(rubric.dimensions.map((dimension) => [dimension.name, undefined])),\n\t\trationale,\n\t\tcandidateIdentityHidden: true,\n\t\ttoolExecutionAllowed: false,\n\t};\n}\n"]}