import type { AnalysisReference, CompiledDiagnosticDefinition, DiagnosticDeepReadonly, DiagnosticEmergencePoint, DiagnosticMetricEvaluation, DiagnosticReviewRuleEvaluation, ModelDiagnosticRequest, ModelDiagnosticResult, ModelDiagnosticKind, PreparedDiagnosticData } from "@actuarial-ts/core"; import type { DiagnosticRunInput, DiagnosticExecutionGateReceipt, ValidatedMetricDiagnosticsOutcome } from "./diagnosticInput.js"; import type { DiagnosticReviewReceipt } from "./diagnosticPreparedReview.js"; import type { DataCheck } from "./review.js"; export const DIAGNOSTIC_SUITE_CONTRACT_VERSION = "actuarial-diagnostic-suite/1" as const; export const DIAGNOSTIC_SUITE_LIMITS = Object.freeze({ maximumDatasets: 16, maximumModels: 16, maximumSuites: 32, maximumChecks: 256, maximumInputRows: 100000, maximumEvaluations: 1000000, maximumInputCharacters: 20000000, maximumOutputCharacters: 160000000 }); export const DIAGNOSTIC_SUITE_PURPOSES = ["data-quality", "residuals", "calendar", "correlation", "case-adequacy", "settlement", "frequency", "severity", "other"] as const; /** Native execution policy is mandatory; no suite silently relaxes a data/metric gate. */ export type DiagnosticSuiteDataInput = Omit & { readonly policy: { readonly allowedReviewStatuses: readonly ("pass" | "warning" | "fail" | "not-evaluated")[]; readonly allowedMetricFindingSeverities: readonly ("info" | "warning" | "fail")[]; readonly rationaleRef: string; } }; export type DiagnosticSuiteCheck = { readonly id: string; readonly rationale: string; readonly interpretationLimits: readonly string[] } & ( | { readonly kind: "model"; readonly model: string; readonly check: ModelDiagnosticKind } | { readonly kind: "data-check"; readonly dataset: string; readonly checkId: string } | { readonly kind: "metric"; readonly dataset: string; readonly instanceId: string } | { readonly kind: "metric-rule"; readonly dataset: string; readonly instanceId: string; readonly ruleId: string } ); export interface DiagnosticSuiteRequest { readonly id: string; readonly version: string; readonly datasets: readonly { readonly id: string; readonly input: DiagnosticSuiteDataInput }[]; readonly models: readonly { readonly id: string; readonly request: ModelDiagnosticRequest }[]; readonly suites: readonly { readonly id: string; readonly title: string; readonly purpose: typeof DIAGNOSTIC_SUITE_PURPOSES[number]; readonly checks: readonly DiagnosticSuiteCheck[] }[]; readonly limits: { readonly [K in keyof typeof DIAGNOSTIC_SUITE_LIMITS]: number }; } export interface DiagnosticSuiteDataEvidence { readonly dataset: string; readonly status: ValidatedMetricDiagnosticsOutcome["status"]; readonly stage: "review" | "metric" | null; readonly gate: DiagnosticExecutionGateReceipt; readonly definition: CompiledDiagnosticDefinition["definition"]; readonly preparation: Pick; readonly review: DiagnosticReviewReceipt; readonly metrics: ValidatedMetricDiagnosticsOutcome["result"]; readonly reference: AnalysisReference; } export interface DiagnosticSuiteMetricEvidence { readonly coordinate: Pick & { readonly dimensions: DiagnosticEmergencePoint["dimensions"] | null }; readonly evaluation: DiagnosticMetricEvaluation; } export interface DiagnosticSuiteCheckResult { readonly check: DiagnosticSuiteCheck; readonly status: "evaluated" | "qualified" | "not-evaluated"; readonly signal: "flagged" | "not-flagged" | "descriptive-only" | "not-evaluated"; readonly reason: string | null; readonly coverage: { readonly observations: number; readonly evaluated: number; readonly notEvaluated: number }; readonly interpretationLimits: readonly string[]; readonly evidence: | { readonly kind: "model"; readonly source: AnalysisReference; readonly native: ModelDiagnosticResult["checks"][number] } | { readonly kind: "data-check"; readonly source: AnalysisReference; readonly native: DiagnosticDeepReadonly; readonly evaluations: readonly DiagnosticReviewRuleEvaluation[] } | { readonly kind: "metric" | "metric-rule"; readonly source: AnalysisReference; readonly native: readonly DiagnosticSuiteMetricEvidence[] }; } export interface DiagnosticSuiteResult { readonly contractVersion: typeof DIAGNOSTIC_SUITE_CONTRACT_VERSION; readonly sdkVersion: string; readonly request: DiagnosticSuiteRequest; readonly datasets: readonly DiagnosticSuiteDataEvidence[]; readonly models: readonly { readonly id: string; readonly result: ModelDiagnosticResult }[]; readonly suites: readonly { readonly id: string; readonly title: string; readonly purpose: typeof DIAGNOSTIC_SUITE_PURPOSES[number]; readonly checks: readonly DiagnosticSuiteCheckResult[] }[]; /** Counts describe only the selected checks. They do not certify review completeness. */ readonly summary: { readonly requested: number; readonly evaluated: number; readonly qualified: number; readonly notEvaluated: number; readonly flagged: number }; readonly execution: { readonly evaluationUpperBound: number }; readonly assurance: { readonly calculations: "existing-native-engines"; readonly modelEvidence: "replayed-current-sdk"; readonly sourceAuthenticity: "not-verified"; readonly crossSourceComparability: "not-established"; readonly causality: "not-established"; readonly completeness: "caller-selected-checks-only"; readonly publication: "not-reported" }; readonly reference: AnalysisReference; }