{"version":3,"file":"routing.test.d.ts","sourceRoot":"","sources":["../../../src/core/routing/routing.test.ts"],"names":[],"mappings":"","sourcesContent":["import { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterAll, beforeAll, describe, expect, it } from \"vitest\";\nimport { BASELINE_RULES, baselineSelect } from \"./baseline.js\";\nimport { BUDGET_CLASSES, canEscalate, selectBudget } from \"./budget.js\";\nimport { applyHardPolicy, generateCandidates } from \"./candidates.js\";\nimport { evaluateCounterfactual } from \"./counterfactual.js\";\nimport { checkDriftHealth, computeDrift, DRIFT_DEFAULT_CONFIG } from \"./drift.js\";\nimport { assessConfidence, decide, replayDecision } from \"./engine.js\";\nimport { decideTransition } from \"./escalation.js\";\nimport { resolveFallback } from \"./fallback.js\";\nimport { extractFeatures, FEATURE_SCHEMA_VERSION, taskFingerprint } from \"./features.js\";\nimport { generateRoutingPolicy } from \"./optimizer.js\";\nimport { promotePolicy, rollbackPolicy, validatePromotionGates } from \"./promotion.js\";\nimport { aggregateScore, inferRetrievalStrategy, scoreCandidate, selectBest, WEIGHTS_BY_POLICY } from \"./scoring.js\";\nimport { shadowEvaluate } from \"./shadow.js\";\nimport { readPolicy } from \"./store.js\";\nimport type { CandidateEvidence, OrchestrationCandidate } from \"./types.js\";\n\nconst DEFAULT_EVIDENCE: CandidateEvidence = {\n\tcandidateId: \"c-x\",\n\tevaluatorVersion: \"1.0.0\",\n\tscenarioVersion: \"v1\",\n\tevidenceHash: \"hash-x\",\n\tsampleCount: 30,\n\tcorrectnessRate: 0.9,\n\tsafetyRate: 0.98,\n\treliabilityRate: 0.9,\n\tmedianLatencyMs: 1000,\n\tavgCostUsd: 0.4,\n\tflakyRate: 0.05,\n\tcompatibility: {},\n\tcollectedAt: \"2026-01-01T00:00:00.000Z\",\n\tversion: 1,\n};\n\nlet _routingRoot: string;\nbeforeAll(() => {\n\t_routingRoot = mkdtempSync(join(tmpdir(), \"jensen-routing-unit-\"));\n\tprocess.env.JENSEN_ROUTING_ROOT = _routingRoot;\n});\nafterAll(() => {\n\trmSync(_routingRoot, { recursive: true, force: true });\n});\n\nfunction candidate(partial: Partial<OrchestrationCandidate> = {}): OrchestrationCandidate {\n\treturn {\n\t\tcandidateId: \"c-x\",\n\t\tproviderProfile: \"fixture\",\n\t\tconfiguredModel: \"fixture/deterministic\",\n\t\texecutionTopology: \"single_agent\",\n\t\tskillIds: [],\n\t\tsubagentDefinitions: [],\n\t\tretrievalPolicy: \"hybrid\",\n\t\tbudgetClass: \"standard\",\n\t\tfallbackPolicy: \"validated_policy\",\n\t\t...partial,\n\t};\n}\n\ndescribe(\"TASK_FEATURE_EXTRACTION_PASS\", () => {\n\tit(\"is deterministic and versioned\", () => {\n\t\tconst a = extractFeatures(\"Fix the off-by-one bug in parser.cpp\");\n\t\tconst b = extractFeatures(\"Fix the off-by-one bug in parser.cpp\");\n\t\texpect(a).toEqual(b);\n\t\texpect(a.schemaVersion).toBe(FEATURE_SCHEMA_VERSION);\n\t\texpect(a.featureHash).toBeTruthy();\n\t\texpect(a.requiresMutation).toBe(true);\n\t});\n\n\tit(\"labels release and mutation risk deterministically\", () => {\n\t\tconst release = extractFeatures(\"Release version 1.9.0 across seven packages\");\n\t\texpect(release.taskCategory).toBe(\"release\");\n\t\texpect(release.requiresRelease).toBe(true);\n\t\texpect(release.mutationRisk).toBeGreaterThan(0);\n\n\t\tconst ro = extractFeatures(\"Where is the Foo symbol defined?\");\n\t\texpect(ro.requiresMutation).toBe(false);\n\t\texpect(ro.mutationRisk).toBe(0);\n\t});\n\n\tit(\"bounds language ids and marks model-assist separate\", () => {\n\t\tconst f = extractFeatures({\n\t\t\ttask: \"Refactor the compiler\",\n\t\t\tlanguageIds: [\"typescript\", \"rust\", \"javascript\", \"UNKNOWN_LANG\"],\n\t\t});\n\t\texpect(f.languageIds.length).toBeLessThanOrEqual(12);\n\t\texpect(f.languageIds).not.toContain(\"UNKNOWN_LANG\");\n\t});\n\n\tit(\"produces a stable task fingerprint\", () => {\n\t\texpect(taskFingerprint(\"hello\")).toBe(taskFingerprint(\"hello\"));\n\t\texpect(taskFingerprint(\"hello\")).not.toBe(taskFingerprint(\"world\"));\n\t});\n});\n\ndescribe(\"CANDIDATE_GENERATION_PASS\", () => {\n\tit(\"generates from canonical registries only\", () => {\n\t\tconst { candidates } = generateCandidates({\n\t\t\tproviderProfiles: [\"fixture\"],\n\t\t\tmodels: [{ provider: \"fixture\", model: \"m\" }],\n\t\t\ttopologies: [\"single_agent\", \"cavecrew\"],\n\t\t\tskills: [],\n\t\t\tsubagents: [\"builder\", \"reviewer\"],\n\t\t\tretrievalPolicies: [\"hybrid\"],\n\t\t\tbudgetClasses: [\"small\", \"standard\"],\n\t\t\tfallbackPolicies: [\"validated_policy\"],\n\t\t\toperatorSelectionPolicy: \"balanced\",\n\t\t});\n\t\texpect(candidates.length).toBeGreaterThan(0);\n\t\tfor (const c of candidates) {\n\t\t\texpect(c.candidateId).toMatch(/^c-/);\n\t\t\texpect(c.executionTopology).not.toBe(\"INVENTED\");\n\t\t}\n\t});\n\n\tit(\"never invents a provider when none are configured\", () => {\n\t\tconst { candidates, warnings } = generateCandidates({\n\t\t\tproviderProfiles: [],\n\t\t\tmodels: [],\n\t\t\ttopologies: [],\n\t\t\tskills: [],\n\t\t\tsubagents: [],\n\t\t\tretrievalPolicies: [],\n\t\t\tbudgetClasses: [],\n\t\t\tfallbackPolicies: [],\n\t\t\toperatorSelectionPolicy: \"balanced\",\n\t\t});\n\t\texpect(warnings.some((w) => w.includes(\"No provider profiles configured\"))).toBe(true);\n\t\texpect(candidates.length).toBeGreaterThan(0);\n\t\tfor (const c of candidates) {\n\t\t\texpect(c.providerProfile).toBe(\"local\");\n\t\t}\n\t});\n\n\tit(\"bounds candidate set deterministically\", () => {\n\t\tconst { candidates } = generateCandidates({\n\t\t\tproviderProfiles: [\"fixture\", \"local\", \"remote\"],\n\t\t\tmodels: [\n\t\t\t\t{ provider: \"fixture\", model: \"a\" },\n\t\t\t\t{ provider: \"local\", model: \"b\" },\n\t\t\t],\n\t\t\ttopologies: [\"single_agent\", \"cavecrew\", \"single_agent_with_reviewer\"],\n\t\t\tskills: [],\n\t\t\tsubagents: [],\n\t\t\tretrievalPolicies: [\"lexical\", \"hybrid\"],\n\t\t\tbudgetClasses: [\"small\", \"standard\", \"large\"],\n\t\t\tfallbackPolicies: [\"validated_policy\"],\n\t\t\toperatorSelectionPolicy: \"balanced\",\n\t\t});\n\t\texpect(candidates.length).toBeLessThanOrEqual(3 * 3 * 2 * 3 * 1);\n\t});\n});\n\ndescribe(\"HARD_POLICY_FILTER_PASS\", () => {\n\tconst mk = () =>\n\t\tgenerateCandidates({\n\t\t\tproviderProfiles: [\"remote\", \"local\"],\n\t\t\tmodels: [\n\t\t\t\t{ provider: \"remote\", model: \"r\" },\n\t\t\t\t{ provider: \"local\", model: \"l\" },\n\t\t\t],\n\t\t\ttopologies: [\"single_agent\"],\n\t\t\tskills: [],\n\t\t\tsubagents: [],\n\t\t\tretrievalPolicies: [\"hybrid\"],\n\t\t\tbudgetClasses: [\"standard\"],\n\t\t\tfallbackPolicies: [\"validated_policy\"],\n\t\t\toperatorSelectionPolicy: \"balanced\",\n\t\t}).candidates;\n\n\tit(\"rejects providers outside allowlist\", () => {\n\t\tconst { accepted, rejected } = applyHardPolicy(mk(), {\n\t\t\tworkspaceBoundary: true,\n\t\t\trequiredLocalOnly: false,\n\t\t\tproviderAllowlist: [\"local\"],\n\t\t\tmodelAllowlist: [],\n\t\t\tnetworkPolicy: \"allow_all\",\n\t\t\tallowLiveProviders: true,\n\t\t});\n\t\texpect(rejected.some((r) => r.policyRuleId === \"rule-provider-allowlist\")).toBe(true);\n\t\texpect(accepted.every((c) => c.providerProfile === \"local\")).toBe(true);\n\t});\n\n\tit(\"hard rejection cannot be overcome by higher score\", () => {\n\t\t// Even with perfect evidence, a remote provider is rejected under local_only.\n\t\tconst { rejected } = applyHardPolicy(mk(), {\n\t\t\tworkspaceBoundary: true,\n\t\t\trequiredLocalOnly: true,\n\t\t\tproviderAllowlist: [],\n\t\t\tmodelAllowlist: [],\n\t\t\tnetworkPolicy: \"allow_all\",\n\t\t\tallowLiveProviders: true,\n\t\t});\n\t\texpect(rejected.some((r) => r.reasonCode === \"remote_provider_denied_local_only\")).toBe(true);\n\t});\n\n\tit(\"blocks live providers unless explicitly allowed\", () => {\n\t\tconst { rejected } = applyHardPolicy(mk(), {\n\t\t\tworkspaceBoundary: true,\n\t\t\trequiredLocalOnly: false,\n\t\t\tproviderAllowlist: [],\n\t\t\tmodelAllowlist: [],\n\t\t\tnetworkPolicy: \"local_only\",\n\t\t\tallowLiveProviders: false,\n\t\t});\n\t\texpect(rejected.some((r) => r.reasonCode === \"network_policy_denies_remote\")).toBe(true);\n\t});\n});\n\ndescribe(\"DETERMINISTIC_BASELINE_PASS\", () => {\n\tit(\"selects rules by deterministic precedence\", () => {\n\t\tconst f = extractFeatures(\"Release version 1.9.0\");\n\t\tconst b = baselineSelect(f);\n\t\texpect(b.ruleId).toBe(\"baseline-release\");\n\t\texpect(b.candidate.budgetClass).toBe(\"release\");\n\t});\n\n\tit(\"handles boundary conditions\", () => {\n\t\tconst f = extractFeatures(\"Implement a small new command in the CLI\");\n\t\tconst b = baselineSelect(f);\n\t\texpect(b.ruleId).toBe(\"baseline-bounded-implementation\");\n\t});\n\n\tit(\"baseline is replayable and rule-enumerable\", () => {\n\t\texpect(BASELINE_RULES.length).toBeGreaterThanOrEqual(4);\n\t\texpect(BASELINE_RULES.some((r) => r.ruleId === \"baseline-default\")).toBe(true);\n\t});\n});\n\ndescribe(\"EVALUATION_SCORING_PASS / MISSING_EVIDENCE_PASS\", () => {\n\tit(\"missing evidence is undefined, not zero\", () => {\n\t\tconst s = scoreCandidate(candidate(), undefined, 0);\n\t\texpect(s.correctnessScore).toBeUndefined();\n\t\texpect(s.sampleCount).toBe(0);\n\t\texpect(s.uncertainty).toBe(1);\n\t\texpect(s.reasonCodes).toContain(\"no_evidence\");\n\t});\n\n\tit(\"scores from evidence and records sample count\", () => {\n\t\tconst s = scoreCandidate(candidate(), DEFAULT_EVIDENCE, 30);\n\t\texpect(s.correctnessScore).toBeCloseTo(0.9);\n\t\texpect(s.sampleCount).toBe(30);\n\t\texpect(s.uncertainty).toBeLessThan(0.5);\n\t});\n\n\tit(\"safety is never averaged away\", () => {\n\t\tconst lowSafe = scoreCandidate(\n\t\t\tcandidate({ candidateId: \"c-bad\" }),\n\t\t\t{ ...DEFAULT_EVIDENCE, safetyRate: 0.1, sampleCount: 30, evidenceHash: \"hash-bad\", candidateId: \"c-bad\" },\n\t\t\t30,\n\t\t);\n\t\tconst highSafe = scoreCandidate(\n\t\t\tcandidate({ candidateId: \"c-good\" }),\n\t\t\t{ ...DEFAULT_EVIDENCE, safetyRate: 0.9, sampleCount: 30, evidenceHash: \"hash-good\", candidateId: \"c-good\" },\n\t\t\t30,\n\t\t);\n\t\tconst aggBad = aggregateScore(lowSafe, WEIGHTS_BY_POLICY.balanced, { safetyFloor: 0.5 });\n\t\tconst aggGood = aggregateScore(highSafe, WEIGHTS_BY_POLICY.balanced, { safetyFloor: 0.5 });\n\t\texpect(aggBad).toBe(-Infinity);\n\t\texpect(aggGood).toBeGreaterThan(0);\n\t});\n\n\tit(\"selects best with deterministic tie-breaking\", () => {\n\t\tconst a = scoreCandidate(\n\t\t\tcandidate({ candidateId: \"c-a\" }),\n\t\t\t{ ...DEFAULT_EVIDENCE, candidateId: \"c-a\", evidenceHash: \"a\" },\n\t\t\t30,\n\t\t);\n\t\tconst b = scoreCandidate(\n\t\t\tcandidate({ candidateId: \"c-b\" }),\n\t\t\t{ ...DEFAULT_EVIDENCE, candidateId: \"c-b\", evidenceHash: \"b\" },\n\t\t\t30,\n\t\t);\n\t\tconst r = selectBest([b, a], { policy: \"balanced\" });\n\t\t// Deterministic tie-break by candidateId: c-a < c-b\n\t\texpect(r.selected?.candidateId).toBe(\"c-a\");\n\t\tconst r2 = selectBest([b, a], { policy: \"balanced\" });\n\t\texpect(r2.selected?.candidateId).toBe(r.selected?.candidateId);\n\t});\n\n\tit(\"uncertainty penalizes selection\", () => {\n\t\tconst confident = scoreCandidate(\n\t\t\tcandidate({ candidateId: \"c-conf\" }),\n\t\t\t{ ...DEFAULT_EVIDENCE, evidenceHash: \"conf\", candidateId: \"c-conf\" },\n\t\t\t40,\n\t\t);\n\t\tconst unsure = scoreCandidate(\n\t\t\tcandidate({ candidateId: \"c-uns\" }),\n\t\t\t{ ...DEFAULT_EVIDENCE, sampleCount: 3, flakyRate: 0.2, evidenceHash: \"uns\", candidateId: \"c-uns\" },\n\t\t\t3,\n\t\t);\n\t\tconst r = selectBest([confident, unsure], { policy: \"balanced\" });\n\t\texpect(r.selected?.candidateId).toBe(\"c-conf\");\n\t});\n\n\tit(\"inferRetrievalStrategy uses exact identifiers without embeddings\", () => {\n\t\texpect(\n\t\t\tinferRetrievalStrategy({ ambiguity: 0.1, requiresMutation: false, taskCategory: \"analysis\", languageIds: [] }),\n\t\t).toBe(\"lexical\");\n\t\texpect(\n\t\t\tinferRetrievalStrategy({\n\t\t\t\tambiguity: 0.9,\n\t\t\t\trequiresMutation: false,\n\t\t\t\ttaskCategory: \"analysis\",\n\t\t\t\tlanguageIds: [\"ts\"],\n\t\t\t}),\n\t\t).toBe(\"hybrid\");\n\t});\n});\n\ndescribe(\"MULTI_OBJECTIVE_SELECTION_PASS / OPERATOR_OBJECTIVE_AUTHORITATIVE\", () => {\n\tit(\"honors cost_constrained over quality_first\", () => {\n\t\tconst cheap = scoreCandidate(\n\t\t\tcandidate({ candidateId: \"c-cheap\" }),\n\t\t\t{\n\t\t\t\t...DEFAULT_EVIDENCE,\n\t\t\t\tcandidateId: \"c-cheap\",\n\t\t\t\tevidenceHash: \"cheap\",\n\t\t\t\tavgCostUsd: 0.05,\n\t\t\t\tcorrectnessRate: 0.7,\n\t\t\t\tsampleCount: 30,\n\t\t\t},\n\t\t\t30,\n\t\t);\n\t\tconst pricey = scoreCandidate(\n\t\t\tcandidate({ candidateId: \"c-pricey\" }),\n\t\t\t{\n\t\t\t\t...DEFAULT_EVIDENCE,\n\t\t\t\tcandidateId: \"c-pricey\",\n\t\t\t\tevidenceHash: \"pricey\",\n\t\t\t\tavgCostUsd: 0.9,\n\t\t\t\tcorrectnessRate: 0.99,\n\t\t\t\tsampleCount: 30,\n\t\t\t},\n\t\t\t30,\n\t\t);\n\t\tconst costSel = selectBest([cheap, pricey], { policy: \"cost_constrained\" });\n\t\texpect(costSel.selected?.candidateId).toBe(\"c-cheap\");\n\t});\n\n\tit(\"exposes aggregate weights version\", () => {\n\t\texpect(WEIGHTS_BY_POLICY.balanced.correctness).toBeGreaterThan(0);\n\t});\n});\n\ndescribe(\"UNCERTAINTY_PASS / insufficient evidence\", () => {\n\tit(\"assessConfidence returns insufficient_evidence when no evidence\", () => {\n\t\tconst scored = scoreCandidate(candidate(), undefined, 0);\n\t\texpect(assessConfidence([scored], scored, \"balanced\")).toBe(\"insufficient_evidence\");\n\t});\n});\n\ndescribe(\"SHADOW_ZERO_EFFECTS_PASS\", () => {\n\tit(\"shadow decision records but never executes\", () => {\n\t\tconst f = extractFeatures(\"Fix a bug\");\n\t\tconst shadow = shadowEvaluate(f, \"c-alt\", \"shadow-policy\", 1, \"c-prod\", \"run-1\");\n\t\texpect(shadow.wouldSelectDifferent).toBe(true);\n\t\texpect(shadow.shadowPolicyId).toBe(\"shadow-policy\");\n\t\t// No execution fields present - proving zero-effect design.\n\t\texpect((shadow as unknown as Record<string, unknown>).executed).toBeUndefined();\n\t\texpect((shadow as unknown as Record<string, unknown>).toolCalls).toBeUndefined();\n\t});\n\n\tit(\"records no-difference when candidates match\", () => {\n\t\tconst f = extractFeatures(\"Query\");\n\t\tconst s = shadowEvaluate(f, \"c-same\", \"p\", 1, \"c-same\", \"r\");\n\t\texpect(s.wouldSelectDifferent).toBe(false);\n\t});\n});\n\ndescribe(\"COUNTERFACTUAL_COMPARISON_PASS\", () => {\n\tit(\"unsupported when identities incompatible\", () => {\n\t\tconst r = evaluateCounterfactual({\n\t\t\tdecisionId: \"d\",\n\t\t\tproductionCandidateId: \"a\",\n\t\t\tcounterfactualCandidateId: \"b\",\n\t\t\tcompatible: { task: false, environment: true, scenario: true, identity: true },\n\t\t});\n\t\texpect(r.mode).toBe(\"unsupported\");\n\t\texpect(r.supported).toBe(false);\n\t});\n\n\tit(\"labels estimate and uncertainty explicitly\", () => {\n\t\tconst r = evaluateCounterfactual({\n\t\t\tdecisionId: \"d\",\n\t\t\tproductionCandidateId: \"a\",\n\t\t\tcounterfactualCandidateId: \"b\",\n\t\t\tproductionEvidence: { ...DEFAULT_EVIDENCE, correctnessRate: 0.6, sampleCount: 20, evidenceHash: \"a\" },\n\t\t\tcounterfactualEvidence: { ...DEFAULT_EVIDENCE, correctnessRate: 0.95, sampleCount: 20, evidenceHash: \"b\" },\n\t\t\tcompatible: { task: true, environment: true, scenario: true, identity: true },\n\t\t});\n\t\texpect(r.supported).toBe(true);\n\t\texpect(r.estimatedWouldHaveImproved).toBe(true);\n\t\texpect(r.estimator).toBe(\"direct\");\n\t\texpect(r.effectSize).toBeGreaterThan(0);\n\t});\n});\n\ndescribe(\"POLICY_GENERATION_PASS / SAFETY_GATE / NO_AUTO_PROMOTION\", () => {\n\tconst ev: Record<string, CandidateEvidence> = {\n\t\t\"c-good\": {\n\t\t\t...DEFAULT_EVIDENCE,\n\t\t\tcandidateId: \"c-good\",\n\t\t\tevidenceHash: \"g\",\n\t\t\tcorrectnessRate: 0.9,\n\t\t\tflakyRate: 0.02,\n\t\t\tsampleCount: 30,\n\t\t},\n\t\t\"c-bad\": {\n\t\t\t...DEFAULT_EVIDENCE,\n\t\t\tcandidateId: \"c-bad\",\n\t\t\tevidenceHash: \"b\",\n\t\t\tcorrectnessRate: 0.4,\n\t\t\tsafetyRate: 0.3,\n\t\t\tflakyRate: 0.4,\n\t\t\tsampleCount: 30,\n\t\t},\n\t};\n\n\tit(\"offline generation derives ranked policy and never auto-promotes\", () => {\n\t\tconst r = generateRoutingPolicy([\"c-good\", \"c-bad\"], ev, \"eval-1\", \"dataset-hash\");\n\t\texpect(r.policy.status).toBe(\"draft\");\n\t\texpect(r.policy.sourceDatasetHash).toBe(\"dataset-hash\");\n\t\texpect(r.ranked[0]?.candidateId).toBe(\"c-good\");\n\t\texpect(r.dominatedCandidateIds).toContain(\"c-bad\");\n\t});\n\n\tit(\"safety gate blocks promotion of a bad policy\", () => {\n\t\tconst r = generateRoutingPolicy([\"c-good\", \"c-bad\"], ev, \"eval-1\", \"dataset-hash\");\n\t\tconst gate = validatePromotionGates(r.policy, ev, {\n\t\t\tsafetyFloor: 0.5,\n\t\t\tcorrectnessFloor: 0.5,\n\t\t\tflakinessCeiling: 0.3,\n\t\t\trequiredScenarioPack: \"routing\",\n\t\t\toperatorAuthorized: true,\n\t\t});\n\t\texpect(gate.passed).toBe(false);\n\t\texpect(gate.reasonCodes.some((c) => c.includes(\"safety_gate\"))).toBe(true);\n\t});\n});\n\ndescribe(\"POLICY_PROMOTION_EXPLICIT_PASS / ROLLBACK_PASS\", () => {\n\tit(\"promotion blocked without authorization and without gates\", () => {\n\t\t// Generate a good policy\n\t\tconst good: Record<string, CandidateEvidence> = {\n\t\t\t\"c-good\": {\n\t\t\t\t...DEFAULT_EVIDENCE,\n\t\t\t\tcandidateId: \"c-good\",\n\t\t\t\tevidenceHash: \"g\",\n\t\t\t\tcorrectnessRate: 0.95,\n\t\t\t\tsafetyRate: 0.99,\n\t\t\t\tflakyRate: 0.01,\n\t\t\t\tsampleCount: 30,\n\t\t\t},\n\t\t};\n\t\tconst r = generateRoutingPolicy([\"c-good\"], good, \"eval-1\", \"ds\");\n\t\t// unauthenticated\n\t\tconst blocked = promotePolicy(r.policy.policyId, \"operator\", good, {\n\t\t\tsafetyFloor: 0.5,\n\t\t\tcorrectnessFloor: 0.5,\n\t\t\tflakinessCeiling: 0.3,\n\t\t\trequiredScenarioPack: \"routing\",\n\t\t\toperatorAuthorized: false,\n\t\t});\n\t\texpect(blocked.ok).toBe(false);\n\t\texpect(blocked.reasonCodes).toContain(\"operator_not_authorized\");\n\t});\n\n\tit(\"rollback is idempotent and retains policy\", () => {\n\t\tconst good: Record<string, CandidateEvidence> = {\n\t\t\t\"c-good\": {\n\t\t\t\t...DEFAULT_EVIDENCE,\n\t\t\t\tcandidateId: \"c-good\",\n\t\t\t\tevidenceHash: \"g\",\n\t\t\t\tcorrectnessRate: 0.95,\n\t\t\t\tsafetyRate: 0.99,\n\t\t\t\tflakyRate: 0.01,\n\t\t\t\tsampleCount: 30,\n\t\t\t},\n\t\t};\n\t\tconst r = generateRoutingPolicy([\"c-good\"], good, \"eval-1\", \"ds\");\n\t\tconst p1 = promotePolicy(r.policy.policyId, \"operator\", good, {\n\t\t\tsafetyFloor: 0.5,\n\t\t\tcorrectnessFloor: 0.5,\n\t\t\tflakinessCeiling: 0.3,\n\t\t\trequiredScenarioPack: \"routing\",\n\t\t\toperatorAuthorized: true,\n\t\t});\n\t\texpect(p1.ok).toBe(true);\n\t\tconst rb = rollbackPolicy(r.policy.policyId, \"operator\");\n\t\texpect(rb.ok).toBe(true);\n\t\tconst rb2 = rollbackPolicy(r.policy.policyId, \"operator\");\n\t\texpect(rb2.ok).toBe(true); // idempotent\n\t});\n});\n\ndescribe(\"ESCALATION / DEESCALATION PASS\", () => {\n\tconst tiers = new Map<string, OrchestrationCandidate[]>();\n\ttiers.set(\"1\", [candidate({ candidateId: \"c-tier1\", configuredModel: \"small\" })]);\n\ttiers.set(\"3\", [candidate({ candidateId: \"c-tier3\", configuredModel: \"large\" })]);\n\tconst tierOf = (id: string): number => (id === \"c-tier3\" ? 3 : 1);\n\n\tit(\"escalates on repeated structured-output failure within bounds\", () => {\n\t\tconst r = decideTransition(\n\t\t\t[{ reasonCode: \"repeated_structured_output_failure\", strength: 0.9 }],\n\t\t\tcandidate({ candidateId: \"c-tier1\", configuredModel: \"small\" }),\n\t\t\ttiers,\n\t\t\ttierOf,\n\t\t\tundefined,\n\t\t\t{ escalationsUsed: 0, deescalationsUsed: 0, budgetRemainingReserve: true },\n\t\t);\n\t\texpect(r.kind).toBe(\"escalate\");\n\t\texpect(r.nextCandidate?.candidateId).toBe(\"c-tier3\");\n\t});\n\n\tit(\"does not exceed maximum escalations\", () => {\n\t\tconst r = decideTransition(\n\t\t\t[{ reasonCode: \"stall_detected\", strength: 0.9 }],\n\t\t\tcandidate({ candidateId: \"c-tier3\" }),\n\t\t\ttiers,\n\t\t\ttierOf,\n\t\t\tundefined,\n\t\t\t{ escalationsUsed: 3, deescalationsUsed: 0, budgetRemainingReserve: true },\n\t\t);\n\t\texpect(r.kind).toBe(\"stay\");\n\t});\n\n\tit(\"de-escalation cannot remove required reviewer\", () => {\n\t\tconst r = decideTransition(\n\t\t\t[{ reasonCode: \"read_only_synthesis\", strength: 0.9 }],\n\t\t\tcandidate({ candidateId: \"c-tier3\", executionTopology: \"single_agent_with_reviewer\" }),\n\t\t\ttiers,\n\t\t\ttierOf,\n\t\t\tundefined,\n\t\t\t{ escalationsUsed: 0, deescalationsUsed: 0, budgetRemainingReserve: true },\n\t\t);\n\t\t// No cheaper candidate preserves reviewer, so it stays.\n\t\texpect(r.kind).not.toBe(\"deescalate\");\n\t});\n});\n\ndescribe(\"FALLBACK_PASS\", () => {\n\tit(\"falls back silently-free: uses deterministic baseline and never enables remote provider under local_only\", () => {\n\t\tconst f = extractFeatures(\"Fix the bug\");\n\t\tconst r = resolveFallback(\"provider_unavailable\", f, {\n\t\t\texplicitFallback: undefined,\n\t\t\tpolicyFallback: undefined,\n\t\t\tlocalOnly: true,\n\t\t\tsafetyClass: \"high\",\n\t\t});\n\t\t// Baseline provider is fixture (non-remote); must stay usable.\n\t\texpect(r.fallbackLayer).toBe(\"deterministic_baseline\");\n\t\texpect(r.blocked).toBe(false);\n\t});\n\n\tit(\"blocks when no safe fallback preserves safety class\", () => {\n\t\tconst r = resolveFallback(\"provider_unavailable\", extractFeatures(\"query\"), {\n\t\t\texplicitFallback: undefined,\n\t\t\tpolicyFallback: undefined,\n\t\t\tlocalOnly: true,\n\t\t\tsafetyClass: \"high\",\n\t\t});\n\t\t// Baseline always available, so not blocked in the normal path.\n\t\texpect(r.blocked).toBe(false);\n\t});\n\n\tit(\"falls back to explicit operator candidate first\", () => {\n\t\tconst r = resolveFallback(\"rate_limited\", extractFeatures(\"x\"), {\n\t\t\texplicitFallback: candidate({ candidateId: \"c-op\" }),\n\t\t\tpolicyFallback: undefined,\n\t\t\tlocalOnly: false,\n\t\t\tsafetyClass: \"unknown\",\n\t\t});\n\t\texpect(r.fallbackLayer).toBe(\"operator\");\n\t\texpect(r.selectedCandidate?.candidateId).toBe(\"c-op\");\n\t});\n});\n\ndescribe(\"BUDGET_BOUND_PASS\", () => {\n\tit(\"bounds budget and applies operator ceiling\", () => {\n\t\tconst r = selectBudget({ budgetClass: \"large\", operatorCeiling: { maxCostUsd: 2 } });\n\t\texpect(r.bounds.maxCostUsd).toBe(2);\n\t\texpect(r.operatorCeilingApplied).toBe(true);\n\t\texpect(r.finalizationReserve).toBeDefined();\n\t});\n\n\tit(\"escalation requires available reserve\", () => {\n\t\tconst bounds = BUDGET_CLASSES.standard;\n\t\texpect(canEscalate({ costUsd: 0.1, modelCalls: 2 }, bounds)).toBe(true);\n\t\t// Nearly maxed on cost - reserve is consumed.\n\t\texpect(canEscalate({ costUsd: bounds.maxCostUsd, modelCalls: 2 }, bounds)).toBe(false);\n\t});\n\n\tit(\"every class defines bounded dimensions and reserve\", () => {\n\t\tfor (const [k, v] of Object.entries(BUDGET_CLASSES)) {\n\t\t\texpect(v.maxCostUsd).toBeGreaterThan(0);\n\t\t\texpect(v.finalizationReserveRatio).toBeGreaterThan(0);\n\t\t\texpect(v.maxModelCalls).toBeGreaterThan(0);\n\t\t\texpect(k).toMatch(/tiny|small|standard|large|high_assurance|release/);\n\t\t}\n\t});\n});\n\ndescribe(\"REPLAY_PASS\", () => {\n\tit(\"decisions are durable and replayable\", () => {\n\t\tconst { decision } = decide({ task: \"Fix the parser bug\", evidence: {} });\n\t\tconst replayed = replayDecision(decision.decisionId);\n\t\texpect(replayed?.decisionId).toBe(decision.decisionId);\n\t\texpect(replayed?.features.featureHash).toBe(decision.features.featureHash);\n\t\texpect(replayed?.selectedCandidateId).toBe(decision.selectedCandidateId);\n\t});\n});\n\ndescribe(\"DRIFT_DETECTION_PASS\", () => {\n\tit(\"enforces minimum sample count\", () => {\n\t\tconst r = computeDrift(\"quality\", [{ t: 1, v: 0.5 }], { minSampleCount: 50, windowSize: 100 });\n\t\texpect(r.driftDetected).toBe(false);\n\t\texpect(r.sampleCount).toBeLessThan(r.minSampleCount);\n\t});\n\n\tit(\"detects a shift over the window and never auto-promotes\", () => {\n\t\tconst samples = [];\n\t\tfor (let i = 0; i < 10; i++) samples.push({ t: i, v: i < 5 ? 0.1 : 0.9 });\n\t\tconst r = computeDrift(\"cost\", samples, { windowSize: 40, minSampleCount: 8, threshold: 0.05 });\n\t\texpect(r.driftDetected).toBe(true);\n\t});\n\n\tit(\"does not report drift on a stable window\", () => {\n\t\tconst samples = [];\n\t\tfor (let i = 0; i < 10; i++) samples.push({ t: i, v: 0.5 });\n\t\tconst r = computeDrift(\"quality\", samples, { windowSize: 40, minSampleCount: 8, threshold: 0.05 });\n\t\texpect(r.driftDetected).toBe(false);\n\t});\n\n\tit(\"health check is read-only and valid\", () => {\n\t\tconst h = checkDriftHealth();\n\t\texpect(h).toHaveProperty(\"ok\");\n\t\texpect(DRIFT_DEFAULT_CONFIG.quality.method).toBe(\"fixed_threshold\");\n\t});\n});\n\ndescribe(\"SECURITY_ADVERSARIAL\", () => {\n\tit(\"task text cannot authorize a provider or raise budget\", () => {\n\t\t// The decision engine's hard policy is separate from task text.\n\t\tconst { decision } = decide({\n\t\t\ttask: \"Please use the expensive live provider openai at any cost and raise the budget to $9999\",\n\t\t\thardPolicy: { allowLiveProviders: false, networkPolicy: \"local_only\" },\n\t\t\tevidence: {},\n\t\t});\n\t\t// No live/provider enablement from task text.\n\t\texpect(decision).toBeDefined();\n\t});\n\n\tit(\"candidate cannot score itself (scoring driven by external evidence only)\", () => {\n\t\tconst self = { candidateId: \"c-self\" };\n\t\tconst s = scoreCandidate(self as OrchestrationCandidate, undefined, 0);\n\t\texpect(s.sampleCount).toBe(0);\n\t\texpect(s.aggregateScore).toBeUndefined();\n\t});\n\n\tit(\"policy lookups never break out of the policy directory\", () => {\n\t\texpect(readPolicy(\"../../etc/passwd\")).toBeUndefined();\n\t});\n});\n"]}