import type { DataOperation } from "./dataCapabilities.js"; import { diagnosticSuiteRequestSchema, assessDiagnosticSuiteInput } from "./diagnosticSuite.js"; import { DIAGNOSTIC_SUITE_CONTRACT_VERSION, DIAGNOSTIC_SUITE_LIMITS, DIAGNOSTIC_SUITE_PURPOSES } from "./diagnosticSuiteTypes.js"; /** Discovery uses the same preparation path as validation and execution. No diagnostic engine is duplicated. */ export function diagnosticSuiteCapabilities(): readonly DataOperation[] { return [{ id: "diagnostics.suite", kind: "diagnostic", native: "runDiagnosticSuite", nativePackage: "@actuarial-ts/data", entry: "runDiagnosticSuite", validator: "validateDiagnosticSuiteRequest", parser: "validateDiagnosticSuiteRequest", schemaName: "diagnosticSuiteRequestSchema", schema: diagnosticSuiteRequestSchema, input: "DiagnosticSuiteRequest", output: "DiagnosticSuiteResult", contract: DIAGNOSTIC_SUITE_CONTRACT_VERSION, fields: ["id", "version", "datasets", "models", "suites", "limits"], limits: DIAGNOSTIC_SUITE_LIMITS, work: "source-preparation", checked: ["safe-json-and-exact-suite-schema", "explicit-complete-dataset-gate-policies", "unique-and-referenced-subjects-and-checks", "native-definition-compilation-and-data-preparation", "native-model-envelope-and-source-applicability", "declared-input-row-and-evaluation-budgets"], deferred: ["exact-retained-model-numerical-replay-and-refit", "data-review-and-metric-gate-outcomes", "diagnostic-values-and-complete-coordinate-coverage", "complete-output-evidence-budget", "source-authenticity", "cross-subject-comparability", "review-completeness-and-publication", "causal-interpretation"], coordinates: ["suiteId", "check.id", "dataset", "model", "group", "origin", "valuation", "developmentAge", "instanceId", "ruleId"], source: "declared-diagnostic-datasets-and-retained-model-runs", originKinds: ["declared-diagnostic-period-axis", "retained-model-context"], temporalStructures: ["native-calendar-or-ordered-diagnostic-axis", "model-check-specific-development-geometry"], replay: ["replayDiagnosticSuite"], replayPackage: "@actuarial-ts/data", unitRule: "Native metric operands and model diagnostic quantities retain their own units; no common output unit or cross-subject aggregate is inferred", populationRule: "Each source retains its declared populations, filters and grouping; a suite does not establish population equivalence between subjects", financialRule: "Dataset amount/exposure bases and model contexts remain separate; suite membership does not reconcile financial bases or calibration dependence", costQualification: "Preflight compiles and prepares native datasets and model inputs without fitting. The evaluation upper bound counts raw cells, selected instances/rules and model dimensions; it is not a total operation count or a bound on native model refits. Execution replays models under their own nested limits. Output character limits are checked after evidence creation; latency and peak memory are not measured", options: [ { path: "suites[].purpose", choices: DIAGNOSTIC_SUITE_PURPOSES, default: null, description: "Required caller label; it does not create checks or certify reserve adequacy" }, { path: "suites[].checks[].kind", choices: ["data-check", "metric", "metric-rule", "model"], default: null, description: "Each check requires an actual subject, native check or authored instance/rule, rationale and interpretation limitations" }, { path: "datasets[].input.policy.allowedReviewStatuses", choices: ["pass", "warning", "not-evaluated", "fail"], default: null, description: "Required explicit array with a rationale reference; an empty array blocks every review status. No gate is relaxed by discovery" }, { path: "datasets[].input.policy.allowedMetricFindingSeverities", choices: ["info", "warning", "fail"], default: null, description: "Required explicit array; an empty array permits only results without disallowed nonstructural metric findings" }, { path: "datasets[].input.filter", choices: ["omitted", "native-filter"], default: null, description: "Omission retains the native unfiltered selection; a filter can leave an authored selected check without coordinates" }, { path: "models[].request.policies.correlationTies", choices: ["retain-approximation", "not-evaluated"], default: null, description: "Explicit native ties policy; the residual reference remains volume-weighted Mack" }, ], limitations: [ "Preflight prepares subjects and reports model-check applicability without diagnostic execution, model fitting or certification of saved numeric results", "Unsupported individual model checks remain visible and execute as not-evaluated; they do not make a well-formed suite uncallable", "Dataset review/metric gates and native filters can block or empty selected checks; no absence becomes zero or a passing test", "Replay compares exact current-SDK results and can refit each retained model; it does not certify source authenticity, common populations, independence, causality or publication readiness", "This finite-JSON suite boundary preserves the standalone diagnostic APIs for reviewing nonfinite raw JavaScript numbers", ], evaluate: assessDiagnosticSuiteInput, }]; }